2       SUBROUTINE xermsg (LIBRAR, SUBROU, MESSG, NERR, LEVEL)
 
  188       CHARACTER*(*) LIBRAR, SUBROU, MESSG
 
  189       CHARACTER*8 XLIBR, XSUBR
 
  192       INTEGER NERR, LEVEL, LKNTRL
 
  193       INTEGER J4SAVE, MAXMES, KDUMMY, I, KOUNT, LERR, LLEVEL
 
  194       INTEGER MKNTRL, LTEMP
 
  196       lkntrl = j4save(2, 0, .
false.)
 
  197       maxmes = j4save(4, 0, .
false.)
 
  207       IF (nerr.LT.-9999999 .OR. nerr.GT.99999999 .OR. nerr.EQ.0 .OR.
 
  208      *   level.LT.-1 .OR. level.GT.2) 
THEN 
  209          CALL xerprn (
' ***', -1, 
'FATAL ERROR IN...$$ ' //
 
  210      *      
'XERMSG -- INVALID ERROR NUMBER OR LEVEL$$ '//
 
  211      *      
'JOB ABORT DUE TO FATAL ERROR.', 72)
 
  212          CALL xersve (
' ', 
' ', 
' ', 0, 0, 0, kdummy)
 
  213          CALL xerhlt (
' ***XERMSG -- INVALID INPUT')
 
  219       i = j4save(1, nerr, .
true.)
 
  220       CALL xersve (librar, subrou, messg, 1, nerr, level, kount)
 
  224       IF (level.EQ.-1 .AND. kount.GT.1) 
RETURN 
  233       CALL xercnt (xlibr, xsubr, lfirst, lerr, llevel, lkntrl)
 
  235       lkntrl = max(-2, min(2,lkntrl))
 
  241       IF (level.LT.2 .AND. lkntrl.EQ.0) 
GO TO 30
 
  242       IF (level.EQ.0 .AND. kount.GT.maxmes) 
GO TO 30
 
  243       IF (level.EQ.1 .AND. kount.GT.maxmes .AND. mkntrl.EQ.1) 
GO TO 30
 
  244       IF (level.EQ.2 .AND. kount.GT.max(1,maxmes)) 
GO TO 30
 
  251       IF (lkntrl .NE. 0) 
THEN 
  252          temp(1:21) = 
'MESSAGE FROM ROUTINE ' 
  253          i = min(len(subrou), 16)
 
  254          temp(22:21+i) = subrou(1:i)
 
  255          temp(22+i:33+i) = 
' IN LIBRARY ' 
  257          i = min(len(librar), 16)
 
  258          temp(ltemp+1:ltemp+i) = librar(1:i)
 
  259          temp(ltemp+i+1:ltemp+i+1) = 
'.' 
  260          ltemp = ltemp + i + 1
 
  261          CALL xerprn (
' ***', -1, temp(1:ltemp), 72)
 
  283       IF (lkntrl .GT. 0) 
THEN 
  287          IF (level .LE. 0) 
THEN 
  288             temp(1:20) = 
'INFORMATIVE MESSAGE,' 
  290          ELSEIF (level .EQ. 1) 
THEN 
  291             temp(1:30) = 
'POTENTIALLY RECOVERABLE ERROR,' 
  294             temp(1:12) = 
'FATAL ERROR,' 
  300          IF ((mkntrl.EQ.2 .AND. level.GE.1) .OR.
 
  301      *       (mkntrl.EQ.1 .AND. level.EQ.2)) 
THEN 
  302             temp(ltemp+1:ltemp+14) = 
' PROG ABORTED,' 
  305             temp(ltemp+1:ltemp+16) = 
' PROG CONTINUES,' 
  311          IF (lkntrl .GT. 0) 
THEN 
  312             temp(ltemp+1:ltemp+20) = 
' TRACEBACK REQUESTED' 
  315             temp(ltemp+1:ltemp+24) = 
' TRACEBACK NOT REQUESTED' 
  318          CALL xerprn (
' ***', -1, temp(1:ltemp), 72)
 
  323       CALL xerprn (
' *  ', -1, messg, 72)
 
  328       IF (lkntrl .GT. 0) 
THEN 
  329          WRITE (temp, 
'(''ERROR NUMBER = '', I8)') nerr
 
  331             IF (temp(i:i) .NE. 
' ') 
GO TO 20
 
  334    20    
CALL xerprn (
' *  ', -1, temp(1:15) // temp(i:23), 72)
 
  340       IF (lkntrl .NE. 0) 
THEN 
  341          CALL xerprn (
' *  ', -1, 
' ', 72)
 
  342          CALL xerprn (
' ***', -1, 
'END OF MESSAGE', 72)
 
  343          CALL xerprn (
'    ',  0, 
' ', 72)
 
  349    30 
IF (level.LE.0 .OR. (level.EQ.1 .AND. mkntrl.LE.1)) 
RETURN 
  355       IF (lkntrl.GT.0 .AND. kount.LT.max(1,maxmes)) 
THEN 
  356          IF (level .EQ. 1) 
THEN 
  358      *         (
' ***', -1, 
'JOB ABORT DUE TO UNRECOVERED ERROR.', 72)
 
  360             CALL xerprn(
' ***', -1, 
'JOB ABORT DUE TO FATAL ERROR.', 72)
 
  362          CALL xersve (
' ', 
' ', 
' ', -1, 0, 0, kdummy)
 
subroutine xerprn(PREFIX, NPREF, MESSG, NWRAP)
 
subroutine xersve(LIBRAR, SUBROU, MESSG, KFLAG, NERR, LEVEL, ICOUNT)
 
subroutine xercnt(LIBRAR, SUBROU, MESSG, NERR, LEVEL, KONTRL)
 
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
 
subroutine xermsg(LIBRAR, SUBROU, MESSG, NERR, LEVEL)
 
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true