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 <string.h>
23 #include <stdlib.h>
24 
25 /**\ingroup MEDparameter
26   \brief \MEDparameterValueWrBrief
27   \param fid \fid
28   \param paramname \paramname
29   \param numdt \numdt
30   \param numit \numit
31   \param dt \dt
32   \param value \value
33   \retval med_err  \error
34   \details \MEDparameterValueWrDetails
35  */
36 
37 
38 med_err
MEDparameterValueWr(const med_idt fid,const char * const paramname,const med_int numdt,const med_int numit,const med_float dt,const unsigned char * const value)39 MEDparameterValueWr(const med_idt              fid,
40 		    const char*  const         paramname,
41 		    const med_int              numdt,
42 		    const med_int              numit,
43 		    const med_float            dt,
44 		    const unsigned char* const value)
45 {
46   med_err _ret = -1;
47   med_idt _paramidt = 0;
48   med_idt _cpstidt = 0;
49   char _parampath [MED_NUMERICAL_DATA_GRP_SIZE+MED_NAME_SIZE+1] = "";
50   char _cpstpath[MED_MESH_SUPPORT_GRP_SIZE+MED_NAME_SIZE+1+2*MED_MAX_PARA+1+1]="";
51   char _cpstname [2*MED_MAX_PARA+1]="";
52   med_access_mode       _MED_ACCESS_MODE;
53   med_int _intparamtype = 0;
54   med_parameter_type _paramtype;
55 
56   _MEDmodeErreurVerrouiller();
57  if (_MEDcheckVersion30(fid) < 0) goto ERROR;
58 
59   /* Verification du mode d'acces aux donn�es */
60   if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
61     MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
62     goto ERROR;
63   }
64   if ( _MED_ACCESS_MODE == MED_ACC_RDONLY) {
65     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
66     ISCRUTE_int(_MED_ACCESS_MODE);
67     goto ERROR;
68   }
69 
70   /* Si le group HDF correspondant au parametre n'existe pas => erreur
71      Sinon on l'ouvre */
72   NOFINALBLANK(paramname,ERROR);
73   strcpy(_parampath, MED_NUMERICAL_DATA_GRP);
74   strcat(_parampath, paramname);
75   if ((_paramidt = _MEDdatagroupOuvrir(fid,_parampath)) < 0) {
76     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_PARAM_MSG);
77     SSCRUTE(paramname);SSCRUTE(_parampath); goto ERROR;
78   }
79 
80   /* On construit le nom du datagroup du pas de temps */
81   _MEDgetComputationStepName(MED_SORT_DTIT,numdt,numit,_cpstname);
82   strcpy( _cpstpath, _parampath);
83   strcat( _cpstpath, "/");
84   strcat( _cpstpath, _cpstname);
85 
86   /* Si l'etape de calcul n'existe pas, on la cr�e */
87   if ((_cpstidt = _MEDdatagroupOuvrir(_paramidt, _cpstname)) < 0 )
88     if ((_cpstidt = _MEDdatagroupCreer(_paramidt,_cpstname)) < 0 ) {
89       MED_ERR_(_ret, MED_ERR_EXIST, MED_ERR_COMPUTINGSTEP, _cpstname);
90       SSCRUTE(paramname);goto ERROR;
91     }
92 
93   /* ecriture de l'attribut MED_NOM_NDT pour �criture */
94   if ( _MEDattributeIntWr(_cpstidt,MED_NOM_NDT,&numdt) < 0) {
95     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_PARAM_MSG);
96     SSCRUTE(paramname);SSCRUTE(_cpstname);SSCRUTE(MED_NOM_NDT);
97     ISCRUTE(numdt);goto ERROR;
98   }
99   /* ecriture de l'attribut MED_NOM_PDT */
100   if ( _MEDattrFloatEcrire(_cpstidt,MED_NOM_PDT,&dt) < 0) {
101     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_PARAM_MSG);
102     SSCRUTE(paramname);SSCRUTE(_cpstname);SSCRUTE(MED_NOM_PDT);
103     RSCRUTE(dt);goto ERROR;
104   }
105   /* ecriture de l'attribut MED_NOM_NOR  */
106   if ( _MEDattributeIntWr(_cpstidt,MED_NOM_NOR,&numit) < 0) {
107     MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_PARAM_MSG);
108     SSCRUTE(paramname);SSCRUTE(_cpstname);SSCRUTE(MED_NOM_NOR);
109     ISCRUTE(numit); goto ERROR;
110   }
111 
112   /* on ecrit la valeur du parametre */
113   if ( _MEDattrEntierLire(_paramidt,MED_NOM_TYP,&_intparamtype) < 0) {
114     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_PARAM_MSG);
115     SSCRUTE(paramname);SSCRUTE(MED_NOM_TYP);
116     goto ERROR;
117   }
118   _paramtype = (med_field_type) (_intparamtype);
119   if (_paramtype == MED_FLOAT64)
120     if (_MEDattrFloatEcrire(_cpstidt, MED_NOM_VAL, value) < 0) {
121       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_PARAM_MSG);
122       SSCRUTE(paramname);SSCRUTE(MED_NOM_VAL);
123     }
124   if (_paramtype != MED_FLOAT64)
125     if (_MEDattributeIntWr(_cpstidt, MED_NOM_VAL, value) < 0) {
126       MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_PARAM_MSG);
127       SSCRUTE(paramname);SSCRUTE(MED_NOM_VAL);
128     }
129 
130   _ret = 0;
131  ERROR:
132 
133   /* on ferme tout */
134 
135   if (_cpstidt > 0)
136     if (_MEDdatagroupFermer(_cpstidt) < 0) {
137       MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_cpstname);
138       ISCRUTE_id(_cpstidt);
139   }
140 
141   if (_paramidt > 0)
142     if (_MEDdatagroupFermer(_paramidt) < 0) {
143       MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_parampath);
144       ISCRUTE_id(_paramidt);
145     }
146 
147   return _ret;
148 }
149