/* This file is part of the OpenLB library * * Copyright (C) 2016 Fabian Klemens * E-mail contact: info@openlb.net * The most recent release of OpenLB can be downloaded at * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef GNUPLOT_WRITER_H #define GNUPLOT_WRITER_H #include #include #include namespace olb { template< typename T > class Gnuplot { public: /// Constructor with name for output files /// boolean true for real-time plotting //WARNING: experimental! Gnuplot(std::string name, bool liveplot = false); /// initialises the data file void init(); /// sets the data and plot file for two doubles (x and y) /// the plotType indicates whether the user want to plot a line graph (default = 'l') /// or e.g. a scatter plot ('p') void setData(T xValue, T yValue, std::string name = "", std::string key = "", char plotType = 'l'); /// if no x value is given, it is just an increasing integer void setData(bool noXvalue, T yValue, std::string name = "", std::string key = "", char plotType = 'l'); /// sets the data and plot file for a double and a vector of doubles (x and {y1,y2,...}) /// for each entry of the y-axis-list, a plot Type can be specified (default: line graph {'l', 'l'}) void setData(T xValue, std::vector yValues, std::vector names = {""}, std::string key = "right", std::vector plotType = {'l','l'}); /// if no x value is given, it is just an increasing integer void setData(bool noXvalue, std::vector yValues, std::vector names = {""}, std::string key = "right", const std::vector plotType = {'l','l'}); /// set labels of the plot: xLabel and yLabel void setLabel(std::string xLabel = "", std::string yLabel = ""); /// writes an PDF void writePDF(); /// writes PNGs /// usage: first argument: numbering of png file (optional), /// second argument: range for the x axis (optional) /// third argument: name the plot in order to specify a plotID in case the /// user want to create more than one plot with the simulation results /// no arguments: writes in one file with adaptive xrange and no specific name void writePNG(int iT = -1, double xRange = -1, std::string plotName = ""); private: std::string _xLabel; std::string _yLabel; std::string _name; bool _liveplot; std::string _type; std::string _dataFile; std::string _dir; std::vector _names; std::string _key; /// plotType vector stores the type of the plot the user wants to create /// (e.g. 'l' line graph (default) or 'p' scatterplot) std::vector _plotTypes; bool _init = true; unsigned int _dataSize = 0; int _iT = -1; double _xRange = -1; T _time = 0.; int _rank = 0; /// writes a plot file for type {"plot", "png", "pdf") void writePlotFile(std::string type, std::string plotName = ""); /// writes the data file for two doubles (x and y) void writeDataFile(T xValue, T yValue); /// writes the data file for one double and a vector of doubles (x and y1,y2,...) void writeDataFile(T xValue, std::vector yValues); protected: /// system command to start gnuplot (LINUX ONLY!) void startGnuplot(std::string plotFile, std::string plotName = ""); }; } // namespace olb #endif