Hello:
The program below always gives a0sum == a1sum (both are more or less straightforward ways to sum all elements in the 2D array ad2phi); however, a2sum and a3sum (both calculated with + reduce) give different values from a0sum; moreover, sometimes a2sum == a3sum, and sometimes not: running the program several times gives different results. I wonder if + reduce is not meant for multidimensional arrays, or if I am using the syntax wrongly. (Done with chapel 2.4.0)
Thanks
Nelson
use Math only sin,cos,pi;
config const N = 16 ;
const del = 2*pi/(N+1);
var Di = {1..N,1..N};
writeln("Di = ",Di);
var ad2phi: [Di] real ;
// -----------------------------------------------------------------------------
// the analytical values
// -----------------------------------------------------------------------------
var a0sum = 0.0;
for (i,j) in Di do {
var x = -pi + i*del;
var y = -pi + j*del;
ad2phi[i,j] = anadel2(x,y);
a0sum += ad2phi[i,j] ;
}
var a1sum = asum(ad2phi);
var a2sum;
a2sum = (+ reduce ad2phi);
var a3sum = (+ reduce ad2phi);
writeln("a0sum = ",a0sum);
writeln("a1sum = ",a1sum);
writeln("a2sum = ",a2sum);
writeln("a3sum = ",a3sum);
proc anadel2(
const in x: real,
const in y: real
) : real {
return (-y**4 - x**2 * y**2 + 2)*sin(x*y) + 4*x*y*cos(x*y) + 6*x;
}
// -------------------------------------------------------------------
// --> sum: sum all elements in array x
// -------------------------------------------------------------------
proc asum(x: [] real): real {
var sum: real = 0.0;
for a in x do {
sum += a;
}
return sum;
}