Index: LMDZ6/trunk/libf/phylmd/climb_hq_mod.f90
===================================================================
--- LMDZ6/trunk/libf/phylmd/climb_hq_mod.f90	(revision 5953)
+++ LMDZ6/trunk/libf/phylmd/climb_hq_mod.f90	(revision 5954)
@@ -8,5 +8,5 @@
   IMPLICIT NONE
   PRIVATE
-  PUBLIC :: climb_hq_down, climb_hq_up
+  PUBLIC :: climb_hq_down, climb_hq_up, climb_hq_init, climb_hq_finalize
 
   REAL, DIMENSION(:,:), ALLOCATABLE :: gamaq, gamah
@@ -28,9 +28,82 @@
   REAL, SAVE, DIMENSION(:), ALLOCATABLE :: f_h_bnd ! for diagnostics, enthalpy flux at surface
   !$OMP THREADPRIVATE(f_h_bnd)
-
+  
 CONTAINS
 !
 !****************************************************************************************
 !
+  SUBROUTINE climb_hq_init
+  USE dimphy, ONLY : klon, klev
+  IMPLICIT NONE
+    INTEGER :: ierr
+  
+     ALLOCATE(Ccoef_Q(klon,klev), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc Ccoef_Q, ierr=', ierr
+     Ccoef_Q(:,:) = 0.
+
+     ALLOCATE(Dcoef_Q(klon,klev), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc Dcoef_Q, ierr=', ierr
+     Dcoef_Q(:,:) = 0.
+
+     ALLOCATE(Ccoef_H(klon,klev), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc Ccoef_H, ierr=', ierr
+     Ccoef_H(:,:) = 0.
+
+     ALLOCATE(Dcoef_H(klon,klev), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc Dcoef_H, ierr=', ierr
+     Dcoef_H(:,:) = 0.
+
+     ALLOCATE(Acoef_Q(klon), Bcoef_Q(klon), Acoef_H(klon), Bcoef_H(klon), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc Acoef_X and Bcoef_X, ierr=', ierr
+     Acoef_Q(:)=0. ; Bcoef_Q(:)=0. ; Acoef_H(:)=0. ; Bcoef_H(:)=0. ;
+
+     ALLOCATE(Kcoefhq(klon,klev), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc Kcoefhq, ierr=', ierr
+     Kcoefhq(:,:) = 0.
+
+     ALLOCATE(gamaq(1:klon,2:klev), STAT=ierr)
+     IF ( ierr /= 0 ) PRINT*,' pb in allloc gamaq, ierr=', ierr
+     gamaq(:,:) = 0.
+
+     ALLOCATE(gamah(1:klon,2:klev), STAT=ierr)
+     IF ( ierr /= 0 ) PRINT*,' pb in allloc gamah, ierr=', ierr
+     gamah(:,:)=0.
+
+     ALLOCATE(h_old(klon,klev), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc h_old, ierr=', ierr
+     h_old(:,:) = 0.
+
+     ALLOCATE(d_h_col_vdf(klon), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc d_h_col_vdf, ierr=', ierr
+     d_h_col_vdf(:) = 0.
+
+     ALLOCATE(f_h_bnd(klon), STAT=ierr)
+     IF ( ierr /= 0 )  PRINT*,' pb in allloc f_h_bnd, ierr=', ierr
+     f_h_bnd(:) = 0.
+
+  END SUBROUTINE climb_hq_init
+
+  SUBROUTINE climb_hq_finalize
+  IMPLICIT NONE
+    INTEGER :: ierr
+
+    !****************************************************************************************
+    ! Some deallocations
+    !
+    !****************************************************************************************
+    
+    DEALLOCATE(Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H,stat=ierr)    
+    IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H, ierr=', ierr
+    DEALLOCATE(Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H,stat=ierr)    
+    IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H, ierr=', ierr
+    DEALLOCATE(gamaq, gamah,stat=ierr)
+    IF ( ierr /= 0 )  PRINT*,' pb in dealllocate gamaq, gamah, ierr=', ierr
+    DEALLOCATE(Kcoefhq,stat=ierr)
+    IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Kcoefhq, ierr=', ierr
+    DEALLOCATE(h_old, d_h_col_vdf, f_h_bnd, stat=ierr)
+    IF ( ierr /= 0 )  PRINT*,' pb in dealllocate h_old, d_h_col_vdf, f_h_bnd, ierr=', ierr
+
+  END  SUBROUTINE climb_hq_finalize
+
   SUBROUTINE climb_hq_down(knon, ni, coefhq, paprs, pplay, &
        delp, temp, q, dtime, &
@@ -40,4 +113,5 @@
 !!!
        Acoef_H_out, Acoef_Q_out, Bcoef_H_out, Bcoef_Q_out)
+!$gpum horizontal knon
 
 ! This routine calculates recursivly the coefficients C and D
@@ -78,6 +152,6 @@
     REAL :: yAcoef_Q(knon), yBcoef_Q(knon), yAcoef_H(knon), yBcoef_H(knon)
     REAL :: yKcoefhq(knon,klev)
-    REAL :: ygamaq(1:knon,2:klev)
-    REAL :: ygamah(1:knon,2:klev)
+    REAL :: ygamaq(knon,2:klev)
+    REAL :: ygamah(knon,2:klev)
     REAL :: yh_old(knon,klev) ! for diagnostics, h before solving diffusion
     REAL :: yd_h_col_vdf(knon) ! for diagnostics, vertical integral of enthalpy change
@@ -87,6 +161,4 @@
 ! Local variables
 !****************************************************************************************
-    LOGICAL, SAVE                            :: first=.TRUE.
-    !$OMP THREADPRIVATE(first)
 ! JLD now renamed h_old and declared in module
 !    REAL, DIMENSION(knon,klev)               :: local_H
@@ -96,46 +168,6 @@
 
 
-!****************************************************************************************
-! 1)
-! Allocation at first time step only
-!   
-!****************************************************************************************
-
-    IF (first) THEN
-       first=.FALSE.
-       ALLOCATE(Ccoef_Q(klon,klev), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc Ccoef_Q, ierr=', ierr
-       
-       ALLOCATE(Dcoef_Q(klon,klev), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc Dcoef_Q, ierr=', ierr
-       
-       ALLOCATE(Ccoef_H(klon,klev), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc Ccoef_H, ierr=', ierr
-       
-       ALLOCATE(Dcoef_H(klon,klev), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc Dcoef_H, ierr=', ierr
-       
-       ALLOCATE(Acoef_Q(klon), Bcoef_Q(klon), Acoef_H(klon), Bcoef_H(klon), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc Acoef_X and Bcoef_X, ierr=', ierr
-       
-       ALLOCATE(Kcoefhq(klon,klev), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc Kcoefhq, ierr=', ierr
-       
-       ALLOCATE(gamaq(1:klon,2:klev), STAT=ierr)
-       IF ( ierr /= 0 ) PRINT*,' pb in allloc gamaq, ierr=', ierr
-       
-       ALLOCATE(gamah(1:klon,2:klev), STAT=ierr)
-       IF ( ierr /= 0 ) PRINT*,' pb in allloc gamah, ierr=', ierr
-       
-       ALLOCATE(h_old(klon,klev), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc h_old, ierr=', ierr
-       
-       ALLOCATE(d_h_col_vdf(klon), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc d_h_col_vdf, ierr=', ierr
-       
-       ALLOCATE(f_h_bnd(klon), STAT=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in allloc f_h_bnd, ierr=', ierr
-    END IF
-
+    yd_h_col_vdf(:) =0.
+    yf_h_bnd(:) = 0.
 !****************************************************************************************
 ! 2)
@@ -192,6 +224,6 @@
 !****************************************************************************************
     
-    CALL calc_coef(knon, yKcoefhq(:,:), ygamaq(:,:), delp(:,:), q(:,:), &
-         yCcoef_Q(:,:), yDcoef_Q(:,:), yAcoef_Q, yBcoef_Q)
+    CALL calc_coef(knon, yKcoefhq, ygamaq, delp, q, &
+         yCcoef_Q, yDcoef_Q, yAcoef_Q, yBcoef_Q)
 
 !****************************************************************************************
@@ -210,6 +242,6 @@
     ENDDO
 
-    CALL calc_coef(knon, yKcoefhq(:,:), ygamah(:,:), delp(:,:), yh_old(:,:), &
-         yCcoef_H(:,:), yDcoef_H(:,:), yAcoef_H, yBcoef_H)
+    CALL calc_coef(knon, yKcoefhq, ygamah, delp, yh_old, &
+         yCcoef_H, yDcoef_H, yAcoef_H, yBcoef_H)
  
 !****************************************************************************************
@@ -282,4 +314,5 @@
 !
   SUBROUTINE calc_coef(knon, Kcoef, gama, delp, X, Ccoef, Dcoef, Acoef, Bcoef)
+!$gpum horizontal knon
 !
 ! Calculate the coefficients C and D in : X(k) = C(k) + D(k)*X(k-1)
@@ -355,4 +388,6 @@
 !!!
        flux_q, flux_h, d_q, d_t)
+!$gpum horizontal knon
+
 ! 
 ! This routine calculates the flux and tendency of the specific humidity q and 
@@ -392,12 +427,10 @@
     REAL :: yAcoef_Q(knon), yBcoef_Q(knon), yAcoef_H(knon), yBcoef_H(knon)
     REAL :: yKcoefhq(knon,klev)
-    REAL :: ygamaq(1:knon,2:klev)
-    REAL :: ygamah(1:knon,2:klev)
+    REAL :: ygamaq(knon,2:klev)
+    REAL :: ygamah(knon,2:klev)
     REAL :: yh_old(knon,klev)
     REAL :: yd_h_col_vdf(knon)
     REAL :: yf_h_bnd(knon)
 
-    LOGICAL, SAVE                            :: last=.FALSE.
-!$OMP THREADPRIVATE(last) 
     REAL, DIMENSION(knon,klev)               :: h_new, q_new
     REAL, DIMENSION(knon)                    :: psref         
@@ -551,20 +584,5 @@
       ENDDO
     ENDDO
-!****************************************************************************************
-! Some deallocations
-!
-!****************************************************************************************
-    IF (last) THEN
-       DEALLOCATE(Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H,stat=ierr)    
-       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H, ierr=', ierr
-       DEALLOCATE(Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H,stat=ierr)    
-       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H, ierr=', ierr
-       DEALLOCATE(gamaq, gamah,stat=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate gamaq, gamah, ierr=', ierr
-       DEALLOCATE(Kcoefhq,stat=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Kcoefhq, ierr=', ierr
-       DEALLOCATE(h_old, d_h_col_vdf, f_h_bnd, stat=ierr)
-       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate h_old, d_h_col_vdf, f_h_bnd, ierr=', ierr
-    END IF
+
   END SUBROUTINE climb_hq_up
 !
Index: LMDZ6/trunk/libf/phylmd/pbl_surface_mod.F90
===================================================================
--- LMDZ6/trunk/libf/phylmd/pbl_surface_mod.F90	(revision 5953)
+++ LMDZ6/trunk/libf/phylmd/pbl_surface_mod.F90	(revision 5954)
@@ -109,4 +109,5 @@
     USE flux_arp_mod_h
     USE cdrag_mod, ONLY : cdrag_init
+    USE climb_hq_mod, ONLY : climb_hq_init
     IMPLICIT NONE
  
@@ -263,4 +264,5 @@
 
     CALL cdrag_init
+    CALL climb_hq_init
 
   END SUBROUTINE pbl_surface_init
