1 /*************************************************************************
  2 * COPYRIGHT (C) 1999 - 2007  EDF R&D, CEA/DEN
  3 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  4 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
  5 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
  6 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
  7 *  
  8 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
  9 * 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 LICENSE
 14 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
 15 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
 16 *
 17 *************************************************************************/
 18 #define _a 0.446948490915965
 19 #define _b 0.091576213509771
 20 #define _p1 0.11169079483905
 21 #define _p2 0.0549758718227661
 22 
 23 /******************************************************************************
 24  * - Nom du fichier : test10.c
 25  *
 26  * - Description : ecriture de champs de resultats MED 
 27  *
 28  *****************************************************************************/
 29 
 30 #include <med.h>
 31 #define MESGERR
 32 #include <med_utils.h>
 33 
 34 #ifdef DEF_LECT_ECR
 35 #define MODE_ACCES MED_LECTURE_ECRITURE
 36 #elif DEF_LECT_AJOUT
 37 #define MODE_ACCES MED_LECTURE_AJOUT
 38 #else
 39 #define MODE_ACCES MED_CREATION
 40 #endif
 41 
 42 #ifndef USER_INTERLACE
 43 #define USER_INTERLACE MED_FULL_INTERLACE
 44 #endif
 45 
 46 #define USER_MODE MED_COMPACT
 47 
 48 int main (int argc, char **argv)
 49 
 50 
 51 {
 52   med_err ret=0;
 53   med_idt fid;
 54 
 55 
 56 
 57   /* Maillage support aux champs*/
 58   /* Ces maillages sont vides*/
 59   char maa1[MED_TAILLE_NOM+1]= "maa1";
 60   char maa2[MED_TAILLE_NOM+1]= "maa2";
 61   char * lien_maa2 = "./testfoo.med";
 62   char maa3[MED_TAILLE_NOM+1]= "maa3";
 63 
 64 
 65   /* Caractéristiques du champ n° 1 sur TRIA6 */
 66   char nomcha1[MED_TAILLE_NOM+1]  = "champ reel";
 67   char comp1[2*MED_TAILLE_PNOM+1] = "comp1           comp2           ";
 68                                    /*12345678901234561234567890123456*/
 69   char unit1[2*MED_TAILLE_PNOM+1] = "unit1           unit2           ";
 70   med_int ncomp1  = 2;
 71   /* Caractéristiques du model n° 1 de localisation des points de gauss pour le champ n°1*/
 72   med_int ngauss1_1 = 6;
 73   char gauss1_1[MED_TAILLE_NOM+1]  = "Model n1";
 74   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 };
 75 
 76   /* Constantes */
 77 
 78   med_float gscoo1_1[12] = { 2*_b-1, 1-4*_b, 2*_b-1, 2*_b-1, 1-4*_b,
 79                              2*_b-1, 1-4*_a, 2*_a-1, 2*_a-1, 1-4*_a, 2*_a-1, 2*_a-1 };
 80   med_float wg1_1[6] = { 4*_p2, 4*_p2, 4*_p2, 4*_p1, 4*_p1, 4*_p1 };
 81 
 82   med_int   nval1_1= 1*6; /*1 valeurs et 6 points de gauss par valeur */
 83   med_float 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*/
 84   /* Caractéristiques du model n° 2 de localisation des points de gauss pour le champ n°1*/
 85   med_int ngauss1_2 = 3;
 86   char gauss1_2[MED_TAILLE_NOM+1]  = "Model n2";
 87   med_float gscoo1_2[6] = { -2.0/3,1.0/3, -2.0/3,-2.0/3, 1.0/3,-2.0/3  };
 88   med_float wg1_2[3] = { 2.0/3, 2.0/3, 2.0/3 };
 89   med_int   nval1_2= 2*3; /*2 valeurs et 3 points de gauss par valeur */
 90   med_float 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*/
 91   med_float valr1_2p[2*3*2]  = {                              12.0,13.0, 20.0,21.0, 22.0,23.0};  /* 2 composantes*/
 92  /* Caractéristiques du model n° 3 sans points de gauss pour le champ n°1*/
 93   med_int   nval1_3= 6; /*6 valeurs et pas de points de gauss */
 94   med_float 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*/
 95   med_float valr1_3p[2*2*2] = {         2.0,3.0, 10.0,11.0                                 };  /* 2 composantes profil1 */
 96 
 97   /* Caractéristiques du champ n° 2 */
 98   char nomcha2[MED_TAILLE_NOM+1]  = "champ entier";
 99   char comp2[3*MED_TAILLE_PNOM+1] = "comp1           comp2           comp3           ";
