Changeset 1669 for LMDZ5/branches/testing/libf/phylmd/thermcell_main.F90
- Timestamp:
- Oct 16, 2012, 2:41:50 PM (12 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/testing
- Property svn:mergeinfo changed
/LMDZ5/trunk merged: 1629-1633,1635,1637-1659,1666-1668
- Property svn:mergeinfo changed
-
LMDZ5/branches/testing/libf/phylmd/thermcell_main.F90
r1525 r1669 10 10 & ,Ale_bl,Alp_bl,lalim_conv,wght_th & 11 11 & ,zmax0, f0,zw2,fraca,ztv & 12 & ,zpspsk,ztla,zthl) 12 & ,zpspsk,ztla,zthl & 13 !!! nrlmd le 10/04/2012 14 & ,pbl_tke,pctsrf,omega,airephy & 15 & ,zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 & 16 & ,n2,s2,ale_bl_stat & 17 & ,therm_tke_max,env_tke_max & 18 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke & 19 & ,alp_bl_conv,alp_bl_stat & 20 !!! fin nrlmd le 10/04/2012 21 & ) 13 22 14 23 USE dimphy … … 47 56 #include "iniprint.h" 48 57 #include "thermcell.h" 58 !!! nrlmd le 10/04/2012 59 #include "indicesol.h" 60 !!! fin nrlmd le 10/04/2012 49 61 50 62 ! arguments: … … 77 89 integer,save :: lev_out=10 78 90 !$OMP THREADPRIVATE(lev_out) 91 92 REAL susqr2pi, Reuler 79 93 80 94 INTEGER ig,k,l,ll,ierr … … 155 169 real seuil 156 170 real csc(klon,klev) 171 172 !!! nrlmd le 10/04/2012 173 174 !------Entrées 175 real pbl_tke(klon,klev+1,nbsrf) 176 real pctsrf(klon,nbsrf) 177 real omega(klon,klev) 178 real airephy(klon) 179 !------Sorties 180 real zlcl(klon),fraca0(klon),w0(klon),w_conv(klon) 181 real therm_tke_max0(klon),env_tke_max0(klon) 182 real n2(klon),s2(klon) 183 real ale_bl_stat(klon) 184 real therm_tke_max(klon,klev),env_tke_max(klon,klev) 185 real alp_bl_det(klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon) 186 !------Local 187 integer nsrf 188 real rhobarz0(klon) ! Densité au LCL 189 logical ok_lcl(klon) ! Existence du LCL des thermiques 190 integer klcl(klon) ! Niveau du LCL 191 real interp(klon) ! Coef d'interpolation pour le LCL 192 !--Triggering 193 real Su ! Surface unité: celle d'un updraft élémentaire 194 parameter(Su=4e4) 195 real hcoef ! Coefficient directeur pour le calcul de s2 196 parameter(hcoef=1) 197 real hmincoef ! Coefficient directeur pour l'ordonnée à l'origine pour le calcul de s2 198 parameter(hmincoef=0.3) 199 real eps1 ! Fraction de surface occupée par la population 1 : eps1=n1*s1/(fraca0*Sd) 200 parameter(eps1=0.3) 201 real hmin(ngrid) ! Ordonnée à l'origine pour le calcul de s2 202 real zmax_moy(ngrid) ! Hauteur moyenne des thermiques : zmax_moy = zlcl + 0.33 (zmax-zlcl) 203 real zmax_moy_coef 204 parameter(zmax_moy_coef=0.33) 205 real depth(klon) ! Epaisseur moyenne du cumulus 206 real w_max(klon) ! Vitesse max statistique 207 real s_max(klon) 208 !--Closure 209 real pbl_tke_max(klon,klev) ! Profil de TKE moyenne 210 real pbl_tke_max0(klon) ! TKE moyenne au LCL 211 real w_ls(klon,klev) ! Vitesse verticale grande échelle (m/s) 212 real coef_m ! On considère un rendement pour alp_bl_fluct_m 213 parameter(coef_m=1.) 214 real coef_tke ! On considère un rendement pour alp_bl_fluct_tke 215 parameter(coef_tke=1.) 216 217 !!! fin nrlmd le 10/04/2012 157 218 158 219 ! … … 679 740 enddo 680 741 ! 742 743 !!! nrlmd le 10/04/2012 744 745 !------------Test sur le LCL des thermiques 746 do ig=1,ngrid 747 ok_lcl(ig)=.false. 748 if ( (pcon(ig) .gt. pplay(ig,klev-1)) .and. (pcon(ig) .lt. pplay(ig,1)) ) ok_lcl(ig)=.true. 749 enddo 750 751 !------------Localisation des niveaux entourant le LCL et du coef d'interpolation 752 do l=1,nlay-1 753 do ig=1,ngrid 754 if (ok_lcl(ig)) then 755 if ((pplay(ig,l) .ge. pcon(ig)) .and. (pplay(ig,l+1) .le. pcon(ig))) then 756 klcl(ig)=l 757 interp(ig)=(pcon(ig)-pplay(ig,klcl(ig)))/(pplay(ig,klcl(ig)+1)-pplay(ig,klcl(ig))) 758 endif 759 endif 760 enddo 761 enddo 762 763 !------------Hauteur des thermiques 764 !!jyg le 27/04/2012 765 !! do ig =1,ngrid 766 !! rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 767 !! & -rhobarz(ig,klcl(ig)))*interp(ig) 768 !! zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 769 !! zmax(ig)=pphi(ig,lmax(ig))/rg 770 !! if ( (.not.ok_lcl(ig)) .or. (zlcl(ig).gt.zmax(ig)) ) zlcl(ig)=zmax(ig) ! Si zclc > zmax alors on pose zlcl = zmax 771 !! enddo 772 do ig =1,ngrid 773 zmax(ig)=pphi(ig,lmax(ig))/rg 774 if (ok_lcl(ig)) then 775 rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 776 & -rhobarz(ig,klcl(ig)))*interp(ig) 777 zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 778 zlcl(ig)=min(zlcl(ig),zmax(ig)) ! Si zlcl > zmax alors on pose zlcl = zmax 779 else 780 rhobarz0(ig)=0. 781 zlcl(ig)=zmax(ig) 782 endif 783 enddo 784 !!jyg fin 785 786 !------------Calcul des propriétés du thermique au LCL 787 IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) THEN 788 789 !-----Initialisation de la TKE moyenne 790 do l=1,nlay 791 do ig=1,ngrid 792 pbl_tke_max(ig,l)=0. 793 enddo 794 enddo 795 796 !-----Calcul de la TKE moyenne 797 do nsrf=1,nbsrf 798 do l=1,nlay 799 do ig=1,ngrid 800 pbl_tke_max(ig,l)=pctsrf(ig,nsrf)*pbl_tke(ig,l,nsrf)+pbl_tke_max(ig,l) 801 enddo 802 enddo 803 enddo 804 805 !-----Initialisations des TKE dans et hors des thermiques 806 do l=1,nlay 807 do ig=1,ngrid 808 therm_tke_max(ig,l)=pbl_tke_max(ig,l) 809 env_tke_max(ig,l)=pbl_tke_max(ig,l) 810 enddo 811 enddo 812 813 !-----Calcul de la TKE transportée par les thermiques : therm_tke_max 814 call thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 815 & rg,pplev,therm_tke_max) 816 ! print *,' thermcell_tke_transport -> ' !!jyg 817 818 !-----Calcul des profils verticaux de TKE hors thermiques : env_tke_max, et de la vitesse verticale grande échelle : W_ls 819 do l=1,nlay 820 do ig=1,ngrid 821 pbl_tke_max(ig,l)=fraca(ig,l)*therm_tke_max(ig,l)+(1.-fraca(ig,l))*env_tke_max(ig,l) ! Recalcul de TKE moyenne aprés transport de TKE_TH 822 env_tke_max(ig,l)=(pbl_tke_max(ig,l)-fraca(ig,l)*therm_tke_max(ig,l))/(1.-fraca(ig,l)) ! Recalcul de TKE dans l'environnement aprés transport de TKE_TH 823 w_ls(ig,l)=-1.*omega(ig,l)/(RG*rhobarz(ig,l)) ! Vitesse verticale de grande échelle 824 enddo 825 enddo 826 ! print *,' apres w_ls = ' !!jyg 827 828 do ig=1,ngrid 829 if (ok_lcl(ig)) then 830 fraca0(ig)=fraca(ig,klcl(ig))+(fraca(ig,klcl(ig)+1) & 831 & -fraca(ig,klcl(ig)))*interp(ig) 832 w0(ig)=zw2(ig,klcl(ig))+(zw2(ig,klcl(ig)+1) & 833 & -zw2(ig,klcl(ig)))*interp(ig) 834 w_conv(ig)=w_ls(ig,klcl(ig))+(w_ls(ig,klcl(ig)+1) & 835 & -w_ls(ig,klcl(ig)))*interp(ig) 836 therm_tke_max0(ig)=therm_tke_max(ig,klcl(ig)) & 837 & +(therm_tke_max(ig,klcl(ig)+1)-therm_tke_max(ig,klcl(ig)))*interp(ig) 838 env_tke_max0(ig)=env_tke_max(ig,klcl(ig))+(env_tke_max(ig,klcl(ig)+1) & 839 & -env_tke_max(ig,klcl(ig)))*interp(ig) 840 pbl_tke_max0(ig)=pbl_tke_max(ig,klcl(ig))+(pbl_tke_max(ig,klcl(ig)+1) & 841 & -pbl_tke_max(ig,klcl(ig)))*interp(ig) 842 if (therm_tke_max0(ig).ge.20.) therm_tke_max0(ig)=20. 843 if (env_tke_max0(ig).ge.20.) env_tke_max0(ig)=20. 844 if (pbl_tke_max0(ig).ge.20.) pbl_tke_max0(ig)=20. 845 else 846 fraca0(ig)=0. 847 w0(ig)=0. 848 !!jyg le 27/04/2012 849 !! zlcl(ig)=0. 850 !! 851 endif 852 enddo 853 854 ENDIF ! IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) 855 ! print *,'ENDIF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) ' !!jyg 856 857 !------------Triggering------------------ 858 IF (iflag_trig_bl.ge.1) THEN 859 860 !-----Initialisations 861 depth(:)=0. 862 n2(:)=0. 863 s2(:)=0. 864 s_max(:)=0. 865 866 !-----Epaisseur du nuage (depth) et détermination de la queue du spectre de panaches (n2,s2) et du panache le plus gros (s_max) 867 do ig=1,ngrid 868 zmax_moy(ig)=zlcl(ig)+zmax_moy_coef*(zmax(ig)-zlcl(ig)) 869 depth(ig)=zmax_moy(ig)-zlcl(ig) 870 hmin(ig)=hmincoef*zlcl(ig) 871 if (depth(ig).ge.10.) then 872 s2(ig)=(hcoef*depth(ig)+hmin(ig))**2 873 n2(ig)=(1.-eps1)*fraca0(ig)*airephy(ig)/s2(ig) 874 !! 875 !!jyg le 27/04/2012 876 !! s_max(ig)=s2(ig)*log(n2(ig)) 877 !! if (n2(ig) .lt. 1) s_max(ig)=0. 878 s_max(ig)=s2(ig)*log(max(n2(ig),1.)) 879 !!fin jyg 880 else 881 s2(ig)=0. 882 n2(ig)=0. 883 s_max(ig)=0. 884 endif 885 enddo 886 ! print *,'avant Calcul de Wmax ' !!jyg 887 888 !-----Calcul de Wmax et ALE_BL_STAT associée 889 !!jyg le 30/04/2012 890 !! do ig=1,ngrid 891 !! if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.1.) ) then 892 !! w_max(ig)=w0(ig)*(1.+sqrt(2.*log(s_max(ig)/su)-log(2.*3.14)-log(2.*log(s_max(ig)/su)-log(2.*3.14)))) 893 !! ale_bl_stat(ig)=0.5*w_max(ig)**2 894 !! else 895 !! w_max(ig)=0. 896 !! ale_bl_stat(ig)=0. 897 !! endif 898 !! enddo 899 susqr2pi=su*sqrt(2.*Rpi) 900 Reuler=exp(1.) 901 do ig=1,ngrid 902 if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.susqr2pi*Reuler) ) then 903 w_max(ig)=w0(ig)*(1.+sqrt(2.*log(s_max(ig)/susqr2pi)-log(2.*log(s_max(ig)/susqr2pi)))) 904 ale_bl_stat(ig)=0.5*w_max(ig)**2 905 else 906 w_max(ig)=0. 907 ale_bl_stat(ig)=0. 908 endif 909 enddo 910 911 ENDIF ! iflag_trig_bl 912 ! print *,'ENDIF iflag_trig_bl' !!jyg 913 914 !------------Closure------------------ 915 916 IF (iflag_clos_bl.ge.1) THEN 917 918 !-----Calcul de ALP_BL_STAT 919 do ig=1,ngrid 920 alp_bl_det(ig)=0.5*coef_m*rhobarz0(ig)*(w0(ig)**3)*fraca0(ig)*(1.-2.*fraca0(ig))/((1.-fraca0(ig))**2) 921 alp_bl_fluct_m(ig)=1.5*rhobarz0(ig)*fraca0(ig)*(w_conv(ig)+coef_m*w0(ig))* & 922 & (w0(ig)**2) 923 alp_bl_fluct_tke(ig)=3.*coef_m*rhobarz0(ig)*w0(ig)*fraca0(ig)*(therm_tke_max0(ig)-env_tke_max0(ig)) & 924 & +3.*rhobarz0(ig)*w_conv(ig)*pbl_tke_max0(ig) 925 if (iflag_clos_bl.ge.2) then 926 alp_bl_conv(ig)=1.5*coef_m*rhobarz0(ig)*fraca0(ig)*(fraca0(ig)/(1.-fraca0(ig)))*w_conv(ig)* & 927 & (w0(ig)**2) 928 else 929 alp_bl_conv(ig)=0. 930 endif 931 alp_bl_stat(ig)=alp_bl_det(ig)+alp_bl_fluct_m(ig)+alp_bl_fluct_tke(ig)+alp_bl_conv(ig) 932 enddo 933 934 !-----Sécurité ALP infinie 935 do ig=1,ngrid 936 if (fraca0(ig).gt.0.98) alp_bl_stat(ig)=2. 937 enddo 938 939 ENDIF ! (iflag_clos_bl.ge.1) 940 941 !!! fin nrlmd le 10/04/2012 942 681 943 if (prt_level.ge.10) then 682 944 ig=igout … … 858 1120 end 859 1121 1122 !!! nrlmd le 10/04/2012 Transport de la TKE par le thermique moyen pour la fermeture en ALP 1123 ! On transporte pbl_tke pour donner therm_tke 1124 ! Copie conforme de la subroutine DTKE dans physiq.F écrite par Frederic Hourdin 1125 subroutine thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 1126 & rg,pplev,therm_tke_max) 1127 implicit none 1128 1129 #include "iniprint.h" 1130 !======================================================================= 1131 ! 1132 ! Calcul du transport verticale dans la couche limite en presence 1133 ! de "thermiques" explicitement representes 1134 ! calcul du dq/dt une fois qu'on connait les ascendances 1135 ! 1136 !======================================================================= 1137 1138 integer ngrid,nlay,nsrf 1139 1140 real ptimestep 1141 real masse0(ngrid,nlay),fm0(ngrid,nlay+1),pplev(ngrid,nlay+1) 1142 real entr0(ngrid,nlay),rg 1143 real therm_tke_max(ngrid,nlay) 1144 real detr0(ngrid,nlay) 1145 1146 1147 real masse(ngrid,nlay),fm(ngrid,nlay+1) 1148 real entr(ngrid,nlay) 1149 real q(ngrid,nlay) 1150 integer lev_out ! niveau pour les print 1151 1152 real qa(ngrid,nlay),detr(ngrid,nlay),wqd(ngrid,nlay+1) 1153 1154 real zzm 1155 1156 integer ig,k 1157 integer isrf 1158 1159 1160 lev_out=0 1161 1162 1163 if (prt_level.ge.1) print*,'Q2 THERMCEL_DQ 0' 1164 1165 ! calcul du detrainement 1166 do k=1,nlay 1167 detr0(:,k)=fm0(:,k)-fm0(:,k+1)+entr0(:,k) 1168 masse0(:,k)=(pplev(:,k)-pplev(:,k+1))/RG 1169 enddo 1170 1171 1172 ! Decalage vertical des entrainements et detrainements. 1173 masse(:,1)=0.5*masse0(:,1) 1174 entr(:,1)=0.5*entr0(:,1) 1175 detr(:,1)=0.5*detr0(:,1) 1176 fm(:,1)=0. 1177 do k=1,nlay-1 1178 masse(:,k+1)=0.5*(masse0(:,k)+masse0(:,k+1)) 1179 entr(:,k+1)=0.5*(entr0(:,k)+entr0(:,k+1)) 1180 detr(:,k+1)=0.5*(detr0(:,k)+detr0(:,k+1)) 1181 fm(:,k+1)=fm(:,k)+entr(:,k)-detr(:,k) 1182 enddo 1183 fm(:,nlay+1)=0. 1184 1185 !!! nrlmd le 16/09/2010 1186 ! calcul de la valeur dans les ascendances 1187 ! do ig=1,ngrid 1188 ! qa(ig,1)=q(ig,1) 1189 ! enddo 1190 !!! 1191 1192 !do isrf=1,nsrf 1193 1194 ! q(:,:)=therm_tke(:,:,isrf) 1195 q(:,:)=therm_tke_max(:,:) 1196 !!! nrlmd le 16/09/2010 1197 do ig=1,ngrid 1198 qa(ig,1)=q(ig,1) 1199 enddo 1200 !!! 1201 1202 if (1==1) then 1203 do k=2,nlay 1204 do ig=1,ngrid 1205 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. & 1206 & 1.e-5*masse(ig,k)) then 1207 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) & 1208 & /(fm(ig,k+1)+detr(ig,k)) 1209 else 1210 qa(ig,k)=q(ig,k) 1211 endif 1212 if (qa(ig,k).lt.0.) then 1213 ! print*,'qa<0!!!' 1214 endif 1215 if (q(ig,k).lt.0.) then 1216 ! print*,'q<0!!!' 1217 endif 1218 enddo 1219 enddo 1220 1221 ! Calcul du flux subsident 1222 1223 do k=2,nlay 1224 do ig=1,ngrid 1225 wqd(ig,k)=fm(ig,k)*q(ig,k) 1226 if (wqd(ig,k).lt.0.) then 1227 ! print*,'wqd<0!!!' 1228 endif 1229 enddo 1230 enddo 1231 do ig=1,ngrid 1232 wqd(ig,1)=0. 1233 wqd(ig,nlay+1)=0. 1234 enddo 1235 1236 ! Calcul des tendances 1237 do k=1,nlay 1238 do ig=1,ngrid 1239 q(ig,k)=q(ig,k)+(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) & 1240 & -wqd(ig,k)+wqd(ig,k+1)) & 1241 & *ptimestep/masse(ig,k) 1242 enddo 1243 enddo 1244 1245 endif 1246 1247 therm_tke_max(:,:)=q(:,:) 1248 1249 return 1250 !!! fin nrlmd le 10/04/2012 1251 end 1252
Note: See TracChangeset
for help on using the changeset viewer.