/* This file is part of the OpenLB library * * Copyright (C) 2017 Marc Haussmann * 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_HEATMAP_WRITER_HH #define GNUPLOT_HEATMAP_WRITER_HH #include #include #include #include "core/singleton.h" #include "io/fileName.h" #include "gnuplotHeatMapWriter.h" #include "utilities/vectorHelpers.h" namespace olb { namespace heatmap { template void write(BlockReduction3D2D& blockReduction, int iT, const plotParam param) { detail::genericHeatMapInterface(blockReduction, blockReduction, iT, param); } template void write(BlockReduction2D2D& blockReduction, int iT, const plotParam param) { detail::genericHeatMapInterface(blockReduction.getPlaneDiscretizationIn3D(), blockReduction, iT, param); } namespace detail { template void genericHeatMapInterface(const HyperplaneLattice3D& hyperPlane, BlockF2D& blockData, int iT, const plotParam& plot) { if ( blockData.getTargetDim() != 1 ) { std::cout << "HeatMap Error: Functor targetDim is not 1. " << std::endl; exit(-1); } else { if ( singleton::mpi().getRank() == 0 ) { detail::detailParam param; param.plot = &plot; param.blockData = &blockData; param.hyperPlane = &hyperPlane; param.dir = singleton::directories().getImageOutDir(); param.quantityname = param.blockData->getName(); param.quantityname.erase (param.quantityname.begin(), param.quantityname.begin()+15); param.quantityname.pop_back(); std::string name; if (plot.name == "") { name = param.quantityname; } else { name = plot.name; } param.matrixPath = param.dir + "data/" + name + ".matrix"; param.csvPath = createFileName( param.dir + "data/", name, iT) + ".csv"; param.jpegPath = createFileName( param.dir, name, iT) + ".jpeg"; param.pngPath = createFileName( param.dir, name, iT) + ".png"; param.plotFilePath = param.dir + "data/heatMap"+name+".p"; for (size_t pos = 0; pos < param.plotFilePath.length(); pos++) { if (param.plotFilePath.at(pos) == '(' || param.plotFilePath.at(pos) == ')') { param.plotFilePath.replace(pos, 1, ""); } } param.nx = param.hyperPlane->getNx(); param.ny = param.hyperPlane->getNy(); param.spacing = param.hyperPlane->getPhysSpacing(); param.origin = param.hyperPlane->getPhysOrigin(); param.normal = crossProduct3D(param.hyperPlane->getVectorU(),param.hyperPlane->getVectorV()); param.zoomMin = plot.zoomOrigin; param.zoomMax = plot.zoomOrigin + plot.zoomExtend; param.iT = iT; writeHeatMapDataFile(param); writeHeatMapPlotFile(param); executeGnuplot(param); } } return; } template void writeHeatMapDataFile(detailParam& param) { std::ofstream foutMatrix( param.matrixPath.c_str() ); int i[2] = {0,0}; for (i[1] = param.ny * param.zoomMin[1]; i[1] < param.ny * param.zoomMax[1]; i[1]++) { for (i[0] = param.nx * param.zoomMin[0]; i[0] < param.nx * param.zoomMax[0]; i[0]++) { T evaluated[1]; (*param.blockData)(evaluated,i); foutMatrix << evaluated[0] << " "; if (i[0] == int(param.nx * param.zoomMax[0]) - 1) { foutMatrix << "\n"; } } } foutMatrix.close(); if (param.plot->writeCSV) { std::ofstream foutCSV( param.csvPath.c_str() ); for (i[1] = 0; i[1] < param.ny; i[1]++) { for (i[0] = 0; i[0] < param.nx; i[0]++) { T evaluated[1]; Vector physPoint = param.hyperPlane->getPhysR(i[0], i[1]); (*param.blockData)(evaluated,i); foutCSV << physPoint[0] << " " << physPoint[1] << " " << physPoint[2] << " " << evaluated[0] << "\n"; } } foutCSV.close(); } return; } template void writeHeatMapPlotFile(detailParam& param) { std::ofstream fout; fout.open(param.plotFilePath.c_str(), std::ios::trunc); fout << "if (strstrt(GPVAL_TERMINALS, 'jpeg') > 0) {"; fout << "set terminal jpeg " << "size " << 1920 << "," << 1080 << "font \",25\"" << "\n"; fout << "set output '"<< param.jpegPath << "'"<< "\n"; fout << "} else {"; fout << "set terminal png " << "size " << 1920 << "," << 1080 << "font \",25\"" << "\n"; fout << "set output '"<< param.pngPath << "'"<< "\n"; fout << "}" << "\n"; fout << "set pm3d map" << "\n"; fout << "unset key" << "\n"; fout << "set size ratio -1" << "\n"; fout << "set size 0.925,1.0" << "\n"; fout << "set xtics out" << "\n"; fout << "set ytics out" << "\n"; fout << "set xtics nomirror" << "\n"; fout << "set ytics nomirror" << "\n"; fout << "set pm3d interpolate 0,0" << "\n"; fout << "set colorbox vertical user origin 0.85,0.1 size 0.025 ,0.8" << "\n"; if ( util::nearZero(param.normal[0]) && util::nearZero(param.normal[1]) ) { fout << "set xlabel \"x-axis in m \"" << "\n" << "set ylabel \"y-axis in m \"" << "\n"; } else if ( util::nearZero(param.normal[0]) && util::nearZero(param.normal[2]) ) { fout << "set xlabel \"x-axis in m \"" << "\n" << "set ylabel \"z-axis in m \"" << "\n"; param.origin[1] = param.origin[2]; } else if ( util::nearZero(param.normal[1]) && util::nearZero(param.normal[2]) ) { fout << "set xlabel \"y-axis in m \"" << "\n" << "set ylabel \"z-axis in m \"" << "\n"; param.origin[0] = param.origin[1]; param.origin[1] = param.origin[2]; } else { fout << "set xlabel \"width in m \"" << "\n" << "set ylabel \"height in m \"" << "\n"; } if (param.plot->contourlevel > 0) { fout << "set contour base" << "\n"; fout << "set cntrparam levels " << param.plot->contourlevel << "\n"; fout << "set cntrparam bspline" << "\n"; fout << "do for [i=1:"<< param.plot->contourlevel <<"] {" << "\n"; fout << "set linetype i lc rgb \"black\""<< "\n"; fout << "}" << "\n"; } fout << "set cblabel offset 0.5 \"" <maxValue - param.plot->minValue)) { fout << "set cbrange [" << param.plot->minValue << ":" << param.plot->maxValue <<"]" << "\n"; } fout << "set autoscale fix" << "\n"; if (param.plot->colour == "grey") { fout << "set palette grey" << "\n"; } else if (param.plot->colour == "pm3d") { } else if (param.plot->colour == "blackbody") { fout << "set palette defined ( 0 \"black\", 1 \"red\", 2 \"yellow\")" << "\n"; } else { fout << "set palette defined ( 0 \"blue\", 1 \"green\", 2 \"yellow\", 3 \"orange\", 4 \"red\" )" << "\n"; } fout << "splot '" << param.matrixPath << "' u ($1*" << param.spacing << "+" << param.origin[0] + int(param.nx * param.zoomMin[0])*param.spacing << "):" << "($2*" << param.spacing << "+" << param.origin[1] + int(param.ny * param.zoomMin[1])*param.spacing <<"):3 matrix with pm3d" << "\n"; fout.close(); return; } template< typename T > void executeGnuplot(detailParam& param) { #ifdef WIN32 std::cout << "GNUPLOT WORKS ONLT WITH LINUX" << std::endl; // exit (EXIT_FAILURE); return; #endif #ifndef WIN32 if (!system(nullptr)) { exit (EXIT_FAILURE); } const std::string command = "gnuplot "+ param.plotFilePath +" > /dev/null &"; if ( system(command.c_str()) ) { std::cout << "Error at GnuplotWriter" << std::endl; } return; #endif } } // namespace detail } // namespace heatmap } // namespace olb #endif