void ShapeFunctionPool::computeQuadratures(const std::vector<MshElemType::type>& elem_types, const int num_elem_nodes[2][MshElemType::NUM_ELEM_TYPES], const int dim_elem[], CElement& quadrature, const int num_sample_gs_pnts) { const int order = quadrature.getOrder(); for (std::size_t i = 0; i < elem_types.size(); i++) { const MshElemType::type e_type = elem_types[i]; if (e_type == MshElemType::INVALID) continue; const int type_id = static_cast<int>(e_type) - 1; quadrature.ConfigShapefunction(e_type); const int nnodes = num_elem_nodes[order - 1][type_id]; const int elem_dim = dim_elem[type_id]; double* shape_function_center_values = _shape_function_center[type_id].data(); quadrature.SetCenterGP(e_type); quadrature.ComputeShapefct(order, shape_function_center_values); double* grad_shape_function_center_values = _grad_shape_function_center[type_id].data(); quadrature.computeGradShapefctLocal(order, grad_shape_function_center_values); double* shape_function_values = _shape_function[type_id].data(); double* dshape_function_values = _grad_shape_function[type_id].data(); // Set number of integration points. quadrature.SetGaussPointNumber(num_sample_gs_pnts); quadrature.SetIntegrationPointNumber(e_type); for (int gp = 0; gp < quadrature.GetNumGaussPoints(); gp++) { int gp_r, gp_s, gp_t; quadrature.SetGaussPoint(e_type, gp, gp_r, gp_s, gp_t); double* shape_function_values_gs = &shape_function_values[gp * nnodes]; quadrature.ComputeShapefct(order, shape_function_values_gs); double* dshape_function_values_gs = &dshape_function_values[gp * nnodes * elem_dim]; quadrature.computeGradShapefctLocal(order, dshape_function_values_gs); } } }