_MEDfieldComputingStepCheck236.c

Aller à la documentation de ce fichier.
00001 /*  This file is part of MED.
00002  *
00003  *  COPYRIGHT (C) 1999 - 2011  EDF R&D, CEA/DEN
00004  *  MED is free software: you can redistribute it and/or modify
00005  *  it under the terms of the GNU Lesser General Public License as published by
00006  *  the Free Software Foundation, either version 3 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  MED is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU Lesser General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU Lesser General Public License
00015  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
00016  */
00017 
00018 
00019 #include <med.h>
00020 #include <med_config.h>
00021 #include <med_outils.h>
00022 #include <string.h>
00023 
00024 #include <2.3.6/med23v30.h>
00025 #include <2.3.6/med23v30_proto.h>
00026 #include "2.3.6/med23v30_misc.h"
00027 /*
00028  * PARAMETRES D'ENTREE:
00029  *
00030  * - checkmeshname vérifie quelque soit  (entitytype,geotype) et seqnum que le maillage
00031  * par défaut est toujours le même.
00032  * - checkmultiplemesh vérifie quelque soit (entitytype,geotype) et seqnum qu'un seul
00033  * maillage est utilisé
00034  * En vérifiant checkmeshname && checkmultiplemesh on s'assure qu'il y a 1 et 1 seul même maillage
00035  * pour tous les (entitytype,geotype) et seqnum.
00036  *
00037  * PARAMETRES D'ENTREE:
00038  *
00039  * - npcst : indique le nombre de séquences de calcul utilisés par le champ <fieldname>
00040  *
00041  * ERREUR :
00042  * Une erreur est généré systématiquement si le nombre de séquence de calcul n'est pas le même
00043  * pour tous les (entitytype,geotype)
00044  * TODO : Il faut tester multiplemesh et samedefaultmeshname pour savoir si la demande correspondant
00045  * respectivement à checkmultiplemesh et checkmeshname est satisfaite
00046  */
00047 
00048 med_err _MEDfieldComputingStepCheck236(med_idt fid, const char * const fieldname,
00049                                        med_size * const ncpst,
00050                                        med_bool checkmultiplemesh, med_bool * const multiplemesh,
00051                                        med_bool checkmeshname, med_bool * const samedefaultmeshname)
00052 {
00053   med_err   _ret=-1,_err=0;
00054   med_idt   _cstpid=0;
00055   char      _ent_geo       [2*MED_TAILLE_NOM_ENTITE+2]="";
00056   char      _path          [(MED_TAILLE_CHA+MED_TAILLE_NOM+1)+
00057                             (2*MED_TAILLE_NOM_ENTITE+1)+1+(2*MED_MAX_PARA)+1]=MED_CHA;
00058   int       _pathlen=0;
00059   med_size  _i=0,_n=0;
00060   med_size  _prevnseq=0,_nseq =0;
00061   med_string_itdatas _itdatas;
00062 
00063   /*
00064    * On construit le nom du datagroup
00065    */
00066   strcat(_path,fieldname);
00067 
00068   /*
00069    * On compte le nombre de couple (entitytype,geotype)
00070    */
00071   if ((_err=_MEDnObjects(fid,_path,&_n)) <0)
00072     if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
00073       MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,MED_NOM_ENT "." MED_NOM_GEO);
00074       goto ERROR;
00075     }
00076 
00077   _pathlen =  strlen(_path);
00078 
00079   /*
00080    * Pour tous les couples (entitytype,geotype)
00081    * on vérifie qu'il y a le même nombre de séquences de calcul (sinon le fichier n'est pas conforme au modèle 2.3.6)
00082    * Ceci est une vérification partielle que le modèle 2.3.6 a été respecté :
00083    *  - Il faudrait normalement vérifier qu'il s'agit aussi des mêmes séquences de calcul
00084    * Etant donnée la faible utilisation du usecase multimaillages et le coût de traitement associé à cette
00085    * vérification complémentaire, celle-ci n'est pas faite.
00086    * Par contre, il est necessaire de savoir si plusieurs noms de maillages
00087      apparaissent ou si un seul est utilisé (ici on vérifie uniquement que le maillage par défaut est le même)
00088    */
00089 
00090   /*L'attribut dont il faut vérifier la valeur pour toutes les étapes de calcul de tous les
00091    couple (entitytype,geotype) est MED_NOM_MAI*/
00092   if (checkmeshname) _MEDcheckAttributeStringInit(&_itdatas,MED_NOM_MAI,MED_TAILLE_NOM);
00093 
00094   for (_i=0; _i <_n; ++_i ) {
00095 
00096     /*
00097      * On recupere le nom du couple (entitytype,geotype) n°_i
00098      */
00099     if ( _MEDobjectGetName(fid, _path ,_i, _ent_geo) < 0 ) {
00100       MED_ERR_(_ret,MED_ERR_ACCESS,MED_ERR_DATAGROUP,_path);
00101       SSCRUTE(_path); goto ERROR;
00102     }
00103 
00104 /*     SSCRUTE(_path); */
00105     strcpy(&_path[_pathlen],"/");
00106     strcat(_path,_ent_geo);
00107 /*     SSCRUTE(_path); */
00108 
00109 /*     ISCRUTE(_prevnseq); */
00110 /*     ISCRUTE(_nseq); */
00111 
00112     /*
00113      * On vérifie qu'il y a le même nombre de séquences de calcul
00114      * que pour le couple (entitytype,geotype) précédent
00115      * on le vérifie pas que ce sont bien les mêmes
00116      */
00117     if ( _prevnseq != _nseq ) {
00118       MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_ent_geo);
00119       ISCRUTE_size(_prevnseq);ISCRUTE_size(_nseq);ISCRUTE_size(_i);
00120       goto ERROR;
00121     }
00122 
00123     /*
00124      * On compte le nombre de séquences de calcul pour le couple (entitytype,geotype) n°_i
00125      */
00126     if ((_err=_MEDnObjects(fid,_path,&_nseq)) <0)
00127       if ( _err == (MED_ERR_COUNT + MED_ERR_DATAGROUP) ) {
00128         MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,_ent_geo);
00129         goto ERROR;
00130       }
00131 
00132     _prevnseq = _nseq;
00133 
00134     if (checkmeshname || checkmultiplemesh) {
00135       if ((_cstpid = _MEDdatagroupOuvrir(fid,_path)) < 0) {
00136         MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,_path);
00137         goto ERROR;
00138       }
00139     }
00140 
00141     if (checkmeshname) {
00142       /*
00143        * On vérifie que le nom du maillage par défaut est le même pour toutes
00144        * les étapes de calcul de tous les couples (entitytype,geotype)
00145        */
00146       if (_MEDiterate(_cstpid, _MEDcheckAttributeStringFunc, &_itdatas ) < 0) {
00147         MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_ATTRIBUTE,MED_ERR_VALUE_MSG);
00148         SSCRUTE(_itdatas.attvalprec); SSCRUTE(_itdatas.attval); goto ERROR;
00149       }
00150     }
00151 
00152     /*
00153      * On vérifie qu'un seul  maillage est utilisé pour toutes
00154      * les étapes de calcul de tous les couples (entitytype,geotype)
00155      */
00156     if (checkmultiplemesh) {
00157       if (_MEDiterate(_cstpid, _MEDchecknSublinkFunc, multiplemesh ) < 0) {
00158         MED_ERR_(_ret,MED_ERR_COUNT,MED_ERR_DATAGROUP,MED_ERR_NBR_MSG MED_ERR_MESH_MSG);
00159         SSCRUTE(_path);goto ERROR;
00160       }
00161     }
00162 
00163     if (_cstpid>0) if (_MEDdatagroupFermer(_cstpid) < 0) {
00164       MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_path);
00165       ISCRUTE_id(_cstpid);
00166     }
00167 
00168     _path[_pathlen]='\0';
00169   }
00170 
00171   if (checkmeshname) _MEDcheckAttributeStringFin(&_itdatas);
00172 
00173   *ncpst = _nseq;
00174 
00175  _ret = 0;
00176 
00177  ERROR:
00178 
00179   return _ret;
00180 
00181 }

Généré le Mon May 16 17:10:22 2011 pour MED fichier par  doxygen 1.6.1