diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp index 9e886b74c0edff80a73482d1e913308b993fcb09..b371823600452d1bf7e7fd2420b3a3a79e11f119 100644 --- a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp +++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp @@ -86,6 +86,12 @@ void ComponentTransportProcess::initializeConcreteProcess( &ComponentTransportLocalAssemblerInterface::getIntPtDarcyVelocity)); } +void ComponentTransportProcess::setInitialConditionsConcreteProcess( + std::vector<GlobalVector*>& /*x*/, double const /*t*/, + int const /*process_id*/) +{ +} + void ComponentTransportProcess::assembleConcreteProcess( const double t, double const dt, std::vector<GlobalVector*> const& x, std::vector<GlobalVector*> const& xdot, int const process_id, diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.h b/ProcessLib/ComponentTransport/ComponentTransportProcess.h index c5a86b770179a252f8806f063d6e9bc211d2c842..c13c5e8ab648c0aef8fee90378dc00a4dd7cd793 100644 --- a/ProcessLib/ComponentTransport/ComponentTransportProcess.h +++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.h @@ -142,6 +142,10 @@ private: MeshLib::Mesh const& mesh, unsigned const integration_order) override; + void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x, + double const t, + int const process_id) override; + void assembleConcreteProcess(const double t, double const dt, std::vector<GlobalVector*> const& x, std::vector<GlobalVector*> const& xdot, diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp index 1de73f250041b5514280d9724eecc94f1942f710..7d6ba4327b70d9156d117d902816ed0c2720a8ca 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp @@ -532,17 +532,22 @@ void HydroMechanicsProcess<DisplacementDim>::postNonLinearSolverConcreteProcess( } template <int DisplacementDim> -void HydroMechanicsProcess< - DisplacementDim>::setInitialConditionsConcreteProcess(GlobalVector const& x, - double const t, - int const process_id) +void HydroMechanicsProcess<DisplacementDim>:: + setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x, + double const t, + int const process_id) { + if (process_id != _process_data.hydraulic_process_id) + { + return; + } + DBUG("Set initial conditions of HydroMechanicsProcess."); ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerIF::setInitialConditions, _local_assemblers, - pv.getActiveElementIDs(), getDOFTable(process_id), x, t, + pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t, _use_monolithic_scheme, process_id); } diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h index 987e4e6cf8dd1d928a95c34f0593d04787b02c8d..313b77a7acfc72484ff3487723e765a37b90cc2b 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h @@ -99,7 +99,7 @@ private: const double t, double const dt, int const process_id) override; - void setInitialConditionsConcreteProcess(GlobalVector const& x, + void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x, double const t, int const process_id) override; diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp index 7ccc78408ed9035e91994565483a60f19c8a9f1f..4c14b21b6785f7cb684ccc8cc77263f26f2d183e 100644 --- a/ProcessLib/Process.cpp +++ b/ProcessLib/Process.cpp @@ -108,9 +108,15 @@ void Process::initialize() initializeBoundaryConditions(); } -void Process::setInitialConditions(const int process_id, double const t, - GlobalVector& x) +void Process::setInitialConditions( + std::vector<GlobalVector*>& process_solutions, + std::vector<GlobalVector*>& process_solutions_prev, + double const t, + int const process_id) { + auto& x = *process_solutions[process_id]; + auto& x_prev = *process_solutions_prev[process_id]; + // getDOFTableOfProcess can be overloaded by the specific process. auto const& dof_table_of_process = getDOFTable(process_id); @@ -163,7 +169,11 @@ void Process::setInitialConditions(const int process_id, double const t, } } } - setInitialConditionsConcreteProcess(x, t, process_id); + + MathLib::LinAlg::finalizeAssembly(x); + MathLib::LinAlg::copy(x, x_prev); // pushState + + setInitialConditionsConcreteProcess(process_solutions, t, process_id); } MathLib::MatrixSpecifications Process::getMatrixSpecifications( diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index 1b69f8c6f9ceeed0ef44ac40929f28cc67acb7ef..c01cf00daa59d94710ee74d8eb45e9dae55f4202 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -82,8 +82,11 @@ public: void initialize(); - void setInitialConditions(const int process_id, const double t, - GlobalVector& x); + void setInitialConditions( + std::vector<GlobalVector*>& process_solutions, + std::vector<GlobalVector*>& process_solutions_prev, + double const t, + int const process_id); MathLib::MatrixSpecifications getMatrixSpecifications( const int process_id) const override; @@ -206,9 +209,10 @@ private: /// processes. It is called by initialize(). virtual void initializeBoundaryConditions(); - virtual void setInitialConditionsConcreteProcess(GlobalVector const& /*x*/, - double const /*t*/, - int const /*process_id*/) + virtual void setInitialConditionsConcreteProcess( + std::vector<GlobalVector*>& /*x*/, + double const /*t*/, + int const /*process_id*/) { } diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp index 48900041ef3158d77f39cbd9f446f28c2cca862d..6a6e9debe41aac9dbba0ac6ce9322719523116a4 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp @@ -432,18 +432,23 @@ void RichardsMechanicsProcess<DisplacementDim>::initializeBoundaryConditions() } template <int DisplacementDim> -void RichardsMechanicsProcess< - DisplacementDim>::setInitialConditionsConcreteProcess(GlobalVector const& x, - double const t, - int const process_id) +void RichardsMechanicsProcess<DisplacementDim>:: + setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x, + double const t, + int const process_id) { + if (process_id != 0) + { + return; + } + DBUG("SetInitialConditions RichardsMechanicsProcess."); ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerIF::setInitialConditions, _local_assemblers, - pv.getActiveElementIDs(), getDOFTable(process_id), x, t, + pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t, _use_monolithic_scheme, process_id); } diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h index c5f598ecb9470629e3e4bde300ec03cec12071c4..5c4bf653ca79650211937c3715e7cd30faafd63d 100644 --- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h +++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h @@ -73,7 +73,7 @@ private: void initializeBoundaryConditions() override; - void setInitialConditionsConcreteProcess(GlobalVector const& x, + void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x, double const t, int const process_id) override; diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp index 37603ef24985dda5a787e0d3b49a660215960d19..b4e981105b8ee646164f80556f6ab198ebf7aa61 100644 --- a/ProcessLib/TimeLoop.cpp +++ b/ProcessLib/TimeLoop.cpp @@ -218,10 +218,7 @@ setInitialConditions( for (auto& process_data : per_process_data) { - auto& pcs = process_data->process; auto const process_id = process_data->process_id; - auto& time_disc = *process_data->time_disc; - auto& ode_sys = *process_data->tdisc_ode_sys; // append a solution vector of suitable size @@ -231,14 +228,17 @@ setInitialConditions( process_solutions_prev.emplace_back( &NumLib::GlobalVectorProvider::provider.getVector( ode_sys.getMatrixSpecifications(process_id))); + } - auto& x = *process_solutions[process_id]; - auto& x_prev = *process_solutions_prev[process_id]; - pcs.setInitialConditions(process_id, t0, x); - MathLib::LinAlg::finalizeAssembly(x); + for (auto& process_data : per_process_data) + { + auto& pcs = process_data->process; + auto const process_id = process_data->process_id; + pcs.setInitialConditions(process_solutions, process_solutions_prev, t0, + process_id); + auto& time_disc = *process_data->time_disc; time_disc.setInitialState(t0); // push IC - MathLib::LinAlg::copy(x, x_prev); // pushState } return {process_solutions, process_solutions_prev};