From 6f732c332ef6ad8b33980c033d6f25f8749a3641 Mon Sep 17 00:00:00 2001
From: tnagel <nagelt@tcd.ie>
Date: Fri, 3 Apr 2020 19:42:07 +0200
Subject: [PATCH] Added reduced version of Lubby2 and corresponding test.

---
 MaterialLib/SolidModels/MFront/CMakeLists.txt |   3 +-
 .../SolidModels/MFront/Lubby2mod.mfront       |  80 ++++++
 ProcessLib/SmallDeformation/Tests.cmake       |   3 +-
 .../Mechanics/Burgers/cube_1e0_mfront_mod.prj | 251 ++++++++++++++++++
 ...1e0_mfront_mod_pcs_0_ts_101_t_1.000000.vtu |   3 +
 ...e_1e0_mfront_mod_pcs_0_ts_1_t_0.000100.vtu |   3 +
 6 files changed, 341 insertions(+), 2 deletions(-)
 create mode 100644 MaterialLib/SolidModels/MFront/Lubby2mod.mfront
 create mode 100644 Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod.prj
 create mode 100644 Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_101_t_1.000000.vtu
 create mode 100644 Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_1_t_0.000100.vtu

diff --git a/MaterialLib/SolidModels/MFront/CMakeLists.txt b/MaterialLib/SolidModels/MFront/CMakeLists.txt
index a765275d31d..d1e05c8f850 100644
--- a/MaterialLib/SolidModels/MFront/CMakeLists.txt
+++ b/MaterialLib/SolidModels/MFront/CMakeLists.txt
@@ -19,7 +19,8 @@ mfront_behaviours_check_library(OgsMFrontBehaviour
                                 MohrCoulombAbboSloanOrtho
                                 StandardElasticityBrick
                                 StandardElasticityBrickOrtho
-                                Lubby2)
+                                Lubby2
+                                Lubby2mod)
 
 target_include_directories(MaterialLib_SolidModels_MFront
                            PUBLIC ThirdParty/MGIS/include)
