MED fichier
UsesCase_MEDstructElement_3.c
Aller à la documentation de ce fichier.
1/* This file is part of MED.
2 *
3 * COPYRIGHT (C) 1999 - 2020 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#include <med.h>
19#define MESGERR 1
20#include <med_utils.h>
21
22#include <string.h>
23
24/*
25 * StructElement use case 3 : read struct element models in a file from a computation mesh
26 */
27
28int main (int argc, char **argv) {
29 med_idt fid;
30 med_int nmodels, nsmesh;
31 int i,j;
32 char elementname[MED_NAME_SIZE+1]="";
33 char supportmeshname[MED_NAME_SIZE+1]="";
34 const char computmeshname[MED_NAME_SIZE+1]="COMPUT_MESH";
35 med_geometry_type *geotype;
36 med_entity_type entitype;
37 med_int elementdim;
38 med_int nnode,ncell;
39 med_geometry_type geocelltype;
40 med_bool anyprofile=0;
41 med_int nconstatt, *nvaratt=NULL;
42 char attname[MED_NAME_SIZE+1]="";
43 char profilename[MED_NAME_SIZE+1]="";
44 med_attribute_type atttype;
45 med_int nattcomp;
46 med_entity_type attentitype;
47 med_int profilesize;
48 med_float *value=NULL;
49 med_int size=0;
50 med_int meshdim, spacedim;
51 char description[MED_COMMENT_SIZE+1]="";
52 char axisname[3*MED_SNAME_SIZE+1]="";
53 char axisunit[3*MED_SNAME_SIZE+1]="";
54 med_axis_type axistype;
55 med_float *coordinates=NULL;
56 med_bool coordinatechangement;
57 med_bool geotransformation;
58 med_int nseg2;
59 med_int *seg2connectivity=NULL;
60 med_int nentities=0;
61 med_sorting_type sortingtype;
62 med_mesh_type meshtype;
63 med_int nstep;
64 char dtunit[MED_SNAME_SIZE+1]="";
65 char unitname[2*MED_SNAME_SIZE+1]="";
66 int ret=-1;
67
68 /* open file */
69 fid = MEDfileOpen("UsesCase_MEDstructElement_1.med",MED_ACC_RDONLY);
70 if (fid < 0) {
71 MESSAGE("ERROR : file creation ...");
72 goto ERROR;
73 }
74
75 /*
76 * ... In this case, we know that the MED file has only one mesh,
77 * a real code would check ...
78 */
79 /* read mesh informations : mesh dimension, space dimension ... */
80 if (MEDmeshInfoByName(fid, computmeshname, &spacedim, &meshdim, &meshtype, description,
81 dtunit, &sortingtype, &nstep, &axistype, axisname, unitname) < 0) {
82 MESSAGE("ERROR : mesh info ...");
83 goto ERROR;
84 }
85
86 /* read how many struct element models in the mesh ? */
87 if ((nmodels = MEDmeshnEntity(fid, computmeshname, MED_NO_DT, MED_NO_IT, MED_STRUCT_ELEMENT, MED_GEO_ALL,
88 MED_UNDEF_DATATYPE, MED_NO_CMODE,&coordinatechangement,
89 &geotransformation)) < 0) {
90 MESSAGE("ERROR : number of nodes ...");
91 goto ERROR;
92 }
93
94 geotype = (med_geometry_type *) malloc(sizeof(med_geometry_type)*nmodels);
95 nvaratt = (med_int *) malloc(sizeof(med_int)*nmodels);
96
97 /* Get the name and the geotype of each struct element model used in the computation mesh.
98 For each struct element geotype read the connectivity and the attribute(s)
99 The mesh support may be read if needed.
100 */
101 for (i=0;i<nmodels;i++) {
102
103 /* read the geotype */
104 if (MEDmeshEntityInfo(fid, computmeshname, MED_NO_DT, MED_NO_IT, MED_STRUCT_ELEMENT,i+1,elementname,(geotype+i)) < 0) {
105 MESSAGE("ERROR : name and type of MED_STRUCT_ELEMENT ...");
106 goto ERROR;
107 }
108
109 /* read how many MED_STRUCT_ELEMENT of type *(geotype+i) there is in the mesh */
110 if ((nentities = MEDmeshnEntity(fid, computmeshname, MED_NO_DT, MED_NO_IT, MED_STRUCT_ELEMENT,*(geotype+i),
111 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
112 &geotransformation)) < 0) {
113 MESSAGE("ERROR : number of MED_STRUCT_ELEMENT ...");
114 goto ERROR;
115 }
116
117 /* read informations about the model */
118 if (MEDstructElementInfoByName(fid, elementname, geotype+i, &elementdim,
119 supportmeshname, &entitype, &nnode, &ncell,
120 &geocelltype, &nconstatt, &anyprofile, nvaratt+i) < 0) {
121 MESSAGE("ERROR : struct element models information ...");
122 goto ERROR;
123 }
124
125 /* read support mesh */
126 /* TODO : Ceci est optionnel dans ce usescase */
127 if (strcmp(supportmeshname,"")) {
128 if ( MEDsupportMeshInfoByName(fid, supportmeshname, &spacedim, &meshdim, description,
129 &axistype, axisname, axisunit) < 0 ) {
130 MESSAGE("ERROR : read information about mesh support ...");
131 goto ERROR;
132 }
133
134 ISCRUTE(nnode);
135 /* read how many nodes in the support mesh */
136 /* Ceci est optionnel dans ce usescase */
137 if ((nnode = MEDmeshnEntity(fid, supportmeshname, MED_NO_DT, MED_NO_IT, MED_NODE, MED_NONE,
138 MED_COORDINATE, MED_NO_CMODE,&coordinatechangement,
139 &geotransformation)) < 0) {
140 MESSAGE("ERROR : read number of nodes ...");
141 goto ERROR;
142 }
143 ISCRUTE(nnode);
144
145 /* read support mesh nodes coordinates */
146 /* Ceci est optionnel dans ce usescase */
147 coordinates = (med_float*) malloc(sizeof(med_float)*nnode*spacedim);
148
150 coordinates) < 0) {
151 MESSAGE("ERROR : read nodes coordinates ...");
152 free(coordinates);
153 goto ERROR;
154 }
155
156 /* free memory */
157 free(coordinates);
158
159 /* read how many MED_SEG2 cells in the support mesh */
160 /* Ceci est optionnel dans ce usescase */
161 if ((nseg2 = MEDmeshnEntity(fid, supportmeshname, MED_NO_DT, MED_NO_IT, MED_CELL,geocelltype,
162 MED_CONNECTIVITY, MED_NODAL, &coordinatechangement,
163 &geotransformation)) < 0) {
164 MESSAGE("ERROR : number of MED_SEG2 ...");
165 goto ERROR;
166 }
167 ISCRUTE(nseg2);
168 ISCRUTE(ncell);
169 /* read MED_SEG2 connectivity in the support mesh */
170 if (nseg2 > 0) {
171 seg2connectivity = (med_int *) malloc(sizeof(med_int)*nseg2*2);
172
173 if (MEDmeshElementConnectivityRd(fid, supportmeshname, MED_NO_DT, MED_NO_IT, MED_CELL,
174 geocelltype, MED_NODAL, MED_FULL_INTERLACE, seg2connectivity) < 0) {
175 MESSAGE("ERROR : MED_SEG2 connectivity ...");
176 free(seg2connectivity);
177 goto ERROR;
178 }
179 free(seg2connectivity);
180 }
181 }
182
183 /* read constant attribute(s) */
184 /* Optionnel pour ce usescase (cf. usescase lecture modèle) */
185 for (j=0; j<nconstatt; j++) {
186 if ( MEDstructElementConstAttInfo(fid, elementname, j+1,
187 attname, &atttype, &nattcomp, &attentitype,
188 profilename, &profilesize) < 0) {
189 MESSAGE("ERROR : const attribute information ...");
190 goto ERROR;
191 }
192
193 /* if there is a profile => read the profile, see UsesCase_MEDprofile_2 */
194
195 /* memory allocation */
196 if (profilesize != 0)
197 size = profilesize*nattcomp*MEDstructElementAttSizeof(atttype);
198 else
199 if (attentitype== MED_NODE)
200 size = nnode*nattcomp*MEDstructElementAttSizeof(atttype);
201 else
202 size = ncell*nattcomp*MEDstructElementAttSizeof(atttype);
203 if ( atttype == MED_ATT_NAME) ++size;
204 ISCRUTE(size);
205 value = (med_float *) malloc(size);
206
207
208 /* read attribute(s) value(s) */
209 if ( MEDstructElementConstAttRd(fid, elementname, attname, (unsigned char *)value ) < 0 ) {
210 MESSAGE("ERROR : const attribute value ...");
211 free(value);
212 goto ERROR;
213 }
214
215 /* memory deallocation */
216 free(value);
217 }
218
219 /* read variable attribute(s) */
220 for (j=0; j<*(nvaratt+i); j++) {
221
222 /* read informations about the attribute */
223 if ( MEDstructElementVarAttInfo(fid, elementname, j+1,
224 attname, &atttype, &nattcomp) < 0) {
225 MESSAGE("ERROR : var attribute information ...");
226 goto ERROR;
227 }
228
229 /* memory allocation */
230 size = nentities*nattcomp*MEDstructElementAttSizeof(atttype);
231 if ( atttype == MED_ATT_NAME) ++size;
232 ISCRUTE(size);
233 value = (med_float *) malloc((size)*sizeof(char));
234
235 /* read attribute values */
236 if (MEDmeshStructElementVarAttRd(fid, computmeshname, MED_NO_DT, MED_NO_IT,
237 *(geotype+i), attname, value ) < 0) {
238 MESSAGE("ERROR : read variable attributes values ...");
239 free(value);
240 goto ERROR;
241 }
242
243 /* free memory */
244 free(value);
245
246 }
247
248 }
249
250 ret=0;
251 ERROR:
252
253 /* free memory */
254 free(geotype);
255 free(nvaratt);
256
257 /* close file */
258 if (MEDfileClose(fid) < 0) {
259 MESSAGE("ERROR : file closing ...");
260 ret=-1;
261 }
262
263 return ret;
264}
265
int main(int argc, char **argv)
MEDC_EXPORT med_err MEDfileClose(med_idt fid)
Fermeture d'un fichier MED.
Definition: MEDfileClose.c:30
MEDC_EXPORT med_idt MEDfileOpen(const char *const filename, const med_access_mode accessmode)
Ouverture d'un fichier MED.
Definition: MEDfileOpen.c:42
MEDC_EXPORT med_err MEDmeshElementConnectivityRd(const med_idt fid, const char *const meshname, const med_int numdt, const med_int numit, const med_entity_type entitype, const med_geometry_type geotype, const med_connectivity_mode cmode, const med_switch_mode switchmode, med_int *const connectivity)
Cette routine permet de lire dans un maillage le tableau des connectivités pour un type géométrique d...
MEDC_EXPORT med_err MEDmeshEntityInfo(const med_idt fid, const char *const meshname, const med_int numdt, const med_int numit, const med_entity_type entitype, const int geotypeit, char *const geotypename, med_geometry_type *const geotype)
Cette routine indique de façon itérative les types géométriques disponibles dans un maillage.
MEDC_EXPORT med_err MEDmeshNodeCoordinateRd(const med_idt fid, const char *const meshname, const med_int numdt, const med_int numit, const med_switch_mode switchmode, med_float *const coordinates)
Cette routine permet de lire dans un maillage le tableau des coordonnées des noeuds,...
MEDC_EXPORT med_int MEDmeshnEntity(const med_idt fid, const char *const meshname, const med_int numdt, const med_int numit, const med_entity_type entitype, const med_geometry_type geotype, const med_data_type datatype, const med_connectivity_mode cmode, med_bool *const changement, med_bool *const transformation)
Cette routine permet de lire le nombre d'entités dans un maillage pour une étape de calcul donnée.
MEDC_EXPORT med_err MEDmeshInfoByName(const med_idt fid, const char *const meshname, med_int *const spacedim, med_int *const meshdim, med_mesh_type *const meshtype, char *const description, char *const dtunit, med_sorting_type *const sortingtype, med_int *const nstep, med_axis_type *const axistype, char *const axisname, char *const axisunit)
Cette routine permet de lire les informations relatives à un maillage en précisant son nom.
MEDC_EXPORT med_err MEDstructElementVarAttInfo(const med_idt fid, const char *const modelname, const int attit, char *const varattname, med_attribute_type *const varatttype, med_int *const ncomponent)
Cette routine décrit les caractéristiques d'un attribut variable de modèle d'élément de structure par...
MEDC_EXPORT int MEDstructElementAttSizeof(const med_attribute_type atttype)
Cette routine renvoie la taille en octets du type élémentaire atttype.
MEDC_EXPORT med_err MEDstructElementConstAttRd(const med_idt fid, const char *const modelname, const char *const constattname, void *const value)
Cette routine lit la valeur d'un attribut caractéristique constant d'un modèle d'éléments de structur...
MEDC_EXPORT med_err MEDmeshStructElementVarAttRd(const med_idt fid, const char *const meshname, const med_int numdt, const med_int numit, const med_geometry_type mgeotype, const char *const varattname, void *const value)
Cette routine lit les valeurs d'un attribut caractéristique variable sur les éléments de structure d'...
MEDC_EXPORT med_err MEDstructElementConstAttInfo(const med_idt fid, const char *const modelname, const int attit, char *const constattname, med_attribute_type *const constatttype, med_int *const ncomponent, med_entity_type *const sentitytype, char *const profilename, med_int *const profilesize)
Cette routine décrit les caractéristiques d'un attribut constant de modèle d'élément de structure par...
MEDC_EXPORT med_err MEDstructElementInfoByName(const med_idt fid, const char *const modelname, med_geometry_type *const mgeotype, med_int *const modeldim, char *const supportmeshname, med_entity_type *const sentitytype, med_int *const snnode, med_int *const sncell, med_geometry_type *const sgeotype, med_int *const nconstantatribute, med_bool *const anyprofile, med_int *const nvariableattribute)
Cette routine décrit les caractéristiques d'un modèle d'élément de structure à partir de son nom.
MEDC_EXPORT med_err MEDsupportMeshInfoByName(const med_idt fid, const char *const supportmeshname, med_int *const spacedim, med_int *const meshdim, char *const description, med_axis_type *const axistype, char *const axisname, char *const axisunit)
Cette routine permet de lire les informations relatives à un maillage support en précisant son nom.
#define MED_NAME_SIZE
Definition: med.h:81
@ MED_FULL_INTERLACE
Definition: med.h:96
int med_geometry_type
Definition: med.h:194
#define MED_SNAME_SIZE
Definition: med.h:82
med_bool
Definition: med.h:260
@ MED_UNDEF_DATATYPE
Definition: med.h:152
@ MED_CONNECTIVITY
Definition: med.h:149
@ MED_COORDINATE
Definition: med.h:149
med_axis_type
Definition: med.h:258
med_sorting_type
Definition: med.h:300
med_mesh_type
Definition: med.h:131
int med_int
Definition: med.h:333
#define MED_NO_DT
Definition: med.h:311
#define MED_NO_IT
Definition: med.h:312
#define MED_NONE
Definition: med.h:231
med_entity_type
Definition: med.h:143
@ MED_NODE
Definition: med.h:143
@ MED_CELL
Definition: med.h:143
@ MED_STRUCT_ELEMENT
Definition: med.h:144
double med_float
Definition: med.h:327
med_attribute_type
Definition: med.h:173
@ MED_ATT_NAME
Definition: med.h:175
#define MED_COMMENT_SIZE
Definition: med.h:79
#define MED_GEO_ALL
Definition: med.h:236
@ MED_ACC_RDONLY
Definition: med.h:120
hid_t med_idt
Definition: med.h:322
@ MED_NO_CMODE
Definition: med.h:255
@ MED_NODAL
Definition: med.h:255
#define MESSAGE(chaine)
Definition: med_utils.h:324
#define ISCRUTE(entier)
Definition: med_utils.h:313