1 /*  This file is part of MED.
2  *
3  *  COPYRIGHT (C) 1999 - 2019  EDF R&D, CEA/DEN
4  *  MED is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  MED is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 #define _a 0.446948490915965
18 #define _b 0.091576213509771
19 #define _p1 0.11169079483905
20 #define _p2 0.0549758718227661
21 
22 /******************************************************************************
23  * - Nom du fichier : test10.c
24  *
25  * - Description : ecriture de champs de resultats MED
26  *
27  *****************************************************************************/
28 
29 #include <med.h>
30 #define MESGERR 1
31 #include "med_utils.h"
32 #include <string.h>
33 
34 #ifdef DEF_LECT_ECR
35 #define MODE_ACCES MED_ACC_RDWR
36 #elif DEF_LECT_AJOUT
37 #define MODE_ACCES MED_ACC_RDEXT
38 #else
39 #define MODE_ACCES MED_ACC_CREAT
40 #endif
41 
42 #ifndef USER_INTERLACE
43 #define USER_INTERLACE MED_FULL_INTERLACE
44 #endif
45 
46 #define USER_MODE MED_COMPACT_STMODE
47 
48 #ifdef DEF_MED_FLOAT32
49 #define FTYPECHA MED_FLOAT32
50 #define ftypecha med_float32
51 #define filename_ "test10_f32"
52 #else
53 #define FTYPECHA MED_DOUBLE
54 #define ftypecha med_double
55 #define filename_ "test10"
56 #endif
57 
58 #ifdef   DEF_MED_INT32
59 #define ITYPECHA MED_INT32
60 #define itypecha med_int32
61 #define filename__ filename_ "_i32"
62 #elif   DEF_MED_INT64
63 #define ITYPECHA MED_INT64
64 #define itypecha med_int64
65 #define filename__ filename_ "_i64"
66 #else
67 #define ITYPECHA MED_INT
68 #define itypecha med_int
69 #define filename__ filename_
70 #endif
71 
72 
73 #define filename filename__ ".med"
74 
75 
main(int argc,char ** argv)76 int main (int argc, char **argv)
77 
78 
79 {
80   med_err ret=0;
81   med_idt fid;
82 
83 
84 
85   /* Maillage support aux champs*/
86   /* Ces maillages sont vides*/
87   char maa1[MED_NAME_SIZE+1]= "maa1";
88   char maa2[MED_NAME_SIZE+1]= "maa2";
89   char * lien_maa2 = "./testfoo.med";
90   char maa3[MED_NAME_SIZE+1]= "maa3";
91 
92 
93   /* Caractéristiques du champ n° 1 sur TRIA6 */
94   char nomcha1[MED_NAME_SIZE+1]  = "champ reel";
95   char comp1[2*MED_SNAME_SIZE+1] = "comp1           comp2           ";
96                                    /*12345678901234561234567890123456*/
97   char unit1[2*MED_SNAME_SIZE+1] = "unit1           unit2           ";
98   med_int ncomp1  = 2;
99   /* Caractéristiques du model n° 1 de localisation des points de gauss pour le champ n°1*/
100   med_int ngauss1_1 = 6;
101   char gauss1_1[MED_NAME_SIZE+1]  = "Model n1";
102   med_float refcoo1[12] = { -1.0,1.0, -1.0,-1.0, 1.0,-1.0, -1.0,0.0, 0.0,-1.0, 0.0,0.0 };
103 
104   /* Constantes */
105 
106   med_float gscoo1_1[12] = { 2*_b-1, 1-4*_b, 2*_b-1, 2*_b-1, 1-4*_b,
107                              2*_b-1, 1-4*_a, 2*_a-1, 2*_a-1, 1-4*_a, 2*_a-1, 2*_a-1 };
108   med_float wg1_1[6] = { 4*_p2, 4*_p2, 4*_p2, 4*_p1, 4*_p1, 4*_p1 };
109 
110   med_int   nval1_1= 1*6; /*1 valeurs et 6 points de gauss par valeur */
111   med_int   _nent1_1= 1; /*1 valeurs et 6 points de gauss par valeur */
112   ftypecha  valr1_1[1*6*2]  = {0.0,1.0, 2.0,3.0, 10.0,11.0, 12.0,13.0, 20.0,21.0, 22.0,23.0};  /* 2 composantes*/
113   /* Caractéristiques du model n° 2 de localisation des points de gauss pour le champ n°1*/
114   med_int ngauss1_2 = 3;
115   char gauss1_2[MED_NAME_SIZE+1]  = "Model n2";
116   med_float gscoo1_2[6] = { -2.0/3,1.0/3, -2.0/3,-2.0/3, 1.0/3,-2.0/3  };
117   med_float wg1_2[3] = { 2.0/3, 2.0/3, 2.0/3 };
118   med_int   nval1_2= 2*3; /*2 valeurs et 3 points de gauss par valeur */
119   med_int   _nent1_2= 2; /*2 valeurs et 3 points de gauss par valeur */
120   ftypecha  valr1_2[2*3*2]  = {0.0,1.0, 2.0,3.0, 10.0,11.0,   12.0,13.0, 20.0,21.0, 22.0,23.0};  /* 2 composantes*/
121   ftypecha  valr1_2p[2*3*2]  = {                              12.0,13.0, 20.0,21.0, 22.0,23.0};  /* 2 composantes*/
122  /* Caractéristiques du model n° 3 sans points de gauss pour le champ n°1*/
123   med_int   nval1_3= 6; /*6 valeurs et pas de points de gauss */
124   med_int   _nent1_3= 6; /*6 valeurs et pas de points de gauss */
125   ftypecha  valr1_3[2*3*2]  = {0.0,1.0, 2.0,3.0, 10.0,11.0, 12.0,13.0, 20.0,21.0, 22.0,23.0};  /* 2 composantes*/
126   ftypecha  valr1_3p[2*2*2] = {         2.0,3.0, 10.0,11.0                                 };  /* 2 composantes profil1 */
127 
128   /* Caractéristiques du champ n° 2 */
129   char nomcha2[MED_NAME_SIZE+1]  = "champ entier";
130   char comp2[3*MED_SNAME_SIZE+1] = "comp1           comp2           comp3           ";
131                                    /*123456789012345612345678901234561234567890123456*/
132   char unit2[3*MED_SNAME_SIZE+1] = "unit1           unit2           unit3           ";
133   med_int ncomp2  = 3;
134   med_int nval2 = 5;   /*5 valeurs */
135   itypecha   valr2[5*3  ]  = {0,1,2, 10,11,12, 20,21,22, 30,31,32, 40,41,42};              /* 3 composantes*/
136   /* u32b : 4294967296 s32b : 2147483647 -2147483647  */
137   itypecha   valr2_[5*3  ]  = {2147483647, -2147483648, 4294967296, 10,11,12, 20,21,22, 30,31,32, 40,41,42};
138   itypecha   valr2p[3*3  ] = {0,1,2,           20,21,22,           40,41,42};              /* 3 composantes*/
139 
140   /* Profils utilisés */
141   char nomprofil1[MED_NAME_SIZE+1]  = "PROFIL(champ(1))";
142   char nomprofil1b[MED_NAME_SIZE+1] = "PROFIL(champ(1b))";
143   char nomprofil2[MED_NAME_SIZE+1]  = "PROFIL(champ2)";
144   med_int profil1[2] = { 2, 3 };
145   med_int profil2[3] = { 1, 3, 5 };
146 
147 
148   /* Caractéristiques du champ n° 3 */
149   char nomcha3[MED_NAME_SIZE+1]  = "champ entier 3";
150   char comp3[3*MED_SNAME_SIZE+1] = "comp1           comp2           ";
151                                    /*123456789012345612345678901234561234567890123456*/
152   char unit3[3*MED_SNAME_SIZE+1] = "unit1           unit2           ";
153   char dtunit[MED_SNAME_SIZE+1] = "s";
154   med_int ncomp3  = 2;
155   med_int nval3 = 5*4;     /*5 valeurs et 4 noeuds par element*/
156   med_int _nent3 = 5;     /*5 valeurs et 4 noeuds par element*/
157   itypecha valr3[5*4*2]   = {0,1, 10,11, 20,21, 30,31,
158                             40,41, 50,51, 60,61, 70,71,
159                             80,81, 90,91, 100,101, 110,111,
160                             120,121, 130,131, 140,141, 150,151,
161                             160,161, 170,171, 180,181, 190,191};    /* 2 composantes*/
162   itypecha valr3p[3*4*2]  = {0,1, 10,11, 20,21, 30,31,
163                             80,81, 90,91, 100,101, 110,111,
164                             160,161, 170,171, 180,181, 190,191};    /* 2 composantes*/
165 
166 
167   char nomcoo[3*MED_SNAME_SIZE+1] = "x               y               z               ";
168   char unicoo[3*MED_SNAME_SIZE+1] = "cm              cm              cm              ";
169 
170 
171 
172 
173   /* ouverture du fichier */
174   if ((fid = MEDfileVersionOpen(filename,MODE_ACCES,MED_MAJOR_NUM,MED_MINOR_NUM,MED_RELEASE_NUM)) < 0){
175     MESSAGE("Erreur à l'ouverture du fichier : ");
176     return -1;
177   }
178 
179   /* creation de maa1 de dimension 3*/
180   if (MEDmeshCr( fid, maa1, 3, 3, MED_UNSTRUCTURED_MESH,
181 		 "Maillage vide","s", MED_SORT_DTIT,
182 		 MED_CARTESIAN, nomcoo, unicoo) < 0) {
183     MESSAGE("Erreur a la creation du maillage : "); SSCRUTE(maa1);
184     ret = -1;
185   }
186 
187 
188   /* creation de maa3 de dimension 3*/
189   if (MEDmeshCr( fid, maa3, 3, 3, MED_UNSTRUCTURED_MESH,
190 		 "Maillage vide","s", MED_SORT_DTIT,
191 		 MED_CARTESIAN, nomcoo, unicoo) < 0) {
192     MESSAGE("Erreur a la creation du maillage : "); SSCRUTE(maa3);
193     ret = -1;
194   }
195 
196 
197   /* creation du champ réel n°1 */
198   if ( MEDfieldCr(fid,nomcha1,FTYPECHA,ncomp1,comp1,unit1,dtunit,maa1 ) < 0) {
199     MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha1);
200     ret = -1;
201   };
202 
203   /* creation du champ entier n°2 */
204   if ( MEDfieldCr(fid,nomcha2,ITYPECHA,ncomp2,comp2,unit2,dtunit,maa2 ) < 0) {
205     MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha2);
206     ret = -1;
207   };
208 
209   /* creation du lien au fichier distant contenant maa2 */
210   if (MEDlinkWr(fid,maa2,lien_maa2) < 0) {
211     MESSAGE("Erreur à la création du lien : ");SSCRUTE(lien_maa2);
212     ret = -1;
213   };
214 
215   /* creation de la localisation des points de Gauss modèle n°1 */
216   if (MEDlocalizationWr(fid, gauss1_1, MED_TRIA6, MED_TRIA6/100, refcoo1, USER_INTERLACE,
217 			ngauss1_1, gscoo1_1, wg1_1,
218 			MED_NO_INTERPOLATION, MED_NO_MESH_SUPPORT ) < 0) {
219     MESSAGE("Erreur à la création du modèle n°1 : ");SSCRUTE(gauss1_1);
220     ret = -1;
221   };
222 
223    /* creation de la localisation des points de Gauss modèle n°2 */
224   if (MEDlocalizationWr(fid, gauss1_2, MED_TRIA6, MED_TRIA6/100, refcoo1, USER_INTERLACE,
225 			ngauss1_2, gscoo1_2, wg1_2,
226 			MED_NO_INTERPOLATION, MED_NO_MESH_SUPPORT) < 0) {
227     MESSAGE("Erreur à la création du modèle n°1 : ");SSCRUTE(gauss1_2);
228     ret = -1;
229   };
230 
231   /* ecriture du champ n°1*/
232   /* enregistre uniquement les composantes n°2 de valr1_1, et n'utilise ni pas de temps ni n° d'ordre*/
233 
234   if ( MEDfieldValueWithProfileWr(fid, nomcha1,MED_NO_DT,MED_NO_IT,0.0,MED_CELL,MED_TRIA6,USER_MODE,MED_ALLENTITIES_PROFILE,
235 		       gauss1_1,USER_INTERLACE, 2, _nent1_1, (unsigned char*)valr1_1 ) < 0) {
236     MESSAGE("Erreur à l'écriture du champ : ");
237     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
238     SSCRUTE(maa1);
239     ret = -1;
240   };
241 
242 
243 
244   /* enregistre uniquement les composantes n°1 de valr1_1, et n'utilise ni pas de temps ni n° d'ordre */
245 
246   if ( MEDfieldValueWithProfileWr(fid, nomcha1,MED_NO_DT,MED_NO_IT,0.0,MED_CELL,MED_TRIA6,USER_MODE,MED_ALLENTITIES_PROFILE,
247 		       gauss1_1,USER_INTERLACE, 1, _nent1_1, (unsigned char*)valr1_1 ) < 0) {
248     MESSAGE("Erreur à l'écriture du champ : ");
249     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
250     SSCRUTE(maa1);
251     ret = -1;
252   };
253 
254   /* enregistre uniquement les composantes n°1 de valr1_2, au pas de temps n°1(5.5), n'utilise pas de n°d'ordre*/
255   /* ce champ repose sur le maillage maa2 qui est distant */
256 
257   if ( MEDfieldValueWithProfileWr(fid, nomcha1,1,MED_NO_IT,5.5,MED_CELL,MED_TRIA6,USER_MODE,MED_ALLENTITIES_PROFILE,
258 		       gauss1_2,USER_INTERLACE, 1, _nent1_2, (unsigned char*)valr1_2 ) < 0) {
259     MESSAGE("Erreur à l'écriture du champ : ");
260     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
261     SSCRUTE(maa1);
262     ret = -1;
263   };
264 
265 /*Ce test utilise un deuxième maillage pour un même champ, ceci n'existe plus en 3.0*/
266   /* enregistre uniquement les composantes n°2 de valr1_2, au pas de temps n°1(5.5), n'utilise pas de n°d'ordre*/
267   /* ce champ repose sur le maillage maa1 qui est local */
268 
269   /*Ce test utilise un deuxième maillage pour un même champ, ceci n'existe plus en 3.0*/
270   if ( MEDfieldValueWithProfileWr(fid, nomcha1,1,1,5.5,MED_CELL,MED_TRIA6,USER_MODE,MED_ALLENTITIES_PROFILE,
271 		       gauss1_1,USER_INTERLACE, 2, _nent1_1, (unsigned char*)valr1_1 ) < 0) {
272     MESSAGE("Erreur à l'écriture du champ : ");
273     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
274     SSCRUTE(maa1);
275     ret = -1;
276   };
277 
278 
279     /* enregistre uniquement les composantes n°1 de valr1_1, au pas de temps n°1(5.5), et n°d'itération n°2*/
280     /* ce champ repose sur le maillage maa3 qui est local */
281 
282   if ( MEDfieldValueWithProfileWr(fid, nomcha1,1,2,5.5,MED_CELL,MED_TRIA6,USER_MODE,MED_ALLENTITIES_PROFILE,
283 		       gauss1_2,USER_INTERLACE, 1, _nent1_2, (unsigned char*)valr1_2 ) < 0) {
284     MESSAGE("Erreur à l'écriture du champ : ");
285     SSCRUTE(nomcha1);SSCRUTE(MED_NO_PROFILE);
286     SSCRUTE(maa1);
287     ret = -1;
288   };
289 
290   /* Creation d'un profil (selection  du deuxieme élément de valr1_1) */
291   /* On n'utilise que la première valeur (2) du profil */
292   if ( MEDprofileWr(fid,nomprofil1,1,profil1) < 0) {
293     MESSAGE("Erreur à l'écriture du profil : ");
294     SSCRUTE(nomprofil1);
295     ret = -1;
296   };
297 
298 
299   if ( MEDprofileWr(fid,nomprofil1b,1,profil1) < 0) {
300     MESSAGE("Erreur à l'écriture du profil : ");
301     SSCRUTE(nomprofil1b);
302     ret = -1;
303   };
304 
305 
306 
307 
308   /* enregistre toutes les composantes du deuxième élément de valr1_1 (premier élément en stockage compact de valr1p),
309      au pas de temps n°2(5.6), et n°d'itération n°2*/
310   if ( MEDfieldValueWithProfileWr(fid, nomcha1,2,2,5.6,MED_CELL,MED_TRIA6,USER_MODE,nomprofil1,
311 		       MED_NO_LOCALIZATION,USER_INTERLACE, MED_ALL_CONSTITUENT, nval1_3, (unsigned char*)valr1_3p ) < 0) {
312     MESSAGE("Erreur à l'écriture du champ : ");
313     SSCRUTE(nomcha1);SSCRUTE(MED_NO_PROFILE);
314     SSCRUTE(maa1);
315     ret = -1;
316   };
317 
318 
319   /* enregistre toutes les composantes du deuxième élément de valr1_1 (premier élément en stockage compact de valr1p),
320      au pas de temps n°2(5.6), et n°d'itération n°2 */
321 
322   if ( MEDfieldValueWithProfileWr(fid, nomcha1,2,2,5.6,MED_CELL,MED_TRIA6,USER_MODE,nomprofil1b,
323 		       gauss1_2,USER_INTERLACE, MED_ALL_CONSTITUENT, _nent1_2, (unsigned char*)valr1_2p ) < 0) {
324     MESSAGE("Erreur à l'écriture du champ : ");
325     SSCRUTE(nomcha1);SSCRUTE(MED_NO_PROFILE);
326     SSCRUTE(maa1);
327     ret = -1;
328   };
329 
330 
331   if ( MEDfieldValueWithProfileWr(fid, nomcha1,3,2,5.7,MED_CELL,MED_TRIA6,USER_MODE,nomprofil1,
332 		       MED_NO_LOCALIZATION,USER_INTERLACE, 2, _nent1_3, (unsigned char*)valr1_3p ) < 0) {
333     MESSAGE("Erreur à l'écriture du champ : ");
334     SSCRUTE(nomcha1);SSCRUTE(MED_NO_PROFILE);
335     SSCRUTE(maa1);
336     ret = -1;
337   };
338 
339 
340   /* Ecriture du champ n° 2 */
341 
342 
343   if ( MEDfieldValueWr(fid, nomcha2,MED_NO_DT,MED_NO_IT,0,
344 				  MED_DESCENDING_EDGE,MED_SEG2,
345 				  USER_INTERLACE, 1, nval2, (unsigned char*)valr2 ) < 0) {
346     MESSAGE("Erreur à l'écriture du champ : ");
347     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
348     SSCRUTE(maa1);
349     ret = -1;
350   };
351 
352 
353   if ( MEDfieldValueWr(fid, nomcha2,MED_NO_DT,MED_NO_IT,0,MED_NODE,MED_NONE,
354 				  USER_INTERLACE, 2, nval2, (unsigned char*)valr2 ) < 0) {
355     MESSAGE("Erreur à l'écriture du champ : ");
356     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
357     SSCRUTE(maa1);
358     ret = -1;
359   };
360 
361 
362   if ( MEDfieldValueWr(fid, nomcha2,MED_NO_DT,MED_NO_IT,0,MED_DESCENDING_FACE,MED_TRIA6,
363 				  USER_INTERLACE, 3, nval2, (unsigned char*)valr2 ) < 0) {
364     MESSAGE("Erreur à l'écriture du champ : ");
365     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
366     SSCRUTE(maa1);
367     ret = -1;
368   };
369 
370   /* Creation d'un profil (selection  des éléments 1,3,5 de valr2) */
371   /* On utilise les trois valeurs du profil */
372   if ( MEDprofileWr(fid,nomprofil2,3,profil2) < 0) {
373     MESSAGE("Erreur à l'écriture du profil : ");
374     SSCRUTE(nomprofil2);
375     ret = -1;
376   };
377 
378 
379   if ( MEDfieldValueWithProfileWr(fid, nomcha2,MED_NO_DT,MED_NO_IT,0,MED_CELL,MED_TRIA6,USER_MODE,nomprofil2,
380 		       MED_NO_LOCALIZATION,USER_INTERLACE, 3, nval2, (unsigned char*)valr2p ) < 0) {
381     MESSAGE("Erreur à l'écriture du champ : ");
382     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
383     SSCRUTE(maa1);
384     ret = -1;
385   };
386 
387   /* creation du champ entier n°3 */
388   if ( MEDfieldCr(fid,nomcha3,ITYPECHA,ncomp3,comp3,unit3,dtunit,maa1) < 0) {
389     MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha3);
390     ret = -1;
391   };
392 
393   /* Ecriture du champ n° 3 */
394 
395   if ( MEDfieldValueWr(fid, nomcha3,MED_NO_DT,MED_NO_IT,0,MED_CELL,MED_QUAD4,
396 				  USER_INTERLACE, 1, nval3, (unsigned char*)valr3 ) < 0) {
397     MESSAGE("Erreur à l'écriture du champ : ");
398     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
399     SSCRUTE(maa1);
400     ret = -1;
401   };
402 
403   if ( MEDfieldValueWr(fid, nomcha3,MED_NO_DT,MED_NO_IT,0,MED_NODE_ELEMENT,MED_QUAD4,
404 				  USER_INTERLACE, MED_ALL_CONSTITUENT, _nent3, (unsigned char*)valr3 ) < 0) {
405     MESSAGE("Erreur à l'écriture du champ : ");
406     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
407     SSCRUTE(maa1);
408     ret = -1;
409   };
410 
411   if ( MEDfieldValueWithProfileWr(fid, nomcha3,MED_NO_DT,MED_NO_IT,0,MED_NODE_ELEMENT,MED_QUAD4,USER_MODE,nomprofil2,
412 		       MED_NO_LOCALIZATION,USER_INTERLACE, MED_ALL_CONSTITUENT, _nent3, (unsigned char*)valr3p ) < 0) {
413     MESSAGE("Erreur à l'écriture du champ : ");
414     SSCRUTE(nomcha1);ISCRUTE_int(MED_NO_DT);ISCRUTE_int(MED_NO_IT);SSCRUTE(MED_NO_PROFILE);
415     SSCRUTE(maa1);
416     ret = -1;
417   };
418 
419 
420   /* fermeture du fichier */
421   if ( MEDfileClose(fid) < 0 ) ret=-1;
422 
423   return ret;
424 }
425 
426 
427 
428 
429