Skip to content
Snippets Groups Projects
write_lfifm1_for_diag_supp.f90 36 KiB
Newer Older
!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
!--------------- special set of characters for RCS information
!-----------------------------------------------------------------
! $Source$ $Revision$ $Date$
!-----------------------------------------------------------------
!     ######################################
      MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
!     ######################################
INTERFACE
!
   SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP(HFMFILE)
!
!*       0.1   Declarations of arguments
!
CHARACTER(LEN=28), INTENT(IN) :: HFMFILE      ! Name of FM-file to write
!
END SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP
!
END INTERFACE
!
END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
!
!     ##############################################
      SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP(HFMFILE)
!     ##############################################
!
!!****  *WRITE_LFIFM1_FOR_DIAG_SUPP* - write records in the diag file
!!
!!    PURPOSE
!!    -------
!        The purpose of this routine is to write in the file
!     of name HFMFILE//'.lfi' with the FM routines.  
!
!!**  METHOD
!!    ------
!!      The data are written in the LFIFM file :
!!        - diagnostics from the convection
!!        - diagnostics from the radiatif transfer code
!!
!!      The localization on the model grid is also indicated :
!!        IGRID = 1 for mass grid point
!!        IGRID = 2 for U grid point
!!        IGRID = 3 for V grid point
!!        IGRID = 4 for w grid point
!!        IGRID = 0 for meaningless case
!!
!!    EXTERNAL
!!    --------
!!      FMWRIT : FM-routine to write a record
!!
!!
!!    IMPLICIT ARGUMENTS
!!    ------------------
!!
!!    REFERENCE
!!    ---------
!!
!!    AUTHOR
!!    ------
!!  	J. Stein   *Meteo France* 
!!
!!    MODIFICATIONS
!!    -------------
!!      Original    13/09/00
!!      N. Asencio  15/09/00 computation of temperature and height of clouds is moved
!!                           here and deleted in WRITE_LFIFM1_FOR_DIAG routine
!!      I. Mallet   02/11/00 add the call to RADTR_SATEL
!!      J.-P. Chaboureau 11/12/03 add call the CALL_RTTOV (table NRTTOVINFO to
!!              choose the platform, the satellite, the sensor for all channels 
!!              (see the table in rttov science and validation report) and the
!!              type of calculations in the namelist: 0 = tb, 1 = tb + jacobian,
!!              2 = tb + adjoint, 3 = tb + jacobian + adjoint)
!!      V. Masson   01/2004  removes surface (externalization)
!!      October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after
!!                                              change of YCOMMENT
!!      October 2011 (C.Lac) FF10MAX  : interpolation of 10m wind
!!        between 2 Meso-NH levels if 10m is above the first atmospheric level
!!      2015 : D.Ricard add UM10/VM10 for LCARTESIAN=T cases
!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
!!      P.Tulet : Diag for salt and orilam
!!      J.-P. Chaboureau 07/03/2016 fix the dimensions of local arrays
!-------------------------------------------------------------------------------
!
!*       0.    DECLARATIONS
!              ------------
!
USE MODD_CST
USE MODD_PARAMETERS
USE MODD_CONF_n
USE MODD_CONF
USE MODD_DEEP_CONVECTION_n
USE MODD_DIM_n
USE MODD_FIELD_n
USE MODD_GRID_n
USE MODD_LUNIT_n
USE MODD_PARAM_n
USE MODD_PARAM_KAFR_n
USE MODD_PARAM_RAD_n
USE MODD_RADIATIONS_n
USE MODD_TIME_n
USE MODD_TURB_n
USE MODD_REF_n, ONLY: XRHODREF
USE MODD_DIAG_FLAG
USE MODD_NSV, ONLY : NSV,NSV_USER,NSV_C2R2BEG,NSV_C2R2END,             &
                     NSV_C1R3BEG, NSV_C1R3END,NSV_ELECBEG,NSV_ELECEND, &
                     NSV_CHEMBEG, NSV_CHEMEND,NSV_LGBEG,  NSV_LGEND
USE MODD_CH_M9_n,         ONLY: CNAMES
USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
USE MODD_LG,              ONLY: CLGNAMES
USE MODD_DUST,            ONLY: LDUST
USE MODD_SALT,            ONLY: LSALT
USE MODD_CH_AEROSOL,      ONLY: LORILAM
USE MODD_RAD_TRANSF
USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M,XCURRENT_MER10M,           &
                            XCURRENT_SFCO2, XCURRENT_SW, XCURRENT_LW
