Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/med.git] / src / MEDWrapper / V2_1 / Core / MEDconnLire.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 extern int mode_interlace; 
26
27 namespace med_2_1{
28
29 med_err 
30 MEDconnLire(med_idt fid,char *maa,med_int mdim,med_int *connectivite,med_mode_switch mode_switch,
31             med_int * pfltabtmp, med_size psizetmp,
32             med_entite_maillage type_ent, med_geometrie_element type_geo,med_connectivite type_conn)
33 {
34   med_idt maaid,entid,geoid;
35   med_err ret;
36   char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1];
37   char nom_ent[MED_TAILLE_NOM_ENTITE+1];
38   char nom_geo[MED_TAILLE_NOM_ENTITE+1];
39   char nom_dataset[MED_TAILLE_NOM_ENTITE+1];
40   med_ssize * pfltab = NULL;
41   med_size    psize;
42   int dim,nnoe,ndes;
43   int nsup = 0;
44   int taille;  
45   int i;
46   
47   /*
48    * On inhibe le gestionnaire d'erreur HDF 5
49    */
50   _MEDmodeErreurVerrouiller();
51   
52   /*
53    * Si le maillage n'existe pas => erreur
54    */
55   strcpy(chemin,MED_MAA);
56   strcat(chemin,maa);
57   if ((maaid = _MEDdatagroupOuvrir(fid,chemin)) < 0)
58     return -1;
59
60   /*
61    * On met a jour le nom du Data Group representant
62    * le type des entites
63    */
64    if ((ret = _MEDnomEntite(nom_ent,type_ent)) < 0)
65      return -1;
66    /*
67     * Si le Data Group des entites n'existe pas => erreur
68     */
69    if ((entid = _MEDdatagroupOuvrir(maaid,nom_ent)) < 0)
70      return -1;
71
72    /*
73     * si le Data Group du type geometrique n'existe pas => erreur
74     */
75    if ((ret = _MEDnomGeometrie(nom_geo,type_geo)) < 0)
76      return -1;
77    if ((geoid = _MEDdatagroupOuvrir(entid,nom_geo)) < 0)
78      return -1;
79
80    /*
81     * Si le Data Set de la connectivite n'existe pas => erreur
82     * Si oui => on le lit
83     */
84    if ((ret=_MEDparametresGeometrie(type_ent,type_geo,&dim,&nnoe,&ndes))<0)
85      return -1;
86    if (mdim == 2 || mdim == 3)
87      if (type_ent == MED_MAILLE && dim == 1)
88        nsup = 1;
89    if (mdim == 3)
90      if (type_ent == MED_MAILLE && dim == 2)
91        nsup = 1;
92
93
94    psize = psizetmp;
95    switch(type_conn)
96      {
97      case MED_NOD :
98        strcpy(nom_dataset,MED_NOM_NOD);
99        taille = nsup + nnoe;
100        break;
101
102      case MED_DESC :
103        strcpy(nom_dataset,MED_NOM_DES);
104        taille = nsup + ndes;
105        if ( psizetmp != MED_NOPF ) {  
106          psize = psizetmp;
107          pfltab = (med_ssize *) malloc (sizeof(med_ssize)*(size_t)psize);
108          for (i=0;i<psizetmp;i++)
109            pfltab[i] = (med_ssize) (pfltabtmp[i]);
110        };
111        
112        break;
113        
114      default :
115        return -1;
116      }
117
118
119 #if defined(HAVE_F77INT64)
120    if ((ret = _MEDdatasetNumLire(geoid,nom_dataset,MED_INT64,
121                                  mode_switch,(med_size)taille,MED_ALL,
122                                  psize,pfltab,MED_NOPG,
123                                  (unsigned char*) connectivite)) < 0)
124      return -1;
125 #else
126    if ((ret = _MEDdatasetNumLire(geoid,nom_dataset,MED_INT32,
127                                  mode_switch,(med_size) taille,MED_ALL,
128                                  psize,pfltab,MED_NOPG,
129                                  (unsigned char*) connectivite)) < 0)
130      return -1;
131 #endif 
132
133    /*
134     * On ferme tout 
135     */
136
137    if ( (psize != MED_NOPF) && (type_conn == MED_DESC) ) free(pfltab);
138   
139    if ((ret = _MEDdatagroupFermer(geoid)) < 0)
140      return -1;
141    if ((ret = _MEDdatagroupFermer(entid)) < 0)
142      return -1;
143    if ((ret = _MEDdatagroupFermer(maaid)) < 0)
144      return -1;
145
146    return 0; 
147 }
148
149 }