/*
arrayIndex.c
*/

#include "oth.h"

// E array index
// loop order : Ey -> Ez -> Ex ... Ex -> Ey -> Ez
int64_t arrayIndex(
	int i0ex, int i1ex, int j0ex, int j1ex, int k0ex, int k1ex,
	int i0ey, int i1ey, int j0ey, int j1ey, int k0ey, int k1ey,
	int i0ez, int i1ez, int j0ez, int j1ez, int k0ez, int k1ez)
{
	NEXI =
	NEYI =
	NEZI = (j1ex - j0ex + 1) * (k1ex - k0ex + 1)   // X per i
	     + (j1ey - j0ey + 1) * (k1ey - k0ey + 1)   // Y per i
	     + (j1ez - j0ez + 1) * (k1ez - k0ez + 1);  // Z per i
	NEXJ =                      k1ex - k0ex + 1;   // X per j
	NEYJ =                      k1ey - k0ey + 1;   // Y per j
	NEZJ =                      k1ez - k0ez + 1;   // Z per j
	NEXK = 1;                                      // X per k
	NEYK = 1;                                      // Y per k
	NEZK = 1;                                      // Z per k
	NEY0 = - (NEYI * i0ey) - (NEYJ * j0ey) - (NEYK * k0ey);
	NEZ0 = - (NEZI * i0ez) - (NEZJ * j0ez) - (NEZK * k0ez) + (j1ey - j0ey + 1) * (k1ey - k0ey + 1);
	NEX0 = - (NEXI * i0ex) - (NEXJ * j0ex) - (NEXK * k0ex) + (j1ey - j0ey + 1) * (k1ey - k0ey + 1)
	                                                       + (j1ez - j0ez + 1) * (k1ez - k0ez + 1);
	return
		(i1ex - i0ex + 1) * (j1ex - j0ex + 1) * (k1ex - k0ex + 1) +  // X
		(i1ey - i0ey + 1) * (j1ey - j0ey + 1) * (k1ey - k0ey + 1) +  // Y
		(i1ez - i0ez + 1) * (j1ez - j0ez + 1) * (k1ez - k0ez + 1);   // Z
}
/*
// H array index
// loop order : Hy -> Hz -> Hx ... Hx -> Hy -> Hz
int64_t arrayIndexH(
	int i0hx, int i1hx, int j0hx, int j1hx, int k0hx, int k1hx,
	int i0hy, int i1hy, int j0hy, int j1hy, int k0hy, int k1hy,
	int i0hz, int i1hz, int j0hz, int j1hz, int k0hz, int k1hz)
{
	NHXI =
	NHYI =
	NHZI = (j1hx - j0hx + 1) * (k1hx - k0hx + 1)   // X per i
	     + (j1hy - j0hy + 1) * (k1hy - k0hy + 1)   // Y per i
	     + (j1hz - j0hz + 1) * (k1hz - k0hz + 1);  // Z per i
	NHXJ =                      k1hx - k0hx + 1;   // X per j
	NHYJ =                      k1hy - k0hy + 1;   // Y per j
	NHZJ =                      k1hz - k0hz + 1;   // Z per j
	NHXK = 1;                                      // X per k
	NHYK = 1;                                      // Y per k
	NHZK = 1;                                      // Z per k
	NHY0 = - (NHYI * i0hy) - (NHYJ * j0hy) - (NHYK * k0hy);
	NHZ0 = - (NHZI * i0hz) - (NHZJ * j0hz) - (NHZK * k0hz) + (j1hy - j0hy + 1) * (k1hy - k0hy + 1);
	NHX0 = - (NHXI * i0hx) - (NHXJ * j0hx) - (NHXK * k0hx) + (j1hy - j0hy + 1) * (k1hy - k0hy + 1)
	                                                       + (j1hz - j0hz + 1) * (k1hz - k0hz + 1);
	return
		(i1hx - i0hx + 1) * (j1hx - j0hx + 1) * (k1hx - k0hx + 1) +  // X
		(i1hy - i0hy + 1) * (j1hy - j0hy + 1) * (k1hy - k0hy + 1) +  // Y
		(i1hz - i0hz + 1) * (j1hz - j0hz + 1) * (k1hz - k0hz + 1);   // Z
}
*/
