22 #ifndef _aspect_simulator_h
23 #define _aspect_simulator_h
73 #include <boost/iostreams/tee.hpp>
74 #include <boost/iostreams/stream.hpp>
94 class StokesMatrixFreeHandler;
96 namespace StokesSolver
102 template <
int dim,
int velocity_degree>
105 namespace MeshDeformation
136 template <
int dim>
class Interface;
137 template <
int dim>
class Manager;
188 "Nonlinear solver failed to converge in the prescribed number of steps. "
189 "Consider changing `Max nonlinear iterations` or `Nonlinear solver failure "
664 const double diagonal_strengthening);
689 double *residual =
nullptr);
708 std::vector<double> *residual =
nullptr);
725 double *nonlinear_residual =
nullptr);
740 const bool use_picard);
845 std::pair<double,double>
939 template <
class Archive>
940 void serialize (Archive &ar,
const unsigned int version);
1162 template <
typename T>
1165 const bool skip_interior_cells =
false)
const;
1270 std::vector<
Point<dim>> &unique_support_points,
1271 std::vector<std::vector<unsigned int>> &support_point_index_by_field)
const;
1372 const bool use_picard,
1424 const bool limit_to_top_faces =
false)
const;
1445 const bool limit_to_top_faces =
false)
const;
1455 const bool is_composition,
1456 const unsigned int composition_index);
1516 std::pair<double,double>
1548 const bool force_writing_checkpoint);
1577 unsigned int &max_refinement_level);
1597 const double global_u_infty,
1598 const double global_field_variation,
1599 const double average_field,
1600 const double global_entropy_variation,
1601 const double cell_diameter,
1614 const double average_field,
1616 double &max_residual,
1617 double &max_velocity,
1618 double &max_density,
1619 double &max_specific_heat,
1620 double &conductivity)
const;
1703 const double maximum_linear_stokes_solver_tolerance,
1704 const double linear_stokes_solver_tolerance,
1705 const double stokes_residual,
1706 const double newton_residual,
1707 const double newton_residual_old);
1783 using TeeDevice = boost::iostreams::tee_device<std::ostream, std::ofstream>;
1887 #ifdef ASPECT_WITH_WORLD_BUILDER
1899 std::shared_ptr<WorldBuilder::World> world_builder;
void solve_single_advection_iterated_defect_correction_stokes()
std::unique_ptr< Assemblers::Manager< dim > > assemblers
bool maybe_do_initial_refinement(const unsigned int max_refinement_level)
TimeStepping::Manager< dim > time_stepping_manager
void setup_introspection()
SimulatorSignals< dim > signals
std::thread output_statistics_thread
AffineConstraints< double > current_constraints
void maybe_write_timing_output() const
bool rebuild_sparsity_and_matrices
TeeStream iostream_tee_stream
void replace_outflow_boundary_ids(const unsigned int boundary_id_offset, const bool is_composition, const unsigned int composition_index)
void solve_iterated_advection_and_defect_correction_stokes()
double solve_advection(const AdvectionField &advection_field)
double last_pressure_normalization_adjustment
MeshRefinement::Manager< dim > mesh_refinement_manager
bool assemble_newton_stokes_matrix
double get_maximal_velocity(const LinearAlgebra::BlockVector &solution) const
std::pair< double, double > solve_stokes(LinearAlgebra::BlockVector &solution_vector)
void denormalize_pressure(const double pressure_adjustment, LinearAlgebra::BlockVector &vector) const
std::size_t statistics_last_hash
LinearAlgebra::BlockVector old_solution
void setup_nullspace_constraints(AffineConstraints< double > &constraints)
void build_stokes_preconditioner()
bool maybe_write_checkpoint(const std::time_t last_checkpoint_time, const bool force_writing_checkpoint)
void compute_current_velocity_boundary_constraints(AffineConstraints< double > &constraints)
bool simulator_is_past_initialization
unsigned int timestep_number
void remove_net_linear_momentum(const bool use_constant_density, LinearAlgebra::BlockVector &relevant_dst, LinearAlgebra::BlockVector &tmp_distributed_stokes) const
void apply_limiter_to_dg_solutions(const AdvectionField &advection_field)
LinearAlgebra::BlockVector current_linearization_point
std::ofstream log_file_stream
void set_advection_assemblers()
LinearAlgebra::BlockVector system_rhs
void build_advection_preconditioner(const AdvectionField &advection_field, aspect::LinearAlgebra::PreconditionILU &preconditioner, const double diagonal_strengthening)
void refine_mesh(const unsigned int max_grid_level)
std::vector< Particle::Manager< dim > > particle_managers
std::shared_ptr< InitialTemperature::Manager< dim > > initial_temperature_manager
std::unique_ptr< MeltHandler< dim > > melt_handler
void resume_from_snapshot()
void set_initial_temperature_and_compositional_fields()
Postprocess::Manager< dim > postprocess_manager
void restore_outflow_boundary_ids(const unsigned int boundary_id_offset)
void local_assemble_stokes_preconditioner(const typename DoFHandler< dim >::active_cell_iterator &cell, internal::Assembly::Scratch::StokesPreconditioner< dim > &scratch, internal::Assembly::CopyData::StokesPreconditioner< dim > &data)
const std::unique_ptr< GeometryModel::Interface< dim > > geometry_model
void select_default_solver_and_averaging()
void check_consistency_of_formulation()
unsigned int nonlinear_solver_failures
typename Parameters< dim >::NullspaceRemoval NullspaceRemoval
void compute_initial_velocity_boundary_constraints(AffineConstraints< double > &constraints)
BoundaryTraction::Manager< dim > boundary_traction_manager
unsigned int nonlinear_iteration
unsigned int determine_resume_snapshot() const
void initialize_current_linearization_point()
PrescribedSolution::Manager< dim > prescribed_solution_manager
const std::unique_ptr< PrescribedStokesSolution::Interface< dim > > prescribed_stokes_solution
Introspection< dim > introspection
unsigned int last_checkpoint_id
void make_pressure_rhs_compatible(LinearAlgebra::BlockVector &vector)
HeatingModel::Manager< dim > heating_model_manager
std::pair< double, double > get_extrapolated_advection_field_range(const AdvectionField &advection_field) const
double compute_pressure_scaling_factor() const
void solve_no_advection_no_stokes()
void copy_local_to_global_stokes_preconditioner(const internal::Assembly::CopyData::StokesPreconditioner< dim > &data)
void compute_unique_advection_support_points(const std::vector< AdvectionField > &advection_fields, std::vector< Point< dim >> &unique_support_points, std::vector< std::vector< unsigned int >> &support_point_index_by_field) const
void maybe_refine_mesh(const double new_time_step, unsigned int &max_refinement_level)
BoundaryComposition::Manager< dim > boundary_composition_manager
void compute_initial_pressure_field()
void solve_no_advection_single_stokes()
BoundaryVelocity::Manager< dim > boundary_velocity_manager
void set_stokes_assemblers()
void setup_system_preconditioner(const std::vector< IndexSet > &system_partitioning)
LateralAveraging< dim > lateral_averaging
double get_entropy_variation(const double average_field, const AdvectionField &advection_field) const
const FESystem< dim > finite_element
void compute_advection_system_residual(internal::Assembly::Scratch::AdvectionSystem< dim > &scratch, const double average_field, const AdvectionField &advection_field, double &max_residual, double &max_velocity, double &max_density, double &max_specific_heat, double &conductivity) const
void exchange_refinement_flags()
bool stokes_matrix_depends_on_solution() const
std::shared_ptr< InitialComposition::Manager< dim > > initial_composition_manager
Table< 2, DoFTools::Coupling > setup_system_matrix_coupling() const
const std::unique_ptr< BoundaryHeatFlux::Interface< dim > > boundary_heat_flux
std::size_t statistics_last_write_size
void interpolate_material_output_into_advection_field(const std::vector< AdvectionField > &adv_field)
const std::unique_ptr< AdiabaticConditions::Interface< dim > > adiabatic_conditions
void solve_no_advection_single_stokes_first_timestep_only()
LinearAlgebra::BlockVector solution
void solve_iterated_advection_and_stokes()
void solve_single_advection_iterated_newton_stokes(bool use_newton_iterations)
double perform_line_search(const DefectCorrectionResiduals &dcr, const bool use_picard, const LinearAlgebra::BlockVector &search_direction)
void do_one_defect_correction_Stokes_step(DefectCorrectionResiduals &dcr, const bool use_picard)
std::unique_ptr< VolumeOfFluidHandler< dim > > volume_of_fluid_handler
Simulator(const MPI_Comm mpi_communicator, ParameterHandler &prm)
double assemble_and_solve_temperature(const double &initial_residual=0, double *residual=nullptr)
const IntermediaryConstructorAction post_signal_creation
TeeDevice iostream_tee_device
std::unique_ptr< LinearAlgebra::PreconditionBase > Mp_preconditioner
parallel::distributed::Triangulation< dim > triangulation
void solve_no_advection_iterated_defect_correction_stokes()
AffineConstraints< double > constraints
std::unique_ptr< StokesSolver::Direct< dim > > stokes_direct
unsigned int determine_last_good_snapshot() const
void setup_system_matrix(const std::vector< IndexSet > &system_partitioning)
std::unique_ptr< NewtonHandler< dim > > newton_handler
std::unique_ptr< Mapping< dim > > mapping
unsigned int pre_refinement_step
double assemble_and_solve_stokes(const double &initial_nonlinear_residual=0, double *nonlinear_residual=nullptr)
void interpolate_onto_velocity_system(const TensorFunction< 1, dim > &func, LinearAlgebra::Vector &vec) const
void assemble_stokes_preconditioner()
void solve_no_advection_iterated_stokes()
void interpolate_particle_properties(const std::vector< AdvectionField > &advection_fields)
void solve_single_advection_no_stokes()
void solve_iterated_advection_and_newton_stokes(bool use_newton_iterations)
void advance_time(const double step_size)
Parameters< dim > parameters
LinearAlgebra::BlockVector pressure_shape_function_integrals
void copy_local_to_global_stokes_system(const internal::Assembly::CopyData::StokesSystem< dim > &data)
void serialize(Archive &ar, const unsigned int version)
void remove_nullspace(LinearAlgebra::BlockVector &solution, LinearAlgebra::BlockVector &distributed_stokes_solution) const
LinearAlgebra::BlockVector inverse_lumped_mass_matrix
void solve_iterated_advection_no_stokes()
typename Parameters< dim >::NonlinearSolver NonlinearSolver
boost::iostreams::tee_device< std::ostream, std::ofstream > TeeDevice
bool stokes_A_block_is_symmetric() const
BoundaryConvectiveHeating::Manager< dim > boundary_convective_heating_manager
bool rebuild_stokes_preconditioner
const std::unique_ptr< MaterialModel::Interface< dim > > material_model
const std::unique_ptr< GravityModel::Interface< dim > > gravity_model
double compute_initial_newton_residual()
RotationProperties< dim > compute_net_angular_momentum(const bool use_constant_density, const LinearAlgebra::BlockVector &solution, const bool limit_to_top_faces=false) const
LinearAlgebra::BlockVector old_old_solution
double total_walltime_until_last_snapshot
const IntermediaryConstructorAction post_geometry_model_creation_action
void check_consistency_of_boundary_conditions() const
double global_Omega_diameter
unsigned int linear_solver_failures
const std::shared_ptr< InitialTopographyModel::Interface< dim > > initial_topography_model
friend class boost::serialization::access
static void declare_parameters(ParameterHandler &prm, const unsigned int mpi_rank)
void solve_single_advection_single_stokes()
void assemble_stokes_system()
DoFHandler< dim > dof_handler
void write_plugin_graph(std::ostream &output_stream) const
double compute_Eisenstat_Walker_linear_tolerance(const bool EisenstatWalkerChoiceOne, const double maximum_linear_stokes_solver_tolerance, const double linear_stokes_solver_tolerance, const double stokes_residual, const double newton_residual, const double newton_residual_old)
bool assemble_newton_stokes_system
bool do_pressure_rhs_compatibility_modification
LinearAlgebra::BlockSparseMatrix system_matrix
BoundaryTemperature::Manager< dim > boundary_temperature_manager
double compute_viscosity(internal::Assembly::Scratch::AdvectionSystem< dim > &scratch, const double global_u_infty, const double global_field_variation, const double average_field, const double global_entropy_variation, const double cell_diameter, const AdvectionField &advection_field) const
std::unique_ptr< LinearAlgebra::PreconditionAMG > Amg_preconditioner
void remove_net_angular_momentum(const bool use_constant_density, LinearAlgebra::BlockVector &relevant_dst, LinearAlgebra::BlockVector &tmp_distributed_stokes, const bool limit_to_top_faces=false) const
void solve_single_advection_iterated_stokes()
void local_assemble_advection_system(const AdvectionField &advection_field, const Vector< double > &viscosity_per_cell, const typename DoFHandler< dim >::active_cell_iterator &cell, internal::Assembly::Scratch::AdvectionSystem< dim > &scratch, internal::Assembly::CopyData::AdvectionSystem< dim > &data)
std::unique_ptr< StokesMatrixFreeHandler< dim > > stokes_matrix_free
double normalize_pressure(LinearAlgebra::BlockVector &vector) const
void local_assemble_stokes_system(const typename DoFHandler< dim >::active_cell_iterator &cell, internal::Assembly::Scratch::StokesSystem< dim > &scratch, internal::Assembly::CopyData::StokesSystem< dim > &data)
void update_solution_vectors_with_reaction_results(const unsigned int block_index, const LinearAlgebra::BlockVector &distributed_vector, const LinearAlgebra::BlockVector &distributed_reaction_vector)
LinearAlgebra::BlockVector operator_split_reaction_vector
void assemble_advection_system(const AdvectionField &advection_field)
std::unique_ptr< MeshDeformation::MeshDeformationHandler< dim > > mesh_deformation
boost::iostreams::stream< TeeDevice > TeeStream
void copy_local_to_global_advection_system(const AdvectionField &advection_field, const internal::Assembly::CopyData::AdvectionSystem< dim > &data)
void get_artificial_viscosity(Vector< T > &viscosity_per_cell, const AdvectionField &advection_field, const bool skip_interior_cells=false) const
void compute_current_constraints()
MPI_Comm mpi_communicator
void local_assemble_advection_face_terms(const AdvectionField &advection_field, const typename DoFHandler< dim >::active_cell_iterator &cell, internal::Assembly::Scratch::AdvectionSystem< dim > &scratch, internal::Assembly::CopyData::AdvectionSystem< dim > &data)
bool rebuild_stokes_matrix
LinearAlgebra::BlockSparseMatrix system_preconditioner_matrix
TimerOutput computing_timer
std::vector< double > assemble_and_solve_composition(const std::vector< double > &initial_residual={}, const unsigned int nonlinear_iteration=0, std::vector< double > *residual=nullptr)
double compute_initial_stokes_residual()
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
DeclExceptionMsg(ExcNonlinearSolverNoConvergence, "Nonlinear solver failed to converge in the prescribed number of steps. " "Consider changing `Max nonlinear iterations` or `Nonlinear solver failure " "strategy`.")
double switch_initial_residual
std::pair< double, double > stokes_residuals
double newton_residual_for_derivative_scaling_factor
The NullspaceRemoval struct.
SymmetricTensor< 2, dim > tensor_moment_of_inertia
Tensor< 1, dim > tensor_angular_momentum
double scalar_angular_momentum
double scalar_moment_of_inertia
Tensor< 1, dim > tensor_rotation