CArl
Code Arlequin / C++ implementation
anisotropic_elasticity_tensor_cubic_sym Class Reference

#include <anisotropic_elasticity_cubic_sym.h>

Public Member Functions

 anisotropic_elasticity_tensor_cubic_sym ()
 
 anisotropic_elasticity_tensor_cubic_sym (libMesh::EquationSystems &es, std::string &physicalParamsFile)
 
libMesh::Real eval_internal_elasticity_tensor (unsigned int i, unsigned int j, unsigned int k, unsigned int l)
 
void set_parameters (libMesh::EquationSystems &es, std::string &physicalParamsFile)
 
libMesh::DenseMatrix< libMesh::Real > & get_rotation (int idx_grain)
 
Order4Tensorget_elasticity (int idx_grain)
 
libMesh::Real eval_elasticity_tensor (unsigned int i, unsigned int j, unsigned int k, unsigned int l, int idx_grain)
 

Detailed Description

Definition at line 60 of file anisotropic_elasticity_cubic_sym.h.

Constructor & Destructor Documentation

anisotropic_elasticity_tensor_cubic_sym::anisotropic_elasticity_tensor_cubic_sym ( )
inline

Definition at line 81 of file anisotropic_elasticity_cubic_sym.h.

81  :
82  m_c11 { -1 },
83  m_c12 { -1 },
84  m_c44 { -1 },
85  m_nb_grains { -1}
86  {
87 
88  };
anisotropic_elasticity_tensor_cubic_sym::anisotropic_elasticity_tensor_cubic_sym ( libMesh::EquationSystems &  es,
std::string &  physicalParamsFile 
)
inline

Definition at line 90 of file anisotropic_elasticity_cubic_sym.h.

91  {
92  this->set_parameters(es, physicalParamsFile);
93  };
void set_parameters(libMesh::EquationSystems &es, std::string &physicalParamsFile)

Member Function Documentation

libMesh::Real anisotropic_elasticity_tensor_cubic_sym::eval_elasticity_tensor ( unsigned int  i,
unsigned int  j,
unsigned int  k,
unsigned int  l,
int  idx_grain 
)

Definition at line 218 of file anisotropic_elasticity_cubic_sym.cpp.

223 {
224  Order4Tensor& C = get_elasticity(idx_grain);
225 
226  return C(i,j,k,l);
227 }
libMesh::Real anisotropic_elasticity_tensor_cubic_sym::eval_internal_elasticity_tensor ( unsigned int  i,
unsigned int  j,
unsigned int  k,
unsigned int  l 
)

Definition at line 182 of file anisotropic_elasticity_cubic_sym.cpp.

186 {
187  double output = 0;
188 
189  if(i == j && k == l)
190  {
191  if(i == k && j == l)
192  {
193  output = m_c11;
194  }
195  else
196  {
197  output = m_c12;
198  }
199  }
200  else if( (i == k && j == l) || (i == l && j == k) )
201  {
202  output = m_c44;
203  }
204 
205  return output;
206 }
carl::Order4Tensor & anisotropic_elasticity_tensor_cubic_sym::get_elasticity ( int  idx_grain)

Definition at line 213 of file anisotropic_elasticity_cubic_sym.cpp.

214 {
215  return m_Elasticity_tensors[m_domain_to_vec_map[idx_grain]];
216 }
libMesh::DenseMatrix< libMesh::Real > & anisotropic_elasticity_tensor_cubic_sym::get_rotation ( int  idx_grain)

Definition at line 208 of file anisotropic_elasticity_cubic_sym.cpp.

209 {
210  return m_Rotation_matrices[m_domain_to_vec_map[idx_grain]];
211 }
void anisotropic_elasticity_tensor_cubic_sym::set_parameters ( libMesh::EquationSystems &  es,
std::string &  physicalParamsFile 
)

Definition at line 17 of file anisotropic_elasticity_cubic_sym.cpp.

