void MAST::StructuralElement2D:: initialize_von_karman_strain_operator_sensitivity(const unsigned int qp, RealMatrixX &vk_dwdxi_mat_sens) { 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_dwdxi_mat_sens.rows(), 3); libmesh_assert_equal_to(vk_dwdxi_mat_sens.cols(), 2); Real dw=0.; vk_dwdxi_mat_sens.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_sens(2*n_phi+i_nd); // dw/dx } vk_dwdxi_mat_sens(0, 0) = dw; // epsilon-xx : dw/dx vk_dwdxi_mat_sens(2, 1) = dw; // gamma-xy : dw/dx 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_sens(2*n_phi+i_nd); // dw/dy } vk_dwdxi_mat_sens(1, 1) = dw; // epsilon-yy : dw/dy vk_dwdxi_mat_sens(2, 0) = dw; // gamma-xy : dw/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) }