bool MAST::StructuralElement2D::thermal_residual (bool request_jacobian, RealVectorX& f, RealMatrixX& jac, MAST::BoundaryConditionBase& bc) { FEMOperatorMatrix Bmat_mem, Bmat_bend, Bmat_vk; const std::vector<Real>& JxW = _fe->get_JxW(); const std::vector<libMesh::Point>& xyz = _fe->get_xyz(); const unsigned int n_phi = (unsigned int)_fe->get_phi().size(); const unsigned int n1= this->n_direct_strain_components(), n2=6*n_phi, n3 = this->n_von_karman_strain_components(); RealMatrixX material_exp_A_mat, material_exp_B_mat, mat1_n1n2 = RealMatrixX::Zero(n1,n2), mat2_n2n2 = RealMatrixX::Zero(n2,n2), mat3, mat4_n3n2 = RealMatrixX::Zero(n3,n2), vk_dwdxi_mat = RealMatrixX::Zero(n1,n3), stress = RealMatrixX::Zero(2,2), local_jac = RealMatrixX::Zero(n2,n2); RealVectorX vec1_n1 = RealVectorX::Zero(n1), vec2_n1 = RealVectorX::Zero(n1), vec3_n2 = RealVectorX::Zero(n2), vec4_2 = RealVectorX::Zero(2), vec5_n3 = RealVectorX::Zero(n3), local_f = RealVectorX::Zero(n2), delta_t = RealVectorX::Zero(1); local_f.setZero(); local_jac.setZero(); Bmat_mem.reinit(n1, _system.n_vars(), n_phi); // three stress-strain components Bmat_bend.reinit(n1, _system.n_vars(), n_phi); Bmat_vk.reinit(n3, _system.n_vars(), n_phi); // only dw/dx and dw/dy bool if_vk = (_property.strain_type() == MAST::VON_KARMAN_STRAIN), if_bending = (_property.bending_model(_elem, _fe->get_fe_type()) != MAST::NO_BENDING); std::auto_ptr<MAST::FieldFunction<RealMatrixX > > expansion_A = _property.thermal_expansion_A_matrix(*this), expansion_B = _property.thermal_expansion_B_matrix(*this); const MAST::FieldFunction<Real> &temp_func = bc.get<MAST::FieldFunction<Real> >("temperature"), &ref_temp_func = bc.get<MAST::FieldFunction<Real> >("ref_temperature"); Real t, t0; libMesh::Point pt; for (unsigned int qp=0; qp<JxW.size(); qp++) { this->local_elem().global_coordinates_location(xyz[qp], pt); // this is moved inside the domain since (*expansion_A)(pt, _time, material_exp_A_mat); (*expansion_B)(pt, _time, material_exp_B_mat); // get the temperature function temp_func(pt, _time, t); ref_temp_func(pt, _time, t0); delta_t(0) = t-t0; vec1_n1 = material_exp_A_mat * delta_t; // [C]{alpha (T - T0)} (with membrane strain) vec2_n1 = material_exp_B_mat * delta_t; // [C]{alpha (T - T0)} (with bending strain) stress(0,0) = vec1_n1(0); // sigma_xx stress(0,1) = vec1_n1(2); // sigma_xy stress(1,0) = vec1_n1(2); // sigma_yx stress(1,1) = vec1_n1(1); // sigma_yy this->initialize_direct_strain_operator(qp, Bmat_mem); // membrane strain Bmat_mem.vector_mult_transpose(vec3_n2, vec1_n1); local_f += JxW[qp] * vec3_n2; if (if_bending) { // bending strain _bending_operator->initialize_bending_strain_operator(qp, Bmat_bend); Bmat_bend.vector_mult_transpose(vec3_n2, vec2_n1); local_f += JxW[qp] * vec3_n2; // von Karman strain if (if_vk) { // get the vonKarman strain operator if needed this->initialize_von_karman_strain_operator(qp, vec2_n1, // epsilon_vk vk_dwdxi_mat, Bmat_vk); // von Karman strain vec4_2 = vk_dwdxi_mat.transpose() * vec1_n1; Bmat_vk.vector_mult_transpose(vec3_n2, vec4_2); local_f += JxW[qp] * vec3_n2; } if (request_jacobian && if_vk) { // Jacobian only for vk strain // vk - vk mat3 = RealMatrixX::Zero(2, n2); Bmat_vk.left_multiply(mat3, stress); Bmat_vk.right_multiply_transpose(mat2_n2n2, mat3); local_jac += JxW[qp] * mat2_n2n2; } } } // now transform to the global coorodinate system transform_vector_to_global_system(local_f, vec3_n2); f -= vec3_n2; if (request_jacobian && if_vk) { transform_matrix_to_global_system(local_jac, mat2_n2n2); jac -= mat2_n2n2; } // Jacobian contribution from von Karman strain return request_jacobian && if_vk; }
double sigma_func(double x) { return sigma0 * pow(temp_func(x),polyn); }
double sigma_func(double x) { double sig_ref = temp_func(x)* pow(center,-sigma_index-1.5)/( M_PI*Qmin*(1+amplitude)); double exp_fac = exp(-(x-center)*(x-center)/(2*width*width)); return sig_ref * pow(x, sigma_index) * (1 + amplitude*exp_fac); }