File indexing completed on 2026-11-07 10:11:32
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <memory>
0010 #include <type_traits>
0011
0012 #include "corecel/Assert.hh"
0013 #include "corecel/Macros.hh"
0014 #include "corecel/Types.hh"
0015 #include "corecel/data/DeviceVector.hh"
0016 #include "celeritas/Types.hh"
0017
0018 #include "RZMapFieldData.hh" // primary template + const_reference/device spec
0019
0020 #include "detail/CovfieRZFieldTraits.hh"
0021
0022 namespace celeritas
0023 {
0024
0025 template<MemSpace M>
0026 struct RZMapFieldParamsDataBase
0027 {
0028 using field_t = typename detail::CovfieRZFieldTraits<M>::field_t;
0029 using view_t = typename field_t::view_t;
0030
0031 FieldDriverOptions options;
0032 real_type min_r{};
0033 real_type max_r{};
0034 real_type min_z{};
0035 real_type max_z{};
0036 };
0037
0038
0039
0040
0041
0042 template<>
0043 struct RZMapFieldParamsData<Ownership::value, MemSpace::host>
0044 : RZMapFieldParamsDataBase<MemSpace::host>
0045 {
0046 CELER_FUNCTION view_t get_view() const { return view_t(*field); }
0047
0048 CELER_FUNCTION explicit operator bool() const { return field.get(); }
0049
0050 std::unique_ptr<field_t> field;
0051 };
0052 template<>
0053 struct RZMapFieldParamsData<Ownership::const_reference, MemSpace::host>
0054 : RZMapFieldParamsDataBase<MemSpace::host>
0055 {
0056 CELER_FUNCTION view_t const& get_view() const { return field_view; }
0057
0058 CELER_FUNCTION explicit operator bool() const { return true; }
0059
0060 view_t field_view;
0061 };
0062
0063 template<>
0064 struct RZMapFieldParamsData<Ownership::value, MemSpace::device>
0065 : RZMapFieldParamsDataBase<MemSpace::device>
0066 {
0067 view_t const& get_view() const { return field_view.device_ref()[0]; }
0068
0069 explicit operator bool() const
0070 {
0071 return field.get() && field_view.size() == 1;
0072 }
0073
0074 RZMapFieldParamsData& operator=(
0075 RZMapFieldParamsData<Ownership::value, MemSpace::host> const& other)
0076 {
0077 using host_field_t
0078 = detail::CovfieRZFieldTraits<MemSpace::host>::field_t;
0079 if constexpr (!std::is_same_v<field_t, host_field_t>)
0080 {
0081
0082
0083
0084
0085 field = std::make_unique<field_t>(*other.field);
0086
0087
0088 field_view = DeviceVector<view_t>{1};
0089 field_view.copy_to_device(make_span<view_t const>({{*field}}));
0090 }
0091 else
0092 {
0093 field = std::make_unique<field_t>(*other.field);
0094 }
0095 options = other.options;
0096 min_r = other.min_r;
0097 max_r = other.max_r;
0098 min_z = other.min_z;
0099 max_z = other.max_z;
0100 return *this;
0101 }
0102
0103 std::unique_ptr<field_t> field;
0104 DeviceVector<view_t> field_view;
0105 };
0106
0107
0108
0109
0110
0111 template<MemSpace M>
0112 CELER_FUNCTION inline auto get_rz_map_field_view(
0113 RZMapFieldParamsData<Ownership::const_reference, M> const& params) ->
0114 typename detail::CovfieRZFieldTraits<M>::field_t::view_t const&
0115 {
0116 if constexpr (M == MemSpace::host)
0117 {
0118 return params.get_view();
0119 }
0120 else
0121 {
0122 using view_t = typename detail::CovfieRZFieldTraits<M>::field_t::view_t;
0123 CELER_EXPECT(params.field_view);
0124 return *static_cast<view_t const*>(params.field_view);
0125 }
0126 }
0127
0128
0129 inline auto
0130 RZMapFieldParamsData<Ownership::const_reference, MemSpace::device>::operator=(
0131 RZMapFieldParamsData<Ownership::value, MemSpace::device> const& other)
0132 -> RZMapFieldParamsData&
0133 {
0134 field_view = static_cast<void const*>(&other.get_view());
0135 options = other.options;
0136 min_r = other.min_r;
0137 max_r = other.max_r;
0138 min_z = other.min_z;
0139 max_z = other.max_z;
0140 return *this;
0141 }
0142
0143
0144 }