Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <vector> 7 : 8 : #include "Domain/Creators/RegisterDerivedWithCharm.hpp" 9 : #include "Domain/Creators/TimeDependence/RegisterDerivedWithCharm.hpp" 10 : #include "Domain/FunctionsOfTime/RegisterDerivedWithCharm.hpp" 11 : #include "Evolution/DiscontinuousGalerkin/Limiters/Tags.hpp" 12 : #include "Evolution/Executables/GrMhd/GhValenciaDivClean/GhValenciaDivCleanBase.hpp" 13 : #include "Evolution/Systems/GeneralizedHarmonic/BoundaryCorrections/RegisterDerived.hpp" 14 : #include "Evolution/Systems/GeneralizedHarmonic/ConstraintDamping/RegisterDerivedWithCharm.hpp" 15 : #include "Evolution/Systems/GeneralizedHarmonic/Tags.hpp" 16 : #include "Evolution/Systems/GrMhd/GhValenciaDivClean/BoundaryCorrections/RegisterDerived.hpp" 17 : #include "Evolution/Systems/GrMhd/GhValenciaDivClean/TimeDerivativeTerms.hpp" 18 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/Tags.hpp" 19 : #include "Evolution/VariableFixing/Tags.hpp" 20 : #include "Options/FactoryHelpers.hpp" 21 : #include "Options/Protocols/FactoryCreation.hpp" 22 : #include "Options/String.hpp" 23 : #include "ParallelAlgorithms/ApparentHorizonFinder/Callbacks/ErrorOnFailedApparentHorizon.hpp" 24 : #include "ParallelAlgorithms/ApparentHorizonFinder/Callbacks/FindApparentHorizon.hpp" 25 : #include "ParallelAlgorithms/ApparentHorizonFinder/ComputeHorizonVolumeQuantities.hpp" 26 : #include "ParallelAlgorithms/ApparentHorizonFinder/ComputeHorizonVolumeQuantities.tpp" 27 : #include "ParallelAlgorithms/ApparentHorizonFinder/InterpolationTarget.hpp" 28 : #include "ParallelAlgorithms/Interpolation/Actions/CleanUpInterpolator.hpp" 29 : #include "ParallelAlgorithms/Interpolation/Actions/InitializeInterpolationTarget.hpp" 30 : #include "ParallelAlgorithms/Interpolation/Actions/InterpolationTargetReceiveVars.hpp" 31 : #include "ParallelAlgorithms/Interpolation/Actions/InterpolatorReceivePoints.hpp" 32 : #include "ParallelAlgorithms/Interpolation/Actions/InterpolatorReceiveVolumeData.hpp" 33 : #include "ParallelAlgorithms/Interpolation/Actions/InterpolatorRegisterElement.hpp" 34 : #include "ParallelAlgorithms/Interpolation/Actions/TryToInterpolate.hpp" 35 : #include "ParallelAlgorithms/Interpolation/Callbacks/ObserveTimeSeriesOnSurface.hpp" 36 : #include "ParallelAlgorithms/Interpolation/Events/Interpolate.hpp" 37 : #include "ParallelAlgorithms/Interpolation/InterpolationTarget.hpp" 38 : #include "ParallelAlgorithms/Interpolation/Interpolator.hpp" 39 : #include "ParallelAlgorithms/Interpolation/Protocols/InterpolationTargetTag.hpp" 40 : #include "ParallelAlgorithms/Interpolation/Tags.hpp" 41 : #include "PointwiseFunctions/GeneralRelativity/Surfaces/Tags.hpp" 42 : #include "PointwiseFunctions/Hydro/EquationsOfState/Factory.hpp" 43 : #include "PointwiseFunctions/Hydro/EquationsOfState/RegisterDerivedWithCharm.hpp" 44 : #include "Time/Tags/Time.hpp" 45 : #include "Utilities/Blas.hpp" 46 : #include "Utilities/ErrorHandling/Error.hpp" 47 : #include "Utilities/ErrorHandling/FloatingPointExceptions.hpp" 48 : #include "Utilities/ErrorHandling/SegfaultHandler.hpp" 49 : #include "Utilities/ProtocolHelpers.hpp" 50 : #include "Utilities/Serialization/RegisterDerivedClassesWithCharm.hpp" 51 : #include "Utilities/TMPL.hpp" 52 : 53 : template <typename InitialData, bool UseControlSystems, 54 : typename... InterpolationTargetTags> 55 : struct EvolutionMetavars : public GhValenciaDivCleanTemplateBase< 56 : EvolutionMetavars<InitialData, UseControlSystems, 57 : InterpolationTargetTags...>, 58 : false, false> { 59 : static_assert(not UseControlSystems, 60 : "GhValenciaWithHorizon doesn't support control systems yet."); 61 : static constexpr bool use_dg_subcell = false; 62 : 63 0 : using defaults = GhValenciaDivCleanDefaults<use_dg_subcell>; 64 0 : using base = GhValenciaDivCleanTemplateBase<EvolutionMetavars, use_dg_subcell, 65 : UseControlSystems>; 66 : static constexpr size_t volume_dim = defaults::volume_dim; 67 0 : using domain_frame = typename defaults::domain_frame; 68 : static constexpr bool use_damped_harmonic_rollon = 69 : defaults::use_damped_harmonic_rollon; 70 0 : using temporal_id = typename defaults::temporal_id; 71 : static constexpr bool local_time_stepping = defaults::local_time_stepping; 72 0 : using system = typename defaults::system; 73 0 : using analytic_variables_tags = typename defaults::analytic_variables_tags; 74 0 : using analytic_solution_fields = typename defaults::analytic_solution_fields; 75 0 : using ordered_list_of_primitive_recovery_schemes = 76 : typename defaults::ordered_list_of_primitive_recovery_schemes; 77 0 : using limiter = typename defaults::limiter; 78 0 : using initialize_initial_data_dependent_quantities_actions = 79 : typename defaults::initialize_initial_data_dependent_quantities_actions; 80 : 81 : static constexpr Options::String help{ 82 : "Evolve the Valencia formulation of the GRMHD system with divergence " 83 : "cleaning, coupled to a dynamic spacetime evolved with the Generalized " 84 : "Harmonic formulation\n" 85 : "on a domain with a single horizon and corresponding excised region"}; 86 : 87 0 : struct AhA : tt::ConformsTo<intrp::protocols::InterpolationTargetTag> { 88 0 : using temporal_id = ::Tags::Time; 89 0 : using tags_to_observe = 90 : tmpl::list<gr::surfaces::Tags::AreaCompute<domain_frame>>; 91 0 : using compute_vars_to_interpolate = ah::ComputeHorizonVolumeQuantities; 92 0 : using vars_to_interpolate_to_target = tmpl::list< 93 : gr::Tags::SpatialMetric<DataVector, volume_dim, domain_frame>, 94 : gr::Tags::InverseSpatialMetric<DataVector, volume_dim, domain_frame>, 95 : gr::Tags::ExtrinsicCurvature<DataVector, volume_dim, domain_frame>, 96 : gr::Tags::SpatialChristoffelSecondKind<DataVector, volume_dim, 97 : domain_frame>>; 98 0 : using compute_items_on_target = tmpl::append< 99 : tmpl::list<gr::surfaces::Tags::AreaElementCompute<domain_frame>>, 100 : tags_to_observe>; 101 0 : using compute_target_points = 102 : intrp::TargetPoints::ApparentHorizon<AhA, ::Frame::Inertial>; 103 0 : using post_interpolation_callback = 104 : intrp::callbacks::FindApparentHorizon<AhA, ::Frame::Inertial>; 105 0 : using horizon_find_failure_callback = 106 : intrp::callbacks::ErrorOnFailedApparentHorizon; 107 0 : using post_horizon_find_callbacks = tmpl::list< 108 : intrp::callbacks::ObserveTimeSeriesOnSurface<tags_to_observe, AhA>>; 109 : }; 110 : 111 0 : using interpolation_target_tags = tmpl::list<InterpolationTargetTags..., AhA>; 112 0 : using interpolator_source_vars = tmpl::list< 113 : gr::Tags::SpacetimeMetric<DataVector, volume_dim, domain_frame>, 114 : gh::Tags::Pi<DataVector, volume_dim, domain_frame>, 115 : gh::Tags::Phi<DataVector, volume_dim, domain_frame>>; 116 : 117 0 : using observe_fields = typename base::observe_fields; 118 : 119 : struct factory_creation 120 : : tt::ConformsTo<Options::protocols::FactoryCreation> { 121 0 : using factory_classes = Options::add_factory_classes< 122 : typename base::factory_creation::factory_classes, 123 : tmpl::pair<Event, tmpl::list<intrp::Events::Interpolate< 124 : 3, AhA, interpolator_source_vars>>>>; 125 : }; 126 : 127 0 : using initial_data = typename base::initial_data; 128 0 : using initial_data_tag = typename base::initial_data_tag; 129 : 130 0 : using const_global_cache_tags = tmpl::flatten<tmpl::list< 131 : grmhd::ValenciaDivClean::Tags::PrimitiveFromConservativeOptions, 132 : gh::gauges::Tags::GaugeCondition, 133 : tmpl::conditional_t<evolution::is_numeric_initial_data_v<initial_data>, 134 : tmpl::list<>, initial_data_tag>, 135 : grmhd::ValenciaDivClean::Tags::ConstraintDampingParameter, 136 : typename base::equation_of_state_tag, 137 : gh::ConstraintDamping::Tags::DampingFunctionGamma0<volume_dim, 138 : Frame::Grid>, 139 : gh::ConstraintDamping::Tags::DampingFunctionGamma1<volume_dim, 140 : Frame::Grid>, 141 : gh::ConstraintDamping::Tags::DampingFunctionGamma2<volume_dim, 142 : Frame::Grid>>>; 143 : 144 0 : using observed_reduction_data_tags = observers::collect_reduction_data_tags< 145 : tmpl::at<typename factory_creation::factory_classes, Event>>; 146 : 147 0 : using registration = typename base::registration; 148 : 149 0 : using component_list = 150 : tmpl::push_back<typename base::component_list, 151 : intrp::InterpolationTarget<EvolutionMetavars, AhA>>; 152 : }; 153 : 154 : static const std::vector<void (*)()> charm_init_node_funcs{ 155 : &setup_error_handling, 156 : &disable_openblas_multithreading, 157 : &domain::creators::register_derived_with_charm, 158 : &domain::creators::time_dependence::register_derived_with_charm, 159 : &domain::FunctionsOfTime::register_derived_with_charm, 160 : &grmhd::GhValenciaDivClean::BoundaryCorrections:: 161 : register_derived_with_charm, 162 : &gh::ConstraintDamping::register_derived_with_charm, 163 : &EquationsOfState::register_derived_with_charm, 164 : ®ister_factory_classes_with_charm<metavariables>}; 165 : 166 : static const std::vector<void (*)()> charm_init_proc_funcs{ 167 : &enable_floating_point_exceptions, &enable_segfault_handler};