From 8b15634fa87aa8686bc50864b4173cdfdbd0bf36 Mon Sep 17 00:00:00 2001
From: Bruno Turcksin <bruno.turcksin@gmail.com>
Date: Sun, 2 Jun 2019 18:50:47 -0400
Subject: [PATCH] Add function to print vector in a format readable by numpy

---
 include/deal.II/lac/la_vector.h           | 14 +++++++++++++-
 include/deal.II/lac/la_vector.templates.h | 20 ++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/include/deal.II/lac/la_vector.h b/include/deal.II/lac/la_vector.h
index be07fcaa10..3002f7d5a7 100644
--- a/include/deal.II/lac/la_vector.h
+++ b/include/deal.II/lac/la_vector.h
@@ -344,7 +344,7 @@ namespace LinearAlgebra
     locally_owned_elements() const override;
 
     /**
-     * Prints the vector to the output stream @p out.
+     * Print the vector to the output stream @p out.
      */
     virtual void
     print(std::ostream &     out,
@@ -352,6 +352,18 @@ namespace LinearAlgebra
           const bool         scientific = true,
           const bool         across     = true) const override;
 
+    /**
+     * Print the vector to the output stream @p out in a format that can be
+     * read by numpy::readtxt(). Note that the IndexSet is not printed but only
+     * the values stored in the Vector. To load the vector in python just do
+     * <code>
+     * vector = numpy.loadtxt('my_vector.txt')
+     * </code>
+     */
+    void
+    print_numpy_array(std::ostream &     out,
+                      const unsigned int precision = 9) const;
+
     /**
      * Write the vector en bloc to a file. This is done in a binary mode, so
      * the output is neither readable by humans nor (probably) by other
diff --git a/include/deal.II/lac/la_vector.templates.h b/include/deal.II/lac/la_vector.templates.h
index 6d1aacedc0..5d510a5125 100644
--- a/include/deal.II/lac/la_vector.templates.h
+++ b/include/deal.II/lac/la_vector.templates.h
@@ -560,6 +560,26 @@ namespace LinearAlgebra
 
 
 
+  template <typename Number>
+  void
+  Vector<Number>::print_numpy_array(std::ostream &     out,
+                                    const unsigned int precision) const
+  {
+    AssertThrow(out, ExcIO());
+    boost::io::ios_flags_saver restore_flags(out);
+
+    out.precision(precision);
+
+    const unsigned int n_elements = this->n_elements();
+    for (unsigned int i = 0; i < n_elements; ++i)
+      out << this->values[i] << ' ';
+    out << '\n' << std::flush;
+
+    AssertThrow(out, ExcIO());
+  }
+
+
+
   template <typename Number>
   void
   Vector<Number>::block_write(std::ostream &out) const
-- 
2.39.5