#pragma once #include "../common.hpp" #include "../iterator.hpp" namespace kel { namespace lbm { template saw::data n_closest_read(const saw::data,Encode>& f, const saw::data>& frac_ind){ auto shift_frac_ind = frac_ind; for(uint64_t i{0u}; i < D; ++i){ shift_frac_ind.at({{i}}) = shift_frac_ind.at({{i}}) + saw::data{0.5}; if(shift_frac_ind.at({{i}}).get() < 0){ shift_frac_ind.at({{i}}) = {}; } } saw::data> shift_ind; for(uint64_t i{0u}; i < D; ++i){ shift_ind.at({i}) = frac_ind.at({{i}}).template cast_to(); } return f.at(shift_ind); } template void n_closest_add(const saw::data,Encode>& f, const saw::data>& frac_ind, const saw::data& val){ auto shift_frac_ind = frac_ind; for(uint64_t i{0u}; i < D; ++i){ shift_frac_ind.at({{i}}) = shift_frac_ind.at({{i}}) + saw::data{0.5}; if(shift_frac_ind.at({{i}}).get() < 0){ shift_frac_ind.at({{i}}) = {}; } } auto f_meta = f.meta(); saw::data> shift_ind; for(uint64_t i{0u}; i < D; ++i){ shift_ind.at({i}) = frac_ind.at({{i}}).template cast_to(); if(shift_ind.at({i}) < f_meta.at({i})){ shift_ind.at({i}) = f_meta.at({i}) - 1u; } } auto& f_i = f.at(shift_ind); f_i = f_i + val; } } }