!
USE MODD_DYN_n
USE MODD_CURVCOR_n
USE MODD_METRICS_n
USE MODD_DIAG_BLANK
USE MODI_PINTER
USE MODI_ZINTER
USE MODI_GRADIENT_M
USE MODI_GRADIENT_W
USE MODI_GRADIENT_U
USE MODI_GRADIENT_V
USE MODI_GRADIENT_UV
!
USE MODI_SHUMAN
USE MODI_CALL_RTTOV
USE MODI_RADTR_SATEL
USE MODI_UV_TO_ZONAL_AND_MERID
!
USE MODE_FMWRIT
!
USE MODI_GET_SURF_UNDEF
!
#ifdef MNH_NCWRIT
USE MODN_NCOUT
use mode_util
#endif
!
IMPLICIT NONE
!
!*       0.1   Declarations of arguments
!
CHARACTER(LEN=28), INTENT(IN) :: HFMFILE      ! Name of FM-file to write
!
!*       0.2   Declarations of local variables
!
INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears 
                                    !  at the open of the file LFI routines 
INTEGER           :: IGRID          ! IGRID : grid indicator
INTEGER           :: ILENCH         ! ILENCH : length of comment string 
!
CHARACTER(LEN=16) :: YRECFM         ! Name of the article to be written
CHARACTER(LEN=100):: YCOMMENT       ! Comment string
!
INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
INTEGER           :: IKRAD  
! 
INTEGER           :: JI,JJ,JK,JSV   ! loop index
! 
! variables for Diagnostic variables related to deep convection
REAL,DIMENSION(:,:), ALLOCATABLE              :: ZWORK21,ZWORK22
!
! variables for computation of temperature and height of clouds
REAL :: ZCLMR ! value of mixing ratio tendency  for detection of cloud top
LOGICAL, DIMENSION(:,:), ALLOCATABLE          :: GMASK2 
INTEGER, DIMENSION(:,:), ALLOCATABLE          :: IWORK1, IWORK2
INTEGER, DIMENSION(:,:), ALLOCATABLE          :: ICL_HE_ST
REAL,    DIMENSION(:,:,:), ALLOCATABLE        :: ZWORK31,ZTEMP
!
! variables needed for the transfer radiatif diagnostic code
INTEGER :: ITOTGEO
INTEGER, DIMENSION (JPGEOST) :: INDGEO
CHARACTER(LEN=8), DIMENSION (JPGEOST) :: YNAM_SAT
REAL, DIMENSION(:,:), ALLOCATABLE :: ZIRBT, ZWVBT
REAL  :: ZUNDEF ! undefined value in SURFEX
!
! variables needed for 10m wind                                 
INTEGER :: ILEVEL
!
INTEGER :: IPRES, ITH
CHARACTER(LEN=4) :: YCAR4
CHARACTER(LEN=4), DIMENSION(SIZE(XISOPR)) :: YPRES
CHARACTER(LEN=4), DIMENSION(SIZE(XISOTH)) :: YTH
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK32,ZWORK33,ZWORK34,ZWRES,ZPRES,ZWTH
REAL, DIMENSION(:), ALLOCATABLE :: ZTH
REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZPOVO
REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZVOX,ZVOY,ZVOZ
REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZCORIOZ
!-------------------------------------------------------------------------------
!
!*       0.     ARRAYS BOUNDS INITIALIZATION
!
IIU=SIZE(XTHT,1)
IJU=SIZE(XTHT,2)
IKU=SIZE(XTHT,3)
CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
IKB=1+JPVEXT
IKE=IKU-JPVEXT
!
ALLOCATE(ZWORK21(IIU,IJU))
ALLOCATE(ZWORK31(IIU,IJU,IKU))
ALLOCATE(ZTEMP(IIU,IJU,IKU))
ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD)
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
!
#ifdef MNH_NCWRIT
IF (LNETCDF.AND..NOT.LCARTESIAN) THEN
  YRECFM='LAT'
  YCOMMENT='X_Y_latitude (degree)'
  IGRID=1
  ILENCH=LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XLAT,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM='LON'
  YCOMMENT='X_Y_longitude (degree)'
  IGRID=1
  ILENCH=LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XLON,IGRID,ILENCH,YCOMMENT,IRESP)
END IF
#endif
!
!-------------------------------------------------------------------------------
!
!*       1.     DIAGNOSTIC RELATED TO CONVECTION
!               -------------------------------- 
!
!* Diagnostic variables related to deep convection
!
IF (NCONV_KF >= 0) THEN
!
  YRECFM      = 'CAPE'
  YCOMMENT    = 'X_Y_Convective Available Potentiel Energy (J/kg)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCAPE,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'CLTOPCONV'                              ! top height (km) of
  ZWORK21(:,:)= 0.                                       ! convective clouds
  DO JJ=IJB,IJE
    DO JI=IIB,IIE
      IF (NCLTOPCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLTOPCONV(JI,JJ))/1.E3
    END DO
  END DO
  YCOMMENT    = 'X_Y_Top of Convective Cloud (km)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'CLBASCONV'                              ! base height (km) of
  ZWORK21(:,:)= 0.                                       ! convective clouds
  DO JJ=IJB,IJE
    DO JI=IIB,IIE
      IF (NCLBASCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLBASCONV(JI,JJ))/1.E3
    END DO
  END DO
  YCOMMENT    = 'X_Y_Base of Convective Cloud (km)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
