Changeset 12377 for NEMO/trunk/src/OCE/DIA/diahsb.F90
- Timestamp:
- 2020-02-12T15:39:06+01:00 (4 years ago)
- Location:
- NEMO/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEAD ext/AGRIF5 ^/vendors/AGRIF/dev_r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL
-
- Property svn:externals
-
NEMO/trunk/src/OCE/DIA/diahsb.F90
r11536 r12377 17 17 USE phycst ! physical constants 18 18 USE sbc_oce ! surface thermohaline fluxes 19 USE isf_oce ! ice shelf fluxes 19 20 USE sbcrnf ! river runoff 20 USE sbcisf ! ice shelves21 21 USE domvvl ! vertical scale factors 22 22 USE traqsr ! penetrative solar radiation … … 48 48 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: ssh_hc_loc_ini, ssh_sc_loc_ini ! 49 49 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: hc_loc_ini, sc_loc_ini, e3t_ini ! 50 51 !! * Substitutions 52 # include "vectopt_loop_substitute.h90" 50 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: tmask_ini 51 53 52 !!---------------------------------------------------------------------- 54 53 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 58 57 CONTAINS 59 58 60 SUBROUTINE dia_hsb( kt )59 SUBROUTINE dia_hsb( kt, Kbb, Kmm ) 61 60 !!--------------------------------------------------------------------------- 62 61 !! *** ROUTINE dia_hsb *** … … 69 68 !! 70 69 !!--------------------------------------------------------------------------- 71 INTEGER, INTENT(in) :: kt ! ocean time-step index 70 INTEGER, INTENT(in) :: kt ! ocean time-step index 71 INTEGER, INTENT(in) :: Kbb, Kmm ! ocean time level indices 72 72 ! 73 73 INTEGER :: ji, jj, jk ! dummy loop indice … … 86 86 IF( ln_timing ) CALL timing_start('dia_hsb') 87 87 ! 88 ts n(:,:,:,1) = tsn(:,:,:,1) * tmask(:,:,:) ; tsb(:,:,:,1) = tsb(:,:,:,1) * tmask(:,:,:) ;89 ts n(:,:,:,2) = tsn(:,:,:,2) * tmask(:,:,:) ; tsb(:,:,:,2) = tsb(:,:,:,2) * tmask(:,:,:) ;88 ts(:,:,:,1,Kmm) = ts(:,:,:,1,Kmm) * tmask(:,:,:) ; ts(:,:,:,1,Kbb) = ts(:,:,:,1,Kbb) * tmask(:,:,:) ; 89 ts(:,:,:,2,Kmm) = ts(:,:,:,2,Kmm) * tmask(:,:,:) ; ts(:,:,:,2,Kbb) = ts(:,:,:,2,Kbb) * tmask(:,:,:) ; 90 90 ! ------------------------- ! 91 91 ! 1 - Trends due to forcing ! 92 92 ! ------------------------- ! 93 z_frc_trd_v = r1_rau0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) + fwfisf (:,:) ) * surf(:,:) ) ! volume fluxes93 z_frc_trd_v = r1_rau0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * surf(:,:) ) ! volume fluxes 94 94 z_frc_trd_t = glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) ) ! heat fluxes 95 95 z_frc_trd_s = glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) ) ! salt fluxes … … 98 98 IF( ln_rnf_sal) z_frc_trd_s = z_frc_trd_s + glob_sum( 'diahsb', rnf_tsc(:,:,jp_sal) * surf(:,:) ) 99 99 ! ! Add ice shelf heat & salt input 100 IF( ln_isf ) z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', risf_tsc(:,:,jp_tem) * surf(:,:) ) 100 IF( ln_isf ) z_frc_trd_t = z_frc_trd_t & 101 & + glob_sum( 'diahsb', ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ) 101 102 ! ! Add penetrative solar radiation 102 103 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + r1_rau0_rcp * glob_sum( 'diahsb', qsr (:,:) * surf(:,:) ) … … 108 109 DO ji=1,jpi 109 110 DO jj=1,jpj 110 z2d0(ji,jj) = surf(ji,jj) * w n(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_tem)111 z2d1(ji,jj) = surf(ji,jj) * w n(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_sal)111 z2d0(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb) 112 z2d1(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb) 112 113 END DO 113 114 END DO 114 115 ELSE 115 z2d0(:,:) = surf(:,:) * w n(:,:,1) * tsb(:,:,1,jp_tem)116 z2d1(:,:) = surf(:,:) * w n(:,:,1) * tsb(:,:,1,jp_sal)116 z2d0(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb) 117 z2d1(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb) 117 118 END IF 118 119 z_wn_trd_t = - glob_sum( 'diahsb', z2d0 ) … … 135 136 136 137 ! ! volume variation (calculated with ssh) 137 zdiff_v1 = glob_sum_full( 'diahsb', surf(:,:)*ssh n(:,:) - surf_ini(:,:)*ssh_ini(:,:) )138 zdiff_v1 = glob_sum_full( 'diahsb', surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) ) 138 139 139 140 ! ! heat & salt content variation (associated with ssh) … … 142 143 DO ji = 1, jpi 143 144 DO jj = 1, jpj 144 z2d0(ji,jj) = surf(ji,jj) * ( ts n(ji,jj,mikt(ji,jj),jp_tem) * sshn(ji,jj) - ssh_hc_loc_ini(ji,jj) )145 z2d1(ji,jj) = surf(ji,jj) * ( ts n(ji,jj,mikt(ji,jj),jp_sal) * sshn(ji,jj) - ssh_sc_loc_ini(ji,jj) )145 z2d0(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) ) 146 z2d1(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) ) 146 147 END DO 147 148 END DO 148 149 ELSE ! no under ice-shelf seas 149 z2d0(:,:) = surf(:,:) * ( ts n(:,:,1,jp_tem) * sshn(:,:) - ssh_hc_loc_ini(:,:) )150 z2d1(:,:) = surf(:,:) * ( ts n(:,:,1,jp_sal) * sshn(:,:) - ssh_sc_loc_ini(:,:) )150 z2d0(:,:) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) ) 151 z2d1(:,:) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) ) 151 152 END IF 152 153 z_ssh_hc = glob_sum_full( 'diahsb', z2d0 ) … … 155 156 ! 156 157 DO jk = 1, jpkm1 ! volume variation (calculated with scale factors) 157 zwrk(:,:,jk) = ( surf(:,:)*e3t_n(:,:,jk) - surf_ini(:,:)*e3t_ini(:,:,jk) ) * tmask(:,:,jk)158 zwrk(:,:,jk) = surf(:,:)*e3t(:,:,jk,Kmm)*tmask(:,:,jk) - surf_ini(:,:)*e3t_ini(:,:,jk)*tmask_ini(:,:,jk) 158 159 END DO 159 zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 160 zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) ) ! glob_sum_full needed as tmask and tmask_ini could be different 160 161 DO jk = 1, jpkm1 ! heat content variation 161 zwrk(:,:,jk) = ( surf(:,:)*e3t _n(:,:,jk)*tsn(:,:,jk,jp_tem) - surf_ini(:,:)*hc_loc_ini(:,:,jk) ) * tmask(:,:,jk)162 zwrk(:,:,jk) = ( surf(:,:)*e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm) - surf_ini(:,:)*hc_loc_ini(:,:,jk) ) 162 163 END DO 163 164 zdiff_hc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 164 165 DO jk = 1, jpkm1 ! salt content variation 165 zwrk(:,:,jk) = ( surf(:,:)*e3t _n(:,:,jk)*tsn(:,:,jk,jp_sal) - surf_ini(:,:)*sc_loc_ini(:,:,jk) ) * tmask(:,:,jk)166 zwrk(:,:,jk) = ( surf(:,:)*e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm) - surf_ini(:,:)*sc_loc_ini(:,:,jk) ) 166 167 END DO 167 168 zdiff_sc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) … … 185 186 ! ----------------------- ! 186 187 DO jk = 1, jpkm1 ! total ocean volume (calculated with scale factors) 187 zwrk(:,:,jk) = surf(:,:) * e3t _n(:,:,jk) * tmask(:,:,jk)188 zwrk(:,:,jk) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 188 189 END DO 189 zvol_tot = glob_sum _full( 'diahsb', zwrk(:,:,:) )190 zvol_tot = glob_sum( 'diahsb', zwrk(:,:,:) ) 190 191 191 192 !!gm to be added ? 192 193 ! IF( ln_linssh ) THEN ! fixed volume, add the ssh contribution 193 ! zvol_tot = zvol_tot + glob_sum( 'diahsb', surf(:,:) * ssh n(:,:) )194 ! zvol_tot = zvol_tot + glob_sum( 'diahsb', surf(:,:) * ssh(:,:,Kmm) ) 194 195 ! ENDIF 195 196 !!gm end … … 233 234 ENDIF 234 235 ! 235 IF( lrst_oce ) CALL dia_hsb_rst( kt, 'WRITE' )236 IF( lrst_oce ) CALL dia_hsb_rst( kt, Kmm, 'WRITE' ) 236 237 ! 237 238 IF( ln_timing ) CALL timing_stop('dia_hsb') … … 240 241 241 242 242 SUBROUTINE dia_hsb_rst( kt, cdrw )243 SUBROUTINE dia_hsb_rst( kt, Kmm, cdrw ) 243 244 !!--------------------------------------------------------------------- 244 245 !! *** ROUTINE dia_hsb_rst *** … … 249 250 !!---------------------------------------------------------------------- 250 251 INTEGER , INTENT(in) :: kt ! ocean time-step 252 INTEGER , INTENT(in) :: Kmm ! ocean time level index 251 253 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag 252 254 ! … … 270 272 CALL iom_get( numror, jpdom_autoglo, 'ssh_ini' , ssh_ini , ldxios = lrxios ) 271 273 CALL iom_get( numror, jpdom_autoglo, 'e3t_ini' , e3t_ini , ldxios = lrxios ) 274 CALL iom_get( numror, jpdom_autoglo, 'tmask_ini' , tmask_ini , ldxios = lrxios ) 272 275 CALL iom_get( numror, jpdom_autoglo, 'hc_loc_ini', hc_loc_ini, ldxios = lrxios ) 273 276 CALL iom_get( numror, jpdom_autoglo, 'sc_loc_ini', sc_loc_ini, ldxios = lrxios ) … … 281 284 IF(lwp) WRITE(numout,*) 282 285 surf_ini(:,:) = e1e2t(:,:) * tmask_i(:,:) ! initial ocean surface 283 ssh_ini(:,:) = ssh n(:,:) ! initial ssh286 ssh_ini(:,:) = ssh(:,:,Kmm) ! initial ssh 284 287 DO jk = 1, jpk 285 288 ! if ice sheet/oceqn coupling, need to mask ini variables here (mask could change at the next NEMO instance). 286 e3t_ini (:,:,jk) = e3t_n(:,:,jk) * tmask(:,:,jk) ! initial vertical scale factors 287 hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * e3t_n(:,:,jk) * tmask(:,:,jk) ! initial heat content 288 sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * e3t_n(:,:,jk) * tmask(:,:,jk) ! initial salt content 289 e3t_ini (:,:,jk) = e3t(:,:,jk,Kmm) * tmask(:,:,jk) ! initial vertical scale factors 290 tmask_ini (:,:,jk) = tmask(:,:,jk) ! initial mask 291 hc_loc_ini(:,:,jk) = ts(:,:,jk,jp_tem,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) ! initial heat content 292 sc_loc_ini(:,:,jk) = ts(:,:,jk,jp_sal,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) ! initial salt content 289 293 END DO 290 294 frc_v = 0._wp ! volume trend due to forcing … … 295 299 DO ji = 1, jpi 296 300 DO jj = 1, jpj 297 ssh_hc_loc_ini(ji,jj) = ts n(ji,jj,mikt(ji,jj),jp_tem) * sshn(ji,jj) ! initial heat content in ssh298 ssh_sc_loc_ini(ji,jj) = ts n(ji,jj,mikt(ji,jj),jp_sal) * sshn(ji,jj) ! initial salt content in ssh301 ssh_hc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) ! initial heat content in ssh 302 ssh_sc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) ! initial salt content in ssh 299 303 END DO 300 304 END DO 301 305 ELSE 302 ssh_hc_loc_ini(:,:) = ts n(:,:,1,jp_tem) * sshn(:,:) ! initial heat content in ssh303 ssh_sc_loc_ini(:,:) = ts n(:,:,1,jp_sal) * sshn(:,:) ! initial salt content in ssh306 ssh_hc_loc_ini(:,:) = ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) ! initial heat content in ssh 307 ssh_sc_loc_ini(:,:) = ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) ! initial salt content in ssh 304 308 END IF 305 309 frc_wn_t = 0._wp ! initial heat content misfit due to free surface … … 325 329 CALL iom_rstput( kt, nitrst, numrow, 'ssh_ini' , ssh_ini , ldxios = lwxios ) 326 330 CALL iom_rstput( kt, nitrst, numrow, 'e3t_ini' , e3t_ini , ldxios = lwxios ) 331 CALL iom_rstput( kt, nitrst, numrow, 'tmask_ini' , tmask_ini , ldxios = lwxios ) 327 332 CALL iom_rstput( kt, nitrst, numrow, 'hc_loc_ini', hc_loc_ini, ldxios = lwxios ) 328 333 CALL iom_rstput( kt, nitrst, numrow, 'sc_loc_ini', sc_loc_ini, ldxios = lwxios ) … … 338 343 339 344 340 SUBROUTINE dia_hsb_init 345 SUBROUTINE dia_hsb_init( Kmm ) 341 346 !!--------------------------------------------------------------------------- 342 347 !! *** ROUTINE dia_hsb *** … … 350 355 !! - Compute coefficients for conversion 351 356 !!--------------------------------------------------------------------------- 357 INTEGER, INTENT(in) :: Kmm ! time level index 358 ! 352 359 INTEGER :: ierror, ios ! local integer 353 360 !! … … 360 367 WRITE(numout,*) '~~~~~~~~~~~~ ' 361 368 ENDIF 362 REWIND( numnam_ref ) ! Namelist namhsb in reference namelist363 369 READ ( numnam_ref, namhsb, IOSTAT = ios, ERR = 901) 364 370 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namhsb in reference namelist' ) 365 REWIND( numnam_cfg ) ! Namelist namhsb in configuration namelist366 371 READ ( numnam_cfg, namhsb, IOSTAT = ios, ERR = 902 ) 367 372 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namhsb in configuration namelist' ) … … 396 401 ! ------------------- ! 397 402 ALLOCATE( hc_loc_ini(jpi,jpj,jpk), sc_loc_ini(jpi,jpj,jpk), surf_ini(jpi,jpj), & 398 & e3t_ini(jpi,jpj,jpk), surf(jpi,jpj), ssh_ini(jpi,jpj), STAT=ierror )403 & e3t_ini(jpi,jpj,jpk), surf(jpi,jpj), ssh_ini(jpi,jpj), tmask_ini(jpi,jpj,jpk),STAT=ierror ) 399 404 IF( ierror > 0 ) THEN 400 405 CALL ctl_stop( 'dia_hsb_init: unable to allocate hc_loc_ini' ) ; RETURN … … 417 422 ! 4 - initial conservation variables ! 418 423 ! ---------------------------------- ! 419 CALL dia_hsb_rst( nit000, 'READ' ) !* read or initialize all required files424 CALL dia_hsb_rst( nit000, Kmm, 'READ' ) !* read or initialize all required files 420 425 ! 421 426 END SUBROUTINE dia_hsb_init
Note: See TracChangeset
for help on using the changeset viewer.