From 7c22fbaadadd08c2e9a971c31df9bf6437461b60 Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Wed, 28 Nov 2018 10:27:30 +0100
Subject: [PATCH] [TimeInterval] Added a creator

---
 NumLib/TimeStepping/TimeInterval.cpp          | 36 +++++++++++++++++++
 NumLib/TimeStepping/TimeInterval.h            |  8 +++++
 ...letBoundaryConditionWithinTimeInterval.cpp | 20 ++++-------
 ...chletBoundaryConditionWithinTimeInterval.h |  2 +-
 .../TimeIntervalDirichletBC.prj               |  6 ++--
 5 files changed, 55 insertions(+), 17 deletions(-)
 create mode 100644 NumLib/TimeStepping/TimeInterval.cpp

diff --git a/NumLib/TimeStepping/TimeInterval.cpp b/NumLib/TimeStepping/TimeInterval.cpp
new file mode 100644
index 00000000000..19ec782c50f
--- /dev/null
+++ b/NumLib/TimeStepping/TimeInterval.cpp
@@ -0,0 +1,36 @@
+/**
+ * \copyright
+ * Copyright (c) 2012-2018, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ * File:   TimeInterval.cpp
+ *
+ * Created on November 27, 2018, 5:06 PM
+ *
+ */
+
+#include "TimeInterval.h"
+
+#include "BaseLib/ConfigTree.h"
+
+namespace NumLib
+{
+std::unique_ptr<TimeInterval> createTimeInterval(
+    BaseLib::ConfigTree const& config)
+{
+    //! \ogs_file_param{prj__time_loop__processes__process__time_interval}
+    auto const& time_interval_config = config.getConfigSubtree("time_interval");
+
+    const double start_time =
+        //! \ogs_file_param{prj__time_loop__processes__process__time_interval__start_time}
+        time_interval_config.getConfigParameter<double>("start_time");
+
+    const double end_time =
+        //! \ogs_file_param{prj__time_loop__processes__process__time_interval__end_time}
+        time_interval_config.getConfigParameter<double>("end_time");
+
+    return std::make_unique<NumLib::TimeInterval>(start_time, end_time);
+}
+}  // end of namespace
diff --git a/NumLib/TimeStepping/TimeInterval.h b/NumLib/TimeStepping/TimeInterval.h
index 0bf7658e102..16f9992b787 100644
--- a/NumLib/TimeStepping/TimeInterval.h
+++ b/NumLib/TimeStepping/TimeInterval.h
@@ -12,6 +12,11 @@
  */
 #pragma once
 
+namespace BaseLib
+{
+class ConfigTree;
+}
+
 namespace NumLib
 {
 /*!
@@ -36,4 +41,7 @@ private:
     const double _end_time;
 };
 
+std::unique_ptr<TimeInterval> createTimeInterval(
+    BaseLib::ConfigTree const& config);
+
 }  // end of namespace
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp
index a1a338a5e69..4e51b27e171 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp
@@ -25,14 +25,13 @@ namespace ProcessLib
 {
 DirichletBoundaryConditionWithinTimeInterval::
     DirichletBoundaryConditionWithinTimeInterval(
-        double const start_time, double const end_time,
+        std::unique_ptr<NumLib::TimeInterval> time_interval,
         Parameter<double> const& parameter, MeshLib::Mesh const& bc_mesh,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
         int const variable_id, int const component_id)
     : DirichletBoundaryCondition(parameter, bc_mesh, dof_table_bulk,
                                  variable_id, component_id),
-      _time_interval(
-          std::make_unique<NumLib::TimeInterval>(start_time, end_time))
+      _time_interval(std::move(time_interval))
 {
 }
 
@@ -48,8 +47,6 @@ void DirichletBoundaryConditionWithinTimeInterval::getEssentialBCValues(
 
     bc_values.ids.clear();
     bc_values.values.clear();
-
-    return;
 }
 
 std::unique_ptr<DirichletBoundaryCondition>
@@ -86,17 +83,12 @@ createDirichletBoundaryConditionWithinTimeInterval(
     }
 #endif  // USE_PETSC
 
-    const double start_time =
-        //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__DirichletWithinTimeInterval__start_time}
-        config.getConfigParameter<double>("start_time");
-
-    const double end_time =
-        //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__DirichletWithinTimeInterval__end_time}
-        config.getConfigParameter<double>("end_time");
+    //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__DirichletWithinTimeInterval__time_interval}
+    config.peekConfigParameter<std::string>("time_interval");
 
     return std::make_unique<DirichletBoundaryConditionWithinTimeInterval>(
-        start_time, end_time, param, bc_mesh, dof_table_bulk, variable_id,
-        component_id);
+        NumLib::createTimeInterval(config), param, bc_mesh,
+        dof_table_bulk, variable_id, component_id);
 }
 
 }  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.h b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.h
index beeaa23928c..b96932fb5bd 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.h
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.h
@@ -28,7 +28,7 @@ class DirichletBoundaryConditionWithinTimeInterval final
 {
 public:
     DirichletBoundaryConditionWithinTimeInterval(
-        double const start_time, double const end_time,
+        std::unique_ptr<NumLib::TimeInterval> time_interval,
         Parameter<double> const& parameter, MeshLib::Mesh const& bc_mesh,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
         int const variable_id, int const component_id);
diff --git a/Tests/Data/Parabolic/LiquidFlow/TimeIntervalDirichletBC/TimeIntervalDirichletBC.prj b/Tests/Data/Parabolic/LiquidFlow/TimeIntervalDirichletBC/TimeIntervalDirichletBC.prj
index b8f595f32ec..bad9a1db661 100644
--- a/Tests/Data/Parabolic/LiquidFlow/TimeIntervalDirichletBC/TimeIntervalDirichletBC.prj
+++ b/Tests/Data/Parabolic/LiquidFlow/TimeIntervalDirichletBC/TimeIntervalDirichletBC.prj
@@ -136,8 +136,10 @@
                     <geometry>bottom</geometry>
                     <type>DirichletWithinTimeInterval</type>
                     <parameter>bc_bottom</parameter>
-                    <start_time> 0.0 </start_time>
-                    <end_time> 10.0 </end_time>
+                    <time_interval>
+                        <start_time> 0.0 </start_time>
+                        <end_time> 10.0 </end_time>
+                    </time_interval>
                 </boundary_condition>
             </boundary_conditions>
         </process_variable>
-- 
GitLab