From 8f7a624b82bfd88b2c755ffd6b74e4ab726f2b9a Mon Sep 17 00:00:00 2001 From: Wenqing Wang Date: Fri, 27 Sep 2024 12:01:52 +0200 Subject: [PATCH 1/3] [RM] Enable to input initial stress with total stress --- .../CreateRichardsMechanicsProcess.cpp | 10 +++--- .../LocalAssemblerInterface.h | 4 +-- .../RichardsMechanicsFEM-impl.h | 36 +++++++++++++++++++ .../RichardsMechanics/RichardsMechanicsFEM.h | 13 ++++--- .../RichardsMechanicsProcessData.h | 5 ++- 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp index bc3247f59dc..e41f4ca124d 100644 --- a/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp +++ b/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp @@ -19,6 +19,7 @@ #include "MaterialLib/SolidModels/MechanicsBase.h" #include "NumLib/CreateNewtonRaphsonSolverParameters.h" #include "ParameterLib/Utils.h" +#include "ProcessLib/Common/HydroMechanics/CreateInitialStress.h" #include "ProcessLib/Output/CreateSecondaryVariables.h" #include "ProcessLib/Utils/ProcessUtils.h" #include "RichardsMechanicsProcess.h" @@ -166,12 +167,9 @@ std::unique_ptr createRichardsMechanicsProcess( DBUG("Media properties verified."); // Initial stress conditions - auto const initial_stress = ParameterLib::findOptionalTagParameter( - //! \ogs_file_param_special{prj__processes__process__RICHARDS_MECHANICS__initial_stress} - config, "initial_stress", parameters, - // Symmetric tensor size, 4 or 6, not a Kelvin vector. - MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim), - &mesh); + auto const initial_stress = + ProcessLib::createInitialStress(config, parameters, + mesh); std::optional micro_porosity_parameters; if (auto const micro_porosity_config = diff --git a/ProcessLib/RichardsMechanics/LocalAssemblerInterface.h b/ProcessLib/RichardsMechanics/LocalAssemblerInterface.h index fd8d870dafe..a5d6b6b2d17 100644 --- a/ProcessLib/RichardsMechanics/LocalAssemblerInterface.h +++ b/ProcessLib/RichardsMechanics/LocalAssemblerInterface.h @@ -76,13 +76,13 @@ struct LocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface, element_.getID()); } - if (name == "sigma" && process_data_.initial_stress != nullptr) + if (name == "sigma" && process_data_.initial_stress.value != nullptr) { OGS_FATAL( "Setting initial conditions for stress from integration " "point data and from a parameter '{:s}' is not possible " "simultaneously.", - process_data_.initial_stress->name); + process_data_.initial_stress.value->name); } if (name.starts_with("material_state_variable_")) diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h index 84be48989be..bf2798ca7b0 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h @@ -219,6 +219,10 @@ void RichardsMechanicsLocalAssemblerphase("Solid"); + auto const& identity2 = MathLib::KelvinVector::Invariants< + MathLib::KelvinVector::kelvin_vector_dimensions( + DisplacementDim)>::identity2; + unsigned const n_integration_points = this->integration_method_.getNumberOfPoints(); for (unsigned ip = 0; ip < n_integration_points; ip++) @@ -257,6 +261,38 @@ void RichardsMechanicsLocalAssemblerproperty(MPL::PropertyType::saturation) .template value(variables, x_position, t, dt); + if (this->process_data_.initial_stress.isTotalStress()) + { + auto const alpha_b = + medium->property(MPL::PropertyType::biot_coefficient) + .template value(variables, x_position, t, dt); + + variables.liquid_saturation = S_L_prev; + double const chi_S_L = + medium->property(MPL::PropertyType::bishops_effective_stress) + .template value(variables, x_position, t, dt); + + // Initial stresses are total stress, which were assigned to + // sigma_eff in + // RichardsMechanicsLocalAssembler::initializeConcrete(). + auto& sigma_eff = + std::get>( + this->current_states_[ip]); + + auto& sigma_eff_prev = std::get< + PrevState>>( + this->prev_states_[ip]); + + // Reset sigma_eff to effective stress + sigma_eff.sigma_eff.noalias() += + chi_S_L * alpha_b * (-p_cap_ip) * identity2; + sigma_eff_prev->sigma_eff = sigma_eff.sigma_eff; + } + if (medium->hasProperty(MPL::PropertyType::saturation_micro)) { MPL::VariableArray vars; diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h index 4cec7a14c8e..559c902bfc9 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h @@ -131,17 +131,20 @@ class RichardsMechanicsLocalAssembler ip_data.N_u))}; /// Set initial stress from parameter. - if (this->process_data_.initial_stress != nullptr) + if (this->process_data_.initial_stress.value) { std::get>(SD) .sigma_eff = MathLib::KelvinVector::symmetricTensorToKelvinVector< - DisplacementDim>((*this->process_data_.initial_stress)( - std::numeric_limits< - double>::quiet_NaN() /* time independent */, - x_position)); + DisplacementDim>( + // The data in process_data_.initial_stress.value can + // be total stress or effective stress. + (*this->process_data_.initial_stress.value)( + std::numeric_limits< + double>::quiet_NaN() /* time independent */, + x_position)); } double const t = 0; // TODO (naumov) pass t from top diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h index 5ad61ae913f..d237ed6c01c 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h @@ -17,6 +17,7 @@ #include "ComputeMicroPorosity.h" #include "MaterialLib/MPL/MaterialSpatialDistributionMap.h" #include "ParameterLib/Parameter.h" +#include "ProcessLib/Common/HydroMechanics/InitialStress.h" namespace MaterialLib { @@ -42,9 +43,7 @@ struct RichardsMechanicsProcessData MaterialLib::Solids::MechanicsBase>> solid_materials; - /// Optional, initial stress field. A symmetric tensor, short vector - /// representation of length 4 or 6, ParameterLib::Parameter. - ParameterLib::Parameter const* const initial_stress; + InitialStress const initial_stress; /// Specific body forces applied to solid and fluid. /// It is usually used to apply gravitational forces. From 8690d4a0d069029f5ed16db5a425543cbe3f8b89 Mon Sep 17 00:00:00 2001 From: Wenqing Wang Date: Fri, 27 Sep 2024 14:04:59 +0200 Subject: [PATCH 2/3] [CTest/RM] A test using `` --- ProcessLib/RichardsMechanics/Tests.cmake | 35 +++++++++++++++++++ .../RichardsMechanics/A2_total_stress0.xml | 19 ++++++++++ 2 files changed, 54 insertions(+) create mode 100644 Tests/Data/RichardsMechanics/A2_total_stress0.xml diff --git a/ProcessLib/RichardsMechanics/Tests.cmake b/ProcessLib/RichardsMechanics/Tests.cmake index d3265fb638c..ec3e1d4f7dd 100644 --- a/ProcessLib/RichardsMechanics/Tests.cmake +++ b/ProcessLib/RichardsMechanics/Tests.cmake @@ -68,3 +68,38 @@ AddTest( confined_compression_fully_saturated_ts_120_t_1000.000000.vtu confined_compression_fully_saturated_restart_ts_100_t_1000.000000.vtu velocity velocity 1e-16 0 confined_compression_fully_saturated_ts_420_t_4000.000000.vtu confined_compression_fully_saturated_restart_ts_400_t_4000.000000.vtu velocity velocity 1e-16 0 ) + +AddTest( + NAME RichardsMechanics_A2_total_initial_stress + PATH RichardsMechanics + EXECUTABLE ogs + RUNTIME 15 + EXECUTABLE_ARGS A2_total_stress0.xml + WRAPPER time + TESTER vtkdiff + REQUIREMENTS NOT OGS_USE_MPI + DIFF_DATA + A2_ts_3_t_4320.000000.vtu A2_total_stess0_test_ts_3_t_4320.000000.vtu displacement displacement 1e-16 0 + A2_ts_42_t_20736.000000.vtu A2_total_stess0_test_ts_42_t_20736.000000.vtu displacement displacement 1e-16 0 + A2_ts_76_t_2764800.000000.vtu A2_total_stess0_test_ts_76_t_2764800.000000.vtu displacement displacement 1e-16 0 + + A2_ts_3_t_4320.000000.vtu A2_total_stess0_test_ts_3_t_4320.000000.vtu pressure pressure 1e-16 1e-12 + A2_ts_42_t_20736.000000.vtu A2_total_stess0_test_ts_42_t_20736.000000.vtu pressure pressure 1e-16 1e-12 + A2_ts_76_t_2764800.000000.vtu A2_total_stess0_test_ts_76_t_2764800.000000.vtu pressure pressure 1e-16 1e-12 + + A2_ts_3_t_4320.000000.vtu A2_total_stess0_test_ts_3_t_4320.000000.vtu sigma sigma 5e-8 0 + A2_ts_42_t_20736.000000.vtu A2_total_stess0_test_ts_42_t_20736.000000.vtu sigma sigma 5e-8 0 + A2_ts_76_t_2764800.000000.vtu A2_total_stess0_test_ts_76_t_2764800.000000.vtu sigma sigma 5e-8 0 + + A2_ts_3_t_4320.000000.vtu A2_total_stess0_test_ts_3_t_4320.000000.vtu epsilon epsilon 5e-14 0 + A2_ts_42_t_20736.000000.vtu A2_total_stess0_test_ts_42_t_20736.000000.vtu epsilon epsilon 5e-14 0 + A2_ts_76_t_2764800.000000.vtu A2_total_stess0_test_ts_76_t_2764800.000000.vtu epsilon epsilon 5e-14 0 + + A2_ts_3_t_4320.000000.vtu A2_total_stess0_test_ts_3_t_4320.000000.vtu saturation saturation 4e-15 0 + A2_ts_42_t_20736.000000.vtu A2_total_stess0_test_ts_42_t_20736.000000.vtu saturation saturation 4e-15 0 + A2_ts_76_t_2764800.000000.vtu A2_total_stess0_test_ts_76_t_2764800.000000.vtu saturation saturation 4e-15 0 + + A2_ts_3_t_4320.000000.vtu A2_total_stess0_test_ts_3_t_4320.000000.vtu velocity velocity 1e-16 0 + A2_ts_42_t_20736.000000.vtu A2_total_stess0_test_ts_42_t_20736.000000.vtu velocity velocity 1e-16 0 + A2_ts_76_t_2764800.000000.vtu A2_total_stess0_test_ts_76_t_2764800.000000.vtu velocity velocity 1e-16 0 +) diff --git a/Tests/Data/RichardsMechanics/A2_total_stress0.xml b/Tests/Data/RichardsMechanics/A2_total_stress0.xml new file mode 100644 index 00000000000..e6dd3912663 --- /dev/null +++ b/Tests/Data/RichardsMechanics/A2_total_stress0.xml @@ -0,0 +1,19 @@ + + + + + total_stress0 + + + + total_stress0 + Constant + -10e6 -10e6 -12e6 0.0 0.0 0.0 + + + + A2_total_stess0_test + + + + From 12044ab1c17de8faee5bc64340f9c676bb152f0c Mon Sep 17 00:00:00 2001 From: Wenqing Wang Date: Fri, 27 Sep 2024 14:10:04 +0200 Subject: [PATCH 3/3] [Doc/RM] Update the parameter documentation of initial_stress --- .../prj/processes/process/RICHARDS_MECHANICS/initial_stress | 1 + .../prj/processes/process/RICHARDS_MECHANICS/t_initial_stress.md | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 120000 Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/initial_stress delete mode 100644 Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/t_initial_stress.md diff --git a/Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/initial_stress b/Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/initial_stress new file mode 120000 index 00000000000..0baefb22449 --- /dev/null +++ b/Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/initial_stress @@ -0,0 +1 @@ +../initial_stress \ No newline at end of file diff --git a/Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/t_initial_stress.md b/Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/t_initial_stress.md deleted file mode 100644 index 676cbf51391..00000000000 --- a/Documentation/ProjectFile/prj/processes/process/RICHARDS_MECHANICS/t_initial_stress.md +++ /dev/null @@ -1 +0,0 @@ -\copydoc ProcessLib::RichardsMechanics::RichardsMechanicsProcessData::initial_stress