ENH: patchCloud: return pTraits<Type>::max for unfound points
[OpenFOAM-1.7.x.git] / applications / test / speed / scalarSpeedTest / scalarSpeedTest.C
blobe1858e2d42bf578d54a747c469019fedbd1a3bdd
1 #include "primitiveFields.H"
2 #include "Random.H"
3 #include "cpuTime.H"
4 #include "IOstreams.H"
5 #include "OFstream.H"
7 using namespace Foam;
9 int main()
11     Info<< "Initialising fields" << endl;
13     const label nIter = 100;
14     const label size = 10000000;
15     const label rndAddrSkip = 40;
16     const label redFac = 6;
17     const label redSize = size/redFac;
18     Random genAddr(100);
20     double* f1 = new double[size];
21     double* f2 = new double[size];
22     double* f3 = new double[size];
23     double* f4 = new double[size];
24     double* fr = new double[redSize];
25     label*  addr = new label[size];
26     label*  redAddr = new label[size];
27     label*  redAddr2 = new label[size];
29     for (register label i=0; i<size; i++)
30     {
31         f1[i] = 1.0;
32         f2[i] = 1.0;
33         f3[i] = 1.0;
34         addr[i] = i;
35         redAddr[i] = i/redFac;
36         redAddr2[i] = (size - i - 1)/redFac;
37     }
39     for (register label i=0; i<size; i+=rndAddrSkip)
40     {
41         addr[i] = genAddr.integer(0, size-1);
42     }
44     for (register label i=0; i<redSize; i++)
45     {
46         fr[i] = 1.0;
47     }
49     Info<< "Done\n" <<endl;
51     {
52         Info<< "Single loop combined operation (expression templates)"
53             << endl;
55         cpuTime executionTime;
57         for (int j=0; j<nIter; j++)
58         {
59             for (register label i=0; i<size; i++)
60             {
61                 f4[i] = f1[i] + f2[i] - f3[i];
62             }
63         }
65         Info<< "ExecutionTime = "
66             << executionTime.elapsedCpuTime()
67             << " s\n" << endl;
69         Snull<< f4[1] << endl << endl;
70     }
72     {
73         Info<< "Single loop combined operation with indirect addressing"
74             << endl;
76         cpuTime executionTime;
78         for (int j=0; j<nIter; j++)
79         {
80             for (register label i=0; i<size; i++)
81             {
82                 f4[addr[i]] = f1[addr[i]] + f2[addr[i]] - f3[addr[i]];
83             }
84         }
86         Info<< "ExecutionTime = "
87             << executionTime.elapsedCpuTime()
88             << " s\n" << endl;
90         Snull<< f4[1] << endl << endl;
91     }
93     {
94         Info<< "Single loop reduction operation"
95             << endl;
97         cpuTime executionTime;
98         label redOffset = (size - 1)/redFac;
100         for (int j=0; j<nIter; j++)
101         {
102             for (register label i=0; i<size; i++)
103             {
104                 label j = i/redFac;
105                 fr[j] += f1[i];
106                 fr[redOffset - j] -= f2[i];
107             }
108         }
110         Info<< "ExecutionTime = "
111             << executionTime.elapsedCpuTime()
112             << " s\n" << endl;
114         Snull<< fr[1] << endl << endl;
115     }
117     {
118         Info<< "Single loop reduction operation with indirect addressing"
119             << endl;
121         cpuTime executionTime;
123         for (int j=0; j<nIter; j++)
124         {
125             for (register label i=0; i<size; i++)
126             {
127                 fr[redAddr[i]] += f1[i];
128                 fr[redAddr2[i]] -= f2[i];
129             }
130         }
132         Info<< "ExecutionTime = "
133             << executionTime.elapsedCpuTime()
134             << " s\n" << endl;
136         Snull<< fr[1] << endl << endl;
137     }
139     {
140         Info<< "Separate loops ?= operations" << endl;
142         cpuTime executionTime;
144         for (int j=0; j<nIter; j++)
145         {
146             for (register label i=0; i<size; i++)
147             {
148                 f4[i] = f1[i];
149             }
150             for (register label i=0; i<size; i++)
151             {
152                 f4[i] += f2[i];
153             }
154             for (register label i=0; i<size; i++)
155             {
156                 f4[i] -= f3[i];
157             }
158         }
160         Info<< "ExecutionTime = "
161             << executionTime.elapsedCpuTime()
162             << " s\n" << endl;
164         Snull<< f4[1] << endl << endl;
165     }
167     {
168         Info<< "OpenFOAM field algebra" << endl;
170         scalarField
171             sf1(size, 1.0),
172             sf2(size, 1.0),
173             sf3(size, 1.0),
174             sf4(size);
176         cpuTime executionTime;
178         for (int j=0; j<nIter; j++)
179         {
180             //sf4 = sf1 + sf2 - sf3;
181             sf4 = sf1;
182             sf4 += sf2;
183             sf4 -= sf3;
184         }
186         Info<< "ExecutionTime = "
187             << executionTime.elapsedCpuTime()
188             << " s\n" << endl;
190         Snull<< sf4[1] << endl << endl;
191     }