Skip to content
Snippets Groups Projects
Forked from Méso-NH / Méso-NH code
4017 commits behind the upstream repository.
aircraft_balloon_evol.f90 69.06 KiB
!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: /home/cvsroot/MNH-VX-Y-Z/src/MNH/aircraft_balloon_evol.f90,v $ $Revision: 1.1.8.1.2.4.2.1.10.1.2.4 $
! MASDEV4_7 balloon 2006/05/18 13:07:25
!-----------------------------------------------------------------
!      ##########################
MODULE MODI_AIRCRAFT_BALLOON_EVOL
!      ##########################
!
INTERFACE
!
      SUBROUTINE AIRCRAFT_BALLOON_EVOL(HLUOUT, PTSTEP,       &
                       TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR,   &
                       PXHAT, PYHAT, PZ,                     &
                       PMAP, PLONOR, PLATOR,                 &
                       PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
                       PTS, PRHODREF, PCIT,TPFLYER, PSEA     )
!
USE MODD_TYPE_DATE
USE MODD_AIRCRAFT_BALLOON
!
CHARACTER(LEN=*),         INTENT(IN)     :: HLUOUT ! output listing
REAL,                     INTENT(IN)     :: PTSTEP ! time step
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTEXP! experiment date and time
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTMOD! model start date and time
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTSEG! segment date and time
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTCUR! current date and time
REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
REAL,                     INTENT(IN)     :: PLATOR ! origine latitude
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
!
TYPE(FLYER),              INTENT(INOUT)  :: TPFLYER! balloon/aircraft
REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
!
!-------------------------------------------------------------------------------
!
END SUBROUTINE AIRCRAFT_BALLOON_EVOL
!
END INTERFACE
!
END MODULE MODI_AIRCRAFT_BALLOON_EVOL
!
!     ########################################################
      SUBROUTINE AIRCRAFT_BALLOON_EVOL(HLUOUT, PTSTEP,       &
                       TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR,   &
                       PXHAT, PYHAT, PZ,                     &
                       PMAP, PLONOR, PLATOR,                 &
                       PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
                       PTS, PRHODREF, PCIT,TPFLYER, PSEA     )
!     ########################################################
!
!
!!****  *AIRCRAFT_BALLOON_EVOL* - (advects and) stores 
!!                                balloons/aircrafts in the model
!!
!!    PURPOSE
!!    -------
!
!
!!**  METHOD
!!    ------
!!    
!! 1) All the balloons are tested. If the current balloon is
!!     a) in the current model
!!     b) not crashed
!!   the following computations are done.
!!
!! 2) The balloon position is computed.
!!       Interpolations at balloon positions are performed according to mass
!! points (because density is computed here for iso-density balloons).
!! Therefore, all model variables are used at mass points. Shuman averaging
!! are performed on X, Y, Z, U, V, W.
!!
!! 3) Storage of balloon data
!!       If storage is asked for this time-step, the data are recorded in the
!! balloon time-series.
!!
!! 4) Balloon advection
!!       If the balloon is launched, it is advected according its type
!!    a) iso-density balloons are advected following horizontal wind.
!!          the slope of the iso-density surfaces is neglected.
!!    b) radio-sounding balloons are advected according to all wind velocities.
!!          the vertical ascent speed is added to the vertical wind speed.  
!!    c) Constant Volume balloons are advected according to all wind velocities.
!!          the vertical ascent speed is computed using the balloon equation
!!  
!!
!!    EXTERNAL
!!    --------
!!
!!    IMPLICIT ARGUMENTS
!!    ------------------
!!
!!    REFERENCE
!!    ---------
!!
!!    AUTHOR
!!    ------
!!      Valery Masson             * Meteo-France *
!!
!!    MODIFICATIONS
!!    -------------
!!     Original 15/05/2000
!!     Apr,19, 2001 (G.Jaubert) add CVBALL type
!!     March, 2008 (P.Lacarrere) Add 3D fluxes
!!     Dec,12, 2008 (M. Leriche) move ZTDIST out from if.not.(tpflyer%fly)
!!     Dec,15, 2008 (V. Masson) correct do while aircraft move
!!     March, 2013 (O.Caumont) add radar reflectivities
!!     April, 2014 (C.Lac) allow RARE calculation only if CCLOUD=ICE3
!!     May, 2014 (O.Caumont) modify RARE for hydrometeors containing ice
!!                           add bright band calculation for RARE
!!     Feb, 2015 (C.Lac) Correction to prevent aircraft crash 
!!     July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
!!                                      aircraft, ballon and profiler
!!      October, 2016 (G.DELAUTIER) LIMA
!!
!! --------------------------------------------------------------------------
!       
!*      0. DECLARATIONS
!          ------------
!
USE MODD_TYPE_DATE
!
USE MODD_PARAMETERS
USE MODD_CST
USE MODD_AIRCRAFT_BALLOON
USE MODD_GRID
USE MODD_TIME
USE MODD_CONF
USE MODD_DIAG_IN_RUN
USE MODD_TURB_FLUX_AIRCRAFT_BALLOON
USE MODD_PARAM_n, ONLY : CCLOUD
!
USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,&
                               XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,&
                               XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,&
                               XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,&
                               XALPHAC2_I=>XALPHAC2,XNUC2_I=>XNUC2,&
                               XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XLBEXS_I=>XLBEXS,&
                               XLBS_I=>XLBS,XCCS_I=>XCCS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,&
                               XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,&
                               XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,&
                               XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,&
                               XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,&
                               XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA
USE MODE_FSCATTER,ONLY : QEPSW,QEPSI,BHMIE,MOMG,MG
USE MODE_FGAU,    ONLY : GAULAG
USE MODD_REF_n,   ONLY : XRHODREF
USE MODI_GAMMA,   ONLY : GAMMA
USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,&
                                XBC_L=>XBC,XAC_L=>XAC
USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,&
                                XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,&
                                XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS

USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,&
                                XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG
USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,&
                           XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,&
                           XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC
!
USE MODE_ll
USE MODE_IO_ll
USE MODE_GRIDPROJ
!
USE MODI_WATER_SUM
USE MODI_TEMPORAL_DIST
!
USE MODD_NESTING
!
USE MODD_NSV, ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC
!
IMPLICIT NONE
!
!
!*      0.1  declarations of arguments
!
!
CHARACTER(LEN=*),         INTENT(IN)     :: HLUOUT ! output listing
REAL,                     INTENT(IN)     :: PTSTEP ! time step
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTEXP! experiment date and time
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTMOD! model start date and time
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTSEG! segment date and time
TYPE(DATE_TIME),          INTENT(IN)     :: TPDTCUR! current date and time
REAL, DIMENSION(:),       INTENT(IN)     :: PXHAT  ! x coordinate
REAL, DIMENSION(:),       INTENT(IN)     :: PYHAT  ! y coordinate
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
REAL,                     INTENT(IN)     :: PLATOR ! origine latitude
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
!
TYPE(FLYER),              INTENT(INOUT)  :: TPFLYER! balloon/aircraft
REAL, DIMENSION(:,:),     INTENT(IN)     :: PSEA
!
!-------------------------------------------------------------------------------
!
!       0.2  declaration of local variables
!
!
INTEGER :: IMI        ! model index
REAL    :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0
REAL    :: ZTIMEEXP   ! elpased time between start of experiment and segment
!
INTEGER :: IIB        ! current processor domain sizes
INTEGER :: IJB
INTEGER :: IIE
INTEGER :: IJE
INTEGER :: IIU
INTEGER :: IJU
INTEGER :: IKB
INTEGER :: IKE
INTEGER :: IKU
!
INTEGER :: JK         ! loop index
!
REAL, DIMENSION(SIZE(PXHAT))        :: ZXHATM ! mass point coordinates
REAL, DIMENSION(SIZE(PYHAT))        :: ZYHATM ! mass point coordinates
!
REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZM    ! mass point coordinates
REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZU    ! U points z coordinates
REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZV    ! V points z coordinates
REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZWM    ! mass point wind
!
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTHV   ! virtual potential temperature
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTV    ! virtual temperature
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTEMP  ! temperature
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZEXN   ! Exner function
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZRHO   ! air density
REAL                                :: ZFLYER_EXN ! balloon/aircraft Exner func.
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTHW_FLUX  !       
REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZRCW_FLUX  !
REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4))    :: ZSVW_FLUX
!
REAL    :: ZTDIST   ! time until launch (sec)
LOGICAL :: GLAUNCH  ! launch/takeoff is effective at this time-step (if true)
LOGICAL :: GSTORE   ! storage occurs at this time step
!
INTEGER :: II       ! mass balloon position (x index)
INTEGER :: IJ       ! mass balloon position (y index)
INTEGER :: IU       ! U flux point balloon position (x index)
INTEGER :: IV       ! V flux point balloon position (y index)
INTEGER :: IDU      ! difference between IU and II
INTEGER :: IDV      ! difference between IV and IJ
!
INTEGER :: IK00     ! balloon position for II  , IJ
INTEGER :: IK01     ! balloon position for II  , IJ+1
INTEGER :: IK10     ! balloon position for II+1, IJ
INTEGER :: IK11     ! balloon position for II+1, IJ+1
INTEGER :: IU00     ! balloon position for IU  , IJ
INTEGER :: IU01     ! balloon position for IU  , IJ+1
INTEGER :: IU10     ! balloon position for IU+1, IJ
INTEGER :: IU11     ! balloon position for IU+1, IJ+1
INTEGER :: IV00     ! balloon position for II  , IV
INTEGER :: IV01     ! balloon position for II  , IV+1
INTEGER :: IV10     ! balloon position for II+1, IV
INTEGER :: IV11     ! balloon position for II+1, IV+1
!
REAL :: ZXCOEF      ! X direction interpolation coefficient
REAL :: ZUCOEF      ! X direction interpolation coefficient (for U)
REAL :: ZYCOEF      ! Y direction interpolation coefficient
REAL :: ZVCOEF      ! Y direction interpolation coefficient (for V)
!
REAL :: ZZCOEF00    ! Z direction interpolation coefficient for II  , IJ
REAL :: ZZCOEF01    ! Z direction interpolation coefficient for II  , IJ+1
REAL :: ZZCOEF10    ! Z direction interpolation coefficient for II+1, IJ
REAL :: ZZCOEF11    ! Z direction interpolation coefficient for II+1, IJ+1
REAL :: ZUCOEF00    ! Z direction interpolation coefficient for IU  , IJ
REAL :: ZUCOEF01    ! Z direction interpolation coefficient for IU  , IJ+1
REAL :: ZUCOEF10    ! Z direction interpolation coefficient for IU+1, IJ
REAL :: ZUCOEF11    ! Z direction interpolation coefficient for IU+1, IJ+1
REAL :: ZVCOEF00    ! Z direction interpolation coefficient for II  , IV
REAL :: ZVCOEF01    ! Z direction interpolation coefficient for II  , IV+1
REAL :: ZVCOEF10    ! Z direction interpolation coefficient for II+1, IV
REAL :: ZVCOEF11    ! Z direction interpolation coefficient for II+1, IV+1
!
INTEGER :: IN       ! time index
INTEGER :: JLOOP,JLOOP2    ! loop counter
!
REAL    :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
REAL    :: ZV_BAL   ! horizontal wind speed at balloon location (along y)
REAL    :: ZW_BAL   ! vertical   wind speed at balloon location (along z)
REAL    :: ZMAP     ! map factor at balloon location
REAL    :: ZGAM     ! rotation between meso-nh base and spherical lat-lon base.
INTEGER :: IL       ! flight segment index
REAL    :: ZSEG_FRAC! fraction of flight in the current segment
REAL    :: ZRO_BAL  ! air density at balloon location
!
INTEGER :: IINFO_ll ! return code
INTEGER :: ILUOUT   ! logical unit
INTEGER :: IRESP    ! return code
!
! specific to cloud radar
REAL, DIMENSION(SIZE(PR,3))    :: ZTEMPZ! vertical profile of temperature
REAL, DIMENSION(SIZE(PR,3))    :: ZRHODREFZ ! vertical profile of dry air density of the reference state
REAL, DIMENSION(SIZE(PR,3))    :: ZCIT     ! pristine ice concentration
REAL, DIMENSION(SIZE(PR,3))    :: ZCCI,ZCCR,ZCCC     ! ICE,RAIN CLOUD concentration (LIMA)
REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3))    :: ZR   
REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ  ! vertical profile of hydrometeor mixing ratios
REAL                           :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZRHOHYD   ! generic microphysical parameters
INTEGER                        :: JJ    ! loop counter for quadrature
COMPLEX                        :: QMW,QMI,QM,QB,QEPSIW,QEPSWI   ! dielectric parameter
REAL                           :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters
REAL,DIMENSION(:),ALLOCATABLE  :: ZAELOC,ZZMZ ! temporary arrays
INTEGER                        :: JPTS_GAULAG=7 ! number of points for Gauss-Laguerre quadrature
REAL                           :: ZLBDA   ! slope distribution parameter
REAL                           :: ZFRAC_ICE  ! ice water fraction
REAL                           :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point
REAL                           :: ZFW ! liquid fraction
REAL                           :: ZFPW ! weight for mixed-phase reflectivity
REAL,DIMENSION(:),ALLOCATABLE  :: ZX,ZW ! Gauss-Laguerre points and weights
REAL,DIMENSION(:),ALLOCATABLE  :: ZRTMIN ! local values for XRTMIN
LOGICAL                        :: GCALC
!----------------------------------------------------------------------------
!
!*      1.   PRELIMINARIES
!            -------------
!
IF(.NOT. ALLOCATED(XTHW_FLUX)) &
ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
IF(.NOT. ALLOCATED(XRCW_FLUX)) &
ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)))
IF(.NOT. ALLOCATED(XSVW_FLUX)) &
ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)))
CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
!
ZR = 0.
!
!*      1.0  initialization of processor test
!            --------------------------------
!
ZTHIS_PROC=0.
!
!
!*      1.1  test on the model
!            -----------------
!
CALL GET_MODEL_NUMBER_ll  (IMI)
!
!
IF (TPFLYER%MODEL  /= 'FIX' .AND. COUNT(NDAD(:) == IMI) /= 0 &
   .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) &
   .AND. TPFLYER%X_CUR /= XUNDEF .AND. TPFLYER%Y_CUR /= XUNDEF &
   .AND.  TPFLYER%FLY .AND. .NOT. TPFLYER%CRASH &
   .AND. CPROGRAM == 'MESONH' ) THEN
  CALL FLYER_CHANGE_MODEL(IMI)
ENDIF
!
IF ( TPFLYER%NMODEL /= IMI ) RETURN
!
!----------------------------------------------------------------------------
!
!*      2.   PRELIMINARIES-2
!            -------------
!
!*      2.1  Indices
!            -------
!
CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
IKB =   1   + JPVEXT
IKE = SIZE(PZ,3) - JPVEXT
IKU = SIZE(PZ,3)
!
!
!*      2.2  Interpolations of model variables to mass points
!            ------------------------------------------------
!
IIU=SIZE(PXHAT)
IJU=SIZE(PYHAT)
!
ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU  )
ZXHATM(  IIU  )=1.5*PXHAT(  IIU  )-0.5*PXHAT(  IIU-1)
!
ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU  )
ZYHATM(  IJU  )=1.5*PYHAT(  IJU  )-0.5*PYHAT(  IJU-1)
!----------------------------------------------------------------------------
!
!*      2.3  Compute time until launch by comparison of dates and times
!            ----------------------------------------------------------
!
CALL TEMPORAL_DIST( TPDTCUR%TDATE%YEAR        , &
                    TPDTCUR%TDATE%MONTH       , &
                    TPDTCUR%TDATE%DAY         , &
                    TPDTCUR%TIME              , &
                    TPFLYER%LAUNCH%TDATE%YEAR , &
                    TPFLYER%LAUNCH%TDATE%MONTH, &
                    TPFLYER%LAUNCH%TDATE%DAY  , &
                    TPFLYER%LAUNCH%TIME - .001, &
                    ZTDIST                      )
!
!*      3.   LAUNCH
!            ------
!
GLAUNCH     = .FALSE.
!
!
IF (.NOT. TPFLYER%FLY) THEN
!
!
!*      3.1  comparison of dates and times
!            -----------------------------
!
!  CALL TEMPORAL_DIST( TPDTCUR%TDATE%YEAR        , &
!                     TPDTCUR%TDATE%MONTH       , &
!                     TPDTCUR%TDATE%DAY         , &
!                     TPDTCUR%TIME              , &
!                     TPFLYER%LAUNCH%TDATE%YEAR , &
!                     TPFLYER%LAUNCH%TDATE%MONTH, &
!                     TPFLYER%LAUNCH%TDATE%DAY  , &
!                     TPFLYER%LAUNCH%TIME - .001, &
!                     ZTDIST                      )
!
!
!*      3.2  launch/takeoff is effective
!            ---------------------------
!
  IF (ZTDIST >= - PTSTEP .AND. ZTDIST /= XUNDEF ) THEN
    IF (TPFLYER%TYPE=='AIRCRA') THEN
!
!*     3.2.1 Determination of flight segment
!            -------------------------------
!
      TPFLYER%SEGCURN = 1
      IL = TPFLYER%SEGCURN
      !
      TPFLYER%SEGCURT = ZTDIST
      !
      DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL) .AND. IL <= TPFLYER%SEG)
        TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1
        IL = TPFLYER%SEGCURN
        TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1)
        IF (IL>TPFLYER%SEG) EXIT
      END DO
      !
      !* end of flight
      !
      IF (IL > TPFLYER%SEG) THEN
        TPFLYER%FLY=.FALSE.
      ELSE
        TPFLYER%FLY = .TRUE.
        GLAUNCH     = .TRUE.
        TPFLYER%CRASH=.FALSE.
        IF (ZTDIST <= PTSTEP ) THEN
          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
          WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' takes off the   ',      &
                      TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/',      &
                      TPDTCUR%TDATE%YEAR,' at ',NINT(TPDTCUR%TIME),' sec.'
          WRITE(ILUOUT,*) '-------------------------------------------------------------------'
        ENDIF
      ENDIF
    ELSE IF (ZTDIST <= PTSTEP ) THEN
      TPFLYER%FLY = .TRUE.
      GLAUNCH     = .TRUE.
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
      WRITE(ILUOUT,*) 'Balloon  ',TPFLYER%TITLE,' is launched the ',      &
                    TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/',      &
                    TPDTCUR%TDATE%YEAR,' at ',NINT(TPDTCUR%TIME),' sec.'
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
    END IF
!
!*      3.3  Initial horizontal positions
!            ----------------------------
!
    IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
      TPFLYER%X_CUR = TPFLYER%XLAUNCH
      TPFLYER%Y_CUR = TPFLYER%YLAUNCH
    END IF
    IF (TPFLYER%TYPE=='AIRCRA') THEN
!
!
!*       3.3.2 Determination of initial position
!              -----------------------------
!
      IF (TPFLYER%FLY) THEN
        ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL)
        !
        TPFLYER%X_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGX(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGX(IL+1)
        TPFLYER%Y_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGY(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGY(IL+1)
      END IF
!
    END IF
  END IF
END IF
!
!*      3.4  instant of storage
!            ------------------
!
IF ( TPFLYER%T_CUR == XUNDEF ) TPFLYER%T_CUR = TPFLYER%STEP - PTSTEP
!
TPFLYER%T_CUR = TPFLYER%T_CUR + PTSTEP
!
IF ( TPFLYER%T_CUR >= TPFLYER%STEP - 1.E-10 ) THEN
  GSTORE = .TRUE.
  TPFLYER%T_CUR = TPFLYER%T_CUR - TPFLYER%STEP
  TPFLYER%N_CUR = TPFLYER%N_CUR + 1
END IF
!
IF (GSTORE) THEN
  IN = TPFLYER%N_CUR
  CALL TEMPORAL_DIST(TDTSEG%TDATE%YEAR,TDTSEG%TDATE%MONTH,TDTSEG%TDATE%DAY, &
         TDTSEG%TIME,TDTEXP%TDATE%YEAR,TDTEXP%TDATE%MONTH,TDTEXP%TDATE%DAY, &
         TDTEXP%TIME,ZTIMEEXP)
  !
  TPFLYER%TIME(IN) = (IN-1) * TPFLYER%STEP + ZTIMEEXP
  TPFLYER%DATIME( 1,IN) = TPDTEXP%TDATE%YEAR
  TPFLYER%DATIME( 2,IN) = TPDTEXP%TDATE%MONTH
  TPFLYER%DATIME( 3,IN) = TPDTEXP%TDATE%DAY
  TPFLYER%DATIME( 4,IN) = TPDTEXP%TIME
  TPFLYER%DATIME( 5,IN) = TPDTSEG%TDATE%YEAR
  TPFLYER%DATIME( 6,IN) = TPDTSEG%TDATE%MONTH
  TPFLYER%DATIME( 7,IN) = TPDTSEG%TDATE%DAY
  TPFLYER%DATIME( 8,IN) = TPDTSEG%TIME
  TPFLYER%DATIME( 9,IN) = TPDTMOD%TDATE%YEAR
  TPFLYER%DATIME(10,IN) = TPDTMOD%TDATE%MONTH
  TPFLYER%DATIME(11,IN) = TPDTMOD%TDATE%DAY
  TPFLYER%DATIME(12,IN) = TPDTMOD%TIME
  TPFLYER%DATIME(13,IN) = TPDTCUR%TDATE%YEAR
  TPFLYER%DATIME(14,IN) = TPDTCUR%TDATE%MONTH
  TPFLYER%DATIME(15,IN) = TPDTCUR%TDATE%DAY
  TPFLYER%DATIME(16,IN) = TPDTCUR%TIME
END IF
!
IF ( TPFLYER%FLY) THEN
!
!----------------------------------------------------------------------------
!
!*      4.   FLYER POSITION
!            --------------
!
!*      4.1  X position
!            ----------
!
  IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR )
  II=COUNT( ZXHATM(:)<=TPFLYER%X_CUR )
!
  IF (IU<IIB   .AND. LWEST_ll()) THEN
    IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN 
      TPFLYER%CRASH=.TRUE.
    ELSE
      II=IIB
      IU=IIB
    END IF
  END IF
  IF (IU>IIE     .AND. LEAST_ll())  THEN
    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
      TPFLYER%CRASH=.TRUE.
    ELSE
      II=IIE
      IU=IIE
    END IF
  END IF
!
!
!*      4.2  Y position
!            ----------
!
  IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR )
  IJ=COUNT( ZYHATM(:)<=TPFLYER%Y_CUR )
!
  IF (IV<IJB   .AND. LSOUTH_ll()) THEN
    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
      TPFLYER%CRASH=.TRUE.
    ELSE
      IJ=IJB
      IV=IJB
    END IF
  END IF
  IF (IV>IJE     .AND. LNORTH_ll()) THEN
    IF (TPFLYER%MODEL == 'FIX'  .OR. TPFLYER%NMODEL == 1) THEN 
      TPFLYER%CRASH=.TRUE.
    ELSE
      IJ=IJE
      IV=IJE
    END IF
  END IF
!
!
!*      4.3  Position of balloon according to processors
!            -------------------------------------------
!
  IF (IU>=IIB .AND. IU<=IIE .AND. IV>=IJB .AND. IV<=IJE) ZTHIS_PROC=1.
!
!
!*      4.4  Computations only on correct processor
!            --------------------------------------
!
!----------------------------------------------------------------------------
  IF (ZTHIS_PROC>0. .AND. .NOT. TPFLYER%CRASH) THEN
!----------------------------------------------------------------------------
!
!*      4.5  Interpolations of model variables to mass points
!            ------------------------------------------------
!

    ZZM(:,:,1:IKU-1)=0.5 *PZ(II  :II+1,IJ  :IJ+1,1:IKU-1)+0.5 *PZ(II  :II+1,IJ  :IJ+1,2:IKU  )
    ZZM(:,:,  IKU  )=1.5 *PZ(II  :II+1,IJ  :IJ+1,  IKU-1)-0.5 *PZ(II  :II+1,IJ  :IJ+1,  IKU-2)
!
    IDU = IU - II
    ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II-1:IDU+II,  IJ  :IJ+1,1:IKU-1)+0.25*PZ(IDU+II-1:IDU+II  ,IJ  :IJ+1,2:IKU  ) &
                  +0.25*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,1:IKU-1)+0.25*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,2:IKU  )
    ZZU(:,:,  IKU  )=0.75*PZ(IDU+II-1:IDU+II  ,IJ  :IJ+1,  IKU-1)-0.25*PZ(IDU+II-1:IDU+II  ,IJ  :IJ+1,  IKU-2) &
                  +0.75*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,  IKU-1)-0.25*PZ(IDU+II  :IDU+II+1,IJ  :IJ+1,  IKU-2)

    IDV = IV - IJ 
    ZZV(:,:,1:IKU-1)=0.25*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,1:IKU-1)+0.25*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,2:IKU  ) &
                  +0.25*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,1:IKU-1)+0.25*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,2:IKU  )
    ZZV(:,:,  IKU  )=0.75*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,  IKU-1)-0.25*PZ(II  :II+1,IDV+IJ-1:IDV+IJ  ,  IKU-2) &
                  +0.75*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,  IKU-1)-0.25*PZ(II  :II+1,IDV+IJ  :IDV+IJ+1,  IKU-2)
!
!
    ZWM(:,:,1:IKU-1)=0.5*PW(II:II+1,IJ:IJ+1,1:IKU-1)+0.5*PW(II:II+1,IJ:IJ+1,2:IKU  )
    ZWM(:,:,  IKU  )=1.5*PW(II:II+1,IJ:IJ+1,  IKU-1)-0.5*PW(II:II+1,IJ:IJ+1,  IKU-2)
!
!----------------------------------------------------------------------------
!
!*      5.   BALLOON/AIRCRAFT VERTICAL POSITION
!            ----------------------------------
!
!
!*      5.1  Density
!            -------
!
    ZEXN(:,:,:    ) = (PP(II:II+1,IJ:IJ+1,:)/XP00)**(XRD/XCPD)
    DO JK=IKB-1,1,-1
      ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK+1) - 0.5 * ZEXN(:,:,JK+2)
    END DO
    DO JK=IKE+1,IKU
      ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK-1) - 0.5 * ZEXN(:,:,JK-2)
    END DO
    !
    IF (TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL' &
        .OR. TPFLYER%TYPE=='AIRCRA' ) THEN
      ZTHV(:,:,:) = PTH(II:II+1,IJ:IJ+1,:)
      IF (SIZE(PR,4)>0)                                                     &
      ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV/XRD*PR(II:II+1,IJ:IJ+1,:,1) )  &
                                / ( 1. + WATER_SUM(PR(II:II+1,IJ:IJ+1,:,:)) )
      !
      ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:)
      ZRHO(:,:,:) = PP(II:II+1,IJ:IJ+1,:) / (XRD*ZTV(:,:,:))
      DO JK=IKB-1,1,-1
        ZRHO(:,:,JK) = 1.5 * ZRHO(:,:,JK+1) - 0.5 * ZRHO(:,:,JK+2)
      END DO
      DO JK=IKE+1,IKU
        ZRHO(:,:,JK) = 1.5 * ZRHO(:,:,JK-1) - 0.5 * ZRHO(:,:,JK-2)
      END DO
     ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II:II+1,IJ:IJ+1,:)
     ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II:II+1,IJ:IJ+1,:)
    END IF

!
!*      5.2  Initial vertical positions
!            --------------------------
!
    IF (GLAUNCH) THEN
!
!*      5.2.1 Iso-density balloon
!
      IF (TPFLYER%TYPE=='ISODEN') THEN
        ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
        ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
        ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
        ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
        IF ( TPFLYER%ALT /= XUNDEF ) THEN
          IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1)
          IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1)
          IK10 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,1,:)), 1)
          IK11 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,2,:)), 1)
          ZZCOEF00 = (TPFLYER%ALT - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
          ZZCOEF01 = (TPFLYER%ALT - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
          ZZCOEF10 = (TPFLYER%ALT - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
          ZZCOEF11 = (TPFLYER%ALT - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
          TPFLYER%RHO = FLYER_INTERP(ZRHO)
        ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN
          ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD)
          IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
          IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
          IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
          IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
          ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00))
          ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01))
          ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10))
          ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11))
          TPFLYER%RHO = FLYER_INTERP(ZRHO)
        ELSE
          WRITE(ILUOUT,*) 'Error in balloon initial position (balloon ',TPFLYER%TITLE,' )'
          WRITE(ILUOUT,*) 'neither initial ALTITUDE or PRESsure is given'
          WRITE(ILUOUT,*) 'Check your INI_BALLOON routine'
!callabortstop
          CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
          CALL ABORT
          STOP
        END IF
      END IF
!
!*      5.2.2 Radiosounding balloon
!
      IF (TPFLYER%TYPE=='RADIOS') THEN
        TPFLYER%Z_CUR = TPFLYER%ALT
        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,1,IKB) )
        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
        TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
      END IF

!*      5.2.3 Aircraft
!
      IF (TPFLYER%TYPE=='AIRCRA') THEN
       IF (TPFLYER%ALTDEF) THEN
         TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGP(IL+1)
       ELSE 
         TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGZ(IL +1 )
       END IF
      END IF
!
!*      5.2.4 Constant Volume Balloon
!
      IF (TPFLYER%TYPE=='CVBALL') THEN
        IF ( TPFLYER%ALT /= XUNDEF ) THEN
          IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1)
          IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1)
          IK10 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,1,:)), 1)
          IK11 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,2,:)), 1)
          IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
            TPFLYER%Z_CUR = TPFLYER%ALT
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,1,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
          ELSE
            ZZCOEF00 = (TPFLYER%ALT - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00))
            ZZCOEF01 = (TPFLYER%ALT - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01))
            ZZCOEF10 = (TPFLYER%ALT - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10))
            ZZCOEF11 = (TPFLYER%ALT - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11))
            TPFLYER%RHO = FLYER_INTERP(ZRHO)
            TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
          END IF
        ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN
          ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD)
          IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
          IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
          IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
          IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
          IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
            TPFLYER%Z_CUR = ZZM(1,1,IKB) 
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
          ELSE
            ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00))
            ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01))
            ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10))
            ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11))
            TPFLYER%RHO = FLYER_INTERP(ZRHO)
            TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
          END IF
        ELSE
          TPFLYER%RHO = TPFLYER%MASS / TPFLYER%VOLUME
          IK00 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,1,:)), 1)
          IK01 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,2,:)), 1)
          IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1)
          IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1)
          IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN
            TPFLYER%Z_CUR = ZZM(1,1,IKB) 
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) )
            TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) )
          ELSE
            ZZCOEF00 = (TPFLYER%RHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00))
            ZZCOEF01 = (TPFLYER%RHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01))
            ZZCOEF10 = (TPFLYER%RHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10))
            ZZCOEF11 = (TPFLYER%RHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11))
            TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
          END IF
        END IF
      END IF
    END IF
!
!
!
!*      5.3  Vertical position
!            -----------------
!
    IF (TPFLYER%TYPE=='ISODEN') THEN
      IK00 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,1,:)), 1)
      IK01 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,2,:)), 1)
      IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1)
      IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1)
    ELSE IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='CVBALL') THEN
      IK00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,1,:)), 1)
      IK01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,2,:)), 1)
      IK10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,1,:)), 1)
      IK11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,2,:)), 1)
    ELSE IF (TPFLYER%TYPE=='AIRCRA') THEN
            IF (TPFLYER%ALTDEF) THEN
              ZFLYER_EXN = (TPFLYER%P_CUR/XP00)**(XRD/XCPD)
              IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1)
              IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1)
              IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1)
              IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1)
            ELSE
              IK00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,1,:)), 1)
              IK01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,2,:)), 1)
              IK10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,1,:)), 1)
              IK11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,2,:)), 1)
            END IF
    END IF
    IK00 = MAX ( IK00, IKB )
    IK01 = MAX ( IK01, IKB )
    IK10 = MAX ( IK10, IKB )
    IK11 = MAX ( IK11, IKB )
!
!
!*      5.4  Crash of the balloon
!            --------------------
!
!
    IF (IK00 <  IKB .OR. IK01 <  IKB .OR. IK10 <  IKB .OR. IK11 <  IKB .OR. &
        IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE  ) THEN
      TPFLYER%CRASH=.TRUE.
    END IF
!
  END IF
!
!
  IF (TPFLYER%CRASH) THEN
    TPFLYER%FLY = .FALSE.
    IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH ) THEN
      WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flew out of the domain the ', &
                    TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/',            &
                    TPDTCUR%TDATE%YEAR,' at ',TPDTCUR%TIME,' sec.'
    ELSE IF (TPFLYER%TYPE /= 'AIRCRA') THEN
      WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' crashed the ',                 &
                    TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/',            &
                    TPDTCUR%TDATE%YEAR,' at ',TPDTCUR%TIME,' sec.'
    END IF
  ELSE
    IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH .AND. ZTDIST > PTSTEP ) THEN
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
      WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flies  in leg',TPFLYER%SEGCURN ,' the ',  &
        TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/',      &
        TPDTCUR%TDATE%YEAR,' at ',NINT(TPDTCUR%TIME),' sec.'
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
    ENDIF
!
!----------------------------------------------------------------------------
    IF (ZTHIS_PROC>0.) THEN
!----------------------------------------------------------------------------
!
!*      6.   INITIALIZATIONS FOR INTERPOLATIONS
!            ----------------------------------
!
!*      6.1  Interpolation coefficient for X
!            -------------------------------
!
      ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II))
      ZXCOEF = MAX (0.,MIN(ZXCOEF,1.))
!
!
!*      6.2  Interpolation coefficient for y
!            -------------------------------
!
      ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ))
      ZYCOEF = MAX (0.,MIN(ZYCOEF,1.))
!
!
!*      6.3  Interpolation coefficients for the 4 suroundings verticals
!            ----------------------------------------------------------
!
      IF (TPFLYER%TYPE=='ISODEN') THEN
        ZZCOEF00 = (TPFLYER%RHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00) )
        ZZCOEF01 = (TPFLYER%RHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01) )
        ZZCOEF10 = (TPFLYER%RHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10) )
        ZZCOEF11 = (TPFLYER%RHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11) )
        TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
      ELSE IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='CVBALL') THEN
        ZZCOEF00 = (TPFLYER%Z_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) )
        ZZCOEF01 = (TPFLYER%Z_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) )
        ZZCOEF10 = (TPFLYER%Z_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) )
        ZZCOEF11 = (TPFLYER%Z_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) )
      ELSE IF (TPFLYER%TYPE=='AIRCRA') THEN
              IF (TPFLYER%ALTDEF) THEN
        ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00) )
        ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01) )
        ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10) )
        ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11) )
        TPFLYER%Z_CUR = FLYER_INTERP(ZZM)
                      ELSE
        ZZCOEF00 = (TPFLYER%Z_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) )
        ZZCOEF01 = (TPFLYER%Z_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) )
        ZZCOEF10 = (TPFLYER%Z_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) )
        ZZCOEF11 = (TPFLYER%Z_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) )
        TPFLYER%P_CUR = FLYER_INTERP(PP)
              END IF
      END IF
!
!----------------------------------------------------------------------------
!
!*      7.   INITIALIZATIONS FOR INTERPOLATIONS OF U AND V
!            ---------------------------------------------
!
!*      7.1  Interpolation coefficient for X (for U)
!            -------------------------------
!
      ZUCOEF = (TPFLYER%X_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU))
      ZUCOEF = MAX(0.,MIN(ZUCOEF,1.))
!
!
!*      7.2  Interpolation coefficient for y (for V)
!            -------------------------------
!
      ZVCOEF = (TPFLYER%Y_CUR - PYHAT(IV)) / (PYHAT(IV+1) - PYHAT(IV))
      ZVCOEF = MAX(0.,MIN(ZVCOEF,1.))
!
!
!*      7.3  Interpolation coefficients for the 4 suroundings verticals (for U)
!            ----------------------------------------------------------
!
      IU00 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(1,1,:)), 1)
      IU01 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(1,2,:)), 1)
      IU10 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(2,1,:)), 1)
      IU11 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(2,2,:)), 1)
      ZUCOEF00 = (TPFLYER%Z_CUR - ZZU(1,1,IU00)) / ( ZZU(1,1,IU00+1) - ZZU(1,1,IU00) )
      ZUCOEF01 = (TPFLYER%Z_CUR - ZZU(1,2,IU01)) / ( ZZU(1,2,IU01+1) - ZZU(1,2,IU01) )
      ZUCOEF10 = (TPFLYER%Z_CUR - ZZU(2,1,IU10)) / ( ZZU(2,1,IU10+1) - ZZU(2,1,IU10) )
      ZUCOEF11 = (TPFLYER%Z_CUR - ZZU(2,2,IU11)) / ( ZZU(2,2,IU11+1) - ZZU(2,2,IU11) )
!
!
!*      7.4  Interpolation coefficients for the 4 suroundings verticals (for V)
!            ----------------------------------------------------------
!

      IV00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(1,1,:)), 1)
      IV01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(1,2,:)), 1)
      IV10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(2,1,:)), 1)
      IV11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(2,2,:)), 1)
      ZVCOEF00 = (TPFLYER%Z_CUR - ZZV(1,1,IV00)) / ( ZZV(1,1,IV00+1) - ZZV(1,1,IV00) )
      ZVCOEF01 = (TPFLYER%Z_CUR - ZZV(1,2,IV01)) / ( ZZV(1,2,IV01+1) - ZZV(1,2,IV01) )
      ZVCOEF10 = (TPFLYER%Z_CUR - ZZV(2,1,IV10)) / ( ZZV(2,1,IV10+1) - ZZV(2,1,IV10) )
      ZVCOEF11 = (TPFLYER%Z_CUR - ZZV(2,2,IV11)) / ( ZZV(2,2,IV11+1) - ZZV(2,2,IV11) )
!
!----------------------------------------------------------------------------
!
!*      8.   DATA RECORDING
!            --------------
!
      IF ( GSTORE ) THEN
        TPFLYER%X   (IN) = TPFLYER%X_CUR
        TPFLYER%Y   (IN) = TPFLYER%Y_CUR
        TPFLYER%Z   (IN) = TPFLYER%Z_CUR
        !
        CALL SM_LATLON(PLATOR,PLONOR,          &
                     TPFLYER%X_CUR, TPFLYER%Y_CUR,       &
                     TPFLYER%YLAT(IN), TPFLYER%XLON(IN)  )
        !
        ZU_BAL = FLYER_INTERP_U(PU)
        ZV_BAL = FLYER_INTERP_V(PV)
        ZGAM   = (XRPK * (TPFLYER%XLON(IN) - XLON0) - XBETA)*(XPI/180.)
        TPFLYER%ZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM)
        TPFLYER%MER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM)
        !
        TPFLYER%W   (IN) = FLYER_INTERP(ZWM)
        TPFLYER%TH  (IN) = FLYER_INTERP(PTH)
        !
        ZFLYER_EXN = FLYER_INTERP(ZEXN)
        TPFLYER%P   (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD)
        !
        DO JLOOP=1,SIZE(PR,4)
          TPFLYER%R   (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP))
          IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP)
        END DO
        DO JLOOP=1,SIZE(PSV,4)
          TPFLYER%SV  (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP))
        END DO
        TPFLYER%RTZ  (IN,:) = FLYER_INTERPZ(ZR(:,:,:))
        DO JLOOP=1,SIZE(PR,4)
          TPFLYER%RZ  (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP))
        END DO
        ! Fin Modifs ON
        TPFLYER%FFZ  (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2))
        IF (CCLOUD=="LIMA") THEN                                  
          TPFLYER%CIZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))  
          TPFLYER%CCZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))  
          TPFLYER%CRZ  (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))  
        ELSE
          TPFLYER%CIZ  (IN,:) = FLYER_INTERPZ(PCIT(:,:,:))      
        ENDIF             
        ! initialization CRARE and CRARE_ATT + LWC and IWC
        TPFLYER%CRARE(IN,:) = 0.
        TPFLYER%CRARE_ATT(IN,:) = 0.
        TPFLYER%LWCZ  (IN,:) = 0.
        TPFLYER%IWCZ  (IN,:) = 0.
      IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA
       TPFLYER%LWCZ  (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:))
       TPFLYER%IWCZ  (IN,:) = FLYER_INTERPZ((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:))
       ZTEMPZ(:)=FLYER_INTERPZ(PTH(II:II+1,IJ:IJ+1,:) * ZEXN(:,:,:))
        ZRHODREFZ(:)=FLYER_INTERPZ(PRHODREF(:,:,:))
        ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:))
        IF (CCLOUD=="LIMA") THEN
          ZCCI(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI))
          ZCCR(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR))
          ZCCC(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC))
        ENDIF
        DO JLOOP=3,6
          ZRZ(:,JLOOP)=FLYER_INTERPZ(PR(:,:,:,JLOOP))
        END DO
        DO JK=1,IKU
          ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:))       ! becomes cloud mixing ratio over sea
          ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:)))  ! becomes cloud mixing ratio over land
        END DO
        ALLOCATE(ZAELOC(IKU))
        !
        ZAELOC(:)=0.
        ! initialization of quadrature points and weights
        ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG))
        CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters
        ! initialize minimum values
        ALLOCATE(ZRTMIN(SIZE(PR,4)+1))
        IF (CCLOUD == 'LIMA') THEN
          ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea
          ZRTMIN(3)=XRTMIN_L(3)
          ZRTMIN(4)=XRTMIN_L(4)
          ZRTMIN(5)=1E-10
          ZRTMIN(6)=XRTMIN_L(6)
          ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land
        ELSE
          ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea
          ZRTMIN(3)=XRTMIN_I(3)
          ZRTMIN(4)=XRTMIN_I(4)
          ZRTMIN(5)=1E-10
          ZRTMIN(6)=XRTMIN_I(6)
          ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land
        ENDIF
        ! compute cloud radar reflectivity from vertical profiles of temperature and mixing ratios
        DO JK=1,IKU
          QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
          QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD))
          DO JLOOP=2,7
            IF (CCLOUD == 'LIMA') THEN
              GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.&
                    (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND. JLOOP.NE.7).OR.ZCCC(JK)>0.))
            ELSE
              GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.))
            ENDIF
            IF(GCALC) THEN
              SELECT CASE(JLOOP)
                CASE(2) ! cloud water over sea
                  IF (CCLOUD == 'LIMA') THEN
                    ZA=XAC_L
                    ZB=XBC_L
                    ZCC=ZCCC(JK)*ZRHODREFZ(JK)
                    ZCX=0.
                    ZALPHA=XALPHAC_L
                    ZNU=XNUC_L
                    ZLBEX=1.0/(ZCX-ZB)
                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
                  ELSE
                    ZA=XAC_I
                    ZB=XBC_I
                    ZCC=XCONC_SEA
                    ZCX=0.
                    ZALPHA=XALPHAC2_I
                    ZNU=XNUC2_I
                    ZLBEX=1.0/(ZCX-ZB)
                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
                  ENDIF
                CASE(3) ! rain water
                  IF (CCLOUD == 'LIMA') THEN
                    ZA=XAR_L
                    ZB=XBR_L
                    ZCC=ZCCR(JK)*ZRHODREFZ(JK)
                    ZCX=0.
                    ZALPHA=XALPHAR_L
                    ZNU=XNUR_L
                    ZLBEX=1.0/(ZCX-ZB)
                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
                  ELSE
                    ZA=XAR_I
                    ZB=XBR_I
                    ZCC=XCCR_I
                    ZCX=-1.
                    ZALPHA=XALPHAR_I
                    ZNU=XNUR_I
                    ZLB=XLBR_I
                    ZLBEX=XLBEXR_I
                  ENDIF
                CASE(4) ! pristine ice
                  IF (CCLOUD == 'LIMA') THEN
                    ZA=XAI_L
                    ZB=XBI_L
                    ZCC=ZCCI(JK)*ZRHODREFZ(JK)
                    ZCX=0.
                    ZALPHA=XALPHAI_L
                    ZNU=XNUI_L
                    ZLBEX=1.0/(ZCX-ZB)
                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI
                    ZFW=0
                  ELSE
                    ZA=XAI_I
                    ZB=XBI_I
                    ZCC=ZCIT(JK)
                    ZCX=0.
                    ZALPHA=XALPHAI_I
                    ZNU=XNUI_I
                    ZLBEX=XLBEXI_I
                    ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI
                    ZFW=0
                  ENDIF                          
                CASE(5) ! snow
                  IF (CCLOUD == 'LIMA') THEN
                    ZA=XAS_L
                    ZB=XBS_L
                    ZCC=XCCS_L
                    ZCX=XCXS_L
                    ZALPHA=XALPHAS_L
                    ZNU=XNUS_L
                    ZLB=XLBS_L
                    ZLBEX=XLBEXS_L
                    ZFW=0
                  ELSE
                    ZA=XAS_I
                    ZB=XBS_I
                    ZCC=XCCS_I
                    ZCX=XCXS_I
                    ZALPHA=XALPHAS_I
                    ZNU=XNUS_I
                    ZLB=XLBS_I
                    ZLBEX=XLBEXS_I
                    ZFW=0
                  ENDIF
                CASE(6) ! graupel
                  !If temperature between -10 and 10°C and Mr and Mg over min threshold: melting graupel
                  ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel (Fw=0)    
                  IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 &
                    .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN
                    ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP))
                  ELSE
                    ZFW=0
                  ENDIF
                  IF (CCLOUD == 'LIMA') THEN
                    ZA=XAG_L
                    ZB=XBG_L
                    ZCC=XCCG_L
                    ZCX=XCXG_L
                    ZALPHA=XALPHAG_L
                    ZNU=XNUG_L
                    ZLB=XLBG_L
                    ZLBEX=XLBEXG_L
                  ELSE
                    ZA=XAG_I
                    ZB=XBG_I
                    ZCC=XCCG_I
                    ZCX=XCXG_I
                    ZALPHA=XALPHAG_I
                    ZNU=XNUG_I
                    ZLB=XLBG_I
                    ZLBEX=XLBEXG_I
                  ENDIF                          
                CASE(7) ! cloud water over land
                  IF (CCLOUD == 'LIMA') THEN
                    ZA=XAC_L
                    ZB=XBC_L
                    ZCC=ZCCC(JK)*ZRHODREFZ(JK)
                    ZCX=0.
                    ZALPHA=XALPHAC_L
                    ZNU=XNUC_L
                    ZLBEX=1.0/(ZCX-ZB)
                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
                  ELSE
                    ZA=XAC_I
                    ZB=XBC_I
                    ZCC=XCONC_LAND
                    ZCX=0.
                    ZALPHA=XALPHAC_I
                    ZNU=XNUC_I
                    ZLBEX=1.0/(ZCX-ZB)
                    ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX)
                  ENDIF
              END SELECT
              ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX
              ZREFLOC=0.
              ZAETMP=0.
              DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature
                ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA
                SELECT CASE(JLOOP)
                  CASE(2,3,7)
                    QM=QMW
                  CASE(4,5,6)
                    ! pristine ice, snow, dry graupel
                    ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW)
                    QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW))
                    
                    ! water inclusions in ice in air
                    QEPSWI=MG(QMW**2,QM**2,ZFW)
                    ! ice in air inclusions in water
                    QEPSIW=MG(QM**2,QMW**2,1.-ZFW)
                  
                    !MG weighted rule (Matrosov 2008)
                    IF(ZFW .LT. 0.37) THEN
                      ZFPW=0
                    ELSE IF(ZFW .GT. 0.63) THEN
                      ZFPW=1
                    ELSE
                      ZFPW=(ZFW-0.37)/(0.63-0.37)
                    ENDIF  
                    QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW)
                END SELECT
                CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK)
                ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
                ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ)
              END DO
              ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93)
              ZAETMP=ZAETMP  *           XPI    *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU))
              TPFLYER%CRARE(IN,JK)=TPFLYER%CRARE(IN,JK)+ZREFLOC
              ZAELOC(JK)=ZAELOC(JK)+ZAETMP
            END IF

          END DO

        END DO

        ! apply attenuation
        ALLOCATE(ZZMZ(IKU))
        ZZMZ(:)=FLYER_INTERPZ(ZZM(:,:,:))
        ! nadir
        ZAETOT=1.
        DO JK=COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1,-1
          IF(JK.EQ.COUNT(TPFLYER%Z_CUR >= ZZMZ(:))) THEN
            IF(TPFLYER%Z_CUR<=ZZMZ(JK)+.5*(ZZMZ(JK+1)-ZZMZ(JK))) THEN
              ! only attenuation from ZAELOC(JK)
              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(TPFLYER%Z_CUR-ZZMZ(JK))))
            ELSE
              ! attenuation from ZAELOC(JK) and ZAELOC(JK+1)
              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK+1)*(TPFLYER%Z_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) &
                +ZAELOC(JK)*.5*(ZZMZ(JK+1)-ZZMZ(JK))))
            END IF
          ELSE
            ! attenuation from ZAELOC(JK) and ZAELOC(JK+1)
            ZAETOT=ZAETOT*EXP(-(ZAELOC(JK+1)+ZAELOC(JK))*(ZZMZ(JK+1)-ZZMZ(JK)))
          END IF
          TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT
        END DO
        ! zenith
        ZAETOT=1.
        DO JK = MAX(COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1)+1,IKU
          IF ( JK .EQ. (MAX(COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1)+1) ) THEN        
            IF(TPFLYER%Z_CUR>=ZZMZ(JK)-.5*(ZZMZ(JK)-ZZMZ(JK-1))) THEN
              ! only attenuation from ZAELOC(JK)
              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(ZZMZ(JK)-TPFLYER%Z_CUR)))
            ELSE
              ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
              ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK-1)*(.5*(ZZMZ(JK)+ZZMZ(JK-1))-TPFLYER%Z_CUR) &
                +ZAELOC(JK)*.5*(ZZMZ(JK)-ZZMZ(JK-1))))
            END IF
          ELSE
            ! attenuation from ZAELOC(JK) and ZAELOC(JK-1)
            ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1)))
          END IF
          TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT
        END DO
        TPFLYER%ZZ  (IN,:) = ZZMZ(:)
        DEALLOCATE(ZZMZ,ZAELOC)
        ! m^3 → mm^6/m^3 → dBZ
        WHERE(TPFLYER%CRARE(IN,:)>0)
          TPFLYER%CRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE(IN,:))
        ELSEWHERE
          TPFLYER%CRARE(IN,:)=XUNDEF
        END WHERE
        WHERE(TPFLYER%CRARE_ATT(IN,:)>0)
          TPFLYER%CRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE_ATT(IN,:))
        ELSEWHERE
          TPFLYER%CRARE_ATT(IN,:)=XUNDEF
        END WHERE
        DEALLOCATE(ZX,ZW,ZRTMIN)
      END IF ! end LOOP ICE3
        ! vertical wind
        TPFLYER%WZ  (IN,:) = FLYER_INTERPZ(ZWM(:,:,:))
        IF (SIZE(PTKE)>0) TPFLYER%TKE  (IN)    = FLYER_INTERP(PTKE)
        IF (SIZE(PTS) >0) TPFLYER%TSRAD(IN)    = FLYER_INTERP_2D(PTS)
        IF (LDIAG_IN_RUN) TPFLYER%TKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS)
        TPFLYER%ZS(IN)  = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT))
        TPFLYER%THW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX)
        TPFLYER%RCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX)
        DO JLOOP=1,SIZE(PSV,4)
         TPFLYER%SVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP))
        END DO
      END IF
!
!----------------------------------------------------------------------------
!
!*      9.   BALLOON ADVECTION
!            -----------------
!
      IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN
        ZU_BAL = FLYER_INTERP_U(PU)
        ZV_BAL = FLYER_INTERP_V(PV)
        ZMAP   = FLYER_INTERP_2D(PMAP)
        !
        TPFLYER%X_CUR = TPFLYER%X_CUR   +   ZU_BAL * PTSTEP * ZMAP
        TPFLYER%Y_CUR = TPFLYER%Y_CUR   +   ZV_BAL * PTSTEP * ZMAP
      END IF
      !
      IF (TPFLYER%TYPE=='RADIOS') THEN
        ZW_BAL = FLYER_INTERP(ZWM)
        TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * PTSTEP
      END IF
      !
      IF (TPFLYER%TYPE=='CVBALL') THEN
        ZW_BAL = FLYER_INTERP(ZWM)
        ZRO_BAL = FLYER_INTERP(ZRHO)
        ! calculation with a time step of 1 second or less
        IF (INT(PTSTEP) .GT. 1 ) THEN
          DO JK=1,INT(PTSTEP)
            TPFLYER%WASCENT = TPFLYER%WASCENT &
              -  ( 1. / (1. + TPFLYER%INDDRAG ) ) * 1. * &
                 ( XG * ( ( TPFLYER%MASS / TPFLYER%VOLUME ) - ZRO_BAL ) / ( TPFLYER%MASS / TPFLYER%VOLUME ) &
                    + TPFLYER%WASCENT * ABS ( TPFLYER%WASCENT ) * &
                      TPFLYER%DIAMETER * TPFLYER%AERODRAG / ( 2. * TPFLYER%VOLUME ) &
                  )
            TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * 1.
          END DO
        END IF
        IF (PTSTEP .GT. INT(PTSTEP)) THEN
            TPFLYER%WASCENT = TPFLYER%WASCENT &
              -  ( 1. / (1. + TPFLYER%INDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * &
                 ( XG * ( ( TPFLYER%MASS / TPFLYER%VOLUME ) - ZRO_BAL ) / ( TPFLYER%MASS / TPFLYER%VOLUME ) &
                    + TPFLYER%WASCENT * ABS ( TPFLYER%WASCENT ) * &
                      TPFLYER%DIAMETER * TPFLYER%AERODRAG / ( 2. * TPFLYER%VOLUME ) &
                  )
            TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * (PTSTEP-INT(PTSTEP))
        END IF
      END IF
!
!----------------------------------------------------------------------------
  END IF
!----------------------------------------------------------------------------
!
!*     10.   AIRCRAFT MOVE (computations done on all processors, to limit exchanges)
!            -------------
!
    IF (TPFLYER%TYPE=='AIRCRA') THEN
!
!
!*     10.1  Determination of flight segment
!            -------------------------------
!
      IL = TPFLYER%SEGCURN
      !
      TPFLYER%SEGCURT = TPFLYER%SEGCURT + PTSTEP
      !
       DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL))
         TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1
         IL = TPFLYER%SEGCURN
         TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1)
         IF (IL>TPFLYER%SEG) EXIT
      END DO 
!      DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL) .AND. IL <= TPFLYER%SEG)
!        TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1
!        IL = TPFLYER%SEGCURN
!        TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1)
!      END DO
      !
      !* end of flight
      !
      IF (IL > TPFLYER%SEG) TPFLYER%FLY=.FALSE.
!
!
!*     10.2  Determination of new position
!            -----------------------------
!
      IF (TPFLYER%FLY) THEN
        ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL)
        !
        TPFLYER%X_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGX(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGX(IL+1)
        TPFLYER%Y_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGY(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGY(IL+1)
          IF (TPFLYER%ALTDEF) THEN
             TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGP(IL+1)
          ELSE
             TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL  ) &
                      +     ZSEG_FRAC  * TPFLYER%SEGZ(IL+1) 
          END IF
      END IF
    !
    END IF
  !
  END IF
! 
END IF
!
!----------------------------------------------------------------------------
!
!*     11.   EXCHANGE OF INFORMATION BETWEEN PROCESSORS
!            ------------------------------------------
!
!*     11.1  current position
!            ----------------
!
CALL DISTRIBUTE_FLYER_L(TPFLYER%FLY)
CALL DISTRIBUTE_FLYER_L(TPFLYER%CRASH)
CALL DISTRIBUTE_FLYER(TPFLYER%X_CUR)
CALL DISTRIBUTE_FLYER(TPFLYER%Y_CUR)
IF (TPFLYER%TYPE=='CVBALL') THEN
  CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
  CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT)
ELSE
  IF (TPFLYER%TYPE=='RADIOS') CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
  IF (TPFLYER%TYPE=='AIRCRA') THEN
     IF (TPFLYER%ALTDEF) THEN
        CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR)
     ELSE
        CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR)
     ENDIF
  END IF
  IF (TPFLYER%TYPE=='ISODEN' ) CALL DISTRIBUTE_FLYER(TPFLYER%RHO)
END IF
!
!*     11.2  data stored
!            -----------
!
IF ( GSTORE ) THEN
  CALL DISTRIBUTE_FLYER(TPFLYER%X   (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%Y   (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%Z   (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%XLON(IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%YLAT(IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%ZON (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%MER (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%W   (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%P   (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%TH  (IN))
  DO JLOOP=1,SIZE(PR,4)
    CALL DISTRIBUTE_FLYER(TPFLYER%R   (IN,JLOOP))
  END DO
  DO JLOOP=1,SIZE(PSV,4)
    CALL DISTRIBUTE_FLYER(TPFLYER%SV  (IN,JLOOP))
  END DO
  DO JLOOP=1,IKU              
    CALL DISTRIBUTE_FLYER(TPFLYER%RTZ (IN,JLOOP))
    DO JLOOP2=1,SIZE(PR,4)
      CALL DISTRIBUTE_FLYER(TPFLYER%RZ (IN,JLOOP,JLOOP2))
    ENDDO
    CALL DISTRIBUTE_FLYER(TPFLYER%FFZ (IN,JLOOP))
    CALL DISTRIBUTE_FLYER(TPFLYER%CIZ (IN,JLOOP))
    IF (CCLOUD== 'LIMA' ) THEN
      CALL DISTRIBUTE_FLYER(TPFLYER%CRZ (IN,JLOOP))
      CALL DISTRIBUTE_FLYER(TPFLYER%CCZ (IN,JLOOP))      
    ENDIF
    CALL DISTRIBUTE_FLYER(TPFLYER%IWCZ (IN,JLOOP))
    CALL DISTRIBUTE_FLYER(TPFLYER%LWCZ (IN,JLOOP))
    CALL DISTRIBUTE_FLYER(TPFLYER%CRARE (IN,JLOOP))
    CALL DISTRIBUTE_FLYER(TPFLYER%CRARE_ATT (IN,JLOOP))
    CALL DISTRIBUTE_FLYER(TPFLYER%WZ (IN,JLOOP))
    CALL DISTRIBUTE_FLYER(TPFLYER%ZZ (IN,JLOOP))
  END DO
  IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%TKE  (IN))
  IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%TSRAD(IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%ZS  (IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%THW_FLUX(IN))
  CALL DISTRIBUTE_FLYER(TPFLYER%RCW_FLUX(IN))
  DO JLOOP=1,SIZE(PSV,4)
    CALL DISTRIBUTE_FLYER(TPFLYER%SVW_FLUX(IN,JLOOP))
  END DO
END IF
!
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
!
CONTAINS
!
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
FUNCTION FLYER_INTERP(PA) RESULT(PB)
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
REAL                               :: PB
!
INTEGER :: JI, JJ
!
IF (SIZE(PA,1)==2) THEN
  JI=1
  JJ=1
ELSE
  JI=II
  JJ=IJ
END IF
!
PB = (1.- ZYCOEF) * (1.-ZXCOEF) * ( (1.-ZZCOEF00) * PA(JI  ,JJ  ,IK00) + ZZCOEF00 * PA(JI  ,JJ  ,IK00+1)) &
   + (1.- ZYCOEF) * (   ZXCOEF) * ( (1.-ZZCOEF10) * PA(JI+1,JJ  ,IK10) + ZZCOEF10 * PA(JI+1,JJ  ,IK10+1)) &
   + (    ZYCOEF) * (1.-ZXCOEF) * ( (1.-ZZCOEF01) * PA(JI  ,JJ+1,IK01) + ZZCOEF01 * PA(JI  ,JJ+1,IK01+1)) &
   + (    ZYCOEF) * (   ZXCOEF) * ( (1.-ZZCOEF11) * PA(JI+1,JJ+1,IK11) + ZZCOEF11 * PA(JI+1,JJ+1,IK11+1))
!
END FUNCTION FLYER_INTERP
!----------------------------------------------------------------------------
FUNCTION FLYER_INTERPZ(PA) RESULT(PB)
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
REAL, DIMENSION(SIZE(PA,3))        :: PB
!
INTEGER :: JI, JJ, JK
!
IF (SIZE(PA,1)==2) THEN
  JI=1
  JJ=1
ELSE
  JI=II
  JJ=IJ
END IF
!
!
DO JK=1,SIZE(PA,3)
 IF ( (PA(JI,JJ,JK) /= XUNDEF) .AND. (PA(JI+1,JJ,JK) /= XUNDEF) .AND. &
      (PA(JI,JJ+1,JK) /= XUNDEF) .AND. (PA(JI+1,JJ+1,JK) /= XUNDEF) ) THEN
   PB(JK) = (1.-ZYCOEF) * (1.-ZXCOEF) *  PA(JI,JJ,JK) + &
        (1.-ZYCOEF) * (ZXCOEF) *  PA(JI+1,JJ,JK)  + &
        (ZYCOEF) * (1.-ZXCOEF) *  PA(JI,JJ+1,JK)  + &
        (ZYCOEF) * (ZXCOEF) *  PA(JI+1,JJ+1,JK) 
 ELSE
   PB(JK) = XUNDEF 
 END IF    
END DO
!
END FUNCTION FLYER_INTERPZ
!----------------------------------------------------------------------------
FUNCTION FLYER_INTERP_U(PA) RESULT(PB)
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
REAL                               :: PB
!
INTEGER :: JI, JJ
!
IF (SIZE(PA,1)==2) THEN
  JI=1
  JJ=1
ELSE
  JI=IU
  JJ=IJ
END IF
!
PB = (1.- ZYCOEF) * (1.-ZUCOEF) * ( (1.-ZUCOEF00) * PA(JI  ,JJ  ,IU00) + ZUCOEF00 * PA(JI  ,JJ  ,IU00+1)) &
   + (1.- ZYCOEF) * (   ZUCOEF) * ( (1.-ZUCOEF10) * PA(JI+1,JJ  ,IU10) + ZUCOEF10 * PA(JI+1,JJ  ,IU10+1)) &
   + (    ZYCOEF) * (1.-ZUCOEF) * ( (1.-ZUCOEF01) * PA(JI  ,JJ+1,IU01) + ZUCOEF01 * PA(JI  ,JJ+1,IU01+1)) &
   + (    ZYCOEF) * (   ZUCOEF) * ( (1.-ZUCOEF11) * PA(JI+1,JJ+1,IU11) + ZUCOEF11 * PA(JI+1,JJ+1,IU11+1))
!
END FUNCTION FLYER_INTERP_U
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
FUNCTION FLYER_INTERP_V(PA) RESULT(PB)
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PA
REAL                               :: PB
!
INTEGER :: JI, JJ
!
IF (SIZE(PA,1)==2) THEN
  JI=1
  JJ=1
ELSE
  JI=II
  JJ=IV
END IF
!
PB = (1.- ZVCOEF) * (1.-ZXCOEF) * ( (1.-ZVCOEF00) * PA(JI  ,JJ  ,IV00) + ZVCOEF00 * PA(JI  ,JJ  ,IV00+1)) &
   + (1.- ZVCOEF) * (   ZXCOEF) * ( (1.-ZVCOEF10) * PA(JI+1,JJ  ,IV10) + ZVCOEF10 * PA(JI+1,JJ  ,IV10+1)) &
   + (    ZVCOEF) * (1.-ZXCOEF) * ( (1.-ZVCOEF01) * PA(JI  ,JJ+1,IV01) + ZVCOEF01 * PA(JI  ,JJ+1,IV01+1)) &
   + (    ZVCOEF) * (   ZXCOEF) * ( (1.-ZVCOEF11) * PA(JI+1,JJ+1,IV11) + ZVCOEF11 * PA(JI+1,JJ+1,IV11+1))
!
END FUNCTION FLYER_INTERP_V
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
FUNCTION FLYER_INTERP_2D(PA) RESULT(PB)
!
REAL, DIMENSION(:,:), INTENT(IN) :: PA
REAL                             :: PB
!
INTEGER :: JI, JJ
!
IF (SIZE(PA,1)==2) THEN
  JI=1
  JJ=1
ELSE
  JI=II
  JJ=IJ
END IF
!
PB = (1.- ZYCOEF) * (1.-ZXCOEF) * PA(JI  ,JJ  ) &
   + (1.- ZYCOEF) * (   ZXCOEF) * PA(JI+1,JJ  ) &
   + (    ZYCOEF) * (1.-ZXCOEF) * PA(JI  ,JJ+1) &
   + (    ZYCOEF) * (   ZXCOEF) * PA(JI+1,JJ+1)
!
END FUNCTION FLYER_INTERP_2D
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
SUBROUTINE DISTRIBUTE_FLYER(PA)
!
REAL, INTENT(INOUT) :: PA
!
PA = PA * ZTHIS_PROC
CALL REDUCESUM_ll(PA,IINFO_ll)
!
END SUBROUTINE DISTRIBUTE_FLYER
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
SUBROUTINE DISTRIBUTE_FLYER_N(KA)
!
INTEGER, INTENT(INOUT) :: KA
REAL                   :: ZA
!
ZA=KA
!
ZA = ZA * ZTHIS_PROC
CALL REDUCESUM_ll(ZA,IINFO_ll)
!
IF (NINT(ZA)/=0) KA=NINT(ZA)
!
END SUBROUTINE DISTRIBUTE_FLYER_N
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
SUBROUTINE DISTRIBUTE_FLYER_L(OA)
!
LOGICAL, INTENT(INOUT) :: OA
REAL                   :: ZA
!
ZA=0.
IF (OA) ZA=1.
!
CALL REDUCESUM_ll(ZA,IINFO_ll)
!
IF (ZA==0.) THEN
  OA=.FALSE.
ELSE
  OA=.TRUE.
END IF
!
END SUBROUTINE DISTRIBUTE_FLYER_L
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
SUBROUTINE FLYER_CHANGE_MODEL(IMI)
!
INTEGER, INTENT(IN) :: IMI ! model index
!
INTEGER :: IMK      ! kid model index
INTEGER :: IMODEL   ! TPFLYER model index at the beginning of the subroutine
INTEGER :: IU       ! U flux point balloon position (x index)
INTEGER :: IV       ! V flux point balloon position (y index)
INTEGER :: IU_ABS   ! U flux point balloon  position (in the model)
INTEGER :: IV_ABS   ! V flux point balloon position (in the model)
INTEGER :: IXOR     ! Origin's coordinates of the extended 2 way subdomain
INTEGER :: IYOR     ! Origin's coordinates of the extended 2 way subdomain
INTEGER :: IIB      ! current processor domain sizes
INTEGER :: IJB
INTEGER :: IIE
INTEGER :: IJE
!
!
IMODEL=TPFLYER%NMODEL
CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR )
IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR )
ZTHIS_PROC=0.
IF (IU>=IIB .AND. IU<=IIE .AND. IV>=IJB .AND. IV<=IJE) ZTHIS_PROC=1.
IF (ZTHIS_PROC .EQ. 1) THEN
  CALL GET_OR_LL('B',IXOR,IYOR)
  IU_ABS=IU + IXOR - 1
  IV_ABS=IV + IYOR - 1 
  !
  IF (TPFLYER%NMODEL == IMI) THEN
    !
    ! go to the kid model if the flyer location is inside
    ! ------------------
    !
    DO IMK=IMI+1,NMODEL
      IF (NDAD(IMK) == IMI .AND. &
         IU_ABS>=NXOR_ALL(IMK)  .AND. IU_ABS<=NXEND_ALL(IMK)  .AND. &
         IV_ABS>=NYOR_ALL(IMK)  .AND. IV_ABS<=NYEND_ALL(IMK) ) THEN
        TPFLYER%NMODEL = IMK
        !
      END IF
    END DO
    !
  ELSE
    !
    ! come from the kid model if the flyer location is outside
    ! ------------------
    !
    IMK = TPFLYER%NMODEL
    IF (IU_ABS<NXOR_ALL(IMK)  .OR. IU_ABS>NXEND_ALL(IMK)  .OR. &
         IV_ABS<NYOR_ALL(IMK)  .OR. IV_ABS>NYEND_ALL(IMK) ) THEN
        TPFLYER%NMODEL = IMI
        !
    END IF
  END IF
END IF
!
! send the information to all the processors
! ----------------------------------------
!
CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL)
ZTHIS_PROC=0.
!
! print if the model changes
!---------------------------------
IF (TPFLYER%NMODEL /= IMODEL) THEN
   IF (NDAD(IMODEL) == TPFLYER%NMODEL) THEN
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
      WRITE(ILUOUT,*) TPFLYER%TITLE,' comes from model ',IMODEL,' in  model ',&
             TPFLYER%NMODEL,' at ',NINT(TPDTCUR%TIME),' sec.'
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
   ELSE
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
      WRITE(ILUOUT,*) TPFLYER%TITLE,' goes from model ',IMODEL,' to  model ',&
             TPFLYER%NMODEL,' at ',NINT(TPDTCUR%TIME),' sec.'
      WRITE(ILUOUT,*) '-------------------------------------------------------------------'
   ENDIF
ENDIF
!
!
END SUBROUTINE FLYER_CHANGE_MODEL
!----------------------------------------------------------------------------
!----------------------------------------------------------------------------
END SUBROUTINE AIRCRAFT_BALLOON_EVOL