Changeset 878 for LMDZ4/trunk
- Timestamp:
- Jan 14, 2008, 1:03:39 PM (17 years ago)
- Location:
- LMDZ4/trunk/libf/phylmd
- Files:
-
- 15 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk/libf/phylmd/ajsec.F
r766 r878 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE ajsec(paprs, pplay, t,q, d_t,d_q) 4 SUBROUTINE ajsec(paprs, pplay, t,q,limbas,d_t,d_q) 5 USE dimphy 6 IMPLICIT none 7 c====================================================================== 8 c Auteur(s): Z.X. Li (LMD/CNRS) date: 19930818 9 c Objet: ajustement sec (adaptation du GCM du LMD) 10 c====================================================================== 11 c Arguments: 12 c t-------input-R- Temperature 13 c 14 c d_t-----output-R-Incrementation de la temperature 15 c====================================================================== 16 cym#include "dimensions.h" 17 cym#include "dimphy.h" 18 #include "YOMCST.h" 19 REAL paprs(klon,klev+1), pplay(klon,klev) 20 REAL t(klon,klev), q(klon,klev) 21 REAL d_t(klon,klev), d_q(klon,klev) 22 c 23 INTEGER limbas(klon), limhau ! les couches a ajuster 24 c 25 LOGICAL mixq 26 ccc PARAMETER (mixq=.TRUE.) 27 PARAMETER (mixq=.FALSE.) 28 c 29 REAL zh(klon,klev) 30 REAL zho(klon,klev) 31 REAL zq(klon,klev) 32 REAL zpk(klon,klev) 33 REAL zpkdp(klon,klev) 34 REAL hm, sm, qm 35 LOGICAL modif(klon), down 36 INTEGER i, k, k1, k2 37 c 38 c Initialisation: 39 c 40 cym 41 limhau=klev 42 43 DO k = 1, klev 44 DO i = 1, klon 45 d_t(i,k) = 0.0 46 d_q(i,k) = 0.0 47 ENDDO 48 ENDDO 49 c------------------------------------- detection des profils a modifier 50 DO k = 1, limhau 51 DO i = 1, klon 52 zpk(i,k) = pplay(i,k)**RKAPPA 53 zh(i,k) = RCPD * t(i,k)/ zpk(i,k) 54 zho(i,k) = zh(i,k) 55 zq(i,k) = q(i,k) 56 ENDDO 57 ENDDO 58 c 59 DO k = 1, limhau 60 DO i = 1, klon 61 zpkdp(i,k) = zpk(i,k) * (paprs(i,k)-paprs(i,k+1)) 62 ENDDO 63 ENDDO 64 c 65 DO i = 1, klon 66 modif(i) = .FALSE. 67 ENDDO 68 DO k = 2, limhau 69 DO i = 1, klon 70 IF (.NOT.modif(i).and.k-1>limbas(i)) THEN 71 IF ( zh(i,k).LT.zh(i,k-1) ) modif(i) = .TRUE. 72 ENDIF 73 ENDDO 74 ENDDO 75 c------------------------------------- correction des profils instables 76 DO 1080 i = 1, klon 77 IF (modif(i)) THEN 78 k2 = limbas(i) 79 8000 CONTINUE 80 k2 = k2 + 1 81 IF (k2 .GT. limhau) goto 8001 82 IF (zh(i,k2) .LT. zh(i,k2-1)) THEN 83 k1 = k2 - 1 84 k = k1 85 sm = zpkdp(i,k2) 86 hm = zh(i,k2) 87 qm = zq(i,k2) 88 8020 CONTINUE 89 sm = sm +zpkdp(i,k) 90 hm = hm +zpkdp(i,k) * (zh(i,k)-hm) / sm 91 qm = qm +zpkdp(i,k) * (zq(i,k)-qm) / sm 92 down = .FALSE. 93 IF (k1 .ne. limbas(i)) THEN 94 IF (hm .LT. zh(i,k1-1)) down = .TRUE. 95 ENDIF 96 IF (down) THEN 97 k1 = k1 - 1 98 k = k1 99 ELSE 100 IF ((k2 .EQ. limhau)) GOTO 8021 101 IF ((zh(i,k2+1).GE.hm)) GOTO 8021 102 k2 = k2 + 1 103 k = k2 104 ENDIF 105 GOTO 8020 106 8021 CONTINUE 107 c------------ nouveau profil : constant (valeur moyenne) 108 DO k = k1, k2 109 zh(i,k) = hm 110 zq(i,k) = qm 111 ENDDO 112 k2 = k2 + 1 113 ENDIF 114 GOTO 8000 115 8001 CONTINUE 116 ENDIF 117 1080 CONTINUE 118 c 119 DO k = 1, limhau 120 DO i = 1, klon 121 d_t(i,k) = (zh(i,k)-zho(i,k))*zpk(i,k)/RCPD 122 d_q(i,k) = zq(i,k) - q(i,k) 123 ENDDO 124 ENDDO 125 c 126 ! FH : les d_q et d_t sont maintenant calcules de facon a valoir 127 ! effectivement 0. si on ne fait rien. 128 ! 129 ! IF (limbas.GT.1) THEN 130 ! DO k = 1, limbas-1 131 ! DO i = 1, klon 132 ! d_t(i,k) = 0.0 133 ! d_q(i,k) = 0.0 134 ! ENDDO 135 ! ENDDO 136 ! ENDIF 137 c 138 ! IF (limhau.LT.klev) THEN 139 ! DO k = limhau+1, klev 140 ! DO i = 1, klon 141 ! d_t(i,k) = 0.0 142 ! d_q(i,k) = 0.0 143 ! ENDDO 144 ! ENDDO 145 ! ENDIF 146 c 147 IF (.NOT.mixq) THEN 148 DO k = 1, klev 149 DO i = 1, klon 150 d_q(i,k) = 0.0 151 ENDDO 152 ENDDO 153 ENDIF 154 c 155 RETURN 156 END 157 158 SUBROUTINE ajsec_convV2(paprs, pplay, t,q, d_t,d_q) 5 159 USE dimphy 6 160 IMPLICIT none -
LMDZ4/trunk/libf/phylmd/clouds_gno.F
r559 r878 219 219 c -- test numerical convergence: 220 220 221 c print*,'avant test ',i,k,lconv(i),u(i),v(i) 221 if (beta(i).lt.1.e-10) then 222 print*,'avant test ',i,k,lconv(i),u(i),v(i),beta(i) 223 stop 224 endif 225 if (abs(fprime(i)).lt.1.e-11) then 226 print*,'avant test fprime<.e-11 ' 227 s ,i,k,lconv(i),u(i),v(i),beta(i),fprime(i) 228 print*,'klon,ND,R,RS,QSUB', 229 s klon,ND,R(i,k),rs(i,k),qsub(i,k) 230 fprime(i)=sign(1.e-11,fprime(i)) 231 endif 232 233 222 234 if ( ABS(dist(i)/beta(i)) .LT. epsilon ) then 223 235 c print*,'v-u **2',(v(i)-u(i))**2 -
LMDZ4/trunk/libf/phylmd/coef_diff_turb_mod.F90
r793 r878 18 18 SUBROUTINE coef_diff_turb(dtime, nsrf, knon, ni, & 19 19 ypaprs, ypplay, yu, yv, yq, yt, yts, yrugos, yqsurf, & 20 ycoefm, ycoefh )20 ycoefm, ycoefh ,yq2) 21 21 ! 22 22 ! Calculate coefficients(ycoefm, ycoefh) for turbulent diffusion in the … … 35 35 REAL, DIMENSION(klon,klev), INTENT(IN) :: yq, yt 36 36 REAL, DIMENSION(klon), INTENT(IN) :: yts, yrugos, yqsurf 37 REAL, DIMENSION(klon,klev+1) :: yq2 37 38 38 39 ! Output arguments … … 41 42 REAL, DIMENSION(klon,klev), INTENT(OUT) :: ycoefm 42 43 43 ! Local variables with attribute SAVE44 !****************************************************************************************45 REAL, DIMENSION(:,:,:), ALLOCATABLE, SAVE :: q2save46 !$OMP THREADPRIVATE(q2save)47 LOGICAL, SAVE :: first_call=.TRUE.48 !$OMP THREADPRIVATE(first_call)49 50 44 ! Other local variables 51 45 !**************************************************************************************** 52 46 INTEGER :: k, i, j 53 47 REAL, DIMENSION(klon,klev) :: ycoefm0, ycoefh0, yzlay, yteta 54 REAL, DIMENSION(klon,klev+1) :: yzlev, yq2,q2diag, ykmm, ykmn, ykmq48 REAL, DIMENSION(klon,klev+1) :: yzlev, q2diag, ykmm, ykmn, ykmq 55 49 REAL, DIMENSION(klon) :: y_cd_h, y_cd_m 56 50 REAL, DIMENSION(klon) :: yustar … … 94 88 ycoefm0, ycoefh0) 95 89 96 DO k = 1, klev90 DO k = 2, klev 97 91 DO i = 1, knon 98 92 ycoefm(i,k) = MAX(ycoefm(i,k),ycoefm0(i,k)) … … 121 115 ycoefm0,ycoefh0) 122 116 123 DO k = 1, klev117 DO k = 2, klev 124 118 DO i = 1, knon 125 119 ycoefm(i,k) = MAX(ycoefm(i,k),ycoefm0(i,k)) … … 137 131 138 132 IF (iflag_pbl.GE.3) THEN 139 140 IF (first_call) THEN141 PRINT*, "Using method MELLOR&YAMADA"142 ! NB! q2save could/should be read and written from (re)startphy.nc143 ALLOCATE(q2save(klon,klev+1,nbsrf))144 q2save(:,:,:) = 1.e-8145 first_call=.FALSE.146 END IF147 133 148 134 yzlay(1:knon,1)= & … … 173 159 END DO 174 160 175 ! Compresse q2save 176 DO k = 1, klev+1 177 DO j = 1, knon 178 i = ni(j) 179 yq2(j,k)=q2save(i,k,nsrf) 180 ENDDO 181 ENDDO 182 183 ! Bug introduit volontairement pour converger avec les resultats 184 ! du papier sur les thermiques. 185 IF (1.EQ.1) THEN 186 y_cd_m(1:knon) = ycoefm(1:knon,1) 187 y_cd_h(1:knon) = ycoefh(1:knon,1) 188 ELSE 189 y_cd_h(1:knon) = ycoefm(1:knon,1) 190 y_cd_m(1:knon) = ycoefh(1:knon,1) 191 ENDIF 161 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 162 ! Pour memoire, le papier Hourdin et al. 2002 a ete obtenur avec un 163 ! bug sur les coefficients de surface : 164 ! y_cd_h(1:knon) = ycoefm(1:knon,1) 165 ! y_cd_m(1:knon) = ycoefh(1:knon,1) 166 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 167 168 y_cd_m(1:knon) = ycoefm(1:knon,1) 169 y_cd_h(1:knon) = ycoefh(1:knon,1) 192 170 193 171 CALL ustarhb(knon,yu,yv,y_cd_m, yustar) … … 215 193 ycoefh(1:knon,2:klev)=ykmn(1:knon,2:klev) 216 194 217 ! update q2save with yq2218 DO j=1,knon219 DO k=1,klev+1220 i=ni(j)221 q2save(i,k,nsrf) = yq2(j,k)222 END DO223 END DO224 225 195 ENDIF !(iflag_pbl.ge.3) 226 196 -
LMDZ4/trunk/libf/phylmd/conf_phys.F90
r840 r878 6 6 7 7 subroutine conf_phys(ocean, ok_veget, ok_journe, ok_mensuel, ok_instan, ok_hf, & 8 & seuil_inversion, & 8 9 & fact_cldcon, facttemps,ok_newmicro,iflag_cldcon, & 9 !IM& ratqsbas,ratqshaut,ip_ebil_phy, & 10 & ratqsbas,ratqshaut, & 10 & iflag_ratqs,ratqsbas,ratqshaut, & 11 11 & ok_ade, ok_aie, & 12 12 & bl95_b0, bl95_b1,& … … 51 51 real :: fact_cldcon, facttemps,ratqsbas,ratqshaut 52 52 integer :: iflag_cldcon 53 integer :: iflag_ratqs 53 54 54 55 character (len = 6),SAVE :: ocean_omp … … 61 62 real,SAVE :: ratqshaut_omp 62 63 integer,SAVE :: iflag_cldcon_omp, ip_ebil_phy_omp 64 integer,SAVE :: iflag_ratqs_omp 63 65 64 66 ! Local 65 67 integer :: numout = 6 66 68 real :: zzz 69 70 real :: seuil_inversion 71 real,save :: seuil_inversion_omp 67 72 68 73 integer :: iflag_thermals,nsplit_thermals … … 82 87 REAL,SAVE :: cdmmax_omp,cdhmax_omp,ksta_omp,ksta_ter_omp 83 88 LOGICAL,SAVE :: ok_kzmin_omp 84 REAL, SAVE :: 89 REAL, SAVE :: fmagic_omp 85 90 INTEGER,SAVE :: iflag_pbl_omp,lev_histhf_omp,lev_histday_omp,lev_histmth_omp 86 91 CHARACTER*4, SAVE :: type_run_omp … … 207 212 !Config Help = 208 213 ! 209 !210 214 ip_ebil_phy_omp = 0 211 215 call getin('ip_ebil_phy', ip_ebil_phy_omp) 216 ! 217 !Config Key = seuil_inversion 218 !Config Desc = Seuil ur dTh pour le choix entre les schemas de CL 219 !Config Def = -0.1 220 !Config Help = 221 ! 222 seuil_inversion_omp = -0.1 223 call getin('seuil_inversion', seuil_inversion_omp) 224 212 225 !! 213 226 !! Constante solaire & Parametres orbitaux & taux gaz effet de serre BEG … … 438 451 reevap_ice_omp = .false. 439 452 call getin('reevap_ice',reevap_ice_omp) 453 454 !Config Key = iflag_ratqs 455 !Config Desc = 456 !Config Def = 1 457 !Config Help = 458 ! 459 iflag_ratqs_omp = 1 460 call getin('iflag_ratqs',iflag_ratqs_omp) 461 440 462 ! 441 463 !Config Key = iflag_cldcon … … 835 857 ratqshaut = ratqshaut_omp 836 858 iflag_cldcon = iflag_cldcon_omp 859 iflag_ratqs = iflag_ratqs_omp 837 860 ip_ebil_phy = ip_ebil_phy_omp 838 861 iflag_thermals = iflag_thermals_omp … … 840 863 type_run = type_run_omp 841 864 ok_isccp = ok_isccp_omp 865 seuil_inversion=seuil_inversion_omp 842 866 lonmin_ins = lonmin_ins_omp 843 867 lonmax_ins = lonmax_ins_omp … … 891 915 write(numout,*)' iflag_pdf = ', iflag_pdf 892 916 write(numout,*)' iflag_cldcon = ', iflag_cldcon 917 write(numout,*)' iflag_ratqs = ', iflag_ratqs 918 write(numout,*)' seuil_inversion = ', seuil_inversion 893 919 write(numout,*)' fact_cldcon = ', fact_cldcon 894 920 write(numout,*)' facttemps = ', facttemps -
LMDZ4/trunk/libf/phylmd/dimphy.h
r524 r878 2 2 ! $Header$ 3 3 ! 4 c-----------------------------------------------------------------------4 !----------------------------------------------------------------------- 5 5 INTEGER KIDIA, KFDIA, KLON, KLEV 6 PARAMETER (KIDIA=1,KFDIA=iim*(jjm-1)+2-1/jjm ,7 .KLON=KFDIA-KIDIA+1,KLEV=llm)8 c-----------------------------------------------------------------------6 PARAMETER (KIDIA=1,KFDIA=iim*(jjm-1)+2-1/jjm) 7 PARAMETER (KLON=KFDIA-KIDIA+1,KLEV=llm) 8 !----------------------------------------------------------------------- 9 9 INTEGER nbtr ! nombre de vrais traceurs 10 10 PARAMETER (nbtr=nqmx-2+1/(nqmx-1)) 11 c-----------------------------------------------------------------------11 !----------------------------------------------------------------------- 12 12 REAL zmasq(KLON) 13 13 COMMON/terreoce/zmasq -
LMDZ4/trunk/libf/phylmd/ini_histday.h
r860 r878 53 53 c Champs 2D: 54 54 c 55 CALL histdef(nid_day, "weakinv", "Weak inversion", "", 56 s iim,jjmp1,nhori, 1,1,1, -99, 32, 57 s "ave(X)", zstophy,zout) 58 59 CALL histdef(nid_day, "dthmin", "dTheta mini", "K/m", 60 s iim,jjmp1,nhori, 1,1,1, -99, 32, 61 s "ave(X)", zstophy,zout) 62 63 55 64 CALL histdef(nid_day, "tsol", "Surface Temperature", "K", 56 65 . iim,jj_nb,nhori, 1,1,1, -99, 32, … … 538 547 $ "ave(X)", zstophy,zout) 539 548 C 549 550 551 ! FH Sorties specifiques pour Mellor et Yamada 552 if (iflag_pbl>1 .and. lev_histday.gt.10 ) then 553 call histdef(nid_day, "tke_"//clnsurf(nsrf), 554 $ "Max Turb. Kinetic Energy "//clnsurf(nsrf), "-", 555 $ iim,jj_nb,nhori, klev,1,klev,nvert, 32, 556 $ "ave(X)", zstophy,zout) 557 558 call histdef(nid_day, "tke_max_"//clnsurf(nsrf), 559 $ "Max Turb. Kinetic Energy "//clnsurf(nsrf), "-", 560 $ iim,jj_nb,nhori, klev,1,klev,nvert, 32, 561 $ "t_max(X)", zstophy,zout) 562 endif 563 564 C 540 565 END DO 541 566 C -
LMDZ4/trunk/libf/phylmd/ini_histmth.h
r864 r878 700 700 IF(lev_histmth.GE.4) THEN 701 701 c 702 !FH Sorties pour la couche limite 703 if (iflag_pbl>1) then 704 CALL histdef(nid_mth, "tke","TKE","m2/s2", 705 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 706 . "ave(X)", zstophy,zout) 707 c 708 CALL histdef(nid_mth, "tke_max","TKE max","m2/s2", 709 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 710 . "t_max(X)", zstophy,zout) 711 endif 712 c 713 CALL histdef(nid_mth, "kz","Kz melange","m2/s", 714 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 715 . "ave(X)", zstophy,zout) 716 c 717 CALL histdef(nid_mth, "kz_max","Kz melange max","m2/s", 718 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 719 . "t_max(X)", zstophy,zout) 720 721 702 722 CALL histdef(nid_mth, "clwcon", 703 723 . "Convective Cloud Liquid water content" … … 730 750 . "ave(X)", zstophy,zout) 731 751 c 752 753 754 c 732 755 c CALL histdef(nid_mth, "ducon", "Convection du", "m/s2", 733 756 c . iim,jj_nb,nhori, klev,1,klev,nvert, 32, … … 774 797 . "ave(X)", zstophy,zout) 775 798 799 c 800 CALL histdef(nid_mth, "dtthe", "Dry adjust. dT", "K/s", 801 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 802 . "ave(X)", zstophy,zout) 803 804 CALL histdef(nid_mth,"dqthe","Dry adjust. dQ","(kg/kg)/s", 805 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 806 . "ave(X)", zstophy,zout) 776 807 c 777 808 CALL histdef(nid_mth, "dtajs", "Dry adjust. dT", "K/s", … … 879 910 if (nqmax.GE.3) THEN 880 911 DO iq=3,nqmax 881 iiq=niadv(iq)912 iiq=niadv(iq) 882 913 CALL histdef(nid_mth, tnom(iq), ttext(iiq), "-", 883 914 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 884 915 . "ave(X)", zstophy,zout) 885 ENDDO886 ENDIF916 ENDDO 917 ENDIF 887 918 #endif 888 919 c … … 960 991 c 961 992 CALL histdef(nid_mth, "dtcon","dtcon","K/s", 993 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 994 . "ave(X)", zstophy,zout) 995 c 996 CALL histdef(nid_mth, "dtthe", "Dry adjust. dT", "K/s", 997 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 998 . "ave(X)", zstophy,zout) 999 1000 CALL histdef(nid_mth,"dqthe","Dry adjust. dQ","(kg/kg)/s", 962 1001 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 963 1002 . "ave(X)", zstophy,zout) … … 1668 1707 IF(lev_histmth.GE.4) THEN 1669 1708 c 1709 !FH Sorties pour la couche limite 1710 if (iflag_pbl>1) then 1711 CALL histdef(nid_mth, "tke","TKE","m2/s2", 1712 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 1713 . "ave(X)", zstophy,zout) 1714 c 1715 CALL histdef(nid_mth, "tke_max","TKE max","m2/s2", 1716 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 1717 . "t_max(X)", zstophy,zout) 1718 endif 1719 c 1720 CALL histdef(nid_mth, "kz","Kz melange","m2/s", 1721 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 1722 . "ave(X)", zstophy,zout) 1723 c 1724 CALL histdef(nid_mth, "kz_max","Kz melange max","m2/s", 1725 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 1726 . "t_max(X)", zstophy,zout) 1727 1728 1729 1730 1670 1731 CALL histdef(nid_mth, "clwcon", 1671 1732 . "Convective Cloud Liquid water content" … … 1831 1892 #ifndef INCA 1832 1893 if (nqmax.GE.3) THEN 1833 1834 1835 1836 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 1837 . "ave(X)", zstophy,zout) 1838 1839 1894 DO iq=3,nqmax 1895 iiq=niadv(iq) 1896 CALL histdef(nid_mth, tnom(iq), ttext(iiq), "-", 1897 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 1898 . "ave(X)", zstophy,zout) 1899 ENDDO 1900 ENDIF 1840 1901 #endif 1841 1902 -
LMDZ4/trunk/libf/phylmd/pbl_surface_mod.F90
r803 r878 197 197 wfbils, wfbilo, flux_t, flux_u, flux_v,& 198 198 dflux_t, dflux_q, zxsnow, & 199 zxfluxt, zxfluxq, q2m, flux_q )199 zxfluxt, zxfluxq, q2m, flux_q, tke ) 200 200 !**************************************************************************************** 201 201 ! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818 … … 240 240 ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2) 241 241 ! (orientation positive vers le bas) 242 ! tke---input/output-R- tke (kg/m**2/s) 242 243 ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s) 243 244 ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal … … 348 349 REAL, DIMENSION(klon, nbsrf),INTENT(OUT) :: q2m 349 350 REAL, DIMENSION(klon, klev, nbsrf), INTENT(OUT) :: flux_q 351 352 ! Input/output 353 REAL, DIMENSION(klon, klev+1, nbsrf), INTENT(INOUT) :: tke 350 354 351 355 … … 421 425 REAL, DIMENSION(klon,klev) :: delp 422 426 REAL, DIMENSION(klon,klev+1) :: ypaprs 427 REAL, DIMENSION(klon,klev+1) :: ytke 423 428 REAL, DIMENSION(klon,nsoilmx) :: ytsoil 424 429 REAL, DIMENSION(klon,nbsrf) :: pctsrf_pot … … 451 456 452 457 458 !jg+ temporary test 459 REAL, DIMENSION(klon,klev) :: y_flux_u_old, y_flux_v_old 460 REAL, DIMENSION(klon,klev) :: y_d_u_old, y_d_v_old 461 !jg- 462 453 463 !**************************************************************************************** 454 464 ! End of declarations … … 514 524 flux_u = 0.0 ; flux_v = 0.0 ; d_t = 0.0 ; d_q = 0.0 515 525 d_u = 0.0 ; d_v = 0.0 ; zcoefh = 0.0 ; yqsol = 0.0 516 ytherm = 0.0 526 ytherm = 0.0 ; ytke=0. 517 527 518 528 ytsoil = 999999. … … 657 667 ypplay(j,k) = pplay(i,k) 658 668 ydelp(j,k) = delp(i,k) 669 ytke(j,k)=tke(i,k,nsrf) 659 670 yu(j,k) = u(i,k) 660 671 yv(j,k) = v(i,k) … … 687 698 CALL coef_diff_turb(dtime, nsrf, knon, ni, & 688 699 ypaprs, ypplay, yu, yv, yq, yt, yts, yrugos, yqsurf, & 689 ycoefm, ycoefh )700 ycoefm, ycoefh,ytke) 690 701 691 702 !**************************************************************************************** … … 839 850 !**************************************************************************************** 840 851 852 tke(:,:,nsrf)=0. 841 853 DO k = 1, klev 842 854 DO j = 1, knon … … 853 865 flux_u(i,k,nsrf) = y_flux_u(j,k) 854 866 flux_v(i,k,nsrf) = y_flux_v(j,k) 867 868 tke(i,k,nsrf)=ytke(j,k) 869 855 870 ENDDO 856 871 ENDDO -
LMDZ4/trunk/libf/phylmd/phyetat0.F
r782 r878 13 13 . rugsrel_p,tabcntr0, 14 14 . t_ancien_p,q_ancien_p,ancien_ok_p, rnebcon_p, ratqs_p, 15 . clwcon_p )15 . clwcon_p,pbl_tke_p) 16 16 17 17 USE dimphy … … 37 37 #include "clesphys.h" 38 38 #include "temps.h" 39 #include "thermcell.h" 40 #include "compbl.h" 39 41 c====================================================================== 40 42 CHARACTER*(*) fichnom … … 45 47 REAL solaire_etat0 46 48 REAL tsol_p(klon,nbsrf) 49 REAL pbl_tke_p(klon,klev,nbsrf) 47 50 REAL tsoil_p(klon,nsoilmx,nbsrf) 48 51 REAL tslab_p(klon), seaice_p(klon) … … 83 86 REAL rlat(klon_glo), rlon(klon_glo) 84 87 REAL tsol(klon_glo,nbsrf) 88 REAL pbl_tke(klon_glo,klev,nbsrf) 85 89 REAL tsoil(klon_glo,nsoilmx,nbsrf) 86 90 cIM "slab" ocean … … 127 131 c 128 132 INTEGER nid, nvarid 129 INTEGER ierr, i, nsrf, isoil 133 INTEGER ierr, i, nsrf, isoil ,k 130 134 INTEGER length 131 135 PARAMETER (length=100) … … 1492 1496 xmax = MAXval(run_off_lic_0) 1493 1497 PRINT*,'(ecart-type) run_off_lic_0:', xmin, xmax 1498 1499 1500 c Lecture de l'energie cinetique turbulente 1501 c 1502 1503 IF (iflag_pbl>1) then 1504 PRINT*, 'phyetat0: Le champ <TKE> est absent' 1505 PRINT*, ' Mais je vais essayer de lire TKE**' 1506 DO nsrf = 1, nbsrf 1507 IF (nsrf.GT.99) THEN 1508 PRINT*, "Trop de sous-mailles" 1509 CALL abort 1510 ENDIF 1511 WRITE(str2,'(i2.2)') nsrf 1512 ierr = NF_INQ_VARID (nid, "TKE"//str2, nvarid) 1513 IF (ierr.NE.NF_NOERR) THEN 1514 PRINT*, "WARNING phyetat0: <TKE"//str2//"> est absent" 1515 pbl_tke(:,:,nsrf)=1.e-8 1516 ELSE 1517 #ifdef NC_DOUBLE 1518 ierr = NF_GET_VAR_DOUBLE(nid, nvarid, pbl_tke(1,1,nsrf)) 1519 #else 1520 ierr = NF_GET_VAR_REAL(nid, nvarid, pbl_tke(1,1,nsrf)) 1521 #endif 1522 IF (ierr.NE.NF_NOERR) THEN 1523 PRINT*, "WARNING phyetat0: echec lect <TKE"//str2//">" 1524 CALL abort 1525 ENDIF 1526 ENDIF 1527 1528 xmin = 1.0E+20 1529 xmax = -1.0E+20 1530 DO k = 1, klev 1531 DO i = 1, klon_glo 1532 xmin = MIN(pbl_tke(i,k,nsrf),xmin) 1533 xmax = MAX(pbl_tke(i,k,nsrf),xmax) 1534 ENDDO 1535 ENDDO 1536 PRINT*,'Temperature du sol TKE**:', nsrf, xmin, xmax 1537 ENDDO 1538 ENDIF 1539 1494 1540 c 1495 1541 c Fermer le fichier: … … 1516 1562 call Scatter( rlon,rlon_p) 1517 1563 call Scatter( tsol,tsol_p) 1564 IF (iflag_pbl>1) then 1565 call Scatter( pbl_tke,pbl_tke_p) 1566 endif 1518 1567 call Scatter( tsoil,tsoil_p) 1519 1568 call Scatter( tslab,tslab_p) -
LMDZ4/trunk/libf/phylmd/phyredem.F
r782 r878 9 9 . radsol_p,zmea_p,zstd_p,zsig_p, 10 10 . zgam_p,zthe_p,zpic_p,zval_p,rugsrel_p, 11 . t_ancien_p, q_ancien_p, rnebcon_p, ratqs_p, clwcon_p) 11 . t_ancien_p, q_ancien_p, rnebcon_p, ratqs_p, clwcon_p, 12 . pbl_tke_p) 12 13 13 14 USE dimphy … … 29 30 #include "control.h" 30 31 #include "temps.h" 32 #include "thermcell.h" 33 #include "compbl.h" 31 34 c====================================================================== 32 35 CHARACTER*(*) fichnom … … 35 38 REAL rlat_p(klon), rlon_p(klon) 36 39 REAL tsol_p(klon,nbsrf) 40 REAL pbl_tke_p(klon,klev,nbsrf) 37 41 REAL tsoil_p(klon,nsoilmx,nbsrf) 38 42 CHARACTER*6 ocean … … 70 74 REAL rlat(klon_glo), rlon(klon_glo) 71 75 REAL tsol(klon_glo,nbsrf) 76 REAL pbl_tke(klon_glo,klev,nbsrf) 72 77 REAL tsoil(klon_glo,nsoilmx,nbsrf) 73 78 REAL tslab(klon_glo), seaice(klon_glo) … … 135 140 call Gather( rlon_p,rlon) 136 141 call Gather( tsol_p,tsol) 142 call Gather( pbl_tke_p,pbl_tke) 137 143 call Gather( tsoil_p,tsoil) 138 144 call Gather( tslab_p,tslab) … … 899 905 c 900 906 c 907 !!!!!!!!!!!!!!!!!!!! DEB TKE PBL !!!!!!!!!!!!!!!!!!!!!!!!! 908 c 909 IF (iflag_pbl>1) then 910 DO nsrf = 1, nbsrf 911 IF (nsrf.LE.99) THEN 912 WRITE(str2,'(i2.2)') nsrf 913 ierr = NF_REDEF (nid) 914 #ifdef NC_DOUBLE 915 ierr = NF_DEF_VAR (nid,"TKE"//str2,NF_DOUBLE,1,idim3 916 $ ,nvarid) 917 #else 918 ierr = NF_DEF_VAR (nid,"TKE"//str2,NF_FLOAT,1,idim3 919 $ ,nvarid) 920 #endif 921 ierr = NF_PUT_ATT_TEXT (nid,nvarid,"title", 15, 922 . "Energ. Cineti. Turb."//str2) 923 ierr = NF_ENDDEF(nid) 924 ELSE 925 PRINT*, "Trop de sous-mailles" 926 CALL abort 927 ENDIF 928 #ifdef NC_DOUBLE 929 ierr = NF_PUT_VAR_DOUBLE (nid,nvarid,pbl_tke(:,:,nsrf)) 930 #else 931 ierr = NF_PUT_VAR_REAL (nid,nvarid,pbl_tke(:,:,nsrf)) 932 #endif 933 ENDDO 934 ENDIF 935 936 !!!!!!!!!!!!!!!!!!!! FIN TKE PBL !!!!!!!!!!!!!!!!!!!!!!!!! 937 c 901 938 ierr = NF_CLOSE(nid) 902 939 c -
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 -
LMDZ4/trunk/libf/phylmd/thermcell.F
r776 r878 1 ! 2 ! $Header$ 3 ! 4 5 SUBROUTINE thermcell(ngrid,nlay,ptimestep 6 s ,pplay,pplev,pphi 1 SUBROUTINE calcul_sec(ngrid,nlay,ptimestep 2 s ,pplay,pplev,pphi,zlev 7 3 s ,pu,pv,pt,po 8 s ,pduadj,pdvadj,pdtadj,pdoadj 9 s ,fm0,entr0 4 s ,zmax,wmax,zw2,lmix 10 5 c s ,pu_therm,pv_therm 11 6 s ,r_aspect,l_mix,w2di,tho) 12 USE dimphy 7 13 8 IMPLICIT NONE 14 9 … … 18 13 c de "thermiques" explicitement representes 19 14 c 20 c R eecriture apartir d'un listing papier à Habas, le 14/02/0021 c 22 c le thermique est suppos e homogene et dissipe par melange avec23 c son environnement. la longueur l_mix contr ole l'efficacitedu24 c m elange25 c 26 c Le calcul du transport des diff erentes especes se fait en prenant15 c Réécriture à partir d'un listing papier à Habas, le 14/02/00 16 c 17 c le thermique est supposé homogène et dissipé par mélange avec 18 c son environnement. la longueur l_mix contrôle l'efficacité du 19 c mélange 20 c 21 c Le calcul du transport des différentes espèces se fait en prenant 27 22 c en compte: 28 23 c 1. un flux de masse montant … … 37 32 c ------------- 38 33 39 cym#include "dimensions.h"40 cym#include "dimphy.h"34 #include "dimensions.h" 35 #include "dimphy.h" 41 36 #include "YOMCST.h" 42 37 … … 56 51 save idetr 57 52 data idetr/3/ 58 c$OMP THREADPRIVATE(idetr) 53 59 54 c local: 60 55 c ------ … … 89 84 real fracc(klon,klev+1) 90 85 real zf,zf2 91 real,allocatable,save :: thetath2(:,:),wth2(:,:) 92 c$OMP THREADPRIVATE(thetath2,wth2) 93 cym common/comtherm/thetath2,wth2 86 real thetath2(klon,klev),wth2(klon,klev) 87 common/comtherm/thetath2,wth2 94 88 95 89 real count_time … … 98 92 data isplit/0/ 99 93 save isplit 100 c$OMP THREADPRIVATE(isplit) 94 101 95 logical sorties 102 96 real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev) … … 116 110 real fm(klon,klev+1),entr(klon,klev) 117 111 real fmc(klon,klev+1) 118 112 119 113 cCR:nouvelles variables 120 114 real f_star(klon,klev+1),entr_star(klon,klev) 121 115 real entr_star_tot(klon),entr_star2(klon) 116 real zalim(klon) 117 integer lalim(klon) 118 real norme(klon) 122 119 real f(klon), f0(klon) 123 120 real zlevinter(klon) 121 logical therm 124 122 logical first 125 123 data first /.false./ 126 124 save first 127 c$OMP THREADPRIVATE(first)128 125 cRC 129 126 … … 138 135 save ncorrec 139 136 data ncorrec/0/ 140 c$OMP THREADPRIVATE(ncorrec) 141 logical,save :: firstCall=.true. 142 c$OMP THREADPRIVATE(firstCall) 137 143 138 c 144 139 c----------------------------------------------------------------------- … … 146 141 c --------------- 147 142 c 148 if (firstcall) then149 allocate(thetath2(klon,klev),wth2(klon,klev))150 thetath2(:,:)=0.151 wth2(:,:)=0.152 firstcall=.false.153 endif154 155 143 sorties=.true. 156 144 IF(ngrid.NE.klon) THEN … … 165 153 c --------------------------------------------------- 166 154 167 print*,'0 OK convect8'155 c print*,'0 OK convect8' 168 156 169 157 DO 1010 l=1,nlay … … 178 166 1010 CONTINUE 179 167 180 print*,'1 OK convect8'168 c print*,'1 OK convect8' 181 169 c -------------------- 182 170 c … … 291 279 292 280 con ne considere que les premieres couches instables 281 therm=.false. 293 282 do k=nlay-2,1,-1 294 283 do ig=1,ngrid 295 284 if (ztv(ig,k).gt.ztv(ig,k+1).and. 296 285 s ztv(ig,k+1).le.ztv(ig,k+2)) then 297 lentr(ig)=k 286 lentr(ig)=k+1 287 therm=.true. 298 288 endif 299 289 enddo 300 290 enddo 301 291 climitation de la valeur du lentr 292 c do ig=1,ngrid 293 c lentr(ig)=min(5,lentr(ig)) 294 c enddo 302 295 c determination du lmin: couche d ou provient le thermique 303 296 do ig=1,ngrid … … 309 302 lmin(ig)=l-1 310 303 endif 304 enddo 305 enddo 306 cinitialisations 307 do ig=1,ngrid 308 zalim(ig)=0. 309 norme(ig)=0. 310 lalim(ig)=1 311 enddo 312 do k=1,klev-1 313 do ig=1,ngrid 314 zalim(ig)=zalim(ig)+zlev(ig,k)*MAX(0.,(ztv(ig,k)-ztv(ig,k+1)) 315 s /(zlev(ig,k+1)-zlev(ig,k))) 316 c s *(zlev(ig,k+1)-zlev(ig,k)) 317 norme(ig)=norme(ig)+MAX(0.,(ztv(ig,k)-ztv(ig,k+1)) 318 s /(zlev(ig,k+1)-zlev(ig,k))) 319 c s *(zlev(ig,k+1)-zlev(ig,k)) 320 enddo 321 enddo 322 do ig=1,ngrid 323 if (norme(ig).gt.1.e-10) then 324 zalim(ig)=max(10.*zalim(ig)/norme(ig),zlev(ig,2)) 325 c zalim(ig)=min(zalim(ig),zlev(ig,lentr(ig))) 326 endif 327 enddo 328 cdétermination du lalim correspondant 329 do k=1,klev-1 330 do ig=1,ngrid 331 if ((zalim(ig).gt.zlev(ig,k)).and.(zalim(ig).le.zlev(ig,k+1))) 332 s then 333 lalim(ig)=k 334 endif 311 335 enddo 312 336 enddo … … 316 340 do ig=1,ngrid 317 341 if (ztv(ig,l).gt.ztv(ig,l+1).and. 318 s l.ge.lmin(ig).and.l.le.lentr(ig)) then 319 entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))* 320 s (zlev(ig,l+1)-zlev(ig,l)) 321 endif 322 enddo 323 enddo 324 c pas de thermique si couches 1->5 stables 342 s l.ge.lmin(ig).and.l.lt.lentr(ig)) then 343 entr_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) 344 c s *(zlev(ig,l+1)-zlev(ig,l)) 345 s *sqrt(zlev(ig,l+1)) 346 cautre def 347 c entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 348 c s /zlev(ig,lentr(ig)+2)))**(3./2.) 349 endif 350 enddo 351 enddo 352 cnouveau test 353 c if (therm) then 354 do l=1,klev-1 355 do ig=1,ngrid 356 if (ztv(ig,l).gt.ztv(ig,l+1).and. 357 s l.ge.lmin(ig).and.l.le.lalim(ig) 358 s .and.zalim(ig).gt.1.e-10) then 359 c if (l.le.lentr(ig)) then 360 c entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 361 c s /zalim(ig)))**(3./2.) 362 c write(10,*)zlev(ig,l),entr_star(ig,l) 363 endif 364 enddo 365 enddo 366 c endif 367 c pas de thermique si couche 1 stable 325 368 do ig=1,ngrid 326 369 if (lmin(ig).gt.5) then … … 339 382 enddo 340 383 enddo 341 c 342 print*,'fin calcul entr_star' 384 c Calcul entrainement normalise 385 do ig=1,ngrid 386 if (entr_star_tot(ig).gt.1.e-10) then 387 c do l=1,lentr(ig) 388 do l=1,klev 389 cdef possibles pour entr_star: zdthetadz, dthetadz, zdtheta 390 entr_star(ig,l)=entr_star(ig,l)/entr_star_tot(ig) 391 enddo 392 endif 393 enddo 394 c 395 c print*,'fin calcul entr_star' 343 396 do k=1,klev 344 397 do ig=1,ngrid … … 394 447 ctest 395 448 if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then 396 print*,'pb linter'449 c print*,'pb linter' 397 450 endif 398 451 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) … … 402 455 else 403 456 if (zw2(ig,l+1).lt.0.) then 404 print*,'pb1 zw2<0'457 c print*,'pb1 zw2<0' 405 458 endif 406 459 wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) … … 413 466 enddo 414 467 enddo 415 print*,'fin calcul zw2'468 c print*,'fin calcul zw2' 416 469 c 417 470 c Calcul de la couche correspondant a la hauteur du thermique 418 471 do ig=1,ngrid 419 472 lmax(ig)=lentr(ig) 473 c lmax(ig)=lalim(ig) 420 474 enddo 421 475 do ig=1,ngrid 422 476 do l=nlay,lentr(ig)+1,-1 477 c do l=nlay,lalim(ig)+1,-1 423 478 if (zw2(ig,l).le.1.e-10) then 424 479 lmax(ig)=l-1 … … 426 481 enddo 427 482 enddo 428 c pas de thermique si couche s 1->5 stables483 c pas de thermique si couche 1 stable 429 484 do ig=1,ngrid 430 485 if (lmin(ig).gt.5) then 431 486 lmax(ig)=1 432 487 lmin(ig)=1 488 lentr(ig)=1 489 lalim(ig)=1 433 490 endif 434 491 enddo … … 443 500 if (l.le.lmax(ig)) then 444 501 if (zw2(ig,l).lt.0.)then 445 print*,'pb2 zw2<0'502 c print*,'pb2 zw2<0' 446 503 endif 447 504 zw2(ig,l)=sqrt(zw2(ig,l)) … … 465 522 zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) 466 523 enddo 467 468 print*,'avant fermeture' 524 do ig=1,ngrid 525 c write(8,*)zmax(ig),lmax(ig),lentr(ig),lmin(ig) 526 enddo 527 con stoppe après les calculs de zmax et wmax 528 RETURN 529 530 c print*,'avant fermeture' 469 531 c Fermeture,determination de f 532 cAttention! entrainement normalisé ou pas? 470 533 do ig=1,ngrid 471 534 entr_star2(ig)=0. … … 476 539 else 477 540 do k=lmin(ig),lentr(ig) 541 c do k=lmin(ig),lalim(ig) 478 542 entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2 479 543 s /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) … … 481 545 c Nouvelle fermeture 482 546 f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect 483 s *entr_star2(ig))*entr_star_tot(ig) 547 s *entr_star2(ig)) 548 c s *entr_star_tot(ig) 484 549 ctest 485 550 c if (first) then 486 cf(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)487 cs *wmax(ig))551 f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) 552 s *wmax(ig)) 488 553 c endif 489 554 endif 490 cf0(ig)=f(ig)555 f0(ig)=f(ig) 491 556 c first=.true. 492 557 enddo 493 print*,'apres fermeture' 494 558 c print*,'apres fermeture' 559 con stoppe après la fermeture 560 RETURN 495 561 c Calcul de l'entrainement 496 562 do k=1,klev … … 499 565 enddo 500 566 enddo 567 con stoppe après le calcul de entr 568 c RETURN 569 cCR:test pour entrainer moins que la masse 570 c do ig=1,ngrid 571 c do l=1,lentr(ig) 572 c if ((entr(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) then 573 c entr(ig,l+1)=entr(ig,l+1)+entr(ig,l) 574 c s -0.9*masse(ig,l)/ptimestep 575 c entr(ig,l)=0.9*masse(ig,l)/ptimestep 576 c endif 577 c enddo 578 c enddo 579 cCR: fin test 501 580 c Calcul des flux 502 581 do ig=1,ngrid … … 516 595 c calcul de la largeur de chaque ascendance dans le cas conservatif. 517 596 c dans ce cas simple, on suppose que la largeur de l'ascendance provenant 518 c d'une couche est egale ala hauteur de la couche alimentante.597 c d'une couche est égale à la hauteur de la couche alimentante. 519 598 c La vitesse maximale dans l'ascendance est aussi prise comme estimation 520 599 c de la vitesse d'entrainement horizontal dans la couche alimentante. … … 536 615 c cette option est finalement en dur. 537 616 if ((l_mix*zlev(ig,l)).lt.0.)then 538 print*,'pb l_mix*zlev<0'617 c print*,'pb l_mix*zlev<0' 539 618 endif 619 cCR: test: nouvelle def de lambda 620 c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 621 if (zw2(ig,l).gt.1.e-10) then 622 larg_detr(ig,l)=sqrt((l_mix/zw2(ig,l))*zlev(ig,l)) 623 else 540 624 larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 625 endif 626 cRC 541 627 c else if (idetr.eq.1) then 542 628 c larg_detr(ig,l)=larg_cons(ig,l) … … 555 641 c print*,'10 OK convect8' 556 642 c print*,'WA2 ',wa_moy 557 c calcul de la fraction de la maille concern epar l'ascendance en tenant643 c calcul de la fraction de la maille concernée par l'ascendance en tenant 558 644 c compte de l'epluchage du thermique. 559 645 c … … 578 664 else 579 665 zmix(ig)=zlev(ig,lmix(ig)) 580 print*,'pb zmix'666 c print*,'pb zmix' 581 667 endif 582 668 else … … 657 743 enddo 658 744 659 print*,'fin calcul fraca'745 c print*,'fin calcul fraca' 660 746 c print*,'11 OK convect8' 661 747 c print*,'Ea3 ',wa_moy … … 700 786 enddo 701 787 702 print*,'12 OK convect8'788 c print*,'12 OK convect8' 703 789 c print*,'WA4 ',wa_moy 704 790 cc------------------------------------------------------------------ … … 760 846 detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) 761 847 if (detr(ig,l).lt.0.) then 762 entr(ig,l)=entr(ig,l)-detr(ig,l) 848 c entr(ig,l)=entr(ig,l)-detr(ig,l) 849 fm(ig,l+1)=fm(ig,l)+entr(ig,l) 763 850 detr(ig,l)=0. 764 851 c print*,'WARNING !!! detrainement negatif ',ig,l … … 831 918 c enddo 832 919 833 print*,'14 OK convect8'920 c print*,'14 OK convect8' 834 921 c------------------------------------------------------------------ 835 922 c Calculs pour les sorties … … 901 988 #endif 902 989 123 continue 903 c#define troisD990 #define troisD 904 991 #ifdef troisD 905 992 c if (sorties) then … … 988 1075 c if(wa_moy(1,4).gt.1.e-10) stop 989 1076 990 print*,'19 OK convect8'1077 c print*,'19 OK convect8' 991 1078 return 992 1079 end 993 1080 994 subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse 995 . ,q,dq,qa) 996 use dimphy 997 implicit none 998 999 c======================================================================= 1000 c 1001 c Calcul du transport verticale dans la couche limite en presence 1002 c de "thermiques" explicitement representes 1003 c calcul du dq/dt une fois qu'on connait les ascendances 1004 c 1005 c======================================================================= 1006 1007 cym#include "dimensions.h" 1008 cym#include "dimphy.h" 1009 1010 integer ngrid,nlay 1011 1012 real ptimestep 1013 real masse(ngrid,nlay),fm(ngrid,nlay+1) 1014 real entr(ngrid,nlay) 1015 real q(ngrid,nlay) 1016 real dq(ngrid,nlay) 1017 1018 real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) 1019 1020 integer ig,k 1021 1022 c calcul du detrainement 1023 1024 do k=1,nlay 1025 do ig=1,ngrid 1026 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) 1027 enddo 1028 enddo 1029 1030 c calcul de la valeur dans les ascendances 1031 do ig=1,ngrid 1032 qa(ig,1)=q(ig,1) 1033 enddo 1034 1035 do k=2,nlay 1036 do ig=1,ngrid 1037 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. 1038 s 1.e-5*masse(ig,k)) then 1039 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) 1040 s /(fm(ig,k+1)+detr(ig,k)) 1081 SUBROUTINE fermeture_seche(ngrid,nlay 1082 s ,pplay,pplev,pphi,zlev,rhobarz,f0,zpspsk 1083 s ,alim_star,zh,zo,lentr,lmin,nu_min,nu_max,r_aspect 1084 s ,zmax,wmax) 1085 1086 IMPLICIT NONE 1087 1088 #include "dimensions.h" 1089 #include "dimphy.h" 1090 #include "YOMCST.h" 1091 1092 INTEGER ngrid,nlay 1093 REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1) 1094 real pphi(ngrid,nlay) 1095 real zlev(klon,klev+1) 1096 real alim_star(klon,klev) 1097 real f0(klon) 1098 integer lentr(klon) 1099 integer lmin(klon) 1100 real zmax(klon) 1101 real wmax(klon) 1102 real nu_min 1103 real nu_max 1104 real r_aspect 1105 real rhobarz(klon,klev+1) 1106 REAL zh(klon,klev) 1107 real zo(klon,klev) 1108 real zpspsk(klon,klev) 1109 1110 integer ig,l 1111 1112 real f_star(klon,klev+1) 1113 real detr_star(klon,klev) 1114 real entr_star(klon,klev) 1115 real zw2(klon,klev+1) 1116 real linter(klon) 1117 integer lmix(klon) 1118 integer lmax(klon) 1119 real zlevinter(klon) 1120 real wa_moy(klon,klev+1) 1121 real wmaxa(klon) 1122 REAL ztv(klon,klev) 1123 REAL ztva(klon,klev) 1124 real nu(klon,klev) 1125 real zmax0_sec(klon) 1126 save zmax0_sec 1127 1128 do l=1,nlay 1129 do ig=1,ngrid 1130 ztv(ig,l)=zh(ig,l)/zpspsk(ig,l) 1131 ztv(ig,l)=ztv(ig,l)*(1.+RETV*zo(ig,l)) 1132 enddo 1133 enddo 1134 do l=1,nlay-2 1135 do ig=1,ngrid 1136 if (ztv(ig,l).gt.ztv(ig,l+1) 1137 s .and.alim_star(ig,l).gt.1.e-10 1138 s .and.zw2(ig,l).lt.1e-10) then 1139 f_star(ig,l+1)=alim_star(ig,l) 1140 ctest:calcul de dteta 1141 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) 1142 s *(zlev(ig,l+1)-zlev(ig,l)) 1143 s *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l)) 1144 else if ((zw2(ig,l).ge.1e-10).and. 1145 s (f_star(ig,l)+alim_star(ig,l)).gt.1.e-10) then 1146 cestimation du detrainement a partir de la geometrie du pas precedent 1147 ctests sur la definition du detr 1148 nu(ig,l)=(nu_min+nu_max)/2. 1149 s *(1.-(nu_max-nu_min)/(nu_max+nu_min) 1150 s *tanh((((ztva(ig,l-1)-ztv(ig,l))/ztv(ig,l))/0.0005))) 1151 1152 detr_star(ig,l)=rhobarz(ig,l) 1153 s *sqrt(zw2(ig,l)) 1154 s /(r_aspect*zmax0_sec(ig))* 1155 c s /(r_aspect*zmax0(ig))* 1156 s (sqrt(nu(ig,l)*zlev(ig,l+1) 1157 s /sqrt(zw2(ig,l))) 1158 s -sqrt(nu(ig,l)*zlev(ig,l) 1159 s /sqrt(zw2(ig,l)))) 1160 detr_star(ig,l)=detr_star(ig,l)/f0(ig) 1161 if ((detr_star(ig,l)).gt.f_star(ig,l)) then 1162 detr_star(ig,l)=f_star(ig,l) 1163 endif 1164 entr_star(ig,l)=0.9*detr_star(ig,l) 1165 if ((l.lt.lentr(ig))) then 1166 entr_star(ig,l)=0. 1167 c detr_star(ig,l)=0. 1168 endif 1169 print*,'ok detr_star' 1170 cprise en compte du detrainement dans le calcul du flux 1171 f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) 1172 s -detr_star(ig,l) 1173 ctest sur le signe de f_star 1174 if ((f_star(ig,l+1)+detr_star(ig,l)).gt.1.e-10) then 1175 cAM on melange Tl et qt du thermique 1176 ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+(entr_star(ig,l) 1177 s +alim_star(ig,l)) 1178 s *ztv(ig,l))/(f_star(ig,l+1)+detr_star(ig,l)) 1179 zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l) 1180 s /(f_star(ig,l+1)+detr_star(ig,l)))**2+ 1181 s 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) 1182 s *(zlev(ig,l+1)-zlev(ig,l)) 1183 endif 1184 endif 1185 c 1186 if (zw2(ig,l+1).lt.0.) then 1187 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) 1188 s -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) 1189 zw2(ig,l+1)=0. 1190 print*,'linter=',linter(ig) 1041 1191 else 1042 qa(ig,k)=q(ig,k) 1043 endif 1044 enddo 1045 enddo 1046 1047 do k=2,nlay 1048 do ig=1,ngrid 1049 c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) 1050 wqd(ig,k)=fm(ig,k)*q(ig,k) 1051 enddo 1052 enddo 1053 do ig=1,ngrid 1054 wqd(ig,1)=0. 1055 wqd(ig,nlay+1)=0. 1056 enddo 1057 1058 do k=1,nlay 1059 do ig=1,ngrid 1060 dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) 1061 s -wqd(ig,k)+wqd(ig,k+1)) 1062 s /masse(ig,k) 1063 enddo 1064 enddo 1065 1066 return 1067 end 1068 subroutine dvthermcell(ngrid,nlay,ptimestep,fm,entr,masse 1069 . ,fraca,larga 1070 . ,u,v,du,dv,ua,va) 1071 use dimphy 1072 implicit none 1073 1074 c======================================================================= 1075 c 1076 c Calcul du transport verticale dans la couche limite en presence 1077 c de "thermiques" explicitement representes 1078 c calcul du dq/dt une fois qu'on connait les ascendances 1079 c 1080 c======================================================================= 1081 1082 cym#include "dimensions.h" 1083 cym#include "dimphy.h" 1084 1085 integer ngrid,nlay 1086 1087 real ptimestep 1088 real masse(ngrid,nlay),fm(ngrid,nlay+1) 1089 real fraca(ngrid,nlay+1) 1090 real larga(ngrid) 1091 real entr(ngrid,nlay) 1092 real u(ngrid,nlay) 1093 real ua(ngrid,nlay) 1094 real du(ngrid,nlay) 1095 real v(ngrid,nlay) 1096 real va(ngrid,nlay) 1097 real dv(ngrid,nlay) 1098 1099 real qa(klon,klev),detr(klon,klev) 1100 real wvd(klon,klev+1),wud(klon,klev+1) 1101 real gamma0,gamma(klon,klev+1) 1102 real dua,dva 1103 integer iter 1104 1105 integer ig,k 1106 1107 c calcul du detrainement 1108 1109 do k=1,nlay 1110 do ig=1,ngrid 1111 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) 1112 enddo 1113 enddo 1114 1115 c calcul de la valeur dans les ascendances 1116 do ig=1,ngrid 1117 ua(ig,1)=u(ig,1) 1118 va(ig,1)=v(ig,1) 1119 enddo 1120 1121 do k=2,nlay 1122 do ig=1,ngrid 1123 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. 1124 s 1.e-5*masse(ig,k)) then 1125 c On itere sur la valeur du coeff de freinage. 1126 c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 1127 gamma0=masse(ig,k) 1128 s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) 1129 s *0.5/larga(ig) 1130 c gamma0=0. 1131 c la premiere fois on multiplie le coefficient de freinage 1132 c par le module du vent dans la couche en dessous. 1133 dua=ua(ig,k-1)-u(ig,k-1) 1134 dva=va(ig,k-1)-v(ig,k-1) 1135 do iter=1,5 1136 gamma(ig,k)=gamma0*sqrt(dua**2+dva**2) 1137 ua(ig,k)=(fm(ig,k)*ua(ig,k-1) 1138 s +(entr(ig,k)+gamma(ig,k))*u(ig,k)) 1139 s /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k)) 1140 va(ig,k)=(fm(ig,k)*va(ig,k-1) 1141 s +(entr(ig,k)+gamma(ig,k))*v(ig,k)) 1142 s /(fm(ig,k+1)+detr(ig,k)+gamma(ig,k)) 1143 c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva 1144 dua=ua(ig,k)-u(ig,k) 1145 dva=va(ig,k)-v(ig,k) 1146 enddo 1192 wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) 1193 endif 1194 if (wa_moy(ig,l+1).gt.wmaxa(ig)) then 1195 c lmix est le niveau de la couche ou w (wa_moy) est maximum 1196 lmix(ig)=l+1 1197 wmaxa(ig)=wa_moy(ig,l+1) 1198 endif 1199 enddo 1200 enddo 1201 print*,'fin calcul zw2' 1202 c 1203 c Calcul de la couche correspondant a la hauteur du thermique 1204 do ig=1,ngrid 1205 lmax(ig)=lentr(ig) 1206 enddo 1207 do ig=1,ngrid 1208 do l=nlay,lentr(ig)+1,-1 1209 if (zw2(ig,l).le.1.e-10) then 1210 lmax(ig)=l-1 1211 endif 1212 enddo 1213 enddo 1214 c pas de thermique si couche 1 stable 1215 do ig=1,ngrid 1216 if (lmin(ig).gt.1) then 1217 lmax(ig)=1 1218 lmin(ig)=1 1219 lentr(ig)=1 1220 endif 1221 enddo 1222 c 1223 c Determination de zw2 max 1224 do ig=1,ngrid 1225 wmax(ig)=0. 1226 enddo 1227 1228 do l=1,nlay 1229 do ig=1,ngrid 1230 if (l.le.lmax(ig)) then 1231 if (zw2(ig,l).lt.0.)then 1232 print*,'pb2 zw2<0' 1233 endif 1234 zw2(ig,l)=sqrt(zw2(ig,l)) 1235 wmax(ig)=max(wmax(ig),zw2(ig,l)) 1147 1236 else 1148 ua(ig,k)=u(ig,k) 1149 va(ig,k)=v(ig,k) 1150 gamma(ig,k)=0. 1151 endif 1152 enddo 1153 enddo 1154 1155 do k=2,nlay 1156 do ig=1,ngrid 1157 wud(ig,k)=fm(ig,k)*u(ig,k) 1158 wvd(ig,k)=fm(ig,k)*v(ig,k) 1159 enddo 1160 enddo 1161 do ig=1,ngrid 1162 wud(ig,1)=0. 1163 wud(ig,nlay+1)=0. 1164 wvd(ig,1)=0. 1165 wvd(ig,nlay+1)=0. 1166 enddo 1167 1168 do k=1,nlay 1169 do ig=1,ngrid 1170 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) 1171 s -(entr(ig,k)+gamma(ig,k))*u(ig,k) 1172 s -wud(ig,k)+wud(ig,k+1)) 1173 s /masse(ig,k) 1174 dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k) 1175 s -(entr(ig,k)+gamma(ig,k))*v(ig,k) 1176 s -wvd(ig,k)+wvd(ig,k+1)) 1177 s /masse(ig,k) 1178 enddo 1179 enddo 1180 1181 return 1182 end 1183 subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac 1184 . ,q,dq,qa) 1185 use dimphy 1186 implicit none 1187 1188 c======================================================================= 1189 c 1190 c Calcul du transport verticale dans la couche limite en presence 1191 c de "thermiques" explicitement representes 1192 c calcul du dq/dt une fois qu'on connait les ascendances 1193 c 1194 c======================================================================= 1195 1196 cym#include "dimensions.h" 1197 cym#include "dimphy.h" 1198 1199 integer ngrid,nlay 1200 1201 real ptimestep 1202 real masse(ngrid,nlay),fm(ngrid,nlay+1) 1203 real entr(ngrid,nlay),frac(ngrid,nlay) 1204 real q(ngrid,nlay) 1205 real dq(ngrid,nlay) 1206 1207 real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) 1208 real qe(klon,klev),zf,zf2 1209 1210 integer ig,k 1211 1212 c calcul du detrainement 1213 1214 do k=1,nlay 1215 do ig=1,ngrid 1216 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) 1217 enddo 1218 enddo 1219 1220 c calcul de la valeur dans les ascendances 1221 do ig=1,ngrid 1222 qa(ig,1)=q(ig,1) 1223 qe(ig,1)=q(ig,1) 1224 enddo 1225 1226 do k=2,nlay 1227 do ig=1,ngrid 1228 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. 1229 s 1.e-5*masse(ig,k)) then 1230 zf=0.5*(frac(ig,k)+frac(ig,k+1)) 1231 zf2=1./(1.-zf) 1232 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k)) 1233 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2) 1234 qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2 1235 else 1236 qa(ig,k)=q(ig,k) 1237 qe(ig,k)=q(ig,k) 1238 endif 1239 enddo 1240 enddo 1241 1242 do k=2,nlay 1243 do ig=1,ngrid 1244 c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) 1245 wqd(ig,k)=fm(ig,k)*qe(ig,k) 1246 enddo 1247 enddo 1248 do ig=1,ngrid 1249 wqd(ig,1)=0. 1250 wqd(ig,nlay+1)=0. 1251 enddo 1252 1253 do k=1,nlay 1254 do ig=1,ngrid 1255 dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k) 1256 s -wqd(ig,k)+wqd(ig,k+1)) 1257 s /masse(ig,k) 1258 enddo 1259 enddo 1260 1261 return 1262 end 1263 subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse 1264 . ,fraca,larga 1265 . ,u,v,du,dv,ua,va) 1266 use dimphy 1267 implicit none 1268 1269 c======================================================================= 1270 c 1271 c Calcul du transport verticale dans la couche limite en presence 1272 c de "thermiques" explicitement representes 1273 c calcul du dq/dt une fois qu'on connait les ascendances 1274 c 1275 c======================================================================= 1276 1277 cym#include "dimensions.h" 1278 cym#include "dimphy.h" 1279 1280 integer ngrid,nlay 1281 1282 real ptimestep 1283 real masse(ngrid,nlay),fm(ngrid,nlay+1) 1284 real fraca(ngrid,nlay+1) 1285 real larga(ngrid) 1286 real entr(ngrid,nlay) 1287 real u(ngrid,nlay) 1288 real ua(ngrid,nlay) 1289 real du(ngrid,nlay) 1290 real v(ngrid,nlay) 1291 real va(ngrid,nlay) 1292 real dv(ngrid,nlay) 1293 1294 real qa(klon,klev),detr(klon,klev),zf,zf2 1295 real wvd(klon,klev+1),wud(klon,klev+1) 1296 real gamma0,gamma(klon,klev+1) 1297 real ue(klon,klev),ve(klon,klev) 1298 real dua,dva 1299 integer iter 1300 1301 integer ig,k 1302 1303 c calcul du detrainement 1304 1305 do k=1,nlay 1306 do ig=1,ngrid 1307 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) 1308 enddo 1309 enddo 1310 1311 c calcul de la valeur dans les ascendances 1312 do ig=1,ngrid 1313 ua(ig,1)=u(ig,1) 1314 va(ig,1)=v(ig,1) 1315 ue(ig,1)=u(ig,1) 1316 ve(ig,1)=v(ig,1) 1317 enddo 1318 1319 do k=2,nlay 1320 do ig=1,ngrid 1321 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. 1322 s 1.e-5*masse(ig,k)) then 1323 c On itere sur la valeur du coeff de freinage. 1324 c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 1325 gamma0=masse(ig,k) 1326 s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) 1327 s *0.5/larga(ig) 1328 s *1. 1329 c s *0.5 1330 c gamma0=0. 1331 zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) 1332 zf=0. 1333 zf2=1./(1.-zf) 1334 c la premiere fois on multiplie le coefficient de freinage 1335 c par le module du vent dans la couche en dessous. 1336 dua=ua(ig,k-1)-u(ig,k-1) 1337 dva=va(ig,k-1)-v(ig,k-1) 1338 do iter=1,5 1339 c On choisit une relaxation lineaire. 1340 gamma(ig,k)=gamma0 1341 c On choisit une relaxation quadratique. 1342 gamma(ig,k)=gamma0*sqrt(dua**2+dva**2) 1343 ua(ig,k)=(fm(ig,k)*ua(ig,k-1) 1344 s +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k)) 1345 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 1346 s +gamma(ig,k)) 1347 va(ig,k)=(fm(ig,k)*va(ig,k-1) 1348 s +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k)) 1349 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 1350 s +gamma(ig,k)) 1351 c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva 1352 dua=ua(ig,k)-u(ig,k) 1353 dva=va(ig,k)-v(ig,k) 1354 ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2 1355 ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2 1356 enddo 1357 else 1358 ua(ig,k)=u(ig,k) 1359 va(ig,k)=v(ig,k) 1360 ue(ig,k)=u(ig,k) 1361 ve(ig,k)=v(ig,k) 1362 gamma(ig,k)=0. 1363 endif 1364 enddo 1365 enddo 1366 1367 do k=2,nlay 1368 do ig=1,ngrid 1369 wud(ig,k)=fm(ig,k)*ue(ig,k) 1370 wvd(ig,k)=fm(ig,k)*ve(ig,k) 1371 enddo 1372 enddo 1373 do ig=1,ngrid 1374 wud(ig,1)=0. 1375 wud(ig,nlay+1)=0. 1376 wvd(ig,1)=0. 1377 wvd(ig,nlay+1)=0. 1378 enddo 1379 1380 do k=1,nlay 1381 do ig=1,ngrid 1382 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) 1383 s -(entr(ig,k)+gamma(ig,k))*ue(ig,k) 1384 s -wud(ig,k)+wud(ig,k+1)) 1385 s /masse(ig,k) 1386 dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k) 1387 s -(entr(ig,k)+gamma(ig,k))*ve(ig,k) 1388 s -wvd(ig,k)+wvd(ig,k+1)) 1389 s /masse(ig,k) 1390 enddo 1391 enddo 1392 1393 return 1394 end 1237 zw2(ig,l)=0. 1238 endif 1239 enddo 1240 enddo 1241 1242 c Longueur caracteristique correspondant a la hauteur des thermiques. 1243 do ig=1,ngrid 1244 zmax(ig)=0. 1245 zlevinter(ig)=zlev(ig,1) 1246 enddo 1247 do ig=1,ngrid 1248 c calcul de zlevinter 1249 zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* 1250 s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) 1251 s -zlev(ig,lmax(ig))) 1252 cpour le cas ou on prend tjs lmin=1 1253 c zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) 1254 zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,1)) 1255 zmax0_sec(ig)=zmax(ig) 1256 enddo 1257 1258 RETURN 1259 END -
LMDZ4/trunk/libf/phylmd/thermcell.h
r776 r878 1 !2 ! $Header$3 !4 5 1 integer iflag_thermals,nsplit_thermals 6 2 real r_aspect_thermals,l_mix_thermals,tho_thermals 7 3 integer w2di_thermals,isplit 8 4 9 common/ctherm /iflag_thermals,nsplit_thermals10 s ,r_aspect_thermals,l_mix_thermals,tho_thermals11 s ,w2di_thermals5 common/ctherm1/iflag_thermals,nsplit_thermals 6 common/ctherm2/r_aspect_thermals,l_mix_thermals,tho_thermals 7 common/ctherm3/w2di_thermals 12 8 13 c$OMP THREADPRIVATE(/ctherm/) -
LMDZ4/trunk/libf/phylmd/write_histISCCP.h
r827 r878 20 20 cIM: champ 3d : (lon,lat,pres) pour un tau fixe 21 21 c 22 22 CALL histwrite_phy(nid_isccp,"cldISCCP_"//taulev(k)//verticaxe(n), 23 23 . itau_w,zx_tmp_fi3d) 24 24 ENDDO !k -
LMDZ4/trunk/libf/phylmd/write_histday.h
r782 r878 30 30 & pctsrf_new(:,is_ter)) 31 31 c 32 33 CALL histwrite_phy(nid_day,"dthmin",itau_w,dthmin) 34 CALL histwrite_phy(nid_day,"weakinv",itau_w,weak_inversion) 35 36 32 37 cym CALL gr_fi_ecrit(1, klon,iim,jjmp1, zxtsol,zx_tmp_2d) 33 38 CALL histwrite_phy(nid_day,"tsol",itau_w,zxtsol) … … 486 491 $ zx_tmp_fi2d) 487 492 C 493 ! FH Sorties specifiques pour Mellor et Yamada 494 if (iflag_pbl>1 .and. lev_histday.gt.10 ) then 495 496 CALL histwrite_phy(nid_day,"tke_"//clnsurf(nsrf),itau_w, 497 $ pbl_tke(:,1:klev,nsrf)) 498 499 CALL histwrite_phy(nid_day,"tke_max_"//clnsurf(nsrf),itau_w, 500 $ pbl_tke(:,1:klev,nsrf)) 501 endif 502 488 503 END DO 489 504 c================================================================= -
LMDZ4/trunk/libf/phylmd/write_histmth.h
r864 r878 681 681 IF(lev_histmth.GE.4) THEN 682 682 c 683 c FH Sorties pour la couche limite 684 CALL histwrite_phy(nid_mth,"kz",itau_w,ycoefh) 685 CALL histwrite_phy(nid_mth,"kz_max",itau_w,ycoefh) 686 687 if(iflag_pbl>1) then 688 zx_tmp_fi3d=0. 689 do nsrf=1,nbsrf 690 do k=1,klev 691 zx_tmp_fi3d(:,k)=zx_tmp_fi3d(:,k) 692 , +pctsrf(:,nsrf)*pbl_tke(:,k,nsrf) 693 enddo 694 enddo 695 CALL histwrite_phy(nid_mth,"tke",itau_w,zx_tmp_fi3d) 696 CALL histwrite_phy(nid_mth,"tke_max",itau_w,zx_tmp_fi3d) 697 endif 698 699 700 683 701 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1, clwcon0, zx_tmp_3d) 684 702 CALL histwrite_phy(nid_mth,"clwcon",itau_w,clwcon0) … … 757 775 c 758 776 cIM: 101003 : K/30min ==> K/s 777 zx_tmp_fi3d(1:klon,1:klev)=d_t_ajsb(1:klon,1:klev)/pdtphys 778 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 779 CALL histwrite_phy(nid_mth,"dtajs",itau_w,zx_tmp_fi3d) 780 c 781 zx_tmp_fi3d(1:klon,1:klev)=d_q_ajsb(1:klon,1:klev)/pdtphys 782 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 783 CALL histwrite_phy(nid_mth,"dqajs",itau_w,zx_tmp_fi3d) 784 c 785 cIM: 101003 : K/30min ==> K/s 759 786 zx_tmp_fi3d(1:klon,1:klev)=d_t_ajs(1:klon,1:klev)/pdtphys 760 787 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 761 CALL histwrite_phy(nid_mth,"dt ajs",itau_w,zx_tmp_fi3d)788 CALL histwrite_phy(nid_mth,"dtthe",itau_w,zx_tmp_fi3d) 762 789 c 763 790 zx_tmp_fi3d(1:klon,1:klev)=d_q_ajs(1:klon,1:klev)/pdtphys 764 791 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 765 CALL histwrite_phy(nid_mth,"dq ajs",itau_w,zx_tmp_fi3d)792 CALL histwrite_phy(nid_mth,"dqthe",itau_w,zx_tmp_fi3d) 766 793 c 767 794 cIM: 101003 : K/day ==> K/s … … 951 978 CALL histwrite_phy(nid_mth,"dtcon",itau_w,zx_tmp_fi3d) 952 979 c 953 c temperature tendency due to dry convective processes 954 DO l=1, klev 955 DO i=1, klon 956 zx_tmp_fi3d(i,l)=d_t_ajs(i,l)/pdtphys 957 ENDDO !i 958 ENDDO !l 959 c 960 cym CALL gr_fi_ecrit(klev, klon,iim,jjmp1, zx_tmp_fi3d,zx_tmp_3d) 961 CALL histwrite_phy(nid_mth,"dtajs",itau_w,zx_tmp_fi3d) 980 981 982 983 962 984 c 963 985 c temperature tendency due to large scale precipitation … … 1690 1712 IF(lev_histmth.GE.4) THEN 1691 1713 c 1714 c FH Sorties pour la couche limite 1715 CALL histwrite_phy(nid_mth,"kz",itau_w,ycoefh) 1716 CALL histwrite_phy(nid_mth,"kz_max",itau_w,ycoefh) 1717 1718 if(iflag_pbl>1) then 1719 zx_tmp_fi3d=0. 1720 do nsrf=1,nbsrf 1721 do k=1,klev 1722 zx_tmp_fi3d(:,k)=zx_tmp_fi3d(:,k) 1723 , +pctsrf(:,nsrf)*pbl_tke(:,k,nsrf) 1724 enddo 1725 enddo 1726 CALL histwrite_phy(nid_mth,"tke",itau_w,zx_tmp_fi3d) 1727 CALL histwrite_phy(nid_mth,"tke_max",itau_w,zx_tmp_fi3d) 1728 endif 1729 1730 1731 1692 1732 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1, clwcon0, zx_tmp_3d) 1693 1733 CALL histwrite_phy(nid_mth,"clwcon",itau_w,clwcon0) … … 1756 1796 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1, ratqs, zx_tmp_3d) 1757 1797 CALL histwrite_phy(nid_mth,"ratqs",itau_w,ratqs) 1798 cIM: 101003 : K/30min ==> K/s 1799 zx_tmp_fi3d(1:klon,1:klev)=d_t_ajsb(1:klon,1:klev)/pdtphys 1800 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 1801 CALL histwrite_phy(nid_mth,"dtajs",itau_w,zx_tmp_fi3d) 1802 c 1803 zx_tmp_fi3d(1:klon,1:klev)=d_q_ajsb(1:klon,1:klev)/pdtphys 1804 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 1805 CALL histwrite_phy(nid_mth,"dqajs",itau_w,zx_tmp_fi3d) 1806 c 1807 cIM: 101003 : K/30min ==> K/s 1808 zx_tmp_fi3d(1:klon,1:klev)=d_t_ajs(1:klon,1:klev)/pdtphys 1809 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 1810 CALL histwrite_phy(nid_mth,"dtthe",itau_w,zx_tmp_fi3d) 1758 1811 c 1759 1812 zx_tmp_fi3d(1:klon,1:klev)=d_q_ajs(1:klon,1:klev)/pdtphys 1760 1813 cym CALL gr_fi_ecrit(klev,klon,iim,jjmp1,zx_tmp_fi3d,zx_tmp_3d) 1761 CALL histwrite_phy(nid_mth,"dqajs",itau_w,zx_tmp_fi3d) 1814 CALL histwrite_phy(nid_mth,"dqthe",itau_w,zx_tmp_fi3d) 1815 c 1762 1816 c 1763 1817 cIM: 101003 : K/day ==> K/s -
LMDZ4/trunk/libf/phylmd/yamada4.F
r789 r878 429 429 enddo 430 430 431 431 ! print*,'pblhmin ',pblhmin 432 432 CTest a remettre 21 11 02 433 433 c test abd 13 05 02 if(0.eq.1) then … … 458 458 c Diagnostique pour stokage 459 459 460 if(1.eq.0)then 460 461 rino=rif 461 smyam(:,1:klev)=sm(:,1:klev) 462 styam=sm(:,1:klev)*alpha(:,1:klev) 463 lyam(1:klon,1:klev)=l(:,1:klev) 464 knyam(1:klon,1:klev)=kn(:,1:klev) 462 smyam(1:ngrid,1)=0. 463 styam(1:ngrid,1)=0. 464 lyam(1:ngrid,1)=0. 465 knyam(1:ngrid,1)=0. 466 w2yam(1:ngrid,1)=0. 467 t2yam(1:ngrid,1)=0. 468 469 smyam(1:ngrid,2:klev)=sm(1:ngrid,2:klev) 470 styam(1:ngrid,2:klev)=sm(1:ngrid,2:klev)*alpha(1:ngrid,2:klev) 471 lyam(1:ngrid,2:klev)=l(1:ngrid,2:klev) 472 knyam(1:ngrid,2:klev)=kn(1:ngrid,2:klev) 465 473 466 474 c Estimations de w'2 et T'2 d'apres Abdela et McFarlane 467 475 468 if(1.eq.0)then469 w2yam=q2(:,1:klev)*0.24470 s +lyam(:,1:klev)*5.17*kn(:,1:klev)*n2(:,1:klev)471 s /sqrt(q2(:,1:klev)) 472 473 t2yam=9.1*kn(:,1:klev)*dtetadz(:,1:klev)**2/sqrt(q2(:,1:klev))474 s *lyam(:,1:klev)475 476 w2yam(1:ngrid,2:klev)=q2(1:ngrid,2:klev)*0.24 477 s +lyam(1:ngrid,2:klev)*5.17*kn(1:ngrid,2:klev) 478 s *n2(1:ngrid,2:klev)/sqrt(q2(1:ngrid,2:klev)) 479 480 t2yam(1:ngrid,2:klev)=9.1*kn(1:ngrid,2:klev) 481 s *dtetadz(1:ngrid,2:klev)**2 482 s /sqrt(q2(1:ngrid,2:klev))*lyam(1:ngrid,2:klev) 483 endif 476 484 477 485 c print*,'OKFIN'
Note: See TracChangeset
for help on using the changeset viewer.