1  /*************************************************************************
  2  * COPYRIGHT (C) 1999 - 2003  EDF R&D
  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
 19
 20  /******************************************************************************
 21   * - Nom du fichier : test10.c
 22   *
 23   * - Description : ecriture de champs de resultats MED 
 24   *
 25   *****************************************************************************/
 26
 27  #include <med.h>
 28  #include <med_utils.h>
 29  #include <stdio.h>
 30  #include <string.h>
 31  #include <stdlib.h>
 32  #define USER_INTERLACE MED_FULL_INTERLACE
 33  #define USER_MODE MED_COMPACT
 34  int main (int argc, char **argv)
 35  {
 36    med_err ret=0;
 37    med_idt fid;
 38
 39    /* Constantes */
 40    med_float a=0.446948490915965;
 41    med_float b=0.091576213509771;
 42    med_float p1=0.11169079483905;
 43    med_float p2=0.0549758718227661;
 44
 45    /* Maillage support aux champs*/
 46    /* Ces maillages sont vides*/
 47    char maa1[MED_TAILLE_NOM+1]= "maa1";
 48    char maa2[MED_TAILLE_NOM+1]= "maa2";
 49    char * lien_maa2 = "./testfoo.med";
 50    char maa3[MED_TAILLE_NOM+1]= "maa3";
 51
 52
 53    /* Caractéristiques du champ n° 1 sur TRIA6 */
 54    char nomcha1[MED_TAILLE_NOM+1]  = "champ reel";
 55    char comp1[2*MED_TAILLE_PNOM+1] = "comp1           comp2           ";
 56                                     /*12345678901234561234567890123456*/
 57    char unit1[2*MED_TAILLE_PNOM+1] = "unit1           unit2           ";
 58    med_int ncomp1  = 2;
 59    /* Caractéristiques du model n° 1 de localisation des points de gauss pour le champ n°1*/
 60    med_int ngauss1_1 = 6;
 61    char gauss1_1[MED_TAILLE_NOM+1]  = "Model n1";
 62    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 };
 63    med_float gscoo1_1[12] = { 2*b-1, 1-4*b, 2*b-1, 2*b-1, 1-4*b, 2*b-1, 1-4*a, 2*a-1, 2*a-1, 1-4*a, 2*a-1, 2*a-1   };
 64    med_float wg1_1[6] = { 4*p2, 4*p2, 4*p2, 4*p1, 4*p1, 4*p1 };
 65    med_int   nval1_1= 1*6; /*1 valeurs et 6 points de gauss par valeur */
 66    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*/
 67    /* Caractéristiques du model n° 2 de localisation des points de gauss pour le champ n°1*/
 68    med_int ngauss1_2 = 3;
 69    char gauss1_2[MED_TAILLE_NOM+1]  = "Model n2";
 70    med_float gscoo1_2[6] = { -2.0/3,1.0/3, -2.0/3,-2.0/3, 1.0/3,-2.0/3  };
 71    med_float wg1_2[3] = { 2.0/3, 2.0/3, 2.0/3 };
 72    med_int   nval1_2= 2*3; /*2 valeurs et 3 points de gauss par valeur */
 73    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*/
 74    med_float valr1_2p[2*3*2]  = {                              12.0,13.0, 20.0,21.0, 22.0,23.0};  /* 2 composantes*/
 75   /* Caractéristiques du model n° 3 sans points de gauss pour le champ n°1*/
 76    med_int   nval1_3= 6; /*6 valeurs et pas de points de gauss */
 77    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*/
 78    med_float valr1_3p[2*2*2] = {         2.0,3.0, 10.0,11.0                                 };  /* 2 composantes profil1 */
 79
 80    /* Caractéristiques du champ n° 2 */
 81    char nomcha2[MED_TAILLE_NOM+1]  = "champ entier";
 82    char comp2[3*MED_TAILLE_PNOM+1] = "comp1           comp2           comp3           ";
 83                                     /*123456789012345612345678901234561234567890123456*/
 84    char unit2[3*MED_TAILLE_PNOM+1] = "unit1           unit2           unit3           ";
 85    med_int ncomp2  = 3;
 86    med_int nval2 = 5;   /*5 valeurs */
 87    med_int   valr2[5*3  ]  = {0,1,2, 10,11,12, 20,21,22, 30,31,32, 40,41,42};              /* 3 composantes*/
 88    med_int   valr2p[3*3  ] = {0,1,2,           20,21,22,           40,41,42};              /* 3 composantes*/
 89
 90    /* Profils utilisés */
 91    char nomprofil1[MED_TAILLE_NOM+1]  = "PROFIL(champ(1))";
 92    med_int profil1[2] = { 2, 3 };
 93    med_int profil2[3] = { 1, 3, 5 };
 94
 95    /* ouverture du fichier */
 96    if ((fid = MEDouvrir("test10.med",MED_CREATION)) < 0){
 97      MESSAGE("Erreur à l'ouverture du fichier : ");
 98      return -1;
 99    }
