From abeaf8b803d947231f7fcc2a4015bce378cfa973 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Thu, 30 Jan 2014 13:56:08 +0100
Subject: [PATCH] [Cleanup] Friction writing: Move half of friction writing
 into new class

---
 src/Makefile.am             |  1 +
 src/boundary_writer.cc      | 42 +++++++++++++++++++++++++++++++++++++
 src/boundary_writer.hh      | 23 ++++++++++++++++++++
 src/boundary_writer_tmpl.cc |  7 +++++++
 src/friction_writer.cc      | 33 ++++-------------------------
 src/friction_writer.hh      | 13 +++++++-----
 6 files changed, 85 insertions(+), 34 deletions(-)
 create mode 100644 src/boundary_writer.cc
 create mode 100644 src/boundary_writer.hh
 create mode 100644 src/boundary_writer_tmpl.cc

diff --git a/src/Makefile.am b/src/Makefile.am
index 66b6ed36..4cca1056 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,6 +3,7 @@ bin_PROGRAMS = \
 
 SOURCES = \
 	assemblers.cc \
+	boundary_writer.cc \
 	friction_writer.cc \
 	state/compute_state_dieterich_euler.cc \
 	state/compute_state_ruina.cc \
diff --git a/src/boundary_writer.cc b/src/boundary_writer.cc
new file mode 100644
index 00000000..0a6d3941
--- /dev/null
+++ b/src/boundary_writer.cc
@@ -0,0 +1,42 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "boundary_writer.hh"
+
+template <class ScalarVector, class Vector>
+BoundaryWriter<ScalarVector, Vector>::BoundaryWriter(
+    Vector const &vertexCoordinates,
+    Dune::BitSetVector<1> const &_boundaryNodes)
+    : displacementWriter("displacements", std::fstream::out),
+      velocityWriter("velocities", std::fstream::out),
+      boundaryNodes(_boundaryNodes) {
+  std::fstream vertexCoordinateWriter("coordinates", std::fstream::out);
+  for (size_t i = 0; i < boundaryNodes.size(); ++i)
+    if (boundaryNodes[i][0])
+      vertexCoordinateWriter << vertexCoordinates[i] << std::endl;
+  vertexCoordinateWriter.close();
+}
+
+template <class ScalarVector, class Vector>
+BoundaryWriter<ScalarVector, Vector>::~BoundaryWriter() {
+  displacementWriter.close();
+  velocityWriter.close();
+}
+
+template <class ScalarVector, class Vector>
+void BoundaryWriter<ScalarVector, Vector>::writeKinetics(Vector const &u,
+                                                         Vector const &v) {
+  for (size_t i = 0; i < boundaryNodes.size(); ++i) {
+    if (!boundaryNodes[i][0])
+      continue;
+
+    displacementWriter << u[i][0] << " ";
+    velocityWriter << v[i][0] << " ";
+  }
+
+  displacementWriter << std::endl;
+  velocityWriter << std::endl;
+}
+
+#include "boundary_writer_tmpl.cc"
diff --git a/src/boundary_writer.hh b/src/boundary_writer.hh
new file mode 100644
index 00000000..9bb8346f
--- /dev/null
+++ b/src/boundary_writer.hh
@@ -0,0 +1,23 @@
+#ifndef BOUNDARY_WRITER_HH
+#define BOUNDARY_WRITER_HH
+
+#include <fstream>
+#include <string>
+
+#include <dune/common/bitsetvector.hh>
+
+template <class ScalarVector, class Vector> class BoundaryWriter {
+public:
+  BoundaryWriter(Vector const &vertexCoordinates,
+                 Dune::BitSetVector<1> const &_boundaryNodes);
+
+  virtual ~BoundaryWriter();
+
+  void writeKinetics(Vector const &u, Vector const &v);
+
+protected:
+  std::fstream displacementWriter;
+  std::fstream velocityWriter;
+  Dune::BitSetVector<1> const &boundaryNodes;
+};
+#endif
diff --git a/src/boundary_writer_tmpl.cc b/src/boundary_writer_tmpl.cc
new file mode 100644
index 00000000..8d7f43c4
--- /dev/null
+++ b/src/boundary_writer_tmpl.cc
@@ -0,0 +1,7 @@
+#ifndef DIM
+#error DIM unset
+#endif
+
+#include "explicitvectors.hh"
+
+template class BoundaryWriter<ScalarVector, Vector>;
diff --git a/src/friction_writer.cc b/src/friction_writer.cc
index b43bc820..465e2026 100644
--- a/src/friction_writer.cc
+++ b/src/friction_writer.cc
@@ -8,41 +8,16 @@ template <class ScalarVector, class Vector>
 FrictionWriter<ScalarVector, Vector>::FrictionWriter(
     Vector const &vertexCoordinates,
     Dune::BitSetVector<1> const &_boundaryNodes)
