Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:17

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 // Project include(s)
0012 #include "detray/core/detector.hpp"
0013 #include "detray/detectors/toy_metadata.hpp"
0014 
0015 // Detray test include(s)
0016 #include "detray/test/common/bfield.hpp"
0017 #include "detray/test/device/propagator_test.hpp"
0018 
0019 // Vecmem include(s)
0020 #include <vecmem/memory/memory_resource.hpp>
0021 #include <vecmem/utils/hip/copy.hpp>
0022 
0023 namespace detray {
0024 
0025 using scalar = test::scalar;
0026 
0027 // this namespace - dependence with covfie -> cannot run it until solving the
0028 // covfie::hip
0029 /*namespace bfield::hip {
0030 
0031 // Inhomogeneous field (hip)
0032 using inhom_bknd_t = covfie::backend::affine<covfie::backend::linear<
0033     covfie::backend::strided<covfie::vector::vector_d<std::size_t, 3>,
0034                              covfie::backend::hip_device_array<
0035                                  covfie::vector::vector_d<scalar, 3>>>>>
0036 
0037 }  // namespace bfield::hip*/
0038 
0039 /// Launch the propagation test kernel
0040 template <typename bfield_bknd_t, typename detector_t>
0041 void propagator_test(
0042     typename detector_t::view_type, const propagation::config &,
0043     covfie::field_view<bfield_bknd_t>, vecmem::data::vector_view<test_track> &,
0044     vecmem::data::jagged_vector_view<detail::step_data<test_algebra>> &);
0045 
0046 /// Test function for propagator on the device
0047 template <typename bfield_bknd_t, typename detector_t>
0048 inline auto run_propagation_device(
0049     vecmem::memory_resource *mr, const propagation::config &cfg,
0050     typename detector_t::view_type det_view,
0051     covfie::field_view<bfield_bknd_t> field_data, dvector<test_track> &tracks,
0052     const vecmem::jagged_vector<detail::step_data<test_algebra>> &host_steps)
0053     -> vecmem::jagged_vector<detail::step_data<test_algebra>> {
0054   // Helper object for performing memory copies.
0055   vecmem::copy copy;
0056 
0057   // Get tracks data
0058   auto tracks_data = vecmem::get_data(tracks);
0059 
0060   // Create vector buffer for track recording
0061   std::vector<std::size_t> sizes(tracks.size(), 0);
0062   std::vector<std::size_t> capacities;
0063   for (auto &st : host_steps) {
0064     // Add a few more elements for security (in case the device finds more
0065     // surfaces)
0066     capacities.push_back(st.size() + 10u);
0067   }
0068 
0069   vecmem::data::jagged_vector_buffer<detail::step_data<test_algebra>>
0070       steps_buffer(capacities, *mr, nullptr,
0071                    vecmem::data::buffer_type::resizable);
0072 
0073   copy.setup(steps_buffer)->wait();
0074 
0075   // Run the propagator test for GPU device
0076   propagator_test<bfield_bknd_t, detector_t>(det_view, cfg, field_data,
0077                                              tracks_data, steps_buffer);
0078 
0079   vecmem::jagged_vector<detail::step_data<test_algebra>> steps(mr);
0080 
0081   copy(steps_buffer, steps)->wait();
0082 
0083   return steps;
0084 }
0085 
0086 /// Test chain for the propagator
0087 template <typename device_bfield_bknd_t, typename host_bfield_bknd_t,
0088           typename detector_t>
0089 inline auto run_propagation_test(vecmem::memory_resource *mr, detector_t &det,
0090                                  const propagator_test_config &cfg,
0091                                  typename detector_t::view_type det_view,
0092                                  covfie::field<host_bfield_bknd_t> &&field) {
0093   // Create the vector of initial track parameterizations
0094   auto tracks_host = generate_tracks<generator_t>(mr, cfg.track_generator);
0095   vecmem::vector<test_track> tracks_device(tracks_host, mr);
0096 
0097   // Host propagation
0098   auto host_steps =
0099       run_propagation_host(mr, det, cfg.propagation, field, tracks_host);
0100 
0101   // Device propagation (device backend specific implementation)
0102   covfie::field<device_bfield_bknd_t> device_field(field);
0103   auto device_steps = run_propagation_device<device_bfield_bknd_t, detector_t>(
0104       mr, cfg.propagation, det_view, device_field, tracks_device, host_steps);
0105 
0106   // Check the results
0107   compare_propagation_results(host_steps, device_steps);
0108 }
0109 
0110 }  // namespace detray