Back to index

salome-med  6.5.0
MEDchampEcr.cxx
Go to the documentation of this file.
00001 /*************************************************************************
00002 * COPYRIGHT (C) 1999 - 2002  EDF R&D
00003 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
00004 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
00005 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
00006 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
00007 *  
00008 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
00009 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
00010 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
00011 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
00012 *
00013 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
00014 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
00015 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
00016 *
00017 *************************************************************************/
00018 
00019 #include "med.hxx"
00020 #include "med_outils.hxx"
00021 
00022 #include <string.h>
00023 #include <stdlib.h>
00024 
00025 /*
00026  * - Nom de la fonction : MEDchampEcr
00027  * - Description : ecriture d'un Champ Résultat
00028  * - Parametres :
00029  *     - fid      (IN)  : ID du fichier HDF courant
00030  *     - maa      (IN)  : le nom du maillage sur lequel s'applique le champ 
00031  *     - cha      (IN)  : le nom du champ 
00032  *     - val      (IN)  : valeurs du champ à stocker
00033  *     - interlace(IN)  : entrelacement utilisé en mémoire {MED_FULL_INTERLACE,MED_NO_INTERLACE} 
00034  *     - nbelem   (IN)  : nombre d'éléments (prend en compte le nbre 
00035  *                         de points de Gauss (c'est demandé à l'utilisateur ds la doc) mais pas le nbre de composantes)
00036  *     - ngauss   (IN)  : nbre de point de gauss utilisé (MED_NOPG si aucun)
00037  *     - numco    (IN)  : n° de la composante à stocker (MED_ALL si toutes)
00038  *     - profil   (IN)  : nom du profil utilisé (MED_NOPFL si inutilisé)
00039  *     - mode     (IN)       : mode d'ecriture MED (MED_ECRI | MED_REMP)
00040  *     - type_ent (IN)  : entité concerné par le champ {MED_NOEUD,MED_ARETE,MED_FACE,MED_MAILLE}
00041  *     - type_geo (IN)  : type géométrique de l'entité concerné {MED_POINT,MED_SEG2 ......}
00042  *     - numdt    (IN)  : n° du pas de temps (MED_NOPDT si aucun)
00043  *     - dt_unit  (IN)  : chaine de taille MED_NOMP indiquant l'unité du champ
00044  *     - dt       (IN)  : valeur du pas de temps 
00045  *     - numo     (IN)  : n° d'ordre utilisé MED_NONOR si inutile
00046  * - Resultat : 0 en cas de succes, -1 sinon
00047  */ 
00048 
00049 namespace med_2_1{
00050 
00051 med_err 
00052 MEDchampEcr(med_idt fid, char *maa, char *cha,unsigned char *val,med_mode_switch interlace,med_int nbelem,med_int ngauss, 
00053             med_int numco, char * profil, med_mode_acces mode, med_entite_maillage type_ent, 
00054             med_geometrie_element type_geo, med_int numdt,char * dt_unit, med_float dt, med_int numo)
00055 {
00056   med_err ret;
00057   med_idt chid,datagroup1,datagroup2;
00058   med_int ncomp, chtype, i, locnumdt,pfluse;
00059   char pflname [MED_TAILLE_NOM+1];
00060   char maillage[MED_TAILLE_NOM+1];
00061   char nomdatagroup1[2*MED_TAILLE_NOM_ENTITE+2],nomdatagroup2[2*MED_MAX_PARA+1];
00062   char tmp1[MED_TAILLE_NOM_ENTITE+1];
00063   med_size dimd[1],psize;
00064   med_int   *pfltabtmp=0;
00065   med_ssize *pfltab=0;
00066   char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1];
00067   
00068   /*
00069    * On inhibe le gestionnaire d'erreur HDF 5
00070    */
00071   _MEDmodeErreurVerrouiller();
00072 
00073  
00074   /* 
00075    * Si le Data Group cha n'existe pas => erreur
00076    */
00077   strcpy(chemin,MED_CHA);
00078   strcat(chemin,cha);
00079   if ((chid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
00080     return -1;
00081 
00082   /* 
00083    *  Creation du datagroup de niveau 1 <type_ent>[.<type_geo>] 
00084    */
00085   
00086   if ((ret = _MEDnomEntite(nomdatagroup1,type_ent)) < 0)
00087     return -1;
00088   if ((type_ent != MED_NOEUD))
00089     {
00090       if ((ret = _MEDnomGeometrie(tmp1,type_geo)) < 0)
00091         return -1;
00092       strcat(nomdatagroup1,".");
00093       strcat(nomdatagroup1,tmp1);
00094     }
00095   datagroup1 = 0;
00096   if ( (datagroup1 = _MEDdatagroupOuvrir(chid,nomdatagroup1)) < 0) 
00097     if ((datagroup1 = _MEDdatagroupCreer(chid,nomdatagroup1)) < 0)
00098       return -1;
00099   
00100   /* Creation du datagroup de niveau 2 <numdt>.<numoo> */
00101   if ( numdt == MED_NOPDT) locnumdt = MED_NOPDT; else locnumdt = numdt;
00102   sprintf(nomdatagroup2,"%*li%*li",MED_MAX_PARA,(long ) locnumdt,MED_MAX_PARA,(long ) numo);
00103 
00104   
00105   /*Cree ou ouvre (en mode MED_REMP) le datagroup nomdatagroup2 */
00106   datagroup2 = 0;   
00107   if (((datagroup2 = _MEDdatagroupOuvrir(datagroup1,nomdatagroup2)) > 0)    
00108       && (mode != MED_REMP))   
00109     return -1;   
00110   else   
00111     if (datagroup2 < 0)
00112       if ((datagroup2 = _MEDdatagroupCreer(datagroup1,nomdatagroup2)) < 0)   
00113         return -1;   
00114   
00115   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NDT */
00116   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NDT,&numdt,mode)) < 0)
00117     return -1;
00118   
00119   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_PDT */
00120   if ((ret = _MEDattrFloatEcrire(datagroup2,MED_NOM_PDT,&dt,mode)) < 0)
00121     return -1;
00122     
00123   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NOR */
00124   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NOR,&numo,mode)) < 0)
00125     return -1;
00126   
00127   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NBR */
00128   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NBR,&nbelem,mode)) < 0)
00129     return -1;
00130 
00131   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_MAA   */
00132   /* rem : Aucune verification de l'existence du maillage */
00133   strncpy(maillage,maa,MED_TAILLE_NOM);
00134   maillage[MED_TAILLE_NOM]='\0';
00135   if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_MAI,MED_TAILLE_NOM,maillage,mode)) < 0)
00136     return -1;
00137   
00138   /*Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_PFL   */ 
00139   pfluse = 0;
00140   if ( strlen(profil) == 0)   /* idem MED_NOPFL*/
00141     strncpy(pflname,MED_NOPFLi,MED_TAILLE_NOM+1);
00142   else {
00143     strncpy(pflname,profil,MED_TAILLE_NOM);
00144     pflname[MED_TAILLE_NOM]='\0';
00145     pfluse = 1;
00146   }
00147   if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_PFL,MED_TAILLE_NOM,pflname,mode)) < 0)
00148     return -1; 
00149 
00150   /*Cree ou ouvre (en mode MED_REMP) l'attribut  MED_NOM_UNI */ 
00151   if ( strlen(dt_unit) == 0) {
00152     if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,(char*)"        ",mode)) < 0)
00153       return -1;
00154   } else
00155     if ((ret = _MEDattrStringEcrire(datagroup2,MED_NOM_UNI,MED_TAILLE_PNOM,dt_unit,mode)) < 0)
00156       return -1;
00157   
00158 
00159   /* Cree ou ouvre (en mode MED_REMP) l'attribut MED_NOM_NGAU             */ 
00160   /* Ecriture du nombre de pts de gauss propre au <type_ent>[.<type_geo>] */
00161   /* On n'utilise pas ngauss=MED_NOPG mais ngauss=1 si aucun pt de gauss  */
00162   if ((ret = _MEDattrEntierEcrire(datagroup2,MED_NOM_NGA,&ngauss,mode)) < 0)
00163     return -1;
00164 
00165   /*Lecture de l'attribut MED_NOM_NCO */
00166   if ((ret = _MEDattrEntierLire(chid,MED_NOM_NCO,&ncomp)) < 0)
00167     return -1;
00168  
00169   /*Determination de la taille dimd[0] du dataset à stocker*/
00170   dimd[0] = nbelem*ncomp;
00171 
00172   /* Gestion des profils*/
00173   if ( pfluse ) {
00174    
00175     if ( ( i = MEDnValProfil(fid,pflname) ) < 0 )
00176       return -1;
00177     else
00178       psize = i;
00179     
00180     pfltabtmp = (med_int *)   malloc (sizeof(med_int)*(size_t)psize);
00181     pfltab    = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)psize);
00182     if ((ret = MEDprofilLire(fid,pfltabtmp,pflname)) < 0)
00183       return -1;
00184     for (i=0;i<psize;i++)
00185       pfltab[i] = (med_ssize) pfltabtmp[i];
00186     
00187   }
00188   else
00189     psize = MED_NOPF;
00190   
00191   
00192   /*
00193    * Ecriture du champ
00194    */
00195   if ((ret = _MEDattrEntierLire(chid,MED_NOM_TYP,&chtype)) < 0)
00196     return -1;
00197   switch(chtype)
00198     {
00199     case MED_REEL64 :
00200       if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_REEL64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
00201                                        mode)) < 0)
00202         return -1;
00203       break;
00204 
00205     case MED_INT32 :
00206 #if defined(HAVE_F77INT64)
00207      if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
00208                                        mode)) < 0)
00209         return -1;
00210 #else
00211       if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT32,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
00212                                        mode)) < 0)
00213         return -1;
00214 #endif
00215       break;
00216 
00217     case MED_INT64 :
00218 #if defined(HAVE_F77INT64)
00219      if ((ret =  _MEDdatasetNumEcrire(datagroup2,MED_NOM_CO,MED_INT64,interlace,ncomp,numco,psize,pfltab,ngauss,dimd,val,
00220                                        mode)) < 0)
00221         return -1;
00222 #else
00223      return -1;
00224 #endif
00225      break;   
00226 
00227     default :
00228       return -1;
00229     }
00230 
00231   /*
00232    * On ferme tout 
00233    */
00234   if ( pfluse ) { free(pfltab); free(pfltabtmp);}
00235 
00236   if ((ret = _MEDdatagroupFermer(datagroup2)) < 0)
00237     return -1;
00238   if ((ret = _MEDdatagroupFermer(datagroup1)) < 0)
00239     return -1;
00240   if ((ret = _MEDdatagroupFermer(chid)) < 0)
00241     return -1;
00242   
00243   return 0; 
00244 }
00245 
00246 }