1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "ParaMEDMEMTest.hxx"
21 #include <cppunit/TestAssert.h>
24 #include "CommInterface.hxx"
25 #include "ProcessorGroup.hxx"
26 #include "MPIProcessorGroup.hxx"
28 #include "InterpKernelDEC.hxx"
31 #include "ICoCoTrioField.hxx"
37 using namespace ParaMEDMEM;
38 using namespace ICoCo;
40 void afficheGauthier1( const TrioField& field, const double *vals, int lgth)
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);
47 void remplit_coordGauthier1(double* coords)
49 double angle,epaisseur;
50 angle=0*45*(asin(1.)/90);
56 coords[1*3+0]=cos(angle);
58 coords[1*3+2]=sin(angle);
61 coords[2*3+0]=-sin(angle);
63 coords[2*3+2]=cos(angle);
66 coords[3*3+d]=coords[1*3+d]+ coords[2*3+d];
71 coords[i*3+d]=coords[(i-4)*3+d];
72 coords[i*3+1]+=epaisseur;
77 void init_quadGauthier1(TrioField& champ_quad,int is_master)
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;
87 champ_quad._nb_field_components=1;
91 champ_quad._nbnodes=8;
92 champ_quad._nb_elems=2;
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));
97 remplit_coordGauthier1(champ_quad._coords);
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;
113 champ_quad._nbnodes=0;
114 champ_quad._nb_elems=0;
115 champ_quad._coords=new double[champ_quad._nbnodes*champ_quad._space_dim];
118 champ_quad._has_field_ownership=false;
120 //champ_quad._field=new double[champ_quad._nb_elems];
121 // assert(champ_quad._nb_field_components==1);
123 void init_triangleGauthier1(TrioField& champ_triangle,int is_master)
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;
137 champ_triangle._nb_elems=4;
138 champ_triangle._nbnodes=8;
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);
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;
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;
161 champ_triangle._nb_elems=0;
162 champ_triangle._nbnodes=0;
163 champ_triangle._coords=new double[champ_triangle._nbnodes*champ_triangle._space_dim];
166 champ_triangle._has_field_ownership=false;
167 // champ_triangle._field=new double[champ_triangle._nb_elems];
168 champ_triangle._field=0;
173 void ParaMEDMEMTest::testGauthier1()
177 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
178 MPI_Comm_size(MPI_COMM_WORLD,&size);
183 set<int> emetteur_ids;
184 set<int> recepteur_ids;
185 emetteur_ids.insert(0);
188 recepteur_ids.insert(1);
190 recepteur_ids.insert(2);
192 emetteur_ids.insert(3);
193 if ((rank==0)||(rank==1))
196 MPIProcessorGroup recepteur_group(comm,recepteur_ids);
197 MPIProcessorGroup emetteur_group(comm,emetteur_ids);
201 if (recepteur_group.containsMyRank())
204 //freopen("recpeteur.out","w",stdout);
205 //freopen("recepteur.err","w",stderr);
211 // freopen("emetteur.out","w",stdout);
212 //freopen("emetteur.err","w",stderr);
214 double expected[8][4]={
218 {40.,1.,1e200,1e200},
222 {20.5,1.,1e200,1e200}
225 int expectedLgth[8]={4,4,2,2,4,4,2,2};
227 for (int send=0;send<2;send++)
228 for (int rec=0;rec<2;rec++)
230 InterpKernelDEC dec_emetteur(emetteur_group, recepteur_group);
231 dec_emetteur.setOrientation(2);
232 TrioField champ_emetteur, champ_recepteur;
235 init_quadGauthier1(champ_emetteur,is_master);
237 init_triangleGauthier1(champ_emetteur,is_master);
239 init_triangleGauthier1(champ_recepteur,is_master);
241 init_quadGauthier1(champ_recepteur,is_master);
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;
249 champ_emetteur._has_field_ownership=true;
253 MPI_Barrier(MPI_COMM_WORLD);
255 //clock_t clock0= clock ();
258 bool init=true; // first time step ??
260 //boucle sur les pas de quads
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++)
268 // if (champ_recepteur._field)
269 // delete [] champ_recepteur._field;
270 champ_recepteur._field=0;
271 // champ_recepteur._has_field_ownership=false;
279 champ_emetteur._field[0]=40;
281 //bool ok=false; // Is the time interval successfully solved ?
283 // Loop on the time interval tries
288 dec_emetteur.attachLocalField((ICoCo::Field*) &champ_emetteur);
290 dec_emetteur.attachLocalField((ICoCo::Field*) &champ_recepteur);
293 if(init) dec_emetteur.synchronize();
296 if (cas=="emetteur") {
297 // affiche(champ_emetteur);
298 dec_emetteur.sendData();
300 else if (cas=="recepteur")
302 dec_emetteur.recvData();
304 afficheGauthier1(champ_recepteur,expected[num_cas],expectedLgth[num_cas]);
308 MPI_Barrier(MPI_COMM_WORLD);
313 // destruction des champs, des DEC, et des tableaux associés
318 void ParaMEDMEMTest::testGauthier2()
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";
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";
325 const char *save_vit_outs[2]={save_vit_out_1_2,save_vit_out_0_2};
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";
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";
331 double valuesExpected1[2]={0.,0.};
332 double valuesExpected2[2]={0.95,0.970625};
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 };
337 double *valuesExpected3[2]={valuesExpected30,valuesExpected31};
340 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
341 MPI_Comm_size(MPI_COMM_WORLD,&size);
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++)
352 MPIProcessorGroup entree_chaude_group(comm,entree_chaude_ids);
353 MPIProcessorGroup Genepi_group(comm,Genepi_ids);
356 InterpKernelDEC dec_vit_in_chaude(entree_chaude_group, Genepi_group);
358 if ( entree_chaude_group.containsMyRank())
360 istringstream save_vit(save_vit_in);
361 vitesse.restore(save_vit);
365 istringstream save_vit(save_vit_out_1_0);
366 vitesse.restore(save_vit);
367 vitesse._has_field_ownership=false;
371 delete [] vitesse._field;
372 // cette ligne est super importante sinon c'est tout faux !!!!!!!
375 // pour tester P1->P0
379 if (vitesse._type==1)
380 dec_vit_in_chaude.setMethod("P1");
384 dec_vit_in_chaude.attachLocalField((ICoCo::Field*) &vitesse);
386 dec_vit_in_chaude.synchronize();
389 // Envois - receptions
390 if (entree_chaude_group.containsMyRank())
392 dec_vit_in_chaude.sendData();
396 dec_vit_in_chaude.recvData();
398 if (entree_chaude_group.containsMyRank() )
402 ostringstream save_vit(save_vit_in_2);
403 vitesse.save(save_vit);
409 double pmin=1e38, pmax=-1e38;
411 for(int i=0;i<vitesse.nb_values()*vitesse._nb_field_components;i++)
413 double p=*(vitesse._field+i);
417 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected1[type],pmin,1e-12);
418 CPPUNIT_ASSERT_DOUBLES_EQUAL(valuesExpected2[type],pmax,1e-12);
420 ostringstream save_vit(save_vit_outs[type]);
421 vitesse.save(save_vit);
423 for(int i=0;i<vitesse.nb_values();i++)
425 for(int c=0;c<vitesse._nb_field_components;c++)
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);
437 * Non regression test testing copy constructor of InterpKernelDEC.
439 void ParaMEDMEMTest::testGauthier3()
443 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
444 MPI_Comm_size(MPI_COMM_WORLD,&size);
449 set<int> emetteur_ids;
450 set<int> recepteur_ids;
451 emetteur_ids.insert(0);
454 recepteur_ids.insert(1);
456 recepteur_ids.insert(2);
458 emetteur_ids.insert(3);
459 if ((rank==0)||(rank==1))
462 MPIProcessorGroup recepteur_group(comm,recepteur_ids);
463 MPIProcessorGroup emetteur_group(comm,emetteur_ids);
467 if (recepteur_group.containsMyRank())
470 //freopen("recpeteur.out","w",stdout);
471 //freopen("recepteur.err","w",stderr);
477 // freopen("emetteur.out","w",stdout);
478 //freopen("emetteur.err","w",stderr);
480 double expected[8][4]={
484 {40.,1.,1e200,1e200},
488 {20.5,1.,1e200,1e200}
491 int expectedLgth[8]={4,4,2,2,4,4,2,2};
493 for (int send=0;send<2;send++)
494 for (int rec=0;rec<2;rec++)
497 std::vector<InterpKernelDEC> decu(1);
498 decu[0]=InterpKernelDEC(emetteur_group, recepteur_group);
499 InterpKernelDEC& dec_emetteur=decu[0];
501 //InterpKernelDEC dec_emetteur(emetteur_group, recepteur_group);
502 dec_emetteur.setOrientation(2);
503 TrioField champ_emetteur, champ_recepteur;
506 init_quadGauthier1(champ_emetteur,is_master);
508 init_triangleGauthier1(champ_emetteur,is_master);
510 init_triangleGauthier1(champ_recepteur,is_master);
512 init_quadGauthier1(champ_recepteur,is_master);
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;
520 champ_emetteur._has_field_ownership=true;
524 MPI_Barrier(MPI_COMM_WORLD);
526 //clock_t clock0= clock ();
529 bool init=true; // first time step ??
531 //boucle sur les pas de quads
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++)
539 // if (champ_recepteur._field)
540 // delete [] champ_recepteur._field;
541 champ_recepteur._field=0;
542 // champ_recepteur._has_field_ownership=false;
550 champ_emetteur._field[0]=40;
552 //bool ok=false; // Is the time interval successfully solved ?
554 // Loop on the time interval tries
559 dec_emetteur.attachLocalField((ICoCo::Field*) &champ_emetteur);
561 dec_emetteur.attachLocalField((ICoCo::Field*) &champ_recepteur);
564 if(init) dec_emetteur.synchronize();
567 if (cas=="emetteur") {
568 // affiche(champ_emetteur);
569 dec_emetteur.sendData();
571 else if (cas=="recepteur")
573 dec_emetteur.recvData();
575 afficheGauthier1(champ_recepteur,expected[num_cas],expectedLgth[num_cas]);
579 MPI_Barrier(MPI_COMM_WORLD);
584 // destruction des champs, des DEC, et des tableaux associés