From c3dc225d3cf2055344934deb70142748dcc3e183 Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon.praetorius@tu-dresden.de>
Date: Fri, 26 Apr 2019 13:01:20 +0200
Subject: [PATCH] added Environment for MPI initialization

---
 examples/boundary.cc                   |  3 +-
 examples/cahn_hilliard.cc              |  3 +-
 examples/convection_diffusion.cc       |  3 +-
 examples/ellipt.cc                     |  3 +-
 examples/heat.cc                       |  3 +-
 examples/navier_stokes.cc              |  3 +-
 examples/neumann.cc                    |  3 +-
 examples/periodic.cc                   |  3 +-
 examples/stokes0.cc                    |  3 +-
 examples/stokes1.cc                    |  3 +-
 examples/stokes3.cc                    |  3 +-
 examples/vecellipt.cc                  |  3 +-
 src/amdis/AMDiS.cpp                    | 31 -----------
 src/amdis/AMDiS.hpp                    | 21 +++-----
 src/amdis/AdaptInfo.cpp                |  4 ++
 src/amdis/AdaptInstationary.cpp        |  4 ++
 src/amdis/AdaptStationary.cpp          |  4 ++
 src/amdis/CMakeLists.txt               |  3 +-
 src/amdis/DataTransfer.inc.hpp         |  1 +
 src/amdis/Environment.cpp              | 37 +++++++++++++
 src/amdis/Environment.hpp              | 72 ++++++++++++++++++++++++++
 src/amdis/Initfile.cpp                 |  6 ++-
 src/amdis/InitfileParser.cpp           |  6 ++-
 src/amdis/ProblemInstat.cpp            |  5 +-
 src/amdis/ProblemInstatBase.cpp        |  4 ++
 src/amdis/ProblemStat.cpp              |  5 +-
 src/amdis/StandardProblemIteration.cpp |  4 ++
 src/amdis/common/Filesystem.cpp        |  4 ++
 src/amdis/common/String.cpp            |  4 ++
 test/DOFVectorTest.cpp                 |  3 +-
 test/DataTransferTest2d.cpp            |  5 +-
 test/DataTransferTest3d.cpp            |  5 +-
 test/DiscreteFunctionTest.cpp          |  3 +-
 test/ExpressionsTest.cpp               |  3 +-
 test/IntegrateTest.cpp                 |  3 +-
 test/MarkerTest.cpp                    |  4 +-
 test/OperationsTest.cpp                |  3 +-
 test/OperatorsTest.cpp                 |  3 +-
 38 files changed, 192 insertions(+), 91 deletions(-)
 delete mode 100644 src/amdis/AMDiS.cpp
 create mode 100644 src/amdis/Environment.cpp
 create mode 100644 src/amdis/Environment.hpp

diff --git a/examples/boundary.cc b/examples/boundary.cc
index 2c53d45a..91ef916e 100644
--- a/examples/boundary.cc
+++ b/examples/boundary.cc
@@ -95,7 +95,7 @@ void run_periodic()
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   auto b = [](auto const& x){ return x[0] < 1.e-8 || x[1] < 1.e-8 || x[0] > 1.0-1.e-8 || x[1] > 1.0-1.e-8; };
 
@@ -119,6 +119,5 @@ int main(int argc, char** argv)
 
   run_periodic();
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/cahn_hilliard.cc b/examples/cahn_hilliard.cc
index 9f68a576..a26e9ccf 100644
--- a/examples/cahn_hilliard.cc
+++ b/examples/cahn_hilliard.cc
@@ -13,7 +13,7 @@ using Param = LagrangeBasis<Grid, 1, 1>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ProblemStat<Param> prob("ch");
   prob.initialize(INIT_ALL);
@@ -68,6 +68,5 @@ int main(int argc, char** argv)
   AdaptInstationary adapt("adapt", prob, adaptInfo, probInstat, adaptInfo);
   adapt.adapt();
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/convection_diffusion.cc b/examples/convection_diffusion.cc
index 188b6f12..b0af5d22 100644
--- a/examples/convection_diffusion.cc
+++ b/examples/convection_diffusion.cc
@@ -17,7 +17,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -39,6 +39,5 @@ int main(int argc, char** argv)
   prob.solve(adaptInfo);
   prob.writeFiles(adaptInfo, true);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/ellipt.cc b/examples/ellipt.cc
