GlobalStrainUserObject::GlobalStrainUserObject(const InputParameters & parameters) : ElementUserObject(parameters), _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""), _Cijkl(getMaterialProperty<RankFourTensor>(_base_name + "elasticity_tensor")), _stress(getMaterialProperty<RankTwoTensor>(_base_name + "stress")), _dim(_mesh.dimension()), _ndisp(coupledComponents("displacements")), _disp_var(_ndisp), _periodic_dir() { for (unsigned int i = 0; i < _ndisp; ++i) _disp_var[i] = coupled("displacements", i); for (unsigned int dir = 0; dir < _dim; ++dir) { _periodic_dir(dir) = _mesh.isTranslatedPeriodic(_disp_var[0], dir); for (unsigned int i = 1; i < _ndisp; ++i) if (_mesh.isTranslatedPeriodic(_disp_var[i], dir) != _periodic_dir(dir)) mooseError("All the displacement components in a particular direction should have same " "periodicity."); } if (isParamValid("applied_stress_tensor")) _applied_stress_tensor.fillFromInputVector( getParam<std::vector<Real>>("applied_stress_tensor")); else _applied_stress_tensor.zero(); }
Real GlobalDisplacementAux::computeValue() { RankTwoTensor strain; strain.fillFromScalarVariable(_scalar_global_strain); for (unsigned int dir = 0; dir < _dim; ++dir) if (!_periodic_dir(dir)) for (unsigned int var = 0; var < _ndisp; ++var) strain(dir, var) = 0.0; const RealVectorValue & global_disp = strain * (*_current_node); if (_output_global_disp) return global_disp(_component); else return global_disp(_component) + (*_disp[_component])[_qp]; }