1 /*  This file is part of MED.
2  *
3  *  COPYRIGHT (C) 1999 - 2019  EDF R&D, CEA/DEN
4  *  MED is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  MED is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 
19 #include <med.h>
20 #include <med_config.h>
21 #include <med_outils.h>
22 #include <hdf5.h>
23 #include <string.h>
24 
25 /**\ingroup MEDinterp
26   \brief \MEDinterpInfoByNameBrief
27   \param fid           \fid
28   \param interpname    \interpname
29   \param geotype       \geotype
30   \param cellnode      \cellnode
31   \param nbasisfunc \nbasisfunc
32   \param nvariable  \nvariable
33   \param maxdegree     \maxdegree
34   \param nmaxcoef      \nmaxcoef
35 
36   \return \error
37   \details \MEDinterpInfoByNameDetails
38   \see     MEDinterpInfo
39  */
40 med_err
MEDinterpInfoByName(const med_idt fid,const char * const interpname,med_geometry_type * const geotype,med_bool * const cellnode,med_int * const nbasisfunc,med_int * const nvariable,med_int * const maxdegree,med_int * const nmaxcoef)41 MEDinterpInfoByName(const med_idt                   fid,
42 		    const char*               const interpname,
43 		           med_geometry_type* const geotype,
44 		           med_bool*          const cellnode,
45 		           med_int*           const nbasisfunc,
46 		           med_int*           const nvariable,
47 		           med_int*           const maxdegree,
48 		           med_int*           const nmaxcoef
49 	    )
50 {
51   med_idt           _interpid=0;
52   med_int           _err=-1;
53   med_err           _ret=-1;
54   char              _path[MED_INTERPOLATION_GRP_SIZE+MED_NAME_SIZE+1]=MED_INTERPOLATION_GRP;
55   med_int           _cellnode = 0;
56   med_size          _tmpn=0;
57   med_int           _medintgeotype=MED_UNDEF_GEOTYPE;
58 
59   /*
60    * On inhibe le gestionnaire d'erreur
61    */
62   _MEDmodeErreurVerrouiller();
63 
64 
65   NOFINALBLANK(interpname,ERROR);
66   strcat(_path,interpname);
67   /*
68    * Ouverture du  DataGroup /INTERP/<interpname>
69    */
70   if ((_interpid = _MEDdatagroupOpen(fid,_path)) < 0) {
71     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,interpname);
72     SSCRUTE(_path);goto ERROR;
73   }
74 
75   /*
76    * Lecture de l'attribut MED_NOM_GEO
77    */
78   if ( _MEDattrEntierLire(_interpid,MED_NOM_GEO,&_medintgeotype) < 0 ) {
79     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
80     SSCRUTE(MED_NOM_GEO);ISCRUTE(_medintgeotype);
81     goto ERROR;
82   }
83   *geotype=(med_geometry_type) _medintgeotype;
84 
85   /*
86    * Lecture de l'attribut MED_NOM_NBV
87    */
88   if ( _MEDattrEntierLire(_interpid,MED_NOM_NBV,nvariable) < 0 ) {
89     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
90     SSCRUTE(MED_NOM_NBV);ISCRUTE(*nvariable);
91     goto ERROR;
92   }
93 
94   /*
95    * Lecture de l'attribut MED_NOM_MDG
96    */
97   if ( _MEDattrEntierLire(_interpid,MED_NOM_MDG,maxdegree) < 0 ) {
98     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
99     SSCRUTE(MED_NOM_MDG);ISCRUTE(*maxdegree);
100     goto ERROR;
101   }
102 
103   /*
104    * Lecture de l'attribut MED_NOM_MCF
105    */
106   if ( _MEDattrEntierLire(_interpid,MED_NOM_MCF,nmaxcoef) < 0 ) {
107     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
108     SSCRUTE(MED_NOM_MCF);ISCRUTE(*nmaxcoef);
109     goto ERROR;
110   }
111 
112   /*
113    * Lecture de l'attribut MED_NOM_FCN
114    */
115   if ( _MEDattrEntierLire(_interpid,MED_NOM_FCN,&_cellnode) < 0 ) {
116     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path);
117     SSCRUTE(MED_NOM_FCN);ISCRUTE(_cellnode);
118     goto ERROR;
119   }
120   if (_cellnode) *cellnode=MED_TRUE; else *cellnode=MED_FALSE;
121 
122   /*
123    * Lecture de l'attribut MED_NOM_NBB
124    */
125 /*   if ( _MEDattrEntierLire(_interpid,MED_NOM_NBB,nbasisfunc) < 0 ) { */
126 /*     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_path); */
127 /*     SSCRUTE(MED_NOM_NBB);ISCRUTE(*nbasisfunc); */
128 /*     goto ERROR; */
129 /*   } */
130 
131   /*
132    *  Lecture du nombre de fonctions de base
133    */
134   if ((_err=_MEDnObjects(fid,_path,&_tmpn)) <0)
135     if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
136       MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_INTERP,_path);
137       goto ERROR;
138     }
139   *nbasisfunc = (med_int) _tmpn;
140 
141   _ret = 0;
142 
143  ERROR:
144 
145   if (_interpid>0)     if (_MEDdatagroupFermer(_interpid) < 0) {
146     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_path);
147     ISCRUTE_id(_interpid);
148   }
149   return _ret;
150 
151 }
152