69 std::unordered_map<std::string, std::unique_ptr<ResultsWriter>> m_result_writers;
70 std::vector<std::unique_ptr<FieldModifier>> m_initial_conditions;
71 std::vector<std::unique_ptr<FieldModifier>> m_boundary_conditions;
72 int m_result_counter = 0;
176 bool add_results_writer(
const std::string &field_name,
177 std::unique_ptr<ResultsWriter> writer) {
178 auto inbox = get_inbox(
get_fft());
180 writer->set_domain(get_size(world), inbox.size, inbox.low);
183 if (model.has_field(field_name)) {
184 m_result_writers.insert({field_name, std::move(writer)});
187 std::cout <<
"Warning: tried to add writer for inexistent field " << field_name
188 <<
", RESULTS ARE NOT WRITTEN!" << std::endl;
193 bool add_results_writer(std::unique_ptr<ResultsWriter> writer) {
194 std::cout <<
"Warning: adding result writer to write field 'default'"
196 return add_results_writer(
"default", std::move(writer));
245 bool add_initial_conditions(std::unique_ptr<FieldModifier> modifier) {
247 std::string field_name = modifier->get_field_name();
248 if (field_name ==
"default") {
249 std::cout <<
"Warning: adding initial condition to modify field 'default'"
252 if (model.has_field(field_name)) {
253 m_initial_conditions.push_back(std::move(modifier));
256 std::cout <<
"Warning: tried to add initial condition for inexistent field "
257 << field_name <<
", INITIAL CONDITIONS ARE NOT APPLIED!"
274 return m_initial_conditions;
324 bool add_boundary_conditions(std::unique_ptr<FieldModifier>
modifier) {
328 std::cout <<
"Warning: adding boundary condition to modify field 'default'"
331 if (model.has_field(field_name)) {
332 m_boundary_conditions.push_back(std::move(modifier));
335 std::cout <<
"Warning: tried to add boundary condition for inexistent field "
336 << field_name <<
", BOUNDARY CONDITIONS ARE NOT APPLIED!"
352 const std::vector<std::unique_ptr<FieldModifier>> &
354 return m_boundary_conditions;
359 double get_result_counter()
const {
return m_result_counter; }
361 void write_results() {
362 int file_num = get_result_counter();
364 for (
const auto &[field_name, writer] : m_result_writers) {
365 if (model.has_real_field(field_name)) {
366 writer->write(file_num,
get_model().get_real_field(field_name));
368 if (model.has_complex_field(field_name)) {
369 writer->write(file_num,
get_model().get_complex_field(field_name));
372 set_result_counter(file_num + 1);
375 void apply_initial_conditions() {
378 for (
const auto &ic : m_initial_conditions) {
379 ic->apply(model, time.get_current());
383 void apply_boundary_conditions() {
386 for (
const auto &bc : m_boundary_conditions) {
387 bc->apply(model, time.get_current());
445 if (time.get_increment() == 0) {
446 apply_initial_conditions();
447 apply_boundary_conditions();
448 if (time.do_save()) {
453 apply_boundary_conditions();
454 model.step(time.get_current());
455 if (time.do_save()) {
const std::vector< std::unique_ptr< FieldModifier > > & get_boundary_conditions() const
Gets the boundary conditions of the simulation.
Definition simulator.hpp:353
const std::vector< std::unique_ptr< FieldModifier > > & get_initial_conditions() const
Gets the initial conditions of the simulation.
Definition simulator.hpp:273
Simulator(Model &model, Time &time)
Construct a new Simulator object.
Definition simulator.hpp:81