Changeset 258 for LMDZ.3.3/branches/rel-LF/libf/phylmd/interface_surf.F90
- Timestamp:
- Jul 18, 2001, 1:28:31 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ.3.3/branches/rel-LF/libf/phylmd/interface_surf.F90
r236 r258 192 192 real, dimension(klon):: alb_ice 193 193 real, dimension(klon):: tsurf_temp 194 real, allocatable, dimension(:), save :: alb_neig_grid194 !! real, allocatable, dimension(:), save :: alb_neig_grid 195 195 real, dimension(klon):: alb_neig, alb_eau 196 196 real, DIMENSION(klon):: zfra … … 294 294 ! 295 295 !!$ PB ATTENTION changement ordre des appels 296 CALL albsno(klon,agesno,alb_neig_grid)296 !!$ CALL albsno(klon,agesno,alb_neig_grid) 297 297 298 298 if (.not. ok_veget) then … … 337 337 & tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l) 338 338 339 DO ii = 1, knon 340 index = knindex(ii) 341 alb_neig(ii) = alb_neig_grid(index) 342 agesno(index) = (agesno(index) + (1.-agesno(index)/50.)*dtime/86400.)& 343 & * EXP(-1.*MAX(0.0,precip_snow(ii))*dtime/0.3) 344 agesno(index) = MAX(agesno(index),0.0) 345 IF(snow(ii) .LT. 0.0001) agesno(index) = 0. 346 ENDDO 347 zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0))) 348 alb_new = alb_neig*zfra + alb_new*(1.0-zfra) 349 z0_new = SQRT(z0_new**2+rugoro**2) 339 !!$ DO ii = 1, knon 340 !!$ index = knindex(ii) 341 !!$ alb_neig(ii) = alb_neig_grid(index) 342 !!$ agesno(index) = (agesno(index) + (1.-agesno(index)/50.)*dtime/86400.)& 343 !!$ & * EXP(-1.*MAX(0.0,precip_snow(ii))*dtime/0.3) 344 !!$ agesno(index) = MAX(agesno(index),0.0) 345 !!$ IF(snow(ii) .LT. 0.0001) agesno(index) = 0. 346 !!$ ENDDO 347 348 call albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 349 where (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0. 350 zfra = max(0.0,min(1.0,snow/(snow+10.0))) 351 alb_new(1 : knon) = alb_neig(1 : knon) *zfra + alb_new(1 : knon)*(1.0-zfra) 352 z0_new = sqrt(z0_new**2+rugoro**2) 350 353 351 354 else 352 CALL albsno(klon,agesno,alb_neig_grid)355 !! CALL albsno(klon,agesno,alb_neig_grid) 353 356 ! 354 357 ! appel a sechiba … … 413 416 beta = 1. 414 417 dif_grnd = 0. 418 alb_neig(:) = 0. 419 agesno(:) = 0. 415 420 416 421 call calcul_fluxs( klon, knon, nisurf, dtime, & … … 552 557 ! 553 558 ! 554 zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0)))555 DO ii = 1, knon556 index = knindex(ii)557 alb_neig(ii) = alb_neig_grid(index)558 ENDDO559 alb_new = alb_neig*zfra + 0.6 * (1.0-zfra)560 561 z0_new = 0.001559 CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 560 WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0. 561 zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0))) 562 !!$ alb_new(1 : knon) = alb_neig(1 : knon) *zfra + 0.6 * (1.0-zfra) 563 alb_new(1 : knon) = 0.6 564 565 z0_new = 0.001 566 z0_new = SQRT(z0_new**2+rugoro**2) 562 567 563 568 else if (nisurf == is_lic) then … … 601 606 ! calcul albedo 602 607 ! 603 zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0))) 604 DO ii = 1, knon 605 index = knindex(ii) 606 alb_neig(ii) = alb_neig_grid(index) 607 agesno(index) = (agesno(index) + (1.-agesno(index)/50.)*dtime/86400.)& 608 & * EXP(-1.*MAX(0.0,precip_snow(ii))*dtime/0.3) 609 agesno(index) = MAX(agesno(index),0.0) 610 IF(snow(ii) .LT. 0.0001) agesno(index) = 0. 611 ENDDO 612 alb_new = alb_neig*zfra + 0.6 * (1.0-zfra) 608 CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 609 WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0. 610 zfra = MAX(0.0,MIN(1.0,snow/(snow+10.0))) 611 !!$ alb_new(1 : knon) = alb_neig(1 : knon)*zfra + 0.6 * (1.0-zfra) 612 alb_new(1 : knon) = 0.6 613 613 ! 614 614 ! Rugosite … … 1997 1997 #include "YOETHF.inc" 1998 1998 #include "FCTTRE.inc" 1999 #include "indicesol.inc" 1999 2000 2000 2001 ! Parametres d'entree … … 2046 2047 ! Traitement neige et humidite du sol 2047 2048 ! 2048 if (nisurf == is_oce) then 2049 snow = 0. 2050 qsol = max_eau_sol 2051 else 2052 snow = snow + (precip_snow * dtime) 2053 where (snow > epsilon(snow)) snow = max(0.0, snow - (evap * dtime)) 2054 ! snow = max(0.0, snow + (precip_snow - evap) * dtime) 2055 qsol = qsol + (precip_rain - evap) * dtime 2056 endif 2049 !!$ WRITE(*,*)'test calcul_flux, surface ', nisurf 2050 !!PB test 2051 !!$ if (nisurf == is_oce) then 2052 !!$ snow = 0. 2053 !!$ qsol = max_eau_sol 2054 !!$ else 2055 !!$ where (precip_snow > 0.) snow = snow + (precip_snow * dtime) 2056 !!$ where (snow > epsilon(snow)) snow = max(0.0, snow - (evap * dtime)) 2057 !!$! snow = max(0.0, snow + (precip_snow - evap) * dtime) 2058 !!$ where (precip_rain > 0.) qsol = qsol + (precip_rain - evap) * dtime 2059 !!$ endif 2057 2060 IF (nisurf /= is_ter) qsol = max_eau_sol 2058 2061 … … 2161 2164 ! qsol(i) = qsol(i) + (fq_fonte * dtime) 2162 2165 ! endif 2163 if (nisurf == is_ter) &2164 & run_off(i) = run_off(i) + max(qsol(i) - max_eau_sol, 0.0)2165 qsol(i) = min(qsol(i), max_eau_sol)2166 !!$ if (nisurf == is_ter) & 2167 !!$ & run_off(i) = run_off(i) + max(qsol(i) - max_eau_sol, 0.0) 2168 !!$ qsol(i) = min(qsol(i), max_eau_sol) 2166 2169 ENDDO 2167 2170 … … 2263 2266 !######################################################################### 2264 2267 ! 2265 SUBROUTINE albsno(klon, agesno,alb_neig_grid)2268 SUBROUTINE albsno(klon, knon,dtime,agesno,alb_neig_grid, precip_snow) 2266 2269 IMPLICIT none 2267 2270 2268 integer :: klon2271 INTEGER :: klon, knon 2269 2272 INTEGER, PARAMETER :: nvm = 8 2273 REAL :: dtime 2270 2274 REAL, dimension(klon,nvm) :: veget 2271 REAL, DIMENSION(klon) :: alb_neig_grid, agesno 2275 REAL, DIMENSION(klon) :: alb_neig_grid, agesno, precip_snow 2272 2276 2273 2277 INTEGER :: i, nv … … 2280 2284 veget = 0. 2281 2285 veget(:,1) = 1. ! desert partout 2282 DO i = 1, k lon2286 DO i = 1, knon 2283 2287 alb_neig_grid(i) = 0.0 2284 2288 ENDDO 2285 2289 DO nv = 1, nvm 2286 DO i = 1, k lon2290 DO i = 1, knon 2287 2291 as = init(nv)+decay(nv)*EXP(-agesno(i)/5.) 2288 2292 alb_neig_grid(i) = alb_neig_grid(i) + veget(i,nv)*as 2289 2293 ENDDO 2294 ENDDO 2295 ! 2296 !! modilation en fonction de l'age de la neige 2297 ! 2298 DO i = 1, knon 2299 agesno(i) = (agesno(i) + (1.-agesno(i)/50.)*dtime/86400.)& 2300 & * EXP(-1.*MAX(0.0,precip_snow(i))*dtime/0.3) 2301 agesno(i) = MAX(agesno(i),0.0) 2290 2302 ENDDO 2291 2303 … … 2337 2349 #include "YOETHF.inc" 2338 2350 #include "FCTTRE.inc" 2351 #include "indicesol.inc" 2339 2352 2340 2353 ! Parametres d'entree … … 2436 2449 enddo 2437 2450 2451 2452 WHERE (precip_snow > 0.) snow = snow + (precip_snow * dtime) 2453 WHERE (evap > 0 ) snow = MAX(0.0, snow - (evap * dtime)) 2454 qsol = qsol + (precip_rain - evap) * dtime 2438 2455 ! 2439 2456 ! Y'a-t-il fonte de neige? … … 2443 2460 & .AND. tsurf_new(i) >= RTT) 2444 2461 if (neige_fond) then 2445 tsurf_new(i) = RTT 2462 fq_fonte = MIN( MAX((tsurf_new(i)-RTT )/chasno,0.0),snow(i)) 2463 snow(i) = max(0., snow(i) - fq_fonte) 2464 qsol(i) = qsol(i) + fq_fonte 2465 tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno 2466 IF (nisurf == is_sic .OR. nisurf == is_lic ) tsurf_new(i) = RTT -1.8 2446 2467 d_ts(i) = tsurf_new(i) - tsurf(i) 2447 2468 ! zx_h_ts(i) = tsurf_new(i) * RCPD * zx_pkh(i) … … 2449 2470 !== flux_q est le flux de vapeur d'eau: kg/(m**2 s) positive vers bas 2450 2471 !== flux_t est le flux de cpt (energie sensible): j/(m**2 s) 2451 evap(i) = - zx_mq(i) - zx_nq(i) * tsurf_new(i)2452 fluxlat(i) = - evap(i) * zx_sl(i)2453 fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i)2472 !!$ evap(i) = - zx_mq(i) - zx_nq(i) * tsurf_new(i) 2473 !!$ fluxlat(i) = - evap(i) * zx_sl(i) 2474 !!$ fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i) 2454 2475 ! Derives des flux dF/dTs (W m-2 K-1): 2455 dflux_s(i) = zx_nh(i) 2456 dflux_l(i) = (zx_sl(i) * zx_nq(i)) 2457 bilan_f = radsol(i) + fluxsens(i) - (zx_sl(i) * evap (i)) - & 2458 & dif_grnd(i) * (tsurf_new(i) - t_grnd) - & 2459 & RCPD * (zx_pkh(i))/cal(i)/dtime * (tsurf_new(i) - tsurf(i)) 2460 bilan_f = max(0., bilan_f) 2461 fq_fonte = bilan_f / zx_sl(i) 2462 snow(i) = max(0., snow(i) - fq_fonte * dtime) 2463 qsol(i) = qsol(i) + (fq_fonte * dtime) 2464 if (nisurf == is_ter) & 2465 & run_off(i) = run_off(i) + max(qsol(i) - max_eau_sol, 0.0) 2466 qsol(i) = min(qsol(i), max_eau_sol) 2467 endif 2476 !!$ dflux_s(i) = zx_nh(i) 2477 !!$ dflux_l(i) = (zx_sl(i) * zx_nq(i)) 2478 !!$ bilan_f = radsol(i) + fluxsens(i) - (zx_sl(i) * evap (i)) - & 2479 !!$ & dif_grnd(i) * (tsurf_new(i) - t_grnd) - & 2480 !!$ & RCPD * (zx_pkh(i))/cal(i)/dtime * (tsurf_new(i) - tsurf(i)) 2481 !!$ bilan_f = max(0., bilan_f) 2482 !!$ fq_fonte = bilan_f / zx_sl(i) 2483 endif 2484 IF (nisurf == is_ter) & 2485 & run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.0) 2486 qsol(i) = MIN(qsol(i), max_eau_sol) 2468 2487 enddo 2469 2488
Note: See TracChangeset
for help on using the changeset viewer.