Commit 719ee6fb authored by Thomas Fetzer's avatar Thomas Fetzer
Browse files

[gnuplotinterface]

added possibility to pass user-defined options (in gnuplot language),
datafile separator can now be chosen, and always a gnuplot script will be
produced

[plotoverline2d.hh]
added switch to rewrite instead of append to data file, removed
superfluous tabs

[evaporationatmosphereproblem.hh]
added example for use of gnuplotinterface and plotoverline2d

reviewed by gruenich



git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@14876 2fb0f335-1f38-0410-981e-8018bf24f1b0
parent e24e4795
......@@ -24,6 +24,9 @@
*
* The data sets for a specific window have to be passed by the addDataSet function
* and then plotted by using the plot function.
*
* \todo the use of the plottingWindowNumber in each function could be replaced, but
* a new GnuplotInterface object has to be created for each plot
*/
#ifndef HAVE_GNUPLOT
......@@ -67,6 +70,8 @@ public:
xRangeMin_(0), xRangeMax_(0),
yRangeMin_(0), yRangeMax_(0),
xLabel_(0), yLabel_(0),
options_(0),
datafileSeparator_(0),
gnuplotPath_(GNUPLOT_EXECUTABLE),
terminalType_("wxt"),
numberOfGnuplotWindows_(8+1)
......@@ -83,6 +88,8 @@ public:
yRangeMax_.resize(numberOfGnuplotWindows_, -1e100);
xLabel_.resize(numberOfGnuplotWindows_, "");
yLabel_.resize(numberOfGnuplotWindows_, "");
options_.resize(numberOfGnuplotWindows_, "");
datafileSeparator_.resize(numberOfGnuplotWindows_, ' ');
}
//! \brief The destructor
......@@ -102,22 +109,26 @@ public:
const unsigned int plottingWindowNumber,
bool interaction)
{
// setting correct terminal
std::string plot = "set term ";
if (interaction)
plot += "wxt " + numberToString(plottingWindowNumber) + "\n";
else
plot += " pngcairo size 800,600\nset output \"" + title + ".png\"\n";
plot += "set yrange [" + numberToString(yRangeMin_[plottingWindowNumber])
+ ":" + numberToString(yRangeMax_[plottingWindowNumber]) + "]" + "\n";
plot += "set xrange [" + numberToString(xRangeMin_[plottingWindowNumber])
+ ":" + numberToString(xRangeMax_[plottingWindowNumber]) + "]" + "\n";
// set correct terminal and general options
std::string plot = "reset\n";
plot += "set datafile separator \'" + convertToString(datafileSeparator_[plottingWindowNumber]) + "\'\n";
plot += "set term wxt " + convertToString(plottingWindowNumber) + "\n";
if (xRangeMin_[plottingWindowNumber] < 1e100 || xRangeMax_[plottingWindowNumber] > -1e100)
{
plot += "set xrange [" + convertToString(xRangeMin_[plottingWindowNumber])
+ ":" + convertToString(xRangeMax_[plottingWindowNumber]) + "]" + "\n";
}
if (yRangeMin_[plottingWindowNumber] < 1e100 || yRangeMax_[plottingWindowNumber] > -1e100)
{
plot += "set yrange [" + convertToString(yRangeMin_[plottingWindowNumber])
+ ":" + convertToString(yRangeMax_[plottingWindowNumber]) + "]" + "\n";
}
plot += "set xlabel \"" + xLabel_[plottingWindowNumber] + "\"\n";
plot += "set ylabel \"" + yLabel_[plottingWindowNumber] + "\"\n";
// set user defined options
plot += options_[plottingWindowNumber] + "\n";
// plot curves
plot += "plot";
for (unsigned int i = 0; i < fileName_[plottingWindowNumber].size(); ++i)
......@@ -130,22 +141,28 @@ public:
plot += "\n";
}
if (!interaction)
// live plot of the results if gnuplot is installed
if (interaction)
{
std::string fileName = title + ".gp";
std::ofstream file;
file.open(fileName);
file << plot;
file.close();
}
#ifdef HAVE_GNUPLOT
executeGnuplot(plot.c_str());
executeGnuplot(plot.c_str());
#endif
}
// create a gnuplot file for output a png
plot += "\n";
plot += "set term pngcairo size 800,600\n";
plot += "set output \"" + title + ".png\"\n";
plot += "replot\n";
std::string fileName = title + ".gp";
std::ofstream file;
file.open(fileName);
file << plot;
file.close();
}
/*!
* \brief Deletes all plots from a plotting window
* \brief Deletes all plots from a plotting window and resets user-defined options
*
* \param plottingWindowNumber The ID of the specific plot
*/
......@@ -154,6 +171,7 @@ public:
fileName_[plottingWindowNumber].resize(0);
plotOptions_[plottingWindowNumber].resize(0);
plotName_[plottingWindowNumber].resize(0);
options_[plottingWindowNumber].resize(0);
}
/*!
......@@ -210,14 +228,14 @@ public:
assert(x.size() == y.size());
//write data to file
std::string fileName = numberToString(plottingWindowNumber) + "_" + plotName + ".dat";
std::string fileName = convertToString(plottingWindowNumber) + "_" + plotName + ".dat";
std::ofstream file;
file.open(fileName);
for (unsigned int i = 0; i < x.size(); i++)
{
checkNumber(x[i], "x[i] i=" + numberToString(i) + " in " + fileName);
checkNumber(y[i], "y[i] i=" + numberToString(i) + " in " + fileName);
file << x[i] << " " << y[i] << std::endl;
checkNumber(x[i], "x[i] i=" + convertToString(i) + " in " + fileName);
checkNumber(y[i], "y[i] i=" + convertToString(i) + " in " + fileName);
file << x[i] << datafileSeparator_[plottingWindowNumber] << y[i] << std::endl;
}
file.close();
......@@ -281,6 +299,30 @@ public:
yRangeMax_[plottingWindowNumber] = std::max(yRangeMax_[plottingWindowNumber], upperEnd);
}
/*!
* \brief Sets additional user-defined options
*
* \param option Additional line of option in gnuplot language
* \param plottingWindowNumber The ID of the specific plot
*/
void setOption(std::string option,
const unsigned int plottingWindowNumber)
{
options_[plottingWindowNumber] += option + "\n";
}
/*!
* \brief Sets the datafile separator
*
* \param separator The separator sign between two data columns
* \param plottingWindowNumber The ID of the specific plot
*/
void setDatafileSeparator(char separator,
const unsigned int plottingWindowNumber)
{
datafileSeparator_[plottingWindowNumber] = separator;
}
/*!
* \brief Sets the plotting style for the data sets
*
......@@ -328,11 +370,12 @@ private:
Dune::dwarn << "warning: " << text << " is infinity, adjust your data range" << std::endl;
}
// Convert number to string
template<class T> std::string numberToString(const T number) const
// Convert number or character to string
template<class T>
std::string convertToString(const T input) const
{
std::ostringstream stream;
stream << number;
stream << input;
return stream.str();
}
......@@ -347,6 +390,8 @@ private:
std::vector<Scalar> yRangeMax_;
StringVector xLabel_;
StringVector yLabel_;
StringVector options_;
std::vector<char> datafileSeparator_;
std::string gnuplotPath_;
std::string terminalType_;
const unsigned int numberOfGnuplotWindows_;
......
......@@ -99,10 +99,30 @@ public:
* so they can be read in by another program like matlab.
* The file can be found by the extension: dat
*/
DUNE_DEPRECATED_MSG("write() method has changed signature")
void write(const Problem & problem,
const GlobalPosition & pointOne,
const GlobalPosition & pointTwo,
const std::string appendOutputName = "")
{
write(problem, pointOne, pointTwo, true, appendOutputName);
}
/*!
* \brief A function that writes results over a line (like paraview's plotOverline into a text file.)
*
* The writer needs to be called in postTimeStep().
*
* This function puts output variables (TemperaturePhase, Saturation, t, tIndex, ...)
* over space (1D, over a line) into a text file,
* so they can be read in by another program like matlab.
* The file can be found by the extension: dat
*/
void write(const Problem & problem,
const GlobalPosition & pointOne,
const GlobalPosition & pointTwo,
const bool appendData,
const std::string appendOutputName = "")
{
static_assert(dim==2, "this implements plot over Line: so far this works only for 2D");
......@@ -116,6 +136,28 @@ public:
std::vector<bool> isVisited(numGlobalVerts);
std::fill(isVisited.begin(), isVisited.end(), false);
// filename of the output file
std::string fileName = problem.name();
fileName += appendOutputName;
fileName += ".dat";
std::ofstream dataFile;
const unsigned int timeStepIndex = problem.timeManager().timeStepIndex();
// Writing a header into the output
if (timeStepIndex == 0 || !appendData)
{
dataFile.open(fileName.c_str());
dataFile << "# This is a DuMuX output file for further processing with the preferred graphics program of your choice. \n";
dataFile << "# This output file was written from "<< __FILE__ << ", line " <<__LINE__ << "\n";
dataFile << "# This output file was generated from code compiled at " << __TIME__ <<", "<< __DATE__<< "\n";
dataFile << "\n";
dataFile << "# Header\n";
dataFile << "#timestep time x y Sw Tw Tn Ts xH2On xH2OnEquil xN2w xN2wEquil\n";
dataFile.close();
}
// Looping over all elements of the domain
ElementIterator eEndIt = problem.gridView().template end<0>();
for (ElementIterator eIt = problem.gridView().template begin<0>() ; eIt != eEndIt; ++eIt)
......@@ -145,31 +187,6 @@ public:
const GlobalPosition & globalPosCurrent
= fvGeometry.subContVol[scvIdx].global;
std::ofstream dataFile;
const unsigned int timeStepIndex = problem.timeManager().timeStepIndex() ;
// filename of the output file
std::string fileName = problem.name();
// filename consists of problem name + some function argument + .dat
// this way several plot overlines can be written from one simulation
fileName += appendOutputName;
fileName +=".dat";
// Writing a header into the output
if (timeStepIndex == 0)
{
dataFile.open(fileName.c_str());
dataFile << "# This is a DuMuX output file for further processing with the preferred graphics program of your choice. \n";
dataFile << "# This output file was written from "<< __FILE__ << ", line " <<__LINE__ << "\n";
dataFile << "# This output file was generated from code compiled at " << __TIME__ <<", "<< __DATE__<< "\n";
dataFile << "\n";
dataFile << "# Header\n";
dataFile << "#timestep\t time\t\t \t\t x \t\t y \t\tSw \t\t\t Tw\t\t Tn\t Ts \t xH2On \t xH2OnEquil \t xN2w \txN2wEquil\n";
dataFile.close();
}
// write output if the current location is between two specified points
if (isBetween(globalPosCurrent, pointOne, pointTwo))
{
......@@ -186,24 +203,24 @@ public:
// actual output into the text file
// This could be done much more efficiently
// if writing to the text file would be done all at once.
dataFile.open(fileName.c_str() , std::ios::app);
dataFile.open(fileName.c_str(), std::ios::app);
dataFile << timeStepIndex
<<"\t\t\t"
<<" "
<< time
<< "\t\t\t"
<< " "
<< globalPosCurrent[0]
<< "\t\t\t"
<< " "
<< globalPosCurrent[1];
dataFile <<"\t\t\t"
dataFile <<" "
<< saturationW
<<"\t\t" << Tw
<<"\t\t" << Tn
<<"\t\t" << Ts
<<"\t\t" << xH2On
<<"\t\t" << xH2OnEquil
<<"\t\t" << xN2w
<<"\t\t" << xN2wEquil
<<" " << Tw
<<" " << Tn
<<" " << Ts
<<" " << xH2On
<<" " << xH2OnEquil
<<" " << xN2w
<<" " << xN2wEquil
;
dataFile <<"\n";
dataFile.close();
......
......@@ -61,6 +61,7 @@
#include <dumux/implicit/mpnc/velomodelnewtoncontroller.hh>
#include <dumux/material/fluidsystems/h2on2fluidsystemkinetic.hh>
#include <dumux/io/gnuplotinterface.hh>
#include <dumux/io/plotoverline2d.hh>
#include <dumux/material/fluidstates/nonequilibriumfluidstate.hh>
......@@ -327,6 +328,7 @@ public:
writerDepth.write(*this,
pointDepthOne,
pointDepthTwo,
false, /* do not append data*/
"plotOverLineIntoDepth");
// Calculate storage terms of the individual phases
......@@ -358,6 +360,20 @@ public:
<<"Storage total: [" << storage << "]"
<< "\n";
}
// use gnuplot for plotting the line data
unsigned int windowNumber = 0;
gnuplot_.reset(windowNumber);
gnuplot_.setXlabel("xN2w [-]", windowNumber);
gnuplot_.setYlabel("y [m]", windowNumber);
std::ostringstream stream;
stream << this->timeManager().time();
gnuplot_.setOption("set label 'at time " + stream.str() + "' at screen 0.15,0.90 left", windowNumber);
gnuplot_.setDatafileSeparator(' ', windowNumber);
std::string fileName = outputName_ + "plotOverLineIntoDepth.dat";
gnuplot_.addFileToPlot(fileName, fileName,
windowNumber, " u 11:4 w l");
gnuplot_.plot("plot", windowNumber, true);
}
/*!
......@@ -765,6 +781,7 @@ private:
Scalar pnInjection_;
Dune::ParameterTree inputParameters_;
Scalar x_[numPhases][numComponents] ;
Dumux::GnuplotInterface<Scalar> gnuplot_;
Scalar TInject_;
......
......@@ -55,6 +55,9 @@ int main()
gnuplot.setYRange(yMin, yMax, windowNumber);
gnuplot.setXlabel("x [-]", windowNumber);
gnuplot.setYlabel("f(x) [-]", windowNumber);
gnuplot.setDatafileSeparator(',', windowNumber);
gnuplot.setOption("set arrow from 0,0 to 2,20 head filled lc rgb 'dark-gray'", windowNumber);
gnuplot.setOption("set label 'arrow' at 1,15 center tc rgb 'dark-gray'", windowNumber);
gnuplot.addDataSetToPlot(x, y, "dataSet_f(x)=x^2", windowNumber, "every 5 w lp ps 2");
gnuplot.addFunctionToPlot("x**3", "function_f(x)=x^3", windowNumber);
gnuplot.addFileToPlot("0_dataSet_f(x)=x^2.dat", "file_f(x)=x^2.dat", windowNumber);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment