# _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 }