- Timestamp:
- 2015-06-19T17:18:00+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/LIM_SRC_3/limsbc.F90
r5234 r5443 25 25 USE par_oce ! ocean parameters 26 26 USE phycst ! physical constants 27 USE par_ice ! ice parameters28 27 USE dom_oce ! ocean domain 29 USE dom_ice, ONLY : tms, area30 28 USE ice ! LIM sea-ice variables 31 29 USE sbc_ice ! Surface boundary condition: sea-ice fields 32 30 USE sbc_oce ! Surface boundary condition: ocean fields 33 31 USE sbccpl 34 USE oce , ONLY : fraqsr_1lev,sshn, sshb, snwice_mass, snwice_mass_b, snwice_fmass32 USE oce , ONLY : sshn, sshb, snwice_mass, snwice_mass_b, snwice_fmass 35 33 USE albedo ! albedo parameters 36 34 USE lbclnk ! ocean lateral boundary condition - MPP exchanges … … 40 38 USE prtctl ! Print control 41 39 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 42 USE traqsr ! clem: add penetration of solar flux intothe calculation of heat budget40 USE traqsr ! add penetration of solar flux in the calculation of heat budget 43 41 USE iom 44 42 USE domvvl ! Variable volume 43 USE limctl 44 USE limcons 45 45 46 46 IMPLICIT NONE 47 47 PRIVATE 48 48 49 PUBLIC lim_sbc_init ! called by ice_init49 PUBLIC lim_sbc_init ! called by sbc_lim_init 50 50 PUBLIC lim_sbc_flx ! called by sbc_ice_lim 51 51 PUBLIC lim_sbc_tau ! called by sbc_ice_lim … … 94 94 !! - fr_i : ice fraction 95 95 !! - tn_ice : sea-ice surface temperature 96 !! - alb_ice : sea-ice albedo ( lk_cpl=T)96 !! - alb_ice : sea-ice albedo (only useful in coupled mode) 97 97 !! 98 98 !! References : Goosse, H. et al. 1996, Bul. Soc. Roy. Sc. Liege, 65, 87-90. 99 99 !! Tartinville et al. 2001 Ocean Modelling, 3, 95-108. 100 100 !! These refs are now obsolete since everything has been revised 101 !! The ref should be Rousset et al., 2015 ?101 !! The ref should be Rousset et al., 2015 102 102 !!--------------------------------------------------------------------- 103 INTEGER, INTENT(in) :: kt ! number of iteration 104 ! 105 INTEGER :: ji, jj, jl, jk ! dummy loop indices 106 ! 107 REAL(wp) :: zemp ! local scalars 108 REAL(wp) :: zf_mass ! Heat flux associated with mass exchange ice->ocean (W.m-2) 109 REAL(wp) :: zfcm1 ! New solar flux received by the ocean 103 INTEGER, INTENT(in) :: kt ! number of iteration 104 INTEGER :: ji, jj, jl, jk ! dummy loop indices 105 REAL(wp) :: zqmass ! Heat flux associated with mass exchange ice->ocean (W.m-2) 106 REAL(wp) :: zqsr ! New solar flux received by the ocean 110 107 ! 111 108 REAL(wp), POINTER, DIMENSION(:,:,:) :: zalb_cs, zalb_os ! 2D/3D workspace … … 113 110 114 111 ! make calls for heat fluxes before it is modified 115 IF( iom_use('qsr_oce') ) CALL iom_put( "qsr_oce" , qsr(:,:) * pfrld(:,:) ) ! solar flux at ocean surface 116 IF( iom_use('qns_oce') ) CALL iom_put( "qns_oce" , qns(:,:) * pfrld(:,:) ) ! non-solar flux at ocean surface 117 IF( iom_use('qsr_ice') ) CALL iom_put( "qsr_ice" , SUM( qsr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) ! solar flux at ice surface 118 IF( iom_use('qns_ice') ) CALL iom_put( "qns_ice" , SUM( qns_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) ! non-solar flux at ice surface 119 IF( iom_use('qtr_ice') ) CALL iom_put( "qtr_ice" , SUM( ftr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) ! solar flux transmitted thru ice 120 IF( iom_use('qt_oce' ) ) CALL iom_put( "qt_oce" , ( qsr(:,:) + qns(:,:) ) * pfrld(:,:) ) 121 IF( iom_use('qt_ice' ) ) CALL iom_put( "qt_ice" , SUM( ( qns_ice(:,:,:) + qsr_ice(:,:,:) ) * a_i_b(:,:,:), dim=3 ) ) 112 IF( iom_use('qsr_oce') ) CALL iom_put( "qsr_oce" , qsr_oce(:,:) * pfrld(:,:) ) ! solar flux at ocean surface 113 IF( iom_use('qns_oce') ) CALL iom_put( "qns_oce" , qns_oce(:,:) * pfrld(:,:) + qemp_oce(:,:) ) ! non-solar flux at ocean surface 114 IF( iom_use('qsr_ice') ) CALL iom_put( "qsr_ice" , SUM( qsr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) ! solar flux at ice surface 115 IF( iom_use('qns_ice') ) CALL iom_put( "qns_ice" , SUM( qns_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) + qemp_ice(:,:) ) ! non-solar flux at ice surface 116 IF( iom_use('qtr_ice') ) CALL iom_put( "qtr_ice" , SUM( ftr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) ! solar flux transmitted thru ice 117 IF( iom_use('qt_oce' ) ) CALL iom_put( "qt_oce" , ( qsr_oce(:,:) + qns_oce(:,:) ) * pfrld(:,:) + qemp_oce(:,:) ) 118 IF( iom_use('qt_ice' ) ) CALL iom_put( "qt_ice" , SUM( ( qns_ice(:,:,:) + qsr_ice(:,:,:) ) & 119 & * a_i_b(:,:,:), dim=3 ) + qemp_ice(:,:) ) 120 IF( iom_use('qemp_oce' ) ) CALL iom_put( "qemp_oce" , qemp_oce(:,:) ) 121 IF( iom_use('qemp_ice' ) ) CALL iom_put( "qemp_ice" , qemp_ice(:,:) ) 122 122 123 123 ! pfrld is the lead fraction at the previous time step (actually between TRP and THD) … … 128 128 ! heat flux at the ocean surface ! 129 129 !------------------------------------------! 130 ! Solar heat flux reaching the ocean = z fcm1(W.m-2)130 ! Solar heat flux reaching the ocean = zqsr (W.m-2) 131 131 !--------------------------------------------------- 132 IF( lk_cpl ) THEN 133 !!! LIM2 version zqsr = qsr_tot(ji,jj) + ( fstric(ji,jj) - qsr_ice(ji,jj,1) ) * ( 1.0 - pfrld(ji,jj) ) 134 zfcm1 = qsr_tot(ji,jj) 135 DO jl = 1, jpl 136 zfcm1 = zfcm1 + ( ftr_ice(ji,jj,jl) - qsr_ice(ji,jj,jl) ) * a_i_b(ji,jj,jl) 137 END DO 138 ELSE 139 !!! LIM2 version zqsr = pfrld(ji,jj) * qsr(ji,jj) + ( 1. - pfrld(ji,jj) ) * fstric(ji,jj) 140 zfcm1 = pfrld(ji,jj) * qsr(ji,jj) 141 DO jl = 1, jpl 142 zfcm1 = zfcm1 + a_i_b(ji,jj,jl) * ftr_ice(ji,jj,jl) 143 END DO 144 ENDIF 132 zqsr = qsr_tot(ji,jj) 133 DO jl = 1, jpl 134 zqsr = zqsr - a_i_b(ji,jj,jl) * ( qsr_ice(ji,jj,jl) - ftr_ice(ji,jj,jl) ) 135 END DO 145 136 146 137 ! Total heat flux reaching the ocean = hfx_out (W.m-2) 147 138 !--------------------------------------------------- 148 zf_mass = hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_res(ji,jj) ! heat flux from snow is 0 (T=0 degC) 149 hfx_out(ji,jj) = hfx_out(ji,jj) + zf_mass + zfcm1 139 zqmass = hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_res(ji,jj) ! heat flux from snow is 0 (T=0 degC) 140 hfx_out(ji,jj) = hfx_out(ji,jj) + zqmass + zqsr 141 142 ! Add the residual from heat diffusion equation (W.m-2) 143 !------------------------------------------------------- 144 hfx_out(ji,jj) = hfx_out(ji,jj) + hfx_err_dif(ji,jj) 150 145 151 146 ! New qsr and qns used to compute the oceanic heat flux at the next time step 152 147 !--------------------------------------------------- 153 qsr(ji,jj) = z fcm1154 qns(ji,jj) = hfx_out(ji,jj) - z fcm1148 qsr(ji,jj) = zqsr 149 qns(ji,jj) = hfx_out(ji,jj) - zqsr 155 150 156 151 !------------------------------------------! … … 165 160 ! Even if i see Ice melting as a FW and SALT flux 166 161 ! 167 ! computing freshwater exchanges at the ice/ocean interface168 IF( lk_cpl ) THEN169 zemp = - emp_tot(ji,jj) + emp_ice(ji,jj) * ( 1. - pfrld(ji,jj) ) & !170 & + wfx_snw(ji,jj)171 ELSE172 zemp = emp(ji,jj) * pfrld(ji,jj) & ! evaporation over oceanic fraction173 & - tprecip(ji,jj) * ( 1._wp - pfrld(ji,jj) ) & ! all precipitation reach the ocean174 & + sprecip(ji,jj) * ( 1._wp - pfrld(ji,jj)**betas ) ! except solid precip intercepted by sea-ice175 ENDIF176 177 162 ! mass flux from ice/ocean 178 163 wfx_ice(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) & … … 180 165 181 166 ! mass flux at the ocean/ice interface 182 fmmflx(ji,jj) = - wfx_ice(ji,jj) * r1_rdtice! F/M mass flux save at least for biogeochemical model183 emp(ji,jj) = zemp - wfx_ice(ji,jj) - wfx_snw(ji,jj)! mass flux + F/M mass flux (always ice/ocean mass exchange)167 fmmflx(ji,jj) = - ( wfx_ice(ji,jj) + wfx_snw(ji,jj) ) * r1_rdtice ! F/M mass flux save at least for biogeochemical model 168 emp(ji,jj) = emp_oce(ji,jj) - wfx_ice(ji,jj) - wfx_snw(ji,jj) ! mass flux + F/M mass flux (always ice/ocean mass exchange) 184 169 185 170 END DO … … 199 184 snwice_mass_b(:,:) = snwice_mass(:,:) 200 185 ! new mass per unit area 201 snwice_mass (:,:) = tm s(:,:) * ( rhosn * vt_s(:,:) + rhoic * vt_i(:,:) )186 snwice_mass (:,:) = tmask(:,:,1) * ( rhosn * vt_s(:,:) + rhoic * vt_i(:,:) ) 202 187 ! time evolution of snow+ice mass 203 188 snwice_fmass (:,:) = ( snwice_mass(:,:) - snwice_mass_b(:,:) ) * r1_rdtice … … 210 195 tn_ice(:,:,:) = t_su(:,:,:) ! Ice surface temperature 211 196 212 !------------------------------------------------! 213 ! Snow/ice albedo (only if sent to coupler) ! 214 !------------------------------------------------! 215 IF( lk_cpl ) THEN ! coupled case 216 217 CALL wrk_alloc( jpi, jpj, jpl, zalb_cs, zalb_os ) 218 219 CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 220 221 alb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 222 223 CALL wrk_dealloc( jpi, jpj, jpl, zalb_cs, zalb_os ) 224 225 ENDIF 226 197 !------------------------------------------------------------------------! 198 ! Snow/ice albedo (only if sent to coupler, useless in forced mode) ! 199 !------------------------------------------------------------------------! 200 CALL wrk_alloc( jpi, jpj, jpl, zalb_cs, zalb_os ) 201 CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 202 alb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 203 CALL wrk_dealloc( jpi, jpj, jpl, zalb_cs, zalb_os ) 204 205 ! conservation test 206 IF( ln_limdiahsb ) CALL lim_cons_final( 'limsbc' ) 207 208 ! control prints 209 IF( ln_icectl ) CALL lim_prt( kt, iiceprt, jiceprt, 3, ' - Final state lim_sbc - ' ) 227 210 228 211 IF(ln_ctl) THEN … … 270 253 ! 271 254 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN !== Ice time-step only ==! (i.e. surface module time-step) 272 !CDIR NOVERRCHK273 255 DO jj = 2, jpjm1 !* update the modulus of stress at ocean surface (T-point) 274 !CDIR NOVERRCHK275 256 DO ji = fs_2, fs_jpim1 276 257 ! ! 2*(U_ice-U_oce) at T-point … … 322 303 !! ** input : Namelist namicedia 323 304 !!------------------------------------------------------------------- 324 REAL(wp) :: zsum, zarea325 !326 305 INTEGER :: ji, jj, jk ! dummy loop indices 327 306 REAL(wp) :: zcoefu, zcoefv, zcoeff ! local scalar … … 343 322 END WHERE 344 323 ENDIF 345 ! clem modif 346 IF( .NOT. ln_rstart ) THEN 347 fraqsr_1lev(:,:) = 1._wp 348 ENDIF 349 ! 350 ! clem: snwice_mass in the restart file now 324 ! 351 325 IF( .NOT. ln_rstart ) THEN 352 326 ! ! embedded sea ice 353 327 IF( nn_ice_embd /= 0 ) THEN ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass 354 snwice_mass (:,:) = tm s(:,:) * ( rhosn * vt_s(:,:) + rhoic * vt_i(:,:) )328 snwice_mass (:,:) = tmask(:,:,1) * ( rhosn * vt_s(:,:) + rhoic * vt_i(:,:) ) 355 329 snwice_mass_b(:,:) = snwice_mass(:,:) 356 330 ELSE
Note: See TracChangeset
for help on using the changeset viewer.