Commit e70a251fdd863e281bbf3ae30319e4ed8ae95a97
1 parent
20e5e34a
fixed double precision errors
Showing
3 changed files
with
35 additions
and
6 deletions
Show diff stats
fieldslice.cpp
@@ -23,19 +23,27 @@ fieldslice::fieldslice(unsigned int x_size, unsigned int y_size) | @@ -23,19 +23,27 @@ fieldslice::fieldslice(unsigned int x_size, unsigned int y_size) | ||
23 | void fieldslice::toAngularSpectrum() | 23 | void fieldslice::toAngularSpectrum() |
24 | { | 24 | { |
25 | cufftHandle plan; | 25 | cufftHandle plan; |
26 | + cufftResult result; | ||
26 | 27 | ||
27 | //create a CUFFT plan handle | 28 | //create a CUFFT plan handle |
28 | - if(cufftPlan2d(&plan, R[0], R[1], CUFFT_C2C) != CUFFT_SUCCESS) | 29 | +#ifdef PRECISION_SINGLE |
30 | + result = cufftPlan2d(&plan, R[0], R[1], CUFFT_C2C); | ||
31 | +#elif defined PRECISION_DOUBLE | ||
32 | + result = cufftPlan2d(&plan, R[0], R[1], CUFFT_Z2Z); | ||
33 | +#endif | ||
34 | + | ||
35 | + if(result != CUFFT_SUCCESS) | ||
29 | { | 36 | { |
30 | cout<<"Error creating CUFFT plan for computing the angular spectrum."<<endl; | 37 | cout<<"Error creating CUFFT plan for computing the angular spectrum."<<endl; |
31 | exit(1); | 38 | exit(1); |
32 | } | 39 | } |
33 | 40 | ||
34 | #ifdef PRECISION_SINGLE | 41 | #ifdef PRECISION_SINGLE |
35 | - if(cufftExecC2C(plan, (cufftComplex*)x_hat, (cufftComplex*)x_hat, CUFFT_FORWARD) != CUFFT_SUCCESS) | 42 | + result = cufftExecC2C(plan, (cufftComplex*)x_hat, (cufftComplex*)x_hat, CUFFT_FORWARD); |
36 | #elif defined PRECISION_DOUBLE | 43 | #elif defined PRECISION_DOUBLE |
37 | - if(cufftExecZ2Z(plan, (cufftDoubleComplex*)x_hat, (cufftDoubleComplex*)x_hat, CUFFT_FORWARD) != CUFFT_SUCCESS) | 44 | + result = cufftExecZ2Z(plan, (cufftDoubleComplex*)x_hat, (cufftDoubleComplex*)x_hat, CUFFT_FORWARD); |
38 | #endif | 45 | #endif |
46 | + if(result != CUFFT_SUCCESS) | ||
39 | { | 47 | { |
40 | cout<<"Error executing the CUFFT forward FFT to compute the angular spectrum."<<endl; | 48 | cout<<"Error executing the CUFFT forward FFT to compute the angular spectrum."<<endl; |
41 | exit(1); | 49 | exit(1); |
@@ -49,19 +57,27 @@ void fieldslice::toAngularSpectrum() | @@ -49,19 +57,27 @@ void fieldslice::toAngularSpectrum() | ||
49 | void fieldslice::fromAngularSpectrum() | 57 | void fieldslice::fromAngularSpectrum() |
50 | { | 58 | { |
51 | cufftHandle plan; | 59 | cufftHandle plan; |
60 | + cufftResult result; | ||
52 | 61 | ||
53 | //create a CUFFT plan handle | 62 | //create a CUFFT plan handle |
54 | - if(cufftPlan2d(&plan, R[0], R[1], CUFFT_C2C) != CUFFT_SUCCESS) | 63 | +#ifdef PRECISION_SINGLE |
64 | + result = cufftPlan2d(&plan, R[0], R[1], CUFFT_C2C); | ||
65 | +#elif defined PRECISION_DOUBLE | ||
66 | + result = cufftPlan2d(&plan, R[0], R[1], CUFFT_Z2Z); | ||
67 | +#endif | ||
68 | + | ||
69 | + if(result != CUFFT_SUCCESS) | ||
55 | { | 70 | { |
56 | cout<<"Error creating CUFFT plan for computing the angular spectrum."<<endl; | 71 | cout<<"Error creating CUFFT plan for computing the angular spectrum."<<endl; |
57 | exit(1); | 72 | exit(1); |
58 | } | 73 | } |
59 | 74 | ||
60 | #ifdef PRECISION_SINGLE | 75 | #ifdef PRECISION_SINGLE |
61 | - if(cufftExecC2C(plan, (cufftComplex*)x_hat, (cufftComplex*)x_hat, CUFFT_INVERSE) != CUFFT_SUCCESS) | 76 | + result = cufftExecC2C(plan, (cufftComplex*)x_hat, (cufftComplex*)x_hat, CUFFT_INVERSE); |
62 | #elif defined PRECISION_DOUBLE | 77 | #elif defined PRECISION_DOUBLE |
63 | - if(cufftExecZ2Z(plan, (cufftDoubleComplex*)x_hat, (cufftDoubleComplex*)x_hat, CUFFT_INVERSE) != CUFFT_SUCCESS) | 78 | + result = cufftExecZ2Z(plan, (cufftDoubleComplex*)x_hat, (cufftDoubleComplex*)x_hat, CUFFT_INVERSE); |
64 | #endif | 79 | #endif |
80 | + if(result != CUFFT_SUCCESS) | ||
65 | { | 81 | { |
66 | cout<<"Error executing the CUFFT forward FFT to compute the angular spectrum."<<endl; | 82 | cout<<"Error executing the CUFFT forward FFT to compute the angular spectrum."<<endl; |
67 | exit(1); | 83 | exit(1); |
scalarslice.cu
@@ -47,7 +47,20 @@ void scalarslice::toImage(std::string filename, bool positive, rts::colormap::co | @@ -47,7 +47,20 @@ void scalarslice::toImage(std::string filename, bool positive, rts::colormap::co | ||
47 | //find the index of the value with maximum magnitude | 47 | //find the index of the value with maximum magnitude |
48 | int N = R[0] * R[1]; | 48 | int N = R[0] * R[1]; |
49 | int result; | 49 | int result; |
50 | +#ifdef PRECISION_SINGLE | ||
50 | stat = cublasIsamax(handle, N, S, 1, &result); | 51 | stat = cublasIsamax(handle, N, S, 1, &result); |
52 | +#elif defined PRECISION_DOUBLE | ||
53 | + stat = cublasIdamax(handle, N, S, 1, &result); | ||
54 | +#endif | ||
55 | + | ||
56 | + //adjust for 1-based indexing | ||
57 | + result -= 1; | ||
58 | + | ||
59 | + if(stat != CUBLAS_STATUS_SUCCESS) | ||
60 | + { | ||
61 | + std::cout<<"CUBLAS Error: failure finding maximum value."<<std::endl; | ||
62 | + exit(1); | ||
63 | + } | ||
51 | 64 | ||
52 | //std::cout<<"Maximum index: "<<result<<std::endl; | 65 | //std::cout<<"Maximum index: "<<result<<std::endl; |
53 | 66 |
win32/bimsim.exe
No preview for this file type