24TEST_CASE(
"Make an Airy pattern and go back to pupil on CPU",
"[wfp]" )
27 typedef std::complex<realT> complexT;
33 pupil.resize( pupSz, pupSz );
37 complexFieldT complexPupil, complexFocal;
40 complexPupil.resize( wfSz, wfSz );
41 complexFocal.resize( wfSz, wfSz );
42 realFocal.resize( wfSz, wfSz );
43 realPupil.resize( wfSz, wfSz );
50 mx::wfp::extractIntensityImage( realFocal, 0, complexFocal.rows(), 0, complexFocal.cols(), complexFocal, 0, 0 );
52 realT expwr = pupil.square().sum();
53 realT pwr = realFocal.sum();
55 REQUIRE_THAT( expwr, Catch::Matchers::WithinAbs( pwr, ( pwr ) * ( 1e-4 ) ) );
57 complexPupil.setZero();
60 mx::wfp::extractIntensityImage( realPupil, 0, complexPupil.rows(), 0, complexPupil.cols(), complexPupil, 0, 0 );
62 REQUIRE_THAT( realPupil.sum(), Catch::Matchers::WithinAbs( pupil.sum(), pupil.sum() * 1e-4 ) );
70TEST_CASE(
"Make an Airy pattern and go back to pupil on GPU",
"[wfp]" )
72 if( !mxlibTest::cudaDeviceAvailable() )
74 WARN(
"CUDA runtime is available but no CUDA device is present" );
79 typedef std::complex<realT> complexT;
85 pupil.resize( pupSz, pupSz );
89 complexFieldT complexPupil, complexFocal;
92 complexPupil.resize( wfSz, wfSz );
93 complexFocal.resize( wfSz, wfSz );
94 realFocal.resize( wfSz, wfSz );
95 realPupil.resize( wfSz, wfSz );
100 mx::cuda::cudaPtr<complexT> dev_complexPupil, dev_complexFocal;
102 dev_complexPupil.upload( complexPupil.data(), complexPupil.rows(), complexPupil.cols() );
103 dev_complexFocal.resize( complexPupil.rows(), complexPupil.cols() );
111 dev_complexFocal.download( complexFocal.data() );
115 mx::wfp::extractIntensityImage( realFocal, 0, complexFocal.rows(), 0, complexFocal.cols(), complexFocal, 0, 0 );
119 realT expwr = pupil.square().sum();
120 realT pwr = realFocal.sum();
122 REQUIRE_THAT( expwr, Catch::Matchers::WithinAbs( pwr, ( pwr ) * ( 1e-4 ) ) );
130 complexPupil.setZero();
131 dev_complexPupil.download( complexPupil.data() );
133 mx::wfp::extractIntensityImage( realPupil, 0, complexPupil.rows(), 0, complexPupil.cols(), complexPupil, 0, 0 );
135 REQUIRE_THAT( realPupil.sum(), Catch::Matchers::WithinAbs( pupil.sum(), pupil.sum() * 1e-4 ) );
void maskCircle(arrayT &m, typename arrayT::Scalar xcen, typename arrayT::Scalar ycen, typename arrayT::Scalar rad, typename arrayT::Scalar val, typename arrayT::Scalar pixbuf=0.5)
Mask a circle in an image.
void makeComplexPupil(arrayOutT &complexPupil, const arrayInT &realPupil, int wavefrontSizePixels)
Create a complex pupil plane wavefront from a real amplitude mask.