| 1 | /*  ----------------- apcxx.icc ------------------- | 
|---|
| 2 |  | 
|---|
| 3 | Example illustrating C++ scientific programming | 
|---|
| 4 | using SOPHYA library arrays and FFT computation | 
|---|
| 5 | through FFTServerInterface. | 
|---|
| 6 | R. Ansari  08/2001 | 
|---|
| 7 | ---- Computation steps : | 
|---|
| 8 | > Create a matrix (NL x NC )  (mtx) | 
|---|
| 9 | > fill it with a gaussian distributed random values | 
|---|
| 10 | > make a copy of the matrix   (mtxs) | 
|---|
| 11 | > create a 1D filter in Fourier space | 
|---|
| 12 | > Loop over matrix rows k | 
|---|
| 13 | >> Extract row k (fline) | 
|---|
| 14 | >> compute 1D Fourier transform FFTForward (fline) | 
|---|
| 15 | >> apply filter in Fourier space | 
|---|
| 16 | >> compute backward 1D FFT | 
|---|
| 17 | >> Replace matrix row with the filtered values | 
|---|
| 18 |  | 
|---|
| 19 |  | 
|---|
| 20 | this example code can be | 
|---|
| 21 | - included in a main program | 
|---|
| 22 | - executed using runcxx | 
|---|
| 23 | csh> runcxx -tmpdir /tmp -f apcxx.icc | 
|---|
| 24 | - executed within spiapp | 
|---|
| 25 | Cmd> c++execfrf apcxx.icc | 
|---|
| 26 | */ | 
|---|
| 27 |  | 
|---|
| 28 | // Select computation on float or double (r_4 r_8) | 
|---|
| 29 | #define FTYP r_4 | 
|---|
| 30 |  | 
|---|
| 31 | // Number of matrix lines and colums | 
|---|
| 32 | int NL = 1024; | 
|---|
| 33 | int NC = 4096; | 
|---|
| 34 | cout << " apc_xx : NL= " << NL << " NC= " << NC << endl; | 
|---|
| 35 | PrtTim("apcxx_Start"); | 
|---|
| 36 |  | 
|---|
| 37 | // BaseArray::SetDefaultMemoryMapping(BaseArray::CMemoryMapping); | 
|---|
| 38 | // BaseArray::SetMaxPrint(10, 3); | 
|---|
| 39 |  | 
|---|
| 40 | // Creation of the initial matrix | 
|---|
| 41 | TMatrix< FTYP > mtx(NL, NC), mtxs; | 
|---|
| 42 | // Filling matrix with gaussian random values | 
|---|
| 43 | mtx = RandomSequence(RandomSequence::Gaussian, 15., 3.); | 
|---|
| 44 | // Making a copy of the original matrix | 
|---|
| 45 | mtxs = mtx; | 
|---|
| 46 |  | 
|---|
| 47 | // Creation and initialization of the Fourier filter filt(nu) = 1/(1+0.3*nu) | 
|---|
| 48 | int LFFT = NC/2+1; | 
|---|
| 49 | TVector< complex< FTYP > > filt(LFFT, BaseArray::RowVector); | 
|---|
| 50 | filt(0) = 1.; | 
|---|
| 51 | for(int i=1; i<filt.Size(); i++) | 
|---|
| 52 | filt(i) = 1./(1+0.3*(double)i); | 
|---|
| 53 |  | 
|---|
| 54 |  | 
|---|
| 55 | // Creation of the FFTServer | 
|---|
| 56 | FFTPackServer ffts; | 
|---|
| 57 | ffts.setNormalize(true); | 
|---|
| 58 |  | 
|---|
| 59 | PrtTim("apcxx_AfterInit"); | 
|---|
| 60 |  | 
|---|
| 61 | // Vectors for FFT operations | 
|---|
| 62 | TVector< FTYP > fline(NC, BaseArray::RowVector); | 
|---|
| 63 | TVector< complex< FTYP > > vfft; | 
|---|
| 64 |  | 
|---|
| 65 | //  Loop over matrix rows | 
|---|
| 66 | for(int k=0; k<NL; k++) { | 
|---|
| 67 | fline = mtx.Row(k);      // Matrix row extraction | 
|---|
| 68 | ffts.FFTForward(fline, vfft);    // Compute 1D forward FFT | 
|---|
| 69 | // Applying filter in Fourier space f(nu) =  f(nu)*filter(nu) | 
|---|
| 70 | vfft.MulElt(filt); | 
|---|
| 71 | ffts.FFTBackward(vfft, fline);   // backward FFT | 
|---|
| 72 | mtx.Row(k) = fline;      // replace matrix row with filtered values | 
|---|
| 73 | } | 
|---|
| 74 |  | 
|---|
| 75 | PrtTim("apcxx_AfterFFTLoop"); | 
|---|
| 76 |  | 
|---|
| 77 | // Macro KeepObj can be used with runcxx or within (s)piapp | 
|---|
| 78 | // KeepObj(mtx); | 
|---|
| 79 | // KeepObj(mtxs); | 
|---|
| 80 |  | 
|---|