Changeset 13710 for NEMO/branches/2020/dev_r12702_ASINTER-02_emanuelaclementi_Waves/src/ICE/icevar.F90
- Timestamp:
- 2020-11-02T10:56:42+01:00 (4 years ago)
- Location:
- NEMO/branches/2020/dev_r12702_ASINTER-02_emanuelaclementi_Waves
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r12702_ASINTER-02_emanuelaclementi_Waves
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 8 9 9 # SETTE 10 ^/utils/CI/sette@ HEADsette10 ^/utils/CI/sette@13559 sette
-
- Property svn:externals
-
NEMO/branches/2020/dev_r12702_ASINTER-02_emanuelaclementi_Waves/src/ICE/icevar.F90
r12489 r13710 51 51 !! ice_var_sshdyn : compute equivalent ssh in lead 52 52 !! ice_var_itd : convert N-cat to M-cat 53 !! ice_var_snwfra : fraction of ice covered by snow 54 !! ice_var_snwblow : distribute snow fall between ice and ocean 53 55 !!---------------------------------------------------------------------- 54 56 USE dom_oce ! ocean space and time domain … … 77 79 PUBLIC ice_var_sshdyn 78 80 PUBLIC ice_var_itd 81 PUBLIC ice_var_snwfra 82 PUBLIC ice_var_snwblow 79 83 80 84 INTERFACE ice_var_itd … … 84 88 !! * Substitutions 85 89 # include "do_loop_substitute.h90" 90 91 INTERFACE ice_var_snwfra 92 MODULE PROCEDURE ice_var_snwfra_1d, ice_var_snwfra_2d, ice_var_snwfra_3d 93 END INTERFACE 94 95 INTERFACE ice_var_snwblow 96 MODULE PROCEDURE ice_var_snwblow_1d, ice_var_snwblow_2d 97 END INTERFACE 98 86 99 !!---------------------------------------------------------------------- 87 100 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 115 128 at_ip(:,:) = SUM( a_ip(:,:,:), dim=3 ) ! melt ponds 116 129 vt_ip(:,:) = SUM( v_ip(:,:,:), dim=3 ) 130 vt_il(:,:) = SUM( v_il(:,:,:), dim=3 ) 117 131 ! 118 132 ato_i(:,:) = 1._wp - at_i(:,:) ! open water fraction … … 166 180 ! 167 181 ! ! mean melt pond depth 168 WHERE( at_ip(:,:) > epsi20 ) ; hm_ip(:,:) = vt_ip(:,:) / at_ip(:,:) 169 ELSEWHERE ; hm_ip(:,:) = 0._wp 182 WHERE( at_ip(:,:) > epsi20 ) ; hm_ip(:,:) = vt_ip(:,:) / at_ip(:,:) ; hm_il(:,:) = vt_il(:,:) / at_ip(:,:) 183 ELSEWHERE ; hm_ip(:,:) = 0._wp ; hm_il(:,:) = 0._wp 170 184 END WHERE 171 185 ! … … 191 205 REAL(wp) :: zhmax, z1_zhmax ! - - 192 206 REAL(wp) :: zlay_i, zlay_s ! - - 193 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z1_a_i, z1_v_i 207 REAL(wp), PARAMETER :: zhl_max = 0.015_wp ! pond lid thickness above which the ponds disappear from the albedo calculation 208 REAL(wp), PARAMETER :: zhl_min = 0.005_wp ! pond lid thickness below which the full pond area is used in the albedo calculation 209 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z1_a_i, z1_v_i, z1_a_ip, za_s_fra 194 210 !!------------------------------------------------------------------- 195 211 … … 210 226 ELSEWHERE ; z1_v_i(:,:,:) = 0._wp 211 227 END WHERE 228 ! 229 WHERE( a_ip(:,:,:) > epsi20 ) ; z1_a_ip(:,:,:) = 1._wp / a_ip(:,:,:) 230 ELSEWHERE ; z1_a_ip(:,:,:) = 0._wp 231 END WHERE 212 232 ! !--- ice thickness 213 233 h_i(:,:,:) = v_i (:,:,:) * z1_a_i(:,:,:) … … 224 244 ! !--- ice age 225 245 o_i(:,:,:) = oa_i(:,:,:) * z1_a_i(:,:,:) 226 ! !--- pond fraction and thickness 246 ! !--- pond and lid thickness 247 h_ip(:,:,:) = v_ip(:,:,:) * z1_a_ip(:,:,:) 248 h_il(:,:,:) = v_il(:,:,:) * z1_a_ip(:,:,:) 249 ! !--- melt pond effective area (used for albedo) 227 250 a_ip_frac(:,:,:) = a_ip(:,:,:) * z1_a_i(:,:,:) 228 WHERE( a_ip_frac(:,:,:) > epsi20 ) ; h_ip(:,:,:) = v_ip(:,:,:) * z1_a_i(:,:,:) / a_ip_frac(:,:,:) 229 ELSEWHERE ; h_ip(:,:,:) = 0._wp 230 END WHERE 251 WHERE ( h_il(:,:,:) <= zhl_min ) ; a_ip_eff(:,:,:) = a_ip_frac(:,:,:) ! lid is very thin. Expose all the pond 252 ELSEWHERE( h_il(:,:,:) >= zhl_max ) ; a_ip_eff(:,:,:) = 0._wp ! lid is very thick. Cover all the pond up with ice and snow 253 ELSEWHERE ; a_ip_eff(:,:,:) = a_ip_frac(:,:,:) * & ! lid is in between. Expose part of the pond 254 & ( h_il(:,:,:) - zhl_min ) / ( zhl_max - zhl_min ) 255 END WHERE 256 ! 257 CALL ice_var_snwfra( h_s, za_s_fra ) ! calculate ice fraction covered by snow 258 a_ip_eff = MIN( a_ip_eff, 1._wp - za_s_fra ) ! make sure (a_ip_eff + a_s_fra) <= 1 231 259 ! 232 260 ! !--- salinity (with a minimum value imposed everywhere) … … 243 271 zlay_i = REAL( nlay_i , wp ) ! number of layers 244 272 DO jl = 1, jpl 245 DO_3D _11_11(1, nlay_i )273 DO_3D( 1, 1, 1, 1, 1, nlay_i ) 246 274 IF ( v_i(ji,jj,jl) > epsi20 ) THEN !--- icy area 247 275 ! … … 292 320 sv_i(:,:,:) = s_i (:,:,:) * v_i (:,:,:) 293 321 v_ip(:,:,:) = h_ip(:,:,:) * a_ip(:,:,:) 322 v_il(:,:,:) = h_il(:,:,:) * a_ip(:,:,:) 294 323 ! 295 324 END SUBROUTINE ice_var_eqv2glo … … 347 376 z1_dS = 1._wp / ( zsi1 - zsi0 ) 348 377 DO jl = 1, jpl 349 DO_2D _11_11378 DO_2D( 1, 1, 1, 1 ) 350 379 zalpha(ji,jj,jl) = MAX( 0._wp , MIN( ( zsi1 - s_i(ji,jj,jl) ) * z1_dS , 1._wp ) ) 351 380 ! ! force a constant profile when SSS too low (Baltic Sea) … … 356 385 ! Computation of the profile 357 386 DO jl = 1, jpl 358 DO_3D _11_11(1, nlay_i )387 DO_3D( 1, 1, 1, 1, 1, nlay_i ) 359 388 ! ! linear profile with 0 surface value 360 389 zs0 = z_slope_s(ji,jj,jl) * ( REAL(jk,wp) - 0.5_wp ) * h_i(ji,jj,jl) * r1_nlay_i … … 486 515 ! Zap ice energy and use ocean heat to melt ice 487 516 !----------------------------------------------------------------- 488 DO_3D _11_11(1, nlay_i )517 DO_3D( 1, 1, 1, 1, 1, nlay_i ) 489 518 ! update exchanges with ocean 490 519 hfx_res(ji,jj) = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_i(ji,jj,jk,jl) * r1_Dt_ice ! W.m-2 <0 … … 493 522 END_3D 494 523 ! 495 DO_3D _11_11(1, nlay_s )524 DO_3D( 1, 1, 1, 1, 1, nlay_s ) 496 525 ! update exchanges with ocean 497 526 hfx_res(ji,jj) = hfx_res(ji,jj) - (1._wp - zswitch(ji,jj) ) * e_s(ji,jj,jk,jl) * r1_Dt_ice ! W.m-2 <0 … … 503 532 ! zap ice and snow volume, add water and salt to ocean 504 533 !----------------------------------------------------------------- 505 DO_2D _11_11534 DO_2D( 1, 1, 1, 1 ) 506 535 ! update exchanges with ocean 507 536 sfx_res(ji,jj) = sfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * sv_i(ji,jj,jl) * rhoi * r1_Dt_ice … … 521 550 a_ip (ji,jj,jl) = a_ip (ji,jj,jl) * zswitch(ji,jj) 522 551 v_ip (ji,jj,jl) = v_ip (ji,jj,jl) * zswitch(ji,jj) 552 v_il (ji,jj,jl) = v_il (ji,jj,jl) * zswitch(ji,jj) 523 553 ! 524 554 END_2D … … 542 572 543 573 544 SUBROUTINE ice_var_zapneg( pdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )574 SUBROUTINE ice_var_zapneg( pdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 545 575 !!------------------------------------------------------------------- 546 576 !! *** ROUTINE ice_var_zapneg *** … … 557 587 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_ip ! melt pond fraction 558 588 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_ip ! melt pond volume 589 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_il ! melt pond lid volume 559 590 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s ! snw heat content 560 591 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i ! ice heat content … … 574 605 ! zap ice energy and send it to the ocean 575 606 !---------------------------------------- 576 DO_3D _11_11(1, nlay_i )607 DO_3D( 1, 1, 1, 1, 1, nlay_i ) 577 608 IF( pe_i(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 578 609 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * z1_dt ! W.m-2 >0 … … 581 612 END_3D 582 613 ! 583 DO_3D _11_11(1, nlay_s )614 DO_3D( 1, 1, 1, 1, 1, nlay_s ) 584 615 IF( pe_s(ji,jj,jk,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 585 616 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * z1_dt ! W.m-2 <0 … … 591 622 ! zap ice and snow volume, add water and salt to ocean 592 623 !----------------------------------------------------- 593 DO_2D _11_11624 DO_2D( 1, 1, 1, 1 ) 594 625 IF( pv_i(ji,jj,jl) < 0._wp .OR. pa_i(ji,jj,jl) <= 0._wp ) THEN 595 626 wfx_res(ji,jj) = wfx_res(ji,jj) + pv_i (ji,jj,jl) * rhoi * z1_dt … … 613 644 WHERE( pa_ip (:,:,:) < 0._wp ) pa_ip (:,:,:) = 0._wp 614 645 WHERE( pv_ip (:,:,:) < 0._wp ) pv_ip (:,:,:) = 0._wp ! in theory one should change wfx_pnd(-) and wfx_sum(+) 615 !but it does not change conservation, so keep it this way is ok646 WHERE( pv_il (:,:,:) < 0._wp ) pv_il (:,:,:) = 0._wp ! but it does not change conservation, so keep it this way is ok 616 647 ! 617 648 END SUBROUTINE ice_var_zapneg 618 649 619 650 620 SUBROUTINE ice_var_roundoff( pa_i, pv_i, pv_s, psv_i, poa_i, pa_ip, pv_ip, p e_s, pe_i )651 SUBROUTINE ice_var_roundoff( pa_i, pv_i, pv_s, psv_i, poa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 621 652 !!------------------------------------------------------------------- 622 653 !! *** ROUTINE ice_var_roundoff *** … … 631 662 REAL(wp), DIMENSION(:,:) , INTENT(inout) :: pa_ip ! melt pond fraction 632 663 REAL(wp), DIMENSION(:,:) , INTENT(inout) :: pv_ip ! melt pond volume 664 REAL(wp), DIMENSION(:,:) , INTENT(inout) :: pv_il ! melt pond lid volume 633 665 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pe_s ! snw heat content 634 666 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pe_i ! ice heat content 635 667 !!------------------------------------------------------------------- 636 668 ! 637 WHERE( pa_i (1:npti,:) < 0._wp .AND. pa_i (1:npti,:) > -epsi10 ) pa_i (1:npti,:) = 0._wp ! a_i must be >= 0 638 WHERE( pv_i (1:npti,:) < 0._wp .AND. pv_i (1:npti,:) > -epsi10 ) pv_i (1:npti,:) = 0._wp ! v_i must be >= 0 639 WHERE( pv_s (1:npti,:) < 0._wp .AND. pv_s (1:npti,:) > -epsi10 ) pv_s (1:npti,:) = 0._wp ! v_s must be >= 0 640 WHERE( psv_i(1:npti,:) < 0._wp .AND. psv_i(1:npti,:) > -epsi10 ) psv_i(1:npti,:) = 0._wp ! sv_i must be >= 0 641 WHERE( poa_i(1:npti,:) < 0._wp .AND. poa_i(1:npti,:) > -epsi10 ) poa_i(1:npti,:) = 0._wp ! oa_i must be >= 0 642 WHERE( pe_i (1:npti,:,:) < 0._wp .AND. pe_i (1:npti,:,:) > -epsi06 ) pe_i (1:npti,:,:) = 0._wp ! e_i must be >= 0 643 WHERE( pe_s (1:npti,:,:) < 0._wp .AND. pe_s (1:npti,:,:) > -epsi06 ) pe_s (1:npti,:,:) = 0._wp ! e_s must be >= 0 644 IF( ln_pnd_H12 ) THEN 645 WHERE( pa_ip(1:npti,:) < 0._wp .AND. pa_ip(1:npti,:) > -epsi10 ) pa_ip(1:npti,:) = 0._wp ! a_ip must be >= 0 646 WHERE( pv_ip(1:npti,:) < 0._wp .AND. pv_ip(1:npti,:) > -epsi10 ) pv_ip(1:npti,:) = 0._wp ! v_ip must be >= 0 669 670 WHERE( pa_i (1:npti,:) < 0._wp ) pa_i (1:npti,:) = 0._wp ! a_i must be >= 0 671 WHERE( pv_i (1:npti,:) < 0._wp ) pv_i (1:npti,:) = 0._wp ! v_i must be >= 0 672 WHERE( pv_s (1:npti,:) < 0._wp ) pv_s (1:npti,:) = 0._wp ! v_s must be >= 0 673 WHERE( psv_i(1:npti,:) < 0._wp ) psv_i(1:npti,:) = 0._wp ! sv_i must be >= 0 674 WHERE( poa_i(1:npti,:) < 0._wp ) poa_i(1:npti,:) = 0._wp ! oa_i must be >= 0 675 WHERE( pe_i (1:npti,:,:) < 0._wp ) pe_i (1:npti,:,:) = 0._wp ! e_i must be >= 0 676 WHERE( pe_s (1:npti,:,:) < 0._wp ) pe_s (1:npti,:,:) = 0._wp ! e_s must be >= 0 677 IF( ln_pnd_LEV ) THEN 678 WHERE( pa_ip(1:npti,:) < 0._wp ) pa_ip(1:npti,:) = 0._wp ! a_ip must be >= 0 679 WHERE( pv_ip(1:npti,:) < 0._wp ) pv_ip(1:npti,:) = 0._wp ! v_ip must be >= 0 680 IF( ln_pnd_lids ) THEN 681 WHERE( pv_il(1:npti,:) < 0._wp .AND. pv_il(1:npti,:) > -epsi10 ) pv_il(1:npti,:) = 0._wp ! v_il must be >= 0 682 ENDIF 647 683 ENDIF 648 684 ! … … 763 799 !! ** Purpose : converting N-cat ice to jpl ice categories 764 800 !!------------------------------------------------------------------- 765 SUBROUTINE ice_var_itd_1c1c( phti, phts, pati , ph_i, ph_s, pa_i, &766 & ptmi, ptms, ptmsu, psmi, patip, phtip, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip)801 SUBROUTINE ice_var_itd_1c1c( phti, phts, pati , ph_i, ph_s, pa_i, & 802 & ptmi, ptms, ptmsu, psmi, patip, phtip, phtil, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ) 767 803 !!------------------------------------------------------------------- 768 804 !! ** Purpose : converting 1-cat ice to 1 ice category … … 770 806 REAL(wp), DIMENSION(:), INTENT(in) :: phti, phts, pati ! input ice/snow variables 771 807 REAL(wp), DIMENSION(:), INTENT(inout) :: ph_i, ph_s, pa_i ! output ice/snow variables 772 REAL(wp), DIMENSION(:), INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip ! input ice/snow temp & sal & ponds773 REAL(wp), DIMENSION(:), INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip ! output ice/snow temp & sal & ponds808 REAL(wp), DIMENSION(:), INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip, phtil ! input ice/snow temp & sal & ponds 809 REAL(wp), DIMENSION(:), INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ! output ice/snow temp & sal & ponds 774 810 !!------------------------------------------------------------------- 775 811 ! == thickness and concentration == ! … … 785 821 pa_ip(:) = patip(:) 786 822 ph_ip(:) = phtip(:) 823 ph_il(:) = phtil(:) 787 824 788 825 END SUBROUTINE ice_var_itd_1c1c 789 826 790 SUBROUTINE ice_var_itd_Nc1c( phti, phts, pati , ph_i, ph_s, pa_i, &791 & ptmi, ptms, ptmsu, psmi, patip, phtip, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip)827 SUBROUTINE ice_var_itd_Nc1c( phti, phts, pati , ph_i, ph_s, pa_i, & 828 & ptmi, ptms, ptmsu, psmi, patip, phtip, phtil, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ) 792 829 !!------------------------------------------------------------------- 793 830 !! ** Purpose : converting N-cat ice to 1 ice category … … 795 832 REAL(wp), DIMENSION(:,:), INTENT(in) :: phti, phts, pati ! input ice/snow variables 796 833 REAL(wp), DIMENSION(:) , INTENT(inout) :: ph_i, ph_s, pa_i ! output ice/snow variables 797 REAL(wp), DIMENSION(:,:), INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip ! input ice/snow temp & sal & ponds798 REAL(wp), DIMENSION(:) , INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip ! output ice/snow temp & sal & ponds834 REAL(wp), DIMENSION(:,:), INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip, phtil ! input ice/snow temp & sal & ponds 835 REAL(wp), DIMENSION(:) , INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ! output ice/snow temp & sal & ponds 799 836 ! 800 837 REAL(wp), ALLOCATABLE, DIMENSION(:) :: z1_ai, z1_vi, z1_vs … … 831 868 ! == ponds == ! 832 869 pa_ip(:) = SUM( patip(:,:), dim=2 ) 833 WHERE( pa_ip(:) /= 0._wp ) ; ph_ip(:) = SUM( phtip(:,:) * patip(:,:), dim=2 ) / pa_ip(:) 834 ELSEWHERE ; ph_ip(:) = 0._wp 870 WHERE( pa_ip(:) /= 0._wp ) 871 ph_ip(:) = SUM( phtip(:,:) * patip(:,:), dim=2 ) / pa_ip(:) 872 ph_il(:) = SUM( phtil(:,:) * patip(:,:), dim=2 ) / pa_ip(:) 873 ELSEWHERE 874 ph_ip(:) = 0._wp 875 ph_il(:) = 0._wp 835 876 END WHERE 836 877 ! … … 839 880 END SUBROUTINE ice_var_itd_Nc1c 840 881 841 SUBROUTINE ice_var_itd_1cMc( phti, phts, pati , ph_i, ph_s, pa_i, &842 & ptmi, ptms, ptmsu, psmi, patip, phtip, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip)882 SUBROUTINE ice_var_itd_1cMc( phti, phts, pati , ph_i, ph_s, pa_i, & 883 & ptmi, ptms, ptmsu, psmi, patip, phtip, phtil, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ) 843 884 !!------------------------------------------------------------------- 844 885 !! … … 862 903 REAL(wp), DIMENSION(:), INTENT(in) :: phti, phts, pati ! input ice/snow variables 863 904 REAL(wp), DIMENSION(:,:), INTENT(inout) :: ph_i, ph_s, pa_i ! output ice/snow variables 864 REAL(wp), DIMENSION(:) , INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip ! input ice/snow temp & sal & ponds865 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip ! output ice/snow temp & sal & ponds905 REAL(wp), DIMENSION(:) , INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip, phtil ! input ice/snow temp & sal & ponds 906 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ! output ice/snow temp & sal & ponds 866 907 ! 867 908 REAL(wp), ALLOCATABLE, DIMENSION(:) :: zfra, z1_hti … … 953 994 pt_su(:,jl) = ptmsu(:) 954 995 ps_i (:,jl) = psmi (:) 955 ps_i (:,jl) = psmi (:)956 996 END DO 957 997 ! … … 974 1014 END WHERE 975 1015 END DO 1016 ! keep the same v_il/v_i ratio for each category 1017 WHERE( ( phti(:) * pati(:) ) /= 0._wp ) ; zfra(:) = ( phtil(:) * patip(:) ) / ( phti(:) * pati(:) ) 1018 ELSEWHERE ; zfra(:) = 0._wp 1019 END WHERE 1020 DO jl = 1, jpl 1021 WHERE( pa_ip(:,jl) /= 0._wp ) ; ph_il(:,jl) = zfra(:) * ( ph_i(:,jl) * pa_i(:,jl) ) / pa_ip(:,jl) 1022 ELSEWHERE ; ph_il(:,jl) = 0._wp 1023 END WHERE 1024 END DO 976 1025 DEALLOCATE( zfra ) 977 1026 ! 978 1027 END SUBROUTINE ice_var_itd_1cMc 979 1028 980 SUBROUTINE ice_var_itd_NcMc( phti, phts, pati , ph_i, ph_s, pa_i, &981 & ptmi, ptms, ptmsu, psmi, patip, phtip, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip)1029 SUBROUTINE ice_var_itd_NcMc( phti, phts, pati , ph_i, ph_s, pa_i, & 1030 & ptmi, ptms, ptmsu, psmi, patip, phtip, phtil, pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ) 982 1031 !!------------------------------------------------------------------- 983 1032 !! … … 994 1043 !! 995 1044 !! 2) Expand the filling to the cat jlmin-1 and jlmax+1 996 1045 !! by removing 25% ice area from jlmin and jlmax (resp.) 997 1046 !! 998 1047 !! 3) Expand the filling to the empty cat between jlmin and jlmax … … 1010 1059 REAL(wp), DIMENSION(:,:), INTENT(in) :: phti, phts, pati ! input ice/snow variables 1011 1060 REAL(wp), DIMENSION(:,:), INTENT(inout) :: ph_i, ph_s, pa_i ! output ice/snow variables 1012 REAL(wp), DIMENSION(:,:), INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip ! input ice/snow temp & sal & ponds1013 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip ! output ice/snow temp & sal & ponds1061 REAL(wp), DIMENSION(:,:), INTENT(in) :: ptmi, ptms, ptmsu, psmi, patip, phtip, phtil ! input ice/snow temp & sal & ponds 1062 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt_i, pt_s, pt_su, ps_i, pa_ip, ph_ip, ph_il ! output ice/snow temp & sal & ponds 1014 1063 ! 1015 1064 INTEGER , ALLOCATABLE, DIMENSION(:,:) :: jlfil, jlfil2 … … 1040 1089 pa_ip(:,:) = patip(:,:) 1041 1090 ph_ip(:,:) = phtip(:,:) 1091 ph_il(:,:) = phtil(:,:) 1042 1092 ! ! ---------------------- ! 1043 1093 ELSEIF( icat == 1 ) THEN ! input cat = 1 ! … … 1045 1095 CALL ice_var_itd_1cMc( phti(:,1), phts(:,1), pati (:,1), & 1046 1096 & ph_i(:,:), ph_s(:,:), pa_i (:,:), & 1047 & ptmi(:,1), ptms(:,1), ptmsu(:,1), psmi(:,1), patip(:,1), phtip(:,1), &1048 & pt_i(:,:), pt_s(:,:), pt_su(:,:), ps_i(:,:), pa_ip(:,:), ph_ip(:,:) )1097 & ptmi(:,1), ptms(:,1), ptmsu(:,1), psmi(:,1), patip(:,1), phtip(:,1), phtil(:,1), & 1098 & pt_i(:,:), pt_s(:,:), pt_su(:,:), ps_i(:,:), pa_ip(:,:), ph_ip(:,:), ph_il(:,:) ) 1049 1099 ! ! ---------------------- ! 1050 1100 ELSEIF( jpl == 1 ) THEN ! output cat = 1 ! … … 1052 1102 CALL ice_var_itd_Nc1c( phti(:,:), phts(:,:), pati (:,:), & 1053 1103 & ph_i(:,1), ph_s(:,1), pa_i (:,1), & 1054 & ptmi(:,:), ptms(:,:), ptmsu(:,:), psmi(:,:), patip(:,:), phtip(:,:), &1055 & pt_i(:,1), pt_s(:,1), pt_su(:,1), ps_i(:,1), pa_ip(:,1), ph_ip(:,1) )1104 & ptmi(:,:), ptms(:,:), ptmsu(:,:), psmi(:,:), patip(:,:), phtip(:,:), phtil(:,:), & 1105 & pt_i(:,1), pt_s(:,1), pt_su(:,1), ps_i(:,1), pa_ip(:,1), ph_ip(:,1), ph_il(:,1) ) 1056 1106 ! ! ----------------------- ! 1057 1107 ELSE ! input cat /= output cat ! … … 1195 1245 END WHERE 1196 1246 END DO 1247 ! keep the same v_il/v_i ratio for each category 1248 WHERE( SUM( phti(:,:) * pati(:,:), dim=2 ) /= 0._wp ) 1249 zfra(:) = SUM( phtil(:,:) * patip(:,:), dim=2 ) / SUM( phti(:,:) * pati(:,:), dim=2 ) 1250 ELSEWHERE 1251 zfra(:) = 0._wp 1252 END WHERE 1253 DO jl = 1, jpl 1254 WHERE( pa_ip(:,jl) /= 0._wp ) ; ph_il(:,jl) = zfra(:) * ( ph_i(:,jl) * pa_i(:,jl) ) / pa_ip(:,jl) 1255 ELSEWHERE ; ph_il(:,jl) = 0._wp 1256 END WHERE 1257 END DO 1197 1258 DEALLOCATE( zfra ) 1198 1259 ! … … 1200 1261 ! 1201 1262 END SUBROUTINE ice_var_itd_NcMc 1263 1264 !!------------------------------------------------------------------- 1265 !! INTERFACE ice_var_snwfra 1266 !! 1267 !! ** Purpose : fraction of ice covered by snow 1268 !! 1269 !! ** Method : In absence of proper snow model on top of sea ice, 1270 !! we argue that snow does not cover the whole ice because 1271 !! of wind blowing... 1272 !! 1273 !! ** Arguments : ph_s: snow thickness 1274 !! 1275 !! ** Output : pa_s_fra: fraction of ice covered by snow 1276 !! 1277 !!------------------------------------------------------------------- 1278 SUBROUTINE ice_var_snwfra_3d( ph_s, pa_s_fra ) 1279 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: ph_s ! snow thickness 1280 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: pa_s_fra ! ice fraction covered by snow 1281 IF ( nn_snwfra == 0 ) THEN ! basic 0 or 1 snow cover 1282 WHERE( ph_s > 0._wp ) ; pa_s_fra = 1._wp 1283 ELSEWHERE ; pa_s_fra = 0._wp 1284 END WHERE 1285 ELSEIF( nn_snwfra == 1 ) THEN ! snow cover depends on hsnow (met-office style) 1286 pa_s_fra = 1._wp - EXP( -0.2_wp * rhos * ph_s ) 1287 ELSEIF( nn_snwfra == 2 ) THEN ! snow cover depends on hsnow (cice style) 1288 pa_s_fra = ph_s / ( ph_s + 0.02_wp ) 1289 ENDIF 1290 END SUBROUTINE ice_var_snwfra_3d 1291 1292 SUBROUTINE ice_var_snwfra_2d( ph_s, pa_s_fra ) 1293 REAL(wp), DIMENSION(:,:), INTENT(in ) :: ph_s ! snow thickness 1294 REAL(wp), DIMENSION(:,:), INTENT( out) :: pa_s_fra ! ice fraction covered by snow 1295 IF ( nn_snwfra == 0 ) THEN ! basic 0 or 1 snow cover 1296 WHERE( ph_s > 0._wp ) ; pa_s_fra = 1._wp 1297 ELSEWHERE ; pa_s_fra = 0._wp 1298 END WHERE 1299 ELSEIF( nn_snwfra == 1 ) THEN ! snow cover depends on hsnow (met-office style) 1300 pa_s_fra = 1._wp - EXP( -0.2_wp * rhos * ph_s ) 1301 ELSEIF( nn_snwfra == 2 ) THEN ! snow cover depends on hsnow (cice style) 1302 pa_s_fra = ph_s / ( ph_s + 0.02_wp ) 1303 ENDIF 1304 END SUBROUTINE ice_var_snwfra_2d 1305 1306 SUBROUTINE ice_var_snwfra_1d( ph_s, pa_s_fra ) 1307 REAL(wp), DIMENSION(:), INTENT(in ) :: ph_s ! snow thickness 1308 REAL(wp), DIMENSION(:), INTENT( out) :: pa_s_fra ! ice fraction covered by snow 1309 IF ( nn_snwfra == 0 ) THEN ! basic 0 or 1 snow cover 1310 WHERE( ph_s > 0._wp ) ; pa_s_fra = 1._wp 1311 ELSEWHERE ; pa_s_fra = 0._wp 1312 END WHERE 1313 ELSEIF( nn_snwfra == 1 ) THEN ! snow cover depends on hsnow (met-office style) 1314 pa_s_fra = 1._wp - EXP( -0.2_wp * rhos * ph_s ) 1315 ELSEIF( nn_snwfra == 2 ) THEN ! snow cover depends on hsnow (cice style) 1316 pa_s_fra = ph_s / ( ph_s + 0.02_wp ) 1317 ENDIF 1318 END SUBROUTINE ice_var_snwfra_1d 1319 1320 !!-------------------------------------------------------------------------- 1321 !! INTERFACE ice_var_snwblow 1322 !! 1323 !! ** Purpose : Compute distribution of precip over the ice 1324 !! 1325 !! Snow accumulation in one thermodynamic time step 1326 !! snowfall is partitionned between leads and ice. 1327 !! If snow fall was uniform, a fraction (1-at_i) would fall into leads 1328 !! but because of the winds, more snow falls on leads than on sea ice 1329 !! and a greater fraction (1-at_i)^beta of the total mass of snow 1330 !! (beta < 1) falls in leads. 1331 !! In reality, beta depends on wind speed, 1332 !! and should decrease with increasing wind speed but here, it is 1333 !! considered as a constant. an average value is 0.66 1334 !!-------------------------------------------------------------------------- 1335 !!gm I think it can be usefull to set this as a FUNCTION, not a SUBROUTINE.... 1336 SUBROUTINE ice_var_snwblow_2d( pin, pout ) 1337 REAL(wp), DIMENSION(:,:), INTENT(in ) :: pin ! previous fraction lead ( 1. - a_i_b ) 1338 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pout 1339 pout = ( 1._wp - ( pin )**rn_snwblow ) 1340 END SUBROUTINE ice_var_snwblow_2d 1341 1342 SUBROUTINE ice_var_snwblow_1d( pin, pout ) 1343 REAL(wp), DIMENSION(:), INTENT(in ) :: pin 1344 REAL(wp), DIMENSION(:), INTENT(inout) :: pout 1345 pout = ( 1._wp - ( pin )**rn_snwblow ) 1346 END SUBROUTINE ice_var_snwblow_1d 1202 1347 1203 1348 #else
Note: See TracChangeset
for help on using the changeset viewer.