100                                    /*123456789012345612345678901234561234567890123456*/
101   char unit2[3*MED_TAILLE_PNOM+1] = "unit1           unit2           unit3           ";
102   med_int ncomp2  = 3;
103   med_int nval2 = 5;   /*5 valeurs */
104   med_int   valr2[5*3  ]  = {0,1,2, 10,11,12, 20,21,22, 30,31,32, 40,41,42};              /* 3 composantes*/
105   med_int   valr2p[3*3  ] = {0,1,2,           20,21,22,           40,41,42};              /* 3 composantes*/
106 
107   /* Profils utilisés */
108   char nomprofil1[MED_TAILLE_NOM+1]  = "PROFIL(champ(1))";
109   char nomprofil2[MED_TAILLE_NOM+1]  = "PROFIL(champ2)";
110   med_int profil1[2] = { 2, 3 };
111   med_int profil2[3] = { 1, 3, 5 };
112 
113 
114   /* Caractéristiques du champ n° 3 */
115   char nomcha3[MED_TAILLE_NOM+1]  = "champ entier 3";
116   char comp3[3*MED_TAILLE_PNOM+1] = "comp1           comp2           ";
117                                    /*123456789012345612345678901234561234567890123456*/
118   char unit3[3*MED_TAILLE_PNOM+1] = "unit1           unit2           ";
119   med_int ncomp3  = 2;
120   med_int nval3 = 5*4;     /*5 valeurs et 4 noeuds par element*/
121   med_int valr3[5*4*2]   = {0,1, 10,11, 20,21, 30,31,
122                             40,41, 50,51, 60,61, 70,71,
123                             80,81, 90,91, 100,101, 110,111,
124                             120,121, 130,131, 140,141, 150,151,
125                             160,161, 170,171, 180,181, 190,191};    /* 2 composantes*/
126   med_int valr3p[3*4*2]  = {0,1, 10,11, 20,21, 30,31,
127                             80,81, 90,91, 100,101, 110,111,
128                             160,161, 170,171, 180,181, 190,191};    /* 2 composantes*/
129 
130 
131 
132 
133 
134 
135   /* ouverture du fichier */
136   if ((fid = MEDouvrir("test10.med",MODE_ACCES)) < 0){
137     MESSAGE("Erreur à l'ouverture du fichier : ");
138     return -1;
139   }
140 
141   /* creation de maa1 de dimension 3*/
142   if ( MEDmaaCr(fid,maa1,3,MED_NON_STRUCTURE,"Maillage vide") < 0) {
143     MESSAGE("Erreur à la création du maillage : ");SSCRUTE(maa1);
144     ret = -1;
145   };
146 
147   /* creation de maa3 de dimension 3*/
148   if ( MEDmaaCr(fid,maa3,3,MED_NON_STRUCTURE,"Maillage vide") < 0) {
149     MESSAGE("Erreur à la création du maillage : ");SSCRUTE(maa3);
150     ret = -1;
151   };
152 
153   /* creation du champ réel n°1 */
154   if ( MEDchampCr(fid,nomcha1,MED_FLOAT64,comp1,unit1,ncomp1) < 0) {
155     MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha1);
156     ret = -1;
157   };
158 
159   /* creation du champ entier n°2 */
160   if ( MEDchampCr(fid,nomcha2,MED_INT32,comp2,unit2,ncomp2) < 0) {
161     MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha2);
162     ret = -1;
163   };
164 
165   /* creation du lien au fichier distant contenant maa2 */
166   if (MEDlienEcr(fid,lien_maa2,maa2) < 0) {
167     MESSAGE("Erreur à la création du lien : ");SSCRUTE(lien_maa2);
168     ret = -1;
169   };
170 
171   /* creation de la localisation des points de Gauss modèle n°1 */
172   if (MEDgaussEcr(fid, MED_TRIA6, refcoo1, USER_INTERLACE,
173                   ngauss1_1, gscoo1_1, wg1_1, gauss1_1) < 0) {
174     MESSAGE("Erreur à la création du modèle n°1 : ");SSCRUTE(gauss1_1);
175     ret = -1;
176   };
177 
178    /* creation de la localisation des points de Gauss modèle n°2 */
179   if (MEDgaussEcr(fid, MED_TRIA6, refcoo1, USER_INTERLACE,
180                   ngauss1_2, gscoo1_2, wg1_2, gauss1_2) < 0) {
181     MESSAGE("Erreur à la création du modèle n°1 : ");SSCRUTE(gauss1_2);
182     ret = -1;
183   };
184 
185   /* ecriture du champ n°1*/
186   /* enregistre uniquement les composantes n°2 de valr1_1, et n'utilise ni pas de temps ni n° d'ordre*/
187   if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_1,USER_INTERLACE,nval1_1,gauss1_1,
188                    2,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR ) < 0) {
189     MESSAGE("Erreur à l'écriture du champ : ");
190     SSCRUTE(nomcha1);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
191     SSCRUTE(maa1);
192     ret = -1;
193   };
194 
195 
196   /* enregistre uniquement les composantes n°1 de valr1_1, et n'utilise ni pas de temps ni n° d'ordre */
197   if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_1,USER_INTERLACE,nval1_1,gauss1_1,
198                       1,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR) < 0) {
199     MESSAGE("Erreur à l'écriture du champ : ");
200     SSCRUTE(nomcha1);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
201     SSCRUTE(maa1);
202     ret = -1;
203   };
204 
205 
206   /* enregistre uniquement les composantes n°1 de valr1_2, au pas de temps n°1(5.5), n'utilise pas de n°d'ordre*/
207   /* ce champ repose sur le maillage maa2 qui est distant */
208   if ( MEDchampEcr(fid,maa2,nomcha1,(unsigned char*)valr1_2,USER_INTERLACE,nval1_2,gauss1_2,
209                       1,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,1,"ms",5.5,MED_NONOR) < 0) {
210     MESSAGE("Erreur à l'écriture du champ : ");
211     SSCRUTE(nomcha1);ISCRUTE(1);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
212     SSCRUTE(maa2);
213     ret = -1;
214   };
215 
216   /* enregistre uniquement les composantes n°2 de valr1_2, au pas de temps n°1(5.5), n'utilise pas de n°d'ordre*/
217   /* ce champ repose sur le maillage maa1 qui est local */
218   if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_1,USER_INTERLACE,nval1_1,gauss1_1,
219                       2,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,1,"ms",5.5,MED_NONOR) < 0) {
220     MESSAGE("Erreur à l'écriture du champ : ");
221     SSCRUTE(nomcha1);ISCRUTE(1);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
222     SSCRUTE(maa1);
223     ret = -1;
224   };
225 
226     /* enregistre uniquement les composantes n°1 de valr1_1, au pas de temps n°1(5.5), et n°d'itération n°2*/
227     /* ce champ repose sur le maillage maa3 qui est local */
228   if ( MEDchampEcr(fid,maa3,nomcha1,(unsigned char*)valr1_2,USER_INTERLACE,nval1_2,gauss1_2,
229                    1,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,1,"ms",5.5,2) < 0) {
230     MESSAGE("Erreur à l'écriture du champ : ");
231     SSCRUTE(nomcha1);ISCRUTE(1);ISCRUTE(2);SSCRUTE(MED_NOPFL);
232     SSCRUTE(maa3);
233     ret = -1;
234   };
235 
236   /* Creation d'un profil (selection  du deuxieme élément de valr1_1) */
237   /* On n'utilise que la première valeur (2) du profil */
238   if ( MEDprofilEcr(fid,profil1,1,nomprofil1) < 0) {
239     MESSAGE("Erreur à l'écriture du profil : ");
240     SSCRUTE(profil1);
241     ret = -1;
242   };
243 
244 
245   /* enregistre toutes les composantes du deuxième élément de valr1_1 (premier élément en stockage compact de valr1p),
246      au pas de temps n°2(5.6), et n°d'itération n°2*/
247   if ( MEDchampEcr(fid,maa1, nomcha1,(unsigned char*)valr1_3p,USER_INTERLACE,nval1_3,MED_NOGAUSS,
248                    MED_ALL,nomprofil1,USER_MODE,MED_MAILLE,MED_TRIA6,2,"ms",5.6,2) < 0) {
249     MESSAGE("Erreur à l'écriture du champ : ");
250     SSCRUTE(nomcha1);ISCRUTE(2);ISCRUTE(2);SSCRUTE(nomprofil1);
251     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
252     ret = -1;
253   };
254 
255   /* enregistre toutes les composantes du deuxième élément de valr1_1 (premier élément en stockage compact de valr1p),
256      au pas de temps n°2(5.6), et n°d'itération n°2 */
257   if ( MEDchampEcr(fid,maa2, nomcha1,(unsigned char*)valr1_2p,USER_INTERLACE,nval1_2,gauss1_2,
258                    MED_ALL,nomprofil1,USER_MODE,MED_MAILLE,MED_TRIA6,2,"ms",5.6,2) < 0) {
259     MESSAGE("Erreur à l'écriture du champ : ");
260     SSCRUTE(nomcha1);ISCRUTE(2);ISCRUTE(2);SSCRUTE(nomprofil1);
261     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
262     ret = -1;
263   };
264 
265 
266   /* enregistre la composante n°2 du deuxième élément de valr1, au pas de temps n°2(5.7), et n°d'itération n°2*/
267   if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_3p,USER_INTERLACE,nval1_3,MED_NOGAUSS,
268                    2,nomprofil1,USER_MODE,MED_MAILLE,MED_TRIA6,3,"ms",5.7,2) < 0)  {
269     MESSAGE("Erreur à l'écriture du champ : ");
270     SSCRUTE(nomcha1);ISCRUTE(2);ISCRUTE(2);SSCRUTE(nomprofil1);
271     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
272     ret = -1;
273   };
274 
275 
276 
277   /* Ecriture du champ n° 2 */
278   /* TESTER EGALEMENT EN MODE FULL_INTERLACE EN MODIFIANT LA SIGNATURE DE LA ROUTINE */
279 
280   /* enregistre la composante n°1 des éléments de valr2, et n'utilise ni pas de temps ni n° d'ordre */
281   if (MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2,USER_INTERLACE,nval2,MED_NOGAUSS,
282                   1,MED_NOPFL,MED_NO_PFLMOD,MED_ARETE,MED_SEG2,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
283     MESSAGE("Erreur à l'écriture du champ : ");
284     SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
285     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
286     ret = -1;
287   };
288 
289 
290   /* enregistre la composante n°2 des éléments de valr2, et n'utilise ni pas de temps ni n° d'ordre */
291   /*        pour des raisons de complétude des tests on change le type d'élément (aucun sens phys.))*/
292   if (MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2,USER_INTERLACE,nval2,MED_NOGAUSS,
293                       2,MED_NOPFL,MED_NO_PFLMOD,MED_NOEUD,0,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
294     MESSAGE("Erreur à l'écriture du champ : ");
295     SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
296     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
297     ret = -1;
298   };
299 
300   /* enregistre la composante n°3 des éléments de valr2, et n'utilise ni pas de temps ni n° d'ordre */
301   /*        pour des raisons de complétude des tests on change le type d'élément (aucun sens phys.))*/
302   if ( MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2,USER_INTERLACE,nval2,MED_NOGAUSS,
303                    3,MED_NOPFL,MED_NO_PFLMOD,MED_FACE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR) < 0 ) {
304     MESSAGE("Erreur à l'écriture du champ : ");
305     SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
306     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
307     ret = -1;
308   };
309 
310   /* Creation d'un profil (selection  des éléments 1,3,5 de valr2) */
311   /* On utilise les trois valeurs du profil */
312   if ( MEDprofilEcr(fid,profil2,3,nomprofil2) < 0) {
313     MESSAGE("Erreur à l'écriture du profil : ");
314     SSCRUTE(nomprofil2);
315     ret = -1;
316   };
317 
318   /* enregistre la composante n°3 des éléments du profil2 de valr2, et n'utilise ni pas de temps ni n° d'ordre */
319   if ( MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2p,USER_INTERLACE,nval2,MED_NOGAUSS,
320                       3,nomprofil2,USER_MODE,MED_MAILLE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR) < 0 ) {
321     MESSAGE("Erreur à l'écriture du champ : ");
322     SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
323     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
324     ret = -1;
325   };
326 
327   /* creation du champ entier n°3 */
328   if ( MEDchampCr(fid,nomcha3,MED_INT32,comp3,unit3,ncomp3) < 0) {
329     MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha3);
330     ret = -1;
331   };
332 
333   /* Ecriture du champ n° 3 */
334 
335   /* enregistre la composante n°1 des éléments de valr3, et n'utilise ni pas de temps ni n° d'ordre */
336   if (MEDchampEcr(fid,maa1,nomcha3,(unsigned char*)valr3,USER_INTERLACE,nval3,MED_NOGAUSS,
337                   1,MED_NOPFL,MED_NO_PFLMOD,MED_NOEUD_MAILLE,MED_QUAD4,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
338     MESSAGE("Erreur à l'écriture du champ : ");
339     SSCRUTE(nomcha3);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
340     SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
341     ret = -1;
342   };
343 
344   /* enregistre les composantes des éléments de valr3, et n'utilise ni pas de temps ni n° d'ordre */
345   if (MEDchampEcr(fid,maa2,nomcha3,(unsigned char*)valr3,USER_INTERLACE,nval3,MED_NOGAUSS,
346                   MED_ALL,MED_NOPFL,MED_NO_PFLMOD,MED_NOEUD_MAILLE,MED_QUAD4,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
347     MESSAGE("Erreur à l'écriture du champ : ");
348     SSCRUTE(nomcha3);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
349     SSCRUTE(maa2);SSCRUTE(MED_NOLIEN);
350     ret = -1;
351   };
352 
353   /* enregistre les composantes des éléments de valr3, et n'utilise ni pas de temps ni n° d'ordre */
354   if (MEDchampEcr(fid,maa3,nomcha3,(unsigned char*)valr3p,USER_INTERLACE,nval3,MED_NOGAUSS,
355                   MED_ALL,nomprofil2,USER_MODE,MED_NOEUD_MAILLE,MED_QUAD4,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
356     MESSAGE("Erreur à l'écriture du champ : ");
357     SSCRUTE(nomcha3);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(nomprofil2);
358     SSCRUTE(maa3);SSCRUTE(MED_NOLIEN);
359     ret = -1;
360   };
361 
362 
363   /* fermeture du fichier */
364   if ( MEDfermer(fid) < 0 ) ret=-1;
365 
366   return ret;
367 }
368 
369 
370 
371