Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <array> 7 : #include <cstddef> 8 : #include <pup.h> 9 : 10 : #include "Domain/Amr/Flag.hpp" 11 : #include "Domain/Creators/Tags/Domain.hpp" 12 : #include "Domain/Domain.hpp" 13 : #include "Domain/Structure/ElementId.hpp" 14 : #include "Domain/Tags.hpp" 15 : #include "Elliptic/Tags.hpp" 16 : #include "Options/String.hpp" 17 : #include "Parallel/GlobalCache.hpp" 18 : #include "ParallelAlgorithms/Amr/Criteria/Criterion.hpp" 19 : #include "PointwiseFunctions/InitialDataUtilities/Background.hpp" 20 : #include "Utilities/Serialization/CharmPupable.hpp" 21 : #include "Utilities/TMPL.hpp" 22 : 23 0 : namespace Punctures::AmrCriteria { 24 : 25 : /*! 26 : * \brief h-refine (split) elements containing a puncture 27 : * 28 : * This refinement scheme is expected to yield exponential convergence, despite 29 : * the presence of the C^2 punctures. 30 : */ 31 1 : class RefineAtPunctures : public amr::Criterion { 32 : public: 33 0 : using options = tmpl::list<>; 34 : 35 0 : static constexpr Options::String help = { 36 : "h-refine (split) elements containing a puncture."}; 37 : 38 0 : RefineAtPunctures() = default; 39 : 40 : /// \cond 41 : explicit RefineAtPunctures(CkMigrateMessage* msg) : Criterion(msg) {} 42 : using PUP::able::register_constructor; 43 : WRAPPED_PUPable_decl_template(RefineAtPunctures); // NOLINT 44 : /// \endcond 45 : 46 0 : using argument_tags = tmpl::list< 47 : elliptic::Tags::Background<elliptic::analytic_data::Background>, 48 : domain::Tags::Domain<3>>; 49 0 : using compute_tags_for_observation_box = tmpl::list<>; 50 : 51 : template <typename Metavariables> 52 0 : std::array<amr::Flag, 3> operator()( 53 : const elliptic::analytic_data::Background& background, 54 : const Domain<3>& domain, Parallel::GlobalCache<Metavariables>& /*cache*/, 55 : const ElementId<3>& element_id) const { 56 : return impl(background, domain, element_id); 57 : } 58 : 59 : private: 60 0 : static std::array<amr::Flag, 3> impl( 61 : const elliptic::analytic_data::Background& background, 62 : const Domain<3>& domain, const ElementId<3>& element_id); 63 : }; 64 : 65 : } // namespace Punctures::AmrCriteria