diff --git a/MaterialLib/SolidModels/MFront/Lubby2mod.mfront b/MaterialLib/SolidModels/MFront/Lubby2mod.mfront
new file mode 100644
index 00000000000..7e14479a0b3
--- /dev/null
+++ b/MaterialLib/SolidModels/MFront/Lubby2mod.mfront
@@ -0,0 +1,80 @@
+
+@DSL Implicit;
+@Behaviour Lubby2mod;
+@Author Thomas Nagel, Thomas Helfer;
+@Description {Lubby2 model for stationary
+and transient creep based on Burgers
+rheological model.
+Reduced implementation.
+};
+
+@Algorithm NewtonRaphson;
+@MaximumNumberOfIterations 100;
+
+@Epsilon 1.e-14;
+@Theta 1.0;
+
+@ModellingHypotheses{".+"};
+@Brick StandardElasticity;
+@RequireStiffnessTensor<UnAltered>;
+
+// Intercept of yield function
+@MaterialProperty real GK0;
+GK0.setEntryName("KelvinShearModulus");
+@MaterialProperty real etaK0;
+etaK0.setEntryName("KelvinViscosity");
+@MaterialProperty real etaM0;
+etaM0.setEntryName("MaxwellViscosity");
+@MaterialProperty real mK;
+mK.setEntryName("KelvinElasticParameter");
+@MaterialProperty real mvK;
+mvK.setEntryName("KelvinViscoParameter");
+@MaterialProperty real mvM;
+mvM.setEntryName("MaxwellViscoParameter");
+
+@AuxiliaryStateVariable Stensor epsK;
+epsK.setEntryName("KelvinStrain");
+
+//! increment of the Kelvin strain
+@LocalVariable Stensor depsK;
+//! increment of the Maxwell strain
+@LocalVariable Stensor depsM;
+
+@Integrator {
+
+  const auto seq = sigmaeq(sig);
+  const auto iseq = 1. / std::max(seq, 1.e-14 * D(0, 0));
+  const auto s = deviator(sig);
+  constexpr auto Pdev = Stensor4::K();
+
+  const auto etaK = etaK0 * std::exp(mvK * seq);
+  const auto etaM = etaM0 * std::exp(mvM * seq);
+  const auto GK = GK0 * std::exp(mK * seq);
+
+  // calculate Kelvin strain residual
+  const auto etaK_impl = etaK + dt * GK * theta;
+  depsK = dt / (2. * etaK_impl) * (s - 2 * GK * epsK);
+
+  // calculate Maxwell strain residual
+  depsM = dt / (2 * etaM) * s;
+
+  // residuals
+  feel += depsM + depsK;
+
+  // Jacobian
+  const auto dseq_ddeel = 3. * iseq / 2. * s | (Pdev * D);
+  const auto detaK_ddeel = etaK * mvK * dseq_ddeel;
+  const auto detaM_ddeel = etaM * mvM * dseq_ddeel;
+  const auto dGK_ddeel = GK * mK * dseq_ddeel;
+  //
+  dfeel_ddeel +=
+      -(dt / (2 * etaK_impl * etaK_impl) * (s - 2 * GK * epsK) ^ detaK_ddeel) +
+      (dt / (2 * etaK_impl) * Pdev * D) - dt / etaK_impl * (epsK ^ dGK_ddeel) -
+      dt / (2 * etaK_impl * etaK_impl) * dt * theta *
+          ((s - 2 * GK * epsK) ^ dGK_ddeel) -
+      (dt / (2 * etaM * etaM) * s ^ detaM_ddeel) + (dt / (2 * etaM) * Pdev * D);
+}
+
+@UpdateAuxiliaryStateVariables {
+  epsK += depsK;
+} // end of @UpdateAuxiliaryStateVariables
diff --git a/ProcessLib/SmallDeformation/Tests.cmake b/ProcessLib/SmallDeformation/Tests.cmake
index 08aad5375cc..a804d38feb6 100644
--- a/ProcessLib/SmallDeformation/Tests.cmake
+++ b/ProcessLib/SmallDeformation/Tests.cmake
@@ -61,6 +61,7 @@ if (OGS_USE_MFRONT)
     OgsTest(PROJECTFILE Mechanics/Linear/MFront/square_1e0_orthotropic_45xy_z.prj)
     OgsTest(PROJECTFILE Mechanics/Linear/MFront/square_1e0_orthotropic_y-xz.prj)
     OgsTest(PROJECTFILE Mechanics/Burgers/cube_1e0_mfront.prj)
