Salome HOME
d786e7b1d45da91e7e43c58760bdb2bd8afc2d7d
[modules/med.git] / src / ParaMEDMEMTest / ParaMEDMEMTest_Gauthier1.cxx
1 // Copyright (C) 2007-2013  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "ParaMEDMEMTest.hxx"
21 #include <cppunit/TestAssert.h>
22
23 #include <string>
24 #include "CommInterface.hxx"
25 #include "ProcessorGroup.hxx"
26 #include "MPIProcessorGroup.hxx"
27 #include "DEC.hxx"
28 #include "InterpKernelDEC.hxx"
29 #include <set>
30 #include <time.h>
31 #include "ICoCoTrioField.hxx"
32 #include <iostream>
33 #include <assert.h>
34 #include <math.h>
35
36 using namespace std;
37 using namespace ParaMEDMEM;
38 using namespace ICoCo;
39
40 void afficheGauthier1( const TrioField&   field, const double *vals, int lgth)
41 {
42   CPPUNIT_ASSERT_EQUAL(lgth,field._nb_elems);
43   for (int ele=0;ele<field._nb_elems;ele++)
44     CPPUNIT_ASSERT_DOUBLES_EQUAL(vals[ele],field._field[ele],1e-12);
45 }
46
47 void remplit_coordGauthier1(double* coords)
48 {
49   double angle,epaisseur;
50   angle=0*45*(asin(1.)/90);
51   epaisseur=1e-0;
52   coords[0*3+0]=0.;
53   coords[0*3+1]=0.;
54   coords[0*3+2]=0.;
55   
56   coords[1*3+0]=cos(angle);
57   coords[1*3+1]=0.;
58   coords[1*3+2]=sin(angle);
59   
60     
61   coords[2*3+0]=-sin(angle);
62   coords[2*3+1]=0.;
63   coords[2*3+2]=cos(angle);
64   
65   for (int d=0;d<3;d++)
66     coords[3*3+d]=coords[1*3+d]+ coords[2*3+d];
67   
68   for (int i=4;i<8;i++)
69     {
70       for (int d=0;d<3;d++)
71         coords[i*3+d]=coords[(i-4)*3+d];
72       coords[i*3+1]+=epaisseur;
73     }
74
75 }
76
77 void init_quadGauthier1(TrioField& champ_quad,int is_master)
78 {
79   
80   champ_quad.setName("champ_quad");
81   champ_quad._space_dim=3;
82   champ_quad._mesh_dim=2;
83   champ_quad._nodes_per_elem=4;
84   champ_quad._itnumber=0;
85   champ_quad._time1=0;
86   champ_quad._time2=1;
87   champ_quad._nb_field_components=1;
88
89   if (is_master)
90     {
91       champ_quad._nbnodes=8;
92       champ_quad._nb_elems=2;
93       
94       champ_quad._coords=new double[champ_quad._nbnodes*champ_quad._space_dim];
95       //memcpy(afield._coords,sommets.addr(),champ_quad._nbnodes*champ_quad._space_dim*sizeof(double));
96       
97       remplit_coordGauthier1(champ_quad._coords);
98   
99   
100       champ_quad._connectivity=new int[champ_quad._nb_elems*champ_quad._nodes_per_elem];
101       champ_quad._connectivity[0*champ_quad._nodes_per_elem+0]=0;
102       champ_quad._connectivity[0*champ_quad._nodes_per_elem+1]=1;
103       champ_quad._connectivity[0*champ_quad._nodes_per_elem+2]=3;
104       champ_quad._connectivity[0*champ_quad._nodes_per_elem+3]=2;
105       champ_quad._connectivity[1*champ_quad._nodes_per_elem+0]=4;
106       champ_quad._connectivity[1*champ_quad._nodes_per_elem+1]=5;
107       champ_quad._connectivity[1*champ_quad._nodes_per_elem+2]=7;
108       champ_quad._connectivity[1*champ_quad._nodes_per_elem+3]=6;
109       
110     }
111   else
112     {
113       champ_quad._nbnodes=0;
114       champ_quad._nb_elems=0;
115       champ_quad._coords=new double[champ_quad._nbnodes*champ_quad._space_dim];
116     
117     }
118   champ_quad._has_field_ownership=false;
119   champ_quad._field=0;
120   //champ_quad._field=new double[champ_quad._nb_elems];
121   //  assert(champ_quad._nb_field_components==1);
122 }
123 void init_triangleGauthier1(TrioField& champ_triangle,int is_master)
124 {
125    
126   champ_triangle.setName("champ_triangle");
127   champ_triangle._space_dim=3;
128   champ_triangle._mesh_dim=2;
129   champ_triangle._nodes_per_elem=3;
130   champ_triangle._itnumber=0;
131   champ_triangle._time1=0;
132   champ_triangle._time2=1;
133   champ_triangle._nb_field_components=1;
134
135   if (is_master)
136     {
137       champ_triangle._nb_elems=4;
138       champ_triangle._nbnodes=8;
139     
140       champ_triangle._coords=new double[champ_triangle._nbnodes*champ_triangle._space_dim];
141       //memcpy(afield._coords,sommets.addr(),champ_triangle._nbnodes*champ_triangle._space_dim*sizeof(double));
142       remplit_coordGauthier1(champ_triangle._coords);
143       
144       champ_triangle._connectivity=new int[champ_triangle._nb_elems*champ_triangle._nodes_per_elem];
145       champ_triangle._connectivity[0*champ_triangle._nodes_per_elem+0]=0;
146       champ_triangle._connectivity[0*champ_triangle._nodes_per_elem+1]=1;
147       champ_triangle._connectivity[0*champ_triangle._nodes_per_elem+2]=2;
148       champ_triangle._connectivity[1*champ_triangle._nodes_per_elem+0]=1;
149       champ_triangle._connectivity[1*champ_triangle._nodes_per_elem+1]=2;
150       champ_triangle._connectivity[1*champ_triangle._nodes_per_elem+2]=3;
151       
152       champ_triangle._connectivity[2*champ_triangle._nodes_per_elem+0]=4;
153       champ_triangle._connectivity[2*champ_triangle._nodes_per_elem+1]=5;
154       champ_triangle._connectivity[2*champ_triangle._nodes_per_elem+2]=7;
155       champ_triangle._connectivity[3*champ_triangle._nodes_per_elem+0]=4;
156       champ_triangle._connectivity[3*champ_triangle._nodes_per_elem+1]=6;
157       champ_triangle._connectivity[3*champ_triangle._nodes_per_elem+2]=7;
158     }
159   else
160     {
161       champ_triangle._nb_elems=0;
162       champ_triangle._nbnodes=0;
163       champ_triangle._coords=new double[champ_triangle._nbnodes*champ_triangle._space_dim];
164     
165     }
166   champ_triangle._has_field_ownership=false;
167   // champ_triangle._field=new double[champ_triangle._nb_elems];
168   champ_triangle._field=0;
169   
170 }
171
172
173 void ParaMEDMEMTest::testGauthier1()
174 {
175   int num_cas=0;
176   int rank, size;
177   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
178   MPI_Comm_size(MPI_COMM_WORLD,&size);
179   
180   int is_master=0;
181
182   CommInterface comm;
183   set<int> emetteur_ids;
184   set<int> recepteur_ids;
185   emetteur_ids.insert(0);
186   if(size!=4)
187     return;
188   recepteur_ids.insert(1);
189   if (size >2) 
190     recepteur_ids.insert(2);
191   if (size >2) 
192     emetteur_ids.insert(3);
193   if ((rank==0)||(rank==1)) 
194     is_master=1;
195   
196   MPIProcessorGroup recepteur_group(comm,recepteur_ids);
197   MPIProcessorGroup emetteur_group(comm,emetteur_ids);
198
199
200   string cas;
201   if (recepteur_group.containsMyRank())
202     {
203       cas="recepteur";
204       //freopen("recpeteur.out","w",stdout);
205       //freopen("recepteur.err","w",stderr);
206       
207     }
208   else
209     {
210       cas="emetteur";
211       // freopen("emetteur.out","w",stdout);
212       //freopen("emetteur.err","w",stderr);
213     }
214   double expected[8][4]={
215     {1.,1.,1.,1.},
216     {40., 40., 1., 1.},
217     {1.,1.,1e200,1e200},
218     {40.,1.,1e200,1e200},
219     {1.,1.,1.,1.},
220     {40.,1.,1.,1.},
221     {1.,1.,1e200,1e200},
222     {20.5,1.,1e200,1e200}
223   };
224
225   int expectedLgth[8]={4,4,2,2,4,4,2,2};
226   
227   for (int send=0;send<2;send++)
228     for (int rec=0;rec<2;rec++)
229       {
230         InterpKernelDEC dec_emetteur(emetteur_group, recepteur_group);
231         dec_emetteur.setOrientation(2);
232         TrioField champ_emetteur, champ_recepteur;
233    
234         if (send==0)
235           init_quadGauthier1(champ_emetteur,is_master);
236         else
237           init_triangleGauthier1(champ_emetteur,is_master);
238         if (rec==0)
239           init_triangleGauthier1(champ_recepteur,is_master);
240         else
241           init_quadGauthier1(champ_recepteur,is_master);
242   
243         if (cas=="emetteur") 
244           {
245             champ_emetteur._field=new double[champ_emetteur._nb_elems];
246             for (int ele=0;ele<champ_emetteur._nb_elems;ele++)
247               champ_emetteur._field[ele]=1;
248       
249             champ_emetteur._has_field_ownership=true;
250           }
251   
252   
253         MPI_Barrier(MPI_COMM_WORLD);
254
255         //clock_t clock0= clock ();
256         int compti=0;
257
258         bool init=true; // first time step ??
259         bool stop=false;
260         //boucle sur les pas de quads
261         while (!stop) {
262   
263           compti++;
264           //clock_t clocki= clock ();
265           //cout << compti << " CLOCK " << (clocki-clock0)*1.e-6 << endl; 
266           for (int non_unif=0;non_unif<2;non_unif++)
267             {
268               // if (champ_recepteur._field)
269               //   delete [] champ_recepteur._field;
270               champ_recepteur._field=0;
271               // champ_recepteur._has_field_ownership=false;
272   
273
274   
275               if (cas=="emetteur") 
276                 {
277                   if (non_unif)
278                     if(rank!=3)
279                       champ_emetteur._field[0]=40;
280                 }
281               //bool ok=false; // Is the time interval successfully solved ?
282     
283               // Loop on the time interval tries
284               if(1) {
285       
286
287                 if (cas=="emetteur")
288                   dec_emetteur.attachLocalField((ICoCo::Field*) &champ_emetteur);
289                 else
290                   dec_emetteur.attachLocalField((ICoCo::Field*) &champ_recepteur);
291
292
293                 if(init) dec_emetteur.synchronize();
294                 init=false;
295
296                 if (cas=="emetteur") {
297                   //    affiche(champ_emetteur);
298                   dec_emetteur.sendData();
299                 }
300                 else if (cas=="recepteur")
301                   {
302                     dec_emetteur.recvData();
303                     if (is_master)
304                       afficheGauthier1(champ_recepteur,expected[num_cas],expectedLgth[num_cas]);
305                   }
306                 else
307                   throw 0;
308                 MPI_Barrier(MPI_COMM_WORLD);
309               }
310               stop=true;
311               num_cas++;
312             }
313           // destruction des champs, des DEC, et des tableaux associĆ©s
314         }
315       }
316 }
317
318 void ParaMEDMEMTest::testGauthier2()
319 {
320   const char save_vit_in_2[]="VITESSE_P1_OUT\n1\n2\n3\n63\n3\n80\n0\n 0 1 2\n 3 4 5\n 6 7 8\n 9 10 11\n 12 13 14\n 15 16 17\n 18 19 20\n 21 22 23\n 24 25 26\n 27 28 29\n 30 2 1\n 31 5 4\n 32 8 7\n 33 11 10\n 34 14 13\n 35 17 16\n 36 20 19\n 37 23 22\n 38 26 25\n 39 29 28\n 30 40 2\n 31 41 5\n 32 42 8\n 33 43 11\n 34 44 14\n 35 45 17\n 36 46 20\n 37 47 23\n 38 48 26\n 39 49 29\n 31 2 40\n 32 5 41\n 33 8 42\n 34 11 43\n 35 14 44\n 36 17 45\n 37 20 46\n 38 23 47\n 39 26 48\n 50 29 49\n 3 2 4\n 6 5 7\n 9 8 10\n 12 11 13\n 15 14 16\n 18 17 19\n 21 20 22\n 24 23 25\n 27 26 28\n 51 29 52\n 31 4 2\n 32 7 5\n 33 10 8\n 34 13 11\n 35 16 14\n 36 19 17\n 37 22 20\n 38 25 23\n 39 28 26\n 50 52 29\n 0 2 53\n 3 5 54\n 6 8 55\n 9 11 56\n 12 14 57\n 15 17 58\n 18 20 59\n 21 23 60\n 24 26 61\n 27 29 62\n 3 53 2\n 6 54 5\n 9 55 8\n 12 56 11\n 15 57 14\n 18 58 17\n 21 59 20\n 24 60 23\n 27 61 26\n 51 62 29\n 0 0 0\n 0.5 0 0\n 0.5 0.05 0\n 0 0.1 0\n 0.5 0.1 0\n 0.5 0.15 0\n 0 0.2 0\n 0.5 0.2 0\n 0.5 0.25 0\n 0 0.3 0\n 0.5 0.3 0\n 0.5 0.35 0\n 0 0.4 0\n 0.5 0.4 0\n 0.5 0.45 0\n 0 0.5 0\n 0.5 0.5 0\n 0.5 0.55 0\n 0 0.6 0\n 0.5 0.6 0\n 0.5 0.65 0\n 0 0.7 0\n 0.5 0.7 0\n 0.5 0.75 0\n 0 0.8 0\n 0.5 0.8 0\n 0.5 0.85 0\n 0 0.9 0\n 0.5 0.9 0\n 0.5 0.95 0\n 1 0 0\n 1 0.1 0\n 1 0.2 0\n 1 0.3 0\n 1 0.4 0\n 1 0.5 0\n 1 0.6 0\n 1 0.7 0\n 1 0.8 0\n 1 0.9 0\n 1 0.05 0\n 1 0.15 0\n 1 0.25 0\n 1 0.35 0\n 1 0.45 0\n 1 0.55 0\n 1 0.65 0\n 1 0.75 0\n 1 0.85 0\n 1 0.95 0\n 1 1 0\n 0 1 0\n 0.5 1 0\n 0 0.05 0\n 0 0.15 0\n 0 0.25 0\n 0 0.35 0\n 0 0.45 0\n 0 0.55 0\n 0 0.65 0\n 0 0.75 0\n 0 0.85 0\n 0 0.95 0\n2.9268\n3.1707\n3\n1\n 0 0 0\n 0 0 0\n 0 0 0.05\n 0 0 0.1\n 0 0 0.1\n 0 0 0.15\n 0 0 0.2\n 0 0 0.2\n 0 0 0.25\n 0 0 0.3\n 0 0 0.3\n 0 0 0.35\n 0 0 0.4\n 0 0 0.4\n 0 0 0.45\n 0 0 0.5\n 0 0 0.5\n 0 0 0.55\n 0 0 0.6\n 0 0 0.6\n 0 0 0.65\n 0 0 0.7\n 0 0 0.7\n 0 0 0.75\n 0 0 0.8\n 0 0 0.8\n 0 0 0.85\n 0 0 0.9\n 0 0 0.9\n 0 0 0.95\n 0 0 0\n 0 0 0.1\n 0 0 0.2\n 0 0 0.3\n 0 0 0.4\n 0 0 0.5\n 0 0 0.6\n 0 0 0.7\n 0 0 0.8\n 0 0 0.9\n 0 0 0.05\n 0 0 0.15\n 0 0 0.25\n 0 0 0.35\n 0 0 0.45\n 0 0 0.55\n 0 0 0.65\n 0 0 0.75\n 0 0 0.85\n 0 0 0.95\n 0 0 1\n 0 0 1\n 0 0 1\n 0 0 0.05\n 0 0 0.15\n 0 0 0.25\n 0 0 0.35\n 0 0 0.45\n 0 0 0.55\n 0 0 0.65\n 0 0 0.75\n 0 0 0.85\n 0 0 0.95\n1\n";
321
322   const char save_vit_out_0_2[]="vitesse_in_chaude\n0\n2\n3\n22\n4\n10\n-1081737852\n 0 1 3 2\n 2 3 5 4\n 4 5 7 6\n 6 7 9 8\n 8 9 11 10\n 10 11 13 12\n 12 13 15 14\n 14 15 17 16\n 16 17 19 18\n 18 19 21 20\n 0 0 0\n 1 0 0\n 0 0.1 0\n 1 0.1 0\n 0 0.2 0\n 1 0.2 0\n 0 0.3 0\n 1 0.3 0\n 0 0.4 0\n 1 0.4 0\n 0 0.5 0\n 1 0.5 0\n 0 0.6 0\n 1 0.6 0\n 0 0.7 0\n 1 0.7 0\n 0 0.8 0\n 1 0.8 0\n 0 0.9 0\n 1 0.9 0\n 0 1 0\n 1 1 0\n2.9268\n3.1707\n3\n1\n 0 0 0.05\n 0 0 0.15\n 0 0 0.25\n 0 0 0.35\n 0 0 0.45\n 0 0 0.55\n 0 0 0.65\n 0 0 0.75\n 0 0 0.85\n 0 0 0.95\n0\n";
323   const char save_vit_out_1_2[]="vitesse_in_chaude\n1\n2\n3\n22\n4\n10\n-1081737852\n 0 1 3 2\n 2 3 5 4\n 4 5 7 6\n 6 7 9 8\n 8 9 11 10\n 10 11 13 12\n 12 13 15 14\n 14 15 17 16\n 16 17 19 18\n 18 19 21 20\n 0 0 0\n 1 0 0\n 0 0.1 0\n 1 0.1 0\n 0 0.2 0\n 1 0.2 0\n 0 0.3 0\n 1 0.3 0\n 0 0.4 0\n 1 0.4 0\n 0 0.5 0\n 1 0.5 0\n 0 0.6 0\n 1 0.6 0\n 0 0.7 0\n 1 0.7 0\n 0 0.8 0\n 1 0.8 0\n 0 0.9 0\n 1 0.9 0\n 0 1 0\n 1 1 0\n2.9268\n3.1707\n3\n1\n 0 0 0.029375\n 0 0 0.029375\n 0 0 0.1\n 0 0 0.1\n 0 0 0.2\n 0 0 0.2\n 0 0 0.3\n 0 0 0.3\n 0 0 0.4\n 0 0 0.4\n 0 0 0.5\n 0 0 0.5\n 0 0 0.6\n 0 0 0.6\n 0 0 0.7\n 0 0 0.7\n 0 0 0.8\n 0 0 0.8\n 0 0 0.9\n 0 0 0.9\n 0 0 0.970625\n 0 0 0.970625\n0\n";
324
325   const char *save_vit_outs[2]={save_vit_out_1_2,save_vit_out_0_2};
326
327   const char save_vit_out_1_0[]="vitesse_in_chaude\n1\n2\n3\n22\n4\n10\n-1081737852\n 0 1 3 2\n 2 3 5 4\n 4 5 7 6\n 6 7 9 8\n 8 9 11 10\n 10 11 13 12\n 12 13 15 14\n 14 15 17 16\n 16 17 19 18\n 18 19 21 20\n 0 0 0\n 1 0 0\n 0 0.1 0\n 1 0.1 0\n 0 0.2 0\n 1 0.2 0\n 0 0.3 0\n 1 0.3 0\n 0 0.4 0\n 1 0.4 0\n 0 0.5 0\n 1 0.5 0\n 0 0.6 0\n 1 0.6 0\n 0 0.7 0\n 1 0.7 0\n 0 0.8 0\n 1 0.8 0\n 0 0.9 0\n 1 0.9 0\n 0 1 0\n 1 1 0\n2.9268\n3.1707\n3\n1\n 0 0 0.029375\n 0 0 0.029375\n 0 0 0.1\n 0 0 0.1\n 0 0 0.2\n 0 0 0.2\n 0 0 0.3\n 0 0 0.3\n 0 0 0.4\n 0 0 0.4\n 0 0 0.5\n 0 0 0.5\n 0 0 0.6\n 0 0 0.6\n 0 0 0.7\n 0 0 0.7\n 0 0 0.8\n 0 0 0.8\n 0 0 0.9\n 0 0 0.9\n 0 0 0.970625\n 0 0 0.970625\n0\n";
328   
329   const char save_vit_in[]="VITESSE_P1_OUT\n1\n2\n3\n63\n3\n80\n0\n 0 1 2\n 3 4 5\n 6 7 8\n 9 10 11\n 12 13 14\n 15 16 17\n 18 19 20\n 21 22 23\n 24 25 26\n 27 28 29\n 30 2 1\n 31 5 4\n 32 8 7\n 33 11 10\n 34 14 13\n 35 17 16\n 36 20 19\n 37 23 22\n 38 26 25\n 39 29 28\n 30 40 2\n 31 41 5\n 32 42 8\n 33 43 11\n 34 44 14\n 35 45 17\n 36 46 20\n 37 47 23\n 38 48 26\n 39 49 29\n 31 2 40\n 32 5 41\n 33 8 42\n 34 11 43\n 35 14 44\n 36 17 45\n 37 20 46\n 38 23 47\n 39 26 48\n 50 29 49\n 3 2 4\n 6 5 7\n 9 8 10\n 12 11 13\n 15 14 16\n 18 17 19\n 21 20 22\n 24 23 25\n 27 26 28\n 51 29 52\n 31 4 2\n 32 7 5\n 33 10 8\n 34 13 11\n 35 16 14\n 36 19 17\n 37 22 20\n 38 25 23\n 39 28 26\n 50 52 29\n 0 2 53\n 3 5 54\n 6 8 55\n 9 11 56\n 12 14 57\n 15 17 58\n 18 20 59\n 21 23 60\n 24 26 61\n 27 29 62\n 3 53 2\n 6 54 5\n 9 55 8\n 12 56 11\n 15 57 14\n 18 58 17\n 21 59 20\n 24 60 23\n 27 61 26\n 51 62 29\n 0 0 0\n 0.5 0 0\n 0.5 0.05 0\n 0 0.1 0\n 0.5 0.1 0\n 0.5 0.15 0\n 0 0.2 0\n 0.5 0.2 0\n 0.5 0.25 0\n 0 0.3 0\n 0.5 0.3 0\n 0.5 0.35 0\n 0 0.4 0\n 0.5 0.4 0\n 0.5 0.45 0\n 0 0.5 0\n 0.5 0.5 0\n 0.5 0.55 0\n 0 0.6 0\n 0.5 0.6 0\n 0.5 0.65 0\n 0 0.7 0\n 0.5 0.7 0\n 0.5 0.75 0\n 0 0.8 0\n 0.5 0.8 0\n 0.5 0.85 0\n 0 0.9 0\n 0.5 0.9 0\n 0.5 0.95 0\n 1 0 0\n 1 0.1 0\n 1 0.2 0\n 1 0.3 0\n 1 0.4 0\n 1 0.5 0\n 1 0.6 0\n 1 0.7 0\n 1 0.8 0\n 1 0.9 0\n 1 0.05 0\n 1 0.15 0\n 1 0.25 0\n 1 0.35 0\n 1 0.45 0\n 1 0.55 0\n 1 0.65 0\n 1 0.75 0\n 1 0.85 0\n 1 0.95 0\n 1 1 0\n 0 1 0\n 0.5 1 0\n 0 0.05 0\n 0 0.15 0\n 0 0.25 0\n 0 0.35 0\n 0 0.45 0\n 0 0.55 0\n 0 0.65 0\n 0 0.75 0\n 0 0.85 0\n 0 0.95 0\n2.9268\n3.1707\n3\n1\n 0 0 0\n 0 0 0\n 0 0 0.05\n 0 0 0.1\n 0 0 0.1\n 0 0 0.15\n 0 0 0.2\n 0 0 0.2\n 0 0 0.25\n 0 0 0.3\n 0 0 0.3\n 0 0 0.35\n 0 0 0.4\n 0 0 0.4\n 0 0 0.45\n 0 0 0.5\n 0 0 0.5\n 0 0 0.55\n 0 0 0.6\n 0 0 0.6\n 0 0 0.65\n 0 0 0.7\n 0 0 0.7\n 0 0 0.75\n 0 0 0.8\n 0 0 0.8\n 0 0 0.85\n 0 0 0.9\n 0 0 0.9\n 0 0 0.95\n 0 0 0\n 0 0 0.1\n 0 0 0.2\n 0 0 0.3\n 0 0 0.4\n 0 0 0.5\n 0 0 0.6\n 0 0 0.7\n 0 0 0.8\n 0 0 0.9\n 0 0 0.05\n 0 0 0.15\n 0 0 0.25\n 0 0 0.35\n 0 0 0.45\n 0 0 0.55\n 0 0 0.65\n 0 0 0.75\n 0 0 0.85\n 0 0 0.95\n 0 0 1\n 0 0 1\n 0 0 1\n 0 0 0.05\n 0 0 0.15\n 0 0 0.25\n 0 0 0.35\n 0 0 0.45\n 0 0 0.55\n 0 0 0.65\n 0 0 0.75\n 0 0 0.85\n 0 0 0.95\n1\n";
330
331   double valuesExpected1[2]={0.,0.};
332   double valuesExpected2[2]={0.95,0.970625};
333   
334   double valuesExpected30[]={0., 0., 0.05, 0., 0., 0.15, 0., 0., 0.25, 0., 0., 0.35, 0., 0., 0.45, 0., 0., 0.55, 0., 0., 0.65, 0., 0., 0.75, 0., 0., 0.85, 0., 0., 0.95};
335   double valuesExpected31[]={0.,  0.,  0.029375,  0.,  0.,  0.029375,  0.,  0.,  0.1,  0.,  0.,  0.1,  0.,  0.,  0.2,  0.,  0.,  0.2,  0.,  0.,  0.3,  0.,  0.,  0.3,  0.,  0.,  0.4,  0.,  0.,  0.4,  0.,  0.,  0.5,  0.,  0.,  0.5,  0.,  0.,  0.6,  0.,  0.,  0.6,  0.,  0.,  0.7,  0.,  0.,  0.7,  0.,  0.,  0.8,  0.,  0.,  0.8,  0.,  0.,  0.9,  0.,  0.,  0.9,  0.,  0.,  0.970625,  0.,  0.,  0.970625 };
336
337   double *valuesExpected3[2]={valuesExpected30,valuesExpected31};
338
339   int rank, size;
340   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
341   MPI_Comm_size(MPI_COMM_WORLD,&size);
342   if (size <2)
343     return ;
344   CommInterface comm;
345   set<int> Genepi_ids;
346   set<int> entree_chaude_ids;
347   Genepi_ids.insert(0);
348   for (int i=1;i<size;i++)
349     entree_chaude_ids.insert(i);
350   for (int type=0;type<2;type++)
351     {
352       MPIProcessorGroup entree_chaude_group(comm,entree_chaude_ids);
353       MPIProcessorGroup Genepi_group(comm,Genepi_ids);
354
355       TrioField vitesse;
356       InterpKernelDEC dec_vit_in_chaude(entree_chaude_group, Genepi_group);
357
358       if ( entree_chaude_group.containsMyRank())
359         {
360           istringstream save_vit(save_vit_in);
361           vitesse.restore(save_vit);
362         }
363       else
364         {
365           istringstream save_vit(save_vit_out_1_0);
366           vitesse.restore(save_vit);
367           vitesse._has_field_ownership=false;
368       
369           if (vitesse._field)
370             {
371               delete [] vitesse._field;
372               // cette ligne est super importante sinon c'est tout faux !!!!!!!
373               vitesse._field=0;
374             }
375           // pour tester P1->P0
376           vitesse._type=type;  
377         }
378   
379       if (vitesse._type==1)
380         dec_vit_in_chaude.setMethod("P1");
381   
382   
383
384       dec_vit_in_chaude.attachLocalField((ICoCo::Field*) &vitesse);
385       
386       dec_vit_in_chaude.synchronize();
387   
388   
389       // Envois - receptions
390       if (entree_chaude_group.containsMyRank())
391         {
392           dec_vit_in_chaude.sendData();
393         }
394       else
395         {
396           dec_vit_in_chaude.recvData(); 
397         }
398       if (entree_chaude_group.containsMyRank() )
399         {
400           if (1)
401             {
402               ostringstream save_vit(save_vit_in_2);
403               vitesse.save(save_vit);
404             }
405         }
406       else
407         {
408       
409           double pmin=1e38, pmax=-1e38;
410       
411           for(int i=0;i<vitesse.nb_values()*vitesse._nb_field_components;i++)
412             {
413               double p=*(vitesse._field+i);
414               if (p<pmin) pmin=p;
415               if (p>pmax) pmax=p;
416             }
417           CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected1[type],pmin,1e-12);
418           CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[type],pmax,1e-12);
419       
420           ostringstream save_vit(save_vit_outs[type]);
421           vitesse.save(save_vit);
422
423           for(int i=0;i<vitesse.nb_values();i++)
424             {
425               for(int c=0;c<vitesse._nb_field_components;c++)
426                 {
427                   double p=vitesse._field[i*vitesse._nb_field_components+c];
428                   CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected3[type][i*vitesse._nb_field_components+c],p,1e-12);
429                 }
430             }
431       
432         }
433     }
434 }
435
436 /*!
437  * Non regression test testing copy constructor of InterpKernelDEC. 
438  */
439 void ParaMEDMEMTest::testGauthier3()
440 {
441   int num_cas=0;
442   int rank, size;
443   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
444   MPI_Comm_size(MPI_COMM_WORLD,&size);
445   
446   int is_master=0;
447
448   CommInterface comm;
449   set<int> emetteur_ids;
450   set<int> recepteur_ids;
451   emetteur_ids.insert(0);
452   if(size!=4)
453     return;
454   recepteur_ids.insert(1);
455   if (size >2) 
456     recepteur_ids.insert(2);
457   if (size >2) 
458     emetteur_ids.insert(3);
459   if ((rank==0)||(rank==1)) 
460     is_master=1;
461   
462   MPIProcessorGroup recepteur_group(comm,recepteur_ids);
463   MPIProcessorGroup emetteur_group(comm,emetteur_ids);
464
465
466   string cas;
467   if (recepteur_group.containsMyRank())
468     {
469       cas="recepteur";
470       //freopen("recpeteur.out","w",stdout);
471       //freopen("recepteur.err","w",stderr);
472       
473     }
474   else
475     {
476       cas="emetteur";
477       // freopen("emetteur.out","w",stdout);
478       //freopen("emetteur.err","w",stderr);
479     }
480   double expected[8][4]={
481     {1.,1.,1.,1.},
482     {40., 40., 1., 1.},
483     {1.,1.,1e200,1e200},
484     {40.,1.,1e200,1e200},
485     {1.,1.,1.,1.},
486     {40.,1.,1.,1.},
487     {1.,1.,1e200,1e200},
488     {20.5,1.,1e200,1e200}
489   };
490
491   int expectedLgth[8]={4,4,2,2,4,4,2,2};
492   
493   for (int send=0;send<2;send++)
494     for (int rec=0;rec<2;rec++)
495       {
496         
497         std::vector<InterpKernelDEC> decu(1);
498         decu[0]=InterpKernelDEC(emetteur_group, recepteur_group);
499         InterpKernelDEC& dec_emetteur=decu[0];
500
501         //InterpKernelDEC dec_emetteur(emetteur_group, recepteur_group);
502         dec_emetteur.setOrientation(2);
503         TrioField champ_emetteur, champ_recepteur;
504    
505         if (send==0)
506           init_quadGauthier1(champ_emetteur,is_master);
507         else
508           init_triangleGauthier1(champ_emetteur,is_master);
509         if (rec==0)
510           init_triangleGauthier1(champ_recepteur,is_master);
511         else
512           init_quadGauthier1(champ_recepteur,is_master);
513   
514         if (cas=="emetteur") 
515           {
516             champ_emetteur._field=new double[champ_emetteur._nb_elems];
517             for (int ele=0;ele<champ_emetteur._nb_elems;ele++)
518               champ_emetteur._field[ele]=1;
519       
520             champ_emetteur._has_field_ownership=true;
521           }
522   
523   
524         MPI_Barrier(MPI_COMM_WORLD);
525
526         //clock_t clock0= clock ();
527         int compti=0;
528
529         bool init=true; // first time step ??
530         bool stop=false;
531         //boucle sur les pas de quads
532         while (!stop) {
533   
534           compti++;
535           //clock_t clocki= clock ();
536           //cout << compti << " CLOCK " << (clocki-clock0)*1.e-6 << endl; 
537           for (int non_unif=0;non_unif<2;non_unif++)
538             {
539               // if (champ_recepteur._field)
540               //   delete [] champ_recepteur._field;
541               champ_recepteur._field=0;
542               // champ_recepteur._has_field_ownership=false;
543   
544
545   
546               if (cas=="emetteur") 
547                 {
548                   if (non_unif)
549                     if(rank!=3)
550                       champ_emetteur._field[0]=40;
551                 }
552               //bool ok=false; // Is the time interval successfully solved ?
553     
554               // Loop on the time interval tries
555               if(1) {
556       
557
558                 if (cas=="emetteur")
559                   dec_emetteur.attachLocalField((ICoCo::Field*) &champ_emetteur);
560                 else
561                   dec_emetteur.attachLocalField((ICoCo::Field*) &champ_recepteur);
562
563
564                 if(init) dec_emetteur.synchronize();
565                 init=false;
566
567                 if (cas=="emetteur") {
568                   //    affiche(champ_emetteur);
569                   dec_emetteur.sendData();
570                 }
571                 else if (cas=="recepteur")
572                   {
573                     dec_emetteur.recvData();
574                     if (is_master)
575                       afficheGauthier1(champ_recepteur,expected[num_cas],expectedLgth[num_cas]);
576                   }
577                 else
578                   throw 0;
579                 MPI_Barrier(MPI_COMM_WORLD);
580               }
581               stop=true;
582               num_cas++;
583             }
584           // destruction des champs, des DEC, et des tableaux associĆ©s
585         }
586       }
587 }