!
END IF
IF (NCONV_KF >= 1) THEN
!
  YRECFM      = 'DTHCONV'
  YCOMMENT    = 'X_Y_Z_CONVective heating/cooling rate (K/s)'
  IGRID       = 1
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDTHCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'DRVCONV'
  YCOMMENT    = 'X_Y_Z_CONVective R_v tendency (1/s)'
  IGRID       = 1
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDRVCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'DRCCONV'
  YCOMMENT    = 'X_Y_Z_CONVective R_c tendency (1/s)'
  IGRID       = 1
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDRCCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'DRICONV'
  YCOMMENT    = 'X_Y_Z_CONVective R_i tendency (1/s)'
  IGRID       = 1
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDRICONV,IGRID,ILENCH,YCOMMENT,IRESP)
!  
  IF ( LCHTRANS .AND. NSV > 0 ) THEN
    IGRID=1                                    
    ! User scalar variables
    DO JSV = 1, NSV_USER
      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
      WRITE(YCOMMENT,'(A6,A2,I3.3,A26)')'X_Y_Z_','SV',JSV,' CONVective tendency (1/s)'
      ILENCH      = LEN(YCOMMENT)
      CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),          &
                  IGRID,ILENCH,YCOMMENT,IRESP)
    END DO
    ! microphysical C2R2 scheme scalar variables
    DO JSV = NSV_C2R2BEG, NSV_C2R2END
      YRECFM = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)), &
                                  ' CONVective tendency (1/s)'
      ILENCH = LEN(YCOMMENT)
      CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),          &
           IGRID,ILENCH,YCOMMENT,IRESP)
    END DO
    ! microphysical C3R5 scheme additional scalar variables
    DO JSV = NSV_C1R3BEG,NSV_C1R3END
      YRECFM='DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)), &
                                  ' CONVective tendency (1/s)'
      ILENCH=LEN(YCOMMENT)
      CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
                  IGRID,ILENCH,YCOMMENT,IRESP)
    END DO
    ! electrical scalar variables
    DO JSV = NSV_ELECBEG,NSV_ELECEND
      YRECFM = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)),&
                                  ' CONVective tendency (1/s)'
      ILENCH=LEN(YCOMMENT)
      CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
                  IGRID,ILENCH,YCOMMENT,IRESP)
    END DO
    ! chemical scalar variables
    DO JSV = NSV_CHEMBEG, NSV_CHEMEND
      YRECFM = 'DSVCONV_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))
      WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(CNAMES(JSV-NSV_CHEMBEG+1)), &
                                  ' CONVective tendency (1/s)'
      ILENCH = LEN(YCOMMENT)
      CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
                  IGRID,ILENCH,YCOMMENT,IRESP)
    END DO
    ! lagrangian variables
    DO JSV = NSV_LGBEG,NSV_LGEND
      YRECFM='DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
       WRITE(YCOMMENT,'(A6,A,A26)')'X_Y_Z_',TRIM(CLGNAMES(JSV-NSV_LGBEG+1)), &
                                  ' CONVective tendency (1/s)'
      ILENCH=LEN(YCOMMENT)
      CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),           &
                  IGRID,ILENCH,YCOMMENT,IRESP)
    END DO
  END IF
!
END IF
IF (NCONV_KF >= 2) THEN
!
  YRECFM      = 'PRLFLXCONV'
  YCOMMENT    = 'X_Y_Liquid Precipitation Convective Flux (m/s)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XPRLFLXCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'PRSFLXCONV'
  YCOMMENT    = 'X_Y_Solid Precipitation Convective Flux (m/s)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XPRSFLXCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'UMFCONV'
  YCOMMENT    = 'X_Y_Updraft Convective Mass Flux (kg/s m**2)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XUMFCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM      = 'DMFCONV'
  YCOMMENT    = 'X_Y_Downdraft Convective Mass Flux (kg/s m**2)'
  IGRID       = 4
  ILENCH      = LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDMFCONV,IGRID,ILENCH,YCOMMENT,IRESP)
!
END IF
!-------------------------------------------------------------------------------
!
!* Height and temperature of clouds top
!
IF (LCLD_COV .AND. LUSERC) THEN
  ALLOCATE(IWORK1(IIU,IJU),IWORK2(IIU,IJU))
  ALLOCATE(ICL_HE_ST(IIU,IJU))
  ALLOCATE(GMASK2(IIU,IJU))
  ALLOCATE(ZWORK22(IIU,IJU))
