Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/med.git] / src / MEDWrapper / V2_1 / Core / MEDchampEcr.cxx
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.
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 #include "med.hxx"
20 #include "med_outils.hxx"
21
22 #include <string.h>
23 #include <stdlib.h>
24
25 /*
26  * - Nom de la fonction : MEDchampEcr
27  * - Description : ecriture d'un Champ Résultat
28  * - Parametres :
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
47  */ 
48
49 namespace med_2_1{
50
51 med_err 
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)
55 {
56   med_err ret;
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;
64   med_int   *pfltabtmp=0;
65   med_ssize *pfltab=0;
66   char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1];
67   
68   /*
69    * On inhibe le gestionnaire d'erreur HDF 5
70    */
71   _MEDmodeErreurVerrouiller();
72
73  
74   /* 
75    * Si le Data Group cha n'existe pas => erreur
76    */
77   strcpy(chemin,MED_CHA);
78   strcat(chemin,cha);
79   if ((chid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
80     return -1;
81
82   /* 
83    *  Creation du datagroup de niveau 1 <type_ent>[.<type_geo>] 
84    */
85   
86   if ((ret = _MEDnomEntite(nomdatagroup1,type_ent)) < 0)
87     return -1;
88   if ((type_ent != MED_NOEUD))
89     {
90       if ((ret = _MEDnomGeometrie(tmp1,type_geo)) < 0)
91         return -1;
92       strcat(nomdatagroup1,".");
93       strcat(nomdatagroup1,tmp1);
94     }
95   datagroup1 = 0;
96   if ( (datagroup1 = _MEDdatagroupOuvrir(chid,nomdatagroup1)) < 0) 
97     if ((datagroup1 = _MEDdatagroupCreer(chid,nomdatagroup1)) < 0)
98       return -1;
99   
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);
103
104   
105   /*Cree ou ouvre (en mode MED_REMP) le datagroup nomdatagroup2 */
106   datagroup2 = 0;   
107   if (((datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) > 0)    
108       && (mode != MED_REMP))   
109     return -1;   
110   else   
111     if (datagroup2 < 0)
112       if ((datagroup2 = _MEDdatagroupCreer(datagroup1,nomdatagroup2)) < 0)   
113         return -1;   
114   
115   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NDT */
116   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NDT,&numdt,mode)) < 0)
117     return -1;
118   
119   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_PDT */
120   if ((ret = _MEDattrFloatEcrire(datagroup2,MED_NOM_PDT,&dt,mode)) < 0)
121     return -1;
122     
123   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NOR */
124   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NOR,&numo,mode)) < 0)
125     return -1;
126   
127   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NBR */
128   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NBR,&nbelem,mode)) < 0)
129     return -1;
130
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)
136     return -1;
137   
138   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_PFL   */ 
139   pfluse = 0;
140   if ( strlen(profil) == 0)   /* idem MED_NOPFL*/
141     strncpy(pflname,MED_NOPFLi,MED_TAILLE_NOM+1);
142   else {
143     strncpy(pflname,profil,MED_TAILLE_NOM);
144     pflname[MED_TAILLE_NOM]='\0';
145     pfluse = 1;
146   }
147   if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_PFL,MED_TAILLE_NOM,pflname,mode)) < 0)
148     return -1; 
149
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,"        ",mode)) < 0)
153       return -1;
154   } else
155     if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit,mode)) < 0)
156       return -1;
157   
158
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)
163     return -1;
164
165   /*Lecture de l'attribut MED_NOM_NCO */
166   if ((ret = _MEDattrEntierLire(chid,MED_NOM_NCO,&ncomp)) < 0)
167     return -1;
168  
169   /*Determination de la taille dimd[0] du dataset à stocker*/
170   dimd[0] = nbelem*ncomp;
171
172   /* Gestion des profils*/
173   if ( pfluse ) {
174    
175     if ( ( i = MEDnValProfil(fid,pflname) ) < 0 )
176       return -1;
177     else
178       psize = i;
179     
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)
183       return -1;
184     for (i=0;i<psize;i++)
185       pfltab[i] = (med_ssize) pfltabtmp[i];
186     
187   }
188   else
189     psize = MED_NOPF;
190   
191   
192   /*
193    * Ecriture du champ
194    */
195   if ((ret = _MEDattrEntierLire(chid,MED_NOM_TYP,&chtype)) < 0)
196     return -1;
197   switch(chtype)
198     {
199     case MED_REEL64 :
200       if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_REEL64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
201                                        mode)) < 0)
202         return -1;
203       break;
204
205     case MED_INT32 :
206 #if defined(HAVE_F77INT64)
207      if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
208                                        mode)) < 0)
209         return -1;
210 #else
211       if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT32,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
212                                        mode)) < 0)
213         return -1;
214 #endif
215       break;
216
217     case MED_INT64 :
218 #if defined(HAVE_F77INT64)
219      if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
220                                        mode)) < 0)
221         return -1;
222 #else
223      return -1;
224 #endif
225      break;   
226
227     default :
228       return -1;
229     }
230
231   /*
232    * On ferme tout 
233    */
234   if ( pfluse ) { free(pfltab); free(pfltabtmp);}
235
236   if ((ret = _MEDdatagroupFermer(datagroup2)) < 0)
237     return -1;
238   if ((ret = _MEDdatagroupFermer(datagroup1)) < 0)
239     return -1;
240   if ((ret = _MEDdatagroupFermer(chid)) < 0)
241     return -1;
242   
243   return 0; 
244 }
245
246 }