Changeset 2528 for trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90
- Timestamp:
- 2010-12-27T18:33:53+01:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90
- Property svn:eol-style deleted
- Property svn:executable deleted
r1601 r2528 4 4 !! Ocean Active tracers : lateral diffusive trends 5 5 !!===================================================================== 6 !! History : 9.0 ! 05-11 (G. Madec) Original code 7 !!---------------------------------------------------------------------- 8 9 !!---------------------------------------------------------------------- 10 !! tra_ldf : update the tracer trend with the lateral diffusion 11 !! ldf_ctl : initialization, namelist read, and parameters control 12 !! ldf_ano : compute lateral diffusion for constant T-S profiles 6 !! History : 9.0 ! 2005-11 (G. Madec) Original code 7 !! NEMO 3.0 ! 2008-01 (C. Ethe, G. Madec) merge TRC-TRA 8 !!---------------------------------------------------------------------- 9 10 !!---------------------------------------------------------------------- 11 !! tra_ldf : update the tracer trend with the lateral diffusion 12 !! tra_ldf_init : initialization, namelist read, and parameters control 13 !! ldf_ano : compute lateral diffusion for constant T-S profiles 13 14 !!---------------------------------------------------------------------- 14 15 USE oce ! ocean dynamics and tracers … … 20 21 USE traldf_bilap ! lateral mixing (tra_ldf_bilap routine) 21 22 USE traldf_iso ! lateral mixing (tra_ldf_iso routine) 23 USE traldf_iso_grif ! lateral mixing (tra_ldf_iso_grif routine) 22 24 USE traldf_lap ! lateral mixing (tra_ldf_lap routine) 23 USE trdmod ! ocean active tracers trends24 USE trd mod_oce ! ocean variables trends25 USE trdmod_oce ! ocean space and time domain 26 USE trdtra ! ocean active tracers trends 25 27 USE prtctl ! Print control 26 28 USE in_out_manager ! I/O manager … … 31 33 PRIVATE 32 34 33 PUBLIC tra_ldf ! called by step.F9034 35 INTEGER, PUBLIC :: nldf = 0 ! type of lateral diffusion used defined from ln_traldf_... namlist logicals)36 ! (need to be public to be used in vertical diffusion routine)35 PUBLIC tra_ldf ! called by step.F90 36 PUBLIC tra_ldf_init ! called by opa.F90 37 ! 38 INTEGER :: nldf = 0 ! type of lateral diffusion used defined from ln_traldf_... namlist logicals) 37 39 #if defined key_traldf_ano 38 REAL, DIMENSION(jpi,jpj,jpk) :: t0_ldf, s0_ldf ! lateral diffusion trends of T & S 39 ! ! for a constant vertical profile 40 REAL, DIMENSION(jpi,jpj,jpk) :: t0_ldf, s0_ldf ! lateral diffusion trends of T & S for a constant profile 40 41 #endif 41 42 … … 44 45 # include "vectopt_loop_substitute.h90" 45 46 !!---------------------------------------------------------------------- 46 !! OPA 9.0 , LOCEAN-IPSL (2006)47 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 47 48 !! $Id$ 48 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 49 !!---------------------------------------------------------------------- 50 49 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 50 !!---------------------------------------------------------------------- 51 51 CONTAINS 52 52 … … 56 56 !! 57 57 !! ** Purpose : compute the lateral ocean tracer physics. 58 !!59 58 !!---------------------------------------------------------------------- 60 59 INTEGER, INTENT( in ) :: kt ! ocean time-step index 61 60 !! 62 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdt, ztrds ! 3D temporary workspace 63 !!---------------------------------------------------------------------- 64 65 IF( kt == nit000 ) CALL ldf_ctl ! initialisation & control of options 66 67 IF( l_trdtra ) THEN ! temporary save of ta and sa trends 68 ztrdt(:,:,:) = ta(:,:,:) 69 ztrds(:,:,:) = sa(:,:,:) 61 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 62 !!---------------------------------------------------------------------- 63 64 IF( l_trdtra ) THEN !* Save ta and sa trends 65 ALLOCATE( ztrdt(jpi,jpj,jpk) ) ; ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 66 ALLOCATE( ztrds(jpi,jpj,jpk) ) ; ztrds(:,:,:) = tsa(:,:,:,jp_sal) 70 67 ENDIF 71 68 72 69 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend 73 CASE ( 0 ) ; CALL tra_ldf_lap ( kt ) ! iso-level laplacian 74 CASE ( 1 ) ; CALL tra_ldf_iso ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 75 CASE ( 2 ) ; CALL tra_ldf_bilap ( kt ) ! iso-level bilaplacian 76 CASE ( 3 ) ; CALL tra_ldf_bilapg( kt ) ! s-coord. horizontal bilaplacian 70 CASE ( 0 ) ; CALL tra_ldf_lap ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts ) ! iso-level laplacian 71 CASE ( 1 ) ! rotated laplacian 72 IF( ln_traldf_grif ) THEN 73 CALL tra_ldf_iso_grif( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 ) ! Griffies operator 74 ELSE 75 CALL tra_ldf_iso ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 ) ! Madec operator 76 ENDIF 77 CASE ( 2 ) ; CALL tra_ldf_bilap ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts ) ! iso-level bilaplacian 78 CASE ( 3 ) ; CALL tra_ldf_bilapg ( kt, 'TRA', tsb, tsa, jpts ) ! s-coord. geopot. bilap. 77 79 ! 78 CASE ( -1 ) ! esopa: test all possibility with control print 79 CALL tra_ldf_lap ( kt ) 80 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf0 - Ta: ', mask1=tmask, & 81 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 82 CALL tra_ldf_iso ( kt ) 83 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf1 - Ta: ', mask1=tmask, & 84 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 85 CALL tra_ldf_bilap ( kt ) 86 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf2 - Ta: ', mask1=tmask, & 87 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 88 CALL tra_ldf_bilapg ( kt ) 89 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf3 - Ta: ', mask1=tmask, & 90 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 80 CASE ( -1 ) ! esopa: test all possibility with control print 81 CALL tra_ldf_lap ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts ) 82 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf0 - Ta: ', mask1=tmask, & 83 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 84 IF( ln_traldf_grif ) THEN 85 CALL tra_ldf_iso_grif( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 ) 86 ELSE 87 CALL tra_ldf_iso ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 ) 88 ENDIF 89 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf1 - Ta: ', mask1=tmask, & 90 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 91 CALL tra_ldf_bilap ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts ) 92 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf2 - Ta: ', mask1=tmask, & 93 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 94 CALL tra_ldf_bilapg( kt, 'TRA', tsb, tsa, jpts ) 95 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf3 - Ta: ', mask1=tmask, & 96 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 91 97 END SELECT 92 98 93 99 #if defined key_traldf_ano 94 t a(:,:,:) = ta(:,:,:) - t0_ldf(:,:,:) ! anomaly: substract the reference diffusivity95 sa(:,:,:) = sa(:,:,:) - s0_ldf(:,:,:)100 tsa(:,:,:,jp_tem) = tsa(:,:,:,jp_tem) - t0_ldf(:,:,:) ! anomaly: substract the reference diffusivity 101 tsa(:,:,:,jp_sal) = tsa(:,:,:,jp_sal) - s0_ldf(:,:,:) 96 102 #endif 103 97 104 IF( l_trdtra ) THEN ! save the horizontal diffusive trends for further diagnostics 98 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 99 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 100 CALL trd_mod( ztrdt, ztrds, jptra_trd_ldf, 'TRA', kt ) 105 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 106 ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:) 107 CALL trd_tra( kt, 'TRA', jp_tem, jptra_trd_ldf, ztrdt ) 108 CALL trd_tra( kt, 'TRA', jp_sal, jptra_trd_ldf, ztrds ) 109 DEALLOCATE( ztrdt ) ; DEALLOCATE( ztrds ) 101 110 ENDIF 102 111 ! ! print mean trends (used for debugging) 103 IF(ln_ctl) CALL prt_ctl( tab3d_1=t a, clinfo1=' ldf - Ta: ', mask1=tmask, &104 & tab3d_2= sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' )112 IF(ln_ctl) CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf - Ta: ', mask1=tmask, & 113 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 105 114 ! 106 115 END SUBROUTINE tra_ldf 107 116 108 117 109 SUBROUTINE ldf_ctl110 !!---------------------------------------------------------------------- 111 !! *** ROUTINE ldf_ctl***118 SUBROUTINE tra_ldf_init 119 !!---------------------------------------------------------------------- 120 !! *** ROUTINE tra_ldf_init *** 112 121 !! 113 122 !! ** Purpose : Choice of the operator for the lateral tracer diffusion … … 122 131 INTEGER :: ioptio, ierr ! temporary integers 123 132 ! 124 ! NAMELIST/namtra_ldf/ ln_traldf_lap , ln_traldf_bilap, &125 ! & ln_traldf_level, ln_traldf_hor , ln_traldf_iso, &126 ! & rn_aht_0 , rn_ahtb_0 , rn_aeiv_0127 133 !!---------------------------------------------------------------------- 128 134 … … 130 136 ! =============================================== 131 137 132 ! REWIND( numnam ) ! Namelist namtra_ldf already read in ldftra module133 ! READ ( numnam, namtra_ldf )134 135 138 IF(lwp) THEN ! Namelist print 136 139 WRITE(numout,*) 137 WRITE(numout,*) 'tra :ldf_ctl: lateral tracer diffusive operator'140 WRITE(numout,*) 'tra_ldf_init : lateral tracer diffusive operator' 138 141 WRITE(numout,*) '~~~~~~~~~~~' 139 WRITE(numout,*) ' Namelist namtra_ldf : set lateral mixing parameters (type, direction, coefficients)' 140 WRITE(numout,*) ' laplacian operator ln_traldf_lap = ', ln_traldf_lap 141 WRITE(numout,*) ' bilaplacian operator ln_traldf_bilap = ', ln_traldf_bilap 142 WRITE(numout,*) ' iso-level ln_traldf_level = ', ln_traldf_level 143 WRITE(numout,*) ' horizontal (geopotential) ln_traldf_hor = ', ln_traldf_hor 144 WRITE(numout,*) ' iso-neutral ln_traldf_iso = ', ln_traldf_iso 142 WRITE(numout,*) ' Namelist namtra_ldf already read in ldftra module' 143 WRITE(numout,*) ' see ldf_tra_init report for lateral mixing parameters' 144 WRITE(numout,*) 145 145 ENDIF 146 146 … … 225 225 CALL ldf_ano 226 226 ! 227 END SUBROUTINE ldf_ctl227 END SUBROUTINE tra_ldf_init 228 228 229 229 #if defined key_traldf_ano … … 271 271 t0_ldf(:,:,:) = 0.e0 272 272 s0_ldf(:,:,:) = 0.e0 273 ztb (:,:,:) = t b (:,:,:)274 zsb (:,:,:) = sb (:,:,:)275 ua (:,:,:) = t a (:,:,:)276 va (:,:,:) = sa (:,:,:)273 ztb (:,:,:) = tsb (:,:,:,jp_tem) 274 zsb (:,:,:) = tsb (:,:,:,jp_sal) 275 ua (:,:,:) = tsa (:,:,:,jp_tem) 276 va (:,:,:) = tsa (:,:,:,jp_sal) 277 277 zavt (:,:,:) = avt(:,:,:) 278 278 IF( lk_zdfddm ) THEN CALL ctl_stop( ' key_traldf_ano with key_zdfddm not implemented' ) 279 279 ! set tb, sb to reference values and avr to zero 280 t b (:,:,:) = zt_ref(:,:,:)281 sb (:,:,:) = zs_ref(:,:,:)282 t a (:,:,:) = 0.e0283 sa (:,:,:) = 0.e0284 avt(:,:,:) = 0.e0280 tsb (:,:,:,jp_tem) = zt_ref(:,:,:) 281 tsb (:,:,:,jp_sal) = zs_ref(:,:,:) 282 tsa (:,:,:,jp_tem) = 0.e0 283 tsa (:,:,:,jp_sal) = 0.e0 284 avt(:,:,:) = 0.e0 285 285 286 286 ! Compute the ldf trends … … 295 295 IF( neuler == 1) z12 = 1.e0 296 296 IF( ln_zdfexp ) THEN ! ta,sa are the trends 297 t0_ldf(:,:,:) = t a(:,:,:)298 s0_ldf(:,:,:) = sa(:,:,:)297 t0_ldf(:,:,:) = tsa(:,:,:,jp_tem) 298 s0_ldf(:,:,:) = tsa(:,:,:,jp_sal) 299 299 ELSE 300 300 DO jk = 1, jpkm1 301 t0_ldf(:,:,jk) = ( t a(:,:,jk) - tb(:,:,jk) ) / ( z12 *rdttra(jk) )302 s0_ldf(:,:,jk) = ( sa(:,:,jk) - tb(:,:,jk) ) / ( z12 *rdttra(jk) )301 t0_ldf(:,:,jk) = ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / ( z12 *rdttra(jk) ) 302 s0_ldf(:,:,jk) = ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / ( z12 *rdttra(jk) ) 303 303 END DO 304 304 ENDIF 305 t b (:,:,:) = ztb (:,:,:)306 sb (:,:,:) = zsb (:,:,:)307 t a (:,:,:) = ua (:,:,:)308 sa (:,:,:) = va (:,:,:)309 avt (:,:,:)= zavt(:,:,:)305 tsb(:,:,:,jp_tem) = ztb (:,:,:) 306 tsb(:,:,:,jp_sal) = zsb (:,:,:) 307 tsa(:,:,:,jp_tem) = ua (:,:,:) 308 tsa(:,:,:,jp_sal) = va (:,:,:) 309 avt(:,:,:) = zavt(:,:,:) 310 310 ! 311 311 END SUBROUTINE ldf_ano
Note: See TracChangeset
for help on using the changeset viewer.