22#include < memory>
33#include < vector>
44#include < array>
5- #include < integratorxx/quadratures/radial .hpp>
6- #include < integratorxx/quadratures/s2 .hpp>
5+ #include < integratorxx/generators/radial_factory .hpp>
6+ #include < integratorxx/generators/s2_factory .hpp>
77#include < integratorxx/composite_quadratures/spherical_quadrature.hpp>
88#include < integratorxx/composite_quadratures/pruned_spherical_quadrature.hpp>
99
1010namespace IntegratorXX {
1111
12- // / High-level specification of radial quadratures
13- enum class RadialQuad : uint32_t {
14- Becke = 0x0010 ,
15- MurrayHandyLaming = 0x0020 ,
16- MuraKnowles = 0x0030 ,
17- TreutlerAhlrichs = 0x0040
18- };
19-
20- template <typename RadQuadType>
21- RadialQuad radial_from_type () {
22- if constexpr (detail::is_becke_v<RadQuadType>) return RadialQuad::Becke;
23- if constexpr (detail::is_mk_v<RadQuadType> ) return RadialQuad::MuraKnowles;
24- if constexpr (detail::is_mhl_v<RadQuadType>) return RadialQuad::MurrayHandyLaming;
25- if constexpr (detail::is_ta_v<RadQuadType>) return RadialQuad::TreutlerAhlrichs;
26-
27- throw std::runtime_error (" Unrecognized Radial Quadrature" );
28- };
29-
30- RadialQuad radial_from_string (std::string name);
31-
32- // / High-level specification of angular quadratures
33- enum class AngularQuad : uint32_t {
34- AhrensBeylkin = 0x0100 ,
35- Delley = 0x0200 ,
36- LebedevLaikov = 0x0300 ,
37- Womersley = 0x0400
38- };
39-
40- template <typename AngQuadType>
41- AngularQuad angular_from_type () {
42- if constexpr (detail::is_ahrens_beyklin_v<AngQuadType>) return AngularQuad::AhrensBeylkin;
43- if constexpr (detail::is_delley_v<AngQuadType> ) return AngularQuad::Delley;
44- if constexpr (detail::is_lebedev_laikov_v<AngQuadType>) return AngularQuad::LebedevLaikov;
45- if constexpr (detail::is_womersley_v<AngQuadType>) return AngularQuad::Womersley;
46-
47- throw std::runtime_error (" Unrecognized Angular Quadrature" );
48- };
49-
50- AngularQuad angular_from_string (std::string name);
51-
5212// / High-level specification of pruning schemes for spherical quadratures
5313enum class PruningScheme {
5414 Unpruned, // / Unpruned quadrature
@@ -57,22 +17,29 @@ enum class PruningScheme {
5717};
5818
5919// TODO: Make these strong (non-convertible) types
60- using RadialScale = double ;
61- using RadialSize = size_t ;
20+ // using RadialScale = double;
21+ // using RadialSize = size_t;
6222using AngularSize = size_t ;
63-
23+ using radial_traits_ptr = std::unique_ptr<RadialTraits>;
6424
6525// / Generic specification of an unpruned spherical quadrature
6626struct UnprunedSphericalGridSpecification {
67- RadialQuad radial_quad; // /< Radial quadrature specification
68- RadialSize radial_size; // /< Number of radial quadrature points
69- RadialScale radial_scale; // /< Radial scaling factor
27+ RadialQuad radial_quad; // /< Radial quadrature specification
28+ radial_traits_ptr radial_traits; // /< Radial traits (order, scaling factors, etc)
7029
7130 AngularQuad angular_quad; // / Angular quadrature specification
7231 AngularSize angular_size; // / Number of angular quadrature points
32+
33+ UnprunedSphericalGridSpecification (RadialQuad, const RadialTraits&, AngularQuad,
34+ AngularSize);
35+
36+ UnprunedSphericalGridSpecification (const UnprunedSphericalGridSpecification& other) :
37+ radial_quad (other.radial_quad), radial_traits(other.radial_traits ? other.radial_traits->clone () : nullptr),
38+ angular_quad(other.angular_quad), angular_size(other.angular_size) {};
7339};
7440
7541
42+
7643// / Specification of a pruned region of an spherical quadrature
7744struct PruningRegion {
7845 size_t idx_st; // /< Starting radial index for pruned region
@@ -91,15 +58,34 @@ struct PruningRegion {
9158
9259struct PrunedSphericalGridSpecification {
9360 RadialQuad radial_quad; // /< Radial quadrature specification
94- RadialSize radial_size; // /< Number of radial quadrature points
95- RadialScale radial_scale; // /< Radial scaling factor
61+ radial_traits_ptr radial_traits; // /< Radial traits (order, scaling factors, etc)
9662
9763 std::vector<PruningRegion> pruning_regions; // /< List of pruning regions over the radial quadrature
64+
65+ PrunedSphericalGridSpecification () = default ;
66+
67+ template <typename ... Arg>
68+ PrunedSphericalGridSpecification (RadialQuad rq, radial_traits_ptr&& traits, Arg&&... arg) :
69+ radial_quad (rq), radial_traits(std::move(traits)), pruning_regions(std::forward<Arg>(arg)...) { }
70+ template <typename ... Arg>
71+ PrunedSphericalGridSpecification (RadialQuad rq, const RadialTraits& traits, Arg&&... arg) :
72+ PrunedSphericalGridSpecification (rq, traits.clone(), std::forward<Arg>(arg)...) { }
73+
74+ PrunedSphericalGridSpecification (const PrunedSphericalGridSpecification& other) :
75+ PrunedSphericalGridSpecification (other.radial_quad,
76+ other.radial_traits ? other.radial_traits->clone () : nullptr,
77+ other.pruning_regions) { }
78+
79+ PrunedSphericalGridSpecification& operator =(const PrunedSphericalGridSpecification& other) {
80+ radial_quad = other.radial_quad ;
81+ radial_traits = other.radial_traits ? other.radial_traits ->clone () : nullptr ;
82+ pruning_regions = other.pruning_regions ;
83+ return *this ;
84+ }
9885
9986 inline bool operator ==(const PrunedSphericalGridSpecification& other) const noexcept {
10087 return radial_quad == other.radial_quad and
101- radial_size == other.radial_size and
102- radial_scale == other.radial_scale and
88+ (radial_traits ? (other.radial_traits and radial_traits->compare (*other.radial_traits )) : !other.radial_traits ) and
10389 pruning_regions == other.pruning_regions ;
10490 }
10591};
@@ -176,10 +162,10 @@ struct SphericalGridFactory {
176162 }
177163
178164
179- static spherical_grid_ptr generate_unpruned_grid ( RadialQuad, RadialSize ,
180- RadialScale, AngularQuad, AngularSize );
181- static spherical_grid_ptr generate_pruned_grid ( RadialQuad, RadialSize,
182- RadialScale, const std::vector<PruningRegion>&);
165+ static spherical_grid_ptr generate_unpruned_grid ( RadialQuad, const RadialTraits& ,
166+ AngularQuad, AngularSize );
167+ static spherical_grid_ptr generate_pruned_grid ( RadialQuad, const RadialTraits&,
168+ const std::vector<PruningRegion>&);
183169
184170
185171 static spherical_grid_ptr generate_grid (UnprunedSphericalGridSpecification gs);
0 commit comments