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