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 + ... }
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) }