diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5cd73350..e99e0aef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,5 +5,6 @@ add_subdirectory(csr) add_subdirectory(exterior) add_subdirectory(mesher) add_subdirectory(misc) +add_subdirectory(normalization) add_subdirectory(tensor) add_subdirectory(young_tableau) diff --git a/src/normalization/CMakeLists.txt b/src/normalization/CMakeLists.txt new file mode 100644 index 00000000..a8ad09d8 --- /dev/null +++ b/src/normalization/CMakeLists.txt @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2024 Baptiste Legouix +# SPDX-License-Identifier: GPL-3.0-or-later + +add_library("normalization" INTERFACE) + +target_include_directories("normalization" INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}") + +find_package(Boost REQUIRED) + +target_link_libraries("normalization" INTERFACE DDC::DDC sil::tensor) + +add_library("sil::normalization" ALIAS "normalization") diff --git a/src/normalization/normalization.hpp b/src/normalization/normalization.hpp new file mode 100644 index 00000000..15b2e6c5 --- /dev/null +++ b/src/normalization/normalization.hpp @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2024 Baptiste Legouix +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +#include "tensor.hpp" + +namespace sil { + +namespace normalization { + +template < + misc::Specialization MetricIndex, + misc::Specialization TensorType, + misc::Specialization PositionType, + misc::Specialization MetricType> +KOKKOS_FUNCTION TensorType inplace_normalize(TensorType tensor, PositionType pos, MetricType metric) +{ + assert(tensor.non_indices_domain() == metric.non_indices_domain()); + tensor::tensor_accessor_for_domain_t>, + second>>> + metric_prod_accessor; + ddc::Chunk metric_prod_alloc( + ddc::cartesian_prod_t< + typename TensorType::non_indices_domain_t, + metric_prod_domain_t< + MetricIndex, + primes>, + seconds>>>( + tensor.non_indices_domain(), + metric_prod_accessor.mem_domain()), + ddc::HostAllocator()); + tensor::Tensor< + double, + ddc::cartesian_prod_t< + typename TensorType::non_indices_domain_t, + metric_prod_domain_t< + MetricIndex, + primes>, + seconds>>>, + Kokkos::layout_right, + Kokkos::DefaultHostExecutionSpace::memory_space> + metric_prod(metric_prod_alloc); + + fill_metric_prod< + MetricIndex, + primes>, + seconds>>(metric_prod, metric); + + ddc::parallel_for_each( + Kokkos::DefaultHostExecutionSpace(), + tensor.domain(), + [&](typename TensorType::discrete_element_type elem) { + tensor[elem] + *= tensor::tensor_prod(metric_prod[elem], pos[elem] - pos[elem]); // TODO + }); + return tensor; +} + +} // namespace normalization + +} // namespace sil