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_config.h"
20 #include "med_outils.h"
21 #include <string.h>
22
23 #include "MAJ_236_300.h"
24 #include "MAJ_version.h"
25
MAJ_236_300_fieldOnEntity(med_idt fid,const char * const nomcha,const char * const meshname,med_field_type typcha,med_int ncomp,med_entity_type entite,med_int ncstp,char * const _pathi,char * const _pathf)26 med_err MAJ_236_300_fieldOnEntity(med_idt fid, const char * const nomcha, const char * const meshname,
27 med_field_type typcha, med_int ncomp, med_entity_type entite, med_int ncstp,
28 char * const _pathi, char * const _pathf) {
29
30 med_err ret=-1;
31 int i,j,k,l,m,n,nb_geo=0;
32 med_int nbpdtnor=0,pflsize,*pflval,ngauss=0,ngroup,*vale=NULL,nval;
33 med_int numdt=0,numo=0,_nprofile;
34 med_int meshnumdt=0,meshnumit=0;
35 med_float *valr=NULL,dt=0.0;
36 unsigned char * _val=NULL;
37 char pflname [MED_NAME_SIZE+1]="";
38 char locname [MED_NAME_SIZE+1]="";
39 char _meshname [MED_NAME_SIZE+1]="";
40 char _fieldname [MED_NAME_SIZE+1]="";
41 char _pathtmp[MED_FIELD_GRP_SIZE+3]="/CHA__/";
42 char _pathfb[MED_FIELD_GRP_SIZE+2+MED_NAME_SIZE+1]="/CHA_/";
43 char * lien = NULL;
44 char dt_unit [MED_SNAME_SIZE+1]="unknown";
45 med_bool localmesh;
46 med_int nmesh=0;
47 hid_t _ocp_plist_id ;
48 hid_t _lcp_plist_id ;
49 int _isavlen=0;
50 int _fsavlen=0;
51 int _fieldnamelen=0;
52 htri_t _groupexist;
53
54 char _tmpmeshname[MED_NAME_SIZE+1]="";
55 med_bool _tmplocal=MED_FALSE;
56 med_field_type _tmptypcha;
57 char *_tmpcomp=NULL,*_tmpunit=NULL,_tmpdtunit[MED_SNAME_SIZE+1]="";
58 med_int _tmpncstp=0;
59
60 med_geometry_type * type_geo;
61
62 const char * const * AFF;
63 const char * const * AFF_ENT=MED_GET_ENTITY_TYPENAME+1;
64 switch (entite) {
65 case MED_NODE :
66 type_geo = MED_GET_NODE_GEOMETRY_TYPE;
67 nb_geo = MED_N_NODE_FIXED_GEO;
68 AFF = MED_GET_NODE_GEOMETRY_TYPENAME;
69 break;
70 case MED_CELL :
71 case MED_NODE_ELEMENT :
72 type_geo = MED_GET_CELL_GEOMETRY_TYPE;
73 nb_geo = MED_N_CELL_FIXED_GEO;
74 AFF = MED_GET_CELL_GEOMETRY_TYPENAME;
75 break;
76 case MED_DESCENDING_FACE :
77 type_geo = MED_GET_FACE_GEOMETRY_TYPE;
78 nb_geo = MED_N_FACE_FIXED_GEO;
79 AFF = MED_GET_FACE_GEOMETRY_TYPENAME;
80 break;
81 case MED_DESCENDING_EDGE :
82 type_geo = MED_GET_EDGE_GEOMETRY_TYPE;
83 nb_geo = MED_N_EDGE_FIXED_GEO;
84 AFF = MED_GET_EDGE_GEOMETRY_TYPENAME;
85 break;
86 }
87
88 strcpy(_fieldname,nomcha);
89 _isavlen=strlen(_pathi);
90 _fsavlen=strlen(_pathf);
91 _fieldnamelen=strlen(_fieldname);
92
93 _ocp_plist_id = H5Pcreate( H5P_OBJECT_COPY );
94 _lcp_plist_id = H5Pcreate( H5P_LINK_CREATE );
95
96 /* Reconstruit les objets pointés par un lien symbolique */
97 H5Pset_copy_object( _ocp_plist_id, H5O_COPY_EXPAND_SOFT_LINK_FLAG );
98 /*Ne crée pas les liens intermédiaires */
99 H5Pset_create_intermediate_group(_lcp_plist_id, -1);
100 /* Ne recopie pas en profondeur*/
101 H5Pset_copy_object( _ocp_plist_id, H5O_COPY_SHALLOW_HIERARCHY_FLAG);
102
103 /* ISCRUTE(nbpdtnor); */
104 /* SSCRUTE(_fieldname); */
105
106 for (k=1;k<=nb_geo;k++) {
107
108 /* Combien de (PDT,NOR) a lire */
109 nbpdtnor = ncstp;
110 if (nbpdtnor < 1 ) continue;
111
112 for (j=0;j<nbpdtnor;j++) {
113
114 if ( MEDfield23ComputingStepMeshInfo(fid,nomcha,j+1, &numdt, &numo, &dt,
115 &nmesh, _meshname,&localmesh, &meshnumdt, &meshnumit ) <0) {
116 MESSAGE("Erreur a la demande d'information sur (pdt,nor) : ");
117 ISCRUTE(numdt); ISCRUTE(numo);ISCRUTE(nmesh);SSCRUTE(_meshname);ISCRUTE_int(localmesh);
118 ISCRUTE(meshnumdt);ISCRUTE(meshnumit);
119 ret = -1; continue;
120 }
121 /* SSCRUTE(_meshname);SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);ISCRUTE(nmesh); */
122 for (i=0;i< nmesh;++i) {
123
124 if ( (_nprofile = MEDfield23nProfile(fid,nomcha,numdt,numo,entite,type_geo[k],i+1,_meshname,
125 pflname,locname ) ) < 0 ) {
126 MESSAGE("Erreur a la demande du nombre de profils referencés par le champ : ");
127 SSCRUTE(nomcha); ISCRUTE(numdt); ISCRUTE(numo);SSCRUTE(_meshname);
128 ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);SSCRUTE(pflname);SSCRUTE(locname);
129 SSCRUTE(AFF_ENT[(int)entite]);SSCRUTE(AFF[k]);
130 ret = -1; continue;
131 };
132
133 /* ISCRUTE(_nprofile); */
134 /* SSCRUTE(_meshname); */
135 /* SSCRUTE(meshname); */
136 /* SSCRUTE(pflname); */
137
138 for (l=0;l<_nprofile;l++) {
139
140 /* Si le maillage traité dans ce profil n'est pas celui par défaut :
141 - Vérifie que le nom du champ pour ce maillage secondaire existe.
142 - Initialise _fieldname au nom du champ qu'il faut traiter par la suite
143 */
144 if (strcmp(_meshname,meshname)) {
145
146 /* Lecture du type du champ, des noms des composantes et du nom de l'unité*/
147 _tmpcomp = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
148 EXIT_IF(_tmpcomp == NULL,NULL,NULL);
149 _tmpunit = (char*) malloc(ncomp*MED_SNAME_SIZE+1);
150 EXIT_IF(_tmpunit == NULL,NULL,NULL);
151
152 /* Evite de passer les paramètres _tmpcomp,_tmpunit,_tmpdtunit,&_tmpncstp dans la fct MAJ_236...*/
153 ret = MEDfieldInfoByName(fid,nomcha,
154 _tmpmeshname,&_tmplocal,&_tmptypcha,_tmpcomp,_tmpunit,_tmpdtunit,&_tmpncstp);
155 MED_ERR_EXIT_IF(ret,MED_ERR_ACCESS,MED_ERR_FIELD,nomcha);
156 /*Ne pose pas de problème de taille de chaîne car MED_NAME_SIZE a doublé en 3.0 */
157 _fieldname[_fieldnamelen]='_';strcpy(&_fieldname[_fieldnamelen+1],_meshname);
158
159 MAJ_version_num(fid,3,0,8);
160 /*Sauvegarde du champ initial dans _pathtmp*/
161 EXIT_IF( H5Gmove(fid, _pathi, _pathtmp ) < 0,"Switch to ",_pathtmp);
162 EXIT_IF( H5Gmove(fid, _pathf, _pathi ) < 0 ,"Switch to ",_pathi);
163 MED_ERR_EXIT_IF( MEDfieldCr(fid,_fieldname,
164 _tmptypcha,ncomp,_tmpcomp,_tmpunit,_tmpdtunit,_meshname ) < 0,
165 MED_ERR_CREATE,MED_ERR_FIELD,_fieldname);
166
167 /*Rétablissement des chemins d'accès au champ initial et au champ cible temporaire*/
168 EXIT_IF( H5Gmove(fid, _pathi , _pathf ) < 0,"Switch to ",_pathf);
169 EXIT_IF( H5Gmove(fid, _pathtmp, _pathi ) < 0,"Switch to ",_pathi);
170
171 MAJ_version_num(fid,2,3,6);
172
173 free(_tmpcomp);
174 free(_tmpunit);
175 } else {
176 strcpy(_fieldname,nomcha);
177 }
178 /* SSCRUTE(_fieldname); */
179
180 if ( (nval = MEDfield23nValueWithProfile(fid, nomcha, numdt, numo, entite, type_geo[k],_meshname,
181 l+1, MED_COMPACT_PFLMODE, pflname,&pflsize,
182 locname, &ngauss) ) < 0 ) {
183 MESSAGE("Erreur a la lecture du nombre de valeurs du champ : ");
184 SSCRUTE(nomcha);ISCRUTE(numdt);ISCRUTE(numo);SSCRUTE(_meshname);
185 ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
186 ret = -1; continue;
187 };
188 /* ISCRUTE(nval); */
189
190 /* printf("\n +Pas de Temps n."IFORMAT" (%f) [%s], n. d'ordre "IFORMAT", avec "IFORMAT" valeur(s) par entité.\n",numdt,dt,dt_unit,numo,ngauss); */
191 /* printf("\t- Il y a "IFORMAT" entités qui portent des valeurs en mode %i. Chaque entite %s\ */
192 /* de type geometrique %s associes au profile |%s| a "IFORMAT" valeurs associées \n", */
193 /* nval,MED_COMPACT_PFLMODE,AFF_ENT[(int)entite],AFF[k],pflname,ngauss); */
194 /* printf("\t- Le maillage associé est |%s|\n",_meshname); */
195
196 /*Lecture des valeurs du champ */
197 if (typcha == MED_FLOAT64) {
198
199 valr = (med_float*) calloc(ncomp*nval*ngauss,sizeof(med_float));
200 EXIT_IF(valr == NULL,NULL,NULL);
201
202 if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],_meshname,
203 MED_COMPACT_PFLMODE, pflname, MED_NO_INTERLACE,MED_ALL_CONSTITUENT,
204 (unsigned char*) valr) < 0 ) {
205 MESSAGE("Erreur a la lecture des valeurs du champ : ");
206 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
207 ISCRUTE(numdt);ISCRUTE(numo);
208 ret = -1;
209 }
210 _val = (unsigned char*) valr;
211 } else {
212
213 vale = (med_int*) calloc(ncomp*nval*ngauss,sizeof(med_int));
214 EXIT_IF(vale == NULL,NULL,NULL);
215
216 if (MEDfield23ValueWithProfileRd(fid, nomcha, numdt,numo, entite,type_geo[k],_meshname,
217 MED_COMPACT_PFLMODE, pflname, MED_NO_INTERLACE,MED_ALL_CONSTITUENT,
218 (unsigned char*) vale) < 0 ) {
219 MESSAGE("Erreur a la lecture des valeurs du champ : ");
220 SSCRUTE(nomcha);ISCRUTE_int(entite);ISCRUTE_int(type_geo[k]);
221 ISCRUTE(numdt);ISCRUTE(numo);
222 ret = -1;
223 }
224 _val = (unsigned char*) vale;
225 }
226
227 /* Ecriture du champ destination */
228 MAJ_version_num(fid,3,0,8);
229 /*Sauvegarde du champ initial dans _pathtmp*/
230 EXIT_IF( H5Gmove(fid, _pathi, _pathtmp ) < 0,"Switch to ",_pathtmp);
231
232 _groupexist=H5Lexists( fid, _pathf, H5P_DEFAULT );
233 EXIT_IF(!_groupexist,"Le champ devrait déjà existé",_pathf);
234 /*Déplacement du champ cible temporaire au chemin des champs écrits par MED */
235 if (_groupexist ) { EXIT_IF( (H5Gmove(fid, _pathf, _pathi ) < 0) ,"Switch to ",_pathi); }
236
237 /*Ecriture du champ cible au nouveau format*/
238 /* ISCRUTE(nval); */
239 MED_ERR_EXIT_IF( MEDfieldValueWithProfileWr(fid, _fieldname, numdt, numo, dt, entite,type_geo[k],
240 MED_COMPACT_PFLMODE, pflname, locname, MED_NO_INTERLACE, MED_ALL_CONSTITUENT,
241 nval, _val) < 0,
242 MED_ERR_WRITE,MED_ERR_FIELD,_fieldname);
243 free(_val);
244 /*Rétablissement des chemins d'accès au champ initial et au champ cible temporaire*/
245 EXIT_IF( H5Gmove(fid, _pathi , _pathf ) < 0,"Switch to ",_pathf);
246 EXIT_IF( H5Gmove(fid, _pathtmp, _pathi ) < 0,"Switch to ",_pathi);
247
248 MAJ_version_num(fid,2,3,6);
249
250 /* if ( strlen(locname) ) */
251 /* printf("\t- Modèle de localisation des points de Gauss de nom |%s|\n",locname); */
252
253 /* if (entite == MED_NODE_ELEMENT) */
254 /* ngroup = (type_geo[k] % 100); */
255 /* else */
256 /* ngroup = ngauss; */
257
258 /* switch (MED_NO_INTERLACE) { */
259
260 /* case MED_FULL_INTERLACE : */
261 /* printf("\t- Valeurs :\n\t"); */
262 /* for (m=0;m<(nval*ngauss)/ngroup;m++) { */
263 /* printf("|"); */
264 /* for (n=0;n<ngroup*ncomp;n++) */
265 /* if (typcha == MED_FLOAT64) */
266 /* printf(" %f ",*(valr+(m*ngroup*ncomp)+n)); */
267 /* else */
268 /* printf(" "IFORMAT" ",*(vale+(m*ngroup*ncomp)+n)); */
269
270 /* } */
271 /* break; */
272
273 /* case MED_NO_INTERLACE : */
274 /* printf("\t- Valeurs :\n\t"); */
275 /* for (m=0;m<ncomp;m++) { */
276 /* printf("|"); */
277 /* for (n=0;n<(nval*ngauss);n++) */
278 /* if (typcha == MED_FLOAT64) */
279 /* printf(" %f ",*(valr+(m*nval)+n)); */
280 /* else */
281 /* printf(" "IFORMAT" ",*(vale+(m*nval)+n)); */
282 /* } */
283 /* break; */
284 /* } */
285
286 /* printf("|\n"); */
287 /* if (typcha == MED_FLOAT64) { */
288 /* if ( valr ) {free(valr);valr = NULL;}} */
289 /* else */
290 /* if (vale) { free(vale);vale = NULL; } */
291
292 /* if (strcmp(pflname,MED_NO_PROFILE) == 0 ) */
293 /* printf("\t- Profil : MED_NO_PROFILE\n"); */
294 /* else { */
295 /* if ( (pflsize = MEDprofileSizeByName(fid,pflname)) <0 ) { */
296 /* MESSAGE("Erreur a la lecture du nombre de valeurs du profil : "); */
297 /* SSCRUTE(pflname); */
298 /* ret = -1; continue; */
299 /* } */
300
301 /* printf("\t- Profil : |%s| de taille "IFORMAT"\n",pflname,pflsize); */
302
303 /* pflval = (med_int*) malloc(sizeof(med_int)*pflsize); */
304 /* EXIT_IF(pflval == NULL,NULL,NULL); */
305 /* if ( MEDprofileRd(fid,pflname,pflval) <0) { */
306 /* MESSAGE("Erreur a la lecture des valeurs du profil : "); */
307 /* SSCRUTE(pflname); */
308 /* ret = -1; */
309 /* } */
310 /* printf("\t"); */
311 /* for (m=0;m<pflsize;m++) printf(" "IFORMAT" ",*(pflval+m)); */
312 /* printf("\n"); */
313 /* free(pflval); */
314 /* } */
315 }
316 }
317 }
318 } /* fin for sur les mailles*/
319
320 ret = 0;
321
322 ERROR:
323 return ret;
324 }
325