14 const std::vector<std::vector<libMesh::RealGradient> >& dphi,
15 const unsigned int n_components,
16 const unsigned int n_u_dofs,
17 const std::vector<libMesh::Real>& JxW,
18 carl::anisotropic_elasticity_tensor_cubic_sym& anisotropy_obj_input,
23 for (
unsigned int iii=0; iii<n_u_dofs; iii++)
25 for (
unsigned int jjj=0; jjj<n_u_dofs; jjj++)
27 for(
unsigned int C_j=0; C_j<n_components; C_j++)
29 for(
unsigned int C_l=0; C_l<n_components; C_l++)
31 SubK(iii,jjj) += cte * JxW[qp]*(anisotropy_obj_input.eval_elasticity_tensor(C_i,C_j,C_k,C_l,grain_idx) * dphi[iii][qp](C_j)*dphi[jjj][qp](C_l));
39 const std::string& system_name,
41 carl::anisotropic_elasticity_tensor_cubic_sym& anisotropy_obj_input)
43 libmesh_assert_equal_to (system_name,
"Elasticity");
47 perf_log.push(
"Preamble");
49 const libMesh::MeshBase& mesh = es.get_mesh();
51 const unsigned int dim = mesh.mesh_dimension();
56 libMesh::ExplicitSystem& physical_param_system = es.get_system<libMesh::ExplicitSystem>(
"PhysicalConstants");
57 const unsigned int idx_var = physical_param_system.variable_number (
"Index");
59 const libMesh::DofMap& physical_dof_map = physical_param_system.get_dof_map();
60 std::vector<libMesh::dof_id_type> physical_dof_indices_var;
63 libMesh::LinearImplicitSystem& system = es.get_system<libMesh::LinearImplicitSystem>(
"Elasticity");
65 const unsigned int n_components = 3;
66 const unsigned int u_var = system.variable_number (
"u");
67 const unsigned int v_var = system.variable_number (
"v");
68 const unsigned int w_var = system.variable_number (
"w");
70 const libMesh::DofMap& dof_map = system.get_dof_map();
71 libMesh::FEType fe_type = dof_map.variable_type(u_var);
75 libMesh::UniquePtr<libMesh::FEBase> fe (libMesh::FEBase::build(dim, fe_type));
76 libMesh::QGauss qrule (dim, fe_type.default_quadrature_order());
77 fe->attach_quadrature_rule (&qrule);
80 libMesh::UniquePtr<libMesh::FEBase> fe_face (libMesh::FEBase::build(dim, fe_type));
81 libMesh::QGauss qface(dim-1, fe_type.default_quadrature_order());
82 fe_face->attach_quadrature_rule (&qface);
85 const std::vector<libMesh::Real>& JxW = fe->get_JxW();
88 const std::vector<std::vector<libMesh::Real> >& phi = fe->get_phi();
91 const std::vector<std::vector<libMesh::RealGradient> >& dphi = fe->get_dphi();
94 const std::vector<libMesh::Point>& qp_points = fe->get_xyz();
97 double alpha_micro = 1;
99 libMesh::DenseMatrix<libMesh::Number> Ke;
100 libMesh::DenseVector<libMesh::Number> Fe;
102 libMesh::DenseSubMatrix<libMesh::Number>
103 Kuu(Ke), Kuv(Ke), Kuw(Ke),
104 Kvu(Ke), Kvv(Ke), Kvw(Ke),
105 Kwu(Ke), Kwv(Ke), Kww(Ke);
107 libMesh::DenseSubVector<libMesh::Number>
112 std::vector<libMesh::dof_id_type> dof_indices;
113 std::vector<libMesh::dof_id_type> dof_indices_u;
114 std::vector<libMesh::dof_id_type> dof_indices_v;
115 std::vector<libMesh::dof_id_type> dof_indices_w;
117 libMesh::MeshBase::const_element_iterator el = mesh.active_local_elements_begin();
118 const libMesh::MeshBase::const_element_iterator end_el = mesh.active_local_elements_end();
120 perf_log.pop(
"Preamble");
123 for ( ; el != end_el; ++el)
126 const libMesh::Elem* elem = *el;
128 perf_log.push(
"Define DoF");
130 dof_map.dof_indices (elem, dof_indices);
131 dof_map.dof_indices (elem, dof_indices_u, u_var);
132 dof_map.dof_indices (elem, dof_indices_v, v_var);
133 dof_map.dof_indices (elem, dof_indices_w, w_var);
135 const unsigned int n_dofs = dof_indices.size();
136 const unsigned int n_u_dofs = dof_indices_u.size();
137 const unsigned int n_v_dofs = dof_indices_v.size();
138 const unsigned int n_w_dofs = dof_indices_w.size();
140 perf_log.pop(
"Define DoF");
142 perf_log.push(
"Define physical params");
144 physical_dof_map.dof_indices(elem, physical_dof_indices_var, idx_var);
145 localIdx = physical_param_system.current_solution(physical_dof_indices_var[0]);
146 perf_log.pop(
"Define physical params");
154 perf_log.push(
"Matrix manipulations");
155 Ke.resize (n_dofs, n_dofs);
159 Kuu.reposition (u_var*n_u_dofs, u_var*n_u_dofs, n_u_dofs, n_u_dofs);
160 Kuv.reposition (u_var*n_u_dofs, v_var*n_u_dofs, n_u_dofs, n_v_dofs);
161 Kuw.reposition (u_var*n_u_dofs, w_var*n_u_dofs, n_u_dofs, n_w_dofs);
163 Kvu.reposition (v_var*n_u_dofs, u_var*n_u_dofs, n_v_dofs, n_u_dofs);
164 Kvv.reposition (v_var*n_u_dofs, v_var*n_u_dofs, n_v_dofs, n_v_dofs);
165 Kvw.reposition (v_var*n_u_dofs, w_var*n_u_dofs, n_v_dofs, n_w_dofs);
167 Kwu.reposition (w_var*n_u_dofs, u_var*n_u_dofs, n_w_dofs, n_u_dofs);
168 Kwv.reposition (w_var*n_u_dofs, v_var*n_u_dofs, n_w_dofs, n_v_dofs);
169 Kww.reposition (w_var*n_u_dofs, w_var*n_u_dofs, n_w_dofs, n_w_dofs);
171 Fu.reposition (u_var*n_u_dofs, n_u_dofs);
172 Fv.reposition (v_var*n_u_dofs, n_v_dofs);
173 Fw.reposition (w_var*n_u_dofs, n_w_dofs);
174 perf_log.push(
"Matrix manipulations");
176 perf_log.push(
"Matrix element calculations");
178 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
181 perf_log.push(
"Rigidity",
"Matrix element calculations");
186 Update_SubK(Kuu, qp, 0, 0, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
187 Update_SubK(Kuv, qp, 0, 1, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
188 Update_SubK(Kuw, qp, 0, 2, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
190 Update_SubK(Kvu, qp, 1, 0, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
191 Update_SubK(Kvv, qp, 1, 1, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
192 Update_SubK(Kvw, qp, 1, 2, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
194 Update_SubK(Kwu, qp, 2, 0, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
195 Update_SubK(Kwv, qp, 2, 1, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
196 Update_SubK(Kww, qp, 2, 2, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha_micro);
198 perf_log.pop(
"Rigidity",
"Matrix element calculations");
202 for (
unsigned int i=0; i<n_w_dofs; i++)
204 Fw(i) -= alpha_micro * JxW[qp] * phi[i][qp];
210 perf_log.push(
"Constraints",
"Matrix element calculations");
211 dof_map.heterogenously_constrain_element_matrix_and_vector(Ke, Fe, dof_indices);
212 perf_log.pop(
"Constraints",
"Matrix element calculations");
214 perf_log.push(
"Adding elements");
215 system.matrix->add_matrix (Ke, dof_indices);
216 system.rhs->add_vector (Fe, dof_indices);
217 perf_log.pop(
"Adding elements");
222 const std::string& system_name,
223 carl::anisotropic_elasticity_tensor_cubic_sym& anisotropy_obj_input)
225 libmesh_assert_equal_to (system_name,
"Elasticity");
229 perf_log.push(
"Preamble");
231 const libMesh::MeshBase& mesh = es.get_mesh();
233 const unsigned int dim = mesh.mesh_dimension();
238 libMesh::ExplicitSystem& physical_param_system = es.get_system<libMesh::ExplicitSystem>(
"PhysicalConstants");
239 const unsigned int idx_var = physical_param_system.variable_number (
"Index");
241 const libMesh::DofMap& physical_dof_map = physical_param_system.get_dof_map();
242 std::vector<libMesh::dof_id_type> physical_dof_indices_var;
245 libMesh::LinearImplicitSystem& system = es.get_system<libMesh::LinearImplicitSystem>(
"Elasticity");
247 const unsigned int n_components = 3;
248 const unsigned int u_var = system.variable_number (
"u");
249 const unsigned int v_var = system.variable_number (
"v");
250 const unsigned int w_var = system.variable_number (
"w");
252 const libMesh::DofMap& dof_map = system.get_dof_map();
253 libMesh::FEType fe_type = dof_map.variable_type(u_var);
257 libMesh::UniquePtr<libMesh::FEBase> fe (libMesh::FEBase::build(dim, fe_type));
258 libMesh::QGauss qrule (dim, fe_type.default_quadrature_order());
259 fe->attach_quadrature_rule (&qrule);
262 libMesh::UniquePtr<libMesh::FEBase> fe_face (libMesh::FEBase::build(dim, fe_type));
263 libMesh::QGauss qface(dim-1, fe_type.default_quadrature_order());
264 fe_face->attach_quadrature_rule (&qface);
267 const std::vector<libMesh::Real>& JxW = fe->get_JxW();
270 const std::vector<std::vector<libMesh::Real> >& phi = fe->get_phi();
273 const std::vector<std::vector<libMesh::RealGradient> >& dphi = fe->get_dphi();
276 const std::vector<libMesh::Point>& qp_points = fe->get_xyz();
281 libMesh::DenseMatrix<libMesh::Number> Ke;
282 libMesh::DenseVector<libMesh::Number> Fe;
284 libMesh::DenseSubMatrix<libMesh::Number>
285 Kuu(Ke), Kuv(Ke), Kuw(Ke),
286 Kvu(Ke), Kvv(Ke), Kvw(Ke),
287 Kwu(Ke), Kwv(Ke), Kww(Ke);
289 libMesh::DenseSubVector<libMesh::Number>
294 std::vector<libMesh::dof_id_type> dof_indices;
295 std::vector<libMesh::dof_id_type> dof_indices_u;
296 std::vector<libMesh::dof_id_type> dof_indices_v;
297 std::vector<libMesh::dof_id_type> dof_indices_w;
299 libMesh::MeshBase::const_element_iterator el = mesh.active_local_elements_begin();
300 const libMesh::MeshBase::const_element_iterator end_el = mesh.active_local_elements_end();
302 perf_log.pop(
"Preamble");
305 for ( ; el != end_el; ++el)
308 const libMesh::Elem* elem = *el;
310 perf_log.push(
"Define DoF");
312 dof_map.dof_indices (elem, dof_indices);
313 dof_map.dof_indices (elem, dof_indices_u, u_var);
314 dof_map.dof_indices (elem, dof_indices_v, v_var);
315 dof_map.dof_indices (elem, dof_indices_w, w_var);
317 const unsigned int n_dofs = dof_indices.size();
318 const unsigned int n_u_dofs = dof_indices_u.size();
319 const unsigned int n_v_dofs = dof_indices_v.size();
320 const unsigned int n_w_dofs = dof_indices_w.size();
322 perf_log.pop(
"Define DoF");
324 perf_log.push(
"Define physical params");
326 physical_dof_map.dof_indices(elem, physical_dof_indices_var, idx_var);
327 localIdx = physical_param_system.current_solution(physical_dof_indices_var[0]);
328 perf_log.pop(
"Define physical params");
336 perf_log.push(
"Matrix manipulations");
337 Ke.resize (n_dofs, n_dofs);
341 Kuu.reposition (u_var*n_u_dofs, u_var*n_u_dofs, n_u_dofs, n_u_dofs);
342 Kuv.reposition (u_var*n_u_dofs, v_var*n_u_dofs, n_u_dofs, n_v_dofs);
343 Kuw.reposition (u_var*n_u_dofs, w_var*n_u_dofs, n_u_dofs, n_w_dofs);
345 Kvu.reposition (v_var*n_u_dofs, u_var*n_u_dofs, n_v_dofs, n_u_dofs);
346 Kvv.reposition (v_var*n_u_dofs, v_var*n_u_dofs, n_v_dofs, n_v_dofs);
347 Kvw.reposition (v_var*n_u_dofs, w_var*n_u_dofs, n_v_dofs, n_w_dofs);
349 Kwu.reposition (w_var*n_u_dofs, u_var*n_u_dofs, n_w_dofs, n_u_dofs);
350 Kwv.reposition (w_var*n_u_dofs, v_var*n_u_dofs, n_w_dofs, n_v_dofs);
351 Kww.reposition (w_var*n_u_dofs, w_var*n_u_dofs, n_w_dofs, n_w_dofs);
353 Fu.reposition (u_var*n_u_dofs, n_u_dofs);
354 Fv.reposition (v_var*n_u_dofs, n_v_dofs);
355 Fw.reposition (w_var*n_u_dofs, n_w_dofs);
356 perf_log.push(
"Matrix manipulations");
358 perf_log.push(
"Matrix element calculations");
360 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
363 perf_log.push(
"Rigidity",
"Matrix element calculations");
368 Update_SubK(Kuu, qp, 0, 0, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
369 Update_SubK(Kuv, qp, 0, 1, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
370 Update_SubK(Kuw, qp, 0, 2, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
372 Update_SubK(Kvu, qp, 1, 0, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
373 Update_SubK(Kvv, qp, 1, 1, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
374 Update_SubK(Kvw, qp, 1, 2, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
376 Update_SubK(Kwu, qp, 2, 0, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
377 Update_SubK(Kwv, qp, 2, 1, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
378 Update_SubK(Kww, qp, 2, 2, dphi, n_components, n_u_dofs, JxW, anisotropy_obj_input, localIdx, alpha);
380 perf_log.pop(
"Rigidity",
"Matrix element calculations");
384 for (
unsigned int i=0; i<n_w_dofs; i++)
386 Fw(i) -= alpha * JxW[qp] * phi[i][qp];
392 perf_log.push(
"Constraints",
"Matrix element calculations");
393 dof_map.heterogenously_constrain_element_matrix_and_vector(Ke, Fe, dof_indices);
394 perf_log.pop(
"Constraints",
"Matrix element calculations");
396 perf_log.push(
"Adding elements");
397 system.matrix->add_matrix (Ke, dof_indices);
398 system.rhs->add_vector (Fe, dof_indices);
399 perf_log.pop(
"Adding elements");
void Update_SubK(libMesh::DenseSubMatrix< libMesh::Number > &SubK, unsigned int qp, unsigned int C_i, unsigned int C_k, const std::vector< std::vector< libMesh::RealGradient > > &dphi, const unsigned int n_components, const unsigned int n_u_dofs, const std::vector< libMesh::Real > &JxW, carl::anisotropic_elasticity_tensor_cubic_sym &anisotropy_obj_input, int grain_idx, double cte)
void assemble_elasticity_anisotropic_with_weight(libMesh::EquationSystems &es, const std::string &system_name, carl::weight_parameter_function &weight_mask, carl::anisotropic_elasticity_tensor_cubic_sym &anisotropy_obj_input)
double get_alpha_micro(const libMesh::Point &qpoint)
void assemble_elasticity_anisotropic(libMesh::EquationSystems &es, const std::string &system_name, carl::anisotropic_elasticity_tensor_cubic_sym &anisotropy_obj_input)
void Update_SubK_anisotropic(libMesh::DenseSubMatrix< libMesh::Number > &SubK, unsigned int qp, unsigned int C_i, unsigned int C_k, const std::vector< std::vector< libMesh::RealGradient > > &dphi, const unsigned int n_components, const unsigned int n_u_dofs, const std::vector< libMesh::Real > &JxW, carl::anisotropic_elasticity_tensor_cubic_sym &anisotropy_obj_input, int grain_idx, double cte)
const bool MASTER_bPerfLog_assemble_fem