1 /*************************************************************************
2 * COPYRIGHT (C) 1999 - 2002 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.
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.
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
17 *************************************************************************/
20 #include "med_outils.hxx"
26 * - Nom de la fonction : MEDchampEcr
27 * - Description : ecriture d'un Champ Résultat
29 * - fid (IN) : ID du fichier HDF courant
30 * - maa (IN) : le nom du maillage sur lequel s'applique le champ
31 * - cha (IN) : le nom du champ
32 * - val (IN) : valeurs du champ à stocker
33 * - interlace(IN) : entrelacement utilisé en mémoire {MED_FULL_INTERLACE,MED_NO_INTERLACE}
34 * - nbelem (IN) : nombre d'éléments (prend en compte le nbre
35 * de points de Gauss (c'est demandé à l'utilisateur ds la doc) mais pas le nbre de composantes)
36 * - ngauss (IN) : nbre de point de gauss utilisé (MED_NOPG si aucun)
37 * - numco (IN) : n° de la composante à stocker (MED_ALL si toutes)
38 * - profil (IN) : nom du profil utilisé (MED_NOPFL si inutilisé)
39 * - mode (IN) : mode d'ecriture MED (MED_ECRI | MED_REMP)
40 * - type_ent (IN) : entité concerné par le champ {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
41 * - type_geo (IN) : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
42 * - numdt (IN) : n° du pas de temps (MED_NOPDT si aucun)
43 * - dt_unit (IN) : chaine de taille MED_NOMP indiquant l'unité du champ
44 * - dt (IN) : valeur du pas de temps
45 * - numo (IN) : n° d'ordre utilisé MED_NONOR si inutile
46 * - Resultat : 0 en cas de succes, -1 sinon
52 MEDchampEcr(med_idt fid, char *maa, char *cha,unsigned char *val,med_mode_switch interlace,med_int nbelem,med_int ngauss,
53 med_int numco, char * profil, med_mode_acces mode, med_entite_maillage type_ent,
54 med_geometrie_element type_geo, med_int numdt,char * dt_unit, med_float dt, med_int numo)
57 med_idt chid,datagroup1,datagroup2;
58 med_int ncomp, chtype, i, locnumdt,pfluse;
59 char pflname [MED_TAILLE_NOM+1];
60 char maillage[MED_TAILLE_NOM+1];
61 char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2],nomdatagroup2[2*MED_MAX_PARA+1];
62 char tmp1[MED_TAILLE_NOM_ENTITE+1];
63 med_size dimd[1],psize;
66 char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1];
69 * On inhibe le gestionnaire d'erreur HDF 5
71 _MEDmodeErreurVerrouiller();
75 * Si le Data Group cha n'existe pas => erreur
77 strcpy(chemin,MED_CHA);
79 if ((chid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
83 * Creation du datagroup de niveau 1 <type_ent>[.<type_geo>]
86 if ((ret = _MEDnomEntite(nomdatagroup1,type_ent)) < 0)
88 if ((type_ent != MED_NOEUD))
90 if ((ret = _MEDnomGeometrie(tmp1,type_geo)) < 0)
92 strcat(nomdatagroup1,".");
93 strcat(nomdatagroup1,tmp1);
96 if ( (datagroup1 = _MEDdatagroupOuvrir(chid,nomdatagroup1)) < 0)
97 if ((datagroup1 = _MEDdatagroupCreer(chid,nomdatagroup1)) < 0)
100 /* Creation du datagroup de niveau 2 <numdt>.<numoo> */
101 if ( numdt == MED_NOPDT) locnumdt = MED_NOPDT; else locnumdt = numdt;
102 sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) locnumdt,MED_MAX_PARA,(long ) numo);
105 /*Cree ou ouvre (en mode MED_REMP) le datagroup nomdatagroup2 */
107 if (((datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) > 0)
108 && (mode != MED_REMP))
112 if ((datagroup2 = _MEDdatagroupCreer(datagroup1,nomdatagroup2)) < 0)
115 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NDT */
116 if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NDT,&numdt,mode)) < 0)
119 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_PDT */
120 if ((ret = _MEDattrFloatEcrire(datagroup2,MED_NOM_PDT,&dt,mode)) < 0)
123 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NOR */
124 if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NOR,&numo,mode)) < 0)
127 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NBR */
128 if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NBR,&nbelem,mode)) < 0)
131 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_MAA */
132 /* rem : Aucune verification de l'existence du maillage */
133 strncpy(maillage,maa,MED_TAILLE_NOM);
134 maillage[MED_TAILLE_NOM]='\0';
135 if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maillage,mode)) < 0)
138 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_PFL */
140 if ( strlen(profil) == 0) /* idem MED_NOPFL*/
141 strncpy(pflname,MED_NOPFLi,MED_TAILLE_NOM+1);
143 strncpy(pflname,profil,MED_TAILLE_NOM);
144 pflname[MED_TAILLE_NOM]='\0';
147 if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_PFL,MED_TAILLE_NOM,pflname,mode)) < 0)
150 /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_UNI */
151 if ( strlen(dt_unit) == 0) {
152 if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,(char*)" ",mode)) < 0)
155 if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit,mode)) < 0)
159 /* Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NGAU */
160 /* Ecriture du nombre de pts de gauss propre au <type_ent>[.<type_geo>] */
161 /* On n'utilise pas ngauss=MED_NOPG mais ngauss=1 si aucun pt de gauss */
162 if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NGA,&ngauss,mode)) < 0)
165 /*Lecture de l'attribut MED_NOM_NCO */
166 if ((ret = _MEDattrEntierLire(chid,MED_NOM_NCO,&ncomp)) < 0)
169 /*Determination de la taille dimd[0] du dataset à stocker*/
170 dimd[0] = nbelem*ncomp;
172 /* Gestion des profils*/
175 if ( ( i = MEDnValProfil(fid,pflname) ) < 0 )
180 pfltabtmp = (med_int *) malloc (sizeof(med_int)*(size_t)psize);
181 pfltab = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)psize);
182 if ((ret = MEDprofilLire(fid,pfltabtmp,pflname)) < 0)
184 for (i=0;i<psize;i++)
185 pfltab[i] = (med_ssize) pfltabtmp[i];
195 if ((ret = _MEDattrEntierLire(chid,MED_NOM_TYP,&chtype)) < 0)
200 if ((ret = _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_REEL64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
206 #if defined(HAVE_F77INT64)
207 if ((ret = _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
211 if ((ret = _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT32,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
218 #if defined(HAVE_F77INT64)
219 if ((ret = _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
234 if ( pfluse ) { free(pfltab); free(pfltabtmp);}
236 if ((ret = _MEDdatagroupFermer(datagroup2)) < 0)
238 if ((ret = _MEDdatagroupFermer(datagroup1)) < 0)
240 if ((ret = _MEDdatagroupFermer(chid)) < 0)