Changeset 2384
- Timestamp:
- Nov 5, 2015, 6:49:55 PM (9 years ago)
- Location:
- LMDZ5/trunk/libf/phylmd
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/thermcell_main.F90
r2351 r2384 747 747 enddo 748 748 ! 749 749 ! $Id$ 750 ! 751 print*,'THERM_ALP sorti' 752 CALL thermcell_alp(ngrid,nlay,ptimestep & 753 & ,pplay,pplev & 754 & ,fm0,entr0,lmax & 755 & ,Ale_bl,Alp_bl,lalim_conv,wght_th & 756 & ,zw2,fraca & 757 !!! necessire en plus 758 & ,pcon,rhobarz,wth3,wmax_sec,lalim,fm,alim_star,zmax & 750 759 !!! nrlmd le 10/04/2012 751 752 !------------Test sur le LCL des thermiques 753 do ig=1,ngrid 754 ok_lcl(ig)=.false. 755 if ( (pcon(ig) .gt. pplay(ig,klev-1)) .and. (pcon(ig) .lt. pplay(ig,1)) ) ok_lcl(ig)=.true. 756 enddo 757 758 !------------Localisation des niveaux entourant le LCL et du coef d'interpolation 759 do l=1,nlay-1 760 do ig=1,ngrid 761 if (ok_lcl(ig)) then 762 !ATTENTION,zw2 calcule en pplev 763 ! if ((pplay(ig,l) .ge. pcon(ig)) .and. (pplay(ig,l+1) .le. pcon(ig))) then 764 ! klcl(ig)=l 765 ! interp(ig)=(pcon(ig)-pplay(ig,klcl(ig)))/(pplay(ig,klcl(ig)+1)-pplay(ig,klcl(ig))) 766 ! endif 767 if ((pplev(ig,l) .ge. pcon(ig)) .and. (pplev(ig,l+1) .le. pcon(ig))) then 768 klcl(ig)=l 769 interp(ig)=(pcon(ig)-pplev(ig,klcl(ig)))/(pplev(ig,klcl(ig)+1)-pplev(ig,klcl(ig))) 770 endif 771 endif 772 enddo 773 enddo 774 775 !------------Hauteur des thermiques 776 !!jyg le 27/04/2012 777 !! do ig =1,ngrid 778 !! rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 779 !! & -rhobarz(ig,klcl(ig)))*interp(ig) 780 !! zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 781 !! zmax(ig)=pphi(ig,lmax(ig))/rg 782 !! if ( (.not.ok_lcl(ig)) .or. (zlcl(ig).gt.zmax(ig)) ) zlcl(ig)=zmax(ig) ! Si zclc > zmax alors on pose zlcl = zmax 783 !! enddo 784 do ig =1,ngrid 785 !CR:REHABILITATION ZMAX CONTINU 786 ! zmax(ig)=pphi(ig,lmax(ig))/rg 787 if (ok_lcl(ig)) then 788 rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 789 & -rhobarz(ig,klcl(ig)))*interp(ig) 790 zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 791 zlcl(ig)=min(zlcl(ig),zmax(ig)) ! Si zlcl > zmax alors on pose zlcl = zmax 792 else 793 rhobarz0(ig)=0. 794 zlcl(ig)=zmax(ig) 795 endif 796 enddo 797 !!jyg fin 798 799 !------------Calcul des propriétés du thermique au LCL 800 IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) THEN 801 802 !-----Initialisation de la TKE moyenne 803 do l=1,nlay 804 do ig=1,ngrid 805 pbl_tke_max(ig,l)=0. 806 enddo 807 enddo 808 809 !-----Calcul de la TKE moyenne 810 do nsrf=1,nbsrf 811 do l=1,nlay 812 do ig=1,ngrid 813 pbl_tke_max(ig,l)=pctsrf(ig,nsrf)*pbl_tke(ig,l,nsrf)+pbl_tke_max(ig,l) 814 enddo 815 enddo 816 enddo 817 818 !-----Initialisations des TKE dans et hors des thermiques 819 do l=1,nlay 820 do ig=1,ngrid 821 therm_tke_max(ig,l)=pbl_tke_max(ig,l) 822 env_tke_max(ig,l)=pbl_tke_max(ig,l) 823 enddo 824 enddo 825 826 !-----Calcul de la TKE transportée par les thermiques : therm_tke_max 827 call thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 828 & rg,pplev,therm_tke_max) 829 ! print *,' thermcell_tke_transport -> ' !!jyg 830 831 !-----Calcul des profils verticaux de TKE hors thermiques : env_tke_max, et de la vitesse verticale grande échelle : W_ls 832 do l=1,nlay 833 do ig=1,ngrid 834 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 835 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 836 w_ls(ig,l)=-1.*omega(ig,l)/(RG*rhobarz(ig,l)) ! Vitesse verticale de grande échelle 837 enddo 838 enddo 839 ! print *,' apres w_ls = ' !!jyg 840 841 do ig=1,ngrid 842 if (ok_lcl(ig)) then 843 fraca0(ig)=fraca(ig,klcl(ig))+(fraca(ig,klcl(ig)+1) & 844 & -fraca(ig,klcl(ig)))*interp(ig) 845 w0(ig)=zw2(ig,klcl(ig))+(zw2(ig,klcl(ig)+1) & 846 & -zw2(ig,klcl(ig)))*interp(ig) 847 w_conv(ig)=w_ls(ig,klcl(ig))+(w_ls(ig,klcl(ig)+1) & 848 & -w_ls(ig,klcl(ig)))*interp(ig) 849 therm_tke_max0(ig)=therm_tke_max(ig,klcl(ig)) & 850 & +(therm_tke_max(ig,klcl(ig)+1)-therm_tke_max(ig,klcl(ig)))*interp(ig) 851 env_tke_max0(ig)=env_tke_max(ig,klcl(ig))+(env_tke_max(ig,klcl(ig)+1) & 852 & -env_tke_max(ig,klcl(ig)))*interp(ig) 853 pbl_tke_max0(ig)=pbl_tke_max(ig,klcl(ig))+(pbl_tke_max(ig,klcl(ig)+1) & 854 & -pbl_tke_max(ig,klcl(ig)))*interp(ig) 855 if (therm_tke_max0(ig).ge.20.) therm_tke_max0(ig)=20. 856 if (env_tke_max0(ig).ge.20.) env_tke_max0(ig)=20. 857 if (pbl_tke_max0(ig).ge.20.) pbl_tke_max0(ig)=20. 858 else 859 fraca0(ig)=0. 860 w0(ig)=0. 861 !!jyg le 27/04/2012 862 !! zlcl(ig)=0. 863 !! 864 endif 865 enddo 866 867 ENDIF ! IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) 868 ! print *,'ENDIF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) ' !!jyg 869 870 !------------Triggering------------------ 871 IF (iflag_trig_bl.ge.1) THEN 872 873 !-----Initialisations 874 depth(:)=0. 875 n2(:)=0. 876 s2(:)=100. ! some low value, arbitrary 877 s_max(:)=0. 878 879 !-----Epaisseur du nuage (depth) et détermination de la queue du spectre de panaches (n2,s2) et du panache le plus gros (s_max) 880 do ig=1,ngrid 881 zmax_moy(ig)=zlcl(ig)+zmax_moy_coef*(zmax(ig)-zlcl(ig)) 882 depth(ig)=zmax_moy(ig)-zlcl(ig) 883 hmin(ig)=hmincoef*zlcl(ig) 884 if (depth(ig).ge.10.) then 885 s2(ig)=(hcoef*depth(ig)+hmin(ig))**2 886 n2(ig)=(1.-eps1)*fraca0(ig)*airephy(ig)/s2(ig) 887 !! 888 !!jyg le 27/04/2012 889 !! s_max(ig)=s2(ig)*log(n2(ig)) 890 !! if (n2(ig) .lt. 1) s_max(ig)=0. 891 s_max(ig)=s2(ig)*log(max(n2(ig),1.)) 892 !!fin jyg 893 else 894 n2(ig)=0. 895 s_max(ig)=0. 896 endif 897 enddo 898 ! print *,'avant Calcul de Wmax ' !!jyg 899 900 !-----Calcul de Wmax et ALE_BL_STAT associée 901 !!jyg le 30/04/2012 902 !! do ig=1,ngrid 903 !! if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.1.) ) then 904 !! 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)))) 905 !! ale_bl_stat(ig)=0.5*w_max(ig)**2 906 !! else 907 !! w_max(ig)=0. 908 !! ale_bl_stat(ig)=0. 909 !! endif 910 !! enddo 911 susqr2pi=su*sqrt(2.*Rpi) 912 Reuler=exp(1.) 913 do ig=1,ngrid 914 if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.susqr2pi*Reuler) ) then 915 w_max(ig)=w0(ig)*(1.+sqrt(2.*log(s_max(ig)/susqr2pi)-log(2.*log(s_max(ig)/susqr2pi)))) 916 ale_bl_stat(ig)=0.5*w_max(ig)**2 917 else 918 w_max(ig)=0. 919 ale_bl_stat(ig)=0. 920 endif 921 enddo 922 923 ENDIF ! iflag_trig_bl 924 ! print *,'ENDIF iflag_trig_bl' !!jyg 925 926 !------------Closure------------------ 927 928 IF (iflag_clos_bl.ge.2) THEN 929 930 !-----Calcul de ALP_BL_STAT 931 do ig=1,ngrid 932 alp_bl_det(ig)=0.5*coef_m*rhobarz0(ig)*(w0(ig)**3)*fraca0(ig)*(1.-2.*fraca0(ig))/((1.-fraca0(ig))**2) 933 alp_bl_fluct_m(ig)=1.5*rhobarz0(ig)*fraca0(ig)*(w_conv(ig)+coef_m*w0(ig))* & 934 & (w0(ig)**2) 935 alp_bl_fluct_tke(ig)=3.*coef_m*rhobarz0(ig)*w0(ig)*fraca0(ig)*(therm_tke_max0(ig)-env_tke_max0(ig)) & 936 & +3.*rhobarz0(ig)*w_conv(ig)*pbl_tke_max0(ig) 937 if (iflag_clos_bl.ge.2) then 938 alp_bl_conv(ig)=1.5*coef_m*rhobarz0(ig)*fraca0(ig)*(fraca0(ig)/(1.-fraca0(ig)))*w_conv(ig)* & 939 & (w0(ig)**2) 940 else 941 alp_bl_conv(ig)=0. 942 endif 943 alp_bl_stat(ig)=alp_bl_det(ig)+alp_bl_fluct_m(ig)+alp_bl_fluct_tke(ig)+alp_bl_conv(ig) 944 enddo 945 946 !-----Sécurité ALP infinie 947 do ig=1,ngrid 948 if (fraca0(ig).gt.0.98) alp_bl_stat(ig)=2. 949 enddo 950 951 ENDIF ! (iflag_clos_bl.ge.2) 952 760 & ,pbl_tke,pctsrf,omega,airephy & 761 & ,zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 & 762 & ,n2,s2,ale_bl_stat & 763 & ,therm_tke_max,env_tke_max & 764 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke & 765 & ,alp_bl_conv,alp_bl_stat & 953 766 !!! fin nrlmd le 10/04/2012 954 955 if (prt_level.ge.10) then 956 ig=igout 957 do l=1,nlay 958 print*,'14f OK convect8 ig,l,zha zh zpspsk ',ig,l,zha(ig,l),zh(ig,l),zpspsk(ig,l) 959 print*,'14g OK convect8 ig,l,po',ig,l,po(ig,l) 960 enddo 961 endif 962 963 ! print*,'avant calcul ale et alp' 964 !calcul de ALE et ALP pour la convection 965 Alp_bl(:)=0. 966 Ale_bl(:)=0. 967 ! print*,'ALE,ALP ,l,zw2(ig,l),Ale_bl(ig),Alp_bl(ig)' 968 do l=1,nlay 969 do ig=1,ngrid 970 Alp_bl(ig)=max(Alp_bl(ig),0.5*rhobarz(ig,l)*wth3(ig,l) ) 971 Ale_bl(ig)=max(Ale_bl(ig),0.5*zw2(ig,l)**2) 972 ! print*,'ALE,ALP',l,zw2(ig,l),Ale_bl(ig),Alp_bl(ig) 973 enddo 974 enddo 975 976 ! Ale sec (max de wmax/2 sous la zone d'inhibition) dans 977 ! le cas iflag_trig_bl=3 978 IF (iflag_trig_bl==3) Ale_bl(:)=0.5*wmax_sec(:)**2 979 980 !test:calcul de la ponderation des couches pour KE 981 !initialisations 982 983 fm_tot(:)=0. 984 wght_th(:,:)=1. 985 lalim_conv(:)=lalim(:) 986 987 do k=1,klev 988 do ig=1,ngrid 989 if (k<=lalim_conv(ig)) fm_tot(ig)=fm_tot(ig)+fm(ig,k) 990 enddo 991 enddo 992 993 ! assez bizarre car, si on est dans la couche d'alim et que alim_star et 994 ! plus petit que 1.e-10, on prend wght_th=1. 995 do k=1,klev 996 do ig=1,ngrid 997 if (k<=lalim_conv(ig).and.alim_star(ig,k)>1.e-10) then 998 wght_th(ig,k)=alim_star(ig,k) 999 endif 1000 enddo 1001 enddo 1002 1003 ! print*,'apres wght_th' 1004 !test pour prolonger la convection 1005 do ig=1,ngrid 1006 !v1d if ((alim_star(ig,1).lt.1.e-10).and.(therm)) then 1007 if ((alim_star(ig,1).lt.1.e-10)) then 1008 lalim_conv(ig)=1 1009 wght_th(ig,1)=1. 1010 ! print*,'lalim_conv ok',lalim_conv(ig),wght_th(ig,1) 1011 endif 1012 enddo 1013 1014 !------------------------------------------------------------------------ 1015 ! Modif CR/FH 20110310 : Alp integree sur la verticale. 1016 ! Integrale verticale de ALP. 1017 ! wth3 etant aux niveaux inter-couches, on utilise d play comme masse des 1018 ! couches 1019 !------------------------------------------------------------------------ 1020 1021 alp_int(:)=0. 1022 dp_int(:)=0. 1023 do l=2,nlay 1024 do ig=1,ngrid 1025 if(l.LE.lmax(ig)) THEN 1026 zdp=pplay(ig,l-1)-pplay(ig,l) 1027 alp_int(ig)=alp_int(ig)+0.5*rhobarz(ig,l)*wth3(ig,l)*zdp 1028 dp_int(ig)=dp_int(ig)+zdp 1029 endif 1030 enddo 1031 enddo 1032 1033 if (iflag_coupl>=3 .and. iflag_coupl<=5) then 1034 do ig=1,ngrid 1035 !valeur integree de alp_bl * 0.5: 1036 if (dp_int(ig)>0.) then 1037 Alp_bl(ig)=alp_int(ig)/dp_int(ig) 1038 endif 1039 enddo! 1040 endif 1041 1042 1043 ! Facteur multiplicatif sur Alp_bl 1044 Alp_bl(:)=alp_bl_k*Alp_bl(:) 1045 1046 !------------------------------------------------------------------------ 767 & ) 768 1047 769 1048 770
Note: See TracChangeset
for help on using the changeset viewer.