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 5836 for trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90 – NEMO

Ignore:
Timestamp:
2015-10-26T15:49:40+01:00 (8 years ago)
Author:
cetlod
Message:

merge the simplification branch onto the trunk, see ticket #1612

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90

    r4990 r5836  
    44   !! Ocean physics:  lateral diffusivity trends  
    55   !!===================================================================== 
    6    !! History :  9.0  !  05-11  (G. Madec)  Original code (new step architecture) 
     6   !! History :  2.0  ! 2005-11  (G. Madec)  Original code (new step architecture) 
     7   !!            3.7  ! 2014-01  (F. Lemarie, G. Madec)  restructuration/simplification of ahm specification, 
     8   !!                 !                                  add velocity dependent coefficient and optional read in file 
    79   !!---------------------------------------------------------------------- 
    810 
     
    1416   USE dom_oce        ! ocean space and time domain 
    1517   USE phycst         ! physical constants 
    16    USE ldfdyn_oce     ! ocean dynamics lateral physics 
    17    USE ldftra_oce     ! ocean tracers  lateral physics 
    18    USE ldfslp         ! lateral mixing: slopes of mixing orientation 
    19    USE dynldf_bilapg  ! lateral mixing            (dyn_ldf_bilapg routine) 
    20    USE dynldf_bilap   ! lateral mixing            (dyn_ldf_bilap  routine) 
    21    USE dynldf_iso     ! lateral mixing            (dyn_ldf_iso    routine) 
    22    USE dynldf_lap     ! lateral mixing            (dyn_ldf_lap    routine) 
     18   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. 
     19   USE ldfslp         ! lateral diffusion: slopes of mixing orientation 
     20   USE dynldf_lap_blp ! lateral mixing   (dyn_ldf_lap & dyn_ldf_blp routines) 
     21   USE dynldf_iso     ! lateral mixing                 (dyn_ldf_iso routine ) 
    2322   USE trd_oce        ! trends: ocean variables 
    24    USE trddyn         ! trend manager: dynamics   (trd_dyn        routine) 
     23   USE trddyn         ! trend manager: dynamics   (trd_dyn      routine) 
    2524   ! 
    2625   USE prtctl         ! Print control 
     
    2827   USE lib_mpp        ! distribued memory computing library 
    2928   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    30    USE wrk_nemo        ! Memory Allocation 
    31    USE timing          ! Timing 
     29   USE wrk_nemo       ! Memory Allocation 
     30   USE timing         ! Timing 
    3231 
    3332   IMPLICIT NONE 
     
    3736   PUBLIC   dyn_ldf_init  ! called by opa  module  
    3837 
    39    INTEGER ::   nldf = -2   ! type of lateral diffusion used defined from ln_dynldf_... namlist logicals) 
     38   !                      ! Flag to control the type of lateral viscous operator 
     39   INTEGER, PARAMETER, PUBLIC ::   np_ERROR  =-10   ! error in setting the operator 
     40   INTEGER, PARAMETER, PUBLIC ::   np_no_ldf = 00   ! without operator (i.e. no lateral viscous trend) 
     41   !                          !!      laplacian     !    bilaplacian    ! 
     42   INTEGER, PARAMETER, PUBLIC ::   np_lap    = 10   ,   np_blp    = 20  ! iso-level operator 
     43   INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11                       ! iso-neutral or geopotential operator 
     44 
     45   INTEGER ::   nldf   ! type of lateral diffusion used defined from ln_dynldf_... (namlist logicals) 
    4046 
    4147   !! * Substitutions 
     
    4349#  include "vectopt_loop_substitute.h90" 
    4450   !!---------------------------------------------------------------------- 
    45    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     51   !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
    4652   !! $Id$ 
    4753   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6268      IF( nn_timing == 1 )  CALL timing_start('dyn_ldf') 
    6369      ! 
    64       IF( l_trddyn )   THEN                      ! temporary save of ta and sa trends 
    65          CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
     70      IF( l_trddyn )   THEN                      ! temporary save of momentum trends 
     71         CALL wrk_alloc( jpi,jpj,jpk,  ztrdu, ztrdv ) 
    6672         ztrdu(:,:,:) = ua(:,:,:)  
    6773         ztrdv(:,:,:) = va(:,:,:)  
     
    7076      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend 
    7177      ! 
    72       CASE ( 0 )    ;   CALL dyn_ldf_lap    ( kt )      ! iso-level laplacian 
    73       CASE ( 1 )    ;   CALL dyn_ldf_iso    ( kt )      ! rotated laplacian (except dk[ dk[.] ] part) 
    74       CASE ( 2 )    ;   CALL dyn_ldf_bilap  ( kt )      ! iso-level bilaplacian 
    75       CASE ( 3 )    ;   CALL dyn_ldf_bilapg ( kt )      ! s-coord. horizontal bilaplacian 
    76       CASE ( 4 )                                        ! iso-level laplacian + bilaplacian 
    77          CALL dyn_ldf_lap    ( kt ) 
    78          CALL dyn_ldf_bilap  ( kt ) 
    79       CASE ( 5 )                                        ! rotated laplacian + bilaplacian (s-coord) 
    80          CALL dyn_ldf_iso    ( kt ) 
    81          CALL dyn_ldf_bilapg ( kt ) 
     78      CASE ( np_lap   )    ;   CALL dyn_ldf_lap  ( kt, ub, vb, ua, va, 1 )      ! iso-level    laplacian 
     79      CASE ( np_lap_i )    ;   CALL dyn_ldf_iso  ( kt )                         ! rotated      laplacian 
     80      CASE ( np_blp   )    ;   CALL dyn_ldf_blp  ( kt, ub, vb, ua, va    )      ! iso-level bi-laplacian 
    8281      ! 
    83       CASE ( -1 )                                       ! esopa: test all possibility with control print 
    84                         CALL dyn_ldf_lap    ( kt ) 
    85                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask,   & 
    86             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    87                         CALL dyn_ldf_iso    ( kt ) 
    88                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask,   & 
    89             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    90                         CALL dyn_ldf_bilap  ( kt ) 
    91                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask,   & 
    92             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    93                         CALL dyn_ldf_bilapg ( kt ) 
    94                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask,   & 
    95             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    96       ! 
    97       CASE ( -2 )                                       ! neither laplacian nor bilaplacian schemes used 
    98          IF( kt == nit000 ) THEN 
    99             IF(lwp) WRITE(numout,*) 
    100             IF(lwp) WRITE(numout,*) 'dyn_ldf : no lateral diffusion on momentum setup' 
    101             IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    102          ENDIF 
    10382      END SELECT 
    10483 
     
    10786         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    10887         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 
    109          CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
     88         CALL wrk_dealloc( jpi,jpj,jpk,  ztrdu, ztrdv ) 
    11089      ENDIF 
    11190      !                                          ! print sum trends (used for debugging) 
     
    126105      INTEGER ::   ioptio, ierr         ! temporary integers  
    127106      !!---------------------------------------------------------------------- 
    128      
     107      ! 
    129108      !                                   ! Namelist nam_dynldf: already read in ldfdyn module 
    130  
     109      ! 
    131110      IF(lwp) THEN                        ! Namelist print 
    132111         WRITE(numout,*) 
     
    134113         WRITE(numout,*) '~~~~~~~~~~~' 
    135114         WRITE(numout,*) '       Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 
    136          WRITE(numout,*) '          laplacian operator          ln_dynldf_lap   = ', ln_dynldf_lap 
    137          WRITE(numout,*) '          bilaplacian operator        ln_dynldf_bilap = ', ln_dynldf_bilap 
    138          WRITE(numout,*) '          iso-level                   ln_dynldf_level = ', ln_dynldf_level 
    139          WRITE(numout,*) '          horizontal (geopotential)   ln_dynldf_hor   = ', ln_dynldf_hor 
    140          WRITE(numout,*) '          iso-neutral                 ln_dynldf_iso   = ', ln_dynldf_iso 
     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,*) '          iso-level                   ln_dynldf_lev = ', ln_dynldf_lev 
     118         WRITE(numout,*) '          horizontal (geopotential)   ln_dynldf_hor = ', ln_dynldf_hor 
     119         WRITE(numout,*) '          iso-neutral                 ln_dynldf_iso = ', ln_dynldf_iso 
    141120      ENDIF 
    142  
    143       !                                   ! control the consistency 
     121      !                                   ! use of lateral operator or not 
     122      nldf = np_ERROR 
    144123      ioptio = 0 
    145       IF( ln_dynldf_lap   )   ioptio = ioptio + 1 
    146       IF( ln_dynldf_bilap )   ioptio = ioptio + 1 
    147       IF( ioptio <  1 ) CALL ctl_warn( '          neither laplacian nor bilaplacian operator set for dynamics' ) 
    148       ioptio = 0 
    149       IF( ln_dynldf_level )   ioptio = ioptio + 1 
    150       IF( ln_dynldf_hor   )   ioptio = ioptio + 1 
    151       IF( ln_dynldf_iso   )   ioptio = ioptio + 1 
    152       IF( ioptio >  1 ) CALL ctl_stop( '          use only ONE direction (level/hor/iso)' ) 
    153  
    154       IF( ln_dynldf_iso .AND. ln_traldf_hor ) CALL ctl_stop & 
    155       &   ( 'Not sensible to use geopotential diffusion for tracers with isoneutral diffusion for dynamics' ) 
    156  
    157       !                                   ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 
    158       ierr = 0 
    159       IF ( ln_dynldf_lap ) THEN      ! laplacian operator 
    160          IF ( ln_zco ) THEN                ! z-coordinate 
    161             IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation) 
    162             IF ( ln_dynldf_hor   )   nldf = 0      ! horizontal (no rotation) 
    163             IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
     124      IF( ln_dynldf_lap )   ioptio = ioptio + 1 
     125      IF( ln_dynldf_blp )   ioptio = ioptio + 1 
     126      IF( ioptio >  1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' ) 
     127      IF( ioptio == 0   )   nldf = np_no_ldf     ! No lateral mixing operator 
     128      ! 
     129      IF( nldf /= np_no_ldf ) THEN        ! direction ==>> type of operator   
     130         ioptio = 0 
     131         IF( ln_dynldf_lev )   ioptio = ioptio + 1 
     132         IF( ln_dynldf_hor )   ioptio = ioptio + 1 
     133         IF( ln_dynldf_iso )   ioptio = ioptio + 1 
     134         IF( ioptio >  1   )   CALL ctl_stop( '          use only ONE direction (level/hor/iso)' ) 
     135         IF( ioptio == 0   )   CALL ctl_stop( '          use at least ONE direction (level/hor/iso)' ) 
     136         ! 
     137         !                                   ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 
     138         ierr = 0 
     139         IF ( ln_dynldf_lap ) THEN      ! laplacian operator 
     140            IF ( ln_zco ) THEN                ! z-coordinate 
     141               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
     142               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
     143               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
     144            ENDIF 
     145            IF ( ln_zps ) THEN             ! z-coordinate with partial step 
     146               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level              (no rotation) 
     147               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level              (no rotation) 
     148               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
     149            ENDIF 
     150            IF ( ln_sco ) THEN             ! s-coordinate 
     151               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
     152               IF ( ln_dynldf_hor )   nldf = np_lap_i   ! horizontal             (   rotation) 
     153               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
     154            ENDIF 
    164155         ENDIF 
    165          IF ( ln_zps ) THEN             ! z-coordinate 
    166             IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed 
    167             IF ( ln_dynldf_hor   )   nldf = 0      ! horizontal (no rotation) 
    168             IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
     156         ! 
     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) 
     162            ENDIF 
     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) 
     167            ENDIF 
     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) 
     172            ENDIF 
    169173         ENDIF 
    170          IF ( ln_sco ) THEN             ! s-coordinate 
    171             IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation) 
    172             IF ( ln_dynldf_hor   )   nldf = 1      ! horizontal (   rotation) 
    173             IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
    174          ENDIF 
    175       ENDIF 
    176  
    177       IF( ln_dynldf_bilap ) THEN      ! bilaplacian operator 
    178          IF ( ln_zco ) THEN                ! z-coordinate 
    179             IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation) 
    180             IF ( ln_dynldf_hor   )   nldf = 2      ! horizontal (no rotation) 
    181             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    182          ENDIF 
    183          IF ( ln_zps ) THEN             ! z-coordinate 
    184             IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed  
    185             IF ( ln_dynldf_hor   )   nldf = 2      ! horizontal (no rotation) 
    186             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    187          ENDIF 
    188          IF ( ln_sco ) THEN             ! s-coordinate 
    189             IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation) 
    190             IF ( ln_dynldf_hor   )   nldf = 3      ! horizontal (   rotation) 
    191             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    192          ENDIF 
    193       ENDIF 
    194        
    195       IF( ln_dynldf_lap .AND. ln_dynldf_bilap ) THEN  ! mixed laplacian and bilaplacian operators 
    196          IF ( ln_zco ) THEN                ! z-coordinate 
    197             IF ( ln_dynldf_level )   nldf = 4      ! iso-level  (no rotation) 
    198             IF ( ln_dynldf_hor   )   nldf = 4      ! horizontal (no rotation) 
    199             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    200          ENDIF 
    201          IF ( ln_zps ) THEN             ! z-coordinate 
    202             IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed  
    203             IF ( ln_dynldf_hor   )   nldf = 4      ! horizontal (no rotation) 
    204             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    205          ENDIF 
    206          IF ( ln_sco ) THEN             ! s-coordinate 
    207             IF ( ln_dynldf_level )   nldf = 4      ! iso-level  (no rotation) 
    208             IF ( ln_dynldf_hor   )   nldf = 5      ! horizontal (   rotation) 
    209             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    210          ENDIF 
    211       ENDIF 
    212  
    213       IF( lk_esopa )                 nldf = -1     ! esopa test 
    214  
    215       IF( ierr == 1 )   CALL ctl_stop( 'iso-level in z-coordinate - partial step, not allowed' ) 
    216       IF( ierr == 2 )   CALL ctl_stop( 'isoneutral bilaplacian operator does not exist' ) 
    217       IF( nldf == 1 .OR. nldf == 3 ) THEN      ! rotation 
    218          IF( .NOT.lk_ldfslp )   CALL ctl_stop( 'the rotation of the diffusive tensor require key_ldfslp' ) 
     174         ! 
     175         IF( ierr == 2 )   CALL ctl_stop( 'rotated bi-laplacian operator does not exist' ) 
     176         ! 
     177         IF( nldf == np_lap_i )   l_ldfslp = .TRUE.      ! rotation require the computation of the slopes 
     178         ! 
    219179      ENDIF 
    220180 
    221181      IF(lwp) THEN 
    222182         WRITE(numout,*) 
    223          IF( nldf == -2 )   WRITE(numout,*) '              neither laplacian nor bilaplacian schemes used' 
    224          IF( nldf == -1 )   WRITE(numout,*) '              ESOPA test All scheme used' 
    225          IF( nldf ==  0 )   WRITE(numout,*) '              laplacian operator' 
    226          IF( nldf ==  1 )   WRITE(numout,*) '              rotated laplacian operator' 
    227          IF( nldf ==  2 )   WRITE(numout,*) '              bilaplacian operator' 
    228          IF( nldf ==  3 )   WRITE(numout,*) '              rotated bilaplacian' 
    229          IF( nldf ==  4 )   WRITE(numout,*) '              laplacian and bilaplacian operators' 
    230          IF( nldf ==  5 )   WRITE(numout,*) '              rotated laplacian and bilaplacian operators' 
     183         IF( nldf == np_no_ldf )   WRITE(numout,*) '              NO lateral viscosity' 
     184         IF( nldf == np_lap    )   WRITE(numout,*) '              iso-level laplacian operator' 
     185         IF( nldf == np_lap_i  )   WRITE(numout,*) '              rotated laplacian operator with iso-level background' 
     186         IF( nldf == np_blp    )   WRITE(numout,*) '              iso-level bi-laplacian operator' 
    231187      ENDIF 
    232188      ! 
Note: See TracChangeset for help on using the changeset viewer.