index 885da9ca..411ef195 100644
--- a/examples/ellipt.cc
+++ b/examples/ellipt.cc
@@ -18,7 +18,7 @@ using ElliptProblem = ProblemStat<Param>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   int numLevels = GRIDDIM == 2 ? 8 : 5;
   if (argc > 2)
@@ -92,6 +92,5 @@ int main(int argc, char** argv)
     msg("{:<5} | {:<12} | {:<12} | {:<12} | {:<12} | {:<12}",
         i+1, widths[i], errL2[i], errH1[i], eocL2[i], eocH1[i]);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/heat.cc b/examples/heat.cc
index 95d06ab6..9fe769a4 100644
--- a/examples/heat.cc
+++ b/examples/heat.cc
@@ -21,7 +21,7 @@ using HeatProblemInstat = ProblemInstat<HeatParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   HeatProblem prob("heat");
   prob.initialize(INIT_ALL);
@@ -55,6 +55,5 @@ int main(int argc, char** argv)
   AdaptInstationary adapt("adapt", prob, adaptInfo, probInstat, adaptInfo);
   adapt.adapt();
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/navier_stokes.cc b/examples/navier_stokes.cc
index 4735e5f3..2d2677b7 100644
--- a/examples/navier_stokes.cc
+++ b/examples/navier_stokes.cc
@@ -12,7 +12,7 @@ using Basis = TaylorHoodBasis<Grid>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ProblemStat<Basis> prob("stokes");
   prob.initialize(INIT_ALL);
@@ -89,6 +89,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/neumann.cc b/examples/neumann.cc
index eb423465..20f07106 100644
--- a/examples/neumann.cc
+++ b/examples/neumann.cc
@@ -51,7 +51,7 @@ void run(Grid& grid)
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   // 2d grids
 
@@ -85,6 +85,5 @@ int main(int argc, char** argv)
   Dune::YaspGrid<3> grid4({1.0,1.0,1.0},{2,2,2});
   run(grid4);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/periodic.cc b/examples/periodic.cc
index 2e61afb4..02218df1 100644
--- a/examples/periodic.cc
+++ b/examples/periodic.cc
@@ -79,7 +79,7 @@ void run(Grid& grid)
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
 #if HAVE_DUNE_SPGRID
   Dune::SPCube<double,2> cube({0.0,0.0},{1.0,1.0});
@@ -92,6 +92,5 @@ int main(int argc, char** argv)
   Dune::YaspGrid<2> grid2({1.0,1.0}, {2,2});
   run(grid2);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/stokes0.cc b/examples/stokes0.cc
index 6c0bd639..979182b5 100644
--- a/examples/stokes0.cc
+++ b/examples/stokes0.cc
@@ -10,7 +10,7 @@ using StokesProblem = ProblemStat<StokesParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   StokesProblem prob("stokes");
   prob.initialize(INIT_ALL);
@@ -58,6 +58,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/stokes1.cc b/examples/stokes1.cc
index 13279763..50581ed6 100644
--- a/examples/stokes1.cc
+++ b/examples/stokes1.cc
@@ -10,7 +10,7 @@ using StokesProblem = ProblemStat<StokesParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   StokesProblem prob("stokes");
   prob.initialize(INIT_ALL);
@@ -58,6 +58,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/stokes3.cc b/examples/stokes3.cc
index 2358e900..80937e8b 100644
--- a/examples/stokes3.cc
+++ b/examples/stokes3.cc
@@ -11,7 +11,7 @@ using StokesProblem = ProblemStat<StokesParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   StokesProblem prob("stokes");
   prob.initialize(INIT_ALL);
@@ -48,6 +48,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/vecellipt.cc b/examples/vecellipt.cc
index ec3d4356..2cb3a414 100644
--- a/examples/vecellipt.cc
+++ b/examples/vecellipt.cc
@@ -15,7 +15,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ElliptProblem prob("ellipt");
   prob.initialize(INIT_ALL);
