New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 8568 for branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

Ignore:
Timestamp:
2017-09-27T16:29:24+02:00 (7 years ago)
Author:
gm
Message:

#1911 (ENHANCE-09): PART I.2 - _NONE option + remove zts + see associated wiki page

Location:
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/divhor.F90

    r7753 r8568  
    2929   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3030   USE lib_mpp         ! MPP library 
    31    USE wrk_nemo        ! Memory Allocation 
    3231   USE timing          ! Timing 
    3332 
     
    4039#  include "vectopt_loop_substitute.h90" 
    4140   !!---------------------------------------------------------------------- 
    42    !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
     41   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4342   !! $Id$  
    4443   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6463      !!---------------------------------------------------------------------- 
    6564      ! 
    66       IF( nn_timing == 1 )   CALL timing_start('div_hor') 
     65      IF( ln_timing )   CALL timing_start('div_hor') 
    6766      ! 
    6867      IF( kt == nit000 ) THEN 
     
    7574         DO jj = 2, jpjm1 
    7675            DO ji = fs_2, fs_jpim1   ! vector opt. 
    77                hdivn(ji,jj,jk) = (  e2u(ji  ,jj) * e3u_n(ji  ,jj,jk) * un(ji  ,jj,jk)        & 
    78                   &               - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * un(ji-1,jj,jk)        & 
    79                   &               + e1v(ji,jj  ) * e3v_n(ji,jj  ,jk) * vn(ji,jj  ,jk)        & 
    80                   &               - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vn(ji,jj-1,jk)   )    & 
    81                   &            / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) 
     76               hdivn(ji,jj,jk) = (  e2u(ji  ,jj) * e3u_n(ji  ,jj,jk) * un(ji  ,jj,jk)      & 
     77                  &               - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * un(ji-1,jj,jk)      & 
     78                  &               + e1v(ji,jj  ) * e3v_n(ji,jj  ,jk) * vn(ji,jj  ,jk)      & 
     79                  &               - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vn(ji,jj-1,jk)  )   & 
     80                  &            * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    8281            END DO   
    8382         END DO   
     
    9089      END DO 
    9190      ! 
    92       IF( ln_rnf )   CALL sbc_rnf_div( hdivn )      !==  runoffs    ==!   (update hdivn field) 
     91      IF( ln_rnf )   CALL sbc_rnf_div( hdivn )              !==  runoffs    ==!   (update hdivn field) 
    9392      ! 
    94       IF( ln_isf )   CALL sbc_isf_div( hdivn )      !==  ice shelf  ==!   (update hdivn field) 
     93      IF( ln_isf )   CALL sbc_isf_div( hdivn )              !==  ice shelf  ==!   (update hdivn field) 
    9594      ! 
    96       IF( ln_iscpl .AND. ln_hsb ) CALL iscpl_div( hdivn ) !==  ice sheet  ==!   (update hdivn field) 
     95      IF( ln_iscpl .AND. ln_hsb )   CALL iscpl_div( hdivn ) !==  ice sheet  ==!   (update hdivn field) 
    9796      ! 
    98       CALL lbc_lnk( hdivn, 'T', 1. )                !==  lateral boundary cond.  ==!   (no sign change) 
     97      CALL lbc_lnk( hdivn, 'T', 1. )   !   (no sign change) 
    9998      ! 
    100       IF( nn_timing == 1 )  CALL timing_stop('div_hor') 
     99      IF( ln_timing )   CALL timing_stop('div_hor') 
    101100      ! 
    102101   END SUBROUTINE div_hor 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90

    r7646 r8568  
    77   !!            3.3  !  2010-10  (C. Ethe, G. Madec)  reorganisation of initialisation phase 
    88   !!            3.6  !  2015-05  (N. Ducousso, G. Madec)  add Hollingsworth scheme as an option  
     9   !!            4.0  !  2017-07  (G. Madec)  add a linear dynamics option 
    910   !!---------------------------------------------------------------------- 
    1011 
     
    3031  
    3132   !                                    !* namdyn_adv namelist * 
    32    LOGICAL, PUBLIC ::   ln_dynadv_vec   !: vector form flag 
    33    INTEGER, PUBLIC ::   nn_dynkeg       !: scheme of kinetic energy gradient: =0 C2 ; =1 Hollingsworth 
     33   LOGICAL, PUBLIC ::   ln_dynadv_NONE  !: linear dynamics (no momentum advection) 
     34   LOGICAL, PUBLIC ::   ln_dynadv_vec   !: vector form 
     35   INTEGER, PUBLIC ::      nn_dynkeg       !: scheme of grad(KE): =0 C2 ; =1 Hollingsworth 
    3436   LOGICAL, PUBLIC ::   ln_dynadv_cen2  !: flux form - 2nd order centered scheme flag 
    3537   LOGICAL, PUBLIC ::   ln_dynadv_ubs   !: flux form - 3rd order UBS scheme flag 
    36    LOGICAL, PUBLIC ::   ln_dynzad_zts   !: vertical advection with sub-timestepping (requires vector form) 
    3738    
    38    INTEGER ::   nadv   ! choice of the formulation and scheme for the advection 
     39   INTEGER, PUBLIC ::   n_dynadv   !: choice of the formulation and scheme for momentum advection 
     40   !                               !  associated indices: 
     41   INTEGER, PUBLIC, PARAMETER ::   np_LIN_dyn = 0   ! no advection: linear dynamics 
     42   INTEGER, PUBLIC, PARAMETER ::   np_VEC_c2  = 1   ! vector form : 2nd order centered scheme 
     43   INTEGER, PUBLIC, PARAMETER ::   np_FLX_c2  = 2   ! flux   form : 2nd order centered scheme 
     44   INTEGER, PUBLIC, PARAMETER ::   np_FLX_ubs = 3   ! flux   form : 3rd order Upstream Biased Scheme 
    3945 
    4046   !! * Substitutions 
    4147#  include "vectopt_loop_substitute.h90" 
    4248   !!---------------------------------------------------------------------- 
    43    !! NEMO/OPA 3.6 , NEMO Consortium (2015) 
     49   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4450   !! $Id$ 
    4551   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5359      !! ** Purpose :   compute the ocean momentum advection trend. 
    5460      !! 
    55       !! ** Method  : - Update (ua,va) with the advection term following nadv 
     61      !! ** Method  : - Update (ua,va) with the advection term following n_dynadv 
     62      !! 
    5663      !!      NB: in flux form advection (ln_dynadv_cen2 or ln_dynadv_ubs=T)  
    5764      !!      a metric term is add to the coriolis term while in vector form  
     
    6269      !!---------------------------------------------------------------------- 
    6370      ! 
    64       IF( nn_timing == 1 )  CALL timing_start('dyn_adv') 
     71      IF( ln_timing )   CALL timing_start( 'dyn_adv' ) 
    6572      ! 
    66       SELECT CASE ( nadv )                  ! compute advection trend and add it to general trend 
    67       CASE ( 0 )      
    68                       CALL dyn_keg     ( kt, nn_dynkeg )    ! vector form : horizontal gradient of kinetic energy 
    69                       CALL dyn_zad     ( kt )               ! vector form : vertical advection 
    70       CASE ( 1 )      
    71                       CALL dyn_keg     ( kt, nn_dynkeg )    ! vector form : horizontal gradient of kinetic energy 
    72                       CALL dyn_zad_zts ( kt )               ! vector form : vertical advection with sub-timestepping 
    73       CASE ( 2 )  
    74                       CALL dyn_adv_cen2( kt )               ! 2nd order centered scheme 
    75       CASE ( 3 )    
    76                       CALL dyn_adv_ubs ( kt )               ! 3rd order UBS      scheme 
     73      SELECT CASE( n_dynadv )    !==  compute advection trend and add it to general trend  ==! 
     74      CASE( np_VEC_c2  )      
     75         CALL dyn_keg     ( kt, nn_dynkeg )    ! vector form : horizontal gradient of kinetic energy 
     76         CALL dyn_zad     ( kt )               ! vector form : vertical advection 
     77      CASE( np_FLX_c2  )  
     78         CALL dyn_adv_cen2( kt )               ! 2nd order centered scheme 
     79      CASE( np_FLX_ubs )    
     80         CALL dyn_adv_ubs ( kt )               ! 3rd order UBS      scheme (UP3) 
    7781      END SELECT 
    7882      ! 
    79       IF( nn_timing == 1 )  CALL timing_stop('dyn_adv') 
     83      IF( ln_timing )   CALL timing_stop( 'dyn_adv' ) 
    8084      ! 
    8185   END SUBROUTINE dyn_adv 
     
    8791      !!                 
    8892      !! ** Purpose :   Control the consistency between namelist options for  
    89       !!              momentum advection formulation & scheme and set nadv 
     93      !!              momentum advection formulation & scheme and set n_dynadv 
    9094      !!---------------------------------------------------------------------- 
    9195      INTEGER ::   ioptio, ios   ! Local integer 
    9296      ! 
    93       NAMELIST/namdyn_adv/ ln_dynadv_vec, nn_dynkeg, ln_dynadv_cen2 , ln_dynadv_ubs, ln_dynzad_zts 
     97      NAMELIST/namdyn_adv/ ln_dynadv_NONE, ln_dynadv_vec, nn_dynkeg, ln_dynadv_cen2, ln_dynadv_ubs 
    9498      !!---------------------------------------------------------------------- 
    9599      ! 
     
    108112         WRITE(numout,*) '~~~~~~~~~~~~' 
    109113         WRITE(numout,*) '   Namelist namdyn_adv : chose a advection formulation & scheme for momentum' 
    110          WRITE(numout,*) '      Vector/flux form (T/F)                           ln_dynadv_vec  = ', ln_dynadv_vec 
    111          WRITE(numout,*) '      = 0 standard scheme  ; =1 Hollingsworth scheme   nn_dynkeg      = ', nn_dynkeg 
    112          WRITE(numout,*) '      2nd order centred advection scheme               ln_dynadv_cen2 = ', ln_dynadv_cen2 
    113          WRITE(numout,*) '      3rd order UBS advection scheme                   ln_dynadv_ubs  = ', ln_dynadv_ubs 
    114          WRITE(numout,*) '      Sub timestepping of vertical advection           ln_dynzad_zts  = ', ln_dynzad_zts 
     114         WRITE(numout,*) '      linear dynamics : no momentum advection          ln_dynadv_NONE = ', ln_dynadv_NONE 
     115         WRITE(numout,*) '      Vector form: 2nd order centered scheme           ln_dynadv_vec  = ', ln_dynadv_vec 
     116         WRITE(numout,*) '         with Hollingsworth scheme (=1) or not (=0)       nn_dynkeg   = ', nn_dynkeg 
     117         WRITE(numout,*) '      flux form: 2nd order centred scheme              ln_dynadv_cen2 = ', ln_dynadv_cen2 
     118         WRITE(numout,*) '                 3rd order UBS scheme                  ln_dynadv_ubs  = ', ln_dynadv_ubs 
    115119      ENDIF 
    116120 
    117       ioptio = 0                      ! Parameter control 
    118       IF( ln_dynadv_vec  )   ioptio = ioptio + 1 
    119       IF( ln_dynadv_cen2 )   ioptio = ioptio + 1 
    120       IF( ln_dynadv_ubs  )   ioptio = ioptio + 1 
     121      ioptio = 0                      ! parameter control and set n_dynadv 
     122      IF( ln_dynadv_NONE ) THEN   ;   ioptio = ioptio + 1   ;   n_dynadv = np_LIN_dyn   ;   ENDIF 
     123      IF( ln_dynadv_vec  ) THEN   ;   ioptio = ioptio + 1   ;   n_dynadv = np_VEC_c2    ;   ENDIF 
     124      IF( ln_dynadv_cen2 ) THEN   ;   ioptio = ioptio + 1   ;   n_dynadv = np_FLX_c2    ;   ENDIF 
     125      IF( ln_dynadv_ubs  ) THEN   ;   ioptio = ioptio + 1   ;   n_dynadv = np_FLX_ubs   ;   ENDIF 
    121126 
    122       IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE advection scheme in namelist namdyn_adv' ) 
    123       IF( ln_dynzad_zts .AND. .NOT. ln_dynadv_vec )   & 
    124          CALL ctl_stop( 'Sub timestepping of vertical advection requires vector form; set ln_dynadv_vec = .TRUE.' ) 
    125       IF( nn_dynkeg /= nkeg_C2 .AND. nn_dynkeg /= nkeg_HW )   &   
    126          CALL ctl_stop( 'KEG scheme wrong value of nn_dynkeg' ) 
     127      IF( ioptio /= 1 )   CALL ctl_stop( 'choose ONE and only ONE advection scheme' ) 
     128      IF( nn_dynkeg /= nkeg_C2 .AND. nn_dynkeg /= nkeg_HW )   CALL ctl_stop( 'KEG scheme wrong value of nn_dynkeg' ) 
    127129 
    128       !                               ! Set nadv 
    129       IF( ln_dynadv_vec  )   nadv =  0  
    130       IF( ln_dynzad_zts  )   nadv =  1 
    131       IF( ln_dynadv_cen2 )   nadv =  2 
    132       IF( ln_dynadv_ubs  )   nadv =  3 
    133130 
    134131      IF(lwp) THEN                    ! Print the choice 
    135132         WRITE(numout,*) 
    136          IF( nadv ==  0 )   WRITE(numout,*) '      ===>>   vector form : keg + zad + vor is used'  
    137          IF( nadv ==  1 )   WRITE(numout,*) '      ===>>   vector form : keg + zad_zts + vor is used' 
    138          IF( nadv ==  0 .OR. nadv ==  1 ) THEN 
     133         SELECT CASE( n_dynadv ) 
     134         CASE( np_LIN_dyn )   ;   WRITE(numout,*) '      ===>>   linear dynamics : no momentum advection used' 
     135         CASE( np_VEC_c2  )   ;   WRITE(numout,*) '      ===>>   vector form : keg + zad + vor is used'  
    139136            IF( nn_dynkeg == nkeg_C2  )   WRITE(numout,*) '              with Centered standard keg scheme' 
    140137            IF( nn_dynkeg == nkeg_HW  )   WRITE(numout,*) '              with Hollingsworth keg scheme' 
    141          ENDIF 
    142          IF( nadv ==  2 )   WRITE(numout,*) '      ===>>   flux form   : 2nd order scheme is used' 
    143          IF( nadv ==  3 )   WRITE(numout,*) '      ===>>   flux form   : UBS       scheme is used' 
     138         CASE( np_FLX_c2  )   ;   WRITE(numout,*) '      ===>>   flux form   : 2nd order scheme is used' 
     139         CASE( np_FLX_ubs )   ;   WRITE(numout,*) '      ===>>   flux form   : UBS      scheme is used' 
     140         END SELECT 
    144141      ENDIF 
    145142      ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_cen2.F90

    r6750 r8568  
    2020   USE lib_mpp        ! MPP library 
    2121   USE prtctl         ! Print control 
    22    USE wrk_nemo       ! Memory Allocation 
    2322   USE timing         ! Timing 
    2423 
     
    3130#  include "vectopt_loop_substitute.h90" 
    3231   !!---------------------------------------------------------------------- 
    33    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     32   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    3433   !! $Id$ 
    3534   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5150      ! 
    5251      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    53       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfw 
    54       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zfu, zfv 
     52      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zfu_t, zfu_f, zfu_uw, zfu 
     53      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zfv_t, zfv_f, zfv_vw, zfv, zfw 
    5554      !!---------------------------------------------------------------------- 
    5655      ! 
    57       IF( nn_timing == 1 )  CALL timing_start('dyn_adv_cen2') 
    58       ! 
    59       CALL wrk_alloc( jpi,jpj,jpk,   zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 
     56      IF( ln_timing )   CALL timing_start('dyn_adv_cen2') 
    6057      ! 
    6158      IF( kt == nit000 .AND. lwp ) THEN 
     
    148145         &                       tab3d_2=va, clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    149146      ! 
    150       CALL wrk_dealloc( jpi, jpj, jpk, zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 
    151       ! 
    152       IF( nn_timing == 1 )  CALL timing_stop('dyn_adv_cen2') 
     147      IF( ln_timing )   CALL timing_stop('dyn_adv_cen2') 
    153148      ! 
    154149   END SUBROUTINE dyn_adv_cen2 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_ubs.F90

    r6750 r8568  
    2323   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    2424   USE lib_mpp        ! MPP library 
    25    USE wrk_nemo       ! Memory Allocation 
    2625   USE timing         ! Timing 
    2726 
     
    3736#  include "vectopt_loop_substitute.h90" 
    3837   !!---------------------------------------------------------------------- 
    39    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     38   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4039   !! $Id$ 
    4140   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    7473      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    7574      REAL(wp) ::   zui, zvj, zfuj, zfvi, zl_u, zl_v   ! local scalars 
    76       REAL(wp), POINTER, DIMENSION(:,:,:  ) ::  zfu, zfv 
    77       REAL(wp), POINTER, DIMENSION(:,:,:  ) ::  zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfw 
    78       REAL(wp), POINTER, DIMENSION(:,:,:,:) ::  zlu_uu, zlv_vv, zlu_uv, zlv_vu 
     75      REAL(wp), DIMENSION(jpi,jpj,jpk)   ::   zfu_t, zfu_f, zfu_uw, zfu 
     76      REAL(wp), DIMENSION(jpi,jpj,jpk)   ::   zfv_t, zfv_f, zfv_vw, zfv, zfw 
     77      REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   zlu_uu, zlu_uv 
     78      REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   zlv_vv, zlv_vu 
    7979      !!---------------------------------------------------------------------- 
    8080      ! 
    81       IF( nn_timing == 1 )  CALL timing_start('dyn_adv_ubs') 
    82       ! 
    83       CALL wrk_alloc( jpi,jpj,jpk,        zfu_t , zfv_t , zfu_f , zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 
    84       CALL wrk_alloc( jpi,jpj,jpk,jpts,   zlu_uu, zlv_vv, zlu_uv, zlv_vu                               ) 
     81      IF( ln_timing )   CALL timing_start('dyn_adv_ubs') 
    8582      ! 
    8683      IF( kt == nit000 ) THEN 
     
    241238         &                       tab3d_2=va, clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    242239      ! 
    243       CALL wrk_dealloc( jpi,jpj,jpk,        zfu_t , zfv_t , zfu_f , zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 
    244       CALL wrk_dealloc( jpi,jpj,jpk,jpts,   zlu_uu, zlv_vv, zlu_uv, zlv_vu                               ) 
    245       ! 
    246       IF( nn_timing == 1 )  CALL timing_stop('dyn_adv_ubs') 
     240      IF( ln_timing )   CALL timing_stop('dyn_adv_ubs') 
    247241      ! 
    248242   END SUBROUTINE dyn_adv_ubs 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90

    r8215 r8568  
    5757      !!--------------------------------------------------------------------- 
    5858      ! 
    59       IF( nn_timing == 1 )  CALL timing_start('dyn_bfr') 
     59      IF( ln_timing )   CALL timing_start('dyn_bfr') 
    6060      ! 
    6161!!gm bug : time step is only rdt (not 2 rdt if euler start !) 
     
    109109         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    110110      ! 
    111       IF( nn_timing == 1 )  CALL timing_stop('dyn_bfr') 
     111      IF( ln_timing )   CALL timing_stop('dyn_bfr') 
    112112      ! 
    113113   END SUBROUTINE dyn_bfr 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r8215 r8568  
    4444   USE lib_mpp         ! MPP library 
    4545   USE eosbn2          ! compute density 
    46    USE wrk_nemo        ! Memory Allocation 
    4746   USE timing          ! Timing 
    4847   USE iom 
     
    8483      !!---------------------------------------------------------------------- 
    8584      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    86       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
    87       !!---------------------------------------------------------------------- 
    88       ! 
    89       IF( nn_timing == 1 )  CALL timing_start('dyn_hpg') 
     85      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
     86      !!---------------------------------------------------------------------- 
     87      ! 
     88      IF( ln_timing )   CALL timing_start('dyn_hpg') 
    9089      ! 
    9190      IF( l_trddyn ) THEN                    ! Temporary saving of ua and va trends (l_trddyn) 
    92          CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
     91         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    9392         ztrdu(:,:,:) = ua(:,:,:) 
    9493         ztrdv(:,:,:) = va(:,:,:) 
     
    108107         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    109108         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt ) 
    110          CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
     109         DEALLOCATE( ztrdu , ztrdv ) 
    111110      ENDIF 
    112111      ! 
     
    114113         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    115114      ! 
    116       IF( nn_timing == 1 )  CALL timing_stop('dyn_hpg') 
     115      IF( ln_timing )   CALL timing_stop('dyn_hpg') 
    117116      ! 
    118117   END SUBROUTINE dyn_hpg 
     
    134133      INTEGER  ::   ji, jj, jk, ikt    ! dummy loop indices      ISF 
    135134      REAL(wp) ::   znad 
    136       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop, zrhd ! hypothesys on isf density 
    137       REAL(wp), POINTER, DIMENSION(:,:)     ::  zrhdtop_isf  ! density at bottom of ISF 
    138       REAL(wp), POINTER, DIMENSION(:,:)     ::  ziceload     ! density at bottom of ISF 
     135      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  zts_top, zrhd  ! hypothesys on isf density 
     136      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  zrhdtop_isf    ! density at bottom of ISF 
     137      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  ziceload       ! density at bottom of ISF 
    139138      !! 
    140139      NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco,     & 
     
    165164      ! 
    166165      IF( ln_hpg_djc )   & 
    167          &   CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method & 
    168                            & currently disabled (bugs under investigation). Please select & 
    169                            & either  ln_hpg_sco or  ln_hpg_prj instead') 
    170       ! 
    171       IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )        & 
    172          &   CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ', & 
    173          &                 '   the standard jacobian formulation hpg_sco    or '    , & 
    174          &                 '   the pressure jacobian formulation hpg_prj'            ) 
    175  
    176       IF(       ln_hpg_isf .AND. .NOT. ln_isfcav )   & 
    177          &   CALL ctl_stop( ' hpg_isf not available if ln_isfcav = false ' ) 
    178       IF( .NOT. ln_hpg_isf .AND.       ln_isfcav )   & 
    179          &   CALL ctl_stop( 'Only hpg_isf has been corrected to work with ice shelf cavity.' ) 
     166         &   CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method',   & 
     167         &                 '   currently disabled (bugs under investigation).'        ,   & 
     168         &                 '   Please select either  ln_hpg_sco or  ln_hpg_prj instead' ) 
     169         ! 
     170      IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )          & 
     171         &   CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ',   & 
     172         &                 '   the standard jacobian formulation hpg_sco    or '    ,   & 
     173         &                 '   the pressure jacobian formulation hpg_prj'             ) 
     174         ! 
     175      IF( ln_hpg_isf ) THEN 
     176         IF( .NOT. ln_isfcav )   CALL ctl_stop( ' hpg_isf not available if ln_isfcav = false ' ) 
     177       ELSE 
     178         IF(       ln_isfcav )   CALL ctl_stop( 'Only hpg_isf has been corrected to work with ice shelf cavity.' ) 
     179      ENDIF 
    180180      ! 
    181181      !                               ! Set nhpg from ln_hpg_... flags 
     
    197197      IF( ioptio /= 1 )   CALL ctl_stop( 'NO or several hydrostatic pressure gradient options used' ) 
    198198      !  
    199       ! initialisation of ice shelf load 
    200       IF ( .NOT. ln_isfcav ) riceload(:,:)=0.0 
    201       IF (       ln_isfcav ) THEN 
    202          CALL wrk_alloc( jpi,jpj, 2,  ztstop)  
    203          CALL wrk_alloc( jpi,jpj,jpk, zrhd  ) 
    204          CALL wrk_alloc( jpi,jpj,     zrhdtop_isf, ziceload)  
     199      !                           
     200      IF ( .NOT. ln_isfcav ) THEN     !--- no ice shelf load 
     201         riceload(:,:) = 0._wp 
     202         ! 
     203      ELSE                            !--- set an ice shelf load 
    205204         ! 
    206205         IF(lwp) WRITE(numout,*) 
    207          IF(lwp) WRITE(numout,*) 'dyn:hpg_isf : hydrostatic pressure gradient trend for ice shelf' 
    208          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'   
    209  
    210          ! To use density and not density anomaly 
    211          znad=1._wp 
    212           
    213          ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
    214          ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 
    215  
    216          ! compute density of the water displaced by the ice shelf  
    217          DO jk = 1, jpk 
    218             CALL eos(ztstop(:,:,:),gdept_n(:,:,jk),zrhd(:,:,jk)) 
    219          END DO 
    220        
    221          ! compute rhd at the ice/oce interface (ice shelf side) 
    222          CALL eos(ztstop,risfdep,zrhdtop_isf) 
    223  
    224          ! Surface value + ice shelf gradient 
    225          ! compute pressure due to ice shelf load (used to compute hpgi/j for all the level from 1 to miku/v) 
    226          ! divided by 2 later 
    227          ziceload = 0._wp 
    228          DO jj = 1, jpj 
    229             DO ji = 1, jpi 
    230                ikt=mikt(ji,jj) 
     206         IF(lwp) WRITE(numout,*) '   ice shelf case: set the ice-shelf load' 
     207         ALLOCATE( zts_top(jpi,jpj,jpts) , zrhd(jpi,jpj,jpk) , zrhdtop_isf(jpi,jpj) , ziceload(jpi,jpj) )  
     208         ! 
     209         znad = 1._wp                     !- To use density and not density anomaly 
     210         ! 
     211         !                                !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
     212         zts_top(:,:,jp_tem) = -1.9_wp   ;   zts_top(:,:,jp_sal) = 34.4_wp 
     213         ! 
     214         DO jk = 1, jpk                   !- compute density of the water displaced by the ice shelf  
     215            CALL eos( zts_top(:,:,:), gdept_n(:,:,jk), zrhd(:,:,jk) ) 
     216         END DO 
     217         ! 
     218         !                                !- compute rhd at the ice/oce interface (ice shelf side) 
     219         CALL eos( zts_top , risfdep, zrhdtop_isf ) 
     220         ! 
     221         !                                !- Surface value + ice shelf gradient 
     222         ziceload = 0._wp                       ! compute pressure due to ice shelf load  
     223         DO jj = 1, jpj                         ! (used to compute hpgi/j for all the level from 1 to miku/v) 
     224            DO ji = 1, jpi                      ! divided by 2 later 
     225               ikt = mikt(ji,jj) 
    231226               ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
    232                DO jk=2,ikt-1 
     227               DO jk = 2, ikt-1 
    233228                  ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 
    234229                     &                              * (1._wp - tmask(ji,jj,jk)) 
    235230               END DO 
    236231               IF (ikt  >=  2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 
    237                                   &                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
    238             END DO 
    239          END DO 
    240          riceload(:,:)=ziceload(:,:)  ! need to be saved for diaar5 
    241  
    242          CALL wrk_dealloc( jpi,jpj, 2,  ztstop)  
    243          CALL wrk_dealloc( jpi,jpj,jpk, zrhd  ) 
    244          CALL wrk_dealloc( jpi,jpj,     zrhdtop_isf, ziceload)  
    245       END IF 
     232                  &                                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
     233            END DO 
     234         END DO 
     235         riceload(:,:) = ziceload(:,:)  ! need to be saved for diaar5 
     236         ! 
     237         DEALLOCATE( zts_top , zrhd , zrhdtop_isf , ziceload )  
     238      ENDIF 
    246239      ! 
    247240   END SUBROUTINE dyn_hpg_init 
     
    268261      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    269262      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars 
    270       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    271       !!---------------------------------------------------------------------- 
    272       ! 
    273       CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
     263      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     264      !!---------------------------------------------------------------------- 
    274265      ! 
    275266      IF( kt == nit000 ) THEN 
     
    315306      END DO 
    316307      ! 
    317       CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    318       ! 
    319308   END SUBROUTINE hpg_zco 
    320309 
     
    333322      INTEGER  ::   iku, ikv                         ! temporary integers 
    334323      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
    335       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    336       !!---------------------------------------------------------------------- 
    337       ! 
    338       CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
     324      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     325      !!---------------------------------------------------------------------- 
    339326      ! 
    340327      IF( kt == nit000 ) THEN 
     
    405392      END DO 
    406393      ! 
    407       CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    408       ! 
    409394   END SUBROUTINE hpg_zps 
    410395 
     
    433418      REAL(wp) ::   zcoef0, zuap, zvap, znad, ztmp       ! temporary scalars 
    434419      LOGICAL  ::   ll_tmp1, ll_tmp2                     ! local logical variables 
    435       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    436       REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy !W/D pressure filter 
    437       !!---------------------------------------------------------------------- 
    438       ! 
    439       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
    440       IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
     420      REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zhpi, zhpj 
     421      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     422      !!---------------------------------------------------------------------- 
    441423      ! 
    442424      IF( kt == nit000 ) THEN 
     
    452434      ! 
    453435      IF( ln_wd ) THEN 
    454         DO jj = 2, jpjm1 
    455            DO ji = 2, jpim1  
    456              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     436         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     437         DO jj = 2, jpjm1 
     438            DO ji = 2, jpim1  
     439               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    457440                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    458441                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    459442                  &                                                         > rn_wdmin1 + rn_wdmin2 
    460              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
     443               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
    461444                  &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    462445                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    463446 
    464              IF(ll_tmp1) THEN 
    465                zcpx(ji,jj) = 1.0_wp 
    466              ELSE IF(ll_tmp2) THEN 
    467                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    468                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    469                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    470              ELSE 
    471                zcpx(ji,jj) = 0._wp 
    472              END IF 
    473        
    474              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     447               IF(ll_tmp1) THEN 
     448                  zcpx(ji,jj) = 1.0_wp 
     449               ELSE IF(ll_tmp2) THEN 
     450                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     451                  zcpx(ji,jj) = ABS(   ( sshn(ji+1,jj)+ht_wd(ji+1,jj) - sshn(ji,jj)-ht_wd(ji,jj) )  & 
     452                     &                / ( sshn(ji+1,jj)                - sshn(ji,jj)              )  ) 
     453               ELSE 
     454                  zcpx(ji,jj) = 0._wp 
     455               ENDIF 
     456               ! 
     457               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    475458                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    476459                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    477460                  &                                                         > rn_wdmin1 + rn_wdmin2 
    478              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
     461               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
    479462                  &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    480463                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    481  
    482              IF(ll_tmp1) THEN 
    483                zcpy(ji,jj) = 1.0_wp 
    484              ELSE IF(ll_tmp2) THEN 
    485                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    486                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    487                            &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    488              ELSE 
    489                zcpy(ji,jj) = 0._wp 
    490              END IF 
    491            END DO 
    492         END DO 
    493         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    494       END IF 
     464                  ! 
     465               IF(ll_tmp1) THEN 
     466                  zcpy(ji,jj) = 1.0_wp 
     467               ELSE IF(ll_tmp2) THEN 
     468                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     469                  zcpy(ji,jj) = ABS(   ( sshn(ji,jj+1)+ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj) )  & 
     470                     &               / ( sshn(ji,jj+1)                - sshn(ji,jj)                )  ) 
     471               ELSE 
     472                  zcpy(ji,jj) = 0._wp 
     473               ENDIF 
     474            END DO 
     475         END DO 
     476         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     477      ENDIF 
    495478 
    496479      ! Surface value 
     
    507490            zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    508491               &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    509  
    510  
     492            ! 
    511493            IF( ln_wd ) THEN 
    512  
    513               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    514               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    515               zuap = zuap * zcpx(ji,jj) 
    516               zvap = zvap * zcpy(ji,jj) 
     494               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     495               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     496               zuap = zuap * zcpx(ji,jj) 
     497               zvap = zvap * zcpy(ji,jj) 
    517498            ENDIF 
    518  
     499            ! 
    519500            ! add to the general momentum trend 
    520501            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
     
    539520               zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    540521                  &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 
    541  
     522               ! 
    542523               IF( ln_wd ) THEN 
    543                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    544                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    545                  zuap = zuap * zcpx(ji,jj) 
    546                  zvap = zvap * zcpy(ji,jj) 
    547                ENDIF 
    548  
     524                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     525                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     526                  zuap = zuap * zcpx(ji,jj) 
     527                  zvap = zvap * zcpy(ji,jj) 
     528               ENDIF 
     529               ! 
    549530               ! add to the general momentum trend 
    550531               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
     
    554535      END DO 
    555536      ! 
    556       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
    557       IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
     537      IF( ln_wd )   DEALLOCATE( zcpx , zcpy ) 
    558538      ! 
    559539   END SUBROUTINE hpg_sco 
     
    583563      INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
    584564      REAL(wp) ::   zcoef0, zuap, zvap, znad          ! temporary scalars 
    585       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  zhpi, zhpj 
    586       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop 
    587       REAL(wp), POINTER, DIMENSION(:,:)     ::  zrhdtop_oce 
    588       !!---------------------------------------------------------------------- 
    589       ! 
    590       CALL wrk_alloc( jpi,jpj,  2, ztstop)  
    591       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj) 
    592       CALL wrk_alloc( jpi,jpj,     zrhdtop_oce ) 
    593       ! 
    594       ! Local constant initialization 
    595       zcoef0 = - grav * 0.5_wp 
    596    
    597       ! To use density and not density anomaly 
    598       znad=1._wp 
    599  
    600       ! iniitialised to 0. zhpi zhpi  
    601       zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 
     565      REAL(wp), DIMENSION(jpi,jpj,jpk ) ::  zhpi, zhpj 
     566      REAL(wp), DIMENSION(jpi,jpj,jpts) ::  zts_top 
     567      REAL(wp), DIMENSION(jpi,jpj)      ::  zrhdtop_oce 
     568      !!---------------------------------------------------------------------- 
     569      ! 
     570      zcoef0 = - grav * 0.5_wp   ! Local constant initialization 
     571      ! 
     572      znad=1._wp                 ! To use density and not density anomaly 
     573      ! 
     574      !                          ! iniitialised to 0. zhpi zhpi  
     575      zhpi(:,:,:) = 0._wp   ;   zhpj(:,:,:) = 0._wp 
    602576 
    603577      ! compute rhd at the ice/oce interface (ocean side) 
    604578      ! usefull to reduce residual current in the test case ISOMIP with no melting 
    605       DO ji=1,jpi 
    606         DO jj=1,jpj 
    607           ikt=mikt(ji,jj) 
    608           ztstop(ji,jj,1)=tsn(ji,jj,ikt,1) 
    609           ztstop(ji,jj,2)=tsn(ji,jj,ikt,2) 
     579      DO ji = 1, jpi 
     580        DO jj = 1, jpj 
     581          ikt = mikt(ji,jj) 
     582          zts_top(ji,jj,1) = tsn(ji,jj,ikt,1) 
     583          zts_top(ji,jj,2) = tsn(ji,jj,ikt,2) 
    610584        END DO 
    611585      END DO 
    612       CALL eos( ztstop, risfdep, zrhdtop_oce ) 
     586      CALL eos( zts_top, risfdep, zrhdtop_oce ) 
    613587 
    614588!==================================================================================      
     
    667641         END DO 
    668642      END DO 
    669      ! 
    670       CALL wrk_dealloc( jpi,jpj,2  , ztstop) 
    671       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj) 
    672       CALL wrk_dealloc( jpi,jpj    , zrhdtop_oce ) 
    673643      ! 
    674644   END SUBROUTINE hpg_isf 
     
    690660      REAL(wp) ::   z1_12, cffv, cffy   !    "         " 
    691661      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    692       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    693       REAL(wp), POINTER, DIMENSION(:,:,:) ::  dzx, dzy, dzz, dzu, dzv, dzw 
    694       REAL(wp), POINTER, DIMENSION(:,:,:) ::  drhox, drhoy, drhoz, drhou, drhov, drhow 
    695       REAL(wp), POINTER, DIMENSION(:,:,:) ::  rho_i, rho_j, rho_k 
    696       REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    697       !!---------------------------------------------------------------------- 
    698       ! 
    699       CALL wrk_alloc( jpi, jpj, jpk, dzx  , dzy  , dzz  , dzu  , dzv  , dzw   ) 
    700       CALL wrk_alloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    701       CALL wrk_alloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
    702       IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    703       ! 
     662      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zhpj 
     663      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   dzx, dzy, dzz, dzu, dzv, dzw 
     664      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   drhox, drhoy, drhoz, drhou, drhov, drhow 
     665      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   rho_i, rho_j, rho_k 
     666      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     667      !!---------------------------------------------------------------------- 
    704668      ! 
    705669      IF( ln_wd ) THEN 
    706         DO jj = 2, jpjm1 
    707            DO ji = 2, jpim1  
    708              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     670         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     671         DO jj = 2, jpjm1 
     672            DO ji = 2, jpim1  
     673               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    709674                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    710675                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    711676                  &                                                         > rn_wdmin1 + rn_wdmin2 
    712              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
     677               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
    713678                  &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    714679                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    715680 
    716              IF(ll_tmp1) THEN 
    717                zcpx(ji,jj) = 1.0_wp 
    718              ELSE IF(ll_tmp2) THEN 
    719                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    720                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    721                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    722              ELSE 
    723                zcpx(ji,jj) = 0._wp 
    724              END IF 
     681               IF(ll_tmp1) THEN 
     682                  zcpx(ji,jj) = 1.0_wp 
     683               ELSE IF(ll_tmp2) THEN 
     684                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     685                  zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     686                              &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     687               ELSE 
     688                  zcpx(ji,jj) = 0._wp 
     689               ENDIF 
    725690       
    726              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     691               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    727692                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    728693                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    729694                  &                                                         > rn_wdmin1 + rn_wdmin2 
    730              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
     695               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
    731696                  &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    732697                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    733698 
    734              IF(ll_tmp1) THEN 
    735                zcpy(ji,jj) = 1.0_wp 
    736              ELSE IF(ll_tmp2) THEN 
    737                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    738                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    739                            &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    740              ELSE 
    741                zcpy(ji,jj) = 0._wp 
    742              END IF 
    743            END DO 
    744         END DO 
    745         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    746       END IF 
     699               IF(ll_tmp1) THEN 
     700                  zcpy(ji,jj) = 1.0_wp 
     701               ELSE IF(ll_tmp2) THEN 
     702                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     703                  zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     704                              &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
     705               ELSE 
     706                  zcpy(ji,jj) = 0._wp 
     707               ENDIF 
     708            END DO 
     709         END DO 
     710         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     711      ENDIF 
    747712 
    748713      IF( kt == nit000 ) THEN 
     
    903868         END DO 
    904869      END DO 
    905       CALL lbc_lnk(rho_k,'W',1.) 
    906       CALL lbc_lnk(rho_i,'U',1.) 
    907       CALL lbc_lnk(rho_j,'V',1.) 
     870      CALL lbc_lnk( rho_k, 'W', 1. ) 
     871      CALL lbc_lnk( rho_i, 'U', 1. ) 
     872      CALL lbc_lnk( rho_j, 'V', 1. ) 
    908873 
    909874 
     
    949914      END DO 
    950915      ! 
    951       CALL wrk_dealloc( jpi, jpj, jpk, dzx  , dzy  , dzz  , dzu  , dzv  , dzw   ) 
    952       CALL wrk_dealloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    953       CALL wrk_dealloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
    954       IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
     916      IF( ln_wd )   DEALLOCATE( zcpx, zcpy ) 
    955917      ! 
    956918   END SUBROUTINE hpg_djc 
     
    980942      REAL(wp) :: zrhdt1 
    981943      REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
    982       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdept, zrhh 
    983       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
    984       REAL(wp), POINTER, DIMENSION(:,:)   ::   zsshu_n, zsshv_n 
    985       REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    986       !!---------------------------------------------------------------------- 
    987       ! 
    988       CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    989       CALL wrk_alloc( jpi,jpj,jpk,   zdept, zrhh ) 
    990       CALL wrk_alloc( jpi,jpj,       zsshu_n, zsshv_n ) 
    991       IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
     944      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdept, zrhh 
     945      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
     946      REAL(wp), DIMENSION(jpi,jpj)   ::   zsshu_n, zsshv_n 
     947      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     948      !!---------------------------------------------------------------------- 
    992949      ! 
    993950      IF( kt == nit000 ) THEN 
     
    1003960 
    1004961      IF( ln_wd ) THEN 
    1005         DO jj = 2, jpjm1 
    1006            DO ji = 2, jpim1  
    1007              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     962         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     963         DO jj = 2, jpjm1 
     964            DO ji = 2, jpim1  
     965               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    1008966                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    1009967                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    1010968                  &                                                         > rn_wdmin1 + rn_wdmin2 
    1011              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
     969               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
    1012970                  &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    1013971                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    1014972 
    1015              IF(ll_tmp1) THEN 
    1016                zcpx(ji,jj) = 1.0_wp 
    1017              ELSE IF(ll_tmp2) THEN 
    1018                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    1019                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    1020                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    1021              ELSE 
    1022                zcpx(ji,jj) = 0._wp 
    1023              END IF 
     973               IF(ll_tmp1) THEN 
     974                  zcpx(ji,jj) = 1.0_wp 
     975               ELSE IF(ll_tmp2) THEN 
     976                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     977                  zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     978                             &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     979               ELSE 
     980                  zcpx(ji,jj) = 0._wp 
     981               ENDIF 
    1024982       
    1025              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     983               ll_tmp1 = MIN(   sshn(ji,jj)             ,   sshn(ji,jj+1) ) >                & 
    1026984                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    1027985                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    1028986                  &                                                         > rn_wdmin1 + rn_wdmin2 
    1029              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
     987               ll_tmp2 = ( ABS( sshn(ji,jj)             -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
    1030988                  &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    1031989                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    1032990 
    1033              IF(ll_tmp1) THEN 
    1034                zcpy(ji,jj) = 1.0_wp 
    1035              ELSE IF(ll_tmp2) THEN 
    1036                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    1037                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     991               IF(ll_tmp1) THEN 
     992                  zcpy(ji,jj) = 1.0_wp 
     993               ELSE IF(ll_tmp2) THEN 
     994                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     995                  zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    1038996                           &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    1039              ELSE 
    1040                zcpy(ji,jj) = 0._wp 
    1041              END IF 
    1042            END DO 
    1043         END DO 
    1044         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    1045       END IF 
     997               ELSE 
     998                  zcpy(ji,jj) = 0._wp 
     999               ENDIF 
     1000            END DO 
     1001         END DO 
     1002         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     1003      ENDIF 
    10461004 
    10471005      ! Clean 3-D work arrays 
     
    12981256      END DO 
    12991257      ! 
    1300       CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    1301       CALL wrk_dealloc( jpi,jpj,jpk,   zdept, zrhh ) 
    1302       CALL wrk_dealloc( jpi,jpj,       zsshu_n, zsshv_n ) 
    1303       IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
     1258      IF( ln_wd )   DEALLOCATE( zcpx, zcpy ) 
    13041259      ! 
    13051260   END SUBROUTINE hpg_prj 
     
    13531308           !!Simply geometric average 
    13541309               DO jk = 2, jpkm1-1 
    1355                   zdf1 = (fsp(ji,jj,jk) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk) - xsp(ji,jj,jk-1)) 
    1356                   zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk)) 
     1310                  zdf1 = (fsp(ji,jj,jk  ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk  ) - xsp(ji,jj,jk-1)) 
     1311                  zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk  )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk  )) 
    13571312 
    13581313                  IF(zdf1 * zdf2 <= 0._wp) THEN 
     
    14031358            END DO 
    14041359         END DO 
    1405  
     1360         ! 
    14061361      ELSE 
    1407            CALL ctl_stop( 'invalid polynomial type in cspline' ) 
    1408       ENDIF 
    1409  
     1362         CALL ctl_stop( 'invalid polynomial type in cspline' ) 
     1363      ENDIF 
     1364      ! 
    14101365   END SUBROUTINE cspline 
    14111366 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynkeg.F90

    r7753 r8568  
    2222   USE lib_mpp         ! MPP library 
    2323   USE prtctl          ! Print control 
    24    USE wrk_nemo        ! Memory Allocation 
    2524   USE timing          ! Timing 
    2625   USE bdy_oce         ! ocean open boundary conditions 
     
    3938#  include "vectopt_loop_substitute.h90" 
    4039   !!---------------------------------------------------------------------- 
    41    !! NEMO/OPA 3.6 , NEMO Consortium (2015) 
     40   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4241   !! $Id$  
    4342   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    7574      INTEGER, INTENT( in ) ::   kscheme   ! =0/1   type of KEG scheme  
    7675      ! 
    77       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    78       REAL(wp) ::   zu, zv       ! temporary scalars 
    79       REAL(wp), POINTER, DIMENSION(:,:,:) :: zhke 
    80       REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv  
    81       INTEGER  ::   jb                 ! dummy loop indices 
    82       INTEGER  ::   ii, ij, igrd, ib_bdy   ! local integers 
    83       INTEGER  ::   fu, fv 
     76      INTEGER  ::   ji, jj, jk, jb    ! dummy loop indices 
     77      INTEGER  ::   ii, ifu, ib_bdy   ! local integers 
     78      INTEGER  ::   ij, ifv, igrd     !   -       - 
     79      REAL(wp) ::   zu, zv            ! local scalars 
     80      REAL(wp), DIMENSION(jpi,jpj,jpk)        ::   zhke 
     81      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv  
    8482      !!---------------------------------------------------------------------- 
    8583      ! 
    86       IF( nn_timing == 1 )   CALL timing_start('dyn_keg') 
    87       ! 
    88       CALL wrk_alloc( jpi,jpj,jpk,   zhke ) 
     84      IF( ln_timing )   CALL timing_start('dyn_keg') 
    8985      ! 
    9086      IF( kt == nit000 ) THEN 
     
    9490      ENDIF 
    9591 
    96       IF( l_trddyn ) THEN           ! Save ua and va trends 
    97          CALL wrk_alloc( jpi,jpj,jpk,   ztrdu, ztrdv ) 
     92      IF( l_trddyn ) THEN           ! Save the input trends 
     93         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    9894         ztrdu(:,:,:) = ua(:,:,:)  
    9995         ztrdv(:,:,:) = va(:,:,:)  
     
    112108                     ii   = idx_bdy(ib_bdy)%nbi(jb,igrd) 
    113109                     ij   = idx_bdy(ib_bdy)%nbj(jb,igrd) 
    114                      fu   = NINT( idx_bdy(ib_bdy)%flagu(jb,igrd) ) 
    115                      un(ii-fu,ij,jk) = un(ii,ij,jk) * umask(ii,ij,jk) 
     110                     ifu   = NINT( idx_bdy(ib_bdy)%flagu(jb,igrd) ) 
     111                     un(ii-ifu,ij,jk) = un(ii,ij,jk) * umask(ii,ij,jk) 
    116112                  END DO 
    117113               END DO 
     
    122118                     ii   = idx_bdy(ib_bdy)%nbi(jb,igrd) 
    123119                     ij   = idx_bdy(ib_bdy)%nbj(jb,igrd) 
    124                      fv   = NINT( idx_bdy(ib_bdy)%flagv(jb,igrd) ) 
    125                      vn(ii,ij-fv,jk) = vn(ii,ij,jk) * vmask(ii,ij,jk) 
     120                     ifv   = NINT( idx_bdy(ib_bdy)%flagv(jb,igrd) ) 
     121                     vn(ii,ij-ifv,jk) = vn(ii,ij,jk) * vmask(ii,ij,jk) 
    126122                  END DO 
    127123               END DO 
     
    172168      ENDIF       
    173169 
    174  
    175170      ! 
    176171      DO jk = 1, jpkm1                    !==  grad( KE ) added to the general momentum trends  ==! 
     
    187182         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    188183         CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt ) 
    189          CALL wrk_dealloc( jpi,jpj,jpk,   ztrdu, ztrdv ) 
     184         DEALLOCATE( ztrdu , ztrdv ) 
    190185      ENDIF 
    191186      ! 
     
    193188         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    194189      ! 
    195       CALL wrk_dealloc( jpi,jpj,jpk,   zhke ) 
    196       ! 
    197       IF( nn_timing == 1 )   CALL timing_stop('dyn_keg') 
     190      IF( ln_timing )   CALL timing_stop('dyn_keg') 
    198191      ! 
    199192   END SUBROUTINE dyn_keg 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90

    r8215 r8568  
    2727   USE lib_mpp        ! distribued memory computing library 
    2828   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    29    USE wrk_nemo       ! Memory Allocation 
    3029   USE timing         ! Timing 
    3130 
     
    4847#  include "vectopt_loop_substitute.h90" 
    4948   !!---------------------------------------------------------------------- 
    50    !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
     49   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    5150   !! $Id$ 
    5251   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6261      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    6362      ! 
    64       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
     63      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
    6564      !!---------------------------------------------------------------------- 
    6665      ! 
    67       IF( nn_timing == 1 )  CALL timing_start('dyn_ldf') 
     66      IF( ln_timing )   CALL timing_start('dyn_ldf') 
    6867      ! 
    6968      IF( l_trddyn )   THEN                      ! temporary save of momentum trends 
    70          CALL wrk_alloc( jpi,jpj,jpk,   ztrdu, ztrdv ) 
     69         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    7170         ztrdu(:,:,:) = ua(:,:,:)  
    7271         ztrdv(:,:,:) = va(:,:,:)  
     
    8584         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    8685         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 
    87          CALL wrk_dealloc( jpi,jpj,jpk,   ztrdu, ztrdv ) 
     86         DEALLOCATE ( ztrdu , ztrdv ) 
    8887      ENDIF 
    8988      !                                          ! print sum trends (used for debugging) 
     
    9190         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    9291      ! 
    93       IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf') 
     92      IF( ln_timing )   CALL timing_stop('dyn_ldf') 
    9493      ! 
    9594   END SUBROUTINE dyn_ldf 
     
    102101      !! ** Purpose :   initializations of the horizontal ocean dynamics physics 
    103102      !!---------------------------------------------------------------------- 
    104       INTEGER ::   ioptio, ierr         ! temporary integers  
     103      INTEGER ::   ioptio, ierr   ! temporary integers  
    105104      !!---------------------------------------------------------------------- 
    106105      ! 
    107       !                                   ! Namelist nam_dynldf: already read in ldfdyn module 
     106      !                                !==  Namelist nam_dynldf  ==!  already read in ldfdyn module 
    108107      ! 
    109       IF(lwp) THEN                        ! Namelist print 
     108      IF(lwp) THEN                     !== Namelist print  ==! 
    110109         WRITE(numout,*) 
    111110         WRITE(numout,*) 'dyn_ldf_init : Choice of the lateral diffusive operator on dynamics' 
    112111         WRITE(numout,*) '~~~~~~~~~~~~' 
    113112         WRITE(numout,*) '   Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 
    114          WRITE(numout,*) '      laplacian operator          ln_dynldf_lap = ', ln_dynldf_lap 
    115          WRITE(numout,*) '      bilaplacian operator        ln_dynldf_blp = ', ln_dynldf_blp 
    116          WRITE(numout,*) '      iso-level                   ln_dynldf_lev = ', ln_dynldf_lev 
    117          WRITE(numout,*) '      horizontal (geopotential)   ln_dynldf_hor = ', ln_dynldf_hor 
    118          WRITE(numout,*) '      iso-neutral                 ln_dynldf_iso = ', ln_dynldf_iso 
     113         WRITE(numout,*) '      Type of operator' 
     114         WRITE(numout,*) '         no explicit diffusion       ln_dynldf_NONE = ', ln_dynldf_NONE 
     115         WRITE(numout,*) '         laplacian operator          ln_dynldf_lap  = ', ln_dynldf_lap 
     116         WRITE(numout,*) '         bilaplacian operator        ln_dynldf_blp  = ', ln_dynldf_blp 
     117         WRITE(numout,*) '      Direction of action' 
     118         WRITE(numout,*) '         iso-level                   ln_dynldf_lev  = ', ln_dynldf_lev 
     119         WRITE(numout,*) '         horizontal (geopotential)   ln_dynldf_hor  = ', ln_dynldf_hor 
     120         WRITE(numout,*) '         iso-neutral                 ln_dynldf_iso  = ', ln_dynldf_iso 
    119121      ENDIF 
    120       !                                   ! use of lateral operator or not 
     122      !                                !==  use of lateral operator or not  ==! 
    121123      nldf = np_ERROR 
    122124      ioptio = 0 
    123       IF( ln_dynldf_lap )   ioptio = ioptio + 1 
    124       IF( ln_dynldf_blp )   ioptio = ioptio + 1 
    125       IF( ioptio >  1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' ) 
    126       IF( ioptio == 0   )   nldf = np_no_ldf     ! No lateral mixing operator 
     125      IF( ln_dynldf_NONE ) THEN   ;   nldf = np_no_ldf   ;   ioptio = ioptio + 1   ;   ENDIF 
     126      IF( ln_dynldf_lap  ) THEN   ;                          ioptio = ioptio + 1   ;   ENDIF 
     127      IF( ln_dynldf_blp  ) THEN   ;                          ioptio = ioptio + 1   ;   ENDIF 
     128      IF( ioptio /= 1    )   CALL ctl_stop( 'dyn_ldf_init: use ONE of the 3 operator options (NONE/lap/blp)' ) 
    127129      ! 
    128       IF( nldf /= np_no_ldf ) THEN        ! direction ==>> type of operator   
     130      IF(.NOT.ln_dynldf_NONE ) THEN    !==  direction ==>> type of operator  ==! 
    129131         ioptio = 0 
    130132         IF( ln_dynldf_lev )   ioptio = ioptio + 1 
    131133         IF( ln_dynldf_hor )   ioptio = ioptio + 1 
    132134         IF( ln_dynldf_iso )   ioptio = ioptio + 1 
    133          IF( ioptio >  1   )   CALL ctl_stop( '          use only ONE direction (level/hor/iso)' ) 
    134          IF( ioptio == 0   )   CALL ctl_stop( '          use at least ONE direction (level/hor/iso)' ) 
     135         IF( ioptio /= 1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE of the 3 direction options (level/hor/iso)' ) 
    135136         ! 
    136          !                                   ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 
     137         !                             ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 
    137138         ierr = 0 
    138          IF ( ln_dynldf_lap ) THEN      ! laplacian operator 
    139             IF ( ln_zco ) THEN                ! z-coordinate 
     139         IF( ln_dynldf_lap ) THEN         ! laplacian operator 
     140            IF( ln_zco ) THEN                ! z-coordinate 
    140141               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
    141142               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
    142143               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
    143144            ENDIF 
    144             IF ( ln_zps ) THEN             ! z-coordinate with partial step 
     145            IF( ln_zps ) THEN                ! z-coordinate with partial step 
    145146               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level              (no rotation) 
    146147               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level              (no rotation) 
    147148               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
    148149            ENDIF 
    149             IF ( ln_sco ) THEN             ! s-coordinate 
     150            IF( ln_sco ) THEN                ! s-coordinate 
    150151               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
    151152               IF ( ln_dynldf_hor )   nldf = np_lap_i   ! horizontal             (   rotation) 
     
    154155         ENDIF 
    155156         ! 
    156          IF( ln_dynldf_blp ) THEN          ! bilaplacian operator 
    157             IF ( ln_zco ) THEN                ! z-coordinate 
    158                IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level = horizontal (no rotation) 
    159                IF ( ln_dynldf_hor )   nldf = np_blp     ! iso-level = horizontal (no rotation) 
    160                IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
     157         IF( ln_dynldf_blp ) THEN         ! bilaplacian operator 
     158            IF( ln_zco ) THEN                ! z-coordinate 
     159               IF( ln_dynldf_lev )   nldf = np_blp     ! iso-level = horizontal (no rotation) 
     160               IF( ln_dynldf_hor )   nldf = np_blp     ! iso-level = horizontal (no rotation) 
     161               IF( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
    161162            ENDIF 
    162             IF ( ln_zps ) THEN             ! z-coordinate with partial step 
    163                IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation) 
    164                IF ( ln_dynldf_hor )   nldf = np_blp     ! iso-level              (no rotation) 
    165                IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
     163            IF( ln_zps ) THEN                ! z-coordinate with partial step 
     164               IF( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation) 
     165               IF( ln_dynldf_hor )   nldf = np_blp     ! iso-level              (no rotation) 
     166               IF( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
    166167            ENDIF 
    167             IF ( ln_sco ) THEN             ! s-coordinate 
    168                IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation) 
    169                IF ( ln_dynldf_hor )   ierr = 2          ! horizontal             (   rotation) 
    170                IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
     168            IF( ln_sco ) THEN                ! s-coordinate 
     169               IF( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation) 
     170               IF( ln_dynldf_hor )   ierr = 2          ! horizontal             (   rotation) 
     171               IF( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
    171172            ENDIF 
    172173         ENDIF 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90

    r8215 r8568  
    2828   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2929   USE prtctl          ! Print control 
    30    USE wrk_nemo        ! Memory Allocation 
    3130   USE timing          ! Timing 
    3231 
     
    4544#  include "vectopt_loop_substitute.h90" 
    4645   !!---------------------------------------------------------------------- 
    47    !! NEMO/OPA 3.3 , NEMO Consortium (2011) 
     46   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4847   !! $Id$ 
    4948   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    108107      ! 
    109108      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    110       REAL(wp) ::   zabe1, zabe2, zcof1, zcof2                       ! local scalars 
    111       REAL(wp) ::   zmskt, zmskf                                     !   -      - 
    112       REAL(wp) ::   zcoef0, zcoef3, zcoef4, zmkt, zmkf               !   -      - 
    113       REAL(wp) ::   zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj   !   -      - 
    114       ! 
    115       REAL(wp), POINTER, DIMENSION(:,:) :: ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v 
     109      REAL(wp) ::   zabe1, zmskt, zmkt, zuav, zuwslpi, zuwslpj   ! local scalars 
     110      REAL(wp) ::   zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj   !   -      - 
     111      REAL(wp) ::   zcof0, zcof1, zcof2, zcof3, zcof4            !   -      - 
     112      REAL(wp), DIMENSION(jpi,jpj) ::   ziut, zivf, zdku, zdk1u  ! 2D workspace 
     113      REAL(wp), DIMENSION(jpi,jpj) ::   zjuf, zjvt, zdkv, zdk1v  !  -      - 
    116114      !!---------------------------------------------------------------------- 
    117115      ! 
    118       IF( nn_timing == 1 )  CALL timing_start('dyn_ldf_iso') 
    119       ! 
    120       CALL wrk_alloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v )  
     116      IF( ln_timing )   CALL timing_start('dyn_ldf_iso') 
    121117      ! 
    122118      IF( kt == nit000 ) THEN 
     
    343339         DO jk = 2, jpkm1 
    344340            DO ji = 2, jpim1 
    345                zcoef0= 0.5 * rn_aht_0 * umask(ji,jj,jk) 
     341               zcof0 = 0.5_wp * rn_aht_0 * umask(ji,jj,jk) 
    346342               ! 
    347                zuwslpi = zcoef0 * ( wslpi(ji+1,jj,jk) + wslpi(ji,jj,jk) ) 
    348                zuwslpj = zcoef0 * ( wslpj(ji+1,jj,jk) + wslpj(ji,jj,jk) ) 
     343               zuwslpi = zcof0 * ( wslpi(ji+1,jj,jk) + wslpi(ji,jj,jk) ) 
     344               zuwslpj = zcof0 * ( wslpj(ji+1,jj,jk) + wslpj(ji,jj,jk) ) 
    349345               ! 
    350                zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1)   & 
    351                              + tmask(ji,jj,jk  )+tmask(ji+1,jj,jk  ), 1. ) 
    352                zmkf = 1./MAX(  fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1)   & 
    353                              + fmask(ji,jj-1,jk  ) + fmask(ji,jj,jk  ), 1. ) 
    354  
    355                zcoef3 = - e2u(ji,jj) * zmkt * zuwslpi 
    356                zcoef4 = - e1u(ji,jj) * zmkf * zuwslpj 
     346               zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1)      & 
     347                             + tmask(ji,jj,jk  )+tmask(ji+1,jj,jk  ) , 1. ) 
     348               zmkf = 1./MAX(  fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1)      & 
     349                             + fmask(ji,jj-1,jk  ) + fmask(ji,jj,jk  ) , 1. ) 
     350 
     351               zcof3 = - e2u(ji,jj) * zmkt * zuwslpi 
     352               zcof4 = - e1u(ji,jj) * zmkf * zuwslpj 
    357353               ! vertical flux on u field 
    358                zfuw(ji,jk) = zcoef3 * ( zdiu (ji,jk-1) + zdiu (ji+1,jk-1)     & 
    359                                        +zdiu (ji,jk  ) + zdiu (ji+1,jk  ) )   & 
    360                            + zcoef4 * ( zdj1u(ji,jk-1) + zdju (ji  ,jk-1)     & 
    361                                        +zdj1u(ji,jk  ) + zdju (ji  ,jk  ) ) 
     354               zfuw(ji,jk) = zcof3 * (  zdiu (ji,jk-1) + zdiu (ji+1,jk-1)      & 
     355                  &                   + zdiu (ji,jk  ) + zdiu (ji+1,jk  ) )   & 
     356                  &        + zcof4 * (  zdj1u(ji,jk-1) + zdju (ji  ,jk-1)      & 
     357                  &                   + zdj1u(ji,jk  ) + zdju (ji  ,jk  ) ) 
    362358               ! vertical mixing coefficient (akzu) 
    363                ! Note: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
     359               ! Note: zcof0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
    364360               akzu(ji,jj,jk) = ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / rn_aht_0 
    365361            END DO 
     
    369365         DO jk = 2, jpkm1 
    370366            DO ji = 2, jpim1 
    371                zcoef0 = 0.5 * rn_aht_0 * vmask(ji,jj,jk) 
    372  
    373                zvwslpi = zcoef0 * ( wslpi(ji,jj+1,jk) + wslpi(ji,jj,jk) ) 
    374                zvwslpj = zcoef0 * ( wslpj(ji,jj+1,jk) + wslpj(ji,jj,jk) ) 
    375  
    376                zmkf = 1./MAX(  fmask(ji-1,jj,jk-1)+fmask(ji,jj,jk-1)   & 
    377                              + fmask(ji-1,jj,jk  )+fmask(ji,jj,jk  ), 1. ) 
    378                zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji,jj+1,jk-1)   & 
    379                              + tmask(ji,jj,jk  )+tmask(ji,jj+1,jk  ), 1. ) 
    380  
    381                zcoef3 = - e2v(ji,jj) * zmkf * zvwslpi 
    382                zcoef4 = - e1v(ji,jj) * zmkt * zvwslpj 
     367               zcof0 = 0.5_wp * rn_aht_0 * vmask(ji,jj,jk) 
     368               ! 
     369               zvwslpi = zcof0 * ( wslpi(ji,jj+1,jk) + wslpi(ji,jj,jk) ) 
     370               zvwslpj = zcof0 * ( wslpj(ji,jj+1,jk) + wslpj(ji,jj,jk) ) 
     371               ! 
     372               zmkf = 1./MAX(  fmask(ji-1,jj,jk-1)+fmask(ji,jj,jk-1)      & 
     373                  &          + fmask(ji-1,jj,jk  )+fmask(ji,jj,jk  ) , 1. ) 
     374               zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji,jj+1,jk-1)      & 
     375                  &          + tmask(ji,jj,jk  )+tmask(ji,jj+1,jk  ) , 1. ) 
     376 
     377               zcof3 = - e2v(ji,jj) * zmkf * zvwslpi 
     378               zcof4 = - e1v(ji,jj) * zmkt * zvwslpj 
    383379               ! vertical flux on v field 
    384                zfvw(ji,jk) = zcoef3 * ( zdiv (ji,jk-1) + zdiv (ji-1,jk-1)     & 
    385                   &                    +zdiv (ji,jk  ) + zdiv (ji-1,jk  ) )   & 
    386                   &        + zcoef4 * ( zdjv (ji,jk-1) + zdj1v(ji  ,jk-1)     & 
    387                   &                    +zdjv (ji,jk  ) + zdj1v(ji  ,jk  ) ) 
     380               zfvw(ji,jk) = zcof3 * (  zdiv (ji,jk-1) + zdiv (ji-1,jk-1)      & 
     381                  &                   + zdiv (ji,jk  ) + zdiv (ji-1,jk  ) )   & 
     382                  &        + zcof4 * (  zdjv (ji,jk-1) + zdj1v(ji  ,jk-1)      & 
     383                  &                   + zdjv (ji,jk  ) + zdj1v(ji  ,jk  ) ) 
    388384               ! vertical mixing coefficient (akzv) 
    389                ! Note: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
     385               ! Note: zcof0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
    390386               akzv(ji,jj,jk) = ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / rn_aht_0 
    391387            END DO 
     
    404400      END DO                                           !   End of slab 
    405401      !                                                ! =============== 
    406       CALL wrk_dealloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v )  
    407402      ! 
    408       IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf_iso') 
     403      IF( ln_timing )   CALL timing_stop('dyn_ldf_iso') 
    409404      ! 
    410405   END SUBROUTINE dyn_ldf_iso 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_lap_blp.F90

    r7753 r8568  
    1919   USE in_out_manager ! I/O manager 
    2020   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    21    USE wrk_nemo       ! Memory Allocation 
    2221   USE timing         ! Timing 
    2322 
     
    3130#  include "vectopt_loop_substitute.h90" 
    3231   !!---------------------------------------------------------------------- 
    33    !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
     32   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    3433   !! $Id$  
    3534   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5756      REAL(wp) ::   zsign        ! local scalars 
    5857      REAL(wp) ::   zua, zva     ! local scalars 
    59       REAL(wp), POINTER, DIMENSION(:,:) ::  zcur, zdiv 
     58      REAL(wp), DIMENSION(jpi,jpj) ::   zcur, zdiv 
    6059      !!---------------------------------------------------------------------- 
    6160      ! 
     
    6665      ENDIF 
    6766      ! 
    68       IF( nn_timing == 1 )   CALL timing_start('dyn_ldf_lap') 
    69       ! 
    70       CALL wrk_alloc( jpi, jpj, zcur, zdiv )  
     67      IF( ln_timing )   CALL timing_start('dyn_ldf_lap') 
    7168      ! 
    7269      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign 
     
    107104      END DO                                           !   End of slab 
    108105      !                                                ! =============== 
    109       CALL wrk_dealloc( jpi, jpj, zcur, zdiv )  
    110106      ! 
    111       IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf_lap') 
     107      IF( ln_timing )   CALL timing_stop('dyn_ldf_lap') 
    112108      ! 
    113109   END SUBROUTINE dyn_ldf_lap 
     
    131127      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva   ! momentum trend 
    132128      ! 
    133       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zulap, zvlap   ! laplacian at u- and v-point 
     129      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zulap, zvlap   ! laplacian at u- and v-point 
    134130      !!---------------------------------------------------------------------- 
    135131      ! 
    136       IF( nn_timing == 1 )  CALL timing_start('dyn_ldf_blp') 
    137       ! 
    138       CALL wrk_alloc( jpi, jpj, jpk, zulap, zvlap )  
     132      IF( ln_timing )   CALL timing_start('dyn_ldf_blp') 
    139133      ! 
    140134      IF( kt == nit000 )  THEN 
     
    154148      CALL dyn_ldf_lap( kt, zulap, zvlap, pua, pva, 2 )   ! rotated laplacian applied to zlap (output in pta) 
    155149      ! 
    156       CALL wrk_dealloc( jpi, jpj, jpk, zulap, zvlap )  
    157       ! 
    158       IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf_blp') 
     150      IF( ln_timing )   CALL timing_stop('dyn_ldf_blp') 
    159151      ! 
    160152   END SUBROUTINE dyn_ldf_blp 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90

    r7753 r8568  
    4444   USE lbclnk         ! lateral boundary condition (or mpp link) 
    4545   USE lib_mpp        ! MPP library 
    46    USE wrk_nemo       ! Memory Allocation 
    4746   USE prtctl         ! Print control 
    4847   USE timing         ! Timing 
     
    5756 
    5857   !!---------------------------------------------------------------------- 
    59    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     58   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    6059   !! $Id$  
    6160   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    9796      REAL(wp) ::   zue3a, zue3n, zue3b, zuf, zcoef    ! local scalars 
    9897      REAL(wp) ::   zve3a, zve3n, zve3b, zvf, z1_2dt   !   -      - 
    99       REAL(wp), POINTER, DIMENSION(:,:)   ::  zue, zve 
    100       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ze3u_f, ze3v_f, zua, zva  
     98      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zue, zve 
     99      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ze3u_f, ze3v_f, zua, zva  
    101100      !!---------------------------------------------------------------------- 
    102101      ! 
    103       IF( nn_timing == 1 )   CALL timing_start('dyn_nxt') 
    104       ! 
    105       IF( ln_dynspg_ts       )   CALL wrk_alloc( jpi,jpj,       zue, zve) 
    106       IF( l_trddyn           )   CALL wrk_alloc( jpi,jpj,jpk,   zua, zva) 
     102      IF( ln_timing    )   CALL timing_start('dyn_nxt') 
     103      IF( ln_dynspg_ts )   ALLOCATE( zue(jpi,jpj)     , zve(jpi,jpj)     ) 
     104      IF( l_trddyn     )   ALLOCATE( zua(jpi,jpj,jpk) , zva(jpi,jpj,jpk) ) 
    107105      ! 
    108106      IF( kt == nit000 ) THEN 
     
    253251            ELSE                          ! Asselin filter applied on thickness weighted velocity 
    254252               ! 
    255                CALL wrk_alloc( jpi,jpj,jpk,   ze3u_f, ze3v_f ) 
     253               ALLOCATE( ze3u_f(jpi,jpj,jpk) , ze3v_f(jpi,jpj,jpk) ) 
    256254               ! Before filtered scale factor at (u/v)-points stored in ze3u_f, ze3v_f 
    257255               CALL dom_vvl_interpol( e3t_b(:,:,:), ze3u_f, 'U' ) 
     
    280278               e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 
    281279               ! 
    282                CALL wrk_dealloc( jpi,jpj,jpk,   ze3u_f, ze3v_f ) 
     280               DEALLOCATE( ze3u_f , ze3v_f ) 
    283281            ENDIF 
    284282            ! 
     
    346344         &                       tab3d_2=vn, clinfo2=' Vn: '       , mask2=vmask ) 
    347345      !  
    348       IF( ln_dynspg_ts )   CALL wrk_dealloc( jpi,jpj,       zue, zve ) 
    349       IF( l_trddyn     )   CALL wrk_dealloc( jpi,jpj,jpk,   zua, zva ) 
    350       ! 
    351       IF( nn_timing == 1 )  CALL timing_stop('dyn_nxt') 
     346      IF( ln_dynspg_ts )   DEALLOCATE( zue, zve ) 
     347      IF( l_trddyn     )   DEALLOCATE( zua, zva ) 
     348      IF( ln_timing    )   CALL timing_stop('dyn_nxt') 
    352349      ! 
    353350   END SUBROUTINE dyn_nxt 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg.F90

    r7753 r8568  
    2828   USE in_out_manager ! I/O manager 
    2929   USE lib_mpp        ! MPP library 
    30    USE wrk_nemo       ! Memory Allocation 
    3130   USE timing         ! Timing 
    3231 
     
    4746#  include "vectopt_loop_substitute.h90" 
    4847   !!---------------------------------------------------------------------- 
    49    !! NEMO/OPA 3.2 , LODYC-IPSL  (2009) 
     48   !! NEMO/OPA 4.0 , LODYC-IPSL  (2017) 
    5049   !! $Id$  
    5150   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    7170      !!             period is used to prevent the divergence of odd and even time step. 
    7271      !!---------------------------------------------------------------------- 
    73       INTEGER, INTENT(in   ) ::   kt       ! ocean time-step index 
    74       ! 
    75       INTEGER  ::   ji, jj, jk                             ! dummy loop indices 
    76       REAL(wp) ::   z2dt, zg_2, zintp, zgrau0r             ! temporary scalar 
    77       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
    78       REAL(wp), POINTER, DIMENSION(:,:)   ::  zpice 
    79       !!---------------------------------------------------------------------- 
    80       ! 
    81       IF( nn_timing == 1 )  CALL timing_start('dyn_spg') 
     72      INTEGER, INTENT(in   ) ::   kt   ! ocean time-step index 
     73      ! 
     74      INTEGER  ::   ji, jj, jk                   ! dummy loop indices 
     75      REAL(wp) ::   z2dt, zg_2, zintp, zgrau0r   ! local scalars 
     76      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zpice 
     77      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
     78      !!---------------------------------------------------------------------- 
     79      ! 
     80      IF( ln_timing )   CALL timing_start('dyn_spg') 
    8281      ! 
    8382      IF( l_trddyn )   THEN                      ! temporary save of ta and sa trends 
    84          CALL wrk_alloc( jpi,jpj,jpk,   ztrdu, ztrdv )  
     83         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )  
    8584         ztrdu(:,:,:) = ua(:,:,:) 
    8685         ztrdv(:,:,:) = va(:,:,:) 
     
    124123         ! 
    125124         IF( nn_ice_embd == 2 ) THEN          !== embedded sea ice: Pressure gradient due to snow-ice mass ==! 
    126             CALL wrk_alloc( jpi,jpj,   zpice ) 
    127             !                                             
     125            ALLOCATE( zpice(jpi,jpj) ) 
    128126            zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc ) 
    129127            zgrau0r     = - grav * r1_rau0 
     
    135133               END DO 
    136134            END DO 
    137             ! 
    138             CALL wrk_dealloc( jpi,jpj,   zpice )          
     135            DEALLOCATE( zpice )          
    139136         ENDIF 
    140137         ! 
     
    161158         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    162159         CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt ) 
    163          CALL wrk_dealloc( jpi,jpj,jpk,   ztrdu, ztrdv )  
     160         DEALLOCATE( ztrdu , ztrdv )  
    164161      ENDIF 
    165162      !                                      ! print mean trends (used for debugging) 
     
    167164         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    168165      ! 
    169       IF( nn_timing == 1 )  CALL timing_stop('dyn_spg') 
     166      IF( ln_timing )   CALL timing_stop('dyn_spg') 
    170167      ! 
    171168   END SUBROUTINE dyn_spg 
     
    186183      !!---------------------------------------------------------------------- 
    187184      ! 
    188       IF( nn_timing == 1 )  CALL timing_start('dyn_spg_init') 
     185      IF( ln_timing )   CALL timing_start('dyn_spg_init') 
    189186      ! 
    190187      REWIND( numnam_ref )              ! Namelist namdyn_spg in reference namelist : Free surface 
     
    227224      ENDIF 
    228225      ! 
    229       IF( nn_timing == 1 )  CALL timing_stop('dyn_spg_init') 
     226      IF( ln_timing )   CALL timing_stop('dyn_spg_init') 
    230227      ! 
    231228   END SUBROUTINE dyn_spg_init 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_exp.F90

    r6140 r8568  
    6161      !!---------------------------------------------------------------------- 
    6262      ! 
    63       IF( nn_timing == 1 )  CALL timing_start('dyn_spg_exp') 
     63      IF( ln_timing )   CALL timing_start('dyn_spg_exp') 
    6464      ! 
    6565      IF( kt == nit000 ) THEN 
     
    9393      ENDIF 
    9494      ! 
    95       IF( nn_timing == 1 )  CALL timing_stop('dyn_spg_exp') 
     95      IF( ln_timing )   CALL timing_stop('dyn_spg_exp') 
    9696      ! 
    9797   END SUBROUTINE dyn_spg_exp 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r8215 r8568  
    162162      !!---------------------------------------------------------------------- 
    163163      ! 
    164       IF( nn_timing == 1 )   CALL timing_start('dyn_spg_ts') 
     164      IF( ln_timing )   CALL timing_start('dyn_spg_ts') 
    165165      ! 
    166166      IF( ln_wd ) ALLOCATE( zcpx(jpi,jpj), zcpy(jpi,jpj) ) 
     
    11251125      IF( ln_wd )   DEALLOCATE( zcpx, zcpy ) 
    11261126      ! 
    1127       IF ( ln_diatmb ) THEN 
     1127      IF( ln_diatmb ) THEN 
    11281128         CALL iom_put( "baro_u" , un_b*umask(:,:,1)+zmdi*(1-umask(:,:,1 ) ) )  ! Barotropic  U Velocity 
    11291129         CALL iom_put( "baro_v" , vn_b*vmask(:,:,1)+zmdi*(1-vmask(:,:,1 ) ) )  ! Barotropic  V Velocity 
    11301130      ENDIF 
    1131       IF( nn_timing == 1 )  CALL timing_stop('dyn_spg_ts') 
     1131      IF( ln_timing )   CALL timing_stop('dyn_spg_ts') 
    11321132      ! 
    11331133   END SUBROUTINE dyn_spg_ts 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90

    r7753 r8568  
    1414   !!            2.0  ! 2006-11  (G. Madec)  flux form advection: add metric term 
    1515   !!            3.2  ! 2009-04  (R. Benshila)  vvl: correction of een scheme 
    16    !!            3.3  ! 2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    17    !!            3.7  ! 2014-04  (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity  
    18    !!             -   ! 2014-06  (G. Madec) suppression of velocity curl from in-core memory 
     16   !!            3.3  ! 2010-10  (C. Ethe, G. Madec)  reorganisation of initialisation phase 
     17   !!            3.7  ! 2014-04  (G. Madec)  trend simplification: suppress jpdyn_trd_dat vorticity  
     18   !!             -   ! 2014-06  (G. Madec)  suppression of velocity curl from in-core memory 
    1919   !!             -   ! 2016-12  (G. Madec, E. Clementi) add Stokes-Coriolis trends (ln_stcor=T) 
     20   !!            4.0  ! 2017-07  (G. Madec)  linear dynamics + trends diag. with Stokes-Coriolis 
    2021   !!---------------------------------------------------------------------- 
    2122 
    2223   !!---------------------------------------------------------------------- 
    23    !!   dyn_vor      : Update the momentum trend with the vorticity trend 
    24    !!       vor_ens  : enstrophy conserving scheme       (ln_dynvor_ens=T) 
    25    !!       vor_ene  : energy conserving scheme          (ln_dynvor_ene=T) 
    26    !!       vor_een  : energy and enstrophy conserving   (ln_dynvor_een=T) 
    27    !!   dyn_vor_init : set and control of the different vorticity option 
     24   !!   dyn_vor       : Update the momentum trend with the vorticity trend 
     25   !!       vor_ens   : enstrophy conserving scheme       (ln_dynvor_ens=T) 
     26   !!       vor_ene   : energy conserving scheme          (ln_dynvor_ene=T) 
     27   !!       vor_een   : energy and enstrophy conserving   (ln_dynvor_een=T) 
     28   !!   dyn_vor_init  : set and control of the different vorticity option 
    2829   !!---------------------------------------------------------------------- 
    2930   USE oce            ! ocean dynamics and tracers 
    3031   USE dom_oce        ! ocean space and time domain 
    3132   USE dommsk         ! ocean mask 
    32    USE dynadv         ! momentum advection (use ln_dynadv_vec value) 
     33   USE dynadv         ! momentum advection 
    3334   USE trd_oce        ! trends: ocean variables 
    3435   USE trddyn         ! trend manager: dynamics 
     
    4041   USE in_out_manager ! I/O manager 
    4142   USE lib_mpp        ! MPP library 
    42    USE wrk_nemo       ! Memory Allocation 
    4343   USE timing         ! Timing 
    44  
    4544 
    4645   IMPLICIT NONE 
     
    8079#  include "vectopt_loop_substitute.h90" 
    8180   !!---------------------------------------------------------------------- 
    82    !! NEMO/OPA 3.7 , NEMO Consortium (2016) 
     81   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    8382   !! $Id$ 
    8483   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    9897      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
    9998      ! 
    100       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
    101       !!---------------------------------------------------------------------- 
    102       ! 
    103       IF( nn_timing == 1 )  CALL timing_start('dyn_vor') 
    104       ! 
    105       IF( l_trddyn )   CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
    106       ! 
    107       SELECT CASE ( nvor_scheme )               !==  vorticity trend added to the general trend  ==! 
    108       ! 
    109       CASE ( np_ENE )                                 !* energy conserving scheme 
    110          IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     99      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
     100      !!---------------------------------------------------------------------- 
     101      ! 
     102      IF( ln_timing )   CALL timing_start('dyn_vor') 
     103      ! 
     104      IF( l_trddyn ) THEN     !==  trend diagnostics case : split the added trend in two parts  ==! 
     105         ! 
     106         ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 
     107         ! 
     108         ztrdu(:,:,:) = ua(:,:,:)            !* planetary vorticity trend (including Stokes-Coriolis force) 
     109         ztrdv(:,:,:) = va(:,:,:) 
     110         SELECT CASE( nvor_scheme ) 
     111         CASE( np_ENE, np_MIX )   ;   CALL vor_ene( kt, ncor, un , vn , ua, va )   ! energy conserving scheme 
     112            IF( ln_stcor )            CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     113         CASE( np_ENS )           ;   CALL vor_ens( kt, ncor, un , vn , ua, va )   ! enstrophy conserving scheme 
     114            IF( ln_stcor )            CALL vor_ens( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     115         CASE( np_EEN )           ;   CALL vor_een( kt, ncor, un , vn , ua, va )   ! energy & enstrophy scheme 
     116            IF( ln_stcor )            CALL vor_een( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     117         END SELECT 
     118         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
     119         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     120         CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
     121         ! 
     122         IF( n_dynadv /= np_LIN_dyn ) THEN   !* relative vorticity or metric trend (only in non-linear case) 
    111123            ztrdu(:,:,:) = ua(:,:,:) 
    112124            ztrdv(:,:,:) = va(:,:,:) 
    113             CALL vor_ene( kt, nrvm, un , vn , ua, va )                    ! relative vorticity or metric trend 
     125            SELECT CASE( nvor_scheme ) 
     126            CASE( np_ENE )           ;   CALL vor_ene( kt, nrvm, un , vn , ua, va )  ! energy conserving scheme 
     127            CASE( np_ENS, np_MIX )   ;   CALL vor_ens( kt, nrvm, un , vn , ua, va )  ! enstrophy conserving scheme 
     128            CASE( np_EEN )           ;   CALL vor_een( kt, nrvm, un , vn , ua, va )  ! energy & enstrophy scheme 
     129            END SELECT 
    114130            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    115131            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    116132            CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 
    117             ztrdu(:,:,:) = ua(:,:,:) 
    118             ztrdv(:,:,:) = va(:,:,:) 
    119             CALL vor_ene( kt, ncor, un , vn , ua, va )                    ! planetary vorticity trend 
    120             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    121             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    122             CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    123          ELSE                                               ! total vorticity trend 
     133         ENDIF 
     134         ! 
     135         DEALLOCATE( ztrdu, ztrdv ) 
     136         ! 
     137      ELSE              !==  total vorticity trend added to the general trend  ==! 
     138         ! 
     139         SELECT CASE ( nvor_scheme )      !==  vorticity trend added to the general trend  ==! 
     140         CASE( np_ENE )                        !* energy conserving scheme 
    124141                             CALL vor_ene( kt, ntot, un , vn , ua, va )   ! total vorticity trend 
    125142            IF( ln_stcor )   CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    126          ENDIF 
    127          ! 
    128       CASE ( np_ENS )                                 !* enstrophy conserving scheme 
    129          IF( l_trddyn ) THEN                                ! trend diagnostics: splitthe trend in two     
    130             ztrdu(:,:,:) = ua(:,:,:) 
    131             ztrdv(:,:,:) = va(:,:,:) 
    132             CALL vor_ens( kt, nrvm, un , vn , ua, va )            ! relative vorticity or metric trend 
    133             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    134             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    135             CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 
    136             ztrdu(:,:,:) = ua(:,:,:) 
    137             ztrdv(:,:,:) = va(:,:,:) 
    138             CALL vor_ens( kt, ncor, un , vn , ua, va )            ! planetary vorticity trend 
    139             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    140             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    141             CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    142          ELSE                                               ! total vorticity trend 
     143         CASE( np_ENS )                        !* enstrophy conserving scheme 
    143144                             CALL vor_ens( kt, ntot, un , vn , ua, va )  ! total vorticity trend 
    144145            IF( ln_stcor )   CALL vor_ens( kt, ncor, usd, vsd, ua, va )  ! add the Stokes-Coriolis trend 
    145          ENDIF 
    146          ! 
    147       CASE ( np_MIX )                                 !* mixed ene-ens scheme 
    148          IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
    149             ztrdu(:,:,:) = ua(:,:,:) 
    150             ztrdv(:,:,:) = va(:,:,:) 
    151             CALL vor_ens( kt, nrvm, un , vn , ua, va )            ! relative vorticity or metric trend (ens) 
    152             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    153             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    154             CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 
    155             ztrdu(:,:,:) = ua(:,:,:) 
    156             ztrdv(:,:,:) = va(:,:,:) 
    157             CALL vor_ene( kt, ncor, un , vn , ua, va )            ! planetary vorticity trend (ene) 
    158             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    159             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    160             CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    161          ELSE                                               ! total vorticity trend 
     146         CASE( np_MIX )                        !* mixed ene-ens scheme 
    162147                             CALL vor_ens( kt, nrvm, un , vn , ua, va )   ! relative vorticity or metric trend (ens) 
    163148                             CALL vor_ene( kt, ncor, un , vn , ua, va )   ! planetary vorticity trend (ene) 
    164149            IF( ln_stcor )   CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    165         ENDIF 
    166          ! 
    167       CASE ( np_EEN )                                 !* energy and enstrophy conserving scheme 
    168          IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
    169             ztrdu(:,:,:) = ua(:,:,:) 
    170             ztrdv(:,:,:) = va(:,:,:) 
    171             CALL vor_een( kt, nrvm, un , vn , ua, va )            ! relative vorticity or metric trend 
    172             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    173             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    174             CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 
    175             ztrdu(:,:,:) = ua(:,:,:) 
    176             ztrdv(:,:,:) = va(:,:,:) 
    177             CALL vor_een( kt, ncor, un , vn , ua, va )            ! planetary vorticity trend 
    178             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    179             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    180             CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    181          ELSE                                               ! total vorticity trend 
     150         CASE( np_EEN )                        !* energy and enstrophy conserving scheme 
    182151                             CALL vor_een( kt, ntot, un , vn , ua, va )   ! total vorticity trend 
    183152            IF( ln_stcor )   CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    184          ENDIF 
    185          ! 
    186       END SELECT 
     153         END SELECT 
     154         ! 
     155      ENDIF 
    187156      ! 
    188157      !                       ! print sum trends (used for debugging) 
     
    190159         &                     tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    191160      ! 
    192       IF( l_trddyn )   CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
    193       ! 
    194       IF( nn_timing == 1 )  CALL timing_stop('dyn_vor') 
     161      IF( ln_timing )   CALL timing_stop('dyn_vor') 
    195162      ! 
    196163   END SUBROUTINE dyn_vor 
     
    217184      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    218185      !!---------------------------------------------------------------------- 
    219       INTEGER , INTENT(in   )                         ::   kt          ! ocean time-step index 
    220       INTEGER , INTENT(in   )                         ::   kvor        ! =ncor (planetary) ; =ntot (total) ; 
    221       !                                                                ! =nrvm (relative vorticity or metric) 
    222       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pun, pvn    ! now velocities 
    223       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua, pva    ! total v-trend 
     186      INTEGER                          , INTENT(in   )::   kt          ! ocean time-step index 
     187      INTEGER                          , INTENT(in   )::   kvor        ! total, planetary, relative, or metric 
     188      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
     189      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
    224190      ! 
    225191      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    226192      REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars 
    227       REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, zwy, zwz   ! 2D workspace 
    228       !!---------------------------------------------------------------------- 
    229       ! 
    230       IF( nn_timing == 1 )  CALL timing_start('vor_ene') 
    231       ! 
    232       CALL wrk_alloc( jpi,jpj,   zwx, zwy, zwz )  
     193      REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz   ! 2D workspace 
     194      !!---------------------------------------------------------------------- 
     195      ! 
     196      IF( ln_timing )  CALL timing_start('vor_ene') 
    233197      ! 
    234198      IF( kt == nit000 ) THEN 
     
    264228               DO ji = 1, fs_jpim1   ! vector opt. 
    265229                  zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pvn(ji+1,jj  ,jk) - e2v(ji,jj) * pvn(ji,jj,jk)    & 
    266                      &                      - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) & 
     230                     &                      - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  )   & 
    267231                     &                   * r1_e1e2f(ji,jj) 
    268232               END DO 
     
    311275      END DO                                           !   End of slab 
    312276      !                                                ! =============== 
    313       CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz )  
    314       ! 
    315       IF( nn_timing == 1 )  CALL timing_stop('vor_ene') 
     277      ! 
     278      IF( ln_timing )  CALL timing_stop('vor_ene') 
    316279      ! 
    317280   END SUBROUTINE vor_ene 
     
    338301      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    339302      !!---------------------------------------------------------------------- 
    340       INTEGER , INTENT(in   )                         ::   kt          ! ocean time-step index 
    341       INTEGER , INTENT(in   )                         ::   kvor        ! =ncor (planetary) ; =ntot (total) ; 
    342          !                                                             ! =nrvm (relative vorticity or metric) 
    343       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pun, pvn    ! now velocities 
    344       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua, pva    ! total v-trend 
     303      INTEGER                          , INTENT(in   )::   kt          ! ocean time-step index 
     304      INTEGER                          , INTENT(in   )::   kvor        ! total, planetary, relative, or metric 
     305      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
     306      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
    345307      ! 
    346308      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    347309      REAL(wp) ::   zuav, zvau   ! local scalars 
    348       REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    349       !!---------------------------------------------------------------------- 
    350       ! 
    351       IF( nn_timing == 1 )  CALL timing_start('vor_ens') 
    352       ! 
    353       CALL wrk_alloc( jpi,jpj,   zwx, zwy, zwz )  
     310      REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz, zww   ! 2D workspace 
     311      !!---------------------------------------------------------------------- 
     312      ! 
     313      IF( ln_timing )   CALL timing_start('vor_ens') 
    354314      ! 
    355315      IF( kt == nit000 ) THEN 
     
    431391      END DO                                           !   End of slab 
    432392      !                                                ! =============== 
    433       CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz )  
    434       ! 
    435       IF( nn_timing == 1 )  CALL timing_stop('vor_ens') 
     393      ! 
     394      IF( ln_timing )   CALL timing_stop('vor_ens') 
    436395      ! 
    437396   END SUBROUTINE vor_ens 
     
    455414      !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 
    456415      !!---------------------------------------------------------------------- 
    457       INTEGER , INTENT(in   )                         ::   kt          ! ocean time-step index 
    458       INTEGER , INTENT(in   )                         ::   kvor        ! =ncor (planetary) ; =ntot (total) ; 
    459          !                                                             ! =nrvm (relative vorticity or metric) 
    460       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pun, pvn    ! now velocities 
    461       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua, pva    ! total v-trend 
     416      INTEGER                          , INTENT(in   )::   kt          ! ocean time-step index 
     417      INTEGER                          , INTENT(in   )::   kvor        ! total, planetary, relative, or metric 
     418      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
     419      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
    462420      ! 
    463421      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    465423      REAL(wp) ::   zua, zva     ! local scalars 
    466424      REAL(wp) ::   zmsk, ze3    ! local scalars 
    467       ! 
    468       REAL(wp), POINTER, DIMENSION(:,:)   :: zwx, zwy, zwz, z1_e3f 
    469       REAL(wp), POINTER, DIMENSION(:,:)   :: ztnw, ztne, ztsw, ztse 
    470       !!---------------------------------------------------------------------- 
    471       ! 
    472       IF( nn_timing == 1 )  CALL timing_start('vor_een') 
    473       ! 
    474       CALL wrk_alloc( jpi,jpj,   zwx , zwy , zwz , z1_e3f )  
    475       CALL wrk_alloc( jpi,jpj,   ztnw, ztne, ztsw, ztse   )  
     425      REAL(wp), DIMENSION(jpi,jpj)   :: zwx , zwy , zwz , z1_e3f 
     426      REAL(wp), DIMENSION(jpi,jpj)   :: ztnw, ztne, ztsw, ztse 
     427      !!---------------------------------------------------------------------- 
     428      ! 
     429      IF( ln_timing )   CALL timing_start('vor_een') 
    476430      ! 
    477431      IF( kt == nit000 ) THEN 
     
    599553      !                                                ! =============== 
    600554      ! 
    601       CALL wrk_dealloc( jpi,jpj,   zwx , zwy , zwz , z1_e3f )  
    602       CALL wrk_dealloc( jpi,jpj,   ztnw, ztne, ztsw, ztse   )  
    603       ! 
    604       IF( nn_timing == 1 )  CALL timing_stop('vor_een') 
     555      IF( ln_timing )   CALL timing_stop('vor_een') 
    605556      ! 
    606557   END SUBROUTINE vor_een 
     
    618569      INTEGER ::   ios             ! Local integer output status for namelist read 
    619570      !! 
    620       NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, nn_een_e3f, ln_dynvor_msk 
     571      NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix,   & 
     572         &                 ln_dynvor_een, nn_een_e3f   , ln_dynvor_msk 
    621573      !!---------------------------------------------------------------------- 
    622574 
     
    672624      !                       
    673625      IF(lwp) WRITE(numout,*)        ! type of calculated vorticity (set ncor, nrvm, ntot) 
    674       ncor = np_COR 
    675       IF( ln_dynadv_vec ) THEN      
    676          IF(lwp) WRITE(numout,*) '      ===>>   Vector form advection : vorticity = Coriolis + relative vorticity' 
     626      ncor = np_COR                       ! planetary vorticity 
     627      SELECT CASE( n_dynadv ) 
     628      CASE( np_LIN_dyn ) 
     629         IF(lwp) WRITE(numout,*) '      ===>>   linear dynamics : total vorticity = Coriolis' 
     630         nrvm = np_COR        ! planetary vorticity 
     631         ntot = np_COR        !     -         - 
     632      CASE( np_VEC_c2  ) 
     633         IF(lwp) WRITE(numout,*) '      ===>>   vector form dynamics : total vorticity = Coriolis + relative vorticity'  
    677634         nrvm = np_RVO        ! relative vorticity 
    678          ntot = np_CRV        ! relative + planetary vorticity 
    679       ELSE                         
    680          IF(lwp) WRITE(numout,*) '      ===>>   Flux form advection   : vorticity = Coriolis + metric term' 
     635         ntot = np_CRV        ! relative + planetary vorticity          
     636      CASE( np_FLX_c2 , np_FLX_ubs  ) 
     637         IF(lwp) WRITE(numout,*) '      ===>>   flux form dynamics : total vorticity = Coriolis + metric term' 
    681638         nrvm = np_MET        ! metric term 
    682639         ntot = np_CME        ! Coriolis + metric term 
    683       ENDIF 
     640      END SELECT 
    684641       
    685642      IF(lwp) THEN                   ! Print the choice 
    686643         WRITE(numout,*) 
    687          IF( nvor_scheme ==  np_ENE )   WRITE(numout,*) '      ===>>   energy conserving scheme' 
    688          IF( nvor_scheme ==  np_ENS )   WRITE(numout,*) '      ===>>   enstrophy conserving scheme' 
    689          IF( nvor_scheme ==  np_MIX )   WRITE(numout,*) '      ===>>   mixed enstrophy/energy conserving scheme' 
    690          IF( nvor_scheme ==  np_EEN )   WRITE(numout,*) '      ===>>   energy and enstrophy conserving scheme' 
     644         SELECT CASE( nvor_scheme ) 
     645         CASE( np_ENE )   ;   WRITE(numout,*) '      ===>>   energy conserving scheme' 
     646         CASE( np_ENS )   ;   WRITE(numout,*) '      ===>>   enstrophy conserving scheme' 
     647         CASE( np_MIX )   ;   WRITE(numout,*) '      ===>>   mixed enstrophy/energy conserving scheme' 
     648         CASE( np_EEN )   ;   WRITE(numout,*) '      ===>>   energy and enstrophy conserving scheme' 
     649         END SELECT          
    691650      ENDIF 
    692651      ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90

    r7753 r8568  
    55   !!====================================================================== 
    66   !! History :  OPA  ! 1991-01  (G. Madec) Original code 
    7    !!            7.0  ! 1991-11  (G. Madec) 
    8    !!            7.5  ! 1996-01  (G. Madec) statement function for e3 
    97   !!   NEMO     0.5  ! 2002-07  (G. Madec) Free form, F90 
    108   !!---------------------------------------------------------------------- 
     
    2220   USE lib_mpp        ! MPP library 
    2321   USE prtctl         ! Print control 
    24    USE wrk_nemo       ! Memory Allocation 
    2522   USE timing         ! Timing 
    2623 
     
    2926    
    3027   PUBLIC   dyn_zad       ! routine called by dynadv.F90 
    31    PUBLIC   dyn_zad_zts   ! routine called by dynadv.F90 
    3228 
    3329   !! * Substitutions 
    3430#  include "vectopt_loop_substitute.h90" 
    3531   !!---------------------------------------------------------------------- 
    36    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     32   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    3733   !! $Id$ 
    3834   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5854      INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx 
    5955      ! 
    60       INTEGER  ::   ji, jj, jk      ! dummy loop indices 
    61       REAL(wp) ::   zua, zva        ! temporary scalars 
    62       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwuw , zwvw 
    63       REAL(wp), POINTER, DIMENSION(:,:  ) ::  zww 
    64       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
     56      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     57      REAL(wp) ::   zua, zva     ! local scalars 
     58      REAL(wp), DIMENSION(jpi,jpj)     ::   zww 
     59      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwuw, zwvw 
     60      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv 
    6561      !!---------------------------------------------------------------------- 
    6662      ! 
    67       IF( nn_timing == 1 )  CALL timing_start('dyn_zad') 
    68       ! 
    69       CALL wrk_alloc( jpi,jpj, zww )  
    70       CALL wrk_alloc( jpi,jpj,jpk, zwuw , zwvw )  
     63      IF( ln_timing )   CALL timing_start('dyn_zad') 
    7164      ! 
    7265      IF( kt == nit000 ) THEN 
    73          IF(lwp)WRITE(numout,*) 
    74          IF(lwp)WRITE(numout,*) 'dyn_zad : arakawa advection scheme' 
     66         IF(lwp) WRITE(numout,*) 
     67         IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 
    7568      ENDIF 
    7669 
    7770      IF( l_trddyn )   THEN         ! Save ua and va trends 
    78          CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv )  
     71         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )  
    7972         ztrdu(:,:,:) = ua(:,:,:)  
    8073         ztrdv(:,:,:) = va(:,:,:)  
     
    9689      ! 
    9790      ! Surface and bottom advective fluxes set to zero 
    98       IF ( ln_isfcav ) THEN 
     91      IF( ln_isfcav ) THEN 
    9992         DO jj = 2, jpjm1 
    10093            DO ji = fs_2, fs_jpim1           ! vector opt. 
     
    119112         DO jj = 2, jpjm1 
    120113            DO ji = fs_2, fs_jpim1       ! vector opt. 
    121                !                         ! vertical momentum advective trends 
    122                zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    123                zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    124                !                         ! add the trends to the general momentum trends 
    125                ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
    126                va(ji,jj,jk) = va(ji,jj,jk) + zva 
     114               ua(ji,jj,jk) = ua(ji,jj,jk) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
     115               va(ji,jj,jk) = va(ji,jj,jk) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    127116            END DO   
    128117         END DO   
     
    133122         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    134123         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt ) 
    135          CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv )  
     124         DEALLOCATE( ztrdu, ztrdv )  
    136125      ENDIF 
    137126      !                             ! Control print 
     
    139128         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    140129      ! 
    141       CALL wrk_dealloc( jpi,jpj, zww )  
    142       CALL wrk_dealloc( jpi,jpj,jpk, zwuw , zwvw )  
    143       ! 
    144       IF( nn_timing == 1 )  CALL timing_stop('dyn_zad') 
     130      IF( ln_timing )   CALL timing_stop('dyn_zad') 
    145131      ! 
    146132   END SUBROUTINE dyn_zad 
    147133 
    148  
    149    SUBROUTINE dyn_zad_zts ( kt ) 
    150       !!---------------------------------------------------------------------- 
    151       !!                  ***  ROUTINE dynzad_zts  *** 
    152       !!  
    153       !! ** Purpose :   Compute the now vertical momentum advection trend and  
    154       !!      add it to the general trend of momentum equation. This version 
    155       !!      uses sub-timesteps for improved numerical stability with small 
    156       !!      vertical grid sizes. This is especially relevant when using  
    157       !!      embedded ice with thin surface boxes. 
    158       !! 
    159       !! ** Method  :   The now vertical advection of momentum is given by: 
    160       !!         w dz(u) = ua + 1/(e1u*e2u*e3u) mk+1[ mi(e1t*e2t*wn) dk(un) ] 
    161       !!         w dz(v) = va + 1/(e1v*e2v*e3v) mk+1[ mj(e1t*e2t*wn) dk(vn) ] 
    162       !!      Add this trend to the general trend (ua,va): 
    163       !!         (ua,va) = (ua,va) + w dz(u,v) 
    164       !! 
    165       !! ** Action  : - Update (ua,va) with the vert. momentum adv. trends 
    166       !!              - Save the trends in (ztrdu,ztrdv) ('key_trddyn') 
    167       !!---------------------------------------------------------------------- 
    168       INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx 
    169       ! 
    170       INTEGER  ::   ji, jj, jk, jl  ! dummy loop indices 
    171       INTEGER  ::   jnzts = 5       ! number of sub-timesteps for vertical advection 
    172       INTEGER  ::   jtb, jtn, jta   ! sub timestep pointers for leap-frog/euler forward steps 
    173       REAL(wp) ::   zua, zva        ! temporary scalars 
    174       REAL(wp) ::   zr_rdt          ! temporary scalar 
    175       REAL(wp) ::   z2dtzts         ! length of Euler forward sub-timestep for vertical advection 
    176       REAL(wp) ::   zts             ! length of sub-timestep for vertical advection 
    177       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  zwuw , zwvw, zww 
    178       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztrdu, ztrdv 
    179       REAL(wp), POINTER, DIMENSION(:,:,:,:) ::  zus , zvs 
    180       !!---------------------------------------------------------------------- 
    181       ! 
    182       IF( nn_timing == 1 )  CALL timing_start('dyn_zad_zts') 
    183       ! 
    184       CALL wrk_alloc( jpi,jpj,jpk,     zwuw, zwvw, zww )  
    185       CALL wrk_alloc( jpi,jpj,jpk,3,   zus , zvs )  
    186       ! 
    187       IF( kt == nit000 ) THEN 
    188          IF(lwp)WRITE(numout,*) 
    189          IF(lwp)WRITE(numout,*) 'dyn_zad_zts : arakawa advection scheme with sub-timesteps' 
    190       ENDIF 
    191  
    192       IF( l_trddyn )   THEN         ! Save ua and va trends 
    193          CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv )  
    194          ztrdu(:,:,:) = ua(:,:,:)  
    195          ztrdv(:,:,:) = va(:,:,:)  
    196       ENDIF 
    197        
    198       IF( neuler == 0 .AND. kt == nit000 ) THEN 
    199           z2dtzts =         rdt / REAL( jnzts, wp )   ! = rdt (restart with Euler time stepping) 
    200       ELSE 
    201           z2dtzts = 2._wp * rdt / REAL( jnzts, wp )   ! = 2 rdt (leapfrog) 
    202       ENDIF 
    203        
    204       DO jk = 2, jpkm1                    ! Calculate and store vertical fluxes 
    205          DO jj = 2, jpj                    
    206             DO ji = fs_2, jpi             ! vector opt. 
    207                zww(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
    208             END DO 
    209          END DO 
    210       END DO 
    211  
    212       DO jj = 2, jpjm1                    ! Surface and bottom advective fluxes set to zero 
    213          DO ji = fs_2, fs_jpim1           ! vector opt. 
    214  !!gm missing ISF boundary condition 
    215             zwuw(ji,jj, 1 ) = 0._wp 
    216             zwvw(ji,jj, 1 ) = 0._wp 
    217             zwuw(ji,jj,jpk) = 0._wp 
    218             zwvw(ji,jj,jpk) = 0._wp 
    219          END DO   
    220       END DO 
    221  
    222 ! Start with before values and use sub timestepping to reach after values 
    223  
    224       zus(:,:,:,1) = ub(:,:,:) 
    225       zvs(:,:,:,1) = vb(:,:,:) 
    226  
    227       DO jl = 1, jnzts                   ! Start of sub timestepping loop 
    228  
    229          IF( jl == 1 ) THEN              ! Euler forward to kick things off 
    230            jtb = 1   ;   jtn = 1   ;   jta = 2 
    231            zts = z2dtzts 
    232          ELSEIF( jl == 2 ) THEN          ! First leapfrog step 
    233            jtb = 1   ;   jtn = 2   ;   jta = 3 
    234            zts = 2._wp * z2dtzts 
    235          ELSE                            ! Shuffle pointers for subsequent leapfrog steps 
    236            jtb = MOD(jtb,3) + 1 
    237            jtn = MOD(jtn,3) + 1 
    238            jta = MOD(jta,3) + 1 
    239          ENDIF 
    240  
    241          DO jk = 2, jpkm1           ! Vertical momentum advection at level w and u- and v- vertical 
    242             DO jj = 2, jpjm1                 ! vertical momentum advection at w-point 
    243                DO ji = fs_2, fs_jpim1        ! vector opt. 
    244                   zwuw(ji,jj,jk) = ( zww(ji+1,jj  ,jk) + zww(ji,jj,jk) ) * ( zus(ji,jj,jk-1,jtn)-zus(ji,jj,jk,jtn) ) !* wumask(ji,jj,jk) 
    245                   zwvw(ji,jj,jk) = ( zww(ji  ,jj+1,jk) + zww(ji,jj,jk) ) * ( zvs(ji,jj,jk-1,jtn)-zvs(ji,jj,jk,jtn) ) !* wvmask(ji,jj,jk) 
    246                END DO   
    247             END DO    
    248          END DO 
    249          DO jk = 1, jpkm1           ! Vertical momentum advection at u- and v-points 
    250             DO jj = 2, jpjm1 
    251                DO ji = fs_2, fs_jpim1       ! vector opt. 
    252                   !                         ! vertical momentum advective trends 
    253                   zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    254                   zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    255                   zus(ji,jj,jk,jta) = zus(ji,jj,jk,jtb) + zua * zts 
    256                   zvs(ji,jj,jk,jta) = zvs(ji,jj,jk,jtb) + zva * zts 
    257                END DO   
    258             END DO   
    259          END DO 
    260  
    261       END DO      ! End of sub timestepping loop 
    262  
    263       zr_rdt = 1._wp / ( REAL( jnzts, wp ) * z2dtzts ) 
    264       DO jk = 1, jpkm1              ! Recover trends over the outer timestep 
    265          DO jj = 2, jpjm1 
    266             DO ji = fs_2, fs_jpim1       ! vector opt. 
    267                !                         ! vertical momentum advective trends 
    268                !                         ! add the trends to the general momentum trends 
    269                ua(ji,jj,jk) = ua(ji,jj,jk) + ( zus(ji,jj,jk,jta) - ub(ji,jj,jk)) * zr_rdt 
    270                va(ji,jj,jk) = va(ji,jj,jk) + ( zvs(ji,jj,jk,jta) - vb(ji,jj,jk)) * zr_rdt 
    271             END DO   
    272          END DO   
    273       END DO 
    274  
    275       IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic 
    276          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    277          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    278          CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt ) 
    279          CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv )  
    280       ENDIF 
    281       !                             ! Control print 
    282       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zad  - Ua: ', mask1=umask,   & 
    283          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    284       ! 
    285       CALL wrk_dealloc( jpi,jpj,jpk,     zwuw, zwvw, zww )  
    286       CALL wrk_dealloc( jpi,jpj,jpk,3,   zus , zvs )  
    287       ! 
    288       IF( nn_timing == 1 )  CALL timing_stop('dyn_zad_zts') 
    289       ! 
    290    END SUBROUTINE dyn_zad_zts 
    291  
    292134   !!====================================================================== 
    293135END MODULE dynzad 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf.F90

    r8215 r8568  
    7676      !!--------------------------------------------------------------------- 
    7777      ! 
    78       IF( nn_timing == 1 )   CALL timing_start('dyn_zdf') 
     78      IF( ln_timing )   CALL timing_start('dyn_zdf') 
    7979      ! 
    8080      IF( kt == nit000 ) THEN       !* initialization 
     
    392392         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    393393         ! 
    394       IF( nn_timing == 1 )   CALL timing_stop('dyn_zdf') 
     394      IF( ln_timing )   CALL timing_stop('dyn_zdf') 
    395395      ! 
    396396   END SUBROUTINE dyn_zdf 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90

    r7753 r8568  
    2222   USE divhor         ! horizontal divergence 
    2323   USE phycst         ! physical constants 
    24    USE bdy_oce   , ONLY: ln_bdy, bdytmask 
     24   USE bdy_oce , ONLY : ln_bdy, bdytmask   ! Open BounDarY 
    2525   USE bdydyn2d       ! bdy_ssh routine 
    2626#if defined key_agrif 
     
    3636   USE lbclnk         ! ocean lateral boundary condition (or mpp link) 
    3737   USE lib_mpp        ! MPP library 
    38    USE wrk_nemo       ! Memory Allocation 
    3938   USE timing         ! Timing 
    40    USE wet_dry         ! Wetting/Drying flux limting 
     39   USE wet_dry        ! Wetting/Drying flux limting 
    4140 
    4241   IMPLICIT NONE 
     
    7473      INTEGER  ::   jk            ! dummy loop indice 
    7574      REAL(wp) ::   z2dt, zcoef   ! local scalars 
    76       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhdiv   ! 2D workspace 
    77       !!---------------------------------------------------------------------- 
    78       ! 
    79       IF( nn_timing == 1 )   CALL timing_start('ssh_nxt') 
    80       ! 
    81       CALL wrk_alloc( jpi,jpj,   zhdiv )  
     75      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv   ! 2D workspace 
     76      !!---------------------------------------------------------------------- 
     77      ! 
     78      IF( ln_timing )   CALL timing_start('ssh_nxt') 
    8279      ! 
    8380      IF( kt == nit000 ) THEN 
     
    134131      IF(ln_ctl)   CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha  - : ', mask1=tmask, ovlap=1 ) 
    135132      ! 
    136       CALL wrk_dealloc( jpi, jpj, zhdiv )  
    137       ! 
    138       IF( nn_timing == 1 )  CALL timing_stop('ssh_nxt') 
     133      IF( ln_timing )   CALL timing_stop('ssh_nxt') 
    139134      ! 
    140135   END SUBROUTINE ssh_nxt 
     
    160155      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    161156      REAL(wp) ::   z1_2dt       ! local scalars 
    162       REAL(wp), POINTER, DIMENSION(:,:  ) ::  z2d 
    163       REAL(wp), POINTER, DIMENSION(:,:,:) ::  z3d, zhdiv 
    164       !!---------------------------------------------------------------------- 
    165       ! 
    166       IF( nn_timing == 1 )   CALL timing_start('wzv') 
     157      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zhdiv 
     158      !!---------------------------------------------------------------------- 
     159      ! 
     160      IF( ln_timing )   CALL timing_start('wzv') 
    167161      ! 
    168162      IF( kt == nit000 ) THEN 
     
    180174      ! 
    181175      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN      ! z_tilde and layer cases 
    182          CALL wrk_alloc( jpi, jpj, jpk, zhdiv )  
     176         ALLOCATE( zhdiv(jpi,jpj,jpk) )  
    183177         ! 
    184178         DO jk = 1, jpkm1 
     
    200194         END DO 
    201195         !          IF( ln_vvl_layer ) wn(:,:,:) = 0.e0 
    202          CALL wrk_dealloc( jpi, jpj, jpk, zhdiv )  
     196         DEALLOCATE( zhdiv )  
    203197      ELSE   ! z_star and linear free surface cases 
    204198         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
     
    215209      ENDIF 
    216210      ! 
    217       IF( nn_timing == 1 )  CALL timing_stop('wzv') 
     211      IF( ln_timing )   CALL timing_stop('wzv') 
    218212      ! 
    219213   END SUBROUTINE wzv 
     
    244238      !!---------------------------------------------------------------------- 
    245239      ! 
    246       IF( nn_timing == 1 )  CALL timing_start('ssh_swp') 
     240      IF( ln_timing )  CALL timing_start('ssh_swp') 
    247241      ! 
    248242      IF( kt == nit000 ) THEN 
     
    271265      IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb  - : ', mask1=tmask, ovlap=1 ) 
    272266      ! 
    273       IF( nn_timing == 1 )   CALL timing_stop('ssh_swp') 
     267      IF( ln_timing )   CALL timing_stop('ssh_swp') 
    274268      ! 
    275269   END SUBROUTINE ssh_swp 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/wet_dry.F90

    r7646 r8568  
    1111 
    1212   !!---------------------------------------------------------------------- 
    13    !!   wad_lmt    : Compute the horizontal flux limiter and the limited velocity 
    14    !!                when wetting and drying happens  
    15    !!---------------------------------------------------------------------- 
    16    USE oce             ! ocean dynamics and tracers 
    17    USE dom_oce         ! ocean space and time domain 
    18    USE sbc_oce, ONLY : ln_rnf   ! surface boundary condition: ocean 
    19    USE sbcrnf          ! river runoff  
    20    USE in_out_manager  ! I/O manager 
    21    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    22    USE lib_mpp         ! MPP library 
    23    USE wrk_nemo        ! Memory Allocation 
    24    USE timing          ! Timing 
     13   !!   wad_init      : initialisation of wetting and drying 
     14   !!   wad_lmt       : horizontal flux limiter and limited velocity when wetting and drying happens 
     15   !!   wad_lmt_bt    : same as wad_lmt for the barotropic stepping (dynspg_ts) 
     16   !!---------------------------------------------------------------------- 
     17   USE oce            ! ocean dynamics and tracers 
     18   USE dom_oce        ! ocean space and time domain 
     19   USE sbc_oce  , ONLY: ln_rnf   ! surface boundary condition: ocean 
     20   USE sbcrnf         ! river runoff  
     21   ! 
     22   USE in_out_manager ! I/O manager 
     23   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     24   USE lib_mpp        ! MPP library 
     25   USE timing         ! Timing 
    2526 
    2627   IMPLICIT NONE 
     
    3132   !! --------------------------------------------------------------------- 
    3233 
    33    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   wdmask         !: u- and v- limiter  
    34    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   ht_wd          !: wetting and drying t-pt depths 
    35                                                                      !  (can include negative depths) 
     34   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   wdmask   !: u- and v- limiter  
     35   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   ht_wd    !: wetting and drying t-pt depths 
     36   !                                                           !  (can include negative depths) 
    3637 
    3738   LOGICAL,  PUBLIC  ::   ln_wd       !: Wetting/drying activation switch (T:on,F:off) 
    3839   REAL(wp), PUBLIC  ::   rn_wdmin1   !: minimum water depth on dried cells 
    3940   REAL(wp), PUBLIC  ::   rn_wdmin2   !: tolerrance of minimum water depth on dried cells 
    40    REAL(wp), PUBLIC  ::   rn_wdld     !: land elevation below which wetting/drying  
    41                                            !: will be considered 
     41   REAL(wp), PUBLIC  ::   rn_wdld     !: land elevation below which wetting/drying will be considered 
    4242   INTEGER , PUBLIC  ::   nn_wdit     !: maximum number of iteration for W/D limiter 
    4343 
     
    4848   !! * Substitutions 
    4949#  include "vectopt_loop_substitute.h90" 
     50   !!---------------------------------------------------------------------- 
    5051CONTAINS 
    5152 
     
    5859      !! ** input   : - namwad namelist 
    5960      !!---------------------------------------------------------------------- 
     61      INTEGER  ::   ios, ierr   ! Local integer 
     62      !! 
    6063      NAMELIST/namwad/ ln_wd, rn_wdmin1, rn_wdmin2, rn_wdld, nn_wdit 
    61       INTEGER  ::   ios                 ! Local integer output status for namelist read 
    62       INTEGER  ::   ierr                ! Local integer status array allocation  
    63       !!---------------------------------------------------------------------- 
    64  
    65       REWIND( numnam_ref )              ! Namelist namwad in reference namelist  
    66                                         ! : Parameters for Wetting/Drying 
     64      !!---------------------------------------------------------------------- 
     65      ! 
     66      REWIND( numnam_ref )              ! Namelist namwad in reference namelist : Parameters for Wetting/Drying 
    6767      READ  ( numnam_ref, namwad, IOSTAT = ios, ERR = 905) 
    6868905   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namwad in reference namelist', .TRUE.)  
    69       REWIND( numnam_cfg )              ! Namelist namwad in configuration namelist  
    70                                         ! : Parameters for Wetting/Drying 
     69      REWIND( numnam_cfg )              ! Namelist namwad in configuration namelist : Parameters for Wetting/Drying 
    7170      READ  ( numnam_cfg, namwad, IOSTAT = ios, ERR = 906) 
    7271906   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namwad in configuration namelist', .TRUE. ) 
    7372      IF(lwm) WRITE ( numond, namwad ) 
    74  
     73      ! 
    7574      IF(lwp) THEN                  ! control print 
    7675         WRITE(numout,*) 
     
    103102      !! ** Action  : - calculate flux limiter and W/D flag 
    104103      !!---------------------------------------------------------------------- 
    105       REAL(wp), DIMENSION(:,:), INTENT(inout) ::   sshb1 
    106       REAL(wp), DIMENSION(:,:), INTENT(in)    ::   sshemp 
    107       REAL(wp), INTENT(in) :: z2dt 
     104      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   sshb1        !!gm DOCTOR names: should start with p ! 
     105      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   sshemp 
     106      REAL(wp)                , INTENT(in   ) ::  z2dt 
    108107      ! 
    109108      INTEGER  ::   ji, jj, jk, jk1     ! dummy loop indices 
     
    113112      REAL(wp) ::   zdepwd              ! local scalar, always wet cell depth 
    114113      REAL(wp) ::   ztmp                ! local scalars 
    115       REAL(wp), POINTER,  DIMENSION(:,:) ::   zwdlmtu, zwdlmtv         !: W/D flux limiters 
    116       REAL(wp), POINTER,  DIMENSION(:,:) ::   zflxp,  zflxn            ! local 2D workspace 
    117       REAL(wp), POINTER,  DIMENSION(:,:) ::   zflxu,  zflxv            ! local 2D workspace 
    118       REAL(wp), POINTER,  DIMENSION(:,:) ::   zflxu1, zflxv1           ! local 2D workspace 
    119       !!---------------------------------------------------------------------- 
    120       ! 
    121  
    122       IF( nn_timing == 1 )  CALL timing_start('wad_lmt') 
    123  
    124       IF(ln_wd) THEN 
    125  
    126         CALL wrk_alloc( jpi, jpj, zflxp, zflxn, zflxu, zflxv, zflxu1, zflxv1 ) 
    127         CALL wrk_alloc( jpi, jpj, zwdlmtu, zwdlmtv) 
    128         ! 
    129         
    130         !IF(lwp) WRITE(numout,*) 
    131         !IF(lwp) WRITE(numout,*) 'wad_lmt : wetting/drying limiters and velocity limiting' 
    132         
    133         jflag  = 0 
    134         zdepwd = 50._wp   !maximum depth on which that W/D could possibly happen 
    135  
    136         
    137         zflxp(:,:)   = 0._wp 
    138         zflxn(:,:)   = 0._wp 
    139         zflxu(:,:)   = 0._wp 
    140         zflxv(:,:)   = 0._wp 
    141  
    142         zwdlmtu(:,:)  = 1._wp 
    143         zwdlmtv(:,:)  = 1._wp 
    144         
    145         ! Horizontal Flux in u and v direction 
    146         DO jk = 1, jpkm1   
    147            DO jj = 1, jpj 
    148               DO ji = 1, jpi 
    149                  zflxu(ji,jj) = zflxu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk) 
    150                  zflxv(ji,jj) = zflxv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk) 
    151               END DO   
    152            END DO   
    153         END DO 
    154         
    155         zflxu(:,:) = zflxu(:,:) * e2u(:,:) 
    156         zflxv(:,:) = zflxv(:,:) * e1v(:,:) 
    157         
    158         wdmask(:,:) = 1 
    159         DO jj = 2, jpj 
    160            DO ji = 2, jpi  
    161  
    162              IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE   ! we don't care about land cells 
    163              IF( ht_wd(ji,jj) > zdepwd )      CYCLE   ! and cells which are unlikely to dry 
    164  
    165               zflxp(ji,jj) = max(zflxu(ji,jj), 0._wp) - min(zflxu(ji-1,jj),   0._wp) + & 
    166                            & max(zflxv(ji,jj), 0._wp) - min(zflxv(ji,  jj-1), 0._wp)  
    167               zflxn(ji,jj) = min(zflxu(ji,jj), 0._wp) - max(zflxu(ji-1,jj),   0._wp) + & 
    168                            & min(zflxv(ji,jj), 0._wp) - max(zflxv(ji,  jj-1), 0._wp)  
    169  
    170               zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 
    171               IF(zdep2 .le. 0._wp) THEN  !add more safty, but not necessary 
    172                 sshb1(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 
    173                 IF(zflxu(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = 0._wp 
    174                 IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 
    175                 IF(zflxv(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = 0._wp 
    176                 IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp  
    177                 wdmask(ji,jj) = 0._wp 
    178               END IF 
    179            ENDDO 
    180         END DO 
    181  
    182        
    183         !! start limiter iterations  
    184         DO jk1 = 1, nn_wdit + 1 
    185         
    186            
    187            zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 
    188            zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 
    189            jflag = 0     ! flag indicating if any further iterations are needed 
    190            
    191            DO jj = 2, jpj 
    192               DO ji = 2, jpi  
    193          
    194                  IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE  
    195                  IF( ht_wd(ji,jj) > zdepwd )      CYCLE 
    196          
    197                  ztmp = e1e2t(ji,jj) 
    198  
    199                  zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj),   0._wp) + & 
    200                         & max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji,  jj-1), 0._wp)  
    201                  zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj),   0._wp) + & 
    202                         & min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji,  jj-1), 0._wp)  
    203            
    204                  zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
    205                  zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 - z2dt * sshemp(ji,jj) 
    206            
    207                  IF( zdep1 > zdep2 ) THEN 
    208                    wdmask(ji, jj) = 0 
    209                    zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
    210                    !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
    211                    ! flag if the limiter has been used but stop flagging if the only 
    212                    ! changes have zeroed the coefficient since further iterations will 
    213                    ! not change anything 
    214                    IF( zcoef > 0._wp ) THEN 
    215                       jflag = 1  
    216                    ELSE 
    217                       zcoef = 0._wp 
    218                    ENDIF 
    219                    IF(jk1 > nn_wdit) zcoef = 0._wp 
    220                    IF(zflxu1(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = zcoef 
    221                    IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 
    222                    IF(zflxv1(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = zcoef 
    223                    IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 
    224                  END IF 
    225               END DO ! ji loop 
    226            END DO  ! jj loop 
    227  
    228            CALL lbc_lnk( zwdlmtu, 'U', 1. ) 
    229            CALL lbc_lnk( zwdlmtv, 'V', 1. ) 
    230  
    231            IF(lk_mpp) CALL mpp_max(jflag)   !max over the global domain 
    232  
    233            IF(jflag == 0) EXIT 
    234            
    235         END DO  ! jk1 loop 
    236         
    237         DO jk = 1, jpkm1 
    238           un(:,:,jk) = un(:,:,jk) * zwdlmtu(:, :)  
    239           vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:, :)  
    240         END DO 
    241  
    242         CALL lbc_lnk( un, 'U', -1. ) 
    243         CALL lbc_lnk( vn, 'V', -1. ) 
    244       ! 
    245         un_b(:,:) = un_b(:,:) * zwdlmtu(:, :) 
    246         vn_b(:,:) = vn_b(:,:) * zwdlmtv(:, :) 
    247         CALL lbc_lnk( un_b, 'U', -1. ) 
    248         CALL lbc_lnk( vn_b, 'V', -1. ) 
    249         
    250         IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt!!!' 
    251         
    252         !IF( ln_rnf      )   CALL sbc_rnf_div( hdivn )          ! runoffs (update hdivn field) 
    253         !IF( nn_cla == 1 )   CALL cla_div    ( kt )             ! Cross Land Advection (update hdivn field) 
    254         ! 
    255         ! 
    256         CALL wrk_dealloc( jpi, jpj, zflxp, zflxn, zflxu, zflxv, zflxu1, zflxv1 ) 
    257         CALL wrk_dealloc( jpi, jpj, zwdlmtu, zwdlmtv) 
    258         ! 
    259       ENDIF 
    260       ! 
    261       IF( nn_timing == 1 )  CALL timing_stop('wad_lmt') 
     114      REAL(wp),  DIMENSION(jpi,jpj) ::   zwdlmtu, zwdlmtv   ! W/D flux limiters 
     115      REAL(wp),  DIMENSION(jpi,jpj) ::   zflxp  ,  zflxn    ! local 2D workspace 
     116      REAL(wp),  DIMENSION(jpi,jpj) ::   zflxu  ,  zflxv    ! local 2D workspace 
     117      REAL(wp),  DIMENSION(jpi,jpj) ::   zflxu1 , zflxv1    ! local 2D workspace 
     118      !!---------------------------------------------------------------------- 
     119      ! 
     120      IF( ln_timing )   CALL timing_start('wad_lmt') 
     121      ! 
     122      !IF(lwp) WRITE(numout,*) 
     123      !IF(lwp) WRITE(numout,*) 'wad_lmt : wetting/drying limiters and velocity limiting' 
     124      ! 
     125      jflag  = 0 
     126      zdepwd = 50._wp   !maximum depth on which that W/D could possibly happen 
     127      !  
     128      zflxp(:,:)   = 0._wp 
     129      zflxn(:,:)   = 0._wp 
     130      zflxu(:,:)   = 0._wp 
     131      zflxv(:,:)   = 0._wp 
     132      ! 
     133      zwdlmtu(:,:) = 1._wp 
     134      zwdlmtv(:,:) = 1._wp 
     135      !  
     136      ! Horizontal Flux in u and v direction 
     137      DO jk = 1, jpkm1   
     138         DO jj = 1, jpj 
     139            DO ji = 1, jpi 
     140               zflxu(ji,jj) = zflxu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk) 
     141               zflxv(ji,jj) = zflxv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk) 
     142            END DO   
     143         END DO   
     144      END DO 
     145      ! 
     146      zflxu(:,:) = zflxu(:,:) * e2u(:,:) 
     147      zflxv(:,:) = zflxv(:,:) * e1v(:,:) 
     148      !  
     149      wdmask(:,:) = 1 
     150      DO jj = 2, jpj 
     151         DO ji = 2, jpi  
     152            ! 
     153            IF( tmask(ji, jj, 1) < 0.5_wp )   CYCLE   ! we don't care about land cells 
     154            IF( ht_wd(ji,jj)     > zdepwd )   CYCLE   ! and cells which are unlikely to dry 
     155            ! 
     156            zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj) , 0._wp )   & 
     157               &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,jj-1) , 0._wp )  
     158            zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj) , 0._wp )   & 
     159               &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,jj-1) , 0._wp )  
     160            ! 
     161            zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 
     162            IF( zdep2 .le. 0._wp) THEN  !add more safty, but not necessary 
     163               sshb1(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 
     164               IF( zflxu(ji,  jj) > 0._wp )   zwdlmtu(ji  ,jj) = 0._wp 
     165               IF( zflxu(ji-1,jj) < 0._wp )   zwdlmtu(ji-1,jj) = 0._wp 
     166               IF( zflxv(ji,  jj) > 0._wp )   zwdlmtv(ji  ,jj) = 0._wp 
     167               IF( zflxv(ji,jj-1) < 0._wp )   zwdlmtv(ji,jj-1) = 0._wp  
     168               wdmask(ji,jj) = 0._wp 
     169            ENDIF 
     170         END DO 
     171      END DO 
     172      !! 
     173      !! start limiter iterations  
     174      DO jk1 = 1, nn_wdit + 1 
     175         !  
     176         zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 
     177         zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 
     178         jflag = 0     ! flag indicating if any further iterations are needed 
     179         !  
     180         DO jj = 2, jpj 
     181            DO ji = 2, jpi  
     182               ! 
     183               IF( tmask(ji,jj,1) < 0.5_wp )   CYCLE  
     184               IF( ht_wd(ji,jj)   > zdepwd )   CYCLE 
     185               ! 
     186               ztmp = e1e2t(ji,jj) 
     187               ! 
     188               zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj) , 0._wp )   & 
     189                  &   + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,jj-1) , 0._wp )  
     190               zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj) , 0._wp )   & 
     191                  &   + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,jj-1) , 0._wp )  
     192               ! 
     193               zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
     194               zdep2 = ht_wd(ji,jj) + sshb1(ji,jj) - rn_wdmin1 - z2dt * sshemp(ji,jj) 
     195               ! 
     196               IF( zdep1 > zdep2 ) THEN 
     197                  wdmask(ji, jj) = 0 
     198                  zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
     199                  !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
     200                  ! flag if the limiter has been used but stop flagging if the only 
     201                  ! changes have zeroed the coefficient since further iterations will 
     202                  ! not change anything 
     203                  IF( zcoef > 0._wp ) THEN   ;   jflag = 1  
     204                  ELSE                       ;   zcoef = 0._wp 
     205                  ENDIF 
     206                  IF( jk1 > nn_wdit )   zcoef = 0._wp 
     207                  IF( zflxu1(ji,  jj) > 0._wp )   zwdlmtu(ji  ,jj) = zcoef 
     208                  IF( zflxu1(ji-1,jj) < 0._wp )   zwdlmtu(ji-1,jj) = zcoef 
     209                  IF( zflxv1(ji,  jj) > 0._wp )   zwdlmtv(ji  ,jj) = zcoef 
     210                  IF( zflxv1(ji,jj-1) < 0._wp )   zwdlmtv(ji,jj-1) = zcoef 
     211               ENDIF 
     212            END DO ! ji loop 
     213         END DO  ! jj loop 
     214         ! 
     215         CALL lbc_lnk( zwdlmtu, 'U', 1. ) 
     216         CALL lbc_lnk( zwdlmtv, 'V', 1. ) 
     217         ! 
     218         IF(lk_mpp)   CALL mpp_max(jflag)   !max over the global domain 
     219         ! 
     220         IF(jflag == 0)   EXIT 
     221         !  
     222      END DO  ! jk1 loop 
     223        
     224      DO jk = 1, jpkm1 
     225         un(:,:,jk) = un(:,:,jk) * zwdlmtu(:,:)  
     226         vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:,:)  
     227      END DO 
     228 
     229!!gm ==> Andrew  : the lbclnk below is useless since above lbclnk is applied on zwdlmtu/v 
     230!!                                             and un, vn always with lbclnk 
     231      CALL lbc_lnk( un, 'U', -1. ) 
     232      CALL lbc_lnk( vn, 'V', -1. ) 
     233!!gm end 
     234      ! 
     235      un_b(:,:) = un_b(:,:) * zwdlmtu(:,:) 
     236      vn_b(:,:) = vn_b(:,:) * zwdlmtv(:,:) 
     237!!gm ==> Andrew   : probably same as above 
     238      CALL lbc_lnk( un_b, 'U', -1. ) 
     239      CALL lbc_lnk( vn_b, 'V', -1. ) 
     240!!gm end 
     241        
     242      IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt!!!' 
     243        
     244      !IF( ln_rnf      )   CALL sbc_rnf_div( hdivn )          ! runoffs (update hdivn field) 
     245      !IF( nn_cla == 1 )   CALL cla_div    ( kt )             ! Cross Land Advection (update hdivn field) 
     246      ! 
     247      ! 
     248      ! 
     249      IF( ln_timing )   CALL timing_stop('wad_lmt') 
    262250      ! 
    263251   END SUBROUTINE wad_lmt 
     
    284272      REAL(wp) ::   zdepwd              ! local scalar, always wet cell depth 
    285273      REAL(wp) ::   ztmp                ! local scalars 
    286       REAL(wp), POINTER,  DIMENSION(:,:) ::   zwdlmtu, zwdlmtv         !: W/D flux limiters 
    287       REAL(wp), POINTER,  DIMENSION(:,:) ::   zflxp,  zflxn            ! local 2D workspace 
    288       REAL(wp), POINTER,  DIMENSION(:,:) ::   zflxu1, zflxv1           ! local 2D workspace 
    289       !!---------------------------------------------------------------------- 
    290       ! 
    291       IF( nn_timing == 1 )  CALL timing_start('wad_lmt_bt') 
    292  
    293       IF(ln_wd) THEN 
    294  
    295         CALL wrk_alloc( jpi, jpj, zflxp, zflxn, zflxu1, zflxv1 ) 
    296         CALL wrk_alloc( jpi, jpj, zwdlmtu, zwdlmtv) 
    297         ! 
    298         
    299         !IF(lwp) WRITE(numout,*) 
    300         !IF(lwp) WRITE(numout,*) 'wad_lmt_bt : wetting/drying limiters and velocity limiting' 
    301         
    302         jflag  = 0 
    303         zdepwd = 50._wp   !maximum depth that ocean cells can have W/D processes 
    304  
    305         z2dt = rdtbt    
    306         
    307         zflxp(:,:)   = 0._wp 
    308         zflxn(:,:)   = 0._wp 
    309  
    310         zwdlmtu(:,:)  = 1._wp 
    311         zwdlmtv(:,:)  = 1._wp 
    312         
    313         ! Horizontal Flux in u and v direction 
    314         
    315         DO jj = 2, jpj 
    316            DO ji = 2, jpi  
    317  
    318              IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE   ! we don't care about land cells 
    319              IF( ht_wd(ji,jj) > zdepwd )      CYCLE   ! and cells which are unlikely to dry 
    320  
    321               zflxp(ji,jj) = max(zflxu(ji,jj), 0._wp) - min(zflxu(ji-1,jj),   0._wp) + & 
    322                            & max(zflxv(ji,jj), 0._wp) - min(zflxv(ji,  jj-1), 0._wp)  
    323               zflxn(ji,jj) = min(zflxu(ji,jj), 0._wp) - max(zflxu(ji-1,jj),   0._wp) + & 
    324                            & min(zflxv(ji,jj), 0._wp) - max(zflxv(ji,  jj-1), 0._wp)  
    325  
    326               zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 
    327               IF(zdep2 .le. 0._wp) THEN  !add more safety, but not necessary 
    328                 sshn_e(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 
    329                 IF(zflxu(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = 0._wp 
    330                 IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 
    331                 IF(zflxv(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = 0._wp 
    332                 IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp  
    333               END IF 
    334            ENDDO 
    335         END DO 
     274      REAL(wp), DIMENSION(jpi,jpj) ::   zwdlmtu, zwdlmtv         !: W/D flux limiters 
     275      REAL(wp), DIMENSION(jpi,jpj) ::   zflxp,  zflxn            ! local 2D workspace 
     276      REAL(wp), DIMENSION(jpi,jpj) ::   zflxu1, zflxv1           ! local 2D workspace 
     277      !!---------------------------------------------------------------------- 
     278      ! 
     279      IF( ln_timing )  CALL timing_start('wad_lmt_bt') 
     280      !        
     281      !IF(lwp) WRITE(numout,*) 
     282      !IF(lwp) WRITE(numout,*) 'wad_lmt_bt : wetting/drying limiters and velocity limiting' 
     283        
     284      jflag  = 0 
     285      zdepwd = 50._wp   !maximum depth that ocean cells can have W/D processes 
     286 
     287      z2dt = rdtbt    
     288        
     289      zflxp(:,:)   = 0._wp 
     290      zflxn(:,:)   = 0._wp 
     291 
     292      zwdlmtu(:,:) = 1._wp 
     293      zwdlmtv(:,:) = 1._wp 
     294        
     295      ! Horizontal Flux in u and v direction 
     296        
     297      DO jj = 2, jpj 
     298         DO ji = 2, jpi  
     299            ! 
     300            IF( tmask(ji,jj,1) < 0.5_wp )   CYCLE   ! we don't care about land cells 
     301            IF( ht_wd(ji,jj)   > zdepwd )   CYCLE   ! and cells which are unlikely to dry 
     302            ! 
     303            zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj) , 0._wp )   & 
     304               &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,jj-1) , 0._wp )  
     305            zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj) , 0._wp )   & 
     306               &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,jj-1) , 0._wp )  
     307 
     308            zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 
     309            IF(zdep2 .le. 0._wp) THEN  !add more safety, but not necessary 
     310               sshn_e(ji,jj) = rn_wdmin1 - ht_wd(ji,jj) 
     311               IF( zflxu(ji,  jj) > 0._wp )   zwdlmtu(ji  ,jj) = 0._wp 
     312               IF( zflxu(ji-1,jj) < 0._wp )   zwdlmtu(ji-1,jj) = 0._wp 
     313               IF( zflxv(ji,  jj) > 0._wp )   zwdlmtv(ji  ,jj) = 0._wp 
     314               IF( zflxv(ji,jj-1) < 0._wp )   zwdlmtv(ji,jj-1) = 0._wp  
     315            ENDIF 
     316         END DO 
     317      END DO 
    336318 
    337319       
    338         !! start limiter iterations  
    339         DO jk1 = 1, nn_wdit + 1 
    340         
     320      !! start limiter iterations  
     321      DO jk1 = 1, nn_wdit + 1 
     322         !  
     323         zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 
     324         zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 
     325         jflag = 0     ! flag indicating if any further iterations are needed 
     326         ! 
     327         DO jj = 2, jpj 
     328            DO ji = 2, jpi  
     329               ! 
     330               IF( tmask(ji,jj, 1 ) < 0.5_wp  )   CYCLE  
     331               IF( ht_wd(ji,jj)      > zdepwd )   CYCLE 
     332               ! 
     333               ztmp = e1e2t(ji,jj) 
     334               ! 
     335               zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj) , 0._wp )   & 
     336                  &   + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,jj-1) , 0._wp )  
     337               zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj) , 0._wp )   & 
     338                  &   + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,jj-1) , 0._wp )  
    341339           
    342            zflxu1(:,:) = zflxu(:,:) * zwdlmtu(:,:) 
    343            zflxv1(:,:) = zflxv(:,:) * zwdlmtv(:,:) 
    344            jflag = 0     ! flag indicating if any further iterations are needed 
     340               zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
     341               zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 
    345342           
    346            DO jj = 2, jpj 
    347               DO ji = 2, jpi  
    348          
    349                  IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE  
    350                  IF( ht_wd(ji,jj) > zdepwd )      CYCLE 
    351          
    352                  ztmp = e1e2t(ji,jj) 
    353  
    354                  zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj),   0._wp) + & 
    355                         & max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji,  jj-1), 0._wp)  
    356                  zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj),   0._wp) + & 
    357                         & min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji,  jj-1), 0._wp)  
    358            
    359                  zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
    360                  zdep2 = ht_wd(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 
    361            
    362                  IF(zdep1 > zdep2) THEN 
    363                    zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
    364                    !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
    365                    ! flag if the limiter has been used but stop flagging if the only 
    366                    ! changes have zeroed the coefficient since further iterations will 
    367                    ! not change anything 
    368                    IF( zcoef > 0._wp ) THEN 
     343               IF(zdep1 > zdep2) THEN 
     344                  zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
     345                  !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
     346                  ! flag if the limiter has been used but stop flagging if the only 
     347                  ! changes have zeroed the coefficient since further iterations will 
     348                  ! not change anything 
     349                  IF( zcoef > 0._wp ) THEN 
    369350                      jflag = 1  
    370                    ELSE 
     351                  ELSE 
    371352                      zcoef = 0._wp 
    372                    ENDIF 
    373                    IF(jk1 > nn_wdit) zcoef = 0._wp 
    374                    IF(zflxu1(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = zcoef 
    375                    IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 
    376                    IF(zflxv1(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = zcoef 
    377                    IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 
    378                  END IF 
    379               END DO ! ji loop 
    380            END DO  ! jj loop 
    381  
    382            CALL lbc_lnk( zwdlmtu, 'U', 1. ) 
    383            CALL lbc_lnk( zwdlmtv, 'V', 1. ) 
    384  
    385            IF(lk_mpp) CALL mpp_max(jflag)   !max over the global domain 
    386  
    387            IF(jflag == 0) EXIT 
    388            
    389         END DO  ! jk1 loop 
    390         
    391         zflxu(:,:) = zflxu(:,:) * zwdlmtu(:, :)  
    392         zflxv(:,:) = zflxv(:,:) * zwdlmtv(:, :)  
    393  
    394         CALL lbc_lnk( zflxu, 'U', -1. ) 
    395         CALL lbc_lnk( zflxv, 'V', -1. ) 
    396         
    397         IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!' 
    398         
    399         !IF( ln_rnf      )   CALL sbc_rnf_div( hdivn )          ! runoffs (update hdivn field) 
    400         !IF( nn_cla == 1 )   CALL cla_div    ( kt )             ! Cross Land Advection (update hdivn field) 
    401         ! 
    402         ! 
    403         CALL wrk_dealloc( jpi, jpj, zflxp, zflxn, zflxu1, zflxv1 ) 
    404         CALL wrk_dealloc( jpi, jpj, zwdlmtu, zwdlmtv) 
    405         ! 
    406       END IF 
    407  
    408       IF( nn_timing == 1 )  CALL timing_stop('wad_lmt') 
     353                  ENDIF 
     354                  IF( jk1 > nn_wdit )   zcoef = 0._wp 
     355                  IF( zflxu1(ji,  jj) > 0._wp )   zwdlmtu(ji  ,jj) = zcoef 
     356                  IF( zflxu1(ji-1,jj) < 0._wp )   zwdlmtu(ji-1,jj) = zcoef 
     357                  IF( zflxv1(ji,  jj) > 0._wp )   zwdlmtv(ji  ,jj) = zcoef 
     358                  IF( zflxv1(ji,jj-1) < 0._wp )   zwdlmtv(ji,jj-1) = zcoef 
     359               ENDIF 
     360            END DO ! ji loop 
     361         END DO  ! jj loop 
     362         ! 
     363         CALL lbc_lnk( zwdlmtu, 'U', 1. ) 
     364         CALL lbc_lnk( zwdlmtv, 'V', 1. ) 
     365         ! 
     366         IF(lk_mpp)   CALL mpp_max(jflag)   !max over the global domain 
     367         ! 
     368         IF( jflag == 0 )   EXIT 
     369         !     
     370      END DO  ! jk1 loop 
     371      !  
     372      zflxu(:,:) = zflxu(:,:) * zwdlmtu(:, :)  
     373      zflxv(:,:) = zflxv(:,:) * zwdlmtv(:, :)  
     374      ! 
     375      CALL lbc_lnk( zflxu, 'U', -1. ) 
     376      CALL lbc_lnk( zflxv, 'V', -1. ) 
     377      ! 
     378      IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!' 
     379        
     380      !IF( ln_rnf      )   CALL sbc_rnf_div( hdivn )          ! runoffs (update hdivn field) 
     381      !IF( nn_cla == 1 )   CALL cla_div    ( kt )             ! Cross Land Advection (update hdivn field) 
     382      ! 
     383      IF( ln_timing )  CALL timing_stop('wad_lmt') 
     384      ! 
    409385   END SUBROUTINE wad_lmt_bt 
    410386 
Note: See TracChangeset for help on using the changeset viewer.