void MAST::MindlinBendingOperator:: initialize_bending_strain_operator_for_z(const MAST::FEBase& fe, const unsigned int qp, const Real z, MAST::FEMOperatorMatrix& Bmat_bend) { const std::vector<std::vector<libMesh::RealVectorValue> >& dphi = fe.get_dphi(); const std::vector<std::vector<Real> >& phi = fe.get_phi(); const unsigned int n_phi = (unsigned int)phi.size(); RealVectorX phi_vec = RealVectorX::Zero(n_phi); for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi_vec(i_nd) = dphi[i_nd][qp](0); // dphi/dx phi_vec *= z; Bmat_bend.set_shape_function(0, 4, phi_vec); // epsilon-x: thetay phi_vec *= -1.0; Bmat_bend.set_shape_function(2, 3, phi_vec); // gamma-xy : thetax for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi_vec(i_nd) = dphi[i_nd][qp](1); // dphi/dy phi_vec *= z; Bmat_bend.set_shape_function(2, 4, phi_vec); // gamma-xy : thetay //Bmat_trans.set_shape_function(1, 2, phi_vec); // gamma-yz : w phi_vec *= -1.0; Bmat_bend.set_shape_function(1, 3, phi_vec); // epsilon-y: thetax }
void MAST::StructuralElement2D:: initialize_direct_strain_operator(const unsigned int qp, MAST::FEMOperatorMatrix& Bmat) { const std::vector<std::vector<libMesh::RealVectorValue> >& dphi = _fe->get_dphi(); unsigned int n_phi = (unsigned int)dphi.size(); RealVectorX phi = RealVectorX::Zero(n_phi); libmesh_assert_equal_to(Bmat.m(), 3); libmesh_assert_equal_to(Bmat.n(), 6*n_phi); // now set the shape function values // dN/dx for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi(i_nd) = dphi[i_nd][qp](0); Bmat.set_shape_function(0, 0, phi); // epsilon_xx = du/dx Bmat.set_shape_function(2, 1, phi); // gamma_xy = dv/dx + ... // dN/dy for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi(i_nd) = dphi[i_nd][qp](1); Bmat.set_shape_function(1, 1, phi); // epsilon_yy = dv/dy Bmat.set_shape_function(2, 0, phi); // gamma_xy = du/dy + ... }
bool MAST::HeatConductionElementBase:: surface_convection_residual(bool request_jacobian, RealVectorX& f, RealMatrixX& jac, const unsigned int s, MAST::BoundaryConditionBase& p) { // prepare the side finite element std::auto_ptr<libMesh::FEBase> fe; std::auto_ptr<libMesh::QBase> qrule; _get_side_fe_and_qrule(get_elem_for_quadrature(), s, fe, qrule); // get the function from this boundary condition const MAST::FieldFunction<Real> &coeff = p.get<MAST::FieldFunction<Real> >("convection_coeff"), &T_amb = p.get<MAST::FieldFunction<Real> >("ambient_temperature"); const std::vector<Real> &JxW = fe->get_JxW(); const std::vector<libMesh::Point>& qpoint = fe->get_xyz(); const std::vector<std::vector<Real> >& phi = fe->get_phi(); const unsigned int n_phi = (unsigned int)phi.size(); RealVectorX phi_vec = RealVectorX::Zero(n_phi); RealMatrixX mat = RealMatrixX::Zero(n_phi, n_phi); Real temp, amb_temp, h_coeff; libMesh::Point pt; MAST::FEMOperatorMatrix Bmat; for (unsigned int qp=0; qp<qpoint.size(); qp++) { _local_elem->global_coordinates_location (qpoint[qp], pt); // now set the shape function values for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi_vec(i_nd) = phi[i_nd][qp]; // value of flux coeff(pt, _time, h_coeff); T_amb(pt, _time, amb_temp); temp = phi_vec.dot(_sol); // normal flux is given as: // qi_ni = h_coeff * (T - T_amb) // f += JxW[qp] * phi_vec * h_coeff * (temp - amb_temp); if (request_jacobian) { Bmat.reinit(1, phi_vec); Bmat.right_multiply_transpose(mat, Bmat); jac += JxW[qp] * mat * h_coeff; } } return request_jacobian; }
bool MAST::HeatConductionElementBase:: surface_radiation_residual(bool request_jacobian, RealVectorX& f, RealMatrixX& jac, MAST::BoundaryConditionBase& p) { // get the function from this boundary condition const MAST::FieldFunction<Real> &emissivity = p.get<MAST::FieldFunction<Real> >("emissivity"); const MAST::Parameter &T_amb = p.get<MAST::Parameter>("ambient_temperature"), &T_ref_zero = p.get<MAST::Parameter>("reference_zero_temperature"), &sb_const = p.get<MAST::Parameter>("stefan_bolzmann_constant"); const std::vector<Real> &JxW = _fe->get_JxW(); const std::vector<libMesh::Point>& qpoint = _fe->get_xyz(); const std::vector<std::vector<Real> >& phi = _fe->get_phi(); const unsigned int n_phi = (unsigned int)phi.size(); RealVectorX phi_vec = RealVectorX::Zero(n_phi); RealMatrixX mat = RealMatrixX::Zero(n_phi, n_phi); const Real sbc = sb_const(), amb_temp = T_amb(), zero_ref = T_ref_zero(); Real temp, emiss; libMesh::Point pt; MAST::FEMOperatorMatrix Bmat; for (unsigned int qp=0; qp<qpoint.size(); qp++) { _local_elem->global_coordinates_location (qpoint[qp], pt); // now set the shape function values for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi_vec(i_nd) = phi[i_nd][qp]; // value of flux emissivity(pt, _time, emiss); temp = phi_vec.dot(_sol); f += JxW[qp] * phi_vec * sbc * emiss * (pow(temp-zero_ref, 4.) - pow(amb_temp-zero_ref, 4.)); if (request_jacobian) { Bmat.reinit(1, phi_vec); Bmat.right_multiply_transpose(mat, Bmat); jac += JxW[qp] * mat * sbc * emiss * 4. * pow(temp-zero_ref, 3.); } } return request_jacobian; }
void MAST::StructuralElement2D:: initialize_von_karman_strain_operator(const unsigned int qp, RealVectorX& vk_strain, RealMatrixX& vk_dwdxi_mat, MAST::FEMOperatorMatrix& Bmat_vk) { const std::vector<std::vector<libMesh::RealVectorValue> >& dphi = _fe->get_dphi(); const unsigned int n_phi = (unsigned int)dphi.size(); libmesh_assert_equal_to(vk_strain.size(), 3); libmesh_assert_equal_to(vk_dwdxi_mat.rows(), 3); libmesh_assert_equal_to(vk_dwdxi_mat.cols(), 2); libmesh_assert_equal_to(Bmat_vk.m(), 2); libmesh_assert_equal_to(Bmat_vk.n(), 6*n_phi); Real dw=0.; vk_strain.setConstant(0.); vk_dwdxi_mat.setConstant(0.); RealVectorX phi_vec = RealVectorX::Zero(n_phi); dw = 0.; for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) { phi_vec(i_nd) = dphi[i_nd][qp](0); // dphi/dx dw += phi_vec(i_nd)*_local_sol(2*n_phi+i_nd); // dw/dx } Bmat_vk.set_shape_function(0, 2, phi_vec); // dw/dx vk_dwdxi_mat(0, 0) = dw; // epsilon-xx : dw/dx vk_dwdxi_mat(2, 1) = dw; // gamma-xy : dw/dx vk_strain(0) = 0.5*dw*dw; // 1/2 * (dw/dx)^2 vk_strain(2) = dw; // (dw/dx)*(dw/dy) only dw/dx is provided here dw = 0.; for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) { phi_vec(i_nd) = dphi[i_nd][qp](1); // dphi/dy dw += phi_vec(i_nd)*_local_sol(2*n_phi+i_nd); // dw/dy } Bmat_vk.set_shape_function(1, 2, phi_vec); // dw/dy vk_dwdxi_mat(1, 1) = dw; // epsilon-yy : dw/dy vk_dwdxi_mat(2, 0) = dw; // gamma-xy : dw/dy vk_strain(1) = 0.5*dw*dw; // 1/2 * (dw/dy)^2 vk_strain(2) *= dw; // (dw/dx)*(dw/dy) }
void MAST::HeatConductionElementBase:: _initialize_mass_fem_operator(const unsigned int qp, MAST::FEMOperatorMatrix& Bmat) { const std::vector<std::vector<Real> >& phi_fe = _fe->get_phi(); const unsigned int n_phi = (unsigned int)phi_fe.size(); RealVectorX phi = RealVectorX::Zero(n_phi); // shape function values // N for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi(i_nd) = phi_fe[i_nd][qp]; Bmat.reinit(1, phi); }
bool MAST::HeatConductionElementBase::internal_residual (bool request_jacobian, RealVectorX& f, RealMatrixX& jac) { const std::vector<Real>& JxW = _fe->get_JxW(); const std::vector<libMesh::Point>& xyz = _fe->get_xyz(); const unsigned int n_phi = _fe->n_shape_functions(), dim = _elem.dim(); RealMatrixX material_mat = RealMatrixX::Zero(dim, dim), dmaterial_mat = RealMatrixX::Zero(dim, dim), // for calculation of Jac when k is temp. dep. mat_n2n2 = RealMatrixX::Zero(n_phi, n_phi); RealVectorX vec1 = RealVectorX::Zero(1), vec2_n2 = RealVectorX::Zero(n_phi), flux = RealVectorX::Zero(dim); std::auto_ptr<MAST::FieldFunction<RealMatrixX> > conductance = _property.thermal_conductance_matrix(*this); libMesh::Point p; std::vector<MAST::FEMOperatorMatrix> dBmat(dim); MAST::FEMOperatorMatrix Bmat; // for calculation of Jac when k is temp. dep. for (unsigned int qp=0; qp<JxW.size(); qp++) { // initialize the Bmat operator for this term _initialize_mass_fem_operator(qp, Bmat); Bmat.right_multiply(vec1, _sol); if (_active_sol_function) dynamic_cast<MAST::MeshFieldFunction<RealVectorX>*> (_active_sol_function)->set_element_quadrature_point_solution(vec1); _local_elem->global_coordinates_location(xyz[qp], p); (*conductance)(p, _time, material_mat); _initialize_flux_fem_operator(qp, dBmat); // calculate the flux for each dimension and add its weighted // component to the residual flux.setZero(); for (unsigned int j=0; j<dim; j++) { dBmat[j].right_multiply(vec1, _sol); // dT_dxj for (unsigned int i=0; i<dim; i++) flux(i) += vec1(0) * material_mat(i,j); // q_i = k_ij dT_dxj } // now add to the residual vector for (unsigned int i=0; i<dim; i++) { vec1(0) = flux(i); dBmat[i].vector_mult_transpose(vec2_n2, vec1); f += JxW[qp] * vec2_n2; } if (request_jacobian) { // Jacobian contribution from int_omega dB_dxi^T k_ij dB_dxj for (unsigned int i=0; i<dim; i++) for (unsigned int j=0; j<dim; j++) { dBmat[i].right_multiply_transpose(mat_n2n2, dBmat[j]); jac += JxW[qp] * material_mat(i,j) * mat_n2n2; } // Jacobian contribution from int_omega dB_dxi dT_dxj dk_ij/dT B if (_active_sol_function) { // get derivative of the conductance matrix wrt temperature conductance->derivative(MAST::PARTIAL_DERIVATIVE, *_active_sol_function, p, _time, dmaterial_mat); for (unsigned int j=0; j<dim; j++) { dBmat[j].right_multiply(vec1, _sol); // dT_dxj for (unsigned int i=0; i<dim; i++) if (dmaterial_mat(i,j) != 0.) { // no need to process for zero terms // dB_dxi^T B dBmat[i].right_multiply_transpose(mat_n2n2, Bmat); // dB_dxi^T (dT_dxj dk_ij/dT) B jac += JxW[qp] * vec1(0) * dmaterial_mat(i,j) * mat_n2n2; } } } } } if (_active_sol_function) dynamic_cast<MAST::MeshFieldFunction<RealVectorX>*> (_active_sol_function)->clear_element_quadrature_point_solution(); return request_jacobian; }
bool MAST::HeatConductionElementBase::velocity_residual (bool request_jacobian, RealVectorX& f, RealMatrixX& jac_xdot, RealMatrixX& jac) { MAST::FEMOperatorMatrix Bmat; const std::vector<Real>& JxW = _fe->get_JxW(); const std::vector<libMesh::Point>& xyz = _fe->get_xyz(); const unsigned int n_phi = _fe->n_shape_functions(), dim = _elem.dim(); RealMatrixX material_mat = RealMatrixX::Zero(dim, dim), mat_n2n2 = RealMatrixX::Zero(n_phi, n_phi); RealVectorX vec1 = RealVectorX::Zero(1), vec2_n2 = RealVectorX::Zero(n_phi); std::auto_ptr<MAST::FieldFunction<RealMatrixX> > capacitance = _property.thermal_capacitance_matrix(*this); libMesh::Point p; for (unsigned int qp=0; qp<JxW.size(); qp++) { _initialize_mass_fem_operator(qp, Bmat); Bmat.right_multiply(vec1, _sol); // B * T if (_active_sol_function) dynamic_cast<MAST::MeshFieldFunction<RealVectorX>*> (_active_sol_function)->set_element_quadrature_point_solution(vec1); _local_elem->global_coordinates_location(xyz[qp], p); (*capacitance)(p, _time, material_mat); Bmat.right_multiply(vec1, _vel); // B * T_dot Bmat.vector_mult_transpose(vec2_n2, vec1); // B^T * B * T_dot f += JxW[qp] * material_mat(0,0) * vec2_n2; // (rho*cp)*JxW B^T B T_dot if (request_jacobian) { Bmat.right_multiply_transpose(mat_n2n2, Bmat); // B^T B jac_xdot += JxW[qp] * material_mat(0,0) * mat_n2n2; // B^T B * JxW (rho*cp) // Jacobian contribution from int_omega B T d(rho*cp)/dT B if (_active_sol_function) { // get derivative of the conductance matrix wrt temperature capacitance->derivative(MAST::PARTIAL_DERIVATIVE, *_active_sol_function, p, _time, material_mat); if (material_mat(0,0) != 0.) { // no need to process for zero terms // B^T (T d(rho cp)/dT) B jac += JxW[qp] * vec1(0) * material_mat(0,0) * mat_n2n2; } } } } if (_active_sol_function) dynamic_cast<MAST::MeshFieldFunction<RealVectorX>*> (_active_sol_function)->clear_element_quadrature_point_solution(); return request_jacobian; }