Skip to content
Snippets Groups Projects
aircraft_balloon_evol.f90 69.1 KiB
Newer Older
!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
!--------------- special set of characters for RCS information
!-----------------------------------------------------------------
Gaelle TANGUY's avatar
Gaelle TANGUY committed
! $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,   &
Gaelle TANGUY's avatar
Gaelle TANGUY committed
                       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,   &
Gaelle TANGUY's avatar
Gaelle TANGUY committed
                       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
Gaelle TANGUY's avatar
Gaelle TANGUY committed
!!     Feb, 2015 (C.Lac) Correction to prevent aircraft crash 
!!     July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
!!                                      aircraft, ballon and profiler
Gaelle TANGUY's avatar
Gaelle TANGUY committed
!!      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
Gaelle TANGUY's avatar
Gaelle TANGUY committed
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
!
Gaelle TANGUY's avatar
Gaelle TANGUY committed
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
!
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
Gaelle TANGUY's avatar
Gaelle TANGUY committed
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
Gaelle TANGUY's avatar
Gaelle TANGUY committed
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)
!
!
!*      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)
              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)