diff --git a/Documentation/ProjectFile/prj/processes/process/THERMO_HYDRO_MECHANICS/t_initial_stress.md b/Documentation/ProjectFile/prj/processes/process/THERMO_HYDRO_MECHANICS/t_initial_stress.md new file mode 100644 index 0000000000000000000000000000000000000000..8703e9b220259c7c4a8fcf871f44f496d06ae4e1 --- /dev/null +++ b/Documentation/ProjectFile/prj/processes/process/THERMO_HYDRO_MECHANICS/t_initial_stress.md @@ -0,0 +1 @@ +\copydoc ProcessLib::ThermoHydroMechanics::ThermoHydroMechanicsProcessData::initial_stress diff --git a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp index 918f079d7304b37fb9811a7336ca5e46c565fbb8..f445ed535545092259584df8bf161d356a2dae48 100644 --- a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp +++ b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp @@ -158,10 +158,19 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess( auto media_map = MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh); + // Initial stress conditions + auto const initial_stress = ParameterLib::findOptionalTagParameter<double>( + //! \ogs_file_param_special{prj__processes__process__THERMO_HYDRO_MECHANICS__initial_stress} + config, "initial_stress", parameters, + // Symmetric tensor size, 4 or 6, not a Kelvin vector. + MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim), + &mesh); + ThermoHydroMechanicsProcessData<DisplacementDim> process_data{ materialIDs(mesh), std::move(media_map), std::move(solid_constitutive_relations), + initial_stress, reference_temperature, specific_body_force}; diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h index fe534aa867b15513e4865303698e6707415e6473..cc5bf02afb09428b60666a6945746405aab4d933 100644 --- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h +++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h @@ -107,7 +107,27 @@ public: for (unsigned ip = 0; ip < n_integration_points; ip++) { - _ip_data[ip].pushBackState(); + auto& ip_data = _ip_data[ip]; + + /// Set initial stress from parameter. + if (_process_data.initial_stress != nullptr) + { + ParameterLib::SpatialPosition const x_position{ + std::nullopt, _element.getID(), ip, + MathLib::Point3d(NumLib::interpolateCoordinates< + ShapeFunctionDisplacement, + ShapeMatricesTypeDisplacement>( + _element, ip_data.N_u))}; + + ip_data.sigma_eff = + MathLib::KelvinVector::symmetricTensorToKelvinVector< + DisplacementDim>((*_process_data.initial_stress)( + std::numeric_limits< + double>::quiet_NaN() /* time independent */, + x_position)); + } + + ip_data.pushBackState(); } } diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h index f749490bbac9195cf8e02afd8f1d7894e7976710..318a299339fdf9252bfd087fcd010065c0cb8a2e 100644 --- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h +++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h @@ -45,6 +45,11 @@ struct ThermoHydroMechanicsProcessData int, std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>> solid_materials; + + /// Optional, initial stress field. A symmetric tensor, short vector + /// representation of length 4 or 6, ParameterLib::Parameter<double>. + ParameterLib::Parameter<double> const* const initial_stress; + ParameterLib::Parameter<double> const& reference_temperature; /// Specific body forces applied to solid and fluid. /// It is usually used to apply gravitational forces.