MED fichier: Concepts et fonctionnalités de base pour créer et lire un paramètre numérique

MED fichier

- Documentation MED
- Guides d'utilisation
- Guides de référence

Concepts et fonctionnalités de base pour créer et lire un paramètre numérique

### Créer un paramètre numérique

L'écriture de paramètres numériques dans un fichier MED est optionnelle : un fichier MED peut en contenir de 0 à plusieurs. Le mode d'écriture pour chaque paramètre consiste à créer le paramètre dont le type peut être entier ou réel comme pour les champs de résultats. La création d'un paramètre numérique se fait via la routine MEDparameterCr / mprcre. Il est possible ensuite d'écrire des valeurs pour un paramètre selon plusieurs séquences de calcul avec la routine MEDparameterValueWr / mprrvw mprivw.

/* This file is part of MED.
*
* COPYRIGHT (C) 1999 - 2017 EDF R&D, CEA/DEN
* MED is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MED is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with MED. If not, see <http://www.gnu.org/licenses/>.
*/
/******************************************************************************
* - Nom du fichier : test21.c
*
* - Description : ecriture de valeurs scalaires numeriques dans un fichier MED
*
*****************************************************************************/
#include <med.h>
#define MESGERR 1
#include <med_utils.h>
#ifdef DEF_LECT_ECR
#define MODE_ACCES MED_ACC_RDWR
#elif DEF_LECT_AJOUT
#define MODE_ACCES MED_ACC_RDEXT
#else
#define MODE_ACCES MED_ACC_CREAT
#endif
int main (int argc, char **argv)
{
med_err ret;
med_idt fid;
char nom_scalaire1[MED_NAME_SIZE+1] = "VariableEntiere";
char description1[MED_COMMENT_SIZE+1] = "Une premiere description";
char nom_scalaire2[MED_NAME_SIZE+1] = "VariableFlottante";
char description2[MED_COMMENT_SIZE+1] = "Une seconde description";
med_int vali1 = 56;
med_int vali2 = -789;
med_float valr1 = 67.98;
/* Creation du fichier test21.med */
if ((fid = MEDfileOpen("test21.med",MODE_ACCES)) < 0) {
MESSAGE("Erreur a la creation du fichier test21.med");
return -1;
}
/* Creation d'un variable scalaire entiere */
if (MEDparameterCr(fid,nom_scalaire1,MED_INT,description1,"ms") < 0) {
MESSAGE("Erreur a la creation d'une variable scalaire enti�re");
return -1;
}
printf("Creation d'une variable scalaire entiere \n");
/* Ecriture d'un valeur sans pas de temps et sans numero d'ordre*/
if (MEDparameterValueWr(fid,nom_scalaire1,MED_NO_DT,MED_NO_IT,MED_UNDEF_DT,(unsigned char*) &vali1) < 0) {
MESSAGE("Erreur a l'ecriture d'une valeur entiere");
return -1;
}
printf("Ecriture d'une valeur entiere sans pas de temps \n");
/* Ecriture d'une valeur entiere avec 1 pas de temps et sans numero d'ordre */
if (MEDparameterValueWr(fid,nom_scalaire1,1,MED_NO_IT,5.5,(unsigned char*) &vali2) < 0) {
MESSAGE("Erreur a l'ecriture d'une valeur entiere");
return -1;
}
printf("Ecriture d'une valeur entiere avec pas de temps \n");
/* Creation d'un variable scalaire flottante */
if (MEDparameterCr(fid,nom_scalaire2,MED_FLOAT64,description2,"ms") < 0) {
MESSAGE("Erreur a la creation d'une variable scalaire flottante");
return -1;
}
printf("Creation d'une variable scalaire flottante \n");
/* Ecriture d'une valeur reelle avec 1 pas de temps et 1 numero d'ordre */
if (MEDparameterValueWr(fid, nom_scalaire2, 1, 2, 5.5, (unsigned char*) &valr1) < 0) {
MESSAGE("Erreur a l'ecriture d'une valeur flottante");
return -1;
}
printf("Ecriture d'une valeur reelle avec pas de temps et numero d'ordre \n");
/* Fermeture du fichier */
if (MEDfileClose(fid) < 0) {
MESSAGE("Erreur a la fermeture du fichier");
return -1;
}
return 0;
}

### Lire un paramètre numérique

Le mode de lecture des paramètres numériques se calque sur celui des champs et des maillages. L'accès aux paramètres stockés dans un fichier peut se faire via deux approches possibles : accès par le nom ou via un itérateur. La routine MEDparameterInfoByName / mprpin permet de lire les informations relatives à un paramètre dont on connaît le nom. Les informations lues correspondent à celles écrites par la routine MEDparameterCr / mprcre.