!
! Explicit clouds
!
  ICL_HE_ST(:,:)=IKB  !initialization
  IWORK1(:,:)=IKB     ! with the
  IWORK2(:,:)=IKB     ! ground values
  ZCLMR=1.E-4         ! detection of clouds for cloud mixing ratio > .1g/kg
!
  GMASK2(:,:)=.TRUE.
  ZWORK31(:,:,:)= MZM(1,IKU,1, XRT(:,:,:,2) ) ! cloud mixing ratio at zz levels
  DO JK=IKE,IKB,-1
    WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) )
      GMASK2(:,:)=.FALSE.
      IWORK1(:,:)=JK
    END WHERE
  END DO
!
  IF (LUSERI) THEN
    GMASK2(:,:)=.TRUE.
    ZWORK31(:,:,:)= MZM(1,IKU,1, XRT(:,:,:,4) ) ! cloud mixing ratio at zz levels
    DO JK=IKE,IKB,-1
      WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) )
        GMASK2(:,:)=.FALSE.
        IWORK2(:,:)=JK
      END WHERE
    END DO
  END IF
!
  ZWORK21(:,:)=0.
  DO JJ=IJB,IJE
   DO JI=IIB,IIE
     ICL_HE_ST(JI,JJ)=MAX(IWORK1(JI,JJ),IWORK2(JI,JJ) )
     ZWORK21(JI,JJ)  =XZZ(JI,JJ,ICL_HE_ST(JI,JJ)) ! height (m) of explicit clouds
   END DO
  END DO 
!
  WHERE ( ZWORK21(:,:)==XZZ(:,:,IKB) ) ZWORK21=0. ! set the height to 
                                                  ! 0 if there is no cloud
  ZWORK21(:,:)=ZWORK21(:,:)/1.E3            ! height (km) of explicit clouds
!
  YRECFM='HECL'
  YCOMMENT='X_Y_Height of Explicit CLoud top (km)'
  IGRID=4
  ILENCH=LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
!
!  Higher top of the different species of clouds
!
  IWORK1(:,:)=IKB  ! initialization with the ground values
  ZWORK31(:,:,:)=MZM(1,IKU,1,ZTEMP(:,:,:)) ! temperature (K) at zz levels
  IF(CRAD/='NONE')  ZWORK31(:,:,IKB)=XTSRAD(:,:)
  ZWORK21(:,:)=0.
  ZWORK22(:,:)=0.
  DO JJ=IJB,IJE
    DO JI=IIB,IIE
      IWORK1(JI,JJ)=ICL_HE_ST(JI,JJ)
      IF (NCONV_KF >=0) &
      IWORK1(JI,JJ)= MAX(ICL_HE_ST(JI,JJ),NCLTOPCONV(JI,JJ))
      ZWORK21(JI,JJ)= XZZ(JI,JJ,IWORK1(JI,JJ))         ! max. cloud height (m)
      ZWORK22(JI,JJ)= ZWORK31(JI,JJ,IWORK1(JI,JJ))-XTT ! cloud temperature (C)
    END DO
  END DO 
!
  IF (NCONV_KF <0) THEN
    PRINT*,'YOU DO NOT ASK FOR CONVECTIVE DIAGNOSTICS (NCONV_KF<0), SO'
    PRINT*,'  HC not written in FM-file (equal to HEC)'
  ELSE
    WHERE ( ZWORK21(:,:)==XZZ(:,:,IKB) ) ZWORK21(:,:)=0. ! set the height to 
                                                         ! 0 if there is no cloud
    ZWORK21(:,:)=ZWORK21(:,:)/1.E3                 ! max. cloud height (km)
!
    YRECFM='HCL'
    YCOMMENT='X_Y_Height of CLoud top (km)'
    IGRID=4
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
  ENDIF
!
  YRECFM='TCL'
  YCOMMENT='X_Y_Temperature of CLoud top (C)'
  IGRID=4
  ILENCH=LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK22,IGRID,ILENCH,YCOMMENT,IRESP)
!
  YRECFM='CLDFR'
  YCOMMENT='X_Y_Z_Cloud Fraction (0)'
  IGRID=1
  ILENCH=LEN(YCOMMENT) 
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCLDFR,IGRID,ILENCH,YCOMMENT,IRESP)
!
!  Visibility                                    
!
  ZWORK31(:,:,:)= 1.E4                ! 10 km for clear sky
  WHERE (XRT(:,:,:,2) > 0.)
    ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88)
  END WHERE
!
  YRECFM  ='VISI_HOR'
  YCOMMENT='X_Y_Z_VISI_HOR (m)'
  IGRID   = 1
  ILENCH=LEN(YCOMMENT)
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)

  DEALLOCATE(IWORK1,IWORK2,ICL_HE_ST,GMASK2,ZWORK22)
