- Timestamp:
- 2011-06-27T13:18:25+02:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2011/dev_r2787_LOCEAN3_TRA_TRP/NEMOGCM/NEMO/OPA_SRC/TRA/tradmp.F90
r2715 r2789 14 14 !! 3.2 ! 2009-08 (G. Madec, C. Talandier) DOCTOR norm for namelist parameter 15 15 !! 3.3 ! 2010-06 (C. Ethe, G. Madec) merge TRA-TRC 16 !! 3.4 ! 2011-04 (G. Madec, C. Ethe) Merge of dtatem and dtasal + suppression of CPP keys 16 17 !!---------------------------------------------------------------------- 17 #if defined key_tradmp || defined key_esopa 18 !!---------------------------------------------------------------------- 19 !! 'key_tradmp' internal damping 18 20 19 !!---------------------------------------------------------------------- 21 20 !! tra_dmp_alloc : allocate tradmp arrays … … 32 31 USE zdf_oce ! ocean: vertical physics 33 32 USE phycst ! physical constants 34 USE dtatem ! data: temperature 35 USE dtasal ! data: salinity 33 USE dtatsd ! data: temperature & salinity 36 34 USE zdfmxl ! vertical physics: mixed layer depth 37 35 USE in_out_manager ! I/O manager … … 47 45 PUBLIC dtacof_zoom ! routine called by in both tradmp.F90 and trcdmp.F90 48 46 49 #if ! defined key_agrif 50 LOGICAL, PUBLIC, PARAMETER :: lk_tradmp = .TRUE. !: internal damping flag 51 #else 52 LOGICAL, PUBLIC :: lk_tradmp = .TRUE. !: internal damping flag 53 #endif 47 ! !!* Namelist namtra_dmp : T & S newtonian damping * 48 LOGICAL, PUBLIC :: ln_tradmp = .TRUE. !: internal damping flag 49 INTEGER :: nn_hdmp = -1 ! = 0/-1/'latitude' for damping over T and S 50 INTEGER :: nn_zdmp = 0 ! = 0/1/2 flag for damping in the mixed layer 51 REAL(wp) :: rn_surf = 50._wp ! surface time scale for internal damping [days] 52 REAL(wp) :: rn_bot = 360._wp ! bottom time scale for internal damping [days] 53 REAL(wp) :: rn_dep = 800._wp ! depth of transition between rn_surf and rn_bot [meters] 54 INTEGER :: nn_file = 2 ! = 1 create a damping.coeff NetCDF file 55 54 56 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: strdmp !: damping salinity trend (psu/s) 55 57 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ttrdmp !: damping temperature trend (Celcius/s) 56 58 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: resto !: restoring coeff. on T and S (s-1) 57 58 ! !!* Namelist namtra_dmp : T & S newtonian damping *59 INTEGER :: nn_hdmp = -1 ! = 0/-1/'latitude' for damping over T and S60 INTEGER :: nn_zdmp = 0 ! = 0/1/2 flag for damping in the mixed layer61 REAL(wp) :: rn_surf = 50._wp ! surface time scale for internal damping [days]62 REAL(wp) :: rn_bot = 360._wp ! bottom time scale for internal damping [days]63 REAL(wp) :: rn_dep = 800._wp ! depth of transition between rn_surf and rn_bot [meters]64 INTEGER :: nn_file = 2 ! = 1 create a damping.coeff NetCDF file65 59 66 60 !! * Substitutions … … 76 70 INTEGER FUNCTION tra_dmp_alloc() 77 71 !!---------------------------------------------------------------------- 78 !! *** FUNCTION tra_ bbl_alloc ***79 !!---------------------------------------------------------------------- 80 ALLOCATE( strdmp(jpi,jpj,jpk) , ttrdmp(jpi,jpj,jpk) 72 !! *** FUNCTION tra_dmp_alloc *** 73 !!---------------------------------------------------------------------- 74 ALLOCATE( strdmp(jpi,jpj,jpk) , ttrdmp(jpi,jpj,jpk), resto(jpi,jpj,jpk), STAT= tra_dmp_alloc ) 81 75 ! 82 76 IF( lk_mpp ) CALL mpp_sum ( tra_dmp_alloc ) 83 77 IF( tra_dmp_alloc > 0 ) CALL ctl_warn('tra_dmp_alloc: allocation of arrays failed') 78 ! 84 79 END FUNCTION tra_dmp_alloc 85 80 … … 103 98 !! ** Action : - (ta,sa) tracer trends updated with the damping trend 104 99 !!---------------------------------------------------------------------- 100 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 101 USE wrk_nemo, ONLY: zts_dta => wrk_4d_2 ! 4D workspace 102 ! 105 103 INTEGER, INTENT(in) :: kt ! ocean time-step index 106 104 !! 107 105 INTEGER :: ji, jj, jk ! dummy loop indices 108 REAL(wp) :: zta, zsa ! local scalars 109 !!---------------------------------------------------------------------- 106 REAL(wp) :: zta, zsa ! local scalars 107 !!---------------------------------------------------------------------- 108 ! 109 IF( wrk_in_use(4, 2) ) THEN 110 CALL ctl_stop('tra_dmp: requested workspace arrays unavailable') ; RETURN 111 ENDIF 112 ! !== input T-S data at kt ==! 113 CALL dta_tsd( kt, zts_dta ) ! read and interpolates T-S data at kt 110 114 ! 111 115 SELECT CASE ( nn_zdmp ) !== type of damping ==! … … 115 119 DO jj = 2, jpjm1 116 120 DO ji = fs_2, fs_jpim1 ! vector opt. 117 zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) )118 zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) )121 zta = resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) 122 zsa = resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) 119 123 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta 120 124 tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 121 strdmp(ji,jj,jk) = zsa ! save the salinitytrend (used in asmtrj)122 ttrdmp(ji,jj,jk) = zta 125 strdmp(ji,jj,jk) = zsa ! save the trend (used in asmtrj) 126 ttrdmp(ji,jj,jk) = zta 123 127 END DO 124 128 END DO … … 130 134 DO ji = fs_2, fs_jpim1 ! vector opt. 131 135 IF( avt(ji,jj,jk) <= 5.e-4_wp ) THEN 132 zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) )133 zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) )136 zta = resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) 137 zsa = resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) 134 138 ELSE 135 139 zta = 0._wp … … 149 153 DO ji = fs_2, fs_jpim1 ! vector opt. 150 154 IF( fsdept(ji,jj,jk) >= hmlp (ji,jj) ) THEN 151 zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) )152 zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) )155 zta = resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) 156 zsa = resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) 153 157 ELSE 154 158 zta = 0._wp … … 173 177 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 174 178 ! 179 IF( wrk_not_released(4, 2) ) CALL ctl_stop('tra_dmp: failed to release workspace arrays') 180 ! 175 181 END SUBROUTINE tra_dmp 176 182 … … 184 190 !! ** Method : read the nammbf namelist and check the parameters 185 191 !!---------------------------------------------------------------------- 186 NAMELIST/namtra_dmp/ nn_hdmp, nn_zdmp, rn_surf, rn_bot, rn_dep, nn_file192 NAMELIST/namtra_dmp/ ln_tradmp, nn_hdmp, nn_zdmp, rn_surf, rn_bot, rn_dep, nn_file 187 193 !!---------------------------------------------------------------------- 188 194 … … 194 200 IF(lwp) THEN ! Namelist print 195 201 WRITE(numout,*) 196 WRITE(numout,*) 'tra_dmp : T and S newtonian damping'202 WRITE(numout,*) 'tra_dmp_init : T and S newtonian damping' 197 203 WRITE(numout,*) '~~~~~~~' 198 204 WRITE(numout,*) ' Namelist namtra_dmp : set damping parameter' 199 WRITE(numout,*) ' T and S damping option nn_hdmp = ', nn_hdmp 200 WRITE(numout,*) ' mixed layer damping option nn_zdmp = ', nn_zdmp, '(zoom: forced to 0)' 201 WRITE(numout,*) ' surface time scale (days) rn_surf = ', rn_surf 202 WRITE(numout,*) ' bottom time scale (days) rn_bot = ', rn_bot 203 WRITE(numout,*) ' depth of transition (meters) rn_dep = ', rn_dep 204 WRITE(numout,*) ' create a damping.coeff file nn_file = ', nn_file 205 ENDIF 206 207 ! ! allocate tradmp arrays 208 IF( tra_dmp_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'tra_dmp_init: unable to allocate arrays' ) 209 210 SELECT CASE ( nn_hdmp ) 211 CASE ( -1 ) ; IF(lwp) WRITE(numout,*) ' tracer damping in the Med & Red seas only' 212 CASE ( 1:90 ) ; IF(lwp) WRITE(numout,*) ' tracer damping poleward of', nn_hdmp, ' degrees' 213 CASE DEFAULT 214 WRITE(ctmp1,*) ' bad flag value for nn_hdmp = ', nn_hdmp 215 CALL ctl_stop(ctmp1) 216 END SELECT 217 218 SELECT CASE ( nn_zdmp ) 219 CASE ( 0 ) ; IF(lwp) WRITE(numout,*) ' tracer damping throughout the water column' 220 CASE ( 1 ) ; IF(lwp) WRITE(numout,*) ' no tracer damping in the turbocline (avt > 5 cm2/s)' 221 CASE ( 2 ) ; IF(lwp) WRITE(numout,*) ' no tracer damping in the mixed layer' 222 CASE DEFAULT 223 WRITE(ctmp1,*) 'bad flag value for nn_zdmp = ', nn_zdmp 224 CALL ctl_stop(ctmp1) 225 END SELECT 226 227 IF( .NOT.lk_dtasal .OR. .NOT.lk_dtatem ) & 228 & CALL ctl_stop( 'no temperature and/or salinity data define key_dtatem and key_dtasal' ) 229 230 strdmp(:,:,:) = 0._wp ! internal damping salinity trend (used in asmtrj) 231 ttrdmp(:,:,:) = 0._wp 232 ! ! Damping coefficients initialization 233 IF( lzoom ) THEN ; CALL dtacof_zoom( resto ) 234 ELSE ; CALL dtacof( nn_hdmp, rn_surf, rn_bot, rn_dep, & 235 & nn_file, 'TRA' , resto ) 205 WRITE(numout,*) ' add a damping termn or not ln_tradmp = ', ln_tradmp 206 WRITE(numout,*) ' T and S damping option nn_hdmp = ', nn_hdmp 207 WRITE(numout,*) ' mixed layer damping option nn_zdmp = ', nn_zdmp, '(zoom: forced to 0)' 208 WRITE(numout,*) ' surface time scale (days) rn_surf = ', rn_surf 209 WRITE(numout,*) ' bottom time scale (days) rn_bot = ', rn_bot 210 WRITE(numout,*) ' depth of transition (meters) rn_dep = ', rn_dep 211 WRITE(numout,*) ' create a damping.coeff file nn_file = ', nn_file 212 WRITE(numout,*) 213 ENDIF 214 215 IF( ln_tradmp ) THEN ! initialization for T-S damping 216 ! 217 IF( tra_dmp_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'tra_dmp_init: unable to allocate arrays' ) 218 ! 219 SELECT CASE ( nn_hdmp ) 220 CASE ( -1 ) ; IF(lwp) WRITE(numout,*) ' tracer damping in the Med & Red seas only' 221 CASE ( 1:90 ) ; IF(lwp) WRITE(numout,*) ' tracer damping poleward of', nn_hdmp, ' degrees' 222 CASE DEFAULT 223 WRITE(ctmp1,*) ' bad flag value for nn_hdmp = ', nn_hdmp 224 CALL ctl_stop(ctmp1) 225 END SELECT 226 ! 227 SELECT CASE ( nn_zdmp ) 228 CASE ( 0 ) ; IF(lwp) WRITE(numout,*) ' tracer damping throughout the water column' 229 CASE ( 1 ) ; IF(lwp) WRITE(numout,*) ' no tracer damping in the turbocline (avt > 5 cm2/s)' 230 CASE ( 2 ) ; IF(lwp) WRITE(numout,*) ' no tracer damping in the mixed layer' 231 CASE DEFAULT 232 WRITE(ctmp1,*) 'bad flag value for nn_zdmp = ', nn_zdmp 233 CALL ctl_stop(ctmp1) 234 END SELECT 235 ! 236 IF( .NOT.ln_tsd_tradmp ) THEN 237 CALL ctl_warn( 'tra_dmp_init: read T-S data not initialized, we force ln_tsd_tradmp=T' ) 238 CALL dta_tsd_init( ld_tradmp=ln_tradmp ) ! forces the initialisation of T-S data 239 ENDIF 240 ! 241 strdmp(:,:,:) = 0._wp ! internal damping salinity trend (used in asmtrj) 242 ttrdmp(:,:,:) = 0._wp 243 ! ! Damping coefficients initialization 244 IF( lzoom ) THEN ; CALL dtacof_zoom( resto ) 245 ELSE ; CALL dtacof( nn_hdmp, rn_surf, rn_bot, rn_dep, nn_file, 'TRA', resto ) 246 ENDIF 247 ! 236 248 ENDIF 237 249 ! … … 347 359 !!---------------------------------------------------------------------- 348 360 349 IF( wrk_in_use(1, 1) .OR. & 350 wrk_in_use(2, 1) .OR. & 351 wrk_in_use(3, 1) ) THEN 361 IF( wrk_in_use(1, 1) .OR. wrk_in_use(2, 1) .OR. wrk_in_use(3, 1) ) THEN 352 362 CALL ctl_stop('dtacof: requested workspace arrays unavailable') ; RETURN 353 363 ENDIF … … 529 539 ELSE ! No damping ! 530 540 ! !--------------------! 531 CALL ctl_stop( 'Choose a correct value of nn_hdmp or DO NOT defined key_tradmp' )541 CALL ctl_stop( 'Choose a correct value of nn_hdmp or put ln_tradmp to FALSE' ) 532 542 ENDIF 533 543 … … 544 554 ENDIF 545 555 ! 546 IF( wrk_not_released(1, 1) .OR. & 547 wrk_not_released(2, 1) .OR. & 548 wrk_not_released(3, 1) ) CALL ctl_stop('dtacof: failed to release workspace arrays') 556 IF( wrk_not_released(1, 1) .OR. wrk_not_released(2, 1) .OR. wrk_not_released(3, 1) ) & 557 & CALL ctl_stop('dtacof: failed to release workspace arrays') 549 558 ! 550 559 END SUBROUTINE dtacof … … 572 581 !!---------------------------------------------------------------------- 573 582 USE ioipsl ! IOipsl librairy 574 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 575 USE wrk_nemo, ONLY: zxt => wrk_2d_1 , zyt => wrk_2d_2 , zzt => wrk_2d_3, zmask => wrk_2d_4 583 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 584 USE wrk_nemo, ONLY: zxt => wrk_2d_1, zyt => wrk_2d_2 585 USE wrk_nemo, ONLY: zzt => wrk_2d_3, zmask => wrk_2d_4 576 586 !! 577 587 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) :: pdct ! distance to the coastline … … 585 595 !!---------------------------------------------------------------------- 586 596 587 IF( wrk_in_use(2, 1,2,3,4) .OR. & 588 wrk_in_use(1, 1,2,3,4) ) THEN 597 IF( wrk_in_use(2, 1,2,3,4) ) THEN 589 598 CALL ctl_stop('cofdis: requested workspace arrays unavailable') ; RETURN 590 599 ENDIF … … 745 754 CALL restclo( icot ) 746 755 ! 747 IF( wrk_not_released(2, 1,2,3,4) .OR. & 748 wrk_not_released(1, 1,2,3,4) ) CALL ctl_stop('cofdis: failed to release workspace arrays') 749 DEALLOCATE( llcotu , llcotv , llcotf , & 750 & zxc , zyc , zzc , zdis ) 756 IF( wrk_not_released(2, 1,2,3,4) ) CALL ctl_stop('cofdis: failed to release workspace arrays') 757 DEALLOCATE( llcotu, llcotv, llcotf, zyc, zzc, zdis ) 751 758 ! 752 759 END SUBROUTINE cofdis 753 754 #else755 !!----------------------------------------------------------------------756 !! Default key NO internal damping757 !!----------------------------------------------------------------------758 LOGICAL , PUBLIC, PARAMETER :: lk_tradmp = .FALSE. !: internal damping flag759 CONTAINS760 SUBROUTINE tra_dmp( kt ) ! Empty routine761 WRITE(*,*) 'tra_dmp: You should not have seen this print! error?', kt762 END SUBROUTINE tra_dmp763 SUBROUTINE tra_dmp_init ! Empty routine764 END SUBROUTINE tra_dmp_init765 #endif766 767 760 !!====================================================================== 768 761 END MODULE tradmp
Note: See TracChangeset
for help on using the changeset viewer.