Si on utilise l'approche itérative, il est tout d'abord nécessaire de lire le nombre de paramètre dans le fichier avec la routine MEDnParameter / mprnpr, avant d'itérer sur tous ces paramètres. La routine MEDparameterInfo / mprpri permet de récupérer les informations relative à chaque paramètre dont le nombre de séquence de calcul (au même titre que MEDparameterInfoByName / mprpin). Il s'agit ensuite d'itérer sur chaque séquence de calcul afin d'une part de récupérer les informations relatives à cette séquence avec la routine MEDparameterComputationStepInfo / mprcsi et d'autre part de lire la valeur du paramètre avec la routine MEDparameterValueRd / mprrvr mprivr.

Le cas d'utilisation suivant donne une approche générique pour lire tous les paramètres numériques d'un fichier MED.

/* This file is part of MED.
*
* COPYRIGHT (C) 1999 - 2017 EDF R&D, CEA/DEN
* MED is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MED is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with MED. If not, see <http://www.gnu.org/licenses/>.
*/
/******************************************************************************
* - Nom du fichier : test22.c
*
* - Description : lecture de valeurs scalaires numeriques crees dans test21.
*
*****************************************************************************/
#include <med.h>
#define MESGERR 1
#include <med_utils.h>
#ifdef DEF_LECT_ECR
#define MODE_ACCES MED_ACC_RDWR
#elif DEF_LECT_AJOUT
#define MODE_ACCES MED_ACC_RDEXT
#else
#define MODE_ACCES MED_ACC_CREAT
#endif
int main (int argc, char **argv)
{
med_idt fid;
char nom_scalaire[MED_NAME_SIZE+1];
char description[MED_COMMENT_SIZE+1];
med_int vali;
med_float valr;
med_int i,n,npdt,j;
med_field_type type;
med_int numdt,numo;
med_float dt;
char dt_unit[MED_SNAME_SIZE+1];
/* Ouverture du fichier test21.med en lecture seule */
if ((fid = MEDfileOpen("test21.med",MED_ACC_RDONLY)) < 0) {
MESSAGE("Erreur a l'ouverture du fichier test21.med");
return -1;
}
/* Lecture du nombre de variable scalaire */
n = MEDnParameter(fid);
if (n < 0) {
MESSAGE("Erreur a la lecture du nombre de variable scalaire");
return -1;
}
printf("Nombre de variables scalaires dans test21.med = "IFORMAT"\n",n);
/* Lecture des infos sur les variables (type,description) */
for (i=1;i<=n;i++) {
if (MEDparameterInfo(fid, i, nom_scalaire, &type, description, dt_unit, &npdt) < 0) {
MESSAGE("Erreur a la lecture des infos sur la variable d'indice : ");
ISCRUTE(i);
return -1;
}
printf("- Scalaire n°"IFORMAT" de nom %s \n",i,nom_scalaire);
if (type == MED_FLOAT64)
printf(" Type flottant. \n");
else
printf(" Type entier. \n");
printf(" Description associee : [%s] \n",description);
printf(" Nombre de pas de temps : "IFORMAT" \n",npdt);
for (j=1;j<=npdt;j++) {
if (MEDparameterComputationStepInfo(fid,nom_scalaire,j,&numdt,&numo,&dt) < 0) {
MESSAGE("Erreur a la lecture des informations sur le pas de temps d'indice :");
ISCRUTE(j);
return -1;
}
printf(" Valeur n°"IFORMAT" : \n",j);
if (numdt == MED_NO_DT)
printf(" - Aucun de pas de temps \n");
else
printf(" - Pas de de temps de numero "IFORMAT" de valeur %f [%s] \n",numdt,dt,dt_unit);
if (numo == MED_NO_IT)
printf(" - Aucun numero d'ordre \n");
else
printf(" - Numero d'ordre : "IFORMAT" \n",numo);
/* Lecture de la valeur flottante associee au pas de temps */
if (type == MED_FLOAT64) {
if (MEDparameterValueRd(fid,nom_scalaire,numdt,numo,(unsigned char *) &valr) < 0) {
MESSAGE("Erreur a la lecture de la valeur flottante : ");
SSCRUTE(nom_scalaire); ISCRUTE(numdt);ISCRUTE(numo);
return -1;
}
printf(" - Valeur : %f \n",valr);
} else {
/* Lecture de la valeur scalaire associee au pas de temps */
if (MEDparameterValueRd(fid,nom_scalaire,numdt,numo,(unsigned char *) &vali) < 0) {
MESSAGE("Erreur a la lecture de la valeur entiere : ");
SSCRUTE(nom_scalaire); ISCRUTE(numdt);ISCRUTE(numo);
return -1;
}
printf(" - Valeur : "IFORMAT" \n",vali);
}
}
}
/* Fermeture du fichier */
if (MEDfileClose(fid) < 0) {
MESSAGE("Erreur a la fermeture du fichier ");
return -1;
}
return 0;
}