1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2020 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 
18 
19 
20 #ifndef LIBMESH_GNUPLOT_IO_H
21 #define LIBMESH_GNUPLOT_IO_H
22 
23 // Local includes
24 #include "libmesh/mesh_output.h"
25 
26 // C++ includes
27 #include <cstddef>
28 
29 
30 namespace libMesh
31 {
32 
33 // forward declaration
34 class MeshBase;
35 
36 /**
37  * This class implements writing meshes using GNUplot, designed for
38  * use only with 1D meshes.
39  *
40  * \author David Knezevic
41  * \date 2005
42  */
43 class GnuPlotIO : public MeshOutput<MeshBase>
44 {
45 public:
46 
47   /**
48    * Define enumerations to set plotting properties on construction
49    */
50   enum PlottingProperties { GRID_ON    = 1,
51                             PNG_OUTPUT = 2};
52 
53   /**
54    * Constructor.  Takes a reference to a constant mesh object.
55    * To set the properties, we input a bitwise OR of the
56    * GnuPlotIO::PlottingProperties enumerations,
57    * e.g. GnuPlotIO::GRID_ON | GnuPlotIO::PNG_OUTPUT
58    */
59   explicit
60   GnuPlotIO (const MeshBase &,
61              const std::string & = std::string("FE 1D Solution"),
62              int properties=0);
63 
64   /**
65    * Write the mesh to the specified file.
66    */
67   virtual void write(const std::string &) override;
68 
69   /**
70    * Bring in base class functionality for name resolution and to
71    * avoid warnings about hidden overloaded virtual functions.
72    */
73   using MeshOutput<MeshBase>::write_nodal_data;
74 
75   /**
76    * This method implements writing a mesh with nodal data to a
77    * specified file where the nodal data and variable names are provided.
78    */
79   virtual void write_nodal_data (const std::string &,
80                                  const std::vector<Number> &,
81                                  const std::vector<std::string> &) override;
82 
83   /**
84    * Set title of plot
85    */
set_title(const std::string & title)86   void set_title(const std::string & title) { _title = title; }
87 
88   /**
89    * Turn grid on or off.
90    */
use_grid(bool grid)91   void use_grid(bool grid) { _grid = grid; }
92 
93 
94   /**
95    * Write output to a .png file using gnuplot
96    */
set_png_output(bool png_output)97   void set_png_output(bool png_output) { _png_output = png_output; }
98 
99   /**
100    * GNUplot automatically adjusts the x and y-axes of 2D plots
101    * to "zoom in" on the data.  You can set this string to force
102    * GNUplot to maintain a fixed set of axes.
103    * Example: axes_limits = "[0:1] [0:1]" would force x and y
104    * to be plotted on the range 0<=x<=1 and 0<=y<=1 regardless
105    * of where the data lie.
106    */
107   std::string axes_limits;
108 
109 private:
110   /**
111    * This method implements writing a mesh with nodal data to a
112    * specified file where the nodal data and variable names are optionally
113    * provided.  This will write an ASCII file.
114    */
115   void write_solution (const std::string &,
116                        const std::vector<Number> * = nullptr,
117                        const std::vector<std::string> * = nullptr);
118 
119   std::string _title;
120 
121   bool _grid;
122   bool _png_output;
123 };
124 
125 } // namespace libMesh
126 
127 
128 #endif // LIBMESH_GNUPLOT_IO_H
129