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::_convert_prestress_B_mat_to_vector(const RealMatrixX& mat, RealVectorX& vec) const { libmesh_assert_equal_to(mat.rows(), 2); libmesh_assert_equal_to(mat.cols(), 2); vec = RealVectorX::Zero(3); vec(0) = mat(0,0); // sigma x vec(1) = mat(1,1); // sigma y vec(2) = mat(0,1); // tau xy }
virtual void operator() (const libMesh::Point& p, const Real t, RealMatrixX& m) const { // add the values of each matrix to get the integrated value RealMatrixX mi; for (unsigned int i=0; i<_layer_mats.size(); i++) { (*_layer_mats[i])(p, t, mi); // use the size of the layer matrix to resize the output // all other layers should return the same sized matrices if (i==0) m = RealMatrixX::Zero(mi.rows(), mi.cols()); m += mi; } }
virtual void derivative ( const MAST::FunctionBase& f, const libMesh::Point& p, const Real t, RealMatrixX& m) const { // add the values of each matrix to get the integrated value RealMatrixX mi; m = RealMatrixX::Zero(2,2); for (unsigned int i=0; i<_layer_mats.size(); i++) { _layer_mats[i]->derivative( f, p, t, mi); // use the size of the layer matrix to resize the output // all other layers should return the same sized matrices if (i==0) m = RealMatrixX::Zero(mi.rows(), mi.cols()); m += mi; } }
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::LAPACK_DGGEV::compute(const RealMatrixX &A, const RealMatrixX &B, bool computeEigenvectors) { libmesh_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows()); _A = A; _B = B; RealMatrixX Amat = A, Bmat = B; int n = (int)A.cols(); char L='N',R='N'; if (computeEigenvectors) { L = 'V'; R = 'V'; VL.setZero(n, n); VR.setZero(n, n); } int lwork=16*n; info_val=-1; alpha.setZero(n); beta.setZero(n); RealVectorX work, aval_r, aval_i, bval; RealMatrixX vecl, vecr; work.setZero(lwork); aval_r.setZero(n); aval_i.setZero(n); bval.setZero(n); vecl.setZero(n,n); vecr.setZero(n,n); Real *a_vals = Amat.data(), *b_vals = Bmat.data(), *alpha_r_v = aval_r.data(), *alpha_i_v = aval_i.data(), *beta_v = bval.data(), *vecl_v = vecl.data(), *vecr_v = vecr.data(), *work_v = work.data(); dggev_(&L, &R, &n, &(a_vals[0]), &n, &(b_vals[0]), &n, &(alpha_r_v[0]), &(alpha_i_v[0]), &(beta_v[0]), &(vecl_v[0]), &n, &(vecr_v[0]), &n, &(work_v[0]), &lwork, &info_val); // now sort the eigenvalues for complex conjugates unsigned int n_located = 0; while (n_located < n) { // if the imaginary part of the eigenvalue is non-zero, it is a // complex conjugate if (aval_i(n_located) != 0.) { // complex conjugate alpha( n_located) = std::complex<double>(aval_r(n_located), aval_i(n_located)); alpha(1+n_located) = std::complex<double>(aval_r(n_located), -aval_i(n_located)); beta ( n_located) = bval(n_located); beta (1+n_located) = bval(n_located); // copy the eigenvectors if they were requested if (computeEigenvectors) { std::complex<double> iota = std::complex<double>(0, 1.); VL.col( n_located) = (vecl.col( n_located).cast<Complex>() + vecl.col(1+n_located).cast<Complex>() * iota); VL.col(1+n_located) = (vecl.col( n_located).cast<Complex>() - vecl.col(1+n_located).cast<Complex>() * iota); VR.col( n_located) = (vecr.col( n_located).cast<Complex>() + vecr.col(1+n_located).cast<Complex>() * iota); VR.col(1+n_located) = (vecr.col( n_located).cast<Complex>() - vecr.col(1+n_located).cast<Complex>() * iota); } // two complex conjugate roots were found n_located +=2; } else { alpha( n_located) = std::complex<double>(aval_r(n_located), 0.); beta ( n_located) = bval(n_located); // copy the eigenvectors if they were requested if (computeEigenvectors) { VL.col(n_located) = vecl.col(n_located).cast<Complex>(); VR.col(n_located) = vecr.col(n_located).cast<Complex>(); } // only one real root was found n_located++; } } if (info_val != 0) libMesh::out << "Warning!! DGGEV returned with nonzero info = " << info_val << std::endl; }