void LinearGeneralAnisotropicMaterial::computeQpProperties() { computeQpElasticityTensor(); computeQpStrain(); computeQpStress(); }
void Compute2DFiniteStrain::computeProperties() { // Method from Rashid, 1993 RankTwoTensor ave_Fhat; Real ave_dfgrd_det = 0.0; for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { // Deformation gradient calculation for 2D problems // Note: x_disp is the radial displacement, y_disp is the axial displacement RankTwoTensor A((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); //Deformation gradient RankTwoTensor Fbar((*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); //Old Deformation gradient // Compute the displacement gradient (2,2) value for plane strain, generalized plane strain, or axisymmetric problems A(2,2) = computeGradDispZZ(); Fbar(2,2) = computeGradDispZZold(); // Gauss point deformation gradient _deformation_gradient[_qp] = A; _deformation_gradient[_qp].addIa(1.0); A -= Fbar; //very nearly A = gradU - gradUold, adapted to cylindrical coords Fbar.addIa(1.0); //Fbar = ( I + gradUold) //Incremental deformation gradient _Fhat = I + A Fbar^-1 _Fhat[_qp] = A * Fbar.inverse(); _Fhat[_qp].addIa(1.0); // Calculate average _Fhat for volumetric locking correction ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp]; // Average deformation gradient ave_dfgrd_det += _deformation_gradient[_qp].det() * _JxW[_qp] * _coord[_qp]; } // needed for volumetric locking correction ave_Fhat /= _current_elem_volume; // average deformation gradient ave_dfgrd_det /=_current_elem_volume; for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { // Finalize volumetric locking correction _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det()); computeQpStrain(); // Volumetric locking correction _deformation_gradient[_qp] *= std::cbrt(ave_dfgrd_det / _deformation_gradient[_qp].det()); } }
void ComputeFiniteStrain::computeProperties() { // Method from Rashid, 1993 RankTwoTensor ave_Fhat; Real ave_dfgrd_det = 0.0; for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { // Deformation gradient RankTwoTensor A((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); //Deformation gradient RankTwoTensor Fbar((*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); //Old Deformation gradient _deformation_gradient[_qp] = A; _deformation_gradient[_qp].addIa(1.0);//Gauss point deformation gradient // A = gradU - gradUold A -= Fbar; // Fbar = ( I + gradUold) Fbar.addIa(1.0); // Incremental deformation gradient _Fhat = I + A Fbar^-1 _Fhat[_qp] = A * Fbar.inverse(); _Fhat[_qp].addIa(1.0); // Calculate average _Fhat for volumetric locking correction ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp]; // Average deformation gradient ave_dfgrd_det += _deformation_gradient[_qp].det() * _JxW[_qp] * _coord[_qp]; } // needed for volumetric locking correction ave_Fhat /= _current_elem_volume; // average deformation gradient ave_dfgrd_det /=_current_elem_volume; for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { if (_volumetric_locking_correction) { // Finalize volumetric locking correction _Fhat[_qp] *= std::pow(ave_Fhat.det() / _Fhat[_qp].det(), 1.0/3.0); _deformation_gradient[_qp] *= std::pow(ave_dfgrd_det / _deformation_gradient[_qp].det(), 1.0/3.0); } computeQpStrain(); } }
void FiniteStrainMaterial::computeStrain() { //Method from Rashid, 1993 std::vector<RankTwoTensor> Fhat; Fhat.resize(_qrule->n_points()); RankTwoTensor ave_Fhat; Real volume(0); Real ave_dfgrd_det; ave_dfgrd_det=0.0; for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { //Deformation gradient RankTwoTensor A(_grad_disp_x[_qp], _grad_disp_y[_qp], _grad_disp_z[_qp]); //Deformation gradient RankTwoTensor Fbar(_grad_disp_x_old[_qp], _grad_disp_y_old[_qp], _grad_disp_z_old[_qp]); //Old Deformation gradient _dfgrd[_qp] = A; _dfgrd[_qp].addIa(1.0);//Gauss point deformation gradient A -= Fbar; //A = gradU - gradUold Fbar.addIa(1.0); //Fbar = ( I + gradUold) //Incremental deformation gradient Fhat = I + A Fbar^-1 Fhat[_qp] = A * Fbar.inverse(); Fhat[_qp].addIa(1.0); //Calculate average Fhat for volumetric locking correction ave_Fhat += Fhat[_qp] * _JxW[_qp]; volume += _JxW[_qp]; ave_dfgrd_det += _dfgrd[_qp].det() * _JxW[_qp]; //Average deformation gradient } ave_Fhat /= volume; //This is needed for volumetric locking correction ave_dfgrd_det /=volume; //Average deformation gradient for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { Real factor( std::pow( ave_Fhat.det() / Fhat[_qp].det(), 1.0/3.0)); Fhat[_qp] *= factor; //Finalize volumetric locking correction computeQpStrain(Fhat[_qp]); factor = std::pow(ave_dfgrd_det / _dfgrd[_qp].det(), 1.0/3.0);//Volumetric locking correction _dfgrd[_qp] *= factor;//Volumetric locking correction } }
void ComputeRSphericalFiniteStrain::computeProperties() { // Method from Rashid, 1993 RankTwoTensor ave_Fhat; Real ave_dfgrd_det = 0.0; for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { // Deformation gradient calculation in cylindrical coordinates RankTwoTensor A; // Deformation gradient RankTwoTensor Fbar; // Old Deformation gradient // Step through calculating the current and old deformation gradients // Only diagonal components are nonzero because this is a 1D material // Note: x_disp is the radial displacement A(0,0) = (*_grad_disp[0])[_qp](0); Fbar(0,0) = (*_grad_disp_old[0])[_qp](0); // The polar and azimuthal strains are functions of radial displacement if (!MooseUtils::relativeFuzzyEqual(_q_point[_qp](0), 0.0)) { A(1,1) = (*_disp[0])[_qp] / _q_point[_qp](0); Fbar(1,1) = _disp_old_0[_qp] / _q_point[_qp](0); } // The polar and azimuthal strains are equalivalent in this 1D problem A(2,2) = A(1,1); Fbar(2,2) = Fbar(1,1); // Gauss point deformation gradient _deformation_gradient[_qp] = A; _deformation_gradient[_qp].addIa(1.0); // very nearly A = gradU - gradUold, adapted to cylindrical coords A -= Fbar; // Fbar = ( I + gradUold) Fbar.addIa(1.0); // Incremental deformation gradient _Fhat = I + A Fbar^-1 _Fhat[_qp] = A * Fbar.inverse(); _Fhat[_qp].addIa(1.0); computeQpStrain(); } }
void TrussMaterial::computeProperties() { // check for consistency of the number of element nodes mooseAssert(_current_elem->n_nodes() == 2, "Truss element needs to have exactly two nodes."); // fetch the two end nodes for _current_elem std::vector<Node *> node; for (unsigned int i = 0; i < 2; ++i) node.push_back(_current_elem->get_node(i)); // calculate original length of a truss element RealGradient dxyz; for (unsigned int i = 0; i < _ndisp; ++i) dxyz(i) = (*node[1])(i) - (*node[0])(i); _origin_length = dxyz.norm(); // fetch the solution for the two end nodes NonlinearSystemBase & nonlinear_sys = _fe_problem.getNonlinearSystemBase(); const NumericVector<Number> &sol = *nonlinear_sys.currentSolution(); std::vector<Real> disp0, disp1; for (unsigned int i = 0; i < _ndisp; ++i) { disp0.push_back(sol(node[0]->dof_number(nonlinear_sys.number(), _disp_var[i]->number(), 0))); disp1.push_back(sol(node[1]->dof_number(nonlinear_sys.number(), _disp_var[i]->number(), 0))); } // calculate current length of a truss element for (unsigned int i = 0; i < _ndisp; ++i) dxyz(i) += disp1[i] - disp0[i]; _current_length = dxyz.norm(); for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { _e_over_l[_qp] = _youngs_modulus[_qp] / _origin_length; computeQpStrain(); computeQpStress(); } }
void TensorMechanicsMaterial::computeStrain() { for (_qp = 0; _qp < _qrule->n_points(); ++_qp) computeQpStrain(); }