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 9019 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90 – NEMO

Ignore:
Timestamp:
2017-12-13T15:58:53+01:00 (6 years ago)
Author:
timgraham
Message:

Merge of dev_CNRS_2017 into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90

    r7646 r9019  
    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      ! 
Note: See TracChangeset for help on using the changeset viewer.