END IF
!
!-------------------------------------------------------------------------------
!
!*       2.    DIAGNOSTIC RELATED TO RADIATIONS
!              --------------------------------
!
IF (NRAD_3D >= 0) THEN
  IF (CRAD /= 'NONE') THEN
!
    YRECFM      = 'DTHRAD'
    YCOMMENT    = 'X_Y_Z_RADiative heating/cooling rate (K/s)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDTHRAD,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'FLALWD'
    YCOMMENT    = 'X_Y_Downward Long Waves on FLAT surface (W/M2)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XFLALWD,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'DIRFLASWD'
    YCOMMENT    = 'X_Y_DIRect Downward Short Waves on FLAT surface (W/M2)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDIRFLASWD,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'SCAFLASWD'
    YCOMMENT    = 'X_Y_SCAttered Downward Short Waves on FLAT surface (W/M2)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XSCAFLASWD,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'DIRSRFSWD'
    YCOMMENT    = 'X_Y_DIRect Downward Short Waves (W/M2)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDIRSRFSWD,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'CLEARCOL_TM1'
    YCOMMENT    = 'TRACE OF CLOUD'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',NCLEARCOL_TM1,IGRID,ILENCH,YCOMMENT,IRESP) 
!
    YRECFM      = 'ZENITH'
    YCOMMENT    = 'X_Y_ZENITH (RAD)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XZENITH,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'AZIM'
    YCOMMENT    = 'X_Y_AZIMuth (RAD)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XAZIM,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'DIR_ALB'
    YCOMMENT    = 'X_Y_DIRect ALBedo (-)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XDIR_ALB,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'SCA_ALB'
    YCOMMENT    = 'X_Y_SCAttered ALBedo (-)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XSCA_ALB,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'EMIS'
    YCOMMENT    = 'X_Y_EMISsivity (-)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XEMIS,IGRID,ILENCH,YCOMMENT,IRESP)
!
    YRECFM      = 'TSRAD'
    YCOMMENT    = 'X_Y_RADiative Surface Temperature (K)'
    IGRID       = 1
    ILENCH      = LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XTSRAD,IGRID,ILENCH,YCOMMENT,IRESP)
!
  ELSE
    PRINT*,'YOU WANT DIAGNOSTICS RELATED TO RADIATION'
    PRINT*,' BUT NO RADIATIVE SCHEME WAS ACTIVATED IN THE MODEL'
  END IF
END IF
IF (NRAD_3D >= 1) THEN
  IF (LDUST) THEN
!Dust optical depth between two vertical levels
    YRECFM      = 'DSTAOD3D'
    YCOMMENT    = 'X_Y_Z_DuST Aerosol Optical Depth (m)'
    ILENCH=LEN(YCOMMENT)
    ZWORK31(:,:,:)=0.
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)
    END DO
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
!Dust optical depth
    ZWORK21(:,:)=0.0
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      DO JJ=IJB,IJE
        DO JI=IIB,IIE
          ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,3)
        ENDDO
      ENDDO
    ENDDO
    YRECFM      = 'DSTAOD2D'
    YCOMMENT    = 'X_Y_DuST Aerosol Optical Depth (m)'
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
!Dust extinction (optical depth per km)
    YRECFM      = 'DSTEXT'
    YCOMMENT    = 'X_Y_Z_DuST EXTinction (1/km) '
    ILENCH=LEN(YCOMMENT)
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
    ENDDO
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
  END IF
  IF (LSALT) THEN
!Salt optical depth between two vertical levels
    YRECFM      = 'SLTAOD3D'
    YCOMMENT    = 'X_Y_Z_Salt Aerosol Optical Depth (m)'
    ILENCH=LEN(YCOMMENT)
    ZWORK31(:,:,:)=0.
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)
    END DO
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
!Salt optical depth
    ZWORK21(:,:)=0.0
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      DO JJ=IJB,IJE
        DO JI=IIB,IIE
          ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,2)
        ENDDO
      ENDDO
    ENDDO
    YRECFM      = 'SLTAOD2D'
    YCOMMENT    = 'X_Y_Salt Aerosol Optical Depth (m)'
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
!Salt extinction (optical depth per km)
    YRECFM      = 'SLTEXT'
    YCOMMENT    = 'X_Y_Z_Salt EXTinction (1/km) '
    ILENCH=LEN(YCOMMENT)
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
    ENDDO
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
  END IF
  IF (LORILAM) THEN