@@ -53,6 +53,5 @@ int main(int argc, char** argv)
   prob.solve(adaptInfo);
   prob.writeFiles(adaptInfo, true);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/src/amdis/AMDiS.cpp b/src/amdis/AMDiS.cpp
deleted file mode 100644
index 5965d68b..00000000
--- a/src/amdis/AMDiS.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "AMDiS.hpp"
-
-// AMDiS includes
-#include <amdis/Initfile.hpp>
-#include <amdis/Output.hpp>
-
-namespace AMDiS
-{
-  Dune::MPIHelper& init(int& argc, char**& argv, std::string const& initFileName)
-  {
-    // Maybe initialize MPI
-    static Dune::MPIHelper& mpiHelper = Dune::MPIHelper::instance(argc, argv);
-
-    Parameters::clearData();
-
-    if (initFileName.empty() && argc > 1) {
-      Parameters::init(argv[1]);
-    } else if (!initFileName.empty()) {
-      Parameters::init(initFileName);
-    } else {
-      warning("No initfile specified. Using default values for all parameters.");
-    }
-
-    return mpiHelper;
-  }
-
-
-  void finalize()
-  {}
-
-} // end namespace AMDiS
diff --git a/src/amdis/AMDiS.hpp b/src/amdis/AMDiS.hpp
index 30149d54..274ff818 100644
--- a/src/amdis/AMDiS.hpp
+++ b/src/amdis/AMDiS.hpp
@@ -4,16 +4,11 @@
 # include "config.h"
 #endif
 
-// std c++ headers
-#include <string>
-
-#include <dune/common/exceptions.hh> // We use exceptions
-#include <dune/common/parallel/mpihelper.hh>
-
-namespace AMDiS
-{
-  Dune::MPIHelper& init(int& argc, char**& argv, std::string const& initFileName = "");
-
-  void finalize();
-
-} // end namespace AMDiS
+#include <amdis/AdaptInfo.hpp>
+#include <amdis/Environment.hpp>
+#include <amdis/Initfile.hpp>
+#include <amdis/LinearAlgebra.hpp>
+#include <amdis/Output.hpp>
+#include <amdis/ProblemStat.hpp>
+
+namespace AMDiS {} // end namespace AMDiS
diff --git a/src/amdis/AdaptInfo.cpp b/src/amdis/AdaptInfo.cpp
index e71e6a66..eabe3bfe 100644
--- a/src/amdis/AdaptInfo.cpp
+++ b/src/amdis/AdaptInfo.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "AdaptInfo.hpp"
 
 // std c++ headers
diff --git a/src/amdis/AdaptInstationary.cpp b/src/amdis/AdaptInstationary.cpp
index add28e1d..f5c4074e 100644
--- a/src/amdis/AdaptInstationary.cpp
+++ b/src/amdis/AdaptInstationary.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "AdaptInstationary.hpp"
 
 // AMDiS includes
diff --git a/src/amdis/AdaptStationary.cpp b/src/amdis/AdaptStationary.cpp
index eb721da0..fb596bdc 100644
--- a/src/amdis/AdaptStationary.cpp
+++ b/src/amdis/AdaptStationary.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "AdaptStationary.hpp"
 
 // AMDiS includes
