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

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:

– CALL INFNIV (IFM, NIV)

– pour une INFO de niveau 1 (contractuelle) :

IF (NIV.GE.1) WRITE (IFM, …)

– pour une INFO de niveau 2 :

IF (NIV.EQ.2) WRITE (IFM, …)

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) .

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