!Orilam anthropogenic optical depth between two vertical levels
    YRECFM      = 'AERAOD3D'
    YCOMMENT    = 'X_Y_Z_Anthropogenic Aerosol Optical Depth (m)'
    ILENCH=LEN(YCOMMENT)
    ZWORK31(:,:,:)=0.
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)
    END DO
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
!Orilam anthropogenic optical depth
    ZWORK21(:,:)=0.0
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      DO JJ=IJB,IJE
        DO JI=IIB,IIE
          ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,4)
        ENDDO
      ENDDO
    ENDDO
    YRECFM      = 'AERAOD2D'
    YCOMMENT    = 'X_Y_Anthropogenic Aerosol Optical Depth (m)'
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
!Orilam anthropogenic extinction (optical depth per km)
    YRECFM      = 'AEREXT'
    YCOMMENT    = 'X_Y_Z_Anthropogenic EXTinction (1/km) '
    ILENCH=LEN(YCOMMENT)
    DO JK=IKB,IKE
      IKRAD = JK - JPVEXT
      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
    ENDDO
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,YCOMMENT,IRESP)
  END IF

END IF
!
!-------------------------------------------------------------------------------
!
!* Brightness temperatures from the radiatif transfer code (Morcrette, 1991)
!
IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
  ALLOCATE (ZIRBT(IIU,IJU),ZWVBT(IIU,IJU))
  ITOTGEO=0
  IF (INDEX(CRAD_SAT,'GOES-E')   /= 0) THEN
    ITOTGEO= ITOTGEO+1
    INDGEO(ITOTGEO) = 1
    YNAM_SAT(ITOTGEO) = 'GOES-E'
  END IF
  IF (INDEX(CRAD_SAT,'GOES-W')   /= 0) THEN
    ITOTGEO= ITOTGEO+1
    INDGEO(ITOTGEO) = 2
    YNAM_SAT(ITOTGEO) = 'GOES-W'
  END IF
  IF (INDEX(CRAD_SAT,'GMS')      /= 0) THEN
    ITOTGEO= ITOTGEO+1
    INDGEO(ITOTGEO) = 3
    YNAM_SAT(ITOTGEO) = 'GMS'
  END IF
  IF (INDEX(CRAD_SAT,'INDSAT')   /= 0) THEN
    ITOTGEO= ITOTGEO+1
    INDGEO(ITOTGEO) = 4
    YNAM_SAT(ITOTGEO) = 'INDSAT'
  END IF
  IF (INDEX(CRAD_SAT,'METEOSAT') /= 0) THEN
    ITOTGEO= ITOTGEO+1
    INDGEO(ITOTGEO) = 5
    YNAM_SAT(ITOTGEO) = 'METEOSAT'
  END IF
  PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURES FOR ',ITOTGEO,' SATELLITE(S)'
  IF (NRR==1) THEN
    PRINT*,' THERE IS ONLY VAPOR WATER IN YOUR ATMOSPHERE'
    PRINT*,' IRBT WILL NOT TAKE INTO ACCOUNT CLOUDS.'
  END IF
  !
  DO JI=1,ITOTGEO
    ZIRBT(:,:) = XUNDEF
    ZWVBT(:,:) = XUNDEF
    CALL RADTR_SATEL(TDTCUR%TDATE%YEAR,TDTCUR%TDATE%MONTH,TDTCUR%TDATE%DAY, &
                     TDTCUR%TIME, NDLON, NFLEV, NSTATM, NRAD_COLNBR, XEMIS, &
                     XCCO2, XTSRAD, XSTATM, XTHT, XRT, XPABST, XZZ,         &
                     XSIGS, XMFCONV, XCLDFR, LUSERI, LSIGMAS,               &
                     LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT,              &
                     INDGEO(JI),VSIGQSAT ) 
    !
    YRECFM      =TRIM(YNAM_SAT(JI))//'_IRBT'
    YCOMMENT    =TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature (K)'
    IGRID       =1
    ILENCH      =LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZIRBT,IGRID,ILENCH,YCOMMENT,IRESP)
    !
    YRECFM      =TRIM(YNAM_SAT(JI))//'_WVBT'
    YCOMMENT    =TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature (K)'
    IGRID       =1
    ILENCH      =LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWVBT,IGRID,ILENCH,YCOMMENT,IRESP)
  END DO
  DEALLOCATE(ZIRBT,ZWVBT)
END IF
!
!-------------------------------------------------------------------------------
!
!* Brightness temperatures from the Radiatif Transfer for Tiros Operational
! Vertical Sounder (RTTOV) code (version 8.7)
!
IF (NRTTOVINFO(1,1) /= NUNDEF) THEN
  PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURE COMPUTED by RTTOV code'
  CALL CALL_RTTOV(NDLON, NFLEV, NSTATM, XEMIS, XTSRAD, XSTATM, XTHT, XRT,     &
                  XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB),   &
                  LUSERI, NRTTOVINFO, HFMFILE                                 )
