source: Sophya/trunk/SophyaProg/Examples/apcxx_cstyle.icc@ 3079

Last change on this file since 3079 was 1634, checked in by ansari, 24 years ago

Ajout exemples de filtrage de Fourier sur tableaux + ecriture equivalente en C , Reza 13/8/2001

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