- Timestamp:
- 2017-12-13T15:58:53+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r7753 r9019 27 27 USE lib_mpp ! distribued memory computing library 28 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 USE wrk_nemo ! Memory Allocation30 29 USE timing ! Timing 31 30 … … 37 36 38 37 ! ! Parameter to control the type of lateral viscous operator 39 INTEGER, PARAMETER, PUBLIC :: np_ERROR =-10 ! error in setting the operator40 INTEGER, PARAMETER, PUBLIC :: np_no_ldf = 00 ! without operator (i.e. no lateral viscous trend)38 INTEGER, PARAMETER, PUBLIC :: np_ERROR =-10 !: error in setting the operator 39 INTEGER, PARAMETER, PUBLIC :: np_no_ldf = 00 !: without operator (i.e. no lateral viscous trend) 41 40 ! !! laplacian ! bilaplacian ! 42 INTEGER, PARAMETER, PUBLIC :: np_lap = 10 , np_blp = 20 ! iso-level operator43 INTEGER, PARAMETER, PUBLIC :: np_lap_i = 11 ! iso-neutral or geopotential operator41 INTEGER, PARAMETER, PUBLIC :: np_lap = 10 , np_blp = 20 !: iso-level operator 42 INTEGER, PARAMETER, PUBLIC :: np_lap_i = 11 !: iso-neutral or geopotential operator 44 43 45 INTEGER :: nldf !type of lateral diffusion used defined from ln_dynldf_... (namlist logicals)44 INTEGER, PUBLIC :: nldf !: type of lateral diffusion used defined from ln_dynldf_... (namlist logicals) 46 45 47 46 !! * Substitutions 48 47 # include "vectopt_loop_substitute.h90" 49 48 !!---------------------------------------------------------------------- 50 !! NEMO/OPA 3.7 , NEMO Consortium (2015)49 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 51 50 !! $Id$ 52 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 62 61 INTEGER, INTENT(in) :: kt ! ocean time-step index 63 62 ! 64 REAL(wp), POINTER, DIMENSION(:,:,:) ::ztrdu, ztrdv63 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 65 64 !!---------------------------------------------------------------------- 66 65 ! 67 IF( nn_timing == 1 )CALL timing_start('dyn_ldf')66 IF( ln_timing ) CALL timing_start('dyn_ldf') 68 67 ! 69 68 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) ) 71 70 ztrdu(:,:,:) = ua(:,:,:) 72 71 ztrdv(:,:,:) = va(:,:,:) … … 85 84 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 86 85 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 87 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv )86 DEALLOCATE ( ztrdu , ztrdv ) 88 87 ENDIF 89 88 ! ! print sum trends (used for debugging) … … 91 90 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 92 91 ! 93 IF( nn_timing == 1 )CALL timing_stop('dyn_ldf')92 IF( ln_timing ) CALL timing_stop('dyn_ldf') 94 93 ! 95 94 END SUBROUTINE dyn_ldf … … 102 101 !! ** Purpose : initializations of the horizontal ocean dynamics physics 103 102 !!---------------------------------------------------------------------- 104 INTEGER :: ioptio, ierr 103 INTEGER :: ioptio, ierr ! temporary integers 105 104 !!---------------------------------------------------------------------- 106 105 ! 107 ! ! Namelist nam_dynldf:already read in ldfdyn module106 ! !== Namelist nam_dynldf ==! already read in ldfdyn module 108 107 ! 109 IF(lwp) THEN ! Namelist print108 IF(lwp) THEN !== Namelist print ==! 110 109 WRITE(numout,*) 111 110 WRITE(numout,*) 'dyn_ldf_init : Choice of the lateral diffusive operator on dynamics' 112 111 WRITE(numout,*) '~~~~~~~~~~~~' 113 112 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 119 121 ENDIF 120 ! ! use of lateral operator or not122 ! !== use of lateral operator or not ==! 121 123 nldf = np_ERROR 122 124 ioptio = 0 123 IF( ln_dynldf_ lap ) ioptio = ioptio + 1124 IF( ln_dynldf_ blp ) ioptio = ioptio + 1125 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 operator125 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)' ) 127 129 ! 128 IF( nldf /= np_no_ldf ) THEN ! direction ==>> type of operator130 IF(.NOT.ln_dynldf_NONE ) THEN !== direction ==>> type of operator ==! 129 131 ioptio = 0 130 132 IF( ln_dynldf_lev ) ioptio = ioptio + 1 131 133 IF( ln_dynldf_hor ) ioptio = ioptio + 1 132 134 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)' ) 135 136 ! 136 ! 137 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 137 138 ierr = 0 138 IF ( ln_dynldf_lap ) THEN! laplacian operator139 IF 139 IF( ln_dynldf_lap ) THEN ! laplacian operator 140 IF( ln_zco ) THEN ! z-coordinate 140 141 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 141 142 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level = horizontal (no rotation) 142 143 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 143 144 ENDIF 144 IF ( ln_zps ) THEN! z-coordinate with partial step145 IF( ln_zps ) THEN ! z-coordinate with partial step 145 146 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level (no rotation) 146 147 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level (no rotation) 147 148 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 148 149 ENDIF 149 IF ( ln_sco ) THEN! s-coordinate150 IF( ln_sco ) THEN ! s-coordinate 150 151 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 151 152 IF ( ln_dynldf_hor ) nldf = np_lap_i ! horizontal ( rotation) … … 154 155 ENDIF 155 156 ! 156 IF( ln_dynldf_blp ) THEN 157 IF 158 IF 159 IF 160 IF 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) 161 162 ENDIF 162 IF ( ln_zps ) THEN! z-coordinate with partial step163 IF 164 IF 165 IF 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) 166 167 ENDIF 167 IF ( ln_sco ) THEN! s-coordinate168 IF 169 IF 170 IF 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) 171 172 ENDIF 172 173 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.