Plugins
Loading...
Searching...
No Matches
fs_equilibirum_finished_condition.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Gesellschaft fuer Anlagen- und Reaktorsicherheit gGmbH
3 * SPDX-License-Identifier: EUPL-1.2
4 * SPDX-FileContributor: Tim Schoen
5 * SPDX-FileContributor: Goethe Universität Frankfurt
6 * SPDX-FileType: SOURCE
7 *
8 * This file is part of d3f++.
9 * d3f++ is an extension for UG4. Licensing information and citation requirements of UG4 are provided in LICENSES/UG4-LGPL_2.1
10 */
11
12
13
14#ifndef __H__UG__PLUGINS__D3F__FS_EQUIBILIRIUM_FINISHED_CONDITION
15#define __H__UG__PLUGINS__D3F__FS_EQUIBILIRIUM_FINISHED_CONDITION
16
17
18#include "level_set_pos.h"
21#include <fstream>
22#include <cmath>
23
24#ifdef UG_PARALLEL
25#include "pcl/pcl_base.h"
27#endif
28
29namespace ug {
30
31
32template<class TDomain, class TAlgebra>
34{
35 private:
36
37
38 static const int dim = TDomain::dim;
41 {
44
45 bool valid;
46
48 : xy (the_xy), z (0), valid (false) {};
49 };
50
51
52 public:
53
55
61
62 void set_equilibrium_factor(number equilibrium_factor)
63 {
64 m_equilibrium_factor = equilibrium_factor;
65 }
66
67 bool check_finished(number time, int step)
68 {
69 bool finished = false;
70
71 #ifdef UG_PARALLEL
72 if(pcl::ProcRank() == 0)
73 {
74 #endif
75
76 if(m_last_measurement.size() == 0)
77 {
78 // no measurement has happenend yet
79 std::cout << "FSInEquilibriumFinishedCondition: no measurement has happenend yet" << std::endl;
80 finished = false;
81 }
82 else if(m_max_change == 0)
83 {
84 std::cout << "FSInEquilibriumFinishedCondition: max_change is 0" << std::endl;
85 finished = false;
86 }
87 else
88 {
89 std::cout << "FSInEquilibriumFinishedCondition: factor is " << m_last_change << " / " << m_max_change << " = " << m_last_change/m_max_change << std::endl;
91 }
92
93
94 #ifdef UG_PARALLEL
95 }
97 proc_comm.broadcast(finished, 0);
98
99 #endif
100
101
102 return finished;
103 }
104
105 void add_measurement_point(std::vector<number> point)
106 {
107 if(point.size() != TDomain::dim-1)
108 {
109 std::cout << "FSInEquilibriumFinishedCondition: free surface measurement point does not have correct dimension " << TDomain::dim-1 << ", ignoring!" << std::endl;
110 return;
111 }
112
113 MathVector<dim-1> p;
114
115 for(int i = 0; i < TDomain::dim-1; i++)
116 {
117 p[i] = point[i];
118 }
119
121
122 }
123
124 virtual bool step_process(SmartPtr<grid_function_type> u, int step, number time, number dt)
125 {
126
127 m_height_measurer.reinit();
128
129 #ifndef UG_PARALLEL
130
131 for (size_t i = 0; i < m_measurement_points.size (); i++)
132 {
134 pnt.valid = m_height_measurer.get_height_at (pnt.xy, pnt.z);
135 }
136
137 #else // i.e. ifdef UG_PARALLEL
138
139 {
140
141 pcl::ProcessCommunicator proc_comm;
142 std::vector<number> loc_z (m_measurement_points.size ()), red_z (m_measurement_points.size ());
143
144 for (size_t i = 0; i < m_measurement_points.size (); i++)
145 if (! m_height_measurer.get_height_at (m_measurement_points[i].xy, loc_z[i]))
146 loc_z[i] = - std::numeric_limits<number>::max (); // the position is not covered by the free surface in this process
147
148 proc_comm.allreduce (loc_z, red_z, PCL_RO_MAX);
149 for (size_t i = 0; i < m_measurement_points.size (); i++)
150 {
152 number z_val = red_z[i];
153 if (z_val != - std::numeric_limits<number>::max ()) // i.e. is not set in any process
154 {
155 pnt.z = z_val;
156 pnt.valid = true;
157 }
158 else
159 pnt.valid = false;
160 }
161 }
162
163 if(pcl::ProcRank() != 0)
164 return true;
165 #endif
166
167
168 //##############################################################
169 std::vector<number> this_measurement;
170
171 // do the needed measurements
172 for (size_t i = 0; i < m_measurement_points.size(); i++)
173 {
174 number height = m_measurement_points[i].z;
175
176 if (!m_measurement_points[i].valid)
177 height = 0;
178
179 this_measurement.push_back(height);
180 }
181
182 if (m_last_measurement.size() == 0)
183 {
184 m_last_measurement = this_measurement;
185 return true;
186 }
187
188 if (m_last_measurement.size() != this_measurement.size())
189 {
190 throw std::logic_error("Number of measurement points changed during runtime!");
191 }
192
193
194 // calculate the 2-norm of the difference vector
195 m_last_change = 0;
196
197 for (size_t i = 0; i < m_last_measurement.size(); i++)
198 {
199 if (m_measurement_points[i].valid)
200 {
201 double difference = m_last_measurement[i]-this_measurement[i];
202 m_last_change += difference*difference;
203 }
204 else
205 {
206 std::cout << "EquilibriumFinishedTester: No free surface at " << m_measurement_points[i].xy[0] << std::endl;
207 }
208 }
209
211 m_last_change /= dt;
212
214 {
216 }
217
218 m_last_measurement = this_measurement;
219
220 return true;
221
222 }
223
224 void read_measurement_points(const char * filename)
225 {
226
227 std::string full_file_name = FindFileInStandardPaths (filename);
228 UG_COND_THROW (full_file_name.empty (), "FSInEquilibriumFinishedCondition: Coulnd't locate file '" << filename << "'.");
229
230 std::ifstream input (full_file_name.c_str (), std::ifstream::in);
231 UG_COND_THROW (input.fail (), "FSInEquilibriumFinishedCondition: Cannot open data file '" << full_file_name << "' for input!");
232
233 std::string input_line;
234 std::istringstream line_stream;
235
236 line_stream.exceptions (std::istream::failbit | std::istream::badbit);
237
238 while (! input.eof ())
239 {
240 std::vector<number> xy(dim-1);
241
242 if (input.fail ())
243 UG_THROW ("FSInEquilibriumFinishedCondition: Could not load the points from the file!");
244 std::getline (input, input_line);
245 if (input_line.length () == 0)
246 continue;
247 try
248 {
249 line_stream.str (input_line);
250 line_stream.clear ();
251 for (size_t i = 0; i < dim-1; i++)
252 line_stream >> xy[i];
253 }
254 catch (std::istream::failure & e)
255 {
256 UG_THROW ("FSInEquilibriumFinishedCondition: Failed to parse line '" << input_line << "' in the input file.");
257 };
258
260 }
261 }
262
263 private:
268 std::vector<t_pnt_data> m_measurement_points;
269 std::vector<number> m_last_measurement;
271
272};
273
274}
275
276#endif
parameterString p
Definition Biogas.lua:1
size_t allreduce(const size_t &t, pcl::ReduceOperation op) const
void broadcast(size_t &s, int root=0) const
Definition fs_equilibirum_finished_condition.hpp:34
int m_number_of_measurement_points
Definition fs_equilibirum_finished_condition.hpp:264
FSInEquilibriumFinishedCondition(SmartPtr< grid_function_type > lsf, number equilibrium_factor)
Definition fs_equilibirum_finished_condition.hpp:56
std::vector< number > m_last_measurement
Definition fs_equilibirum_finished_condition.hpp:269
ug::GridFunction< TDomain, TAlgebra > grid_function_type
Definition fs_equilibirum_finished_condition.hpp:54
void read_measurement_points(const char *filename)
Definition fs_equilibirum_finished_condition.hpp:224
number m_equilibrium_factor
Definition fs_equilibirum_finished_condition.hpp:265
number m_max_change
Definition fs_equilibirum_finished_condition.hpp:266
void set_equilibrium_factor(number equilibrium_factor)
Definition fs_equilibirum_finished_condition.hpp:62
static const int dim
Definition fs_equilibirum_finished_condition.hpp:38
number m_last_change
Definition fs_equilibirum_finished_condition.hpp:267
std::vector< t_pnt_data > m_measurement_points
Definition fs_equilibirum_finished_condition.hpp:268
virtual bool step_process(SmartPtr< grid_function_type > u, int step, number time, number dt)
Definition fs_equilibirum_finished_condition.hpp:124
ug::d3f::LSPositionZ< grid_function_type > m_height_measurer
Definition fs_equilibirum_finished_condition.hpp:270
void add_measurement_point(std::vector< number > point)
Definition fs_equilibirum_finished_condition.hpp:105
bool check_finished(number time, int step)
Definition fs_equilibirum_finished_condition.hpp:67
Definition level_set_pos.h:48
int ProcRank()
#define PCL_RO_MAX
std::string FindFileInStandardPaths(const char *filename)
#define UG_THROW(msg)
#define UG_COND_THROW(cond, msg)
double number
type of point data
Definition fs_equilibirum_finished_condition.hpp:41
MathVector< dim-1 > xy
low-dim coordinate of the point
Definition fs_equilibirum_finished_condition.hpp:42
t_pnt_data(MathVector< dim-1 > &the_xy)
Definition fs_equilibirum_finished_condition.hpp:47
bool valid
if not computed or the level set is not covered by the top surface
Definition fs_equilibirum_finished_condition.hpp:45
number z
computed value of the z-coordiate
Definition fs_equilibirum_finished_condition.hpp:43