From 9feade047355d9382d10a75fe762cc26965b9758 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Tue, 20 Sep 2022 11:03:41 -0600 Subject: [PATCH 01/13] define preferential orientation direction for UMAT --- .../materials/abaqus/AbaqusUMATStress.h | 7 ++ .../src/materials/abaqus/AbaqusUMATStress.C | 65 +++++++++++++++---- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h index 7281717f2e53..4ba5fe2ad2fd 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; @@ -246,6 +247,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 + RotationTensor _R; + MaterialProperty & _total_rotation; + const MaterialProperty & _total_rotation_old; + const bool _orientation_flag; + private: /// Method being used to compute strain and rotation increments const ComputeFiniteStrain::DecompMethod _decomposition_method; diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index 53305c170154..a1e3befe3aad 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("euler_angle_1", 0.0, "Euler angle in direction 1."); + params.addParam("euler_angle_2", 0.0, "Euler angle in direction 2."); + params.addParam("euler_angle_3", 0.0, "Euler angle in direction 3."); return params; } @@ -93,8 +96,16 @@ 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")), + _R(RealVectorValue(getParam("euler_angle_1"), + getParam("euler_angle_2"), + getParam("euler_angle_3"))), + _total_rotation(declareProperty("total_rotation")), + _total_rotation_old(getMaterialPropertyOld("total_rotation")), + _orientation_flag(parameters.isParamSetByUser("euler_angle_1") || + parameters.isParamSetByUser("euler_angle_2") || + parameters.isParamSetByUser("euler_angle_3")), _decomposition_method( - getParam("decomposition_method").getEnum()) + getParam("decomposition_method").getEnum()) { if (!_use_one_based_indexing) mooseDeprecated( @@ -158,6 +169,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 @@ -206,11 +220,36 @@ AbaqusUMATStress::computeQpStress() const Real * myDFGRD1 = &(FBar_fortran(0, 0)); const Real * myDROT = &(DROT_fortran(0, 0)); + // More local copies of materials so we can 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 (_orientation_flag) + { + // 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)) { _aqDFGRD0[i] = myDFGRD0[i]; _aqDFGRD1[i] = myDFGRD1[i]; + // TODO: Use old rotation increment for DROT if Rashid so UMAT state variables + // can be rotated to the same reference frame as stress (ie. old stress) _aqDROT[i] = myDROT[i]; } @@ -225,18 +264,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 +376,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 +395,15 @@ 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 (_orientation_flag) + { + // 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]); + } From a25a4a1577d2fe5fc2c6a8280a69a592fcccbdfa Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Mon, 17 Apr 2023 11:01:17 -0600 Subject: [PATCH 02/13] add UMAT orientation tests, closes #24095 --- .../test/plugins/elastic_print.f | 8 +- .../orient_umat/gold/shear_top_umat_out.e | Bin 0 -> 56872 bytes .../gold/shear_top_umat_rashid_out.e | Bin 0 -> 61316 bytes .../tests/umat/orient_umat/shear_top_umat.i | 102 ++++++++++++++++++ .../test/tests/umat/orient_umat/tests | 92 ++++++++++++++++ 5 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e create mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e create mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i create mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/tests 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/tensor_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e b/modules/tensor_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e new file mode 100644 index 0000000000000000000000000000000000000000..fbabdb78b578d4a45ab649e632e8a48f70c76b36 GIT binary patch literal 56872 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 Gm;672YyZLk literal 0 HcmV?d00001 diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i b/modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i new file mode 100644 index 000000000000..ae1eebe572de --- /dev/null +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i @@ -0,0 +1,102 @@ +[GlobalParams] + displacements = 'disp_x disp_y disp_z' +[] + +[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 + [] +[] + +[Modules/TensorMechanics/Master] + [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/tensor_mechanics/test/tests/umat/orient_umat/tests b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests new file mode 100644 index 000000000000..d5a95879c1eb --- /dev/null +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests @@ -0,0 +1,92 @@ +[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' + cli_args = 'GlobalParams/decomposition_method=HughesWinget' + [] + [hw_reference_umat_output] + type = 'RunApp' + input = 'shear_top_umat.i' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'GlobalParams/decomposition_method=HughesWinget' + expect_out = ' + STRESS_ 1 -0.1757425 + STRESS_ 2 -0.5954772 + STRESS_ 3 -0.0436915 + STRESS_ 4 0.9835696 + STRESS_ 5 0.0729212 + STRESS_ 6 -0.1727900 + STRAIN_ 1 0.0000101 + DSTRAIN_ 1 0.0000037 + STRAIN_ 2 -0.0004222 + DSTRAIN_ 2 -0.0001052 + STRAIN_ 3 0.0001507 + DSTRAIN_ 3 0.0000370 + STRAIN_ 4 0.0020475 + DSTRAIN_ 4 0.0005107 + STRAIN_ 5 0.0001519 + DSTRAIN_ 5 0.0000383 + STRAIN_ 6 -0.0003596 + DSTRAIN_ 6 -0.0000896 + COORDS_ 1 0.3915195 + COORDS_ 2 0.3857086 + COORDS_ 3 0.3873709' + [] + + # rotated isotropic material module should give the same material (Cauchy) stress + [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 = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/euler_angle_1=-30' + [] + # but the stress computed in the intermediate reference frame should be different + # values match Abaqus + [hw_rotated_umat_output] + type = 'RunApp' + input = 'shear_top_umat.i' + library_mode = 'DYNAMIC' + valgrind = 'NONE' + cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/euler_angle_1=-30' + expect_out = ' + STRESS_ 1 0.5677315 + STRESS_ 2 -1.3387362 + STRESS_ 3 -0.0439064 + STRESS_ 4 0.3203801 + STRESS_ 5 -0.0219378 + 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' + [] + + # 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 = 'Materials/umat/euler_angle_1=-30 Outputs/file_base=shear_top_umat_rashid_out' + [] +[] From 6706325244351095bc8ba703c8b8dda83c4952f0 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Mon, 17 Apr 2023 12:24:08 -0600 Subject: [PATCH 03/13] formatting fixes --- .../solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index a1e3befe3aad..9b76c98838cd 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -105,7 +105,7 @@ AbaqusUMATStress::AbaqusUMATStress(const InputParameters & parameters) parameters.isParamSetByUser("euler_angle_2") || parameters.isParamSetByUser("euler_angle_3")), _decomposition_method( - getParam("decomposition_method").getEnum()) + getParam("decomposition_method").getEnum()) { if (!_use_one_based_indexing) mooseDeprecated( @@ -405,5 +405,4 @@ AbaqusUMATStress::computeQpStress() } else if (_decomposition_method != ComputeFiniteStrain::DecompMethod::HughesWinget) _stress[_qp].rotate(_rotation_increment[_qp]); - } From c1f8d776ef1c20d51e29b6002fdaff24682a4be6 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Wed, 19 Apr 2023 08:10:00 -0600 Subject: [PATCH 04/13] addressing comments --- .../materials/abaqus/AbaqusUMATStress.h | 4 ++-- .../src/materials/abaqus/AbaqusUMATStress.C | 18 ++++++------------ .../test/tests/umat/orient_umat/tests | 6 +++--- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h index 4ba5fe2ad2fd..9a5aa99b55ff 100644 --- a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h +++ b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h @@ -248,10 +248,10 @@ class AbaqusUMATStress : public ComputeGeneralStressBase, public StepUOInterface const bool _use_one_based_indexing; /// Rotation information - RotationTensor _R; + const bool _use_orientation; + const RotationTensor _R; MaterialProperty & _total_rotation; const MaterialProperty & _total_rotation_old; - const bool _orientation_flag; private: /// Method being used to compute strain and rotation increments diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index 9b76c98838cd..230c7a883e86 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -51,9 +51,7 @@ 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("euler_angle_1", 0.0, "Euler angle in direction 1."); - params.addParam("euler_angle_2", 0.0, "Euler angle in direction 2."); - params.addParam("euler_angle_3", 0.0, "Euler angle in direction 3."); + params.addParam("orientation", "Euler angles corresponding to the Abaqus ORIENTATION keyword."); return params; } @@ -96,14 +94,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")), - _R(RealVectorValue(getParam("euler_angle_1"), - getParam("euler_angle_2"), - getParam("euler_angle_3"))), + _use_orientation(isParamValid("orientation")), + _R(_use_orientation ? getParam("orientation") : RealVectorValue(0.0)), _total_rotation(declareProperty("total_rotation")), _total_rotation_old(getMaterialPropertyOld("total_rotation")), - _orientation_flag(parameters.isParamSetByUser("euler_angle_1") || - parameters.isParamSetByUser("euler_angle_2") || - parameters.isParamSetByUser("euler_angle_3")), _decomposition_method( getParam("decomposition_method").getEnum()) { @@ -220,13 +214,13 @@ AbaqusUMATStress::computeQpStress() const Real * myDFGRD1 = &(FBar_fortran(0, 0)); const Real * myDROT = &(DROT_fortran(0, 0)); - // More local copies of materials so we can rotate + // 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 (_orientation_flag) + if (_use_orientation) { // keep track of total rotation _total_rotation[_qp] = _rotation_increment[_qp] * _total_rotation_old[_qp]; @@ -397,7 +391,7 @@ AbaqusUMATStress::computeQpStress() } // check if we need to rotate from intermediate reference frame - if (_orientation_flag) + if (_use_orientation) { // rotate to current configuration _stress[_qp].rotate(_total_rotation[_qp]); diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests index d5a95879c1eb..8da4b2ca7674 100644 --- a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests @@ -46,7 +46,7 @@ prereq = 'hw_reference' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/euler_angle_1=-30' + cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/orientation="-30 0 0"' [] # but the stress computed in the intermediate reference frame should be different # values match Abaqus @@ -55,7 +55,7 @@ input = 'shear_top_umat.i' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/euler_angle_1=-30' + cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/orientation="-30 0 0"' expect_out = ' STRESS_ 1 0.5677315 STRESS_ 2 -1.3387362 @@ -87,6 +87,6 @@ exodiff = 'shear_top_umat_rashid_out.e' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'Materials/umat/euler_angle_1=-30 Outputs/file_base=shear_top_umat_rashid_out' + cli_args = 'Materials/umat/orientation="-30 0 0" Outputs/file_base=shear_top_umat_rashid_out' [] [] From 8c96fbe9a795085df0279e2ac726c4a7de410a8e Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Wed, 19 Apr 2023 08:38:38 -0600 Subject: [PATCH 05/13] formatting fixes --- .../solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index 230c7a883e86..84114e9acdab 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -51,7 +51,8 @@ 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 corresponding to the Abaqus ORIENTATION keyword."); + params.addParam("orientation", + "Euler angles corresponding to the Abaqus ORIENTATION keyword."); return params; } From 86c4efc22adc2018e0ee355d172b02b8523c5b23 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Thu, 20 Apr 2023 11:54:14 -0600 Subject: [PATCH 06/13] address comments --- .../src/materials/abaqus/AbaqusUMATStress.C | 2 +- .../test/tests/umat/orient_umat/tests | 52 +++---------------- 2 files changed, 9 insertions(+), 45 deletions(-) diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index 84114e9acdab..14f34392d646 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -52,7 +52,7 @@ AbaqusUMATStress::validParams() params.addParam( "step_user_object", "The StepUserObject that provides times from simulation loading steps."); params.addParam("orientation", - "Euler angles corresponding to the Abaqus ORIENTATION keyword."); + "Euler angles that describe the orientation of the local material coordinate system."); return params; } diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests index 8da4b2ca7674..798c95912341 100644 --- a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests @@ -14,28 +14,10 @@ library_mode = 'DYNAMIC' valgrind = 'NONE' cli_args = 'GlobalParams/decomposition_method=HughesWinget' - expect_out = ' - STRESS_ 1 -0.1757425 - STRESS_ 2 -0.5954772 - STRESS_ 3 -0.0436915 - STRESS_ 4 0.9835696 - STRESS_ 5 0.0729212 - STRESS_ 6 -0.1727900 - STRAIN_ 1 0.0000101 - DSTRAIN_ 1 0.0000037 - STRAIN_ 2 -0.0004222 - DSTRAIN_ 2 -0.0001052 - STRAIN_ 3 0.0001507 - DSTRAIN_ 3 0.0000370 - STRAIN_ 4 0.0020475 - DSTRAIN_ 4 0.0005107 - STRAIN_ 5 0.0001519 - DSTRAIN_ 5 0.0000383 - STRAIN_ 6 -0.0003596 - DSTRAIN_ 6 -0.0000896 - COORDS_ 1 0.3915195 - COORDS_ 2 0.3857086 - COORDS_ 3 0.3873709' + 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' [] # rotated isotropic material module should give the same material (Cauchy) stress @@ -56,28 +38,10 @@ library_mode = 'DYNAMIC' valgrind = 'NONE' cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/orientation="-30 0 0"' - expect_out = ' - STRESS_ 1 0.5677315 - STRESS_ 2 -1.3387362 - STRESS_ 3 -0.0439064 - STRESS_ 4 0.3203801 - STRESS_ 5 -0.0219378 - 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' + 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' [] # spot checked results from using Rashid kinematics to be within ~0.01% at final timestep, about what is expected for the two methods From 33080933ef9ef2af80c61db4c002b2b8e28c1ed1 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Thu, 20 Apr 2023 11:59:04 -0600 Subject: [PATCH 07/13] more formatting fixes --- .../solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C index 14f34392d646..08b9a4fcdf30 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -51,8 +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."); + params.addParam( + "orientation", + "Euler angles that describe the orientation of the local material coordinate system."); return params; } From 068dec1ed2feeb3b6c3cf5a0d7fb21ec1bdf6433 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Mon, 24 Apr 2023 07:06:34 -0600 Subject: [PATCH 08/13] describe this feature in the docs --- .../content/source/materials/abaqus/AbaqusUMATStress.md | 8 ++++++++ 1 file changed, 8 insertions(+) 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 From c123743b7f2887bc13463e4abbe23539c11594f0 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Mon, 8 May 2023 13:15:40 -0600 Subject: [PATCH 09/13] send in old rotation increment for DROT if using Rashid kinematics, or Identity if using an intermediate configuation (to match Abaqus) --- .../materials/abaqus/AbaqusUMATStress.h | 1 + .../materials/ComputeIncrementalStrainBase.C | 1 + .../src/materials/abaqus/AbaqusUMATStress.C | 21 ++++++++++++++++--- .../test/tests/umat/print/tests | 16 +++++++------- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h index 9a5aa99b55ff..e603d4d076f4 100644 --- a/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h +++ b/modules/solid_mechanics/include/materials/abaqus/AbaqusUMATStress.h @@ -224,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; 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 08b9a4fcdf30..9778f4a2c1cb 100644 --- a/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/solid_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -84,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") @@ -211,7 +213,22 @@ 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)); @@ -244,8 +261,6 @@ AbaqusUMATStress::computeQpStress() { _aqDFGRD0[i] = myDFGRD0[i]; _aqDFGRD1[i] = myDFGRD1[i]; - // TODO: Use old rotation increment for DROT if Rashid so UMAT state variables - // can be rotated to the same reference frame as stress (ie. old stress) _aqDROT[i] = myDROT[i]; } diff --git a/modules/solid_mechanics/test/tests/umat/print/tests b/modules/solid_mechanics/test/tests/umat/print/tests index c48aa48a795b..05950a09fe8e 100644 --- a/modules/solid_mechanics/test/tests/umat/print/tests +++ b/modules/solid_mechanics/test/tests/umat/print/tests @@ -75,10 +75,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 +125,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' From 43aca9d6da13dfe72b96def221ff694f6e572bac Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Tue, 9 May 2023 09:19:54 -0600 Subject: [PATCH 10/13] add Abaqus reference input files --- .../orient_umat/reference/shear_top_umat.inp | 52 +++++++++++++++++ .../shear_top_umat_rotate_z_30_degrees.inp | 56 +++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp create mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp b/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp new file mode 100644 index 000000000000..ca234389e792 --- /dev/null +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp @@ -0,0 +1,52 @@ +** 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 +*SOLID SECTION, ELSET=EALL, MATERIAL=UMAT +, +** 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 at rate of 1/1000 +** 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 +*END STEP diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp b/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp new file mode 100644 index 000000000000..2d1336c49d06 --- /dev/null +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp @@ -0,0 +1,56 @@ +** Reference Abaqus input for "hw_rotated_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 +** Location of x,y basis vectors after undergoing 30 CCW 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 +, +** 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 at rate of 1/1000 +** 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 +*END STEP From 7a1bfebdf258dd820bd0633db91bf0decd14a8a4 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Tue, 5 Dec 2023 13:56:38 -0700 Subject: [PATCH 11/13] UMAT tests need to be run in-tree --- modules/solid_mechanics/test/tests/umat/print/tests | 1 + .../tensor_mechanics/test/tests/umat/orient_umat/tests | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/modules/solid_mechanics/test/tests/umat/print/tests b/modules/solid_mechanics/test/tests/umat/print/tests index 05950a09fe8e..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' diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests index 798c95912341..ccd814a014c0 100644 --- a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests +++ b/modules/tensor_mechanics/test/tests/umat/orient_umat/tests @@ -7,6 +7,8 @@ library_mode = 'DYNAMIC' valgrind = 'NONE' cli_args = 'GlobalParams/decomposition_method=HughesWinget' + # skip test if test is being run out-of-tree. Issue Ref: #25279 + installation_type = in_tree [] [hw_reference_umat_output] type = 'RunApp' @@ -18,6 +20,8 @@ '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' + # 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 @@ -29,6 +33,7 @@ library_mode = 'DYNAMIC' valgrind = 'NONE' cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/orientation="-30 0 0"' + installation_type = in_tree [] # but the stress computed in the intermediate reference frame should be different # values match Abaqus @@ -42,6 +47,7 @@ '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' + 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 @@ -52,5 +58,7 @@ library_mode = 'DYNAMIC' valgrind = 'NONE' cli_args = '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 [] [] From 5f75cb40505ceccc363939a1dd336742602cd259 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Tue, 20 Aug 2024 13:19:27 -0600 Subject: [PATCH 12/13] get UMAT orientation tests working with new solid_mechanics module --- .../umat/orient_umat/gold/shear_top_umat_out.e | Bin .../orient_umat/gold/shear_top_umat_rashid_out.e | Bin .../test/tests/umat/orient_umat/shear_top_umat.i | 2 +- .../test/tests/umat/orient_umat/tests | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename modules/{tensor_mechanics => solid_mechanics}/test/tests/umat/orient_umat/gold/shear_top_umat_out.e (100%) rename modules/{tensor_mechanics => solid_mechanics}/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e (100%) rename modules/{tensor_mechanics => solid_mechanics}/test/tests/umat/orient_umat/shear_top_umat.i (97%) rename modules/{tensor_mechanics => solid_mechanics}/test/tests/umat/orient_umat/tests (100%) diff --git a/modules/tensor_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 similarity index 100% rename from modules/tensor_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e rename to modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_out.e diff --git a/modules/tensor_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 similarity index 100% rename from modules/tensor_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e rename to modules/solid_mechanics/test/tests/umat/orient_umat/gold/shear_top_umat_rashid_out.e diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i b/modules/solid_mechanics/test/tests/umat/orient_umat/shear_top_umat.i similarity index 97% rename from modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i rename to modules/solid_mechanics/test/tests/umat/orient_umat/shear_top_umat.i index ae1eebe572de..f08966453e09 100644 --- a/modules/tensor_mechanics/test/tests/umat/orient_umat/shear_top_umat.i +++ b/modules/solid_mechanics/test/tests/umat/orient_umat/shear_top_umat.i @@ -23,7 +23,7 @@ [] [] -[Modules/TensorMechanics/Master] +[Physics/SolidMechanics/QuasiStatic] [all] add_variables = true strain = FINITE diff --git a/modules/tensor_mechanics/test/tests/umat/orient_umat/tests b/modules/solid_mechanics/test/tests/umat/orient_umat/tests similarity index 100% rename from modules/tensor_mechanics/test/tests/umat/orient_umat/tests rename to modules/solid_mechanics/test/tests/umat/orient_umat/tests From aae27abc4699e800fabf759e63f89ba0118c94e3 Mon Sep 17 00:00:00 2001 From: Jesse Carter Date: Tue, 20 Aug 2024 13:45:16 -0600 Subject: [PATCH 13/13] add extra UMAT orientation tests for case where zero rotation is applied but stress calculated in intermediate frame --- .../orient_umat/reference/shear_top_umat.inp | 25 +++++++- .../tests/umat/orient_umat/shear_top_umat.i | 1 + .../test/tests/umat/orient_umat/tests | 61 ++++++++++++++++--- .../shear_top_umat_rotate_z_30_degrees.inp | 56 ----------------- 4 files changed, 77 insertions(+), 66 deletions(-) rename modules/{tensor_mechanics => solid_mechanics}/test/tests/umat/orient_umat/reference/shear_top_umat.inp (58%) delete mode 100644 modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp diff --git a/modules/tensor_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 similarity index 58% rename from modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp rename to modules/solid_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat.inp index ca234389e792..543da56e4640 100644 --- a/modules/tensor_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 @@ -23,8 +23,25 @@ *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 -*SOLID SECTION, ELSET=EALL, MATERIAL=UMAT +** +** 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 @@ -38,8 +55,7 @@ BOTTOM, 1, 3, 0.0 *MATERIAL, NAME=UMAT *USER MATERIAL, CONSTANTS=2 1000.0, 0.3 -** Shear top face in +x direction at rate of 1/1000 -** over 5 seconds +** 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 @@ -49,4 +65,7 @@ TOP, 1, 1, 0.005 *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 index f08966453e09..22b25aa19aed 100644 --- 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 @@ -1,5 +1,6 @@ [GlobalParams] displacements = 'disp_x disp_y disp_z' + decomposition_method = HughesWinget [] [Mesh] diff --git a/modules/solid_mechanics/test/tests/umat/orient_umat/tests b/modules/solid_mechanics/test/tests/umat/orient_umat/tests index ccd814a014c0..faf801587cc7 100644 --- a/modules/solid_mechanics/test/tests/umat/orient_umat/tests +++ b/modules/solid_mechanics/test/tests/umat/orient_umat/tests @@ -6,7 +6,6 @@ exodiff = 'shear_top_umat_out.e' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'GlobalParams/decomposition_method=HughesWinget' # skip test if test is being run out-of-tree. Issue Ref: #25279 installation_type = in_tree [] @@ -15,16 +14,21 @@ input = 'shear_top_umat.i' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'GlobalParams/decomposition_method=HughesWinget' + # 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 + # rotated isotropic material module should give the same material (Cauchy) stress as above [hw_rotated] type = 'Exodiff' input = 'shear_top_umat.i' @@ -32,21 +36,64 @@ prereq = 'hw_reference' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/orientation="-30 0 0"' + 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 match Abaqus + # 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 = 'GlobalParams/decomposition_method=HughesWinget Materials/umat/orientation="-30 0 0"' + 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 [] @@ -57,7 +104,7 @@ exodiff = 'shear_top_umat_rashid_out.e' library_mode = 'DYNAMIC' valgrind = 'NONE' - cli_args = 'Materials/umat/orientation="-30 0 0" Outputs/file_base=shear_top_umat_rashid_out' + 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/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp b/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp deleted file mode 100644 index 2d1336c49d06..000000000000 --- a/modules/tensor_mechanics/test/tests/umat/orient_umat/reference/shear_top_umat_rotate_z_30_degrees.inp +++ /dev/null @@ -1,56 +0,0 @@ -** Reference Abaqus input for "hw_rotated_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 -** Location of x,y basis vectors after undergoing 30 CCW 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 -, -** 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 at rate of 1/1000 -** 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 -*END STEP