18 {
19  const libMesh::Parallel::Communicator& SysComm = es.comm();
20  int rank = SysComm.rank();
21  int nodes = SysComm.size();
22  std::vector<int> temp_idx;
23 
24  // Read the random data info
25  if(rank == 0)
26  {
27  std::ifstream physicalParamsIFS(physicalParamsFile);
28  physicalParamsIFS >> m_nb_grains >> m_c11 >> m_c12 >> m_c44;
29  m_angles_x.resize(m_nb_grains);
30  m_angles_y.resize(m_nb_grains);
31  m_angles_z.resize(m_nb_grains);
32  temp_idx.resize(m_nb_grains);
33  m_domain_to_vec_map.reserve(m_nb_grains);
34 
35  for(int iii = 0; iii < m_nb_grains; ++iii)
36  {
37  physicalParamsIFS >> m_angles_x[iii];
38  physicalParamsIFS >> m_angles_y[iii];
39  physicalParamsIFS >> m_angles_z[iii];
40  physicalParamsIFS >> temp_idx[iii];
41  }
42 
43  physicalParamsIFS.close();
44  }
45 
46  if(nodes > 1)
47  {
48  SysComm.broadcast(m_c11);
49  SysComm.broadcast(m_c12);
50  SysComm.broadcast(m_c44);
51  SysComm.broadcast(m_nb_grains);
52 
53  if(rank != 0)
54  {
55  m_angles_x.resize(m_nb_grains);
56  m_angles_y.resize(m_nb_grains);
57  m_angles_z.resize(m_nb_grains);
58  temp_idx.resize(m_nb_grains);
59  m_domain_to_vec_map.reserve(m_nb_grains);
60  }
61  SysComm.broadcast(m_angles_x);
62  SysComm.broadcast(m_angles_y);
63  SysComm.broadcast(m_angles_z);
64  SysComm.broadcast(temp_idx);
65  }
66 
67  for(int iii = 0; iii < m_nb_grains; ++iii)
68  {
69  m_domain_to_vec_map[temp_idx[iii]] = iii;
70  }
71 
72  m_Rotation_matrices.resize(m_nb_grains,libMesh::DenseMatrix<libMesh::Real>(3,3));
73  m_Elasticity_tensors.resize(m_nb_grains);
74  for(int iii = 0; iii < m_nb_grains; ++iii)
75  {
76  m_Elasticity_tensors[iii].set_dimension(3);
77  }
78 
79  // Mesh pointer
80  const libMesh::MeshBase& mesh = es.get_mesh();
81 
82  // Indexes
83  libMesh::ExplicitSystem& physical_param_system = es.get_system<libMesh::ExplicitSystem>("PhysicalConstants");
84  const libMesh::DofMap& physical_dof_map = physical_param_system.get_dof_map();
85 
86  unsigned int physical_consts[7];
87  physical_consts[0] = physical_param_system.variable_number ("Index");
88  physical_consts[1] = physical_param_system.variable_number ("Angle_x");
89  physical_consts[2] = physical_param_system.variable_number ("Angle_y");
90  physical_consts[3] = physical_param_system.variable_number ("Angle_z");
91  physical_consts[4] = physical_param_system.variable_number ("color_r");
92  physical_consts[5] = physical_param_system.variable_number ("color_g");
93  physical_consts[6] = physical_param_system.variable_number ("color_b");
94 
95  // Calculate the rotation matrices
96  this->generate_rotation_matrices();
97 
98  // And generate the elasticity tensors
99  this->generate_elasticity_tensors();
100 
101  std::vector<libMesh::dof_id_type> physical_dof_indices_var;
102  libMesh::MeshBase::const_element_iterator el = mesh.active_local_elements_begin();
103  const libMesh::MeshBase::const_element_iterator end_el = mesh.active_local_elements_end();
104 
105  for ( ; el != end_el; ++el)
106  {
107  const libMesh::Elem* elem = *el;
108 
109  // Grain index
110  physical_dof_map.dof_indices(elem, physical_dof_indices_var, physical_consts[0]);
111  libMesh::dof_id_type dof_index = physical_dof_indices_var[0];
112 
113  if( (physical_param_system.solution->first_local_index() <= dof_index) &&
114  (dof_index < physical_param_system.solution->last_local_index()) )
115  {
116  physical_param_system.solution->set(dof_index, elem->subdomain_id());
117  }
118  }
119 
120  physical_param_system.solution->close();
121  physical_param_system.update();
122 }

The documentation for this class was generated from the following files: