| [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 | 
 | 
|---|