14 template <
typename T,
unsigned Dim>
17 template <
typename T,
typename Func,
unsigned Dim>
36 template <
typename T,
unsigned Dim = 2>
71 throw std::invalid_argument(
"current velocity not set!");
164 std::cout <<
"Particle forward advection begins" << std::endl;
167 std::cout <<
"Particle backward advection begins" << std::endl;
174 for (
unsigned i = 0; i <
step_; ++i)
177 std::stringstream ss;
178 ss <<
"[" << std::setw(std::to_string(step_).length()) << (i+1)
179 <<
"/" << step_ <<
"]" <<
195 ss <<
" (Execution time: " <<
198 std::cout << ss.str();
203 std::cout <<
"Particle forward advection ends" << std::endl;
206 std::cout <<
"Particle backward advection ends" << std::endl;
231 template <
typename T,
unsigned Dim = 2>
242 FlowField<T, Dim>(nx, ny), data_nx_(data_nx), data_ny_(data_ny),
243 data_delta_(), current_data_time_(), begin_data_time_(), end_data_time_(),
244 vel_file_name_prefix_(
""), vel_file_name_suffix_(
".txt"),
245 data_pos_(new
Position<T,Dim>(data_nx, data_ny)),
246 previous_data_vel_(new
Velocity<T,Dim>(data_nx, data_ny, *data_pos_)),
247 next_data_vel_(new
Velocity<T,Dim>(data_nx, data_ny, *data_pos_)),
248 current_data_vel_(new
Velocity<T,Dim>(data_nx, data_ny, *data_pos_)) {}
262 vel_file_name_prefix_ = prefix;
270 vel_file_name_suffix_ = suffix;
278 std::string file_name = vel_file_name_prefix_ +
279 std::to_string(static_cast<int>(data_vel.
GetTime())) +
280 vel_file_name_suffix_;
284 std::cout <<
"Read velocity data at time = " <<
285 data_vel.
GetTime() <<
" from " << file_name << std::endl;
292 T signed_data_delta = (this->
direction_ ==
Forward) ? data_delta_ : (-data_delta_);
297 current_data_time_ = begin_data_time_;
304 current_data_time_ += signed_data_delta;
307 while (current_data_time_ > this->initial_time_)
308 current_data_time_ -= signed_data_delta;
315 #pragma omp single nowait
319 previous_data_vel_->UpdateTime(current_data_time_);
324 next_data_vel_->UpdateTime(current_data_time_ + signed_data_delta);
331 }
else if (((this->
current_time_ >= current_data_time_ + signed_data_delta) &&
332 (end_data_time_ > current_data_time_ + signed_data_delta) &&
334 ((this->
current_time_ <= current_data_time_ + signed_data_delta) &&
335 (end_data_time_ < current_data_time_ + signed_data_delta) &&
340 current_data_time_ += signed_data_delta;
345 #pragma omp single nowait
349 previous_data_vel_->UpdateTime(current_data_time_);
354 next_data_vel_->UpdateTime(current_data_time_ + signed_data_delta);
362 next_data_vel_->GetTime(),
363 *previous_data_vel_, *next_data_vel_,
367 this->
current_vel_->InterpolateFrom(*current_data_vel_);
393 T xmin, xmax, ymin, ymax;
394 std::tie(xmin, ymin) = data_pos_->Get(0,0);
395 std::tie(xmax, ymax) = data_pos_->Get(data_nx_-1,data_ny_-1);
414 return *previous_data_vel_;
431 T begin_time = (t2 >= t1) ? t1 : t2;
432 T end_time = (t2 >= t1) ? t2 : t2;
437 begin_data_time_ = begin_time;
438 end_data_time_ = end_time;
441 begin_data_time_ = end_time;
442 end_data_time_ = begin_time;
449 const unsigned data_nx_;
450 const unsigned data_ny_;
452 T current_data_time_;
455 std::string vel_file_name_prefix_;
456 std::string vel_file_name_suffix_;
457 std::unique_ptr<Position<T, Dim>> data_pos_;
458 std::unique_ptr<Velocity<T, Dim>> previous_data_vel_;
459 std::unique_ptr<Velocity<T, Dim>> next_data_vel_;
460 std::unique_ptr<Velocity<T, Dim>> current_data_vel_;
471 template <
typename T,
typename Func,
unsigned Dim = 2>
472 class ContinuousFlowField :
public FlowField<T, Dim>
480 FlowField<T, Dim>(nx, ny), parameters_() {}
488 FlowField<T, Dim>(nx, ny), parameters_(parameters) {}
495 if (parameters_.size() == 0)
497 (this->nx_, this->ny_, *(this->current_pos_),this->current_time_));
513 if (current_continuous_vel_ ==
nullptr)
514 throw std::invalid_argument(
"current velocity not set!");
516 return *current_continuous_vel_;
539 std::shared_ptr<ContinuousVelocity<T, Func, Dim>> current_continuous_vel_;
540 std::vector<T> parameters_;
ContinuousFlowField(unsigned nx, unsigned ny, std::vector< T > ¶meters)
Definition: flow.hpp:487
Direction
Definition: flow.hpp:24
Class for flow fields with a continous velocity function.
Definition: flow.hpp:18
auto & CurrentPosition()
Definition: flow.hpp:60
void ReadFromFile(const std::string &file_name)
Definition: field.hpp:63
auto & CurrentDataVelocity()
Definition: flow.hpp:412
void SetDelta(const T delta)
Definition: flow.hpp:99
void UpdateTime()
Definition: flow.hpp:136
Class for flow field.
Definition: flow.hpp:15
Field of particle velocities.
Definition: field.hpp:21
void End()
Definition: basic.hpp:374
void CopyInitialPositionToCurrentPosition()
Definition: flow.hpp:382
void CopyInitialPositionToCurrentPosition()
Definition: flow.hpp:521
FlowField(unsigned nx, unsigned ny)
Definition: flow.hpp:44
auto & DataPosition()
Definition: flow.hpp:405
Classes of physical fields.
Field of particle positions.
Definition: field.hpp:18
void SetStep(const unsigned step)
Definition: flow.hpp:108
auto GetDirection()
Definition: flow.hpp:87
const unsigned ny_
Definition: flow.hpp:214
void Run()
Definition: flow.hpp:159
T interpolate(T x1, T x2, T y1, T y2, T xm)
Definition: basic.hpp:321
T delta_
Definition: flow.hpp:215
virtual void SetCurrentVelocity()
Definition: flow.hpp:115
Velocity field with continuous velocity function.
Definition: field.hpp:24
void SetVelocityFileNameSuffix(const std::string suffix)
Definition: flow.hpp:268
void SetVelocityFileNamePrefix(const std::string prefix)
Definition: flow.hpp:260
ContinuousFlowField(unsigned nx, unsigned ny)
Definition: flow.hpp:479
Class for time recording.
Definition: basic.hpp:354
std::shared_ptr< Velocity< T, Dim > > current_vel_
Definition: flow.hpp:222
void SetDirection(const Direction direction)
Definition: flow.hpp:533
void SetDataDelta(const T delta)
Definition: flow.hpp:420
void SetDataTimeRange(const T t1, const T t2)
Definition: flow.hpp:429
const unsigned nx_
Definition: flow.hpp:213
auto & InitialPosition()
Definition: flow.hpp:52
virtual void CopyInitialPositionToCurrentPosition()
Definition: flow.hpp:94
virtual Velocity< T, Dim > & CurrentVelocity()
Definition: flow.hpp:68
T current_time_
Definition: flow.hpp:217
std::unique_ptr< Position< T, Dim > > current_pos_
Definition: flow.hpp:221
void UpdateTime(const T time)
Definition: flow.hpp:151
std::unique_ptr< Position< T, Dim > > initial_pos_
Definition: flow.hpp:220
unsigned step_
Definition: flow.hpp:218
void SetCurrentVelocity()
Definition: flow.hpp:290
void ReadDataVelocityFromFile(Velocity< T, Dim > &data_vel)
Definition: flow.hpp:276
auto GetTime()
Definition: flow.hpp:79
void SetInitialTime(const T time)
Definition: flow.hpp:127
Basic classes needed such as Vector and Tensor.
DiscreteFlowField(unsigned nx, unsigned ny, unsigned data_nx, unsigned data_ny)
Definition: flow.hpp:241
ContinuousVelocity< T, Func, Dim > & CurrentVelocity()
Definition: flow.hpp:511
DiscreteFlowField(unsigned nx, unsigned ny)
Definition: flow.hpp:254
auto GetTime() const
Definition: field.hpp:55
void SetDirection(const Direction direction)
Definition: flow.hpp:374
Direction direction_
Definition: flow.hpp:219
void SetCurrentVelocity()
Definition: flow.hpp:492
T initial_time_
Definition: flow.hpp:216
double GetTotalElapsedTime() const
Definition: basic.hpp:400
void Begin()
Definition: basic.hpp:363
Class for flow fields with discrete data.
Definition: flow.hpp:232
virtual void SetDirection(const Direction direction)
Definition: flow.hpp:121