Changeset 2831 for trunk/LMDZ.GENERIC/libf/phystd/aeropacity.F90
- Timestamp:
- Nov 23, 2022, 4:41:34 PM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/phystd/aeropacity.F90
r2810 r2831 1 Subroutine aeropacity(ngrid,nlayer,nq,pplay,pplev,pq, & 2 aerosol,reffrad,QREFvis3d,QREFir3d,tau_col,cloudfrac,totcloudfrac,clearsky) 1 Subroutine aeropacity(ngrid,nlayer,nq,pplay,pplev,pt, pq, & 2 aerosol,reffrad,nueffrad, QREFvis3d,QREFir3d,tau_col, & 3 cloudfrac,totcloudfrac,clearsky) 3 4 4 5 use radinc_h, only : L_TAUMAX,naerkind … … 6 7 iaero_aurora, iaero_back2lay, iaero_co2, & 7 8 iaero_dust, iaero_h2o, iaero_h2so4, & 8 iaero_nh3, i_rgcs_ice, noaero 9 iaero_nh3, i_rgcs_ice, noaero, & 10 iaero_venus1, iaero_venus2, iaero_venus2p, & 11 iaero_venus3, iaero_venusUV 9 12 USE tracer_h, only: noms,rho_co2,rho_ice,rho_q,mmol 10 13 use comcstfi_mod, only: g, pi, mugaz, avocado … … 60 63 REAL,INTENT(IN) :: pplev(ngrid,nlayer+1) ! inter-layer pressure (Pa) 61 64 REAL,INTENT(IN) :: pq(ngrid,nlayer,nq) ! tracers (.../kg_of_air) 65 REAL,INTENT(IN) :: pt(ngrid,nlayer) ! mid-layer temperature (K) 62 66 REAL,INTENT(OUT) :: aerosol(ngrid,nlayer,naerkind) ! aerosol optical depth 63 67 REAL,INTENT(IN) :: reffrad(ngrid,nlayer,naerkind) ! aerosol effective radius 68 REAL,INTENT(IN) :: nueffrad(ngrid,nlayer,naerkind) ! aerosol effective variance 64 69 REAL,INTENT(IN) :: QREFvis3d(ngrid,nlayer,naerkind) ! extinction coefficient in the visible 65 70 REAL,INTENT(IN) :: QREFir3d(ngrid,nlayer,naerkind) … … 98 103 logical dummy_bool ! dummy boolean just in case we need one 99 104 ! integer i_rgcs_ice(aerogeneric) 105 ! for venus clouds 106 real :: p_bot,p_top,h_bot,h_top,mode_dens,h_lay 107 100 108 ! identify tracers 101 109 IF (firstcall) THEN … … 148 156 print*,'iaero_aurora= ',iaero_aurora 149 157 endif 158 159 if (iaero_venus1.ne.0) then 160 print*,'iaero_venus1= ',iaero_venus1 161 endif 162 if (iaero_venus2.ne.0) then 163 print*,'iaero_venus2= ',iaero_venus2 164 endif 165 if (iaero_venus2p.ne.0) then 166 print*,'iaero_venus2p= ',iaero_venus2p 167 endif 168 if (iaero_venus3.ne.0) then 169 print*,'iaero_venus3= ',iaero_venus3 170 endif 171 if (iaero_venusUV.ne.0) then 172 print*,'iaero_venusUV= ',iaero_venusUV 173 endif 174 150 175 if (aerogeneric .ne. 0) then 151 176 print*,"iaero_generic= ",iaero_generic(:) … … 679 704 endif !aerogeneric .ne. 0 680 705 706 !================================================================== 707 ! Venus clouds (4 modes) 708 ! S. Lebonnois (jan 2016) 709 !================================================================== 710 ! distributions from Haus et al, 2013 711 ! mode 1 2 2p 3 712 ! r (microns) 0.30 1.05 1.40 3.65 713 ! sigma 1.56 1.29 1.23 1.28 714 ! reff (microns) 0.49 1.23 1.56 4.25 715 ! nueff 0.21 0.067 0.044 0.063 716 ! (nueff=exp(ln^2 sigma)-1) 717 ! 718 ! p_bot <=> zb ; p_top <=> zb+zc ; h_bot <=> Hlo ; h_top <=> Hup 719 ! p<p_top: N=No*(p/p_top)**(h_lay/h_top) h_lay=RT/g (in m) 720 ! p>p_bot: N=No*(p_bot/p)**(h_lay/h_bot) R=8.31/mu (mu in kg/mol) 721 ! N is in m-3 722 ! 723 ! dTau = Qext*[pi*reff**2*exp(-3*ln(1+nueff))]*N*h_lay*(-dp)/p 724 725 ! Mode 1 726 if (iaero_venus1 .ne.0) then 727 iaer=iaero_venus1 728 729 ! 1. Initialization 730 aerosol(1:ngrid,1:nlayer,iaer)=0.0 731 p_bot = 1.e5 732 p_top = 1.e4 733 h_bot = 1.0e3 ! m 734 h_top = 5.0e3 735 736 ! 2. Opacity calculation 737 738 DO ig=1,ngrid 739 DO l=1,nlayer-1 740 741 h_lay=8.31*pt(ig,l)/(g*0.044) 742 743 !! 1. below 2e5 Pa: no aerosols 744 IF (pplay(ig,l) .gt. 2.e5) THEN 745 mode_dens = 0. 746 747 !! 2. cloud layer 748 ELSEIF (pplay(ig,l) .le. 2.e5 .and. pplay(ig,l) .gt. p_bot) THEN 749 mode_dens = 1.81e8*(p_bot/pplay(ig,l))**(h_lay/h_bot) 750 751 ELSEIF (pplay(ig,l) .le. p_bot .and. pplay(ig,l) .gt. p_top) THEN 752 mode_dens = 1.81e8 ! m-3 753 754 ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. 1.e2) THEN 755 mode_dens = 1.81e8*(pplay(ig,l)/p_top)**(h_lay/h_top) 756 757 !! 3. above 1.e2 Pa: no aerosols 758 ELSEIF (pplay(ig,l) .le. 1.e2) THEN 759 mode_dens = 0. 760 ENDIF 761 762 aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)* & 763 pi*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* & 764 mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l) 765 766 ENDDO 767 ENDDO 768 769 end if ! mode 1 770 771 ! Mode 2 772 if (iaero_venus2 .ne.0) then 773 iaer=iaero_venus2 774 775 ! 1. Initialization 776 aerosol(1:ngrid,1:nlayer,iaer)=0.0 777 p_bot = 1.1e4 778 p_top = 1.e4 779 h_bot = 3.0e3 780 h_top = 3.5e3 781 782 ! 2. Opacity calculation 783 784 DO ig=1,ngrid 785 DO l=1,nlayer-1 786 787 h_lay=8.31*pt(ig,l)/(g*0.044) 788 789 !! 1. below 2e5 Pa: no aerosols 790 IF (pplay(ig,l) .gt. 2.e5) THEN 791 mode_dens = 0. 792 793 !! 2. cloud layer 794 ELSEIF (pplay(ig,l) .le. 2.e5 .and. pplay(ig,l) .gt. p_bot) THEN 795 mode_dens = 1.00e8*(p_bot/pplay(ig,l))**(h_lay/h_bot) 796 797 ELSEIF (pplay(ig,l) .le. p_bot .and. pplay(ig,l) .gt. p_top) THEN 798 mode_dens = 1.00e8 799 800 ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. 1.e2) THEN 801 mode_dens = 1.00e8*(pplay(ig,l)/p_top)**(h_lay/h_top) 802 803 !! 3. above 1.e2 Pa: no aerosols 804 ELSEIF (pplay(ig,l) .le. 1.e2) THEN 805 mode_dens = 0. 806 ENDIF 807 808 aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)* & 809 pi*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* & 810 mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l) 811 812 ENDDO 813 ENDDO 814 815 end if ! mode 2 816 817 ! Mode 2p 818 if (iaero_venus2p .ne.0) then 819 iaer=iaero_venus2p 820 821 ! 1. Initialization 822 aerosol(1:ngrid,1:nlayer,iaer)=0.0 823 p_bot = 1.e5 824 p_top = 2.3e4 825 h_bot = 0.1e3 826 h_top = 1.0e3 827 828 ! 2. Opacity calculation 829 830 DO ig=1,ngrid 831 DO l=1,nlayer-1 832 833 h_lay=8.31*pt(ig,l)/(g*0.044) 834 835 !! 1. below 2e5 Pa: no aerosols 836 IF (pplay(ig,l) .gt. 2.e5) THEN 837 mode_dens = 0. 838 839 !! 2. cloud layer 840 ELSEIF (pplay(ig,l) .le. 2.e5 .and. pplay(ig,l) .gt. p_bot) THEN 841 mode_dens = 5.00e7*(p_bot/pplay(ig,l))**(h_lay/h_bot) 842 843 ELSEIF (pplay(ig,l) .le. p_bot .and. pplay(ig,l) .gt. p_top) THEN 844 mode_dens = 5.00e7 845 846 ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. 1.e2) THEN 847 mode_dens = 5.00e7*(pplay(ig,l)/p_top)**(h_lay/h_top) 848 849 !! 3. above 1.e2 Pa: no aerosols 850 ELSEIF (pplay(ig,l) .le. 1.e2) THEN 851 mode_dens = 0. 852 ENDIF 853 854 aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)* & 855 pi*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* & 856 mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l) 857 858 ENDDO 859 ENDDO 860 861 end if ! mode 2p 862 863 ! Mode 3 864 if (iaero_venus3 .ne.0) then 865 iaer=iaero_venus3 866 867 ! 1. Initialization 868 aerosol(1:ngrid,1:nlayer,iaer)=0.0 869 p_bot = 1.e5 870 p_top = 4.e4 871 h_bot = 0.5e3 872 h_top = 1.0e3 873 874 ! 2. Opacity calculation 875 876 DO ig=1,ngrid 877 DO l=1,nlayer-1 878 879 h_lay=8.31*pt(ig,l)/(g*0.044) 880 881 !! 1. below 2e5 Pa: no aerosols 882 IF (pplay(ig,l) .gt. 2.e5) THEN 883 mode_dens = 0. 884 885 !! 2. cloud layer 886 ELSEIF (pplay(ig,l) .le. 2.e5 .and. pplay(ig,l) .gt. p_bot) THEN 887 mode_dens = 1.40e7*(p_bot/pplay(ig,l))**(h_lay/h_bot) 888 889 ELSEIF (pplay(ig,l) .le. p_bot .and. pplay(ig,l) .gt. p_top) THEN 890 mode_dens = 1.40e7 891 892 ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. 1.e2) THEN 893 mode_dens = 1.40e7*(pplay(ig,l)/p_top)**(h_lay/h_top) 894 895 !! 3. above 1.e2 Pa: no aerosols 896 ELSEIF (pplay(ig,l) .le. 1.e2) THEN 897 mode_dens = 0. 898 ENDIF 899 900 aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)* & 901 pi*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* & 902 mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l) 903 904 ENDDO 905 ENDDO 906 907 end if ! mode 3 908 909 ! UV absorber 910 if (iaero_venusUV .ne.0) then 911 iaer=iaero_venusUV 912 913 ! 1. Initialization 914 aerosol(1:ngrid,1:nlayer,iaer)=0.0 915 p_bot = 3.3e4 ! 58 km 916 p_top = 3.7e3 ! 70 km 917 h_bot = 1.0e3 918 h_top = 1.0e3 919 920 ! 2. Opacity calculation 921 922 DO ig=1,ngrid 923 DO l=1,nlayer-1 924 925 h_lay=8.31*pt(ig,l)/(g*0.044) 926 927 !! 1. below 7e4 Pa: no aerosols 928 IF (pplay(ig,l) .gt. 7.e4) THEN 929 mode_dens = 0. 930 931 !! 2. cloud layer 932 ELSEIF (pplay(ig,l) .le. 7.e4 .and. pplay(ig,l) .gt. p_bot) THEN 933 mode_dens = 1.00e7*(p_bot/pplay(ig,l))**(h_lay/h_bot) 934 935 ELSEIF (pplay(ig,l) .le. p_bot .and. pplay(ig,l) .gt. p_top) THEN 936 mode_dens = 1.00e7 937 938 ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. 1.e3) THEN 939 mode_dens = 1.00e7*(pplay(ig,l)/p_top)**(h_lay/h_top) 940 941 !! 3. above 1.e3 Pa: no aerosols 942 ELSEIF (pplay(ig,l) .le. 1.e3) THEN 943 mode_dens = 0. 944 ENDIF 945 946 ! normalized to 0.35 microns (peak of absorption) 947 aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*mode_dens 948 949 ENDDO 950 ENDDO 951 952 ! 3. Re-normalize to Haus et al 2015 total column optical depth 953 tau_col(:)=0.0 954 DO l=1,nlayer 955 DO ig=1,ngrid 956 tau_col(ig) = tau_col(ig) & 957 + aerosol(ig,l,iaer) 958 ENDDO 959 ENDDO 960 DO ig=1,ngrid 961 DO l=1,nlayer-1 962 aerosol(ig,l,iaer)=aerosol(ig,l,iaer)*0.205/tau_col(ig) 963 ENDDO 964 ENDDO 965 966 end if ! UV absorber 967 968 !================================================================== 969 ! ig=10 970 ! do l=1,nlayer 971 ! print*,8.31*pt(ig,l)/(g*0.044),pplay(ig,l),aerosol(ig,l,1),aerosol(ig,l,2),aerosol(ig,l,3),aerosol(ig,l,4) 972 ! print*,l,pplay(ig,l),aerosol(ig,l,5) 973 ! enddo 974 ! stop 975 !================================================================== 976 977 681 978 ! -------------------------------------------------------------------------- 682 979 ! Column integrated visible optical depth in each point (used for diagnostic) … … 713 1010 ! endif 714 1011 ! end do 715 return 1012 716 1013 end subroutine aeropacity 717 1014
Note: See TracChangeset
for help on using the changeset viewer.