diff --git a/src/amdis/CMakeLists.txt b/src/amdis/CMakeLists.txt
index d13f7292..4e00d254 100644
--- a/src/amdis/CMakeLists.txt
+++ b/src/amdis/CMakeLists.txt
@@ -4,7 +4,7 @@ dune_library_add_sources(amdis SOURCES
     AdaptInfo.cpp
     AdaptInstationary.cpp
     AdaptStationary.cpp
-    AMDiS.cpp
+    Environment.cpp
     Initfile.cpp
     InitfileParser.cpp
     ProblemInstatBase.cpp
@@ -31,6 +31,7 @@ install(FILES
     DataTransfer.inc.hpp
     DirichletBC.hpp
     DirichletBC.inc.hpp
+    Environment.hpp
     FileWriter.hpp
     FileWriterInterface.hpp
     Flag.hpp
diff --git a/src/amdis/DataTransfer.inc.hpp b/src/amdis/DataTransfer.inc.hpp
index b6f01e93..7376c961 100644
--- a/src/amdis/DataTransfer.inc.hpp
+++ b/src/amdis/DataTransfer.inc.hpp
@@ -14,6 +14,7 @@
 #include <dune/common/fvector.hh>
 #include <dune/common/hash.hh>
 
+#include <dune/grid/common/geometry.hh>
 #include <dune/grid/common/mcmgmapper.hh>
 #include <dune/grid/common/rangegenerators.hh>
 
diff --git a/src/amdis/Environment.cpp b/src/amdis/Environment.cpp
new file mode 100644
index 00000000..08cd067c
--- /dev/null
+++ b/src/amdis/Environment.cpp
@@ -0,0 +1,37 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "Environment.hpp"
+
+// AMDiS includes
+#include <amdis/Initfile.hpp>
+#include <amdis/Output.hpp>
+
+namespace AMDiS
+{
+  Environment::Environment(std::string const& initFileName)
+  {
+    Parameters::clearData();
+    if (!initFileName.empty())
+      Parameters::init(initFileName);
+  }
+
+  Environment::Environment(int& argc, char**& argv, std::string const& initFileName)
+    : Environment(initFileName)
+  {
+    auto& helper = Dune::MPIHelper::instance(argc, argv);
+
+    auto& mpi = Mpi::instance();
+    mpi.registerMpiHelper(helper);
+
+    Parameters::clearData();
+    if (initFileName.empty()) {
+      if (argc > 1)
+        Parameters::init(argv[1]);
+      else
+        warning("No initfile specified. Using default values for all parameters.");
+    }
+  }
+
+} // end namespace AMDiS
diff --git a/src/amdis/Environment.hpp b/src/amdis/Environment.hpp
new file mode 100644
index 00000000..28ebeef5
--- /dev/null
+++ b/src/amdis/Environment.hpp
@@ -0,0 +1,72 @@
+#pragma once
+
+// std c++ headers
+#include <cassert>
+#include <string>
+
+#include <dune/common/parallel/mpihelper.hh>
+
+namespace AMDiS
+{
+  /// Establishes an environemnt for sequential and parallel AMDiS programs
+  /**
+   * This object initializes the MPI environement, parses initfiles and may
+   * initialize other external libraries. It is constructed with the program
+   * commandline arguments. In its destruction, the MPI environemnt is finalized.
+   * In the vast majority of AMDiS programs, an instance of Environemnt should
+   * be desclared at the very beginning of the main function.
+   **/
+  class Environment
+  {
+    // insternal static container holding a pointer to the Dune::MPIHelper.
+    struct Mpi
+    {
+      static Mpi& instance()
+      {
+        static Mpi mpi;
+        return mpi;
+      }
+
+      void registerMpiHelper(Dune::MPIHelper& mpiHelper)
+      {
+        mpiHelper_ = &mpiHelper;
+      }
+
+      int rank()
+      {
+        assert(mpiHelper_ != nullptr);
+        return mpiHelper_->rank();
+      }
+
+      int size()
+      {
+        assert(mpiHelper_ != nullptr);
+        return mpiHelper_->size();
+      }
+
+    private:
+      Dune::MPIHelper* mpiHelper_ = nullptr;
+    };
+
+  public:
+    /// Create an environment without mpi initialization, with a fixed initfile given as string
+    Environment(std::string const& initFileName = "");
+
+    /// Create an environemtn with initialization of MPI and initifiles from commandline arguments
+    /// or the provided initfile filename.
+    Environment(int& argc, char**& argv, std::string const& initFileName = "");
+
+    /// Return the MPI_Rank of the current processor.
+    static int mpiRank()
+    {
+      return Mpi::instance().rank();
+    }
+
+    /// Return the MPI_Size if the group created by Dune::MPIHelper.
+    static int mpiSize()
+    {
+      return Mpi::instance().size();
+    }
+  };
+
+} // end namespace AMDiS
diff --git a/src/amdis/Initfile.cpp b/src/amdis/Initfile.cpp
index 7dfb219c..1bae7e2a 100644
--- a/src/amdis/Initfile.cpp
+++ b/src/amdis/Initfile.cpp
@@ -1,4 +1,8 @@
-#include <amdis/Initfile.hpp>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "Initfile.hpp"
 
 #include <amdis/InitfileParser.hpp>
 
diff --git a/src/amdis/InitfileParser.cpp b/src/amdis/InitfileParser.cpp
index 53d91095..39e6ab63 100644
--- a/src/amdis/InitfileParser.cpp
+++ b/src/amdis/InitfileParser.cpp
@@ -1,4 +1,8 @@
-#include <amdis/InitfileParser.hpp>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "InitfileParser.hpp"
 
 #include <amdis/Output.hpp>
 #include <amdis/common/Filesystem.hpp>
diff --git a/src/amdis/ProblemInstat.cpp b/src/amdis/ProblemInstat.cpp
index afbf06e0..b98790c0 100644
--- a/src/amdis/ProblemInstat.cpp
+++ b/src/amdis/ProblemInstat.cpp
@@ -1,4 +1,7 @@
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "ProblemInstat.hpp"
 
 namespace AMDiS
diff --git a/src/amdis/ProblemInstatBase.cpp b/src/amdis/ProblemInstatBase.cpp
index b29242de..cea43009 100644
--- a/src/amdis/ProblemInstatBase.cpp
+++ b/src/amdis/ProblemInstatBase.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "ProblemInstatBase.hpp"
 
 #include "AdaptInfo.hpp"
diff --git a/src/amdis/ProblemStat.cpp b/src/amdis/ProblemStat.cpp
index fabf702f..d0397978 100644
--- a/src/amdis/ProblemStat.cpp
+++ b/src/amdis/ProblemStat.cpp
@@ -1,4 +1,7 @@
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "ProblemStat.hpp"
 
 namespace AMDiS
diff --git a/src/amdis/StandardProblemIteration.cpp b/src/amdis/StandardProblemIteration.cpp
index 0c6b5c66..5ab580f6 100644
--- a/src/amdis/StandardProblemIteration.cpp
+++ b/src/amdis/StandardProblemIteration.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "StandardProblemIteration.hpp"
 
 #include <amdis/AdaptInfo.hpp>
diff --git a/src/amdis/common/Filesystem.cpp b/src/amdis/common/Filesystem.cpp
index 77fddde1..6889d955 100644
--- a/src/amdis/common/Filesystem.cpp
+++ b/src/amdis/common/Filesystem.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "Filesystem.hpp"
 
 #ifdef _WIN32
diff --git a/src/amdis/common/String.cpp b/src/amdis/common/String.cpp
index 6a5b28f9..7b70d1d8 100644
--- a/src/amdis/common/String.cpp
+++ b/src/amdis/common/String.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "String.hpp"
 
 namespace AMDiS
diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp
index 61721ef0..36e7c0eb 100644
--- a/test/DOFVectorTest.cpp
+++ b/test/DOFVectorTest.cpp
@@ -7,6 +7,7 @@
 #include <dune/functions/functionspacebases/powerbasis.hh>
 #include <dune/functions/functionspacebases/lagrangebasis.hh>
 
+#include <amdis/AMDiS.hpp>
 #include <amdis/GridTransferManager.hpp>
 #include <amdis/LinearAlgebra.hpp>
 
@@ -36,7 +37,7 @@ void test_dofvector(B const& basis, DOFVector<B,T>& vec)
 
 int main(int argc, char** argv)
 {
-  Dune::MPIHelper::instance(argc, argv);
+  Environment env(argc, argv);
 
   // create grid
   Dune::FieldVector<double, 2> L; L = 1.0;
diff --git a/test/DataTransferTest2d.cpp b/test/DataTransferTest2d.cpp
index 2f4e92b2..a308cf8a 100644
--- a/test/DataTransferTest2d.cpp
+++ b/test/DataTransferTest2d.cpp
@@ -1,16 +1,17 @@
 
+#include <amdis/AMDiS.hpp>
 #include "DataTransferTest.hpp"
 
 int main(int argc, char** argv)
 {
+  Environment env(argc, argv);
+
 #ifdef HAVE_DUNE_UGGRID
   using Grid = Dune::UGGrid<2>;
 #else
   using Grid = Dune::YaspGrid<2>;
 #endif
 
-  Dune::MPIHelper::instance(argc, argv);
-
   using Domain = typename Dune::FieldVector<double, 2>;
 
   // polynomial of order 1
diff --git a/test/DataTransferTest3d.cpp b/test/DataTransferTest3d.cpp
index e1b818c7..043fd66c 100644
--- a/test/DataTransferTest3d.cpp
+++ b/test/DataTransferTest3d.cpp
@@ -1,16 +1,17 @@
 
+#include <amdis/AMDiS.hpp>
 #include "DataTransferTest.hpp"
 
 int main(int argc, char** argv)
 {
+  Environment env(argc, argv);
+
 #ifdef HAVE_DUNE_UGGRID
   using Grid = Dune::UGGrid<3>;
 #else
   using Grid = Dune::YaspGrid<3>;
 #endif
 
-  Dune::MPIHelper::instance(argc, argv);
-
   using Domain = typename Dune::FieldVector<double, 3>;
 
   // polynomial of order 1
diff --git a/test/DiscreteFunctionTest.cpp b/test/DiscreteFunctionTest.cpp
index 93b6d39e..e330eaaf 100644
--- a/test/DiscreteFunctionTest.cpp
+++ b/test/DiscreteFunctionTest.cpp
@@ -33,7 +33,7 @@ bool comp(DOFVector<GB,T> const& U, DOFVector<GB,T> const& V)
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -129,6 +129,5 @@ int main(int argc, char** argv)
   AMDIS_TEST( comp(W3, W5) );
   AMDIS_TEST( comp(W3, W6) );
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/test/ExpressionsTest.cpp b/test/ExpressionsTest.cpp
index 7c2924ab..aa1ecae2 100644
--- a/test/ExpressionsTest.cpp
+++ b/test/ExpressionsTest.cpp
@@ -18,7 +18,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -103,6 +103,5 @@ int main(int argc, char** argv)
   DUNE_UNUSED auto int5 = integrate(op5, gv, 5);
   DUNE_UNUSED auto int6 = integrate(op6, gv, 5);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/test/IntegrateTest.cpp b/test/IntegrateTest.cpp
index 539d870f..76fe1570 100644
--- a/test/IntegrateTest.cpp
+++ b/test/IntegrateTest.cpp
@@ -18,7 +18,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ElliptProblem prob("ellipt");
   prob.initialize(INIT_ALL);
@@ -40,6 +40,5 @@ int main(int argc, char** argv)
 
   AMDIS_TEST(i4 == 1.0);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/test/MarkerTest.cpp b/test/MarkerTest.cpp
index 8448ef9c..10dd4928 100644
--- a/test/MarkerTest.cpp
+++ b/test/MarkerTest.cpp
@@ -14,7 +14,7 @@ using DomainType = typename Dune::FieldVector<double,d>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   DomainType lowerLeft; lowerLeft = 0.0;    // lower left grid corner
   DomainType upperRight; upperRight = 1.0;  // upper right grid corner
@@ -53,7 +53,5 @@ int main(int argc, char** argv)
   prob.solution().interpolate(markerFunc);
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
-
   return report_errors();
 }
diff --git a/test/OperationsTest.cpp b/test/OperationsTest.cpp
index dfea8c33..e64b46aa 100644
--- a/test/OperationsTest.cpp
+++ b/test/OperationsTest.cpp
@@ -11,7 +11,7 @@ using namespace AMDiS;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   constexpr Operation::StaticConstant<int,0> op0a;
   constexpr Operation::Zero op0b;
@@ -77,6 +77,5 @@ int main(int argc, char** argv)
   AMDIS_TEST_EQ(erg8, 2);
   // constexpr int order8 = order(op8,2,3); // no order() for divides
 
-  AMDiS::finalize();
   return report_errors();
 }
diff --git a/test/OperatorsTest.cpp b/test/OperatorsTest.cpp
index b52fb972..da142e9a 100644
--- a/test/OperatorsTest.cpp
+++ b/test/OperatorsTest.cpp
@@ -15,7 +15,7 @@ using Problem = ProblemStat<Param>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -109,6 +109,5 @@ int main(int argc, char** argv)
   prob.addMatrixOperator(opCDb, _p, _p);
   prob.addVectorOperator(opCDb, _p);
 
-  AMDiS::finalize();
   return 0;
 }
-- 
GitLab