Changeset 878 for LMDZ4/trunk/libf/phylmd/physiq.F
- Timestamp:
- Jan 14, 2008, 1:03:39 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk/libf/phylmd/physiq.F
r864 r878 177 177 REAL fm_therm(klon,klev+1) 178 178 REAL entr_therm(klon,klev) 179 real,allocatable,save :: clwcon0th(:,:),rnebcon0th(:,:) 180 c$OMP THREADPRIVATE(clwcon0th,rnebcon0th) 181 182 real weak_inversion(klon),dthmin(klon) 183 real seuil_inversion 184 save seuil_inversion 185 c$OMP THREADPRIVATE(seuil_inversion) 186 integer iflag_ratqs 187 save iflag_ratqs 188 c$OMP THREADPRIVATE(iflag_ratqs) 189 190 integer lmax_th(klon) 191 integer limbas(klon) 192 real ratqscth(klon,klev) 193 real ratqsdiff(klon,klev) 194 real zqsatth(klon,klev) 195 179 196 c====================================================================== 180 197 c … … 929 946 REAL fluxu(klon,klev, nbsrf) ! flux turbulent de vitesse u 930 947 REAL fluxv(klon,klev, nbsrf) ! flux turbulent de vitesse v 948 949 REAL, DIMENSION(:,:,:), ALLOCATABLE, SAVE :: pbl_tke ! turb kinetic energy 950 c !$OMP THREADPRIVATE(pbl_tke) 951 931 952 c 932 953 REAL zxfluxt(klon, klev) … … 1050 1071 c$OMP THREADPRIVATE(d_u_con,d_v_con) 1051 1072 REAL d_t_lsc(klon,klev),d_q_lsc(klon,klev),d_ql_lsc(klon,klev) 1073 REAL d_t_ajsb(klon,klev), d_q_ajsb(klon,klev) 1052 1074 REAL d_t_ajs(klon,klev), d_q_ajs(klon,klev) 1053 1075 REAL d_u_ajs(klon,klev), d_v_ajs(klon,klev) … … 1471 1493 #endif 1472 1494 allocate( clwcon0(klon,klev),rnebcon0(klon,klev)) 1495 allocate( clwcon0th(klon,klev),rnebcon0th(klon,klev)) 1473 1496 allocate( tau_ae(klon,klev,2), piz_ae(klon,klev,2)) 1474 1497 allocate( cg_ae(klon,klev,2)) … … 1507 1530 CALL suphec ! initialiser constantes et parametres phys. 1508 1531 ENDIF 1532 1533 print*,'CONVERGENCE PHYSIQUE THERM 1 ' 1509 1534 1510 1535 … … 1567 1592 c 1568 1593 call conf_phys(ocean, ok_veget, ok_journe, ok_mensuel, 1569 . ok_instan, ok_hf, 1594 . ok_instan, ok_hf, seuil_inversion, 1570 1595 . fact_cldcon, facttemps,ok_newmicro, 1571 cIM . iflag_cldcon,ratqsbas,ratqshaut, if_ebil, 1572 . iflag_cldcon,ratqsbas,ratqshaut, 1596 . iflag_cldcon,iflag_ratqs,ratqsbas,ratqshaut, 1573 1597 . ok_ade, ok_aie, 1574 1598 . bl95_b0, bl95_b1, … … 1581 1605 itap = 0 1582 1606 itaprad = 0 1607 1608 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1609 !! Un petit travail à faire ici. 1610 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1611 1612 if (iflag_pbl>1) then 1613 PRINT*, "Using method MELLOR&YAMADA" 1614 endif 1615 ! NB! pbl_tke could/should be read and written from (re)startphy.nc 1616 ALLOCATE(pbl_tke(klon,klev+1,nbsrf)) 1617 pbl_tke(:,:,:) = 1.e-8 1618 1583 1619 1584 1620 CALL phyetat0 ("startphy.nc",dtime,co2_ppm_etat0,solaire_etat0, … … 1589 1625 . radsol,clesphy0, 1590 1626 . zmea,zstd,zsig,zgam,zthe,zpic,zval,rugoro,tabcntr0, 1591 . t_ancien, q_ancien, ancien_ok, rnebcon, ratqs,clwcon) 1627 . t_ancien, q_ancien, ancien_ok, rnebcon, ratqs,clwcon, 1628 . pbl_tke) 1629 1630 1631 1632 1633 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1634 1592 1635 1593 1636 DO i=1,klon … … 1620 1663 . pdtphys 1621 1664 abort_message='Pas physique n est pas correct ' 1622 call abort_gcm(modname,abort_message,1) 1665 ! call abort_gcm(modname,abort_message,1) 1666 dtime=pdtphys 1623 1667 ENDIF 1624 1668 IF (nlon .NE. klon) THEN … … 1670 1714 ENDIF 1671 1715 1716 rugoro=0. 1672 1717 c34EK 1673 1718 IF (ok_orodr) THEN 1674 DO i=1,klon 1675 rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0) 1676 ENDDO 1719 1720 rugoro=0. 1721 1722 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1723 ! FH sans doute a enlever de finitivement ou, si on le garde, l'activer 1724 ! justement quand ok_orodr = false. 1725 ! ce rugoro est utilise par la couche limite et fait double emploi 1726 ! avec les paramétrisations spécifiques de Francois Lott. 1727 ! DO i=1,klon 1728 ! rugoro(i) = MAX(1.0e-05, zstd(i)*zsig(i)/2.0) 1729 ! ENDDO 1730 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1731 1677 1732 CALL SUGWD(klon,klev,paprs,pplay) 1678 1733 DO i=1,klon … … 2088 2143 d wfbils, wfbilo, fluxt, fluxu, fluxv, 2089 2144 - dsens, devap, zxsnow, 2090 - zxfluxt, zxfluxq, q2m, fluxq )2145 - zxfluxt, zxfluxq, q2m, fluxq, pbl_tke ) 2091 2146 c 2092 2147 c … … 2260 2315 DO i = 1, klon 2261 2316 ema_pct(i) = paprs(i,itop_con(i)) 2317 if (itop_con(i).gt.klev-3) then 2318 print*,'La convection monte trop haut ' 2319 print*,'itop_con(,',i,',)=',itop_con(i) 2320 endif 2262 2321 ENDDO 2263 2322 DO i = 1, klon … … 2343 2402 c=================================================================== 2344 2403 c 2404 call stratocu_if(klon,klev,pctsrf,paprs, pplay,t_seri 2405 s ,seuil_inversion,weak_inversion,dthmin) 2406 2407 2408 2409 d_t_ajsb(:,:)=0. 2410 d_q_ajsb(:,:)=0. 2345 2411 d_t_ajs(:,:)=0. 2346 2412 d_u_ajs(:,:)=0. 2347 2413 d_v_ajs(:,:)=0. 2348 2414 d_q_ajs(:,:)=0. 2415 clwcon0th(:,:)=0. 2349 2416 fm_therm(:,:)=0. 2350 2417 entr_therm(:,:)=0. … … 2357 2424 c ==== 2358 2425 IF(prt_level>9)WRITE(lunout,*)'pas de convection' 2359 else if(iflag_thermals.eq.0) then 2360 2361 c Ajustement sec 2362 c ============== 2363 IF(prt_level>9)WRITE(lunout,*)'ajsec' 2364 CALL ajsec(paprs, pplay, t_seri,q_seri, d_t_ajs, d_q_ajs) 2365 t_seri(:,:) = t_seri(:,:) + d_t_ajs(:,:) 2366 q_seri(:,:) = q_seri(:,:) + d_q_ajs(:,:) 2426 2427 2367 2428 else 2429 2368 2430 c Thermiques 2369 2431 c ========== 2370 2432 IF(prt_level>9)WRITE(lunout,*)'JUSTE AVANT , iflag_thermals=' 2371 2433 s ,iflag_thermals,' nsplit_thermals=',nsplit_thermals 2434 print*,'JUSTE AVANT , iflag_thermals=' 2435 s ,iflag_thermals,' nsplit_thermals=',nsplit_thermals 2436 2437 2438 if (iflag_thermals.gt.1) then 2372 2439 call calltherm(pdtphys 2373 s ,pplay,paprs,pphi 2374 s ,u_seri,v_seri,t_seri,q_seri 2440 s ,pplay,paprs,pphi,weak_inversion 2441 s ,u_seri,v_seri,t_seri,q_seri,zqsat,debut 2375 2442 s ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs 2376 s ,fm_therm,entr_therm) 2443 s ,fm_therm,entr_therm,zqasc,clwcon0th,lmax_th,ratqscth, 2444 s ratqsdiff,zqsatth) 2445 endif 2446 2447 ! call calltherm(pdtphys 2448 ! s ,pplay,paprs,pphi 2449 ! s ,u_seri,v_seri,t_seri,q_seri 2450 ! s ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs 2451 ! s ,fm_therm,entr_therm) 2452 2453 c Ajustement sec 2454 c ============== 2455 2456 ! Dans le cas où on active les thermiques, on fait partir l'ajustement 2457 ! a partir du sommet des thermiques. 2458 ! Dans le cas contraire, on demarre au niveau 1. 2459 2460 if (iflag_thermals.ge.13.or.iflag_thermals.eq.0) then 2461 2462 if(iflag_thermals.eq.0) then 2463 IF(prt_level>9)WRITE(lunout,*)'ajsec' 2464 limbas(:)=1 2465 else 2466 limbas(:)=lmax_th(:) 2467 endif 2468 2469 ! Attention : le call ajsec_convV2 n'est maintenu que momentanneement 2470 ! pour des test de convergence numerique. 2471 ! Le nouveau ajsec est a priori mieux, meme pour le cas 2472 ! iflag_thermals = 0 (l'ancienne version peut faire des tendances 2473 ! non nulles numeriquement pour des mailles non concernees. 2474 2475 if (iflag_thermals.eq.0) then 2476 CALL ajsec_convV2(paprs, pplay, t_seri,q_seri 2477 s , d_t_ajsb, d_q_ajsb) 2478 else 2479 CALL ajsec(paprs, pplay, t_seri,q_seri,limbas 2480 s , d_t_ajsb, d_q_ajsb) 2481 endif 2482 2483 t_seri(:,:) = t_seri(:,:) + d_t_ajsb(:,:) 2484 q_seri(:,:) = q_seri(:,:) + d_q_ajsb(:,:) 2485 d_t_ajs(:,:)=d_t_ajs(:,:)+d_t_ajsb(:,:) 2486 d_q_ajs(:,:)=d_q_ajs(:,:)+d_q_ajsb(:,:) 2487 2488 endif 2489 2377 2490 endif 2378 2491 c … … 2406 2519 enddo 2407 2520 enddo 2521 else if (iflag_cldcon.eq.4) then 2522 ptconvth(:,:)=.false. 2523 ratqsc(:,:)=0. 2524 print*,'avant clouds_gno thermique' 2525 call clouds_gno 2526 s (klon,klev,q_seri,zqsat,clwcon0th,ptconvth,ratqsc,rnebcon0th) 2527 print*,' CLOUDS_GNO OK' 2408 2528 endif 2409 2529 2410 2530 c ratqs stables 2411 2531 c ------------- 2412 do k=1,klev 2413 cIM RAJOUT boucle do=i 2414 do i=1, klon 2415 cIM ratqss(:,k)=ratqsbas+(ratqshaut-ratqsbas)* 2416 cIM s min((paprs(:,1)-pplay(:,k))/(paprs(:,1)-30000.),1.) 2417 ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)* 2418 s min((paprs(i,1)-pplay(i,k))/(paprs(i,1)-30000.),1.) 2419 cIM print*,' IMratqs STABLE i, k',i,k,ratqss(i,k) 2420 enddo 2421 enddo 2532 2533 if (iflag_ratqs.eq.0) then 2534 2535 ! Le cas iflag_ratqs=0 correspond a la version IPCC 2005 du modele. 2536 do k=1,klev 2537 do i=1, klon 2538 ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)* 2539 s min((paprs(i,1)-pplay(i,k))/(paprs(i,1)-30000.),1.) 2540 enddo 2541 enddo 2542 2543 ! Pour iflag_ratqs=1 ou 2, le ratqs est constant au dessus de 2544 ! 300 hPa (ratqshaut), varie lineariement en fonction de la pression 2545 ! entre 600 et 300 hPa et est soit constant (ratqsbas) pour iflag_ratqs=1 2546 ! soit lineaire (entre 0 a la surface et ratqsbas) pour iflag_ratqs=2 2547 ! Il s'agit de differents tests dans la phase de reglage du modele 2548 ! avec thermiques. 2549 2550 else if (iflag_ratqs.eq.1) then 2551 2552 do k=1,klev 2553 do i=1, klon 2554 if (pplay(i,k).ge.60000.) then 2555 ratqss(i,k)=ratqsbas 2556 else if ((pplay(i,k).ge.30000.).and. 2557 s (pplay(i,k).lt.60000.)) then 2558 ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)* 2559 s (60000.-pplay(i,k))/(60000.-30000.) 2560 else 2561 ratqss(i,k)=ratqshaut 2562 endif 2563 enddo 2564 enddo 2565 2566 else 2567 2568 do k=1,klev 2569 do i=1, klon 2570 if (pplay(i,k).ge.60000.) then 2571 ratqss(i,k)=ratqsbas 2572 s *(paprs(i,1)-pplay(i,k))/(paprs(i,1)-60000.) 2573 else if ((pplay(i,k).ge.30000.).and. 2574 s (pplay(i,k).lt.60000.)) then 2575 ratqss(i,k)=ratqsbas+(ratqshaut-ratqsbas)* 2576 s (60000.-pplay(i,k))/(60000.-30000.) 2577 else 2578 ratqss(i,k)=ratqshaut 2579 endif 2580 enddo 2581 enddo 2582 endif 2583 2584 2422 2585 2423 2586 2424 2587 c ratqs final 2425 2588 c ----------- 2426 if (iflag_cldcon.eq.1 .or.iflag_cldcon.eq.2) then 2427 c les ratqs sont une conbinaison de ratqss et ratqsc 2428 c ratqs final 2429 c 1e4 (en gros 3 heures), en dur pour le moment, est le temps de 2430 c relaxation des ratqs 2431 c facttemps=exp(-pdtphys/1.e4) 2432 facteur=exp(-pdtphys*facttemps) 2433 ratqs(:,:)=max(ratqs(:,:)*facteur,ratqss(:,:)) 2434 ratqs(:,:)=max(ratqs(:,:),ratqsc(:,:)) 2435 c print*,'calcul des ratqs fini' 2589 2590 if (iflag_cldcon.eq.1 .or.iflag_cldcon.eq.2 2591 s .or.iflag_cldcon.eq.4) then 2592 2593 ! On ajoute une constante au ratqsc*2 pour tenir compte de 2594 ! fluctuations turbulentes de petite echelle 2595 2596 do k=1,klev 2597 do i=1,klon 2598 if ((fm_therm(i,k).gt.1.e-10)) then 2599 ratqsc(i,k)=sqrt(ratqsc(i,k)**2+0.05**2) 2600 endif 2601 enddo 2602 enddo 2603 2604 ! les ratqs sont une conbinaison de ratqss et ratqsc 2605 ! 1800s, en dur pour le moment, est le temps de 2606 ! relaxation des ratqs 2607 2608 facteur=exp(-pdtphys/1800.) 2609 2610 print*,'WARNING ratqs a revoir ' 2611 ratqs(:,:)=ratqsc(:,:)*(1.-facteur)+ratqs(:,:)*facteur 2612 ratqs(:,:)=sqrt(ratqs(:,:)**2+ratqss(:,:)**2) 2613 2436 2614 else 2437 con ne prend que le ratqs stable pour fisrtilp2615 ! on ne prend que le ratqs stable pour fisrtilp 2438 2616 ratqs(:,:)=ratqss(:,:) 2439 2617 endif … … 2505 2683 cIM cf FH 2506 2684 c IF (iflag_cldcon.eq.-1) THEN ! seulement pour Tiedtke 2507 2685 IF (iflag_cldcon.le.-1) THEN ! seulement pour Tiedtke 2508 2686 snow_tiedtke=0. 2509 2687 c print*,'avant calcul de la pseudo precip ' … … 2542 2720 ENDDO 2543 2721 2544 ELSE IF (iflag_cldcon. eq.3) THEN2722 ELSE IF (iflag_cldcon.ge.3) THEN 2545 2723 c On prend pour les nuages convectifs le max du calcul de la 2546 2724 c convection et du calcul du pas de temps precedent diminue d'un facteur 2547 2725 c facttemps 2548 c facttemps=pdtphys/1.e42549 2726 facteur = pdtphys *facttemps 2550 2727 do k=1,klev … … 3314 3491 . radsol, 3315 3492 . zmea,zstd,zsig,zgam,zthe,zpic,zval,rugoro, 3316 . t_ancien, q_ancien, rnebcon, ratqs, clwcon) 3493 . t_ancien, q_ancien, rnebcon, ratqs, clwcon, 3494 . pbl_tke) 3317 3495 ENDIF 3318 3496
Note: See TracChangeset
for help on using the changeset viewer.