/** * @file several_points.cpp * @author Christian Laguerre (2012-2017) * @version 1.07.01 * @date 2017-02-16 * * @brief Saving several specific points * @details * %Output format: * optimized for %Gnuplot (for hu_specific_points.dat). * * @copyright License Cecill-V2 \n * * * (c) CNRS - Universite d'Orleans - BRGM (France) */ /* * * This file is part of FullSWOF_2D software. * * * FullSWOF_2D = Full Shallow-Water equations for Overland Flow, * in two dimensions of space. * This software is a computer program whose purpose is to compute * solutions for 2D Shallow-Water equations. * * LICENSE * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * . * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * ******************************************************************************/ #include "several_points.hpp" Several_points::Several_points(Parameters & par):Save_specific_points(par){ /** * @details * Writes the header of the file 'hu_specific_points.dat'. * @param[in] par parameter, contains all the values from the parameters file. * @warning ***: ERROR: Impossible to open the *** file. Verify if the directory *** exists. * @warning ***: WARNING: line *** ; a commentary should begin with the # symbol. * @note If hu_specific_points.dat cannot be opened, the code will exit with failure termination code. */ /** x coordinate of the specific point to be saved.*/ SCALAR x_coord; /** y coordinate of the specific point to be saved.*/ SCALAR y_coord; /** Name of file containing the list of the specific points.*/ list_point_namefile = par.get_list_pointNameFile(); //Opening the file and verification if it exists. ifstream getlist_point(list_point_namefile.c_str(),ios::in); if (!getlist_point){ //The input file cannot be opened. cerr << list_point_namefile << ": ERROR: cannot open the file. " << endl; exit(EXIT_FAILURE); } string line;// string to store a line of the input file int num_lin=0; //iterator char car;//First character of a commentary line // As long as the end of the file is not reached, the next line is read. while (!getlist_point.eof()){ num_lin++; getline (getlist_point, line, '\n'); // read a line istringstream entree (line); if (entree >> x_coord >> y_coord) { if(!par.is_coord_in_file_valid(x_coord,y_coord,num_lin,list_point_namefile.c_str())){ exit(EXIT_FAILURE); } list_points_x.push_back(x_coord); list_points_y.push_back(y_coord); } else{ car='#'; //Initialization of the character used to identity the beginning of a comment istringstream entree_car (line); entree_car >> car; if (car != '#'){ cerr << list_point_namefile << ": WARNING: line "<< num_lin <<"; a commentary should begin with the # symbol " < file_one_point.txt"<< endl; outsave << "################################################################################"<< endl; outsave << "# time " << "\t" << "(i-0.5)*dx " << "\t"<< setw(9) << "(j-0.5)*dy" << "\t"<< setw(9) << " h[i][j] " << "\t"<< setw(9) << " u[i][j] " << "\t"<< setw(9) << "v[i][j]" << endl; outsave << "# " << endl; outsave.close(); } void Several_points::save(const TAB & h, const TAB & u, const TAB & v, const SCALAR time){ /** * @details * Writes the values of Scheme#h, Scheme#u (=q1/h), Scheme#v (=q2/h), Scheme#h+ Scheme#z (free surface), * Scheme#z, \f$ |U| = \sqrt{u^2+v^2}\f$, the Froude number \f$ \frac{|U|}{\sqrt{gh}}\f$, Scheme#q1, Scheme#q2, * and \f$ h|U|\f$ at the current time in "hu_specific_points.dat". \n * If the water height is too small, we replace it by 0, the velocity is null and the Froude number does not exist. * @param[in] h the water height. * @param[in] u first component of the velocity. * @param[in] v second component of the velocity. * @param[in] time the current time. */ if (time >= T_output){ // If the user does not want to save each time step, // We save the first time after the time step written in parameters.txt file ofstream outsave(namefile.c_str(),ios::app); #ifdef DEBUG outsave.precision(10); #endif for (int i=0;i<(int)list_points_x.size();i++){ //We compute the index of the array from the space variable in the input file. row=(int)ceil(list_points_x[i]/DX); column=(int)ceil(list_points_y[i]/DY); //The index corresponds to the smallest integer superior or equal to x/dx or y/dy. if (h[row][column]