root / synthbench / euroben-ports / base / C-MPI / mod2f / check.c @ 0:839f52ef7657
History | View | Annotate | Download (2.1 kB)
1 |
#include <math.h> |
---|---|
2 |
#include <mpi.h> |
3 |
#include "mpiargs.h" |
4 |
|
5 |
int check( int m, int n, double **a, double **b, double err ) |
6 |
//----------------------------------------------------------------------
|
7 |
//--- 'check' checks the errors made in the transformation of a
|
8 |
// complex-to-complex FFT. 'check' is specific for the input
|
9 |
// of this program.
|
10 |
// The Real part is a full cycle of a cosine signal and the
|
11 |
// Imaginary part is 0.0 everywhere.
|
12 |
// The resulting transform should show values of N/2 for
|
13 |
// A[1] and A[N-1]. All other entries should be 0.0.
|
14 |
// This is checked below with a Floating-Point error
|
15 |
// margin of ERR = ( 10.0*N Log N )*EPS, with EPS the
|
16 |
// Floating-Point spacing of the machine tested.
|
17 |
//--- The Real part of A is stored in A[0], ..., A[N-1];
|
18 |
// The Imaginary part in B[0], ..., B[N-1].
|
19 |
//----------------------------------------------------------------------
|
20 |
{ |
21 |
MPI_Comm comm = MPI_COMM_WORLD; |
22 |
int i, j, nlen, ok = 0, all_ok = 0; |
23 |
//----------------------------------------------------------------------
|
24 |
nlen = m*n*nodes; |
25 |
for( i = 0; i < m; i++ ) { // Check imaginary elements. |
26 |
for( j = 0; j < n; j++ ) { |
27 |
if ( fabs( b[i][j] ) > err ) ok++;
|
28 |
} |
29 |
} |
30 |
if ( me == 0 ) // Check 1st elem. in nodes 0. |
31 |
if ( fabs( a[0][0] ) > err ) ok++; |
32 |
if ( me != 0 && me != nodes - 1 ) { // Check all real elem. in |
33 |
for( i = 0; i < m; i++ ) { // nodes 1..(nodes-2). |
34 |
for( j = 0; j < n; j++ ) { |
35 |
if ( fabs( a[i][j] ) > err ) ok++;
|
36 |
} |
37 |
} |
38 |
} |
39 |
if ( me == 0 ) { // Check real part of transform |
40 |
for( j = 2; j < n; j++ ) { // in node 0 that should be 0. |
41 |
if ( fabs( a[0][j] ) > err ) ok++; |
42 |
} |
43 |
} |
44 |
if ( me == 0 ) // Check 1st non-zero element. |
45 |
if( fabs( a[0][1] ) - (double)nlen/2 > err ) ok++; |
46 |
if ( me == ( nodes - 1 ) ) // Check 2nd non-zero element. |
47 |
if ( fabs( a[m-1][n-1] ) - (double)nlen/2 > err ) ok++; |
48 |
MPI_Reduce( &ok, &all_ok, 1, MPI_INT, MPI_SUM, 0, comm ); |
49 |
return( all_ok );
|
50 |
} |