- Timestamp:
- 2017-12-13T15:58:53+01:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90
r7646 r9019 7 7 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 8 8 !! 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 9 10 !!---------------------------------------------------------------------- 10 11 … … 30 31 31 32 ! !* 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 34 36 LOGICAL, PUBLIC :: ln_dynadv_cen2 !: flux form - 2nd order centered scheme flag 35 37 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)37 38 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 39 45 40 46 !! * Substitutions 41 47 # include "vectopt_loop_substitute.h90" 42 48 !!---------------------------------------------------------------------- 43 !! NEMO/OPA 3.6 , NEMO Consortium (2015)49 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 44 50 !! $Id$ 45 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 53 59 !! ** Purpose : compute the ocean momentum advection trend. 54 60 !! 55 !! ** Method : - Update (ua,va) with the advection term following nadv 61 !! ** Method : - Update (ua,va) with the advection term following n_dynadv 62 !! 56 63 !! NB: in flux form advection (ln_dynadv_cen2 or ln_dynadv_ubs=T) 57 64 !! a metric term is add to the coriolis term while in vector form … … 62 69 !!---------------------------------------------------------------------- 63 70 ! 64 IF( nn_timing == 1 ) CALL timing_start('dyn_adv')71 IF( ln_timing ) CALL timing_start( 'dyn_adv' ) 65 72 ! 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) 77 81 END SELECT 78 82 ! 79 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv')83 IF( ln_timing ) CALL timing_stop( 'dyn_adv' ) 80 84 ! 81 85 END SUBROUTINE dyn_adv … … 87 91 !! 88 92 !! ** Purpose : Control the consistency between namelist options for 89 !! momentum advection formulation & scheme and set n adv93 !! momentum advection formulation & scheme and set n_dynadv 90 94 !!---------------------------------------------------------------------- 91 95 INTEGER :: ioptio, ios ! Local integer 92 96 ! 93 NAMELIST/namdyn_adv/ ln_dynadv_ vec, nn_dynkeg, ln_dynadv_cen2 , ln_dynadv_ubs, ln_dynzad_zts97 NAMELIST/namdyn_adv/ ln_dynadv_NONE, ln_dynadv_vec, nn_dynkeg, ln_dynadv_cen2, ln_dynadv_ubs 94 98 !!---------------------------------------------------------------------- 95 99 ! … … 108 112 WRITE(numout,*) '~~~~~~~~~~~~' 109 113 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_vec111 WRITE(numout,*) ' = 0 standard scheme ; =1 Hollingsworth scheme nn_dynkeg = ', nn_dynkeg112 WRITE(numout,*) ' 2nd order centred advection scheme ln_dynadv_cen2 = ', ln_dynadv_cen2113 WRITE(numout,*) ' 3rd order UBS advection scheme ln_dynadv_ubs = ', ln_dynadv_ubs114 WRITE(numout,*) ' Sub timestepping of vertical advection ln_dynzad_zts = ', ln_dynzad_zts114 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 115 119 ENDIF 116 120 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 121 126 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' ) 127 129 128 ! ! Set nadv129 IF( ln_dynadv_vec ) nadv = 0130 IF( ln_dynzad_zts ) nadv = 1131 IF( ln_dynadv_cen2 ) nadv = 2132 IF( ln_dynadv_ubs ) nadv = 3133 130 134 131 IF(lwp) THEN ! Print the choice 135 132 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 isused'138 IF( nadv == 0 .OR. nadv == 1 ) THEN133 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' 139 136 IF( nn_dynkeg == nkeg_C2 ) WRITE(numout,*) ' with Centered standard keg scheme' 140 137 IF( nn_dynkeg == nkeg_HW ) WRITE(numout,*) ' with Hollingsworth keg scheme' 141 ENDIF142 IF( nadv == 2 ) WRITE(numout,*) ' ===>> flux form : 2nd orderscheme 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 144 141 ENDIF 145 142 !
Note: See TracChangeset
for help on using the changeset viewer.