main_loop_1d.cpp
1 #include "main_loop_1d.hpp"
2 #include "../../misc/universal_error.hpp"
3 #include "../../misc/simple_io.hpp"
4 
5 simulation1d::TerminationCondition::~TerminationCondition(void) {}
6 
8 (double termination_time,
9  int max_cycles):
10 termination_time_(termination_time),
11  max_cycles_(max_cycles) {}
12 
14 {
15  if(sim.GetCycle()>max_cycles_)
16  throw UniversalError("Maximum number of time steps exceeded");
17 
18  return sim.GetTime()<termination_time_;
19 }
20 
21 simulation1d::DiagnosticsFunction::~DiagnosticsFunction(void) {}
22 
24 (string const& fname):
25 fname_(fname) {}
26 
28 {
29  write_number(sim.GetTime(),fname_);
30 }
31 
33  TerminationCondition& term_cond,
34  int time_order,
35  DiagnosticsFunction* diag)
36 {
37  while(term_cond(sim)){
38  if(1==time_order)
39  sim.TimeAdvance();
40  else if(2==time_order)
41  sim.TimeAdvance2();
42  else
43  throw UniversalError("Error in 1d main_loop: unsupported time integration order");
44 
45  if(diag)
46  (*diag)(sim);
47  }
48 }
49 
51  double final_time,
52  int max_iter,
53  int time_order,
54  string const& time_log)
55 {
56  while(sim.GetTime()<final_time){
57  if(1==time_order)
58  sim.TimeAdvance();
59  else if(2==time_order)
60  sim.TimeAdvance2();
61  // sim.TimeAdvanceRK(2);
62  else
63  throw UniversalError("Error in 1d main_loop: unsupported time integration order");
64 
65  if(time_log!="")
66  write_number(sim.GetTime(),time_log);
67 
68  // Infinite loop guard
69  if(sim.GetCycle()>max_iter)
70  throw UniversalError("Too many time advance iterations");
71  }
72 }
SafeTimeTermination(double termination_time, int max_cycles)
Class constructor.
Definition: main_loop_1d.cpp:8
Newtonian hydrodynamic simulation.
Definition: hdsim.hpp:25
WriteTime(string const &fname)
Class constructor.
Container for error reports.
double GetTime(void) const
Returns the time of the simulation.
Definition: hdsim.cpp:15
int GetCycle(void) const
Returns the number of times time advance was called.
Definition: hdsim.cpp:20
void TimeAdvance2(void)
Second order time advance.
Definition: hdsim.cpp:205
void TimeAdvance(void)
Advances the simulation in time.
Definition: hdsim.cpp:152
Abstract class for diagnostics function.
Abstract type for termination condition.
void main_loop(hdsim1D &sim, TerminationCondition &term_cond, int time_order, DiagnosticsFunction *diag=0)
Main simulation time advance loop.
bool operator()(hdsim1D const &sim)
Determines if a simulation should continue running.
Standard simulation time advance loop.
void operator()(hdsim1D const &sim)
Performs diagnostics.
void write_number(double num, string const &fname, int prec=6)
Writes a single number to a file.
Definition: simple_io.cpp:5