Changeset 10786 for NEMO/trunk
- Timestamp:
- 2019-03-20T19:59:24+01:00 (5 years ago)
- Location:
- NEMO/trunk/src/ICE
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/ICE/ice1d.F90
r10534 r10786 123 123 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sv_i_1d !: 124 124 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: oa_i_1d !: 125 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: o_i_1d !: 125 126 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: a_ip_1d !: 126 127 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: v_ip_1d !: … … 209 210 & a_ip_1d (jpij) , v_ip_1d (jpij) , v_i_1d (jpij) , v_s_1d (jpij) , & 210 211 & h_ip_1d (jpij) , a_ip_frac_1d(jpij) , & 211 & sv_i_1d (jpij) , oa_i_1d (jpij) , STAT=ierr(ii) )212 & sv_i_1d (jpij) , oa_i_1d (jpij) , o_i_1d (jpij) , STAT=ierr(ii) ) 212 213 ! 213 214 ii = ii + 1 -
NEMO/trunk/src/ICE/icedyn_adv_umx.F90
r10579 r10786 23 23 ! 24 24 USE in_out_manager ! I/O manager 25 USE iom ! I/O manager library 25 26 USE lib_mpp ! MPP library 26 27 USE lib_fortran ! fortran utilities (glob_sum + no signed zero) … … 160 161 161 162 zamsk = 1._wp 162 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_i, pa_i, zua_ho, zva_ho ) ! Ice area163 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_i, pa_i, zua_ho, zva_ho ) !-- Ice area 163 164 zamsk = 0._wp 164 165 ! 165 166 zhvar(:,:,:) = pv_i(:,:,:) * z1_ai(:,:,:) 166 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_i ) ! Ice volume167 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_i ) !-- Ice volume 167 168 ! 168 169 zhvar(:,:,:) = pv_s(:,:,:) * z1_ai(:,:,:) 169 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_s ) ! Snw volume170 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_s ) !-- Snw volume 170 171 ! 171 172 zhvar(:,:,:) = psv_i(:,:,:) * z1_ai(:,:,:) 172 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, psv_i ) ! Salt content 173 ! 174 zhvar(:,:,:) = poa_i(:,:,:) * z1_ai(:,:,:) 175 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, poa_i ) ! Age content 173 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, psv_i ) !-- Salt content 176 174 ! 177 175 DO jk = 1, nlay_i 178 176 zhvar(:,:,:) = pe_i(:,:,jk,:) * z1_ai(:,:,:) 179 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_i(:,:,jk,:) ) ! Ice heat content177 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_i(:,:,jk,:) ) !-- Ice heat content 180 178 END DO 181 179 ! 182 180 DO jk = 1, nlay_s 183 181 zhvar(:,:,:) = pe_s(:,:,jk,:) * z1_ai(:,:,:) 184 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_s(:,:,jk,:) ) ! Snw heat content 185 END DO 186 ! 187 IF ( ln_pnd_H12 ) THEN 182 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_s(:,:,jk,:) ) !-- Snw heat content 183 END DO 184 ! 185 IF( iom_use('iceage') .OR. iom_use('iceage_cat') ) THEN !-- Ice Age 186 ! clem: in theory we should use the formulation below to advect the ice age, but the code is unable to deal with 187 ! fields that do not depend on volume (here oa_i depends on concentration). It creates abnormal ages that 188 ! spread into the domain. Therefore we cheat and consider that ice age should be advected as ice concentration 189 !!zhvar(:,:,:) = poa_i(:,:,:) * z1_ai(:,:,:) 190 !!CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, poa_i ) 191 ! set u*a=u for advection of ice age 192 DO jl = 1, jpl 193 zua_ho(:,:,jl) = zudy(:,:) 194 zva_ho(:,:,jl) = zvdx(:,:) 195 END DO 196 zamsk = 1._wp 197 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, poa_i, poa_i ) 198 zamsk = 0._wp 199 ENDIF 200 ! 201 IF ( ln_pnd_H12 ) THEN !-- melt ponds 188 202 ! set u*a=u for advection of Ap only 189 203 DO jl = 1, jpl … … 191 205 zva_ho(:,:,jl) = zvdx(:,:) 192 206 END DO 193 207 ! 194 208 zamsk = 1._wp 195 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_ip, pa_ip, zua_ho, zva_ho ) ! mpfraction209 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_ip, pa_ip, zua_ho, zva_ho ) ! fraction 196 210 zamsk = 0._wp 197 211 ! 198 212 zhvar(:,:,:) = pv_ip(:,:,:) * z1_aip(:,:,:) 199 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_ip ) ! mpvolume213 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_ip ) ! volume 200 214 ENDIF 201 215 ! … … 203 217 DO jj = 2, jpjm1 204 218 DO ji = fs_2, fs_jpim1 205 pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) & !Open water area219 pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) & !-- Open water area 206 220 & - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 207 221 END DO -
NEMO/trunk/src/ICE/icethd.F90
r10534 r10786 244 244 ! 245 245 END DO 246 ! update ice age (in case a_i changed, i.e. becomes 0 or lateral melting)247 oa_i(:,:,:) = o_i(:,:,:) * a_i(:,:,:)248 246 249 247 IF( ln_icediachk ) CALL ice_cons_hsm(1, 'icethd', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) … … 418 416 CALL tab_2d_1d( npti, nptidx(1:npti), sst_1d(1:npti), sst_m ) 419 417 CALL tab_2d_1d( npti, nptidx(1:npti), sss_1d(1:npti), sss_m ) 420 418 ! 419 ! to update ice age 420 CALL tab_2d_1d( npti, nptidx(1:npti), o_i_1d (1:npti), o_i (:,:,kl) ) 421 CALL tab_2d_1d( npti, nptidx(1:npti), oa_i_1d(1:npti), oa_i(:,:,kl) ) 422 ! 421 423 ! --- Change units of e_i, e_s from J/m2 to J/m3 --- ! 422 424 DO jk = 1, nlay_i … … 443 445 sv_i_1d(1:npti) = s_i_1d (1:npti) * v_i_1d (1:npti) 444 446 v_ip_1d(1:npti) = h_ip_1d(1:npti) * a_ip_1d(1:npti) 447 oa_i_1d(1:npti) = o_i_1d (1:npti) * a_i_1d (1:npti) 445 448 446 449 CALL tab_1d_2d( npti, nptidx(1:npti), at_i_1d(1:npti), at_i ) … … 516 519 CALL tab_1d_2d( npti, nptidx(1:npti), sv_i_1d(1:npti), sv_i(:,:,kl) ) 517 520 CALL tab_1d_2d( npti, nptidx(1:npti), v_ip_1d(1:npti), v_ip(:,:,kl) ) 521 CALL tab_1d_2d( npti, nptidx(1:npti), oa_i_1d(1:npti), oa_i(:,:,kl) ) 518 522 ! 519 523 END SELECT -
NEMO/trunk/src/ICE/icethd_dh.F90
r10534 r10786 614 614 DO jk = 1, nlay_s 615 615 DO ji = 1,npti 616 ! mask enthalpy 617 rswitch = 1._wp - MAX( 0._wp , SIGN( 1._wp, - h_s_1d(ji) ) ) 616 ! where there is no ice or no snow 617 rswitch = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, - h_s_1d(ji) ) ) ) * ( 1._wp - MAX( 0._wp, SIGN(1._wp, - h_i_1d(ji) ) ) ) 618 ! mass & energy loss to the ocean 619 hfx_res_1d(ji) = hfx_res_1d(ji) + ( 1._wp - rswitch ) * & 620 & ( e_s_1d(ji,jk) * h_s_1d(ji) * r1_nlay_s * a_i_1d(ji) * r1_rdtice ) ! heat flux to the ocean [W.m-2], < 0 621 wfx_res_1d(ji) = wfx_res_1d(ji) + ( 1._wp - rswitch ) * & 622 & ( rhos * h_s_1d(ji) * r1_nlay_s * a_i_1d(ji) * r1_rdtice ) ! mass flux 623 ! update energy (mass is updated in the next loop) 618 624 e_s_1d(ji,jk) = rswitch * e_s_1d(ji,jk) 619 625 ! recalculate t_s_1d from e_s_1d … … 622 628 END DO 623 629 624 ! --- ensure that a_i = 0 where h_i = 0 --- 625 WHERE( h_i_1d(1:npti) == 0._wp ) a_i_1d(1:npti) = 0._wp 630 ! --- ensure that a_i = 0 & h_s = 0 where h_i = 0 --- 631 WHERE( h_i_1d(1:npti) == 0._wp ) 632 a_i_1d(1:npti) = 0._wp 633 h_s_1d(1:npti) = 0._wp 634 END WHERE 626 635 ! 627 636 END SUBROUTINE ice_thd_dh -
NEMO/trunk/src/ICE/icewri.F90
r10425 r10786 100 100 IF( iom_use('snwthic' ) ) CALL iom_put( "snwthic", hm_s * zmsk00 ) ! snw thickness 101 101 IF( iom_use('icebrv' ) ) CALL iom_put( "icebrv" , bvm_i * zmsk00 * 100. ) ! brine volume 102 IF( iom_use('iceage' ) ) CALL iom_put( "iceage" , om_i * zmsk 00/ rday ) ! ice age102 IF( iom_use('iceage' ) ) CALL iom_put( "iceage" , om_i * zmsk15 / rday ) ! ice age 103 103 IF( iom_use('icehnew' ) ) CALL iom_put( "icehnew", ht_i_new ) ! new ice thickness formed in the leads 104 104 IF( iom_use('snwvolu' ) ) CALL iom_put( "snwvolu", vt_s * zmsksn ) ! snow volume
Note: See TracChangeset
for help on using the changeset viewer.