17 void carl::anisotropic_elasticity_tensor_cubic_sym::set_parameters(libMesh::EquationSystems& es, std::string& physicalParamsFile)
19 const libMesh::Parallel::Communicator& SysComm = es.comm();
20 int rank = SysComm.rank();
21 int nodes = SysComm.size();
22 std::vector<int> temp_idx;
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);
35 for(
int iii = 0; iii < m_nb_grains; ++iii)
37 physicalParamsIFS >> m_angles_x[iii];
38 physicalParamsIFS >> m_angles_y[iii];
39 physicalParamsIFS >> m_angles_z[iii];
40 physicalParamsIFS >> temp_idx[iii];
43 physicalParamsIFS.close();
48 SysComm.broadcast(m_c11);
49 SysComm.broadcast(m_c12);
50 SysComm.broadcast(m_c44);
51 SysComm.broadcast(m_nb_grains);
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);
61 SysComm.broadcast(m_angles_x);
62 SysComm.broadcast(m_angles_y);
63 SysComm.broadcast(m_angles_z);
64 SysComm.broadcast(temp_idx);
67 for(
int iii = 0; iii < m_nb_grains; ++iii)
69 m_domain_to_vec_map[temp_idx[iii]] = iii;
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)
76 m_Elasticity_tensors[iii].set_dimension(3);
80 const libMesh::MeshBase& mesh = es.get_mesh();
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();
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");
96 this->generate_rotation_matrices();
99 this->generate_elasticity_tensors();
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();
105 for ( ; el != end_el; ++el)
107 const libMesh::Elem* elem = *el;
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];
113 if( (physical_param_system.solution->first_local_index() <= dof_index) &&
114 (dof_index < physical_param_system.solution->last_local_index()) )
116 physical_param_system.solution->set(dof_index, elem->subdomain_id());
120 physical_param_system.solution->close();
121 physical_param_system.update();
124 void carl::anisotropic_elasticity_tensor_cubic_sym::generate_rotation_matrices()
126 double phi, theta, psi;
127 double c_phi, c_theta, c_psi;
128 double s_phi, s_theta, s_psi;
129 for(
int iii = 0; iii < m_nb_grains; ++iii)
131 phi = m_angles_x[iii];
132 theta = m_angles_y[iii];
133 psi = m_angles_z[iii];
135 s_phi = sin(phi); c_phi = cos(phi);
136 s_theta = sin(theta); c_theta = cos(theta);
137 s_psi = sin(psi); c_psi = cos(psi);
139 m_Rotation_matrices[iii](0,0) = c_theta;
140 m_Rotation_matrices[iii](0,1) = - s_theta * c_psi;
141 m_Rotation_matrices[iii](0,2) = s_theta * s_psi;
143 m_Rotation_matrices[iii](1,0) = c_phi * s_theta;
144 m_Rotation_matrices[iii](1,1) = c_phi * c_theta * c_psi
146 m_Rotation_matrices[iii](1,2) = - s_phi * c_psi
147 - c_phi * c_theta * s_psi;
149 m_Rotation_matrices[iii](2,0) = s_phi * s_theta;
150 m_Rotation_matrices[iii](2,1) = c_phi * s_psi
151 + s_phi * c_theta * c_psi;
152 m_Rotation_matrices[iii](2,2) = c_phi * c_psi
153 - s_phi * c_theta * s_psi;
157 void carl::anisotropic_elasticity_tensor_cubic_sym::generate_elasticity_tensors()
159 for(
int nnn = 0; nnn < m_nb_grains; ++nnn)
161 libMesh::DenseMatrix<libMesh::Real>& R = m_Rotation_matrices[nnn];
164 for(
unsigned int iii = 0; iii < 3; ++iii)
165 for(
unsigned int jjj = 0; jjj < 3; ++jjj)
166 for(
unsigned int kkk = 0; kkk < 3; ++kkk)
167 for(
unsigned int lll = 0; lll < 3; ++lll)
170 for(
unsigned int ppp = 0; ppp < 3; ++ppp)
171 for(
unsigned int qqq = 0; qqq < 3; ++qqq)
172 for(
unsigned int rrr = 0; rrr < 3; ++rrr)
173 for(
unsigned int sss = 0; sss < 3; ++sss)
175 C(iii,jjj,kkk,lll)+= R(iii,ppp) * R(jjj,qqq) * R(kkk,rrr) * R(lll,sss) *
176 this->eval_internal_elasticity_tensor(ppp,qqq,rrr,sss);
182 libMesh::Real carl::anisotropic_elasticity_tensor_cubic_sym::eval_internal_elasticity_tensor(
unsigned int i,
200 else if( (i == k && j == l) || (i == l && j == k) )
208 libMesh::DenseMatrix<libMesh::Real>& carl::anisotropic_elasticity_tensor_cubic_sym::get_rotation(
int idx_grain)
210 return m_Rotation_matrices[m_domain_to_vec_map[idx_grain]];
213 carl::Order4Tensor& carl::anisotropic_elasticity_tensor_cubic_sym::get_elasticity(
int idx_grain)
215 return m_Elasticity_tensors[m_domain_to_vec_map[idx_grain]];
libMesh::Real eval_elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l, libMesh::Number E, libMesh::Number mu)
Calculate the elasticity tensor.