d6.04.02 Impressions dirigées par le mot clé INFO des commandes (paquet INFXXX )#
Résumé :
Ce document indique comment les développeurs doivent réaliser les impressions dirigées par le mot clé INFO des commandes.
Table des matières
Se protéger d’un excès de messages#
Le responsable d’une commande est responsable des impressions de niveau 1 de cette commande. Il doit les documenter et s’arranger pour que le fichier message reste lisible.
Un problème se pose quand une commande fait appel à un utilitaire imprimant des INFO de niveau 1 que le responsable de la commande juge sans intérêt (ou trop nombreuses … par exemple dans une boucle). Il faut donner à la commande le moyen de “faire taire” l’utilitaire. Pour cela, on dispose des 2 routines :
INFMUE() pour rendre le code “MUET” jusqu’à nouvel ordre,
INFBAV() pour remettre le code en mode “BAVARD”.
Ces 2 routines ne sont efficaces que si le niveau d’impression demandé est 1 : on ne peut empêcher le code de “parler” si INFO = 2.
Exemple :
La commande OP000I ne veut pas entendre ce que dit la routine B
SUBROUTINE OP000I
CALL INFMAJ
…
CALL A (…)
…
CALL INFMUE ()
CALL B (…)
CALL INFBAV()
…
END
Remarques :
Ce système n’est pas parfait car il permet seulement d’interrompre sans discernement le flot des impressions. Il ne permet pas par exemple, d’interdire à B de parler tout en laissant C (appelé par B) parler !
Pour que INFMUE/INFBAV soit efficace, il faut que les routines que l’on veut faire taire aient programmé leurs impressions de niveau 1 de la manière suivante
IF (NIV.GE.1) WRITE ….
Les routines INFMUE et INFBAV modifient (temporairement) le niveau d’impression ( NIV ). Mais au sein de la routine où elles sont appelées, elle ne peuvent évidemment pas modifier la valeur de la variable locale NIV *. Dans l’exemple ci-dessus, si la routine* OP000I veut imprimer des INFO après l’appel à INFMUE , elle doit «mettre à jour» la variable NIV en appelant de nouveau la routine INFNIV .
Fonctionnement des utilitaires “INFXXX”#
Ce paragraphe a pour seul but d’aider à comprendre (si nécessaire) l’utilisation de ces routines :
COMMON/INF001/NIVUTI, NIVPGM, UNITE
INTEGER NIVUTI : niveau demandé par l’utilisateur : 1 ou 2
INTEGER NIVPGM : niveau accessible au programmeur : 0, 1, ou 2
INTEGER UNITE : unité logique du fichier ‘MESSAGE’
le COMMON INF001 n’est utilisé que par les routines INFXXX
SUBROUTINE INFMAJ ()
COMMON/INF001/…
GETVIS (nomCMD, 'I', 'INFO', …, NIV)
NIVUTI = NIV
NIVPGM = NIV
UNITE = IUNIFI ('MESSAGE')
END
SUBROUTINE INFNIV (IFM, NIV)
COMMON/INF001/…
INF = UNITE
NIV = NIVPGM
END
SUBROUTINE INFMUE()
COMMON/INF001/…
IF (NIVUTI.EQ.1) NIVPGM = 0
END
SUBROUTINE INFBAV()
COMMON/INF001/…
NIVPGM = NIVUTI
END
Exemple d’utilisation LIRE_MAILLAGE(INFO=2)#
Fichier de commande INFO = 1
MA = LIRE_MAILLAGE()
Fichier de message
MA=LIRE_MAILLAGE(INFO=1,
VERI_MAIL=_F(APLAT=1.E-3,VERIF='OUI'),
UNITE=20,
FORMAT='ASTER',
);
====== VERIFICATION DU MAILLAGE ======
------------ MAILLAGE MA - IMPRESSIONS NIVEAU 1 ------------
MA-22-AVRI-2008 12:25:18
NOMBRE DE NOEUDS 4
NOMBRE DE MAILLES 5
SEG2 4
QUAD4 1
NOMBRE DE GROUPES DE NOEUDS 1
BAS 2
NOMBRE DE GROUPES DE MAILLES 1
CONTOUR 4
Fichier de commande INFO = 2
MA = LIRE_MAILLAGE(INFO=2)
Fichier de message
MA=LIRE_MAILLAGE(INFO=2,
VERI_MAIL=_F(APLAT=1.E-3,VERIF='OUI'),
UNITE=20,
FORMAT='ASTER',
);
====== VERIFICATION DU MAILLAGE ======
------------ MAILLAGE MA - IMPRESSIONS NIVEAU 2 ------------
MA-22-AVRI-2008 12:28:11
NOMBRE DE NOEUDS 4
NOMBRE DE MAILLES 5
SEG2 4
QUAD4 1
NOMBRE DE GROUPES DE NOEUDS 1
BAS 2
NOMBRE DE GROUPES DE MAILLES 1
CONTOUR 4
------ LISTE DES NOEUDS ------
1 NO1 0.00000D+00 0.00000D+00
2 NO2 0.10000D+01 0.00000D+00
3 NO3 0.10000D+01 0.10000D+01
4 NO4 0.00000D+00 0.10000D+01
------ LISTE DES MAILLES ------
1 CARRE QUAD4 1 2 3 4
2 GAUCHE SEG2 1 4
3 DROITE SEG2 2 3
4 HAUT SEG2 3 4
5 BAS SEG2 1 2
------ LISTE DES GROUPES DE NOEUDS ------
1 BAS 2 1 2
------ LISTE DES GROUPES DE MAILLES ------
1 CONTOUR 4 2 3 4 5
Comment émettre un message d’information#
La routine INFMAJ sert à informer le “paquet” INFXXX du niveau d’impressions demandé par l’utilisateur,
la routine INFNIV sert à récupérer le niveau d’impression demandé par l’utilisateur ainsi que l’unité logique du fichier ‘MESSAGE‘.
le programmeur d’une commande fera donc :
mettre le mot clé INFO dans le catalogue de la commande : 2 valeurs possibles 1 et 2, valeur par défaut :1
dans la routine OP000I
CALL GETVIS (' ', 'INFO', 0, 1, 1, NIV, IBID) CALL INFMAJ(NIV)dans une routine voulant imprimer des INFO:
Remarques :
On pourrait penser que les INFO de niveau 1 peuvent être écrites sans se protéger par ( IF (NIV.GE.1) …) car ces impressions se déclenchent par défaut. On verra au §3 «Se protéger d’un excès de messages», pourquoi il faut les protéger.
Pour se protéger des commandes qui n’ont pas le mot clé INFO dans leur catalogue, le superviseur met à jour le COMMON avant chaque commande : CALL INFMAJ(1) .