sandbox/bugs/scalar_field_multilayer_potential_bug.c
The following code is a simple script illustrating the observed behaviour. We start by initializing a small 4 cell domain with four layers
#include "grid/multigrid1D.h"
#include "layered/hydro.h"
int main() {
N = 4;
nl = 4;
L0 = 4;
run();
}
In the init event, we construct a scalar field s and fill it with zeroes. Then we print the scalar field illustrating that all cell values are zero. We then change the value of a single cell from zero to one. Now, when we print the scalar field, a total of nl cell values have been changed to one! Finally we illustrate the computed sum of all cell values to be nl rather than one.
The supposed bug was due to a misunderstanding of the way multilayer fields are allocated. See the documentation.
// Initializing empty scalar field
#if 0
scalar s[]; // this is not a multilayer field allocation...
#else
scalar s = new scalar[nl]; // this is a multilayer field allocation
#endif
foreach(){
foreach_layer(){
s[] = 0;
}
}
FILE * fp = fopen ("out.txt", "w");
// Printing value of scalar field in each cell
fprintf(fp, "Initial field:\n");
foreach(){
foreach_layer(){
fprintf(fp, "s[] = %g\n", s[]);
}
}
// Changing value of s in a single cell.
int inject_id = 2;
int k = 0;
foreach(){
foreach_layer(){
if (k == inject_id){
s[] = 1; // Same behaviour observed when using s[]++;
}
k++;
}
}
// Printing changed scalar field
fprintf(fp, "\nChanged field:\n");
int expected_sum = 1;
int computed_sum = 0;
foreach(){
foreach_layer(){
fprintf(fp, "s[] = %g\n", s[]);
computed_sum += s[];
}
}
fprintf(fp, "expected: %d computed: %d\n", expected_sum, computed_sum);
fclose (fp);
}
The output is not what is expected: