| [1634] | 1 | /*  ------------------ apc.icc ------------------- | 
|---|
|  | 2 |  | 
|---|
|  | 3 | Example illustrating C programming for performing | 
|---|
|  | 4 | operations comparable to those performed in apcxx.icc | 
|---|
|  | 5 |  | 
|---|
|  | 6 | R. Ansari  08/2001 | 
|---|
|  | 7 |  | 
|---|
|  | 8 | ---- Computation steps : | 
|---|
|  | 9 | > Allocate an array representing a matrix (NL x NC )  (mtx) | 
|---|
|  | 10 | > fill it with a gaussian distributed random values | 
|---|
|  | 11 | > make a copy of the matrix   (mtxs) | 
|---|
|  | 12 | > allocate and fill 1D filter in Fourier space | 
|---|
|  | 13 | > Loop over matrix rows k | 
|---|
|  | 14 | >> Extract row k (fline) | 
|---|
|  | 15 | >> compute 1D Fourier transform FFTForward (fline) | 
|---|
|  | 16 | >> apply filter in Fourier space | 
|---|
|  | 17 | >> compute backward 1D FFT | 
|---|
|  | 18 | >> Replace matrix row with the filtered values | 
|---|
|  | 19 |  | 
|---|
|  | 20 | > free the allocated memory | 
|---|
|  | 21 |  | 
|---|
|  | 22 | this example code can be | 
|---|
|  | 23 | - included in a main program | 
|---|
|  | 24 | - executed using runcxx | 
|---|
|  | 25 | csh> runcxx -tmpdir /tmp -f apc.icc | 
|---|
|  | 26 | - executed within spiapp | 
|---|
|  | 27 | Cmd> c++execfrf apc.icc | 
|---|
|  | 28 | */ | 
|---|
|  | 29 |  | 
|---|
|  | 30 | // Select computation on float or double (r_4 r_8) | 
|---|
|  | 31 | #define FTYP r_4 | 
|---|
|  | 32 |  | 
|---|
|  | 33 | // Number of matrix lines and colums | 
|---|
|  | 34 | int NL = 1024; | 
|---|
|  | 35 | int NC = 4096; | 
|---|
|  | 36 | int i,k; | 
|---|
|  | 37 | cout << " apc : NL= " << NL << " NC= " << NC << endl; | 
|---|
|  | 38 | PrtTim("apc_Start"); | 
|---|
|  | 39 |  | 
|---|
|  | 40 | // Creation of the initial matrix | 
|---|
|  | 41 | FTYP * mtx = new FTYP [NL*NC]; | 
|---|
|  | 42 | // Filling matrix with gaussian random values | 
|---|
|  | 43 | for(i=0; i<NL*NC; i++) | 
|---|
|  | 44 | mtx[i] = 15.+NorRand()*3.; | 
|---|
|  | 45 |  | 
|---|
|  | 46 | // Allocation of the copy matrix (mtxs) | 
|---|
|  | 47 | FTYP * mtxs = new FTYP [NL*NC]; | 
|---|
|  | 48 | // copying mtxs to mtx | 
|---|
|  | 49 | for(i=0; i<NL*NC; i++) | 
|---|
|  | 50 | mtxs[i] = mtx[i]; | 
|---|
|  | 51 |  | 
|---|
|  | 52 | // Creation and initialization of the Fourier filter filt(nu) | 
|---|
|  | 53 | FTYP * filt = new FTYP [NC]; | 
|---|
|  | 54 | for(i=0; i<NC; i++) { | 
|---|
|  | 55 | filt[i] =  1.-i/(double)NC; | 
|---|
|  | 56 | filt[i] *= filt[i]; | 
|---|
|  | 57 | } | 
|---|
|  | 58 |  | 
|---|
|  | 59 |  | 
|---|
|  | 60 | // Creation of the FFTPackServer | 
|---|
|  | 61 | // We use this class to avoid to do the initialization steps needed to use fftpack. | 
|---|
|  | 62 | FFTPackServer ffts; | 
|---|
|  | 63 | ffts.setNormalize(true); | 
|---|
|  | 64 |  | 
|---|
|  | 65 | PrtTim("apc_AfterInit"); | 
|---|
|  | 66 |  | 
|---|
|  | 67 | // Allocation of the matrix row memory | 
|---|
|  | 68 | FTYP * fline = new FTYP [NC]; | 
|---|
|  | 69 |  | 
|---|
|  | 70 | //  Loop over matrix rows | 
|---|
|  | 71 | for(k=0; k<NL; k++) { | 
|---|
|  | 72 | // Matrix row extraction | 
|---|
|  | 73 | for(i=0; i<NC; i++) fline[i] = mtx[k*NC+i]; | 
|---|
|  | 74 | // Compute 1D forward FFT | 
|---|
|  | 75 | ffts.fftf(NC, fline); | 
|---|
|  | 76 | // Applying filter in Fourier space f(nu) =  f(nu)*filter(nu) | 
|---|
|  | 77 | for(i=0; i<NC; i++) fline[i] *= filt[i]; | 
|---|
|  | 78 | // backward FFT | 
|---|
|  | 79 | ffts.fftb(NC, fline); | 
|---|
|  | 80 | // replace matrix row with filtered values | 
|---|
|  | 81 | for(i=0; i<NC; i++) mtx[k*NC+i] = fline[i]; | 
|---|
|  | 82 | } | 
|---|
|  | 83 |  | 
|---|
|  | 84 | PrtTim("apc_AfterFFTLoop"); | 
|---|
|  | 85 |  | 
|---|
|  | 86 |  | 
|---|
|  | 87 | delete[] mtx; | 
|---|
|  | 88 | delete[] mtxs; | 
|---|
|  | 89 | delete[] fline; | 
|---|
|  | 90 | delete[] filt; | 
|---|
|  | 91 |  | 
|---|