END IF
!
!-------------------------------------------------------------------------------
!
!*       3.    DIAGNOSTIC RELATED TO SURFACE
!              -----------------------------
!
IF (CSURF=='EXTE') THEN
!! Since SURFEX7 (masdev49) XCURRENT_ZON10M and XCURRENT_MER10M
!! are equal to XUNDEF of SURFEX if the first atmospheric level
!! is under 10m
  CALL GET_SURF_UNDEF(ZUNDEF)
!
  ILEVEL=IKB 
  !While there are XUNDEF values and we aren't at model's top
  DO WHILE(ANY(XCURRENT_ZON10M(IIB:IIE,IJB:IJE)==ZUNDEF) .AND. (ILEVEL/=IKE-1) )

    !Where interpolation is needed and possible
    !(10m is between ILEVEL and ILEVEL+1 or 10m is below the bottom level)
    WHERE(XCURRENT_ZON10M(IIB:IIE,IJB:IJE)==ZUNDEF .AND. &
                   ( XZHAT(ILEVEL+1) + XZHAT(ILEVEL+2)) /2. >10.)

      !Interpolation between ILEVEL and ILEVEL+1
      XCURRENT_ZON10M(IIB:IIE,IJB:IJE)=XUT(IIB:IIE,IJB:IJE,ILEVEL) + &
            (XUT(IIB:IIE,IJB:IJE,ILEVEL+1)-XUT(IIB:IIE,IJB:IJE,ILEVEL)) * &
            ( 10.- (XZHAT(ILEVEL)+XZHAT(ILEVEL+1))/2. ) / &
           ( (XZHAT(ILEVEL+2)-XZHAT(ILEVEL)) /2.)
      XCURRENT_MER10M(IIB:IIE,IJB:IJE)=XVT(IIB:IIE,IJB:IJE,ILEVEL) + &
            (XVT(IIB:IIE,IJB:IJE,ILEVEL+1)-XVT(IIB:IIE,IJB:IJE,ILEVEL)) * &
            (10.- (XZHAT(ILEVEL)+XZHAT(ILEVEL+1))/2. ) / &                                    
           ( (XZHAT(ILEVEL+2)-XZHAT(ILEVEL)) /2.)
    END WHERE
    ILEVEL=ILEVEL+1 !level just higher
  END DO
  !

    YCOMMENT='X_Y_components of wind at 10m (m/s)'
    IGRID=0
    ! in this case (argument IGRID=0), input winds are ZONal and MERidien 
    !          and, output ones are in MesoNH grid   
    IF (.NOT. LCARTESIAN) THEN                                                 
      CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,IGRID,     &
            HFMFILE=HFMFILE,HRECU='UM10',HRECV='VM10',HCOMMENT=YCOMMENT)
    ELSE
     YRECFM      ='UM10'
     YCOMMENT    ='X_Y_UM10 (m/s)'
     IGRID       =1
     ILENCH      =LEN(YCOMMENT)
     CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_ZON10M,IGRID,ILENCH,YCOMMENT,IRESP)
     YRECFM      ='VM10'
     YCOMMENT    ='X_Y_VM10 (m/s)'
     IGRID       =1
     ILENCH      =LEN(YCOMMENT)
     CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_MER10M,IGRID,ILENCH,YCOMMENT,IRESP)
    ENDIF
    IF (SIZE(XTKET)>0) THEN
     ZWORK21(:,:)= 0.    
     ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2)
     ZWORK21(:,:) =ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB))
     YRECFM      ='FF10MAX'
     YCOMMENT    ='X_Y_FF10MAX (m/s)'
     IGRID       =1
     ILENCH      =LEN(YCOMMENT)
     CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
    END IF
  IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN
    YCOMMENT='CO2 flux (mg/m2/s)'
    ILENCH=LEN(YCOMMENT)
    YRECFM='SFCO2'
    IGRID=1
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_SFCO2,IGRID,ILENCH,   &
    YCOMMENT,IRESP)
  END IF
  !
  IF(ANY(XCURRENT_SW/=XUNDEF))THEN
    YCOMMENT='SW (W/m2)'
    ILENCH=LEN(YCOMMENT)
    YRECFM='SW'
    IGRID=1
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_SW,IGRID,ILENCH,      &
    YCOMMENT,IRESP)
  END IF
  !
  IF(ANY(XCURRENT_LW/=XUNDEF))THEN
    YCOMMENT='LW (W/m2)'
    ILENCH=LEN(YCOMMENT)
    YRECFM='LW'
    IGRID=1
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_LW,IGRID,ILENCH,      &
    YCOMMENT,IRESP)
  END IF
END IF

