18 return soa_padded_size<NRN_SOA_PAD>(
cnt, layout);
24 "NRN_SOA_BYTE_ALIGN should be a multiple of sizeof(double)");
26 size_t remainder = size % dbl_align;
28 size += dbl_align - remainder;
37 return icnt * sz + isz;
40 return icnt + isz * padded_cnt;
48 int variable_count =
static_cast<int>(array_dims.size());
49 int row_width = std::accumulate(array_dims.begin(), array_dims.end(), 0);
51 int column_index = legacy_index % row_width;
53 int instance_index = legacy_index / row_width;
54 int variable_index = 0;
56 for (
size_t k = 0;
k < variable_count - 1; ++
k) {
57 if (column_index >= prefix_sum + array_dims[
k]) {
58 prefix_sum += array_dims[
k];
59 variable_index =
k + 1;
64 int array_index = column_index - prefix_sum;
66 return {instance_index, variable_index, array_index};
70 const std::vector<int>& array_dims,
71 int padded_node_count,
73 auto [
i,
j,
k] = soaos_indices;
79 for (
int ij = 0; ij <
j; ++ij) {
80 offset += padded_node_count * array_dims[ij];
83 int K = array_dims[
j];
84 return offset +
i *
K +
k;
#define NRN_SOA_BYTE_ALIGN
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
int soaos2cnrn_index(const std::array< int, 3 > &soaos_indices, const std::vector< int > &array_dims, int padded_node_count, int *permute)
Compute the CoreNEURON index given an SoAoS index.
int nrn_i_layout(int icnt, int cnt, int isz, int sz, int layout)
This function return the index in a flat array of a matrix coordinate (icnt, isz).
std::array< int, 3 > legacy2soaos_index(int legacy_index, const std::vector< int > &array_dims)
Split a legacy index into the three SoAoS indices.
size_t nrn_soa_byte_align(size_t size)
return the new offset considering the byte aligment settings
int nrn_soa_padded_size(int cnt, int layout)
calculate size after padding for specific memory layout
static int permute(int i, NrnThread &nt)
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status