- Timestamp:
- 2013-12-11T15:38:42+01:00 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r4028_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limcat_1D.F90
r4099 r4332 44 44 REAL(wp), DIMENSION(:), INTENT(in) :: zhti, zhts, zai ! input ice/snow variables 45 45 REAL(wp), DIMENSION(:,:), INTENT(inout) :: zht_i, zht_s, za_i ! output ice/snow variables 46 REAL(wp) :: epsi06 = 1.0e-6 47 46 REAL(wp) :: epsi06 = 1.0e-6 47 REAL(wp) :: zc1, zc2, zc3, zx1, zdh ! local scalars 48 REAL(wp), DIMENSION(0:jpl) :: zhi_max !:Boundary of ice thickness categories in thickness space 49 48 50 IF( nn_timing == 1 ) CALL timing_start('limcat_1D') 49 51 !-------------------------------------------------------------------- … … 51 53 !-------------------------------------------------------------------- 52 54 ijpij = SIZE(zhti,1) 53 zht_i(1:ijpij,1:jpl) = 0. d054 zht_s(1:ijpij,1:jpl) = 0. d055 za_i (1:ijpij,1:jpl) = 0. d055 zht_i(1:ijpij,1:jpl) = 0._wp 56 zht_s(1:ijpij,1:jpl) = 0._wp 57 za_i (1:ijpij,1:jpl) = 0._wp 56 58 57 59 !------------------------------------------------------------------------------------ … … 66 68 ! fulfills ice volume concervation between input and output (ztests=4) 67 69 !-------------------------------------------------------------------------------------- 70 71 !- Thickness categories boundaries 72 ! hi_max is calculated in iceini.F90 but since limcat_1D.F90 routine 73 ! is called before (in bdydta.F90), one must recalculate it. 74 ! Note clem: there may be a way of doing things cleaner 75 !---------------------------------- 76 zhi_max(:) = 0._wp 77 zc1 = 3._wp / REAL( jpl , wp ) ; zc2 = 10._wp * zc1 ; zc3 = 3._wp 78 DO jl = 1, jpl 79 zx1 = REAL( jl-1 , wp ) / REAL( jpl , wp ) 80 zhi_max(jl) = zhi_max(jl-1) + zc1 + zc2 * ( 1._wp + TANH( zc3 * ( zx1 - 1._wp ) ) ) 81 END DO 68 82 69 83 ! ---------------------------------------- … … 71 85 ! ---------------------------------------- 72 86 DO ji = 1, ijpij 73 ! snow thickness in each category74 zht_s(ji,1:jpl) = zhts(ji)75 87 88 IF( zhti(ji) > 0._wp ) THEN 89 76 90 ! initialisation of tests 77 91 ztest_1 = 0 … … 87 101 88 102 ! initialisation of ice variables for each try 89 zht_i(ji,1:jpl) = 0. d090 za_i (ji,1:jpl) = 0. d0103 zht_i(ji,1:jpl) = 0._wp 104 za_i (ji,1:jpl) = 0._wp 91 105 92 106 ! *** case very thin ice: fill only category 1 … … 94 108 zht_i(ji,1) = zhti(ji) 95 109 za_i (ji,1) = zai (ji) 96 97 110 ! *** case ice is thicker: fill categories >1 98 111 ELSE … … 100 113 ! Fill ice thicknesses except the last one (i_fill) by (hmax-hmin)/2 101 114 DO jl = 1, i_fill - 1 102 zht_i(ji,jl) = ( hi_max(jl) + hi_max(jl-1) ) / 2.115 zht_i(ji,jl) = ( zhi_max(jl) + zhi_max(jl-1) ) * 0.5_wp 103 116 END DO 104 117 … … 106 119 jl0 = i_fill 107 120 DO jl = 1, i_fill 108 IF ( ( zhti(ji) >= hi_max(jl-1) ) .AND. ( zhti(ji) <hi_max(jl) ) ) THEN121 IF ( ( zhti(ji) >= zhi_max(jl-1) ) .AND. ( zhti(ji) < zhi_max(jl) ) ) THEN 109 122 jl0 = jl 110 123 CYCLE … … 116 129 DO jl = 1, i_fill - 1 117 130 IF ( jl == jl0 ) CYCLE 118 zarg = ( zht_i(ji,jl) - zhti(ji) ) / ( zhti(ji) / 2.)131 zarg = ( zht_i(ji,jl) - zhti(ji) ) / ( zhti(ji) * 0.5_wp ) 119 132 za_i(ji,jl) = za_i (ji,jl0) * EXP(-zarg**2) 120 133 END DO … … 141 154 142 155 ! Test 3: thickness of the last category is in-bounds ? 143 IF ( zht_i(ji,i_fill) >= hi_max(i_fill-1) ) ztest_3 = 1156 IF ( zht_i(ji,i_fill) >= zhi_max(i_fill-1) ) ztest_3 = 1 144 157 145 158 ! Test 4: positivity of ice concentrations 146 159 ztest_4 = 1 147 160 DO jl = 1, i_fill 148 IF ( za_i(ji,jl) < 0. 0d0) ztest_4 = 0161 IF ( za_i(ji,jl) < 0._wp ) ztest_4 = 0 149 162 END DO 150 163 … … 164 177 ! WRITE(numout,*) 'za_i(ji,jpl)=',za_i(ji,:) 165 178 !ENDIF 166 179 180 ENDIF ! if zhti > 0 181 167 182 END DO ! i loop 183 184 ! ------------------------------------------------ 185 ! Adding Snow in each category where za_i is not 0 186 ! ------------------------------------------------ 187 DO jl = 1, jpl 188 DO ji = 1, ijpij 189 IF( za_i(ji,jl) > 0._wp ) THEN 190 zht_s(ji,jl) = zht_i(ji,jl) * ( zhts(ji) / zhti(ji) ) 191 ! In case snow load is in excess that would lead to transformation from snow to ice 192 ! Then, transfer the snow excess into the ice (different from limthd_dh) 193 zdh = MAX( 0._wp, ( rhosn * zht_s(ji,jl) + ( rhoic - rau0 ) * zht_i(ji,jl) ) * r1_rau0 ) 194 ! recompute ht_i, ht_s avoiding out of bounds values 195 zht_i(ji,jl) = MIN( zhi_max(jl), zht_i(ji,jl) + zdh ) 196 zht_s(ji,jl) = MAX( 0._wp, zht_s(ji,jl) - zdh * rhoic / rhosn ) 197 ENDIF 198 ENDDO 199 ENDDO 168 200 169 201 IF( nn_timing == 1 ) CALL timing_stop('limcat_1D')
Note: See TracChangeset
for help on using the changeset viewer.