Changeset 14072 for NEMO/trunk/src/ICE/iceupdate.F90
- Timestamp:
- 2020-12-04T08:48:38+01:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/ICE/iceupdate.F90
r14005 r14072 67 67 !!------------------------------------------------------------------- 68 68 !! *** ROUTINE ice_update_flx *** 69 !! 70 !! ** Purpose : Update the surface ocean boundary condition for heat 69 !! 70 !! ** Purpose : Update the surface ocean boundary condition for heat 71 71 !! salt and mass over areas where sea-ice is non-zero 72 !! 72 !! 73 73 !! ** Action : - computes the heat and freshwater/salt fluxes 74 74 !! at the ice-ocean interface. 75 75 !! - Update the ocean sbc 76 !! 77 !! ** Outputs : - qsr : sea heat flux: solar 76 !! 77 !! ** Outputs : - qsr : sea heat flux: solar 78 78 !! - qns : sea heat flux: non solar 79 !! - emp : freshwater budget: volume flux 80 !! - sfx : salt flux 79 !! - emp : freshwater budget: volume flux 80 !! - sfx : salt flux 81 81 !! - fr_i : ice fraction 82 82 !! - tn_ice : sea-ice surface temperature … … 104 104 ! Net heat flux on top of the ice-ocean (W.m-2) 105 105 !---------------------------------------------- 106 qt_atm_oi(:,:) = qns_tot(:,:) + qsr_tot(:,:) 106 qt_atm_oi(:,:) = qns_tot(:,:) + qsr_tot(:,:) 107 107 108 108 ! --- case we bypass ice thermodynamics --- ! … … 114 114 qevap_ice (:,:,:) = 0._wp 115 115 ENDIF 116 116 117 117 DO_2D( 1, 1, 1, 1 ) 118 118 119 ! Solar heat flux reaching the ocean (max) = zqsr (W.m-2) 119 ! Solar heat flux reaching the ocean (max) = zqsr (W.m-2) 120 120 !--------------------------------------------------- 121 121 zqsr = qsr_tot(ji,jj) - SUM( a_i_b(ji,jj,:) * ( qsr_ice(ji,jj,:) - qtr_ice_bot(ji,jj,:) ) ) 122 122 123 ! Total heat flux reaching the ocean = qt_oce_ai (W.m-2) 123 ! Total heat flux reaching the ocean = qt_oce_ai (W.m-2) 124 124 !--------------------------------------------------- 125 125 qt_oce_ai(ji,jj) = qt_atm_oi(ji,jj) - hfx_sum(ji,jj) - hfx_bom(ji,jj) - hfx_bog(ji,jj) & 126 126 & - hfx_dif(ji,jj) - hfx_opw(ji,jj) - hfx_snw(ji,jj) & 127 127 & + hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_res(ji,jj) & 128 & + hfx_sub(ji,jj) - SUM( qevap_ice(ji,jj,:) * a_i_b(ji,jj,:) ) + hfx_spr(ji,jj) 129 128 & + hfx_sub(ji,jj) - SUM( qevap_ice(ji,jj,:) * a_i_b(ji,jj,:) ) + hfx_spr(ji,jj) 129 130 130 ! New qsr and qns used to compute the oceanic heat flux at the next time step 131 131 !---------------------------------------------------------------------------- … … 144 144 ! 145 145 ! the non-solar is simply derived from the solar flux 146 qns(ji,jj) = qt_oce_ai(ji,jj) - zqsr 147 148 ! Mass flux at the atm. surface 146 qns(ji,jj) = qt_oce_ai(ji,jj) - zqsr 147 148 ! Mass flux at the atm. surface 149 149 !----------------------------------- 150 150 wfx_sub(ji,jj) = wfx_snw_sub(ji,jj) + wfx_ice_sub(ji,jj) 151 151 152 ! Mass flux at the ocean surface 152 ! Mass flux at the ocean surface 153 153 !------------------------------------ 154 154 ! ice-ocean mass flux 155 155 wfx_ice(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) & 156 156 & + wfx_opw(ji,jj) + wfx_dyn(ji,jj) + wfx_res(ji,jj) + wfx_lam(ji,jj) 157 157 158 158 ! snw-ocean mass flux 159 159 wfx_snw(ji,jj) = wfx_snw_sni(ji,jj) + wfx_snw_dyn(ji,jj) + wfx_snw_sum(ji,jj) 160 160 161 161 ! total mass flux at the ocean/ice interface 162 162 fmmflx(ji,jj) = - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_pnd(ji,jj) - wfx_err_sub(ji,jj) ! ice-ocean mass flux saved at least for biogeochemical model 163 163 emp (ji,jj) = emp_oce(ji,jj) - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_pnd(ji,jj) - wfx_err_sub(ji,jj) ! atm-ocean + ice-ocean mass flux 164 164 165 ! Salt flux at the ocean surface 165 ! Salt flux at the ocean surface 166 166 !------------------------------------------ 167 167 sfx(ji,jj) = sfx_bog(ji,jj) + sfx_bom(ji,jj) + sfx_sum(ji,jj) + sfx_sni(ji,jj) + sfx_opw(ji,jj) & 168 168 & + sfx_res(ji,jj) + sfx_dyn(ji,jj) + sfx_bri(ji,jj) + sfx_sub(ji,jj) + sfx_lam(ji,jj) 169 170 ! Mass of snow and ice per unit area 169 170 ! Mass of snow and ice per unit area 171 171 !---------------------------------------- 172 172 snwice_mass_b(ji,jj) = snwice_mass(ji,jj) ! save mass from the previous ice time step 173 173 ! ! new mass per unit area 174 snwice_mass (ji,jj) = tmask(ji,jj,1) * ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) + rhow * (vt_ip(ji,jj) + vt_il(ji,jj)) ) 174 snwice_mass (ji,jj) = tmask(ji,jj,1) * ( rhos * vt_s(ji,jj) + rhoi * vt_i(ji,jj) + rhow * (vt_ip(ji,jj) + vt_il(ji,jj)) ) 175 175 ! ! time evolution of snow+ice mass 176 176 snwice_fmass (ji,jj) = ( snwice_mass(ji,jj) - snwice_mass_b(ji,jj) ) * r1_Dt_ice 177 177 178 178 END_2D 179 179 180 180 ! Storing the transmitted variables 181 181 !---------------------------------- 182 fr_i (:,:) = at_i(:,:) ! Sea-ice fraction 183 tn_ice(:,:,:) = t_su(:,:,:) ! Ice surface temperature 182 fr_i (:,:) = at_i(:,:) ! Sea-ice fraction 183 tn_ice(:,:,:) = t_su(:,:,:) ! Ice surface temperature 184 184 185 185 ! Snow/ice albedo (only if sent to coupler, useless in forced mode) … … 216 216 CALL iom_put( 'vfxice' , wfx_ice ) ! mass flux from total ice growth/melt 217 217 CALL iom_put( 'vfxbog' , wfx_bog ) ! mass flux from bottom growth 218 CALL iom_put( 'vfxbom' , wfx_bom ) ! mass flux from bottom melt 219 CALL iom_put( 'vfxsum' , wfx_sum ) ! mass flux from surface melt 220 CALL iom_put( 'vfxlam' , wfx_lam ) ! mass flux from lateral melt 218 CALL iom_put( 'vfxbom' , wfx_bom ) ! mass flux from bottom melt 219 CALL iom_put( 'vfxsum' , wfx_sum ) ! mass flux from surface melt 220 CALL iom_put( 'vfxlam' , wfx_lam ) ! mass flux from lateral melt 221 221 CALL iom_put( 'vfxsni' , wfx_sni ) ! mass flux from snow-ice formation 222 222 CALL iom_put( 'vfxopw' , wfx_opw ) ! mass flux from growth in open water 223 223 CALL iom_put( 'vfxdyn' , wfx_dyn ) ! mass flux from dynamics (ridging) 224 CALL iom_put( 'vfxres' , wfx_res ) ! mass flux from undiagnosed processes 224 CALL iom_put( 'vfxres' , wfx_res ) ! mass flux from undiagnosed processes 225 225 CALL iom_put( 'vfxpnd' , wfx_pnd ) ! mass flux from melt ponds 226 226 CALL iom_put( 'vfxsub' , wfx_ice_sub ) ! mass flux from ice sublimation (ice-atm.) 227 CALL iom_put( 'vfxsub_err', wfx_err_sub ) ! "excess" of sublimation sent to ocean 228 229 IF ( iom_use( 'vfxthin' ) ) THEN ! mass flux from ice growth in open water + thin ice (<20cm) => comparable to observations 227 CALL iom_put( 'vfxsub_err', wfx_err_sub ) ! "excess" of sublimation sent to ocean 228 229 IF ( iom_use( 'vfxthin' ) ) THEN ! mass flux from ice growth in open water + thin ice (<20cm) => comparable to observations 230 230 WHERE( hm_i(:,:) < 0.2 .AND. hm_i(:,:) > 0. ) ; z2d = wfx_bog 231 231 ELSEWHERE ; z2d = 0._wp … … 237 237 CALL iom_put( 'vfxsnw' , wfx_snw ) ! mass flux from total snow growth/melt 238 238 CALL iom_put( 'vfxsnw_sum' , wfx_snw_sum ) ! mass flux from snow melt at the surface 239 CALL iom_put( 'vfxsnw_sni' , wfx_snw_sni ) ! mass flux from snow melt during snow-ice formation 240 CALL iom_put( 'vfxsnw_dyn' , wfx_snw_dyn ) ! mass flux from dynamics (ridging) 241 CALL iom_put( 'vfxsnw_sub' , wfx_snw_sub ) ! mass flux from snow sublimation (ice-atm.) 239 CALL iom_put( 'vfxsnw_sni' , wfx_snw_sni ) ! mass flux from snow melt during snow-ice formation 240 CALL iom_put( 'vfxsnw_dyn' , wfx_snw_dyn ) ! mass flux from dynamics (ridging) 241 CALL iom_put( 'vfxsnw_sub' , wfx_snw_sub ) ! mass flux from snow sublimation (ice-atm.) 242 242 CALL iom_put( 'vfxsnw_pre' , wfx_spr ) ! snow precip 243 243 … … 252 252 IF( iom_use('qt_oce' ) ) CALL iom_put( 'qt_oce' , ( qsr_oce + qns_oce ) * ( 1._wp - at_i_b ) + qemp_oce ) 253 253 IF( iom_use('qt_ice' ) ) CALL iom_put( 'qt_ice' , SUM( ( qns_ice + qsr_ice ) * a_i_b, dim=3 ) + qemp_ice ) 254 IF( iom_use('qt_oce_ai' ) ) CALL iom_put( 'qt_oce_ai' , qt_oce_ai * tmask(:,:,1) ) ! total heat flux at the ocean surface: interface oce-(ice+atm) 255 IF( iom_use('qt_atm_oi' ) ) CALL iom_put( 'qt_atm_oi' , qt_atm_oi * tmask(:,:,1) ) ! total heat flux at the oce-ice surface: interface atm-(ice+oce) 254 IF( iom_use('qt_oce_ai' ) ) CALL iom_put( 'qt_oce_ai' , qt_oce_ai * tmask(:,:,1) ) ! total heat flux at the ocean surface: interface oce-(ice+atm) 255 IF( iom_use('qt_atm_oi' ) ) CALL iom_put( 'qt_atm_oi' , qt_atm_oi * tmask(:,:,1) ) ! total heat flux at the oce-ice surface: interface atm-(ice+oce) 256 256 IF( iom_use('qemp_oce' ) ) CALL iom_put( 'qemp_oce' , qemp_oce ) ! Downward Heat Flux from E-P over ocean 257 257 IF( iom_use('qemp_ice' ) ) CALL iom_put( 'qemp_ice' , qemp_ice ) ! Downward Heat Flux from E-P over ice … … 259 259 ! heat fluxes from ice transformations 260 260 ! ! hfxdhc = hfxbog + hfxbom + hfxsum + hfxopw + hfxdif + hfxsnw - ( hfxthd + hfxdyn + hfxres + hfxsub + hfxspr ) 261 CALL iom_put ('hfxbog' , hfx_bog ) ! heat flux used for ice bottom growth 261 CALL iom_put ('hfxbog' , hfx_bog ) ! heat flux used for ice bottom growth 262 262 CALL iom_put ('hfxbom' , hfx_bom ) ! heat flux used for ice bottom melt 263 263 CALL iom_put ('hfxsum' , hfx_sum ) ! heat flux used for ice surface melt 264 264 CALL iom_put ('hfxopw' , hfx_opw ) ! heat flux used for ice formation in open water 265 265 CALL iom_put ('hfxdif' , hfx_dif ) ! heat flux used for ice temperature change 266 CALL iom_put ('hfxsnw' , hfx_snw ) ! heat flux used for snow melt 266 CALL iom_put ('hfxsnw' , hfx_snw ) ! heat flux used for snow melt 267 267 CALL iom_put ('hfxerr' , hfx_err_dif ) ! heat flux error after heat diffusion 268 268 269 269 ! heat fluxes associated with mass exchange (freeze/melt/precip...) 270 CALL iom_put ('hfxthd' , hfx_thd ) ! 271 CALL iom_put ('hfxdyn' , hfx_dyn ) ! 272 CALL iom_put ('hfxres' , hfx_res ) ! 273 CALL iom_put ('hfxsub' , hfx_sub ) ! 274 CALL iom_put ('hfxspr' , hfx_spr ) ! Heat flux from snow precip heat content 270 CALL iom_put ('hfxthd' , hfx_thd ) ! 271 CALL iom_put ('hfxdyn' , hfx_dyn ) ! 272 CALL iom_put ('hfxres' , hfx_res ) ! 273 CALL iom_put ('hfxsub' , hfx_sub ) ! 274 CALL iom_put ('hfxspr' , hfx_spr ) ! Heat flux from snow precip heat content 275 275 276 276 ! other heat fluxes … … 294 294 !!------------------------------------------------------------------- 295 295 !! *** ROUTINE ice_update_tau *** 296 !! 296 !! 297 297 !! ** Purpose : Update the ocean surface stresses due to the ice 298 !! 298 !! 299 299 !! ** Action : * at each ice time step (every nn_fsbc time step): 300 !! - compute the modulus of ice-ocean relative velocity 300 !! - compute the modulus of ice-ocean relative velocity 301 301 !! (*rho*Cd) at T-point (C-grid) or I-point (B-grid) 302 302 !! tmod_io = rhoco * | U_ice-U_oce | 303 303 !! - update the modulus of stress at ocean surface 304 304 !! taum = (1-a) * taum + a * tmod_io * | U_ice-U_oce | 305 !! * at each ocean time step (every kt): 305 !! * at each ocean time step (every kt): 306 306 !! compute linearized ice-ocean stresses as 307 307 !! Utau = tmod_io * | U_ice - pU_oce | … … 310 310 !! NB: - ice-ocean rotation angle no more allowed 311 311 !! - here we make an approximation: taum is only computed every ice time step 312 !! This avoids mutiple average to pass from T -> U,V grids and next from U,V grids 312 !! This avoids mutiple average to pass from T -> U,V grids and next from U,V grids 313 313 !! to T grid. taum is used in TKE and GLS, which should not be too sensitive to this approximaton... 314 314 !! … … 337 337 DO_2D( 0, 0, 0, 0 ) !* update the modulus of stress at ocean surface (T-point) 338 338 ! ! 2*(U_ice-U_oce) at T-point 339 zu_t = u_ice(ji,jj) + u_ice(ji-1,jj) - u_oce(ji,jj) - u_oce(ji-1,jj) 340 zv_t = v_ice(ji,jj) + v_ice(ji,jj-1) - v_oce(ji,jj) - v_oce(ji,jj-1) 339 zu_t = u_ice(ji,jj) + u_ice(ji-1,jj) - u_oce(ji,jj) - u_oce(ji-1,jj) 340 zv_t = v_ice(ji,jj) + v_ice(ji,jj-1) - v_oce(ji,jj) - v_oce(ji,jj-1) 341 341 ! ! |U_ice-U_oce|^2 342 342 zmodt = 0.25_wp * ( zu_t * zu_t + zv_t * zv_t ) … … 354 354 ! !== every ocean time-step ==! 355 355 IF ( ln_drgice_imp ) THEN 356 ! Save drag with right sign to update top drag in the ocean implicit friction 357 rCdU_ice(:,:) = -r1_rho0 * tmod_io(:,:) * at_i(:,:) * tmask(:,:,1) 356 ! Save drag with right sign to update top drag in the ocean implicit friction 357 rCdU_ice(:,:) = -r1_rho0 * tmod_io(:,:) * at_i(:,:) * tmask(:,:,1) 358 358 zflagi = 0._wp 359 359 ELSE … … 362 362 ! 363 363 DO_2D( 0, 0, 0, 0 ) !* update the stress WITHOUT an ice-ocean rotation angle 364 ! ice area at u and v-points 364 ! ice area at u and v-points 365 365 zat_u = ( at_i(ji,jj) * tmask(ji,jj,1) + at_i (ji+1,jj ) * tmask(ji+1,jj ,1) ) & 366 366 & / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji+1,jj ,1) ) … … 377 377 ! 378 378 IF( ln_timing ) CALL timing_stop('ice_update') 379 ! 379 ! 380 380 END SUBROUTINE ice_update_tau 381 381 … … 384 384 !!------------------------------------------------------------------- 385 385 !! *** ROUTINE ice_update_init *** 386 !! 386 !! 387 387 !! ** Purpose : allocate ice-ocean stress fields and read restarts 388 388 !! containing the snow & ice mass … … 408 408 !!--------------------------------------------------------------------- 409 409 !! *** ROUTINE rhg_evp_rst *** 410 !! 410 !! 411 411 !! ** Purpose : Read or write RHG file in restart file 412 412 !! … … 456 456 !! Default option Dummy module NO SI3 sea-ice model 457 457 !!---------------------------------------------------------------------- 458 #endif 458 #endif 459 459 460 460 !!======================================================================
Note: See TracChangeset
for help on using the changeset viewer.