-    : coefficientWriter("coefficients", std::fstream::out),
-      displacementWriter("displacements", std::fstream::out),
-      stateWriter("states", std::fstream::out),
-      velocityWriter("velocities", std::fstream::out),
-      boundaryNodes(_boundaryNodes) {
-  std::fstream vertexCoordinateWriter("coordinates", std::fstream::out);
-  for (size_t i = 0; i < boundaryNodes.size(); ++i)
-    if (boundaryNodes[i][0])
-      vertexCoordinateWriter << vertexCoordinates[i] << std::endl;
-  vertexCoordinateWriter.close();
-}
+    : BW(vertexCoordinates, _boundaryNodes),
+      coefficientWriter("coefficients", std::fstream::out),
+      stateWriter("states", std::fstream::out) {}
 
 template <class ScalarVector, class Vector>
 FrictionWriter<ScalarVector, Vector>::~FrictionWriter() {
   stateWriter.close();
-  displacementWriter.close();
-  velocityWriter.close();
   coefficientWriter.close();
 }
 
-template <class ScalarVector, class Vector>
-void FrictionWriter<ScalarVector, Vector>::writeKinetics(Vector const &u,
-                                                         Vector const &v) {
-  for (size_t i = 0; i < boundaryNodes.size(); ++i) {
-    if (!boundaryNodes[i][0])
-      continue;
-
-    displacementWriter << u[i][0] << " ";
-    velocityWriter << v[i][0] << " ";
-  }
-
-  displacementWriter << std::endl;
-  velocityWriter << std::endl;
-}
-
 template <class ScalarVector, class Vector>
 void FrictionWriter<ScalarVector, Vector>::writeOther(
     ScalarVector const &coefficient, ScalarVector const &alpha) {
@@ -51,7 +26,7 @@ void FrictionWriter<ScalarVector, Vector>::writeOther(
       continue;
 
     coefficientWriter << coefficient[i] << " ";
-    stateWriter << alpha[i][0] << " ";
+    stateWriter << alpha[i] << " ";
   }
 
   stateWriter << std::endl;
diff --git a/src/friction_writer.hh b/src/friction_writer.hh
index f5979612..58b2c8b2 100644
--- a/src/friction_writer.hh
+++ b/src/friction_writer.hh
@@ -2,24 +2,27 @@
 #define FRICTION_WRITER_HH
 
 #include <fstream>
+#include <string>
 
 #include <dune/common/bitsetvector.hh>
 
-template <class ScalarVector, class Vector> class FrictionWriter {
+#include "boundary_writer.hh"
+
+template <class ScalarVector, class Vector>
+class FrictionWriter : public BoundaryWriter<ScalarVector, Vector> {
+  using BW = BoundaryWriter<ScalarVector, Vector>;
+
 public:
   FrictionWriter(Vector const &vertexCoordinates,
                  Dune::BitSetVector<1> const &_boundaryNodes);
 
   ~FrictionWriter();
 
-  void writeKinetics(Vector const &u, Vector const &v);
   void writeOther(ScalarVector const &coefficient, ScalarVector const &alpha);
 
 private:
   std::fstream coefficientWriter;
-  std::fstream displacementWriter;
   std::fstream stateWriter;
-  std::fstream velocityWriter;
-  Dune::BitSetVector<1> const &boundaryNodes;
+  using BW::boundaryNodes;
 };
 #endif
-- 
GitLab