12#ifndef __H__UG__PLUGINS__D3F__FS_MEASUREMENT
13#define __H__UG__PLUGINS__D3F__FS_MEASUREMENT
30template<
class TDomain,
class TAlgebra>
33template<
class TDomain,
class TAlgebra>
44 return m_parent.get()->on_finished(u, step, time, dt);
57template<
class TDomain,
class TAlgebra>
62 static const int dim = TDomain::dim;
81 virtual void output(
const std::vector<t_pnt_data>& measurementPoints,
int step,
number time) { };
95 void output(
const std::vector<t_pnt_data>& measurementPoints,
int step,
number time)
override
97 std::cout <<
"---------- FS Height --------" << std::endl;
98 for (
auto& pnt : measurementPoints)
101 for (
size_t i = 0; i <
dim-1; i++ )
103 std::cout << pnt.xy[i];
109 std::cout <<
") \t " << time <<
"\t";
116 std::cout <<
" - " << pnt.z_spec-pnt.z;
121 std::cout <<
"not valid";
129 std::cout << std::endl;
131 std::cout <<
"-----------------------------" << std::endl;
149 std::fstream output_file;
150 output_file.open(
m_outputfilename.c_str(), std::fstream::trunc | std::fstream::out);
154 for (
size_t i = 0; i <
dim-1; i++ )
156 output_file <<
"dim" << i <<
m_delim;
161 output_file <<
m_delim <<
"difference";
163 output_file << std::endl;
168 void output(
const std::vector<t_pnt_data>& measurementPoints,
int step,
number time)
override
170 std::fstream output_file;
171 output_file.open(
m_outputfilename.c_str(), std::fstream::app | std::fstream::out);
172 output_file.precision(15);
175 for (
auto& pnt : measurementPoints)
178 for (
size_t i = 0; i <
dim-1; i++ )
180 output_file << pnt.xy[i] <<
m_delim;
184 output_file << pnt.z;
189 output_file <<
"NaN";
194 if(pnt.valid && pnt.z_given)
195 output_file <<
m_delim << pnt.z_spec-pnt.z;
197 output_file <<
m_delim <<
"NaN";
200 output_file << std::endl;
208 std::fstream output_file;
209 output_file.open(
m_outputfilename.c_str(), std::fstream::app | std::fstream::out);
211 for (
size_t i = 0; i <
dim-1; i++ )
220 output_file << std::endl;
236 void output(
const std::vector<t_pnt_data>& measurementPoints,
int step,
number time)
override
239 std::ostringstream oss;
240 oss << std::setw(8) << std::setfill(
'0') << step;
244 std::fstream output_file;
245 output_file.open(filename.c_str(), std::fstream::trunc | std::fstream::out);
246 output_file.precision(15);
248 for (
auto& pnt : measurementPoints)
250 for (
size_t j = 0; j <
dim - 1; j++)
251 output_file << pnt.xy[j] <<
m_delim;
253 output_file << pnt.z;
255 output_file <<
"nAn";
258 output_file <<
m_delim << pnt.z_spec;
262 output_file <<
m_delim << pnt.z - pnt.z_spec;
264 output_file <<
m_delim <<
"nAn";
267 output_file << std::endl;
288 TableOutput(
const std::vector<t_pnt_data>& measurementPoints, std::string filename, std::string delimiter,
bool output_difference, std::string& title)
292 if (filename.find(
".csv") == std::string::npos)
297 std::fstream output_file;
298 output_file.open(
m_outputfilename.c_str(), std::fstream::trunc | std::fstream::out);
300 if (title.length () != 0)
301 output_file <<
"# " << title << std::endl;
303 for (
size_t k = 0; k <
dim - 1; k++)
305 output_file <<
"# ----" +
m_delim +
"----";
306 for (
size_t i = 0; i < measurementPoints.size (); i++)
308 const t_pnt_data & pnt = measurementPoints[i];
311 output_file << std::endl;
313 output_file <<
"# step" +
m_delim +
"time";
314 for (
size_t i = 0; i < measurementPoints.size (); i++)
316 const t_pnt_data & pnt = measurementPoints[i];
320 output_file <<
m_delim <<
"----";
322 output_file << std::endl;
327 void output(
const std::vector<t_pnt_data>& measurementPoints,
int step,
number time)
override
329 std::fstream output_file;
330 output_file.open(
m_outputfilename.c_str(), std::fstream::app | std::fstream::out);
331 output_file.precision(15);
333 for (
size_t i = 0; i < measurementPoints.size (); i++)
336 const t_pnt_data & pnt = measurementPoints[i];
338 output_file << pnt.
z;
340 output_file <<
"nAn";
341 output_file << std::endl;
363 if (filename.find(
".bin") == std::string::npos)
368 std::fstream bin_output_file;
369 bin_output_file.open(
m_outputfilename.c_str(), std::fstream::trunc | std::fstream::out | std::fstream::binary);
371 bin_output_file.write((
char *)&toWrite,
sizeof(
int));
372 bin_output_file.close();
375 void output(
const std::vector<t_pnt_data>& measurementPoints,
int step,
number time)
override
377 std::fstream bin_output_file;
378 bin_output_file.open(
m_outputfilename.c_str(), std::fstream::app | std::fstream::out | std::fstream::binary);
380 for (
auto& pnt : measurementPoints)
383 bin_output_file.write(&toWrite,
sizeof(
char));
384 bin_output_file.write((
char*)&step,
sizeof(int));
385 bin_output_file.write((
char*)&time,
sizeof(
number));
387 for (
size_t i = 0; i <
dim-1; i++ )
389 bin_output_file.write((
char*)&pnt.xy[i],
sizeof(
number));
393 bin_output_file.write((
char*)&pnt.z,
sizeof(
number));
397 bin_output_file.write((
char*)&NaN,
sizeof(
number));
403 if(pnt.valid && pnt.z_given)
405 number diff = pnt.z_spec-pnt.z;
406 bin_output_file.write((
char*)&diff,
sizeof(
number));
412 bin_output_file.write((
char*)&NaN,
sizeof(
number));
417 bin_output_file.close();
422 std::fstream bin_output_file;
423 bin_output_file.open(
m_outputfilename.c_str(), std::fstream::app | std::fstream::out | std::fstream::binary);
425 bin_output_file.write(&toWrite,
sizeof(
char));
426 bin_output_file.close();
465 std::string filename = std::string(output_filename);
467 if (filename.find(
".csv") == std::string::npos)
468 filename = filename +
".csv";
482 std::string filename = std::string(output_filename);
485 if (filename.find(
".tsv") == std::string::npos)
486 filename = filename +
".tsv";
538 if (measurement_interval < 1)
540 std::cout <<
"FSFileMeasurer: Illegal measurement interval " << measurement_interval << std::endl;
549 UG_COND_THROW (full_file_name.empty (),
"FSFileMeasurer: Coulnd't locate file '" << filename <<
"'.");
551 std::ifstream input (full_file_name.c_str (), std::ifstream::in);
552 UG_COND_THROW (input.fail (),
"FSFileMeasurer: Cannot open data file '" << full_file_name <<
"' for input!");
554 std::string input_line;
555 std::istringstream line_stream;
557 line_stream.exceptions (std::istream::failbit | std::istream::badbit);
559 while (! input.eof ())
561 std::vector<number>
xy(
dim-1);
565 UG_THROW (
"FSFileMeasurer: Could not load the points from the file!");
566 std::getline (input, input_line);
567 if (input_line.length () == 0)
571 line_stream.str (input_line);
572 line_stream.clear ();
573 for (
size_t i = 0; i <
dim-1; i++)
574 line_stream >>
xy[i];
575 if (includesExpectedZ)
576 line_stream >> z_spec;
578 catch (std::istream::failure & e)
580 UG_THROW (
"FSFileMeasurer: Failed to parse line '" << input_line <<
"' in the input file.");
583 if(includesExpectedZ)
593 if(point.size() != TDomain::dim-1 && point.size() != TDomain::dim)
595 std::cout <<
"FSFileMeasurer: free surface measurement point does not have correct dimension " << TDomain::dim-1 <<
" or " << TDomain::dim <<
", if z is given, ignoring!" << std::endl;
601 for(
int i = 0; i < TDomain::dim-1; i++)
606 if(point.size() == TDomain::dim)
619 if(point.size() != TDomain::dim-1)
621 std::cout <<
"FSFileMeasurer: free surface measurement point does not have correct dimension " << TDomain::dim-1 <<
", ignoring!" << std::endl;
627 for(
int i = 0; i < TDomain::dim-1; i++)
651 outputAdapter->finish();
681 loc_z[i] = - std::numeric_limits<number>::max ();
688 if (z_val != - std::numeric_limits<number>::max ())
parameterString p
Definition Biogas.lua:1
function util d3f parse FSFileMeasurer(luaobj, levelfunction, cmp, zeroval)
size_t allreduce(const size_t &t, pcl::ReduceOperation op) const
Definition fs_measurement.hpp:359
BinaryOutput(std::string filename, bool output_difference)
Definition fs_measurement.hpp:361
void output(const std::vector< t_pnt_data > &measurementPoints, int step, number time) override
Definition fs_measurement.hpp:375
bool m_outputDifference
Definition fs_measurement.hpp:431
std::string m_outputfilename
Definition fs_measurement.hpp:430
void finish() override
Definition fs_measurement.hpp:420
Definition fs_measurement.hpp:143
std::string m_outputfilename
Definition fs_measurement.hpp:225
void output(const std::vector< t_pnt_data > &measurementPoints, int step, number time) override
Definition fs_measurement.hpp:168
bool m_outputDifference
Definition fs_measurement.hpp:226
CSVOutput(std::string filename, std::string delimiter, bool output_difference)
Definition fs_measurement.hpp:145
void finish() override
Definition fs_measurement.hpp:206
std::string m_delim
Definition fs_measurement.hpp:224
Definition fs_measurement.hpp:79
virtual void finish()
Definition fs_measurement.hpp:82
virtual void output(const std::vector< t_pnt_data > &measurementPoints, int step, number time)
Definition fs_measurement.hpp:81
virtual ~IOutputAdapter()
Definition fs_measurement.hpp:83
Definition fs_measurement.hpp:88
void finish() override
Definition fs_measurement.hpp:134
ShellOutput(bool output_difference, std::string &title)
Definition fs_measurement.hpp:90
bool m_outputDifference
Definition fs_measurement.hpp:138
std::string & m_title
Definition fs_measurement.hpp:139
void output(const std::vector< t_pnt_data > &measurementPoints, int step, number time) override
Definition fs_measurement.hpp:95
Definition fs_measurement.hpp:230
bool m_outputDifference
Definition fs_measurement.hpp:281
std::string m_outputfilename
Definition fs_measurement.hpp:280
std::string m_delim
Definition fs_measurement.hpp:279
void output(const std::vector< t_pnt_data > &measurementPoints, int step, number time) override
Definition fs_measurement.hpp:236
StepFileOutput(std::string filename, std::string delimiter, bool output_difference)
Definition fs_measurement.hpp:232
void finish() override
Definition fs_measurement.hpp:274
Definition fs_measurement.hpp:286
bool m_outputDifference
Definition fs_measurement.hpp:355
TableOutput(const std::vector< t_pnt_data > &measurementPoints, std::string filename, std::string delimiter, bool output_difference, std::string &title)
Definition fs_measurement.hpp:288
std::string m_delim
Definition fs_measurement.hpp:353
void finish() override
Definition fs_measurement.hpp:348
void output(const std::vector< t_pnt_data > &measurementPoints, int step, number time) override
Definition fs_measurement.hpp:327
std::string m_outputfilename
Definition fs_measurement.hpp:354
Definition fs_measurement.hpp:35
SmartPtr< measurer_type > m_parent
Definition fs_measurement.hpp:48
FSFileMeasurer< TDomain, TAlgebra > measurer_type
Definition fs_measurement.hpp:37
bool step_process(SmartPtr< grid_function_type > u, int step, number time, number dt)
Definition fs_measurement.hpp:42
FSFileMeasurerFinishedObserver(SmartPtr< measurer_type > parent)
Definition fs_measurement.hpp:40
GridFunction< TDomain, TAlgebra > grid_function_type
Definition fs_measurement.hpp:36
Definition fs_measurement.hpp:59
void set_title_text(const char *text)
Definition fs_measurement.hpp:448
ug::GridFunction< TDomain, TAlgebra > grid_function_type
Definition fs_measurement.hpp:436
void add_measurement_point(std::vector< number > point, number specified_z)
Definition fs_measurement.hpp:617
void enable_csv_output(const char *output_filename)
Definition fs_measurement.hpp:458
void add_measurement_point(std::vector< number > point)
Definition fs_measurement.hpp:591
FSFileMeasurer(SmartPtr< grid_function_type > lsf, const char *cmp, number zero)
Definition fs_measurement.hpp:443
void enable_difference_output(bool differenceOutput)
Definition fs_measurement.hpp:453
void enable_step_file_output(const char *output_filename)
Definition fs_measurement.hpp:503
void enable_tsv_output(const char *output_filename)
Definition fs_measurement.hpp:474
void enable_print_output()
Definition fs_measurement.hpp:525
void set_measurement_interval(int measurement_interval)
Definition fs_measurement.hpp:536
void enable_binary_output(const char *output_filename)
Definition fs_measurement.hpp:514
std::vector< t_pnt_data > m_measurement_points
Definition fs_measurement.hpp:712
virtual bool step_process(SmartPtr< grid_function_type > u, int step, number time, number dt)
Definition fs_measurement.hpp:657
int m_measurement_interval
Definition fs_measurement.hpp:714
bool m_outputDifference
Definition fs_measurement.hpp:716
std::string m_titleText
Definition fs_measurement.hpp:717
void read_measurement_points(const char *filename, bool includesExpectedZ)
Definition fs_measurement.hpp:545
static const int dim
Definition fs_measurement.hpp:62
FSFileMeasurer(SmartPtr< grid_function_type > lsf)
Definition fs_measurement.hpp:438
std::vector< SmartPtr< IOutputAdapter > > m_output_adapters
Definition fs_measurement.hpp:713
bool on_finished(SmartPtr< grid_function_type > u, int step, number time, number dt)
Definition fs_measurement.hpp:642
void enable_table_output(const char *output_filename)
Definition fs_measurement.hpp:492
SmartPtr< FSFileMeasurerFinishedObserver< TDomain, TAlgebra > > get_finished_observer()
Definition fs_measurement.hpp:635
ug::d3f::LSPositionZ< grid_function_type > m_height_measurer
Definition fs_measurement.hpp:715
Definition level_set_pos.h:48
std::string FindFileInStandardPaths(const char *filename)
#define UG_COND_THROW(cond, msg)
SmartPtr< T, FreePolicy > make_sp(T *inst)
type of point data
Definition fs_measurement.hpp:66
t_pnt_data(MathVector< dim-1 > &the_xy, number the_z_spec, bool if_z_given)
Definition fs_measurement.hpp:74
bool valid
if not computed or the level set is not covered by the top surface
Definition fs_measurement.hpp:72
number z
computed value of the z-coordiate
Definition fs_measurement.hpp:68
MathVector< dim-1 > xy
low-dim coordinate of the point
Definition fs_measurement.hpp:67
bool z_given
iff z is specified
Definition fs_measurement.hpp:70
number z_spec
expected value of z-coordinate
Definition fs_measurement.hpp:69