00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <med.h>
00020 #include <med_config.h>
00021 #include <med_outils.h>
00022 #include <string.h>
00023 #include <stdlib.h>
00024
00025 #include <2.3.6/med23v30.h>
00026 #include <2.3.6/med23v30_proto.h>
00027 #include "2.3.6/med23v30_misc.h"
00028 #include "2.3.6/med23v30_hdfi.h"
00029
00030
00031 void _MEDmeshAdvancedRd236(int dummy, ...)
00032 {
00033 va_list params;
00034 va_start(params,dummy);
00035
00036 const med_idt fid = va_arg(params, const med_idt );
00037 const char* const meshname = va_arg(params, const char* const );
00038 const med_data_type meddatatype = va_arg(params, const med_data_type );
00039 const char* const datasetname = va_arg(params, const char* const );
00040 const med_internal_type datatype = va_arg(params, const med_internal_type );
00041 const med_int numdt = va_arg(params, const med_int );
00042 const med_int numit = va_arg(params, const med_int );
00043 const med_entity_type entitytype = va_arg(params, const med_entity_type );
00044 const med_geometry_type geotype = va_arg(params, const med_geometry_type );
00045 const med_connectivity_mode cmode = va_arg(params, const med_connectivity_mode );
00046 const med_storage_mode storagemode = va_arg(params, const med_storage_mode );
00047 const char * const profilename = va_arg(params, const char * const );
00048 const med_switch_mode switchmode = va_arg(params, const med_switch_mode );
00049 const med_int dimselect = va_arg(params, const med_int );
00050 const med_filter * const filter = va_arg(params, const med_filter * const );
00051 unsigned char* const value = va_arg(params, unsigned char* const );
00052 med_err * fret = va_arg(params, med_err *);
00053
00054 med_access_mode _MED_ACCESS_MODE;
00055 med_err _ret=-1;
00056 med_idt _meshid=0;
00057 med_idt _datagroup=0, _datagroup2=0,_datagroup3=0,_dataset=0;
00058 char _meshpath [MED_TAILLE_SUP_MAA+MED_NAME_SIZE+1]="";
00059 char _datagroupname2 [MED_TAILLE_NOM_ENTITE+1]="";
00060 char _datagroupname3 [MED_TAILLE_NOM_ENTITE+1]="";
00061 char _datasetname [MED_TAILLE_NOM_ENTITE+1]="";
00062
00063 char _geotypename [MED_TAILLE_NOM_ENTITE+1]="";
00064 med_bool _filterparameterexist=MED_FALSE;
00065 med_filter * _filter = NULL;
00066 med_filter _tmpfilter = MED_FILTER_INIT;
00067 med_int _nbofconstituentpervalue=0,_spacedim=0;
00068 med_internal_type _datatype=datatype;
00069 med_int _nbofvalueperentity=0;
00070 med_mesh_type _meshtype=MED_UNDEF_MESH_TYPE;
00071 med_int _intmeshtype=0;
00072 med_bool _isasupportmesh=MED_FALSE;
00073 med_int _intgridtype=0;
00074 med_grid_type _gridtype=MED_UNDEF_GRID_TYPE;
00075
00076 if (filter) {
00077 _filter=(med_filter*)(filter); _filterparameterexist=MED_TRUE;
00078 }
00079 else {
00080 _filter=&_tmpfilter;
00081
00082
00083 (*_filter).nbofvaluesperentity = 1;
00084
00085 (*_filter).constituentselect = dimselect;
00086 (*_filter).switchmode = switchmode;
00087 (*_filter).storagemode = storagemode;
00088 strcpy((*_filter).profilename,profilename);
00089 (*_filter).profilearraysize = 0;
00090 }
00091
00092 if ( (*_filter).storagemode == MED_UNDEF_PFLMODE)
00093 (*_filter).storagemode = MED_GLOBAL_PFLMODE;
00094
00095
00096
00097
00098 _MEDmodeErreurVerrouiller();
00099
00100 if ( (_MED_ACCESS_MODE = _MEDmodeAcces(fid) ) == MED_ACC_UNDEF ) {
00101 MED_ERR_(_ret,MED_ERR_UNRECOGNIZED,MED_ERR_ACCESSMODE,MED_ERR_FILE_MSG);
00102 goto ERROR;
00103 }
00104
00105
00106
00107
00108 NOFINALBLANK(meshname,ERROR);
00109
00110
00111
00112 if ( (numdt != MED_NO_DT) || (numit != MED_NO_IT) ) {
00113 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_COMPUTINGSTEP,MED_ERR_MESH_MSG);
00114 SSCRUTE(meshname);ISCRUTE(numdt);ISCRUTE(numit);
00115 goto ERROR;
00116 }
00117
00118 if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
00119 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00120 SSCRUTE(_meshpath); goto ERROR;
00121 }
00122
00123
00124 if (_MEDattrEntierLire(_meshid,MED_NOM_ESP,&_spacedim) < 0) {
00125 if (_MEDattrEntierLire(_meshid,MED_NOM_DIM,&_spacedim) < 0) {
00126 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00127 SSCRUTE(meshname);SSCRUTE(MED_NOM_DIM);goto ERROR;
00128 }
00129 }
00130
00131
00132 if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
00133 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00134 SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
00135 }
00136 _meshtype = (med_mesh_type) _intmeshtype;
00137
00138 if ( _meshtype == MED_STRUCTURED_MESH ) {
00139
00140
00141
00142 if (_MEDattrEntierLire(_meshid,MED_NOM_GTY,&_intgridtype) < 0) {
00143 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
00144 SSCRUTE(meshname);SSCRUTE(MED_NOM_GTY);ISCRUTE(_intgridtype);goto ERROR;
00145 }
00146 _gridtype=(med_grid_type) _intgridtype;
00147 }
00148
00149
00150 if ( (entitytype == MED_STRUCT_ELEMENT) || (meddatatype == MED_VARIABLE_ATTRIBUTE) ) {
00151 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
00152 ISCRUTE_int(entitytype);ISCRUTE_int(meddatatype);goto ERROR;
00153 }
00154
00155
00156
00157
00158
00159 if ( !strlen(datasetname) ) {
00160 if ( _MEDgetDatasetName( _datasetname, meddatatype, cmode ) < 0 ) {
00161 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetname");
00162 ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);SSCRUTE( _datasetname);goto ERROR;
00163 }
00164 } else {
00165 MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_DATASET,datasetname);
00166 goto ERROR;
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 if ( ! (_nbofvalueperentity && _nbofconstituentpervalue) )
00189 if ( _MEDgetDatasetParameter( meddatatype, _spacedim, entitytype, geotype, cmode,
00190 &_nbofvalueperentity,&_nbofconstituentpervalue) < 0 ) {
00191 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDgetDatasetParameter");
00192 ISCRUTE_int(meddatatype);ISCRUTE_int(cmode);ISCRUTE(_nbofvalueperentity);
00193 ISCRUTE(_nbofconstituentpervalue);goto ERROR;
00194 }
00195
00196 if (_filterparameterexist) {
00197 if ((*_filter).nbofconstituentpervalue != _nbofconstituentpervalue ) {
00198 MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
00199 ISCRUTE((*_filter).nbofconstituentpervalue); ISCRUTE(_nbofconstituentpervalue );
00200 goto ERROR;
00201 }
00202 if ((*_filter).nbofvaluesperentity != _nbofvalueperentity ) {
00203 MED_ERR_(_ret,MED_ERR_NOTEQUAL,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
00204 ISCRUTE((*_filter).nbofvaluesperentity); ISCRUTE(_nbofvalueperentity );
00205 goto ERROR;
00206 }
00207 } else {
00208 (*_filter).nbofconstituentpervalue = _nbofconstituentpervalue;
00209 (*_filter).nbofvaluesperentity = _nbofvalueperentity;
00210 }
00211
00212
00213
00214
00215
00216 if (_MEDgetEntityTypeName(_datagroupname2,entitytype) < 0) {
00217 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
00218 ISCRUTE_int(entitytype);SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);goto ERROR;
00219 }
00220
00221 if ((_datagroup2 = _MEDdatagroupOuvrir(_meshid,_datagroupname2)) < 0) {
00222 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00223 SSCRUTE(meshname);ISCRUTE(numit);ISCRUTE(numdt);SSCRUTE(_datagroupname2);
00224 goto ERROR;
00225 }
00226
00227
00228
00229
00230
00231
00232 if ( entitytype != MED_NODE ) {
00233
00234 if (strlen(_geotypename))
00235 strncpy(_datagroupname3,_geotypename,MED_NAME_SIZE+1);
00236 else
00237 if ( _MEDgetGeometryTypeName(_datagroupname3,geotype) < 0) {
00238 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_GEOMETRIC,MED_ERR_VALUE_MSG);
00239 ISCRUTE_int(geotype);SSCRUTE(meshname);SSCRUTE(_datagroupname2);
00240 goto ERROR;
00241 }
00242
00243 if ((_datagroup3 = _MEDdatagroupOuvrir(_datagroup2,_datagroupname3)) < 0) {
00244 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
00245 SSCRUTE(meshname);SSCRUTE(_datagroupname2);SSCRUTE(_datagroupname3);
00246 goto ERROR;
00247 }
00248 }
00249
00250
00251 if (_datagroup3) _datagroup=_datagroup3; else _datagroup=_datagroup2;
00252
00253
00254
00255
00256
00257 if ( strlen((*_filter).profilename) ) {
00258 MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_PROFILE,(*_filter).profilename);
00259 SSCRUTE(meshname);SSCRUTE(_datagroupname2);
00260 SSCRUTE(_datagroupname3);goto ERROR;
00261 }
00262
00263 if ((*_filter).storagemode != MED_GLOBAL_PFLMODE ) {
00264 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_FILTER,"");
00265 ISCRUTE_int(geotype);SSCRUTE(meshname);SSCRUTE(_datagroupname2);
00266 ISCRUTE_int((*_filter).storagemode);goto ERROR;
00267 }
00268
00269 switch(meddatatype)
00270 {
00271
00272 case MED_COORDINATE_AXIS1 :
00273 strcpy(_datasetname,MED_NOM_IN1);
00274 if (_gridtype == MED_CURVILINEAR_GRID) goto CURVILINEAR_LABEL; else goto COORDINATE_LABEL;
00275
00276 case MED_COORDINATE_AXIS2 :
00277 strcpy(_datasetname,MED_NOM_IN2);
00278 if (_gridtype == MED_CURVILINEAR_GRID) goto CURVILINEAR_LABEL; else goto COORDINATE_LABEL;
00279
00280 case MED_COORDINATE_AXIS3 :
00281 strcpy(_datasetname,MED_NOM_IN3);
00282 if (_gridtype == MED_CURVILINEAR_GRID) goto CURVILINEAR_LABEL; else goto COORDINATE_LABEL;
00283
00284 CURVILINEAR_LABEL:
00285 if ((_dataset = _MEDdatasetOuvrir(_datagroup,MED_NOM_COO)) < 0) {
00286 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATASET,MED_NOM_COO);
00287 goto ERROR;
00288 }
00289
00290 if (_MEDattrEntierLire(_dataset,_datasetname, (unsigned char*) value ) < 0) {
00291 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,_datasetname);
00292 goto ERROR;
00293 }
00294 break;
00295
00296
00297 case MED_COORDINATE :
00298 COORDINATE_LABEL:
00299 if (_MEDdatasetNumLire(_datagroup,_datasetname,MED_FLOAT64,
00300 (med_mode_switch) (*_filter).switchmode ,
00301 (med_size) (*_filter).nbofconstituentpervalue,
00302 (med_size) (*_filter).constituentselect,
00303 (med_size) (*_filter).filterarraysize,
00304 MED_COMPACT,MED_PFL_NON_COMPACT,
00305 (*_filter).filterarray23v30,
00306 MED_NOPG, 0, (unsigned char*) value ) < 0)
00307 goto ERROR;
00308 break;
00309
00310
00311 case MED_INDEX_FACE :
00312 case MED_INDEX_NODE :
00313 switch(cmode)
00314 {
00315 case MED_NODAL :
00316 switch(meddatatype)
00317 {
00318 case MED_CONNECTIVITY :
00319 strcpy(_datasetname,MED_NOM_NOD);
00320 break;
00321 case MED_INDEX_FACE :
00322 if (geotype == MED_POLYHEDRON)
00323 strcpy(_datasetname,MED_NOM_INN);
00324 else
00325 strcpy(_datasetname,MED_NOM_IFN);
00326 break;
00327 case MED_INDEX_NODE :
00328 if (geotype == MED_POLYHEDRON)
00329 strcpy(_datasetname,MED_NOM_IFN);
00330 else
00331 strcpy(_datasetname,MED_NOM_INN);
00332 break;
00333 }
00334 break;
00335
00336 case MED_DESCENDING :
00337 switch(meddatatype)
00338 {
00339 case MED_CONNECTIVITY :
00340 strcpy(_datasetname,MED_NOM_DES);
00341 break;
00342 case MED_INDEX_FACE :
00343 if (geotype == MED_POLYHEDRON)
00344 strcpy(_datasetname,MED_NOM_IND);
00345 else
00346 strcpy(_datasetname,MED_NOM_IFD);
00347 break;
00348 case MED_INDEX_NODE :
00349 if (geotype == MED_POLYHEDRON)
00350 strcpy(_datasetname,MED_NOM_IFD);
00351 else
00352 strcpy(_datasetname,MED_NOM_IND);
00353 break;
00354 }
00355 break;
00356
00357 default :
00358 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_CONNECTIVITYMODE,MED_ERR_VALUE_MSG);
00359 ISCRUTE_int(cmode);goto ERROR;
00360 }
00361
00362 case MED_CONNECTIVITY :
00363 #if defined(HAVE_F77INT64)
00364 if ( _MEDdatasetNumLire(_datagroup,_datasetname,MED_INT64,
00365 (med_mode_switch) (*_filter).switchmode ,
00366 (med_size) (*_filter).nbofconstituentpervalue,
00367 (med_size) (*_filter).constituentselect,
00368 (med_size) (*_filter).filterarraysize,MED_COMPACT,MED_PFL_NON_COMPACT,
00369 (*_filter).filterarray23v30,
00370 MED_NOPG, 0, (unsigned char*) value ) < 0)
00371 goto ERROR;
00372 #else
00373 if ( _MEDdatasetNumLire(_datagroup,_datasetname,MED_INT32,
00374 (med_mode_switch) (*_filter).switchmode ,
00375 (med_size) (*_filter).nbofconstituentpervalue,
00376 (med_size) (*_filter).constituentselect,
00377 (med_size) (*_filter).filterarraysize,MED_COMPACT,MED_PFL_NON_COMPACT,
00378 (*_filter).filterarray23v30,
00379 MED_NOPG, 0, (unsigned char*) value ) < 0)
00380 goto ERROR;
00381 #endif
00382
00383 break;
00384
00385 case MED_NAME :
00386 if (_MEDdatasetStringLire(_datagroup,_datasetname,(char *) value) < 0)
00387 goto ERROR;
00388 break;
00389
00390 case MED_NUMBER :
00391 case MED_GLOBAL_NUMBER :
00392 case MED_FAMILY_NUMBER :
00393 #if defined(HAVE_F77INT64)
00394 if (_MEDdatasetNumLire(_datagroup,_datasetname,MED_INT64,
00395 MED_NO_INTERLACE,
00396 (med_size)1,
00397 (med_size) (*_filter).constituentselect,
00398 (med_size) MED_NOPF,MED_NO_PFLMOD,MED_PFL_NON_COMPACT,
00399 (med_size *) NULL, MED_NOPG,0,
00400 (unsigned char*) value) < 0)
00401 goto ERROR;
00402 #else
00403 if (_MEDdatasetNumLire(_datagroup,_datasetname,MED_INT32,
00404 MED_NO_INTERLACE,
00405 (med_size) 1,
00406 (med_size) (*_filter).constituentselect,
00407 (med_size) MED_NOPF,MED_NO_PFLMOD,MED_PFL_NON_COMPACT,
00408 (med_size *) NULL, MED_NOPG,0,
00409 (unsigned char*) value) < 0)
00410 goto ERROR;
00411 #endif
00412 break;
00413
00414
00415 case MED_COORDINATE_TRSF :
00416 default :
00417 MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_MEDDATATYPE,MED_ERR_VALUE_MSG);
00418 ISCRUTE_int(meddatatype);goto ERROR;
00419 }
00420
00421
00422 _ret = 0;
00423
00424 ERROR:
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 if (_dataset>0) if (_MEDdatasetFermer(_dataset) < 0) {
00445 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATASET,MED_NOM_COO);
00446 ISCRUTE_id(_dataset);
00447 }
00448
00449 if (_datagroup3>0) if (_MEDdatagroupFermer(_datagroup3) < 0) {
00450 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname3);
00451 ISCRUTE_id(_datagroup3);
00452 }
00453
00454 if (_datagroup2>0) if (_MEDdatagroupFermer(_datagroup2) < 0) {
00455 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroupname2);
00456 ISCRUTE_id(_datagroup2);
00457 }
00458
00459
00460
00461
00462
00463
00464 if (_meshid>0) if (_MEDdatagroupFermer(_meshid) < 0) {
00465 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
00466 ISCRUTE_id(_meshid);
00467 }
00468
00469
00470 va_end(params);
00471 *fret = _ret;
00472
00473 return;
00474 }
00475