! MODIF FP NOV 2012
!-------------------------------------------------------------------------------
!
!*       4.     DIAGNOSTIC ON PRESSURE LEVELS
!               -----------------------------
!
IF (LISOPR .AND. XISOPR(1)/=0.) THEN
!
!
ALLOCATE(ZWORK32(IIU,IJU,IKU))
ALLOCATE(ZWORK33(IIU,IJU,IKU))
ALLOCATE(ZWORK34(IIU,IJU,IKU))
!
! *************************************************
! Determine the pressure level where to interpolate
! *************************************************
  IPRES=0
  DO JI=1,SIZE(XISOPR)
    IF (XISOPR(JI)<=10..OR.XISOPR(JI)>1000.) EXIT
    IPRES=IPRES+1
    WRITE(YCAR4,'(I4)') INT(XISOPR(JI))
    YPRES(IPRES)=ADJUSTL(YCAR4)
  END DO

  ALLOCATE(ZWRES(IIU,IJU,IPRES))
  ZWRES(:,:,:)=XUNDEF
  ALLOCATE(ZPRES(IIU,IJU,IPRES))
  IPRES=0
  DO JI=1,SIZE(XISOPR)
    IF (XISOPR(JI)<=10..OR.XISOPR(JI)>1000.) EXIT
    IPRES=IPRES+1
    ZPRES(:,:,IPRES)=XISOPR(JI)*100.
  END DO
  PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:)
!
!*       Standard Variables
!
! *********************
! Potential Temperature
! *********************
  CALL PINTER(XTHT, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
  DO JK=1,IPRES
    ZWORK21(:,:) = ZWRES(:,:,JK)
    YRECFM='THT'//TRIM(YPRES(JK))//'HPA'
    YCOMMENT='X_Y_potential temperature '//TRIM(YPRES(JK))//'hPa (K)'
    IGRID=1
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
  END DO
! *********************
! Wind
! *********************
  ZWORK31(:,:,:) = MXF(XUT(:,:,:))
  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
  DO JK=1,IPRES
    ZWORK21(:,:) = ZWRES(:,:,JK)
    YRECFM='UT'//TRIM(YPRES(JK))//'HPA'
    YCOMMENT='X_Y_U component of wind '//TRIM(YPRES(JK))//'hPa (m/s)'
    IGRID=1
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
  END DO
  !
  ZWORK31(:,:,:) = MYF(XVT(:,:,:))
  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
          IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
  DO JK=1,IPRES
    ZWORK21(:,:) = ZWRES(:,:,JK)
    YRECFM='VT'//TRIM(YPRES(JK))//'HPA'
    YCOMMENT='X_Y_V component of wind '//TRIM(YPRES(JK))//'hPa (m/s)'
    IGRID=1
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
  END DO
! *********************
! Water Vapour Mixing Ratio
! *********************
  CALL PINTER(XRT(:,:,:,1), XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
  DO JK=1,IPRES
    ZWORK21(:,:) = 1.E+3*ZWRES(:,:,JK)
    YRECFM='MRV'//TRIM(YPRES(JK))//'HPA'
    YCOMMENT='X_Y_Vapor Mixing Ratio '//TRIM(YPRES(JK))//'hPa (g/kg)'
    IGRID=1
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
  END DO
! *********************
! Geopotential in meters
! *********************
  ZWORK31(:,:,:) = MZF(1,IKU,1,XZZ(:,:,:))
  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
           IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
  DO JK=1,IPRES
    ZWORK21(:,:) = ZWRES(:,:,JK)
    YRECFM='ALT'//TRIM(YPRES(JK))//'HPA'
    YCOMMENT='X_Y_ALTitude '//TRIM(YPRES(JK))//'hPa (m)'
    IGRID=1
    ILENCH=LEN(YCOMMENT)
    CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
  END DO
!
  DEALLOCATE(ZWRES,ZPRES,ZWORK32,ZWORK33,ZWORK34)
END IF
!
!-------------------------------------------------------------------------------
!
!*       5.     DIAGNOSTIC ON POTENTIEL TEMPERATURE LEVELS
!               -----------------------------
!
IF (LISOTH .AND.XISOTH(1)/=0.) THEN
!
!
ALLOCATE(ZWORK32(IIU,IJU,IKU))
ALLOCATE(ZWORK33(IIU,IJU,IKU))
ALLOCATE(ZWORK34(IIU,IJU,IKU))
!
! *************************************************
! Determine the potentiel temperature level where to interpolate
! *************************************************
  ITH=0
  DO JI=1,SIZE(XISOTH)
    IF (XISOTH(JI)<=100..OR.XISOTH(JI)>1000.) EXIT
    ITH=ITH+1
    WRITE(YCAR4,'(I4)') INT(XISOTH(JI))
    YTH(ITH)=ADJUSTL(YCAR4)
  END DO

  ALLOCATE(ZWTH(IIU,IJU,ITH))
  ZWTH(:,:,:)=XUNDEF
  ALLOCATE(ZTH(ITH))
  ZTH(:) = XISOTH(1:ITH)

  PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:)
!
!*       Standard Variables
!
! *********************
! Pressure
! *********************