ASPECT
simulator_signals.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2015 - 2023 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #ifndef _aspect_simulator_signals_h
23 #define _aspect_simulator_signals_h
24 
25 #include <aspect/global.h>
27 #include <aspect/parameters.h>
28 
29 #include <deal.II/base/parameter_handler.h>
30 
31 #include <boost/signals2.hpp>
32 
33 namespace aspect
34 {
35  namespace Assemblers
36  {
37  template <int dim>
38  class Manager;
39 
40  template <int dim>
41  class Interface;
42  }
43 
62  template <int dim>
63  struct SimulatorSignals
64  {
75  boost::signals2::signal<void (std::vector<VariableDeclaration<dim>> &)>
76  edit_finite_element_variables;
77 
84  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> pre_set_initial_state;
85 
92  boost::signals2::signal<void (const SimulatorAccess<dim> &)> post_set_initial_state;
93 
100  boost::signals2::signal<void (const SimulatorAccess<dim> &)> start_timestep;
101 
113  boost::signals2::signal<void (const SimulatorAccess<dim> &,
114  AffineConstraints<double> &)> post_constraints_creation;
115 
127  boost::signals2::signal<void (const SimulatorAccess<dim> &,
128  Parameters<dim> &parameters)> edit_parameters_pre_setup_dofs;
129 
140  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> pre_refinement_store_user_data;
141 
151  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> post_refinement_load_user_data;
152 
165  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> pre_compute_no_normal_flux_constraints;
166 
179  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> post_compute_no_normal_flux_constraints;
180 
190  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> pre_checkpoint_store_user_data;
191 
204  boost::signals2::signal<void (typename parallel::distributed::Triangulation<dim> &)> post_resume_load_user_data;
205 
218  static boost::signals2::signal<void (const unsigned int aspect_dim,
219  ParameterHandler &prm)> declare_additional_parameters;
220 
231  static boost::signals2::signal<void (const Parameters<dim> &,
232  ParameterHandler &)> parse_additional_parameters;
233 
246  boost::signals2::signal<void (const SimulatorAccess<dim> &,
247  const unsigned int number_S_iterations,
248  const unsigned int number_A_iterations,
249  const SolverControl &solver_control_cheap,
250  const SolverControl &solver_control_expensive)> post_stokes_solver;
251 
260  boost::signals2::signal<void (const SimulatorAccess<dim> &,
261  const bool solved_temperature_field,
262  const unsigned int compositional_index,
263  const SolverControl &solver_control)> post_advection_solver;
264 
274  boost::signals2::signal<void (const SolverControl &)> post_nonlinear_solver;
275 
281  boost::signals2::signal<void (const SimulatorAccess<dim> &)> post_mesh_deformation;
282 
287  boost::signals2::signal<void (const SimulatorAccess<dim> &,
289  set_assemblers;
290  };
291 
292 
293  // Explain to the compiler that we instantiate this class elsewhere, along
294  // with its static members. This is necessary to avoid warnings by some
295  // compilers.
296  extern template struct SimulatorSignals<2>;
297  extern template
298  boost::signals2::signal<void (const unsigned int aspect_dim, ParameterHandler &prm)>
300  extern template
301  boost::signals2::signal<void (const Parameters<2> &, ParameterHandler &)>
303 
304  extern template struct SimulatorSignals<3>;
305  extern template
306  boost::signals2::signal<void (const unsigned int aspect_dim, ParameterHandler &prm)>
308  extern template
309  boost::signals2::signal<void (const Parameters<3> &, ParameterHandler &)>
311 
312 
313  namespace internals
314  {
320  {
328 
336  template <int dim>
338  }
339  }
340 
341 
352 #define ASPECT_REGISTER_SIGNALS_CONNECTOR(connector_function_2d,connector_function_3d) \
353  namespace ASPECT_REGISTER_SIGNALS_CONNECTOR \
354  { \
355  struct dummy_do_register \
356  { \
357  dummy_do_register () \
358  { \
359  aspect::internals::SimulatorSignals::register_connector_function_2d (connector_function_2d); \
360  aspect::internals::SimulatorSignals::register_connector_function_3d (connector_function_3d); \
361  } \
362  } dummy_variable; \
363  }
364 
365 
374 #define ASPECT_REGISTER_SIGNALS_PARAMETER_CONNECTOR(connector_function) \
375  namespace ASPECT_REGISTER_SIGNALS_PARAMETER_CONNECTOR_ ## connector_function \
376  { \
377  struct dummy_do_register_ ## connector_function \
378  { \
379  dummy_do_register_ ## connector_function () \
380  { \
381  connector_function (); \
382  } \
383  } dummy_variable_ ## classname; \
384  }
385 
386 }
387 #endif
void register_connector_function_2d(const std::function< void(aspect::SimulatorSignals< 2 > &)> &connector)
boost::signals2::signal< void(const SolverControl &)> post_nonlinear_solver
void call_connector_functions(aspect::SimulatorSignals< dim > &signals)
void register_connector_function_3d(const std::function< void(aspect::SimulatorSignals< 3 > &)> &connector)
static boost::signals2::signal< void(const unsigned int aspect_dim, ParameterHandler &prm)> declare_additional_parameters