Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:53:38

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file celeritas/field/detail/CovfieFieldTraits.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include <covfie/core/backend/primitive/array.hpp>
0010 #include <covfie/core/backend/transformer/affine.hpp>
0011 #include <covfie/core/backend/transformer/linear.hpp>
0012 #include <covfie/core/backend/transformer/strided.hpp>
0013 #include <covfie/core/field.hpp>
0014 
0015 #include "corecel/Config.hh"
0016 
0017 #include "corecel/Macros.hh"
0018 #include "corecel/Types.hh"
0019 #include "geocel/Types.hh"
0020 
0021 #if CELERITAS_USE_CUDA
0022 #    include <covfie/cuda/backend/primitive/cuda_texture.hpp>
0023 #elif CELERITAS_USE_HIP
0024 #    include <covfie/hip/backend/primitive/hip_device_array.hpp>
0025 #endif
0026 
0027 namespace celeritas
0028 {
0029 namespace detail
0030 {
0031 //---------------------------------------------------------------------------//
0032 //! Covfie field type
0033 template<MemSpace M>
0034 struct CovfieFieldTraits;
0035 
0036 template<>
0037 struct CovfieFieldTraits<MemSpace::host>
0038 {
0039     using storage_t = covfie::backend::array<covfie::vector::float3>;
0040     using dimensioned_t
0041         = covfie::backend::strided<covfie::vector::size3, storage_t>;
0042     using interp_t = covfie::backend::linear<dimensioned_t>;
0043     using transformed_t = covfie::backend::affine<interp_t>;
0044     using field_t = covfie::field<transformed_t>;
0045     using builder_t = covfie::field<dimensioned_t>;
0046 
0047     static Real3 to_array(field_t::output_t const& vec)
0048     {
0049         return {vec[0], vec[1], vec[2]};
0050     }
0051 };
0052 
0053 template<>
0054 struct CovfieFieldTraits<MemSpace::device>
0055 {
0056     using float3 = covfie::vector::float3;
0057 #if CELERITAS_USE_CUDA
0058     using storage_t = covfie::backend::cuda_texture<float3, float3>;
0059     using transformed_t = covfie::backend::affine<storage_t>;
0060 #else
0061 // Manually interpolate rather than relying on texture memory
0062 #    if CELERITAS_USE_HIP
0063     using storage_t = covfie::backend::hip_device_array<float3, float3>;
0064 #    else
0065     using storage_t = covfie::backend::array<float3>;
0066 #    endif
0067 
0068     using dimensioned_t
0069         = covfie::backend::strided<covfie::vector::size3, storage_t>;
0070     using interp_t = covfie::backend::linear<dimensioned_t>;
0071     using transformed_t = covfie::backend::affine<interp_t>;
0072 #endif
0073 
0074     using field_t = covfie::field<transformed_t>;
0075 
0076     CELER_FUNCTION static Real3 to_array(field_t::output_t const& vec)
0077     {
0078         return {vec[0], vec[1], vec[2]};
0079     }
0080 };
0081 
0082 //---------------------------------------------------------------------------//
0083 }  // namespace detail
0084 }  // namespace celeritas