100
101    /* creation de maa1 de dimension 3*/
102    if ( MEDmaaCr(fid,maa1,3,MED_NON_STRUCTURE,"Maillage vide") < 0) {
103      MESSAGE("Erreur à la création du maillage : ");SSCRUTE(maa1);
104      ret = -1;
105    };
106
107    /* creation de maa3 de dimension 3*/
108    if ( MEDmaaCr(fid,maa3,3,MED_NON_STRUCTURE,"Maillage vide") < 0) {
109      MESSAGE("Erreur à la création du maillage : ");SSCRUTE(maa3);
110      ret = -1;
111    };
112
113    /* creation du champ réel n°1 */
114    if ( MEDchampCr(fid,nomcha1,MED_FLOAT64,comp1,unit1,ncomp1) < 0) {
115      MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha1);
116      ret = -1;
117    };
118
119    /* creation du champ entier n°2 */
120    if ( MEDchampCr(fid,nomcha2,MED_INT32,comp2,unit2,ncomp2) < 0) {
121      MESSAGE("Erreur à la création du champ : ");SSCRUTE(nomcha2);
122      ret = -1;
123    };
124
125    /* creation du lien au fichier distant contenant maa2 */
126    if (MEDlienEcr(fid,lien_maa2,maa2) < 0) {
127      MESSAGE("Erreur à la création du lien : ");SSCRUTE(lien_maa2);
128      ret = -1;
129    };
130
131    /* creation de la localisation des points de Gauss modèle n°1 */
132    if (MEDgaussEcr(fid, MED_TRIA6, refcoo1, USER_INTERLACE,
133            ngauss1_1, gscoo1_1, wg1_1, gauss1_1) < 0) {
134      MESSAGE("Erreur à la création du modèle n°1 : ");SSCRUTE(gauss1_1);
135      ret = -1;
136    };
137
138     /* creation de la localisation des points de Gauss modèle n°2 */
139    if (MEDgaussEcr(fid, MED_TRIA6, refcoo1, USER_INTERLACE,
140            ngauss1_2, gscoo1_2, wg1_2, gauss1_2) < 0) {
141      MESSAGE("Erreur à la création du modèle n°1 : ");SSCRUTE(gauss1_2);
142      ret = -1;
143    };
144
145    /* ecriture du champ n°1*/
146    /* enregistre uniquement les composantes n°2 de valr1_1, et n'utilise ni pas de temps ni n° d'ordre*/
147    if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_1,USER_INTERLACE,nval1_1,gauss1_1,
148             2,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR ) < 0) {
149      MESSAGE("Erreur à l'écriture du champ : ");
150      SSCRUTE(nomcha1);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
151      SSCRUTE(maa1);
152      ret = -1;
153    };
154
155
156    /* enregistre uniquement les composantes n°1 de valr1_1, et n'utilise ni pas de temps ni n° d'ordre */
157    if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_1,USER_INTERLACE,nval1_1,gauss1_1,
158                1,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR) < 0) {
159      MESSAGE("Erreur à l'écriture du champ : ");
160      SSCRUTE(nomcha1);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
161      SSCRUTE(maa1);
162      ret = -1;
163    };
164
165
166    /* enregistre uniquement les composantes n°1 de valr1_2, au pas de temps n°1(5.5), n'utilise pas de n°d'ordre*/
167    /* ce champ repose sur le maillage maa2 qui est distant */
168    if ( MEDchampEcr(fid,maa2,nomcha1,(unsigned char*)valr1_2,USER_INTERLACE,nval1_2,gauss1_2,
169                1,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,1,"ms",5.5,MED_NONOR) < 0) {
170      MESSAGE("Erreur à l'écriture du champ : ");
171      SSCRUTE(nomcha1);ISCRUTE(1);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
172      SSCRUTE(maa2);
173      ret = -1;
174    };
175
176    /* enregistre uniquement les composantes n°2 de valr1_2, au pas de temps n°1(5.5), n'utilise pas de n°d'ordre*/
177    /* ce champ repose sur le maillage maa1 qui est local */
178    if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_1,USER_INTERLACE,nval1_1,gauss1_1,
179                2,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,1,"ms",5.5,MED_NONOR) < 0) {
180      MESSAGE("Erreur à l'écriture du champ : ");
181      SSCRUTE(nomcha1);ISCRUTE(1);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
182      SSCRUTE(maa1);
183      ret = -1;
184    };
185
186      /* enregistre uniquement les composantes n°1 de valr1_1, au pas de temps n°1(5.5), et n°d'itération n°2*/
187      /* ce champ repose sur le maillage maa3 qui est local */
188    if ( MEDchampEcr(fid,maa3,nomcha1,(unsigned char*)valr1_2,USER_INTERLACE,nval1_2,gauss1_2,
189             1,MED_NOPFL,MED_NO_PFLMOD,MED_MAILLE,MED_TRIA6,1,"ms",5.5,2) < 0) {
190      MESSAGE("Erreur à l'écriture du champ : ");
191      SSCRUTE(nomcha1);ISCRUTE(1);ISCRUTE(2);SSCRUTE(MED_NOPFL);
192      SSCRUTE(maa3);
193      ret = -1;
194    };
195
196    /* Creation d'un profil (selection  du deuxieme élément de valr1_1) */
197    /* On n'utilise que la première valeur (2) du profil */
198    if ( MEDprofilEcr(fid,profil1,1,nomprofil1) < 0) {
199      MESSAGE("Erreur à l'écriture du profil : ");
200      SSCRUTE(profil1);
201      ret = -1;
202    };
203
204
205    /* enregistre toutes les composantes du deuxième élément de valr1_1 (premier élément en stockage compact de valr1p),
206       au pas de temps n°2(5.6), et n°d'itération n°2*/
207    if ( MEDchampEcr(fid,maa1, nomcha1,(unsigned char*)valr1_3p,USER_INTERLACE,nval1_3,MED_NOGAUSS,
208             MED_ALL,nomprofil1,USER_MODE,MED_MAILLE,MED_TRIA6,2,"ms",5.6,2) < 0) {
209      MESSAGE("Erreur à l'écriture du champ : ");
210      SSCRUTE(nomcha1);ISCRUTE(2);ISCRUTE(2);SSCRUTE(nomprofil1);
211      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
212      ret = -1;
213    };
214
215    /* enregistre toutes les composantes du deuxième élément de valr1_1 (premier élément en stockage compact de valr1p),
216       au pas de temps n°2(5.6), et n°d'itération n°2 */
217    if ( MEDchampEcr(fid,maa2, nomcha1,(unsigned char*)valr1_2p,USER_INTERLACE,nval1_2,gauss1_2,
218             MED_ALL,nomprofil1,USER_MODE,MED_MAILLE,MED_TRIA6,2,"ms",5.6,2) < 0) {
219      MESSAGE("Erreur à l'écriture du champ : ");
220      SSCRUTE(nomcha1);ISCRUTE(2);ISCRUTE(2);SSCRUTE(nomprofil1);
221      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
222      ret = -1;
223    };
224
225
226    /* 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*/
227    if ( MEDchampEcr(fid,maa1,nomcha1,(unsigned char*)valr1_3p,USER_INTERLACE,nval1_3,MED_NOGAUSS,
228             2,nomprofil1,USER_MODE,MED_MAILLE,MED_TRIA6,3,"ms",5.7,2) < 0)  {
229      MESSAGE("Erreur à l'écriture du champ : ");
230      SSCRUTE(nomcha1);ISCRUTE(2);ISCRUTE(2);SSCRUTE(nomprofil1);
231      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
232      ret = -1;
233    };
234
235
236
237    /* Ecriture du champ n° 2 */
238    /* TESTER EGALEMENT EN MODE FULL_INTERLACE EN MODIFIANT LA SIGNATURE DE LA ROUTINE */
239
240    /* enregistre la composante n°1 des éléments de valr2, et n'utilise ni pas de temps ni n° d'ordre */
241    if (MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2,USER_INTERLACE,nval2,MED_NOGAUSS,
242            1,MED_NOPFL,MED_NO_PFLMOD,MED_ARETE,MED_SEG2,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
243      MESSAGE("Erreur à l'écriture du champ : ");
244      SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
245      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
246      ret = -1;
247    };
248
249
250    /* enregistre la composante n°2 des éléments de valr2, et n'utilise ni pas de temps ni n° d'ordre */
251    /*        pour des raisons de complétude des tests on change le type d'élément (aucun sens phys.))*/
252    if (MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2,USER_INTERLACE,nval2,MED_NOGAUSS,
253                        2,MED_NOPFL,MED_NO_PFLMOD,MED_NOEUD,0,MED_NOPDT,"",0.0,MED_NONOR) < 0)  {
254      MESSAGE("Erreur à l'écriture du champ : ");
255      SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
256      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
257      ret = -1;
258    };
259
260    /* enregistre la composante n°3 des éléments de valr2, et n'utilise ni pas de temps ni n° d'ordre */
261    /*        pour des raisons de complétude des tests on change le type d'élément (aucun sens phys.))*/
262    if ( MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2,USER_INTERLACE,nval2,MED_NOGAUSS,
263             3,MED_NOPFL,MED_NO_PFLMOD,MED_FACE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR) < 0 ) {
264      MESSAGE("Erreur à l'écriture du champ : ");
265      SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
266      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
267      ret = -1;
268    };
269
270    /* Creation d'un profil (selection  des éléments 1,3,5 de valr2) */
271    /* On utilise les trois valeurs du profil */
272    if ( MEDprofilEcr(fid,profil2,3,"PROFIL(champ2)") < 0) {
273      MESSAGE("Erreur à l'écriture du profil : ");
274      SSCRUTE(profil1);
275      ret = -1;
276    };
277
278    /* enregistre la composante n°3 des éléments du profil2 de valr2, et n'utilise ni pas de temps ni n° d'ordre */
279    if ( MEDchampEcr(fid,maa1,nomcha2,(unsigned char*)valr2p,USER_INTERLACE,nval2,MED_NOGAUSS,
280                        3,"PROFIL(champ2)",USER_MODE,MED_MAILLE,MED_TRIA6,MED_NOPDT,"",0.0,MED_NONOR) < 0 ) {
281      MESSAGE("Erreur à l'écriture du champ : ");
282      SSCRUTE(nomcha2);ISCRUTE(MED_NOPDT);ISCRUTE(MED_NONOR);SSCRUTE(MED_NOPFL);
283      SSCRUTE(maa1);SSCRUTE(MED_NOLIEN);
284      ret = -1;
285    };
286
287
288    /* fermeture du fichier */
289    if ( MEDfermer(fid) < 0 ) ret=-1;
290
291    return ret;
292  }
293
294
295
296