Skip to content
Snippets Groups Projects
write_lfifm1_for_diag_supp.f90 33.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • !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
    
    !-------------------------------------------------------------------------------
    !
    !*       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_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=NIMAX+2*JPHEXT
    IJU=NJMAX+2*JPHEXT
    IKU=NKMAX+2*JPVEXT
    IIB=1+JPHEXT
    IJB=1+JPHEXT
    IKB=1+JPVEXT
    IIE=IIU-JPHEXT
    IJE=IJU-JPHEXT
    IKE=IKU-JPVEXT
    !
    ALLOCATE(ZWORK21(IIU,IJU))
    ALLOCATE(ZWORK31(IIU,IJU,IKU))
    ALLOCATE(ZTEMP(IIU,IJU,IKU))
    
    ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD)
    
    212 213 214 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 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713
    !
    #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
    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
    ! *********************
    
      CALL ZINTER(XPABST, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
    
      DO JK=1,ITH
        ZWORK21(:,:) = ZWTH(:,:,JK)
    
        YRECFM='PABST'//TRIM(YTH(JK))//'K'
    
        YCOMMENT='X_Y_pressure '//TRIM(YTH(JK))//'K (Pa)'
        IGRID=1
        ILENCH=LEN(YCOMMENT)
        CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
      END DO
    ! *********************
    ! Potential Vorticity
    ! *********************
      ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU )
    
      ZVOX(:,:,:)=GY_W_VW(1,IKU,1,XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(1,IKU,1,XVT,XDZZ)
    
      ZVOX(:,:,2)=ZVOX(:,:,3)
    
      ZVOY(:,:,:)=GZ_U_UW(1,IKU,1,XUT,XDZZ)-GX_W_UW(1,IKU,1,XWT,XDXX,XDZZ,XDZX)
    
      ZVOY(:,:,2)=ZVOY(:,:,3)
    
      ZVOZ(:,:,:)=GX_V_UV(1,IKU,1,XVT,XDXX,XDZZ,XDZX)-GY_U_UV(1,IKU,1,XUT,XDYY,XDZZ,XDZY)
    
      ZVOZ(:,:,2)=ZVOZ(:,:,3)
      ZVOZ(:,:,1)=ZVOZ(:,:,3)
    
      ZWORK31(:,:,:)=GX_M_M(1,IKU,1,XTHT,XDXX,XDZZ,XDZX)
      ZWORK32(:,:,:)=GY_M_M(1,IKU,1,XTHT,XDYY,XDZZ,XDZY)
      ZWORK33(:,:,:)=GZ_M_M(1,IKU,1,XTHT,XDZZ)
    
      ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(1,IKU,1,MYF(ZVOX(:,:,:)))     &
      + ZWORK32(:,:,:)*MZF(1,IKU,1,MXF(ZVOY(:,:,:)))     &
       + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
      ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
      ZPOVO(:,:,1)  =-1.E+11
      ZPOVO(:,:,IKU)=-1.E+11
    
      CALL ZINTER(ZPOVO, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
    
      DO JK=1,ITH
       ZWORK21(:,:) = ZWTH(:,:,JK)
    
       YRECFM='POVOT'//TRIM(YTH(JK))//'K'
    
       YCOMMENT='X_Y_POtential VOrticity '//TRIM(YTH(JK))//'K (PVU)'
       IGRID=1
       ILENCH=LEN(YCOMMENT)
       CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
      END DO
    ! *********************
    ! Wind
    ! *********************
    
      ZWORK31(:,:,:) = MXF(XUT(:,:,:))
      CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
    
      DO JK=1,ITH
        ZWORK21(:,:) = ZWTH(:,:,JK)
    
        YRECFM='UT'//TRIM(YTH(JK))//'K'
    
        YCOMMENT='X_Y_U component of wind '//TRIM(YTH(JK))//'K (m/s)'
        IGRID=1
        ILENCH=LEN(YCOMMENT)
        CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
      END DO
      !
    
      ZWORK31(:,:,:) = MYF(XVT(:,:,:))
      CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
    
      DO JK=1,ITH
        ZWORK21(:,:) = ZWTH(:,:,JK)
    
        YRECFM='VT'//TRIM(YTH(JK))//'K'
    
        YCOMMENT='X_Y_V component of wind '//TRIM(YTH(JK))//'K (m/s)'
        IGRID=1
        ILENCH=LEN(YCOMMENT)
        CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
      END DO
    !
      DEALLOCATE(ZWTH,ZTH,ZWORK32,ZWORK33,ZWORK34)
    END IF
    !
    !
    DEALLOCATE(ZWORK21,ZWORK31,ZTEMP)
    !
    END SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP