From 631eab480888ea589a1b065cf667ca79ed363b98 Mon Sep 17 00:00:00 2001
From: ESCOBAR Juan <escj@nuwa>
Date: Thu, 7 Nov 2013 15:59:53 +0100
Subject: [PATCH] Juan 7/11/2013: add usage of ZT3D & GET & REL of is section

---
 MNH/get_halo.f90       |   4 +-
 MNH/mode_mnh_zwork.f90 | 460 ++++++++++++++++++++++++-----------------
 2 files changed, 272 insertions(+), 192 deletions(-)

diff --git a/MNH/get_halo.f90 b/MNH/get_halo.f90
index 810c4cddd..52532129f 100644
--- a/MNH/get_halo.f90
+++ b/MNH/get_halo.f90
@@ -31,7 +31,7 @@ INTERFACE
    SUBROUTINE GET_HALO_D(PSRC,HDIR)
      !
      REAL, DIMENSION(:,:,:)     :: PSRC    ! variable at t
-     !$acc reflected (PSRC)
+     !$acc declare present (PSRC)
      CHARACTER(len=4), OPTIONAL :: HDIR ! to send only halo on X or Y direction
      !
    END SUBROUTINE GET_HALO_D
@@ -136,7 +136,7 @@ USE MODE_MNH_ZWORK, ONLY :  GWEST , GEAST, GSOUTH , GNORTH
 IMPLICIT NONE
 !
 REAL, DIMENSION(:,:,:)     :: PSRC    ! variable at t
-!$acc reflected (PSRC)
+!$acc declare present (PSRC)
 CHARACTER(len=4), OPTIONAL :: HDIR ! to send only halo on X or Y direction
 !
 TYPE(LIST_ll)     , POINTER      :: TZ_PSRC_ll               ! halo
diff --git a/MNH/mode_mnh_zwork.f90 b/MNH/mode_mnh_zwork.f90
index da5860e7b..cc2944349 100644
--- a/MNH/mode_mnh_zwork.f90
+++ b/MNH/mode_mnh_zwork.f90
@@ -1,204 +1,284 @@
 MODULE MODE_MNH_ZWORK
 
-INTEGER, SAVE :: IIB,IJB,IKB  ! Begining useful area in x,y,z directions
-INTEGER, SAVE :: IIE,IJE,IKE  ! End useful area in x,y,z directions
-
-!
-INTEGER,SAVE                    :: IJS,IJN, IIW,IIA
-!
-INTEGER, SAVE                   :: IIU,IJU,IKU
-LOGICAL, SAVE                   :: GWEST , GEAST
-LOGICAL, SAVE                   :: GSOUTH , GNORTH
-
-LOGICAL, SAVE                   :: GFIRST_CALL_MNH_ALLOC_ZWORK = .TRUE.
-!
-REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: & 
-& ZW3D1,ZW3D2,ZW3D3,ZW3D4,ZW3D5,ZW3D6,ZW3D7, &
-& ZW3D8,ZW3D9,ZW3D10,ZW3D11,ZW3D12,ZW3D13,ZW3D14,ZW3D15, &
-& ZW3D20,ZW3D21,ZW3D22,ZW3D23,ZW3D24,ZW3D25,ZW3D26,ZW3D27, &
-& ZPPM, &
-& ZRHOX1_PPM_MET,ZRHOX2_PPM_MET,ZRHOY1_PPM_MET, &
-& ZRHOY2_PPM_MET,ZRHOZ1_PPM_MET,ZRHOZ2_PPM_MET, &
-& ZSRC_PPM_MET  
-!$acc declare mirror(ZW3D1,ZW3D2,ZW3D3,ZW3D4,ZW3D5,ZW3D6,ZW3D7) &
-!$acc & mirror(ZW3D8,ZW3D9,ZW3D10,ZW3D11,ZW3D12,ZW3D13,ZW3D14,ZW3D15) &
-!$acc & mirror(ZW3D20,ZW3D21,ZW3D22,ZW3D23,ZW3D24,ZW3D25,ZW3D26,ZW3D27) &
-!$acc & mirror(ZPPM) &
-!$acc & mirror(ZRHOX1_PPM_MET,ZRHOX2_PPM_MET,ZRHOY1_PPM_MET) &
-!$acc & mirror(ZRHOY2_PPM_MET,ZRHOZ1_PPM_MET,ZRHOZ2_PPM_MET) &
-!$acc & mirror(ZSRC_PPM_MET) 
+  IMPLICIT NONE
+
+  INTEGER, SAVE :: IIB,IJB,IKB  ! Begining useful area in x,y,z directions
+  INTEGER, SAVE :: IIE,IJE,IKE  ! End useful area in x,y,z directions
+
+  !
+  INTEGER,SAVE                    :: IJS,IJN, IIW,IIA
+  !
+  INTEGER, SAVE                   :: IIU,IJU,IKU
+  LOGICAL, SAVE                   :: GWEST , GEAST
+  LOGICAL, SAVE                   :: GSOUTH , GNORTH
+
+  LOGICAL, SAVE                   :: GFIRST_CALL_MNH_ALLOC_ZWORK = .TRUE.
+  !
+  REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: & 
+       & ZW3D20,ZW3D21,ZW3D22,ZW3D23,ZW3D24,ZW3D25, &
+       & ZPPM, &
+       & ZRHOX1_PPM_MET,ZRHOX2_PPM_MET,ZRHOY1_PPM_MET, &
+       & ZRHOY2_PPM_MET,ZRHOZ1_PPM_MET,ZRHOZ2_PPM_MET, &
+       & ZSRC_PPM_MET  
+  !$acc declare mirror (ZW3D20,ZW3D21,ZW3D22,ZW3D23,ZW3D24,ZW3D25) &
+  !$acc & mirror(ZPPM) &
+  !$acc & mirror(ZRHOX1_PPM_MET,ZRHOX2_PPM_MET,ZRHOY1_PPM_MET) &
+  !$acc & mirror(ZRHOY2_PPM_MET,ZRHOZ1_PPM_MET,ZRHOZ2_PPM_MET) &
+  !$acc & mirror(ZSRC_PPM_MET) 
 
- 
-REAL, SAVE, ALLOCATABLE , DIMENSION(:,:)   :: ZPSRC_HALO2_WEST
-REAL, SAVE, ALLOCATABLE , DIMENSION(:,:)   :: ZPSRC_HALO2_SOUTH
-!$acc declare mirror(ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH)
 
-REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: ZUNIT3D
-!$acc declare mirror(ZUNIT3D)
+  REAL, SAVE, ALLOCATABLE , DIMENSION(:,:)   :: ZPSRC_HALO2_WEST
+  REAL, SAVE, ALLOCATABLE , DIMENSION(:,:)   :: ZPSRC_HALO2_SOUTH
+  !$acc declare mirror(ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH)
 
-REAL, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: &
- ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG
-!$acc declare mirror(ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)
+  REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: ZUNIT3D
+  !$acc declare mirror(ZUNIT3D)
+
+!!$  REAL, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: &
+!!$       ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG
+!!$  !$acc declare mirror(ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)
+
+  REAL, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: &
+       ZRUT,ZRVT,ZRWT,ZRUCT,ZRVCT,ZRWCT
+  !$acc declare mirror(ZRUT,ZRVT,ZRWT,ZRUCT,ZRVCT,ZRWCT)
+  !
+
+  INTEGER                                   :: JPMAX_T3D = 20
+  INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT3D_POOL
+  INTEGER                                   :: NT3D_TOP , NT3D_TOP_MAX = 0  
+  REAL    , ALLOCATABLE, DIMENSION(:,:,:,:) :: ZT3D , ZT3D_REALLOC
+  !$acc declare mirror(ZT3D,ZT3D_REALLOC)
 
-REAL, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: &
- ZRUT,ZRVT,ZRWT,ZRUCT,ZRVCT,ZRWCT
-!$acc declare mirror(ZRUT,ZRVT,ZRWT,ZRUCT,ZRVCT,ZRWCT)
-!
 CONTAINS
 
-SUBROUTINE MNH_ALLOC_ZWORK(IMODEL)
+  SUBROUTINE MNH_ALLOC_ZWORK(IMODEL)
 
-  USE MODE_TOOLS_ll, ONLY   : LWEST_ll,LEAST_ll, LSOUTH_ll, LNORTH_ll
+    USE MODE_TOOLS_ll, ONLY   : LWEST_ll,LEAST_ll, LSOUTH_ll, LNORTH_ll
 
-  USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF
-  USE MODD_DIM_n,      ONLY : NKMAX
+    USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF
+    USE MODD_DIM_n,      ONLY : NKMAX
 
-  IMPLICIT NONE
-  
-  INTEGER :: IMODEL
-
-  IF (GFIRST_CALL_MNH_ALLOC_ZWORK) THEN
-     GFIRST_CALL_MNH_ALLOC_ZWORK = .FALSE.
-     
-     CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
-     IJS=IJB
-     IJN=IJE
-     IIW=IIB
-     IIA=IIE
-     IKB = 1     + JPVEXT
-     IKE = NKMAX + JPVEXT
-
-     CALL GET_DIM_EXT_ll('B',IIU,IJU)     
-     IKU=NKMAX + 2* JPVEXT
-     
-     GWEST = LWEST_ll()
-     GEAST = LEAST_ll()
-
-     GSOUTH=LSOUTH_ll()
-     GNORTH=LNORTH_ll()
+
+
+    IMPLICIT NONE
+
+    INTEGER :: IMODEL
+
+    INTEGER :: JI
+
+    IF (GFIRST_CALL_MNH_ALLOC_ZWORK) THEN
+       GFIRST_CALL_MNH_ALLOC_ZWORK = .FALSE.
+
+       !
+       ! Array dim
+       !
+       CALL GET_DIM_EXT_ll('B',IIU,IJU)     
+       IKU=NKMAX + 2* JPVEXT
+
+       !
+       ! Computation bound
+       !
+       CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+       IJS=IJB
+       IJN=IJE
+       IIW=IIB
+       IIA=IIE
+       IKB = 1     + JPVEXT
+       IKE = NKMAX + JPVEXT
+
+
+       !
+       ! Lateral boundary
+       !
+       GWEST = LWEST_ll()
+       GEAST = LEAST_ll()
+
+       GSOUTH=LSOUTH_ll()
+       GNORTH=LNORTH_ll()
+
+       !
+       ! Work array
+       ! 
+
+       ALLOCATE (ZW3D20(IIU,IJU,IKU)) 
+       ALLOCATE (ZW3D21(IIU,IJU,IKU))
+       ALLOCATE (ZW3D22(IIU,IJU,IKU))
+       ALLOCATE (ZW3D23(IIU,IJU,IKU))
+       ALLOCATE (ZW3D24(IIU,IJU,IKU))
+       ALLOCATE (ZW3D25(IIU,IJU,IKU))
+ 
+       ALLOCATE (ZPPM(IIU,IJU,IKU))
+       ALLOCATE (ZRHOX1_PPM_MET(IIU,IJU,IKU))
+       ALLOCATE (ZRHOX2_PPM_MET(IIU,IJU,IKU))
+       ALLOCATE (ZRHOY1_PPM_MET(IIU,IJU,IKU))
+       ALLOCATE (ZRHOY2_PPM_MET(IIU,IJU,IKU))
+       ALLOCATE (ZRHOZ1_PPM_MET(IIU,IJU,IKU))
+       ALLOCATE (ZRHOZ2_PPM_MET(IIU,IJU,IKU)) 
+       ALLOCATE (ZSRC_PPM_MET(IIU,IJU,IKU)) 
+
+       ALLOCATE (ZPSRC_HALO2_WEST(IJU,IKU)) 
+       ALLOCATE (ZPSRC_HALO2_SOUTH(IIU,IKU)) 
+
+       ALLOCATE (ZUNIT3D(IIU,IJU,IKU)) 
+
+!!$       ALLOCATE (ZQL(IIU,IJU,IKU),ZQR(IIU,IJU,IKU),ZDQ(IIU,IJU,IKU))
+!!$       ALLOCATE (ZQ6(IIU,IJU,IKU),ZDMQ(IIU,IJU,IKU),ZQL0(IIU,IJU,IKU))
+!!$       ALLOCATE (ZQR0(IIU,IJU,IKU),ZQ60(IIU,IJU,IKU),ZFPOS(IIU,IJU,IKU))
+!!$       ALLOCATE (ZFNEG(IIU,IJU,IKU))
+
+       ALLOCATE (ZRUT(IIU,IJU,IKU),ZRVT(IIU,IJU,IKU),ZRWT(IIU,IJU,IKU))
+       ALLOCATE (ZRUCT(IIU,IJU,IKU),ZRVCT(IIU,IJU,IKU),ZRWCT(IIU,IJU,IKU))
+
+       ALLOCATE (ZT3D(IIU,IJU,IKU,JPMAX_T3D))
+       ALLOCATE (NT3D_POOL(JPMAX_T3D))
+       NT3D_TOP = 0
+       DO JI = 1, JPMAX_T3D
+          NT3D_POOL(JI) = JI
+       END DO
+
+       !$acc kernels 
+
+       ZW3D20 = XUNDEF
+       ZW3D21 = XUNDEF
+       ZW3D22 = XUNDEF
+       ZW3D23 = XUNDEF
+       ZW3D24 = XUNDEF
+       ZW3D25 = XUNDEF
  
-     ALLOCATE (ZW3D1(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D2(IIU,IJU,IKU))
-     ALLOCATE (ZW3D3(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D4(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D5(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D6(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D7(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D8(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D9(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D10(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D11(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D12(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D13(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D14(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D15(IIU,IJU,IKU)) 
-
-     ALLOCATE (ZW3D20(IIU,IJU,IKU)) 
-     ALLOCATE (ZW3D21(IIU,IJU,IKU))
-     ALLOCATE (ZW3D22(IIU,IJU,IKU))
-     ALLOCATE (ZW3D23(IIU,IJU,IKU))
-     ALLOCATE (ZW3D24(IIU,IJU,IKU))
-     ALLOCATE (ZW3D25(IIU,IJU,IKU))
-     ALLOCATE (ZW3D26(IIU,IJU,IKU))
-     ALLOCATE (ZW3D27(IIU,IJU,IKU))
-
-     ALLOCATE (ZPPM(IIU,IJU,IKU))
-     ALLOCATE (ZRHOX1_PPM_MET(IIU,IJU,IKU))
-     ALLOCATE (ZRHOX2_PPM_MET(IIU,IJU,IKU))
-     ALLOCATE (ZRHOY1_PPM_MET(IIU,IJU,IKU))
-     ALLOCATE (ZRHOY2_PPM_MET(IIU,IJU,IKU))
-     ALLOCATE (ZRHOZ1_PPM_MET(IIU,IJU,IKU))
-     ALLOCATE (ZRHOZ2_PPM_MET(IIU,IJU,IKU)) 
-     ALLOCATE (ZSRC_PPM_MET(IIU,IJU,IKU)) 
-
-     ALLOCATE (ZPSRC_HALO2_WEST(IJU,IKU)) 
-     ALLOCATE (ZPSRC_HALO2_SOUTH(IIU,IKU)) 
-
-     ALLOCATE (ZUNIT3D(IIU,IJU,IKU)) 
-
-     ALLOCATE (ZQL(IIU,IJU,IKU),ZQR(IIU,IJU,IKU),ZDQ(IIU,IJU,IKU))
-     ALLOCATE (ZQ6(IIU,IJU,IKU),ZDMQ(IIU,IJU,IKU),ZQL0(IIU,IJU,IKU))
-     ALLOCATE (ZQR0(IIU,IJU,IKU),ZQ60(IIU,IJU,IKU),ZFPOS(IIU,IJU,IKU))
-     ALLOCATE (ZFNEG(IIU,IJU,IKU))
-
-     ALLOCATE (ZRUT(IIU,IJU,IKU),ZRVT(IIU,IJU,IKU),ZRWT(IIU,IJU,IKU))
-     ALLOCATE (ZRUCT(IIU,IJU,IKU),ZRVCT(IIU,IJU,IKU),ZRWCT(IIU,IJU,IKU))
-
-!$acc kernels 
-     ZW3D1 = XUNDEF
-     ZW3D2 = XUNDEF
-     ZW3D3 = XUNDEF
-     ZW3D4 = XUNDEF
-     ZW3D5 = XUNDEF
-     ZW3D6 = XUNDEF
-     ZW3D7 = XUNDEF
-     ZW3D8 = XUNDEF
-     ZW3D9 = XUNDEF
-     ZW3D10 = XUNDEF
-     ZW3D11 = XUNDEF
-     ZW3D12 = XUNDEF
-     ZW3D13 = XUNDEF
-     ZW3D14 = XUNDEF
-     ZW3D15 = XUNDEF
-
-     ZW3D20 = XUNDEF
-     ZW3D21 = XUNDEF
-     ZW3D22 = XUNDEF
-     ZW3D23 = XUNDEF
-     ZW3D24 = XUNDEF
-     ZW3D25 = XUNDEF
-     ZW3D26 = XUNDEF
-     ZW3D27 = XUNDEF
-
-     ZPPM   = XUNDEF
-
-     ZPSRC_HALO2_WEST = XUNDEF
-     ZPSRC_HALO2_SOUTH = XUNDEF
-     
-     ZUNIT3D = 1.0
-
-     ZRHOX1_PPM_MET = XUNDEF
-     ZRHOX2_PPM_MET = XUNDEF
-     ZRHOY1_PPM_MET = XUNDEF
-     ZRHOY2_PPM_MET = XUNDEF
-     ZRHOZ1_PPM_MET = XUNDEF
-     ZRHOZ2_PPM_MET = XUNDEF  
-     ZSRC_PPM_MET   = XUNDEF
-
-     ZQL = XUNDEF
-     ZQR = XUNDEF
-     ZDQ = XUNDEF
-     ZQ6 = XUNDEF
-     ZDMQ = XUNDEF
-     ZQL0 = XUNDEF
-     ZQR0 = XUNDEF
-     ZQ60 = XUNDEF
-     ZFPOS = XUNDEF
-     ZFNEG = XUNDEF 
-     
-     ZRUT = XUNDEF
-     ZRVT = XUNDEF
-     ZRWT = XUNDEF
-     ZRUCT = XUNDEF
-     ZRVCT = XUNDEF
-     ZRWCT = XUNDEF
-
-!$acc end kernels
-!$acc update host (ZW3D1,ZW3D2,ZW3D3,ZW3D4,ZW3D5,ZW3D6,ZW3D7)
-!$acc update host (ZW3D8,ZW3D9,ZW3D10,ZW3D11,ZW3D12,ZW3D13,ZW3D14,ZW3D15)
-!$acc update host (ZW3D20,ZW3D21,ZW3D22,ZW3D23,ZW3D24,ZW3D25,ZW3D26,ZW3D27)
-!$acc update host (ZPPM)
-!$acc update host (ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH)
-!$acc update host (ZUNIT3D)  
-!$acc update host (ZRHOX1_PPM_MET,ZRHOX2_PPM_MET,ZRHOY1_PPM_MET)
-!$acc update host (ZRHOY2_PPM_MET,ZRHOZ1_PPM_MET,ZRHOZ2_PPM_MET) 
-!$acc update host (ZSRC_PPM_MET) 
-!$acc update host (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)
-!$acc update host (ZRUT,ZRVT,ZRWT,ZRUCT,ZRVCT,ZRWCT)
-    
-
-  END IF
-  
-END SUBROUTINE MNH_ALLOC_ZWORK
+       ZPPM   = XUNDEF
+
+       ZPSRC_HALO2_WEST = XUNDEF
+       ZPSRC_HALO2_SOUTH = XUNDEF
+
+       ZUNIT3D = 1.0
+
+       ZRHOX1_PPM_MET = XUNDEF
+       ZRHOX2_PPM_MET = XUNDEF
+       ZRHOY1_PPM_MET = XUNDEF
+       ZRHOY2_PPM_MET = XUNDEF
+       ZRHOZ1_PPM_MET = XUNDEF
+       ZRHOZ2_PPM_MET = XUNDEF  
+       ZSRC_PPM_MET   = XUNDEF
+
+!!$       ZQL = XUNDEF
+!!$       ZQR = XUNDEF
+!!$       ZDQ = XUNDEF
+!!$       ZQ6 = XUNDEF
+!!$       ZDMQ = XUNDEF
+!!$       ZQL0 = XUNDEF
+!!$       ZQR0 = XUNDEF
+!!$       ZQ60 = XUNDEF
+!!$       ZFPOS = XUNDEF
+!!$       ZFNEG = XUNDEF 
+
+       ZRUT = XUNDEF
+       ZRVT = XUNDEF
+       ZRWT = XUNDEF
+       ZRUCT = XUNDEF
+       ZRVCT = XUNDEF
+       ZRWCT = XUNDEF
+
+       ZT3D =  XUNDEF
+
+       !$acc end kernels
+
+       !$acc update host (ZW3D20,ZW3D21,ZW3D22,ZW3D23,ZW3D24,ZW3D25)
+       !$acc update host (ZPPM)
+       !$acc update host (ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH)
+       !$acc update host (ZUNIT3D)  
+       !$acc update host (ZRHOX1_PPM_MET,ZRHOX2_PPM_MET,ZRHOY1_PPM_MET)
+       !$acc update host (ZRHOY2_PPM_MET,ZRHOZ1_PPM_MET,ZRHOZ2_PPM_MET) 
+       !$acc update host (ZSRC_PPM_MET) 
+!!$       !$acc update host (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)
+       !$acc update host (ZRUT,ZRVT,ZRWT,ZRUCT,ZRVCT,ZRWCT)
+
+       !$acc update host (ZT3D)
+
+
+    END IF
+
+  END SUBROUTINE MNH_ALLOC_ZWORK
+
+  SUBROUTINE MNH_GET_ZT3D_N0(KTEMP)
+
+    IMPLICIT NONE
+
+    INTEGER :: KTEMP
+
+    IF (NT3D_TOP == JPMAX_T3D ) THEN
+       print*," MNH_GET_ZT3D JPMAX_T3D OVER FLOW=", JPMAX_T3D
+       call ABORT()
+    ELSE
+       NT3D_TOP = NT3D_TOP + 1
+       KTEMP = NT3D_POOL(NT3D_TOP)
+       NT3D_POOL(NT3D_TOP) = -1
+       IF (  NT3D_TOP > NT3D_TOP_MAX ) THEN
+          NT3D_TOP_MAX = NT3D_TOP
+          print*," MNH_GET_ZT3D  NT3D_TOP_MAX=", NT3D_TOP_MAX , "KTEMP=",KTEMP
+       END IF
+    ENDIF
+
+
+  END SUBROUTINE MNH_GET_ZT3D_N0
+
+  SUBROUTINE MNH_GET_ZT3D(KTEMP1,KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9,KTEMP10)
+
+    IMPLICIT NONE
+
+    INTEGER          :: KTEMP1
+    INTEGER,OPTIONAL :: KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9,KTEMP10
+
+                          CALL MNH_GET_ZT3D_N0(KTEMP1)
+    IF (PRESENT(KTEMP2))  CALL MNH_GET_ZT3D_N0(KTEMP2)
+    IF (PRESENT(KTEMP3))  CALL MNH_GET_ZT3D_N0(KTEMP3)
+    IF (PRESENT(KTEMP4))  CALL MNH_GET_ZT3D_N0(KTEMP4)
+    IF (PRESENT(KTEMP5))  CALL MNH_GET_ZT3D_N0(KTEMP5)
+    IF (PRESENT(KTEMP6))  CALL MNH_GET_ZT3D_N0(KTEMP6)
+    IF (PRESENT(KTEMP7))  CALL MNH_GET_ZT3D_N0(KTEMP7)
+    IF (PRESENT(KTEMP8))  CALL MNH_GET_ZT3D_N0(KTEMP8)
+    IF (PRESENT(KTEMP9))  CALL MNH_GET_ZT3D_N0(KTEMP9)
+    IF (PRESENT(KTEMP10)) CALL MNH_GET_ZT3D_N0(KTEMP10)
+
+
+  END SUBROUTINE MNH_GET_ZT3D
+
+  SUBROUTINE MNH_REL_ZT3D_N0(KTEMP)
+
+    IMPLICIT NONE
+
+    INTEGER :: KTEMP
+
+    IF ( ( NT3D_TOP > JPMAX_T3D ) .OR. ( NT3D_TOP < 1 ) ) THEN
+       print*," MNH_REL_ZT3D NT3D_TOP OVER FLOW NT3D_TOP=", NT3D_TOP
+       call ABORT()
+    ELSE
+       NT3D_POOL(NT3D_TOP) = KTEMP
+       !print*," MNH_REL_ZT3D  NT3D_TOP=", NT3D_TOP , "KTEMP=",KTEMP
+       NT3D_TOP = NT3D_TOP - 1
+    ENDIF
+
+  END SUBROUTINE MNH_REL_ZT3D_N0
+
+  SUBROUTINE MNH_REL_ZT3D(KTEMP1,KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9,KTEMP10)
+
+    IMPLICIT NONE
+
+    INTEGER          :: KTEMP1
+    INTEGER,OPTIONAL :: KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9,KTEMP10
+
+                          CALL MNH_REL_ZT3D_N0(KTEMP1)
+    IF (PRESENT(KTEMP2))  CALL MNH_REL_ZT3D_N0(KTEMP2)
+    IF (PRESENT(KTEMP3))  CALL MNH_REL_ZT3D_N0(KTEMP3)
+    IF (PRESENT(KTEMP4))  CALL MNH_REL_ZT3D_N0(KTEMP4)
+    IF (PRESENT(KTEMP5))  CALL MNH_REL_ZT3D_N0(KTEMP5)
+    IF (PRESENT(KTEMP6))  CALL MNH_REL_ZT3D_N0(KTEMP6)
+    IF (PRESENT(KTEMP7))  CALL MNH_REL_ZT3D_N0(KTEMP7)
+    IF (PRESENT(KTEMP8))  CALL MNH_REL_ZT3D_N0(KTEMP8)
+    IF (PRESENT(KTEMP9))  CALL MNH_REL_ZT3D_N0(KTEMP9)
+    IF (PRESENT(KTEMP10)) CALL MNH_REL_ZT3D_N0(KTEMP10)
+
+  END SUBROUTINE MNH_REL_ZT3D
+
+
 
 END MODULE MODE_MNH_ZWORK
-- 
GitLab