Accessing Data in BaryonField¶
For performance reasons, Enzo uses Fortran source to do all the
important work. Because of this, it doesn’t use the standard C/C++
data structure for the 3D BaryonField array, which stores all the
Eulerian data.
BaryonField is stored as a one dimensional array. Typically C/C++
data is stored in row major order. ENZO DATA IS STORED IN COLUMN
MAJOR ORDER because of its Fortran underpinnings.
To map between one and three dimensions, in column major order, use the following:
OneDindex = i + nx*j + nx*ny*k
in Enzo grid member functions, this can be done like this:
index = i + GridDimension[0]*(j + GridDimension[1]*k);
It should also be mentioned that it is always important to access
data in ‘stride 1’ order. That means accessing data in the order it
is stored in memory. So to set all BaryonFields to the number
12345.6:
int index;
for(int field=0;field<NumberOfBaryonFields;field++)
for(int k=0;k<GridDimension[2]; k++)
for(int j=0;j<GridDimension[1]; j++)
for(int i=0;i<GridDimension[0]; i++){
index = i + GridDimension[0]*(j + GridDimension[1]*k);
BaryonField[field][index] = 12345.6;
}
This loops over the ghost zones as well as the active zones. To
loop over only active zones, use GridStartIndex and GridEndIndex.
Note that this loop must include GridEndIndex
int index;
for(int field=0;field<NumberOfBaryonFields;field++)
for(int k=GridStartIndex[2];k<=GridEndIndex[2]; k++)
for(int j=GridStartIndex[1];j<=GridEndIndex[1]; j++)
for(int i=GridStartIndex[0];i<=GridEndIndex[0]; i++){
index = i + GridDimension[0]*(j + GridDimension[1]*k);
BaryonField[field][index] = 12345.6;
}