/* This file is part of the OpenLB library * * Copyright (C) 2015 Albert Mink, Mathias Krause * 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 BLOCK_GIF_WRITER_HH #define BLOCK_GIF_WRITER_HH #include #include #include #include "io/blockGifWriter.h" #include "io/fileName.h" #include "utilities/vectorHelpers.h" #include "core/singleton.h" #include "communication/mpiManager.h" namespace olb { template< typename T > BlockGifWriter::BlockGifWriter(std::string const& map) : clout(std::cout, "BlockGifWriter"), _colorRange(1024), _numColors(1024), _colorMap(graphics::mapGenerators::generateMap(map)), _minValue(0), _maxValue(1) { } template< typename T > void BlockGifWriter::write(BlockF2D& f, T minValue, T maxValue, int iT, std::string const& name) { // [!] exeption image(f) != 1 if ( f.getTargetDim() != 1 ) { clout << "Error: Functor targetDim is not 1. " << std::endl; exit(-1); } else { if ( singleton::mpi().getRank() == 0 ) { std::string fullNamePpm; if ( name == "emptyName") { fullNamePpm = createFileName( singleton::directories().getImageOutDir(), f.getName(), iT); } else { fullNamePpm = createFileName( singleton::directories().getImageOutDir(), name, iT); } fullNamePpm = fullNamePpm + ".ppm" ; std::ofstream fout( fullNamePpm.c_str() ); // write header fout << "P3\n"; // dimension of image fout << f.getBlockStructure().getNx() << " " << f.getBlockStructure().getNy() << "\n"; // dynamic range fout << (_colorRange - 1) << "\n"; int i[2] = {0,0}; for (i[1] = f.getBlockStructure().getNy() - 1; i[1] >= 0; --i[1]) { for (i[0] = 0; i[0] < f.getBlockStructure().getNx(); ++i[0]) { T evaluated[1]; f(evaluated,i); // scales evaluated in [getMinValue(),getMaxValue()] to [0,1] evaluated[0] = (minValue - evaluated[0]) / (minValue - maxValue); // sets evaluated notin [getMinValue(),getMaxValue()] to 1 if ( evaluated[0] >= T(1) ) { evaluated[0] = 1; } graphics::rgb color = _colorMap.get(evaluated[0]); fout << (int)(color.r * (_colorRange - 1)) << " " << (int)(color.g * (_colorRange - 1)) << " " << (int)(color.b * (_colorRange - 1)) << "\n"; } } fout.close(); } } } template< typename T > void BlockGifWriter::write(BlockF2D& f, int iT, std::string const& name) { // determine min-/maxValue int i[2] = {0,0}; // initialize min-/maxValue T minValue[1]; T maxValue[1]; f(minValue,i); f(maxValue,i); for (i[0] = 1; i[0] < f.getBlockStructure().getNx(); i[0]++) { for (i[1] = 1; i[1] < f.getBlockStructure().getNy(); i[1]++) { T valueTmp[1]; f(valueTmp,i); if (valueTmp[0] < minValue[0]) { minValue[0] = valueTmp[0]; } if (valueTmp[0] > maxValue[0]) { maxValue[0] = valueTmp[0]; } } } if (maxValue[0] <= minValue[0]) { minValue[0] = T(); maxValue[0] = T(1); } // call write() with min-/maxValue write(f, minValue[0], maxValue[0], iT, name); } // iteration on _pointerVec is realized by function // dataArray() respective dataArrayBinary() template< typename T > void BlockGifWriter::write(int iT) { if ( _pointerVec.empty() ) { // secure code. doesn't appear on console ?? clout << "Error: Please add functor via addFunctor()"; } else { int i = 0; for ( auto it = _pointerVec.cbegin(); it != _pointerVec.cend(); ++it, ++i) { if (_autoScale[i]) { write(**it, iT, _name[i]); } else { write(**it, _minValue[i], _maxValue[i], iT, _name[i]); } } } } template< typename T > void BlockGifWriter::addFunctor(BlockF2D& f, std::string const& name) { _pointerVec.push_back(&f); if ( name == "emptyName") { _name.push_back(f.getName() ); } _name.push_back(name); _autoScale.push_back(true); _minValue.push_back(T()); _maxValue.push_back(T()); } template< typename T > void BlockGifWriter::addFunctor(BlockF2D& f, T minValue, T maxValue, std::string const& name) { _pointerVec.push_back(&f); if ( name == "emptyName") { _name.push_back(f.getName() ); } _name.push_back(name); _autoScale.push_back(false); _minValue.push_back(minValue); _maxValue.push_back(maxValue); } /// platform specific code //template //void BlockGifWriter::ppm2gif(const std::string& fullNamePpm, // const std::string& fullNameGif) //{ // std::string consoleCommand = "convert " + fullNamePpm // + " -resize 600x800^ " // + fullNameGif; // system(consoleCommand.c_str()); // consoleCommand = std::string("rm ") + fullNamePpm; // system(consoleCommand.c_str()); //} } // namespace olb #endif