diff --git a/modules/solid_mechanics/doc/content/source/materials/abaqus/AbaqusUMATStress.md b/modules/solid_mechanics/doc/content/source/materials/abaqus/AbaqusUMATStress.md index 4d02197b57de..46512793e2f8 100644 --- a/modules/solid_mechanics/doc/content/source/materials/abaqus/AbaqusUMATStress.md +++ b/modules/solid_mechanics/doc/content/source/materials/abaqus/AbaqusUMATStress.md @@ -96,6 +96,14 @@ An example of how to pass the user object in an input file is given below: Note that the step capability is three-pronged: 1) It allows to pass the step number to the UMAT routine via the present object, 2) It allows to pass the step number to the [AbaqusUExternalDB](/AbaqusUExternalDB.md) plugin, and 3) It allows to directly drive controls via step number in [StepPeriod](/StepPeriod.md). +## UMAT Orientation + +Anisotropic material models typically have a specified local coordinate system that may need to be +oriented differently than the global system. The `orientation` parameter takes a vector of 3 Euler +angles that defines the rotation between the local and global coordinate systems. More information +on the use of Euler angles for rotating material models in MOOSE can be found on the +[ComputeElasticityTensor](/ComputeElasticityTensor.md) page. + ## Example input file !listing modules/solid_mechanics/test/tests/umat/elastic_hardening/linear_strain_hardening.i block=Materials/constant diff --git a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h index 7281717f2e53..e603d4d076f4 100644 --- a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h +++ b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h @@ -12,6 +12,7 @@ #include "ComputeGeneralStressBase.h" #include "DynamicLibraryLoader.h" #include "ComputeFiniteStrain.h" +#include "RotationTensor.h" #include "StepUOInterface.h" class StepUserObject; @@ -223,6 +224,7 @@ class AbaqusUMATStress : public ComputeGeneralStressBase, public StepUOInterface // Time step rotation increment const OptionalMaterialProperty & _rotation_increment; + const OptionalMaterialProperty & _rotation_increment_old; // Coupled temperature field const VariableValue & _temperature; @@ -246,6 +248,12 @@ class AbaqusUMATStress : public ComputeGeneralStressBase, public StepUOInterface /// parameter to assist with the transition to 1-based indexing const bool _use_one_based_indexing; + /// Rotation information + const bool _use_orientation; + const RotationTensor _R; + MaterialProperty & _total_rotation; + const MaterialProperty & _total_rotation_old; + private: /// Method being used to compute strain and rotation increments const ComputeFiniteStrain::DecompMethod _decomposition_method; diff --git a/modules/solid_mechanics/src/materials/ComputeIncrementalStrainBase.C b/modules/solid_mechanics/src/materials/ComputeIncrementalStrainBase.C index 32a056933c3b..58fae0f26f6c 100644 --- a/modules/solid_mechanics/src/materials/ComputeIncrementalStrainBase.C +++ b/modules/solid_mechanics/src/materials/ComputeIncrementalStrainBase.C @@ -51,6 +51,7 @@ ComputeIncrementalStrainBase::initQpStatefulProperties() _mechanical_strain[_qp].zero(); _total_strain[_qp].zero(); _deformation_gradient[_qp].setToIdentity(); + _rotation_increment[_qp].setToIdentity(); } void diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index 53305c170154..9778f4a2c1cb 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -51,6 +51,9 @@ AbaqusUMATStress::validParams() "displaced mesh for computing displacements and quantities based on the deformed state."); params.addParam( "step_user_object", "The StepUserObject that provides times from simulation loading steps."); + params.addParam( + "orientation", + "Euler angles that describe the orientation of the local material coordinate system."); return params; } @@ -81,6 +84,8 @@ AbaqusUMATStress::AbaqusUMATStress(const InputParameters & parameters) _material_timestep(declareProperty(_base_name + "material_timestep_limit")), _rotation_increment( getOptionalMaterialProperty(_base_name + "rotation_increment")), + _rotation_increment_old( + getOptionalMaterialPropertyOld(_base_name + "rotation_increment")), _temperature(coupledValue("temperature")), _temperature_old(coupledValueOld("temperature")), _external_fields(isCoupled("external_fields") ? coupledValues("external_fields") @@ -93,6 +98,10 @@ AbaqusUMATStress::AbaqusUMATStress(const InputParameters & parameters) _external_properties(_number_external_properties), _external_properties_old(_number_external_properties), _use_one_based_indexing(getParam("use_one_based_indexing")), + _use_orientation(isParamValid("orientation")), + _R(_use_orientation ? getParam("orientation") : RealVectorValue(0.0)), + _total_rotation(declareProperty("total_rotation")), + _total_rotation_old(getMaterialPropertyOld("total_rotation")), _decomposition_method( getParam("decomposition_method").getEnum()) { @@ -158,6 +167,9 @@ AbaqusUMATStress::initQpStatefulProperties() _state_var[_qp].resize(_aqNSTATV); for (const auto i : make_range(_aqNSTATV)) _state_var[_qp][i] = 0.0; + + // Initialize total rotation tensor + _total_rotation[_qp] = _R; } void @@ -201,11 +213,49 @@ AbaqusUMATStress::computeQpStress() // therefore, all unsymmetric matrices must be transposed before passing them to Fortran RankTwoTensor FBar_old_fortran = _Fbar_old[_qp].transpose(); RankTwoTensor FBar_fortran = _Fbar[_qp].transpose(); - RankTwoTensor DROT_fortran = _rotation_increment[_qp].transpose(); + + // DROT needed by UMAT will depend on kinematics and whether or not an intermediate configuration + // is used + RankTwoTensor DROT_fortran; + if (_use_orientation) + { + DROT_fortran = RankTwoTensor::Identity(); + } + else + { + if (_decomposition_method == ComputeFiniteStrain::DecompMethod::HughesWinget) + DROT_fortran = _rotation_increment[_qp].transpose(); + else + DROT_fortran = _rotation_increment_old[_qp].transpose(); + } + const Real * myDFGRD0 = &(FBar_old_fortran(0, 0)); const Real * myDFGRD1 = &(FBar_fortran(0, 0)); const Real * myDROT = &(DROT_fortran(0, 0)); + // More local copies of materials so we can (optionally) rotate + RankTwoTensor stress_old = _stress_old[_qp]; + RankTwoTensor total_strain_old = _total_strain_old[_qp]; + RankTwoTensor strain_increment = _strain_increment[_qp]; + + // check if we need to rotate to intermediate configuration + if (_use_orientation) + { + // keep track of total rotation + _total_rotation[_qp] = _rotation_increment[_qp] * _total_rotation_old[_qp]; + // rotate stress/strain/increment from reference configuration to intermediate configuration + stress_old.rotate(_total_rotation_old[_qp].transpose()); + total_strain_old.rotate(_total_rotation_old[_qp].transpose()); + + if (_decomposition_method == ComputeFiniteStrain::DecompMethod::HughesWinget) + strain_increment.rotate(_total_rotation[_qp].transpose()); + else + strain_increment.rotate(_total_rotation_old[_qp].transpose()); + } + else if (_decomposition_method == ComputeFiniteStrain::DecompMethod::HughesWinget) + // rotate old stress to reference configuration + stress_old.rotate(_rotation_increment[_qp]); + // copy because UMAT does not guarantee constness for (const auto i : make_range(9)) { @@ -225,18 +275,13 @@ AbaqusUMATStress::computeQpStress() static const std::array, 6> component{ {{0, 0}, {1, 1}, {2, 2}, {0, 1}, {0, 2}, {1, 2}}}; - // rotate old stress if HughesWinget - RankTwoTensor stress_old = _stress_old[_qp]; - if (_decomposition_method == ComputeFiniteStrain::DecompMethod::HughesWinget) - stress_old.rotate(_rotation_increment[_qp]); - for (const auto i : make_range(_aqNTENS)) { const auto a = component[i].first; const auto b = component[i].second; _aqSTRESS[i] = stress_old(a, b); - _aqSTRAN[i] = _total_strain_old[_qp](a, b) * strain_factor[i]; - _aqDSTRAN[i] = _strain_increment[_qp](a, b) * strain_factor[i]; + _aqSTRAN[i] = total_strain_old(a, b) * strain_factor[i]; + _aqDSTRAN[i] = strain_increment(a, b) * strain_factor[i]; } // current coordinates @@ -342,10 +387,6 @@ AbaqusUMATStress::computeQpStress() _stress[_qp] = RankTwoTensor( _aqSTRESS[0], _aqSTRESS[1], _aqSTRESS[2], _aqSTRESS[5], _aqSTRESS[4], _aqSTRESS[3]); - // Rotate the stress state to the current configuration, unless HughesWinget - if (_decomposition_method != ComputeFiniteStrain::DecompMethod::HughesWinget) - _stress[_qp].rotate(_rotation_increment[_qp]); - // Build Jacobian matrix from UMAT's Voigt non-standard order to fourth order tensor. const unsigned int N = Moose::dim; const unsigned int ntens = N * (N + 1) / 2; @@ -365,4 +406,14 @@ AbaqusUMATStress::computeQpStress() k == l ? _aqDDSDDE[(nskip + i + j) * ntens + k] : _aqDDSDDE[(nskip + i + j) * ntens + k + nskip + l]; } + + // check if we need to rotate from intermediate reference frame + if (_use_orientation) + { + // rotate to current configuration + _stress[_qp].rotate(_total_rotation[_qp]); + _jacobian_mult[_qp].rotate(_total_rotation[_qp]); + } + else if (_decomposition_method != ComputeFiniteStrain::DecompMethod::HughesWinget) + _stress[_qp].rotate(_rotation_increment[_qp]); } diff --git a/modules/solid_mechanics/test/plugins/elastic_print.f b/modules/solid_mechanics/test/plugins/elastic_print.f index b1520a30b8ee..a793be67d382 100644 --- a/modules/solid_mechanics/test/plugins/elastic_print.f +++ b/modules/solid_mechanics/test/plugins/elastic_print.f @@ -76,7 +76,12 @@ SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, C PRINTING FOR VERIFICATION PURPOSES C IF (TIME(1).GT.1.D0 .AND. COORDS(1).GT.0.25D0 .AND. - 1 COORDS(2).GE.0.5D0 .AND. COORDS(3).GT.0.25D0) THEN + 1 COORDS(2).GE.0.25D0 .AND. COORDS(3).GT.0.25D0) THEN + + DO K1=1, NTENS + WRITE(*,110) K1, STRESS(K1) + END DO + DO K1=1, NTENS WRITE(*,120) K1, STRAN(K1) WRITE(*,125) K1, DSTRAN(K1) @@ -121,6 +126,7 @@ SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, ENDIF +110 FORMAT ( 1X 'STRESS_', I2, :, 3X, 4F10.7 ) 120 FORMAT ( 1X 'STRAIN_', I2, :, 3X, 4F10.7 ) 125 FORMAT ( 1X 'DSTRAIN_', I2, :, 3X, 4F10.7 ) 130 FORMAT ( 1X 'COORDS_', I2, :, 3X, 4F10.7 ) diff --git a/modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e b/modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e new file mode 100644 index 000000000000..fbabdb78b578 Binary files /dev/null and b/modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e differ diff --git a/modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e b/modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e new file mode 100644 index 000000000000..2730fd6eafc6 Binary files /dev/null and b/modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e differ diff --git a/modules/solid_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp b/modules/solid_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp new file mode 100644 index 000000000000..543da56e4640 --- /dev/null +++ b/modules/solid_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp @@ -0,0 +1,71 @@ +** Reference Abaqus input for "hw_reference_umat_output" MOOSE test +*NODE, NSET=NALL + 1, -0.5, -0.5, -0.5 + 2, 0.5, -0.5, -0.5 + 3, 0.5, 0.5, -0.5 + 4, -0.5, 0.5, -0.5 + 5, -0.5, -0.5, 0.5 + 6, 0.5, -0.5, 0.5 + 7, 0.5, 0.5, 0.5 + 8, -0.5, 0.5, 0.5 + 9, 0.0, -0.5, -0.5 + 10, 0.5, 0.0, -0.5 + 11, 0.0, 0.5, -0.5 + 12, -0.5, 0.0, -0.5 + 13, 0.0, -0.5, 0.5 + 14, 0.5, 0.0, 0.5 + 15, 0.0, 0.5, 0.5 + 16, -0.5, 0.0, 0.5 + 17, -0.5, -0.5, 0.0 + 18, 0.5, -0.5, 0.0 + 19, 0.5, 0.5, 0.0 + 20, -0.5, 0.5, 0.0 +*ELEMENT, TYPE=C3D20, ELSET=EALL +1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, +11, 12, 13, 14, 15, 16, 17, 18, 19, 20 +** +** Use this for no material model rotation +** *SOLID SECTION, ELSET=EALL, MATERIAL=UMAT +** , +** +** Use this section for a 30 degree material model rotation +** *ORIENTATION, NAME=30_DEGREE_Z, SYSTEM=RECTANGULAR +** 0.8660254, 0.5, 0., -0.5, 0.8660254, 0., 0., 0., 0. +** 3, 0.0 +** *SOLID SECTION, ELSET=EALL, MATERIAL=UMAT, ORIENTATION=30_DEGREE_Z +** , +** +** Use this section for a 0 degree material model rotation but stress calculated in rotated configuration +*ORIENTATION, NAME=0_DEGREE_Z, SYSTEM=RECTANGULAR +1., 0., 0., 0., 1., 0., 0., 0., 0. +3, 0.0 +*SOLID SECTION, ELSET=EALL, MATERIAL=UMAT, ORIENTATION=0_DEGREE_Z +, +** +** Node Set for bottom face +*NSET, NSET=BOTTOM + 1, 2, 5, 6, 9, 13, 17, 18 +** Node Set for top face +*NSET, NSET=TOP + 3, 4, 7, 8, 11, 15, 19, 20 +** Hold bottom fixed +*BOUNDARY +BOTTOM, 1, 3, 0.0 +** Call UMAT +*MATERIAL, NAME=UMAT +*USER MATERIAL, CONSTANTS=2 +1000.0, 0.3 +** Shear top face in +x direction by 0.005 over 5 seconds +*STEP, NAME=STEP-1, NLGEOM=YES +*STATIC +1.0, 5.0, 1.0, 1.0 +*BOUNDARY +TOP, 1, 1, 0.005 +*OUTPUT, FIELD +*NODE OUTPUT, NSET=NALL +U +COORD +*ELEMENT OUTPUT, ELSET=EALL, POSITION=INTEGRATION POINTS +S +COORD +*END STEP diff --git a/modules/solid_mechanics/test/tests/umat/orient_umat/shear_top_umat.i b/modules/solid_mechanics/test/tests/umat/orient_umat/shear_top_umat.i new file mode 100644 index 000000000000..22b25aa19aed --- /dev/null +++ b/modules/solid_mechanics/test/tests/umat/orient_umat/shear_top_umat.i @@ -0,0 +1,103 @@ +[GlobalParams] + displacements = 'disp_x disp_y disp_z' + decomposition_method = HughesWinget +[] + +[Mesh] + [gen] + type = GeneratedMeshGenerator + dim = 3 + xmin = -0.5 + xmax = 0.5 + ymin = -0.5 + ymax = 0.5 + zmin = -0.5 + zmax = 0.5 + elem_type = HEX20 + [] +[] + +[Functions] + [top_pull] + type = ParsedFunction + expression = t/1000 + [] +[] + +[Physics/SolidMechanics/QuasiStatic] + [all] + add_variables = true + strain = FINITE + generate_output = 'stress_xx stress_yy stress_xy' + [] +[] + +[BCs] + [x_pull] + type = FunctionDirichletBC + variable = disp_x + boundary = top + function = top_pull + [] + [x_bot] + type = DirichletBC + variable = disp_x + boundary = bottom + value = 0.0 + [] + [y_bot] + type = DirichletBC + variable = disp_y + boundary = bottom + value = 0.0 + [] + [z_bot] + type = DirichletBC + variable = disp_z + boundary = bottom + value = 0.0 + [] +[] + +[Materials] + [umat] + type = AbaqusUMATStress + constant_properties = '1000 0.3' + plugin = '../../../plugins/elastic_print' + num_state_vars = 0 + use_one_based_indexing = true + use_displaced_mesh = true + [] +[] + +[Executioner] + type = Transient + solve_type = 'PJFNK' + + petsc_options = '-snes_ksp_ew' + petsc_options_iname = '-ksp_gmres_restart' + petsc_options_value = '101' + + line_search = 'none' + + l_max_its = 100 + nl_max_its = 100 + nl_rel_tol = 1e-12 + nl_abs_tol = 1e-10 + l_tol = 1e-9 + start_time = 0.0 + end_time = 5 + + dt = 1.0 +[] + +[Preconditioning] + [smp] + type = SMP + full = true + [] +[] + +[Outputs] + exodus = true +[] diff --git a/modules/solid_mechanics/test/tests/umat/orient_umat/tests b/modules/solid_mechanics/test/tests/umat/orient_umat/tests new file mode 100644 index 000000000000..faf801587cc7 --- /dev/null +++ b/modules/solid_mechanics/test/tests/umat/orient_umat/tests @@ -0,0 +1,111 @@ +[Tests] + # Hughes-Winget (hw) tests match Abaqus + [hw_reference] + type = 'Exodiff' + input = 'shear_top_umat.i' + exodiff = 'shear_top_umat_out.e' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + # skip test if test is being run out-of-tree. Issue Ref: #25279 + installation_type = in_tree + [] + [hw_reference_umat_output] + type = 'RunApp' + input = 'shear_top_umat.i' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + # output from MOOSE, from timestep 5, diffs from Abaqus output in 6th decimal or so, note order in "umat" order, not MOOSE order + expect_out = 'STRESS_ 1 -0.1757425\n STRESS_ 2 -0.5954772\n STRESS_ 3 -0.0436915\n STRESS_ 4 0.9835696\n STRESS_ 5 0.0729212\n STRESS_ 6 -0.1727900\n ' + 'STRAIN_ 1 0.0000101\n DSTRAIN_ 1 0.0000037\n STRAIN_ 2 -0.0004222\n DSTRAIN_ 2 -0.0001052\n STRAIN_ 3 0.0001507\n DSTRAIN_ 3 0.0000370\n ' + 'STRAIN_ 4 0.0020475\n DSTRAIN_ 4 0.0005107\n STRAIN_ 5 0.0001519\n DSTRAIN_ 5 0.0000383\n STRAIN_ 6 -0.0003596\n DSTRAIN_ 6 -0.0000896\n ' + 'COORDS_ 1 0.3915195\n COORDS_ 2 0.3857086\n COORDS_ 3 0.3873709' + # output from Abaqus for reference: + # STRESS_ 1 -0.1757421 STRESS_ 2 -0.5954760 STRESS_ 3 -0.0436913 STRESS_ 4 0.9835690 STRESS_ 5 0.0729211 STRESS_ 6 -0.1727900 + # STRAIN_ 1 0.0000123 DSTRAIN_ 1 0.0000037 STRAIN_ 2 -0.0004245 DSTRAIN_ 2 -0.0001052 STRAIN_ 3 0.0001507 DSTRAIN_ 3 0.0000370 + # STRAIN_ 4 0.0020466 DSTRAIN_ 4 0.0005107 STRAIN_ 5 0.0001513 DSTRAIN_ 5 0.0000383 STRAIN_ 6 -0.0003596 DSTRAIN_ 6 -0.0000896 + # COORDS_ 1 0.3915195 COORDS_ 2 0.3857086 COORDS_ 3 0.3873709 + # skip test if test is being run out-of-tree. Issue Ref: #25279 + installation_type = in_tree + [] + + # rotated isotropic material module should give the same material (Cauchy) stress as above + [hw_rotated] + type = 'Exodiff' + input = 'shear_top_umat.i' + exodiff = 'shear_top_umat_out.e' + prereq = 'hw_reference' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'Materials/umat/orientation="-30. 0. 0."' + installation_type = in_tree + [] + # but the stress computed in the intermediate reference frame should be different + # values should closely match Abaqus using *ORIENTATION in input file like: + # *ORIENTATION, NAME=30_DEGREE_Z, SYSTEM=RECTANGULAR + # 0.8660254, 0.5, 0., -0.5, 0.8660254, 0., 0., 0., 0. + # 3, 0.0 + [hw_rotated_umat_output] + type = 'RunApp' + input = 'shear_top_umat.i' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'Materials/umat/orientation="-30. 0. 0."' + expect_out = 'STRESS_ 1 0.5677315\n STRESS_ 2 -1.3387362\n STRESS_ 3 -0.0439064\n STRESS_ 4 0.3203801\n STRESS_ 5 -0.0219378\n STRESS_ 6 -0.1868725\n ' + 'STRAIN_ 1 0.0007858\n DSTRAIN_ 1 0.0001968\n STRAIN_ 2 -0.0011977\n DSTRAIN_ 2 -0.0002982\n STRAIN_ 3 0.0001505\n DSTRAIN_ 3 0.0000369\n ' + 'STRAIN_ 4 0.0006666\n DSTRAIN_ 4 0.0001664\n STRAIN_ 5 -0.0000461\n DSTRAIN_ 5 -0.0000109\n STRAIN_ 6 -0.0003887\n DSTRAIN_ 6 -0.0000972\n ' + 'COORDS_ 1 0.3915195\n COORDS_ 2 0.3857086\n COORDS_ 3 0.3873709' + # output from Abaqus for reference: + # STRESS_ 1 0.5677315 STRESS_ 2 -1.3387347 STRESS_ 3 -0.0439062 STRESS_ 4 0.3203801 STRESS_ 5 -0.0219379 STRESS_ 6 -0.1868725 + # STRAIN_ 1 0.0007858 DSTRAIN_ 1 0.0001968 STRAIN_ 2 -0.0011977 DSTRAIN_ 2 -0.0002982 STRAIN_ 3 0.0001505 DSTRAIN_ 3 0.0000369 + # STRAIN_ 4 0.0006666 DSTRAIN_ 4 0.0001664 STRAIN_ 5 -0.0000461 DSTRAIN_ 5 -0.0000109 STRAIN_ 6 -0.0003887 DSTRAIN_ 6 -0.0000972 + # COORDS_ 1 0.3915195 COORDS_ 2 0.3857086 COORDS_ 3 0.3873709 + installation_type = in_tree + [] + + # in this case, zero material model rotation applied, but defining *any* orientation causes the stress to be calculated in the intermediate (rotated) frame + # again, isotropic material module should give the same material (Cauchy) stress as above + [hw_zero_rotated] + type = 'Exodiff' + input = 'shear_top_umat.i' + exodiff = 'shear_top_umat_out.e' + prereq = 'hw_rotated' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'Materials/umat/orientation="0. 0. 0."' + installation_type = in_tree + [] + # but the stress computed in the intermediate reference frame should be different + # values should closely match Abaqus using *ORIENTATION in input file like: + # *ORIENTATION, NAME=0_DEGREE_Z, SYSTEM=RECTANGULAR + # 1., 0., 0., 0., 1., 0., 0., 0., 0. + # 3, 0.0 + [hw_zero_rotated_umat_output] + type = 'RunApp' + input = 'shear_top_umat.i' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'Materials/umat/orientation="0. 0. 0."' + expect_out = 'STRESS_ 1 -0.1863428\n STRESS_ 2 -0.5846620\n STRESS_ 3 -0.0439064\n STRESS_ 4 0.9857148\n STRESS_ 5 0.0744375\n STRESS_ 6 -0.1728053\n ' + 'STRAIN_ 1 0.0000012\n DSTRAIN_ 1 0.0000010\n STRAIN_ 2 -0.0004132\n DSTRAIN_ 2 -0.0001024\n STRAIN_ 3 0.0001505\n DSTRAIN_ 3 0.0000369\n ' + 'STRAIN_ 4 0.0020510\n DSTRAIN_ 4 0.0005118\n STRAIN_ 5 0.0001544\n DSTRAIN_ 5 0.0000391\n STRAIN_ 6 -0.0003597\n DSTRAIN_ 6 -0.0000896\n ' + 'COORDS_ 1 0.3915195\n COORDS_ 2 0.3857086\n COORDS_ 3 0.3873709' + # output from Abaqus for reference: + # STRESS_ 1 -0.1863423 STRESS_ 2 -0.5846608 STRESS_ 3 -0.0439062 STRESS_ 4 0.9857141 STRESS_ 5 0.0744374 STRESS_ 6 -0.1728053 + # STRAIN_ 1 0.0000012 DSTRAIN_ 1 0.0000010 STRAIN_ 2 -0.0004132 DSTRAIN_ 2 -0.0001024 STRAIN_ 3 0.0001505 DSTRAIN_ 3 0.0000369 + # STRAIN_ 4 0.0020510 DSTRAIN_ 4 0.0005118 STRAIN_ 5 0.0001544 DSTRAIN_ 5 0.0000391 STRAIN_ 6 -0.0003597 DSTRAIN_ 6 -0.0000896 + # COORDS_ 1 0.3915195 COORDS_ 2 0.3857086 COORDS_ 3 0.3873709 + installation_type = in_tree + [] + + # spot checked results from using Rashid kinematics to be within ~0.01% at final timestep, about what is expected for the two methods + [rashid_rotated] + type = 'Exodiff' + input = 'shear_top_umat.i' + exodiff = 'shear_top_umat_rashid_out.e' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'GlobalParams/decomposition_method=TaylorExpansion Materials/umat/orientation="-30. 0. 0." Outputs/file_base=shear_top_umat_rashid_out' + # skip test if test is being run out-of-tree. Issue Ref: #25279 + installation_type = in_tree + [] +[] diff --git a/modules/solid_mechanics/test/tests/umat/print/tests b/modules/solid_mechanics/test/tests/umat/print/tests index c48aa48a795b..69ebfde2a87b 100644 --- a/modules/solid_mechanics/test/tests/umat/print/tests +++ b/modules/solid_mechanics/test/tests/umat/print/tests @@ -57,6 +57,7 @@ 'increments modify the stiffness of the material through ' 'CompositeElasticityTensor. This test also serves as a reference for UMAT behavior ' 'in the presence of shear deformation. ' + installation_type = in_tree [] [print_shear_print] type = 'RunApp' @@ -75,10 +76,10 @@ 'DFGRD0_ 3 3 1.0000000\n DFGRD1_ 1 1 0.9998834\n DFGRD1_ 1 2 0.0180418\n ' 'DFGRD1_ 1 3 [ -]0.0000000\n DFGRD1_ 2 1 -0.0134463\n DFGRD1_ 2 2 ' '0.9999889\n DFGRD1_ 2 3 [ -]0.0000000\n DFGRD1_ 3 1 -0.0024650\n DFGRD1_ 3 2 ' - ' 0.0000163\n DFGRD1_ 3 3 0.9999627\n DROT_ 1 1 0.9998753\n DROT_ 1 2 ' - '0.0157422\n DROT_ 1 3 0.0012320\n DROT_ 2 1 -0.0157422\n DROT_ 2 2 ' - '0.9998761\n DROT_ 2 3 -0.0000401\n DROT_ 3 1 -0.0012325\n DROT_ 3 2 ' - '0.0000207\n DROT_ 3 3 0.9999992\n TIME_ 1 [ -]0.0000000\n TIME_ 2 [ ' + ' 0.0000163\n DFGRD1_ 3 3 0.9999627\n DROT_ 1 1 1.0000000\n DROT_ 1 2 ' + '[ -]0.0000000\n DROT_ 1 3 [ -]0.0000000\n DROT_ 2 1 [ -]0.0000000\n DROT_ 2 2 ' + '1.0000000\n DROT_ 2 3 [ -]0.0000000\n DROT_ 3 1 [ -]0.0000000\n DROT_ 3 2 ' + '[ -]0.0000000\n DROT_ 3 3 1.0000000\n TIME_ 1 [ -]0.0000000\n TIME_ 2 [ ' '-]0.0000000\n CELENT 1.0000000\n CMNAME: umat\s*\n NDI_ 3\n NSHR_ 3\n NTENS_ 6\n ' 'NOEL_ 1\n NPT_ 8\n LAYER_-1\n KSPT_-1\n KSTEP_ 1\n KINC_ 1\n FIELD1_[ ' '-]0.0000000\n FIELD2_[ -]0.0000000\n DFIELD1_ 0.0000739\n DFIELD2_ 0.0022982' @@ -125,10 +126,10 @@ 'DFGRD0_ 3 3 1.0000000\n DFGRD1_ 1 1 0.9998834\n DFGRD1_ 1 2 0.0180418\n ' 'DFGRD1_ 1 3 [ -]0.0000000\n DFGRD1_ 2 1 -0.0134463\n DFGRD1_ 2 2 ' '0.9999889\n DFGRD1_ 2 3 [ -]0.0000000\n DFGRD1_ 3 1 -0.0024650\n DFGRD1_ 3 2 ' - ' 0.0000163\n DFGRD1_ 3 3 0.9999627\n DROT_ 1 1 0.9998753\n DROT_ 1 2 ' - '0.0157422\n DROT_ 1 3 0.0012320\n DROT_ 2 1 -0.0157422\n DROT_ 2 2 ' - '0.9998761\n DROT_ 2 3 -0.0000401\n DROT_ 3 1 -0.0012325\n DROT_ 3 2 ' - '0.0000207\n DROT_ 3 3 0.9999992\n TIME_ 1 [ -]0.0000000\n TIME_ 2 [ ' + ' 0.0000163\n DFGRD1_ 3 3 0.9999627\n DROT_ 1 1 1.0000000\n DROT_ 1 2 ' + '[ -]0.0000000\n DROT_ 1 3 [ -]0.0000000\n DROT_ 2 1 [ -]0.0000000\n DROT_ 2 2 ' + '1.0000000\n DROT_ 2 3 [ -]0.0000000\n DROT_ 3 1 [ -]0.0000000\n DROT_ 3 2 ' + '[ -]0.0000000\n DROT_ 3 3 1.0000000\n TIME_ 1 [ -]0.0000000\n TIME_ 2 [ ' '-]0.0000000\n CELENT 1.0000114\n CMNAME: umat\s*\n NDI_ 3\n NSHR_ 3\n NTENS_ 6\n ' 'NOEL_ 1\n NPT_ 8\n LAYER_-1\n KSPT_-1\n KSTEP_ 1\n KINC_ 1\n FIELD1_[ ' '-]0.0000000\n FIELD2_[ -]0.0000000\n DFIELD1_ 0.0000739\n DFIELD2_ 0.0022982'