+    OgsTest(PROJECTFILE Mechanics/Burgers/cube_1e0_mfront_mod.prj)
 # Linear elastic, no internal state variables, no external state variables.
 AddTest(
     NAME Mechanics_SDL_disc_with_hole_mfront
@@ -225,4 +226,4 @@ AddTest(
     DIFF_DATA
     output_pcs_0_ts_1_t_1.000000.vtu output_pcs_0_ts_1_t_1.000000.vtu displacement displacement 0 1e-12
     output_pcs_0_ts_1_t_1.000000.vtu output_pcs_0_ts_1_t_1.000000.vtu principal_stress_values principal_stress_values 0 1e-10
-)
\ No newline at end of file
+)
diff --git a/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod.prj b/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod.prj
new file mode 100644
index 00000000000..5f996310863
--- /dev/null
+++ b/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod.prj
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<OpenGeoSysProject>
+    <mesh>cube_1x1x1_hex_1e0.vtu</mesh>
+    <geometry>cube_1x1x1.gml</geometry>
+    <processes>
+        <process>
+            <name>SD</name>
+            <type>SMALL_DEFORMATION</type>
+            <integration_order>2</integration_order>
+            <constitutive_relation>
+                <type>MFront</type>
+                <behaviour>Lubby2mod</behaviour>
+                <material_properties>
+                    <material_property name="YoungModulus" parameter="YoungModulus"/>
+                    <material_property name="PoissonRatio" parameter="PoissonRatio"/>
+                    <material_property name="KelvinShearModulus" parameter="GK0"/>
+                    <material_property name="KelvinViscosity" parameter="etaK0"/>
+                    <material_property name="MaxwellViscosity" parameter="etaM0"/>
+                    <material_property name="KelvinElasticParameter" parameter="mK"/>
+                    <material_property name="MaxwellViscoParameter" parameter="mvM"/>
+                    <material_property name="KelvinViscoParameter" parameter="mvK"/>
+                </material_properties>
+            </constitutive_relation>
+            <solid_density>rho_sr</solid_density>
+            <specific_body_force>0 0 0</specific_body_force>
+            <process_variables>
+                <process_variable>displacement</process_variable>
+            </process_variables>
+            <secondary_variables>
+                <secondary_variable internal_name="sigma" output_name="sigma"/>
+            </secondary_variables>
+        </process>
+    </processes>
+    <time_loop>
+        <processes>
+            <process ref="SD">
+                <nonlinear_solver>basic_newton</nonlinear_solver>
+                <convergence_criterion>
+                    <type>DeltaX</type>
+                    <norm_type>NORM2</norm_type>
+                    <abstol>1e-15</abstol>
+                </convergence_criterion>
+                <time_discretization>
+                    <type>BackwardEuler</type>
+                </time_discretization>
+                <time_stepping>
+                    <type>FixedTimeStepping</type>
+                    <t_initial>0</t_initial>
+                    <t_end>1</t_end>
+                    <timesteps>
+                        <pair>
+                            <repeat>1</repeat>
+                            <delta_t>0.0001</delta_t>
+                        </pair>
+                        <pair>
+                            <repeat>100</repeat>
+                            <delta_t>0.01</delta_t>
+                        </pair>
+                    </timesteps>
+                </time_stepping>
+            </process>
+        </processes>
+        <output>
+            <type>VTK</type>
+            <prefix>cube_1e0_mfront_mod</prefix>
+            <timesteps>
+                <pair>
+                    <repeat>1</repeat>
+                    <each_steps>1</each_steps>
+                </pair>
+                <pair>
+                    <repeat>1</repeat>
+                    <each_steps>10000000</each_steps>
+                </pair>
+            </timesteps>
+            <variables>
+                <variable>displacement</variable>
+                <variable>sigma</variable>
+            </variables>
+        </output>
+    </time_loop>
+    <parameters>
+        <parameter>
+            <name>GK0</name>
+            <type>Constant</type>
+            <value>0.8</value>
+        </parameter>
+        <parameter>
+            <name>etaK0</name>
+            <type>Constant</type>
+            <value>0.5</value>
+        </parameter>
+        <parameter>
+            <name>YoungModulus</name>
+            <type>Constant</type>
+            <value>1.8</value>
+        </parameter>
+        <parameter>
+            <name>PoissonRatio</name>
+            <type>Constant</type>
+            <value>0.125</value>
+        </parameter>
+        <parameter>
+            <name>etaM0</name>
+            <type>Constant</type>
+            <value>0.5</value>
+        </parameter>
+        <parameter>
+            <name>mK</name>
+            <type>Constant</type>
+            <value>-0.2</value>
+        </parameter>
+        <parameter>
+            <name>mvK</name>
+            <type>Constant</type>
+            <value>-0.2</value>
+        </parameter>
+        <parameter>
+            <name>mvM</name>
+            <type>Constant</type>
+            <value>-0.3</value>
+        </parameter>
+        <parameter>
+            <name>rho_sr</name>
+            <type>Constant</type>
+            <value>1</value>
+        </parameter>
+        <parameter>
+            <name>displacement0</name>
+            <type>Constant</type>
+            <values>0 0 0</values>
+        </parameter>
+        <parameter>
+            <name>neumann_force</name>
+            <type>Constant</type>
+            <values>0.01</values>
+        </parameter>
+        <parameter>
+            <name>dirichlet0</name>
+            <type>Constant</type>
+            <value>0</value>
+        </parameter>
+    </parameters>
+    <process_variables>
+        <process_variable>
+            <name>displacement</name>
+            <components>3</components>
+            <order>1</order>
+            <initial_condition>displacement0</initial_condition>
+            <boundary_conditions>
+                <!-- fixed boundaries -->
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>left</geometry>
+                    <type>Dirichlet</type>
+                    <component>1</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>back</geometry>
+                    <type>Dirichlet</type>
+                    <component>1</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>front</geometry>
+                    <type>Dirichlet</type>
+                    <component>0</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>front</geometry>
+                    <type>Dirichlet</type>
+                    <component>1</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>right</geometry>
+                    <type>Dirichlet</type>
+                    <component>1</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+                <!-- force -->
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>back</geometry>
+                    <type>Neumann</type>
+                    <component>0</component>
+                    <parameter>neumann_force</parameter>
+                </boundary_condition>
+                <!-- fix front for the 3d case -->
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>top</geometry>
+                    <type>Dirichlet</type>
+                    <component>2</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+                <boundary_condition>
+                    <geometrical_set>cube_1x1x1_geometry</geometrical_set>
+                    <geometry>bottom</geometry>
+                    <type>Dirichlet</type>
+                    <component>2</component>
+                    <parameter>dirichlet0</parameter>
+                </boundary_condition>
+            </boundary_conditions>
+        </process_variable>
+    </process_variables>
+    <nonlinear_solvers>
+        <nonlinear_solver>
+            <name>basic_newton</name>
+            <type>Newton</type>
+            <max_iter>4</max_iter>
+            <linear_solver>general_linear_solver</linear_solver>
+        </nonlinear_solver>
+    </nonlinear_solvers>
+    <linear_solvers>
+        <linear_solver>
+            <name>general_linear_solver</name>
+            <lis>-i cg -p jacobi -tol 1e-16 -maxiter 10000</lis>
+            <eigen>
+                <solver_type>CG</solver_type>
+                <precon_type>DIAGONAL</precon_type>
+                <max_iteration_step>10000</max_iteration_step>
+                <error_tolerance>1e-16</error_tolerance>
+            </eigen>
+            <petsc>
+                <prefix>sd</prefix>
+                <parameters>-sd_ksp_type cg -sd_pc_type bjacobi -sd_ksp_rtol 1e-16 -sd_ksp_max_it 10000</parameters>
+            </petsc>
+        </linear_solver>
+    </linear_solvers>
+    <test_definition>
+        <vtkdiff>
+            <file>cube_1e0_mfront_mod_pcs_0_ts_1_t_0.000100.vtu</file>
+            <field>displacement</field>
+            <absolute_tolerance>5e-16</absolute_tolerance>
+            <relative_tolerance>1e-16</relative_tolerance>
+        </vtkdiff>
+        <vtkdiff>
+            <file>cube_1e0_mfront_mod_pcs_0_ts_101_t_1.000000.vtu</file>
+            <field>displacement</field>
+            <absolute_tolerance>5e-16</absolute_tolerance>
+            <relative_tolerance>1e-16</relative_tolerance>
+        </vtkdiff>
+    </test_definition>
+</OpenGeoSysProject>
diff --git a/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_101_t_1.000000.vtu b/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_101_t_1.000000.vtu
new file mode 100644
index 00000000000..e996fa3b051
--- /dev/null
+++ b/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_101_t_1.000000.vtu
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9dad753d851bbe651cd165f809eb49627553be68e13e5926e2ca012aadadabd3
+size 4958
diff --git a/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_1_t_0.000100.vtu b/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_1_t_0.000100.vtu
new file mode 100644
index 00000000000..aa613d73b42
--- /dev/null
+++ b/Tests/Data/Mechanics/Burgers/cube_1e0_mfront_mod_pcs_0_ts_1_t_0.000100.vtu
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b99e8ab5bcfebe29647ec52a0b198a4c0f02ef6e1d2d79ec99d82e4d7e15809
+size 4954
-- 
GitLab