From 726ce877c2b941f9bf002001e8b85a5794ac1142 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Wed, 24 Apr 2024 17:31:45 +0200
Subject: [PATCH] [PL] Pass initial dt to first output computation

Some time-dependent material models are not running with the dt=1 (at
restart) and require "proper" time step sizes.
---
 ProcessLib/TimeLoop.cpp | 17 +++++++----------
 ProcessLib/TimeLoop.h   |  2 +-
 2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp
index fb97d6f59a6..2ce9cb19695 100644
--- a/ProcessLib/TimeLoop.cpp
+++ b/ProcessLib/TimeLoop.cpp
@@ -495,12 +495,6 @@ void TimeLoop::initialize()
 
     updateDeactivatedSubdomains(_per_process_data, _start_time);
 
-    // Output initial conditions
-    {
-        preOutputInitialConditions(_start_time);
-        outputSolutions(0, _start_time, &Output::doOutput);
-    }
-
     auto const time_step_constraints = generateOutputTimeStepConstraints(
         calculateUniqueFixedTimesForAllOutputs(_outputs));
 
@@ -508,6 +502,12 @@ void TimeLoop::initialize()
         computeTimeStepping(0.0, _current_time, _accepted_steps,
                             _rejected_steps, time_step_constraints);
 
+    // Output initial conditions
+    {
+        preOutputInitialConditions(_start_time, _dt);
+        outputSolutions(0, _start_time, &Output::doOutput);
+    }
+
     calculateNonEquilibriumInitialResiduum(
         _per_process_data, _process_solutions, _process_solutions_prev);
 }
@@ -752,7 +752,7 @@ TimeLoop::~TimeLoop()
     }
 }
 
-void TimeLoop::preOutputInitialConditions(const double t) const
+void TimeLoop::preOutputInitialConditions(const double t, const double dt) const
 {
     for (auto const& process_data : _per_process_data)
     {
@@ -766,9 +766,6 @@ void TimeLoop::preOutputInitialConditions(const double t) const
         auto const process_id = process_data->process_id;
         auto& pcs = process_data->process;
 
-        // dummy value to handle the time derivative terms more or less
-        // correctly, i.e. to ignore them.
-        double const dt = 1;
         process_data->time_disc->nextTimestep(t, dt);
 
         pcs.preTimestep(_process_solutions, _start_time, dt, process_id);
diff --git a/ProcessLib/TimeLoop.h b/ProcessLib/TimeLoop.h
index 43c5c112529..e96047a9792 100644
--- a/ProcessLib/TimeLoop.h
+++ b/ProcessLib/TimeLoop.h
@@ -122,7 +122,7 @@ private:
 private:
     std::vector<std::function<double(double, double)>>
     generateOutputTimeStepConstraints(std::vector<double>&& fixed_times) const;
-    void preOutputInitialConditions(const double t) const;
+    void preOutputInitialConditions(const double t, const double dt) const;
     std::vector<GlobalVector*> _process_solutions;
     std::vector<GlobalVector*> _process_solutions_prev;
     std::vector<Output> _outputs;
-- 
GitLab