00001
00002
00003
00004 subroutine update(sib,sib_loc)
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 use kinds
00042 use sibtype
00043 use sib_const_module, only: &
00044 snofac, &
00045 nsoil, &
00046 snomel, &
00047 denh2o, &
00048 denice, &
00049 phmin, &
00050 dtt, &
00051 dti, &
00052 tkair, &
00053 tkice, &
00054 cpliq, &
00055 cpice
00056
00057 use physical_parameters, only: &
00058 hltm, &
00059 pi, &
00060 tice, &
00061 cp => spec_heat_cp
00062
00063 use eau_params, only : &
00064 lfus
00065
00066
00067 implicit none
00068
00069
00070
00071 type(sib_t), intent(inout) :: sib
00072 type(sib_local_vars) ,intent(inout) :: sib_loc
00073
00074
00075
00076
00077
00078
00079
00080 real(kind=dbl_kind) :: flux_imb(sib%prog%nsl+1:nsoil)
00081 real(kind=dbl_kind) :: water_imb(sib%prog%nsl+1:nsoil)
00082 real(kind=dbl_kind) :: wice0(sib%prog%nsl+1:nsoil)
00083 real(kind=dbl_kind) :: wliq0(sib%prog%nsl+1:nsoil)
00084 real(kind=dbl_kind) :: wmass(sib%prog%nsl+1:nsoil)
00085 real(kind=dbl_kind) :: sflux(sib%prog%nsl+1:nsoil)
00086 real(kind=dbl_kind) :: sflx1(sib%prog%nsl+1:nsoil)
00087 real(kind=dbl_kind) :: htstor(sib%prog%nsl+1:nsoil)
00088 real(kind=dbl_kind) :: rsnow
00089 real(kind=dbl_kind) :: ecpot
00090 real(kind=dbl_kind) :: egpot
00091 real(kind=dbl_kind) :: espot
00092 real(kind=dbl_kind) :: hrr
00093 real(kind=dbl_kind) :: cogs1
00094 real(kind=dbl_kind) :: cogs2
00095 real(kind=dbl_kind) :: ectmax(nsoil)
00096 real(kind=dbl_kind) :: ectmax_tot
00097 real(kind=dbl_kind) :: egsmax
00098 real(kind=dbl_kind) :: ect_layer
00099 real(kind=dbl_kind) :: ect_diff
00100 real(kind=dbl_kind) :: facks
00101 real(kind=dbl_kind) :: cpdpsy
00102 real(kind=dbl_kind) :: timcon
00103 real(kind=dbl_kind) :: hltmi
00104 real(kind=dbl_kind) :: hfus
00105 real(kind=dbl_kind) :: ecidif
00106 real(kind=dbl_kind) :: egidif
00107 real(kind=dbl_kind) :: ecit
00108 real(kind=dbl_kind) :: egit
00109 real(kind=dbl_kind) :: temp
00110 real(kind=dbl_kind) :: propor
00111 real(kind=dbl_kind) :: heatr
00112 real(kind=dbl_kind) :: le_phase
00113
00114 real(kind=dbl_kind) :: btran
00115 real(kind=dbl_kind) :: s_node
00116 real(kind=dbl_kind) :: rresis(nsoil)
00117 real(kind=dbl_kind) :: smp_node
00118 real(kind=dbl_kind) :: tinc(sib%prog%nsl+1:nsoil)
00119 real(kind=dbl_kind) :: shcap_temp
00120
00121 real(kind=dbl_kind), dimension(-nsnow+1:nsoil) ::
00122 thk
00123
00124 real(kind=dbl_kind) :: bw
00125
00126 integer(kind=int_kind) :: i,j
00127
00128
00129
00130
00131
00132
00133 timcon = pi / 86400.0
00134
00135 hltmi = 1. / hltm
00136
00137 hfus = snomel/1000.0
00138
00139 cpdpsy = cp/sib%diag%psy
00140
00141 if(sib%prog%nsl < 0) then
00142 wice0(1) = 0.0
00143 wliq0(1) = 0.0
00144 do i=sib%prog%nsl+1,0,-1
00145 wice0(1) = wice0(1) + sib%prog%www_ice(i)
00146 wliq0(1) = wliq0(1) + sib%prog%www_liq(i)
00147 enddo
00148
00149 if (wliq0(1) > 0.0 ) then
00150 rsnow = wice0(1) / (wliq0(1) + sib%prog%capac(2) )
00151 else
00152 rsnow = 1.0
00153 endif
00154 wice0(1) = 0.0
00155 wliq0(1) = 0.0
00156 else
00157 rsnow = 0.0
00158 endif
00159
00160
00161 do i = sib%prog%nsl+1,nsoil
00162 sib%prog%vol_ice(i) = min(sib%param%poros, sib%prog%www_ice(i)/(sib%prog%dz(i)*denice))
00163 sib%diag%eff_poros(i) = sib%param%poros - sib%prog%vol_ice(i)
00164 sib%prog%vol_liq(i) = min(sib%diag%eff_poros(i), &
00165 sib%prog%www_liq(i)/(sib%prog%dz(i)*denh2o))
00166
00167
00168 if (sib%prog%vol_liq(i) == 0.0 .and. sib%prog%www_liq(i) > 0.0 ) then
00169 sib%diag%roff = sib%diag%roff + sib%prog%www_liq(i)
00170 sib%prog%www_liq(i) = 0.0
00171 endif
00172 enddo
00173
00174
00175 sib%diag%www_tot_soil = 0.0
00176 do i=1,nsoil
00177 sib%diag%www_tot_soil = sib%diag%www_tot_soil + &
00178 sib%prog%www_liq(i) + sib%prog%www_ice(i)
00179 enddo
00180
00181
00182
00183
00184
00185
00186 ecpot = (sib_loc%etc + sib_loc%getc*sib_loc%dtc) - sib%prog%ea
00187
00188
00189
00190
00191 sib%diag%eci = ecpot * sib_loc%geci * sib%prog%ros * cpdpsy * dtt
00192
00193
00194
00195 sib%diag%ect = ecpot * sib_loc%gect * sib%prog%ros * cpdpsy * dtt
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 if(sib%prog%nsl == 0 ) then
00206 egpot = (sib_loc%etg + sib_loc%getg*sib_loc%dtd(sib%prog%nsl+1)) - sib%prog%ea
00207 espot = 0.0
00208 sib%diag%ess = 0.0
00209
00210
00211 hrr = sib%diag%hr
00212 if ( sib_loc%fg < 0.5_dbl_kind ) hrr = 1.
00213
00214 cogs1 = sib_loc%gegs * hrr
00215 cogs2 = sib_loc%gegs
00216
00217
00218 sib%diag%egs = ((sib_loc%etg + sib_loc%getg * sib_loc%dtd(sib%prog%nsl+1)) * cogs1 &
00219 -sib%prog%ea * cogs2 ) * sib%prog%ros * cpdpsy *dtt
00220
00221 egsmax = 0.5_dbl_kind * (sib%prog%www_liq(1) + sib%prog%www_ice(1))
00222 egsmax = egsmax * hltm
00223 egsmax = max(egsmax,0.0_dbl_kind)
00224
00225 sib%diag%egs = min( sib%diag%egs, egsmax )
00226
00227
00228 sib%diag%egi = egpot * sib_loc%gegi * sib%prog%ros * cpdpsy * dtt
00229
00230 else
00231
00232
00233
00234
00235
00236
00237 egpot = 0.0
00238 espot = (sib_loc%ets + sib_loc%gets* sib_loc%dtd(sib%prog%nsl+1)) - sib%prog%ea
00239 sib%diag%egs = 0.0
00240 sib%diag%egi = 0.0
00241
00242
00243
00244
00245 sib%diag%ess = espot * sib%prog%ros * cpdpsy / sib%diag%rd / snofac * dtt
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 sib%diag%ess = min(sib%diag%ess,sib%prog%www_ice(sib%prog%nsl+1)/ snofac*hltm)
00256
00257
00258 sib%prog%www_ice(sib%prog%nsl+1) = sib%prog%www_ice(sib%prog%nsl+1) - sib%diag%ess * snofac /hltm
00259
00260 if(sib%prog%www_ice(sib%prog%nsl+1) == 0.0 ) then
00261 if(sib%prog%www_liq(sib%prog%nsl+1) > 0.0) then
00262 sib%prog%capac(2) = sib%prog%capac(2) + &
00263 sib%prog%www_liq(sib%prog%nsl+1)
00264 sib%prog%www_liq(sib%prog%nsl+1) = 0.0
00265 sib%prog%vol_liq(sib%prog%nsl+1) = 0.0
00266 sib%prog%td(sib%prog%nsl+1) = 0.0
00267 endif
00268 sib%prog%dz(sib%prog%nsl+1) = 0.0
00269 sib%prog%node_z(sib%prog%nsl+1) = 0.0
00270 sib%prog%layer_z(sib%prog%nsl) = 0.0
00271 sib%prog%nsl = sib%prog%nsl + 1
00272 endif
00273
00274 endif
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 ectmax(:) = 0.0
00292 ectmax_tot = 0.0
00293
00294 do i=1,nsoil
00295 ectmax(i) = sib%diag%paw(i) * denh2o * sib%prog%dz(i) * hltm
00296 ectmax_tot = ectmax_tot + ectmax(i)
00297 enddo
00298
00299
00300
00301
00302 sib%diag%ect = min ( ectmax_tot, sib%diag%ect )
00303
00304
00305
00306
00307
00308
00309 btran = 1.0E-10
00310
00311
00312 if(sib%diag%egs > 0.0 )then
00313 if(sib%prog%www_liq(1) > 1.0E-10) then
00314 if( (sib%diag%egs + sib%diag%ect*sib%param%rootf(1)) > egsmax ) then
00315 sib%param%rootr(1) = (0.5_dbl_kind * sib%prog%www_liq(1) * hltm - &
00316 sib%diag%egs)/sib%diag%ect
00317 sib%param%rootr(1) = MIN(sib%param%rootr(1), 1.0_dbl_kind)
00318 sib%param%rootr(1) = MAX(sib%param%rootr(1), 0.0_dbl_kind)
00319 sib%param%rootr(1) = sib%param%rootr(1) * sib%param%rootf(1)
00320 if(sib%prog%www_liq(1) <= sib%param%vwcmin) sib%param%rootr(1) = 0.0_dbl_kind
00321
00322 else
00323
00324
00325 sib%param%rootr(1) = (1.0 - sib%param%vwcmin/sib%prog%vol_liq(1)) / &
00326 (1.0 - sib%param%vwcmin/sib%param%fieldcap)
00327 sib%param%rootr(1) = MIN(sib%param%rootr(1), 1.0_dbl_kind)
00328 sib%param%rootr(1) = MAX(sib%param%rootr(1), 0.0_dbl_kind)
00329 sib%param%rootr(1) = sib%param%rootr(1) * sib%param%rootf(1)
00330 endif
00331 else
00332 sib%param%rootr(1) = 0.0
00333 endif
00334 else
00335 if(sib%prog%www_liq(1) > 1.0E-10) then
00336 sib%param%rootr(1) = (1.0 - sib%param%vwcmin/sib%prog%vol_liq(1)) / &
00337 (1.0 - sib%param%vwcmin/sib%param%fieldcap)
00338 sib%param%rootr(1) = MIN(sib%param%rootr(1), 1.0_dbl_kind)
00339 sib%param%rootr(1) = MAX(sib%param%rootr(1), 0.0_dbl_kind)
00340 sib%param%rootr(1) = sib%param%rootr(1) * sib%param%rootf(1)
00341 else
00342 sib%param%rootr(1) = 0.0
00343 endif
00344 endif
00345
00346
00347
00348
00349 if(sib%prog%td(1) < tice) sib%param%rootr(1) = 0.0
00350 btran = btran + sib%param%rootr(1)
00351
00352
00353 do i=2,nsoil
00354 if(sib%prog%td(i) >= tice .and. sib%prog%vol_liq(i) > 0.0 ) then
00355 sib%param%rootr(i) = (1.0 - sib%param%vwcmin/sib%prog%vol_liq(i)) / &
00356 (1.0 - sib%param%vwcmin/sib%param%fieldcap)
00357
00358 sib%param%rootr(i) = MIN(sib%param%rootr(i), 1.0_dbl_kind)
00359 sib%param%rootr(i) = MAX(sib%param%rootr(i), 0.0_dbl_kind)
00360
00361 sib%param%rootr(i) = sib%param%rootr(i) * sib%param%rootf(i)
00362 btran = btran + sib%param%rootr(i)
00363 else
00364 sib%param%rootr(i) = 0.0
00365 endif
00366 enddo
00367
00368
00369 do i=1,nsoil
00370 sib%param%rootr(i) = sib%param%rootr(i) / btran
00371 sib%param%rootr(i) = max(sib%param%rootr(i), 0.0_dbl_kind)
00372 enddo
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391 ecidif=MAX(0.0_dbl_kind,(sib%diag%eci - sib%prog%snow_veg * hltm - &
00392 sib%prog%capac(1) * hltm))
00393
00394
00395 ecit = MIN(sib%diag%eci, &
00396 ( sib%prog%snow_veg*hltm + sib%prog%capac(1) * hltm))
00397
00398
00399 egidif= &
00400 MAX(0.0_dbl_kind,sib%diag%egi-(sib%prog%snow_mass + &
00401 sib%prog%capac(2)) * hltm) * (1.-rsnow)
00402
00403
00404 egit = &
00405 MIN(sib%diag%egi, ((sib%prog%snow_mass + &
00406 sib%prog%capac(2)) * hltm + sib%diag%ess) ) * (1.-rsnow)
00407
00408
00409
00410
00411
00412 sib%prog%capac(2) = sib%prog%capac(2) - egit * (1.0-rsnow) * hltmi
00413
00414
00415 sib%prog%www_liq(nsoil)=sib%prog%www_liq(nsoil)-egidif * hltmi
00416
00417
00418 sib%diag%egmass = sib%diag%egi*facks * hltmi
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431 sib%diag%hc = ( sib%prog%tc - sib%prog%ta) /sib%diag%rb &
00432 * sib%prog%ros * cp * dtt
00433
00434 sib%diag%chf = sib%param%czc * dti * sib_loc%dtc
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 if(sib%prog%nsl < 0 ) then
00446
00447
00448 sib%diag%hs = (sib%prog%td(sib%prog%nsl+1) - sib%prog%ta ) &
00449 / sib%diag%rd * sib%prog%ros * cp * dtt + egidif
00450 sib%diag%hg = 0.0
00451 else
00452 sib%diag%hg = ( sib%prog%td(1) - sib%prog%ta ) /sib%diag%rd &
00453 * sib%prog%ros * cp * dtt + egidif
00454 sib%diag%hs = 0.0
00455 endif
00456
00457
00458
00459
00460
00461
00462 if (sib%prog%nsl == 0) then
00463 sib%diag%shf = sib_loc%dtd(1) * sib%param%shcap(1) * dti + &
00464 sib%param%slamda(1) * (sib%prog%td(1) - sib%prog%td(2) )
00465 else
00466 sib%diag%shf = sib_loc%dtd(sib%prog%nsl+1) * sib%param%shcap(sib%prog%nsl+1) * dti + &
00467 sib%param%slamda(sib%prog%nsl+1) * (sib%prog%td(sib%prog%nsl+1) - sib%prog%td(sib%prog%nsl+2) )
00468 endif
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 rsnow = (sib%prog%snow_veg/denice)/ &
00495 (sib%prog%capac(1)/denh2o + sib%prog%snow_veg/denice + 1.0E-10)
00496
00497 facks = 1. + rsnow * ( snofac-1. )
00498
00499 if ( (sib%diag%ect) < 0.0) then
00500 sib%diag%eci = sib%diag%ect+sib%diag%eci
00501 ecit=ecit+sib%diag%ect
00502 sib%diag%ect = 0.
00503 facks = 1. / facks
00504 endif
00505
00506
00507
00508 sib%prog%capac(1) = sib%prog%capac(1)-(1.-rsnow)*ecit*facks*hltmi
00509 sib%prog%snow_veg = sib%prog%snow_veg - rsnow*ecit * facks * hltmi
00510 sib%prog%snow_veg = max(sib%prog%snow_veg,0.0_dbl_kind)
00511 sib%prog%capac(1) = max(sib%prog%capac(1),0.0_dbl_kind)
00512
00513
00514 sib%diag%ecmass = sib%diag%eci*facks * hltmi
00515
00516
00517 sib%prog%www_liq(nsoil) = sib%prog%www_liq(nsoil) - ecidif* hltmi
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530 sib%diag%snowmelt = 0.0
00531
00532 do j = sib%prog%nsl+1,nsoil
00533 sib_loc%imelt(j) = 0
00534 flux_imb(j) = 0.0
00535 water_imb(j) = 0.0
00536 wice0(j) = sib%prog%www_ice(j)
00537 wliq0(j) = sib%prog%www_liq(j)
00538 wmass(j) = sib%prog%www_ice(j) + sib%prog%www_liq(j)
00539 enddo
00540
00541
00542
00543 do j = sib%prog%nsl+1,nsoil-1
00544
00545
00546
00547
00548 sflux(j) = sib%param%slamda(j)*(sib_loc%td_old(j+1)-sib_loc%td_old(j))
00549
00550
00551 sflx1(j) = sib%param%slamda(j)*(sib%prog%td(j+1) -sib%prog%td(j))
00552
00553 enddo
00554
00555
00556 sflux(nsoil) = 0.0
00557 sflx1(nsoil) = 0.0
00558
00559
00560 do j = sib%prog%nsl+1,nsoil
00561
00562
00563 if(sib%prog%www_ice(j) > 0.0 .and. sib%prog%td(j) > tice) then
00564 sib_loc%imelt(j) = 1
00565 tinc(j) = sib%prog%td(j) - tice
00566 sib%prog%td(j) = tice
00567 endif
00568
00569
00570 if(sib%prog%www_liq(j) > 0.0 .and. sib%prog%td(j) < tice) then
00571 sib_loc%imelt(j) = 2
00572 tinc(j) = sib%prog%td(j) - tice
00573 sib%prog%td(j) = tice
00574 endif
00575
00576 enddo
00577
00578
00579
00580 if(sib%prog%nsl == 0 .and. sib%prog%snow_mass > 0.0_dbl_kind) then
00581 if(sib%prog%td(1) > tice) then
00582 sib_loc%imelt(1) = 1
00583 tinc(1) = sib%prog%td(1) - tice
00584 sib%prog%td(1) = tice
00585 endif
00586 endif
00587
00588
00589 do j = sib%prog%nsl + 1, nsoil
00590 htstor(j) = sib%param%shcap(j)*dti* &
00591 (sib%prog%td(j) - sib_loc%td_old(j))
00592 enddo
00593
00594
00595
00596 do j = sib%prog%nsl+1,nsoil
00597 if(sib_loc%imelt(j) > 0 ) then
00598 flux_imb(j) = tinc(j) * sib%param%shcap(j)
00599 endif
00600 enddo
00601
00602
00603
00604
00605
00606
00607 do j=sib%prog%nsl+1,nsoil
00608 if(sib_loc%imelt(j) == 1 .and. flux_imb(j) < 0.0 ) then
00609 sib_loc%imelt(j) = 0
00610 flux_imb(j) = 0.0
00611 endif
00612
00613 if(sib_loc%imelt(j) == 2 .and. flux_imb(j) > 0.0 ) then
00614 sib_loc%imelt(j) = 0
00615 flux_imb(j) = 0.0
00616 endif
00617 enddo
00618
00619
00620 do j=sib%prog%nsl+1,nsoil
00621
00622
00623 if(sib_loc%imelt(j) > 0 .and. abs(flux_imb(j))>0.0) then
00624
00625
00626
00627
00628 water_imb(j) = flux_imb(j) / lfus
00629
00630
00631
00632
00633
00634
00635
00636 if(j == 1) then
00637 if(sib%prog%nsl == 0 .and. sib%prog%snow_depth > &
00638 0.01_dbl_kind .and. water_imb(j) > 0.0_dbl_kind) then
00639
00640 temp = sib%prog%snow_mass
00641 sib%prog%snow_mass = max(0.0_dbl_kind,temp-water_imb(j))
00642 propor = sib%prog%snow_mass/temp
00643 sib%prog%snow_depth = sib%prog%snow_depth * propor
00644
00645 heatr = flux_imb(j)*dti - &
00646 lfus*(temp-sib%prog%snow_mass)*dti
00647
00648 if(heatr > 0.0) then
00649 water_imb(j) = heatr*dtt/lfus
00650 flux_imb(j) = heatr
00651 else
00652 water_imb(j) = 0.0
00653 flux_imb(j) = 0.0
00654 endif
00655
00656 sib%diag%snowmelt = max(0.0_dbl_kind, &
00657 (temp-sib%prog%snow_mass))*dti
00658 le_phase = lfus*sib%diag%snowmelt
00659 endif
00660 endif
00661
00662 heatr = 0.0
00663 if(water_imb(j) > 0.0) then
00664 sib%prog%www_ice(j) = max(0.0_dbl_kind,wice0(j)-water_imb(j))
00665 heatr = flux_imb(j)*dti &
00666 - lfus*(wice0(j)-sib%prog%www_ice(j))*dti
00667 elseif(water_imb(j) < 0.0_dbl_kind) then
00668 sib%prog%www_ice(j) = min(wmass(j),wice0(j)-water_imb(j))
00669 heatr = flux_imb(j)*dti &
00670 - lfus*(wice0(j)-sib%prog%www_ice(j))*dti
00671 endif
00672
00673 sib%prog%www_liq(j) = max(0.0_dbl_kind,wmass(j)-sib%prog%www_ice(j))
00674
00675 if(abs(heatr) > 0.0) then
00676 sib%prog%td(j) = sib%prog%td(j) + dtt*heatr/sib%param%shcap(j)
00677
00678 if(sib%prog%www_liq(j)*sib%prog%www_ice(j) > 0.0 ) &
00679 sib%prog%td(j) = tice
00680 endif
00681
00682 le_phase = le_phase + lfus*(wice0(j) - sib%prog%www_ice(j))*dti
00683
00684 if(sib_loc%imelt(j) == 1 .and. j < 1 ) then
00685 sib%diag%snowmelt = sib%diag%snowmelt + &
00686 max(0.0_dbl_kind, (wice0(j) - sib%prog%www_ice(j)))*dti
00687 endif
00688
00689
00690
00691 endif
00692 enddo
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 sib%diag%cas_e_storage = sib_loc%dta * sib%diag%cas_cap_heat * dti
00707 sib%diag%cas_w_storage = sib_loc%dea * sib%diag%cas_cap_vap * dti
00708
00709
00710
00711
00712 if (sib%prog%nsl == 0) then
00713 sib%diag%radtt(1) = sib%diag%radt(1) &
00714 - sib_loc%lcdtc*sib_loc%dtc &
00715 - sib_loc%lcdtg*sib_loc%dtd(1)
00716
00717 sib%diag%radtt(2) = sib%diag%radt(2) &
00718 - sib_loc%lgdtc*sib_loc%dtc &
00719 - sib_loc%lgdtg*sib_loc%dtd(1)
00720
00721 sib%diag%radtt(3) = 0.
00722 else
00723 sib%diag%radtt(1) = sib%diag%radt(1) &
00724 - sib_loc%lcdtc*sib_loc%dtc &
00725 - sib_loc%lcdts*sib_loc%dtd(sib%prog%nsl+1)
00726
00727 sib%diag%radtt(2) = 0.
00728
00729 sib%diag%radtt(3) = sib%diag%radt(3) &
00730 - sib_loc%lsdts*sib_loc%dtd(sib%prog%nsl+1) &
00731 - sib_loc%lsdtc*sib_loc%dtc
00732 endif
00733
00734
00735 end subroutine update