Changeset 4105
- Timestamp:
- Mar 6, 2026, 2:36:42 PM (6 weeks ago)
- Location:
- trunk/LMDZ.VENUS/libf/phyvenus
- Files:
-
- 2 edited
-
photolysis_mod.F90 (modified) (4 diffs)
-
photolysis_online.F (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.VENUS/libf/phyvenus/photolysis_mod.F90
r4080 r4105 5 5 ! photolysis 6 6 7 integer, save :: nphot = 29! number of photolysis7 integer, save :: nphot = 34 ! number of photolysis 8 8 9 9 !$OMP THREADPRIVATE(nphot) 10 10 11 integer, parameter :: nabs = 26! number of absorbing gases11 integer, parameter :: nabs = 30 ! number of absorbing gases 12 12 13 13 ! spectral grid … … 61 61 real, dimension(nw), save :: yieldn2 ! n2 photodissociation yield 62 62 real, dimension(nw), save :: xshdo ! hdo absorption cross-section (cm2) 63 real, dimension(nw), save :: xsh2s ! h2s absorption cross-section (cm2) 64 real, dimension(nw), save :: xss3 ! s3 absorption cross-section (cm2) 65 real, dimension(nw), save :: xss4 ! s4 absorption cross-section (cm2) 66 real, dimension(nw), save :: xss8 ! s8 absorption cross-section (cm2) 63 67 real, dimension(nw), save :: albedo ! surface albedo 64 68 … … 185 189 186 190 call rdxshdo(nw,wl,xshdo) 191 192 ! read and grid h2s cross-sections 193 194 call rdxsh2s(nw,wl,xsh2s) 195 196 ! read and grid s3 cross-sections 197 198 call rdxss3(nw,wl,xss3) 199 200 ! read and grid s4 cross-sections 201 202 call rdxss4(nw,wl,xss4) 203 204 ! read and grid s8 cross-sections 205 206 call rdxss8(nw,wl,xss8) 187 207 188 208 ! set surface albedo … … 3681 3701 end subroutine rdxsn2 3682 3702 3703 subroutine rdxsh2s(nw, wl, yg) 3704 3705 !-----------------------------------------------------------------------------* 3706 != PURPOSE: =* 3707 != Read H2S cross-sections =* 3708 != JPL 2020 recommendation =* 3709 !-----------------------------------------------------------------------------* 3710 != PARAMETERS: =* 3711 != NW - INTEGER, number of specified intervals + 1 in working (I)=* 3712 != wavelength grid =* 3713 !-----------------------------------------------------------------------------* 3714 3715 USE mod_phys_lmdz_para, ONLY: is_master 3716 USE mod_phys_lmdz_transfert_para, ONLY: bcast 3717 3718 IMPLICIT NONE 3719 3720 ! input 3721 3722 integer :: nw ! number of wavelength grid points 3723 real, dimension(nw) :: wl ! lower wavelength for each interval 3724 3725 ! output 3726 3727 real, dimension(nw) :: yg ! H2S cross-sections (cm2) 3728 3729 ! local 3730 3731 real, parameter :: deltax = 1.e-4 3732 integer, parameter :: kdata = 100 3733 real, dimension(kdata) :: x1, y1 3734 integer :: i, n, ierr 3735 character*100 fil 3736 integer :: kin, kout ! input/output logical units 3737 3738 kin = 10 3739 3740 !*** cross sections from JPL [2020] 3741 3742 fil = 'cross_sections/h2s_cross_sections_jpl2020.txt' 3743 print*, 'section efficace H2S: ', fil 3744 3745 if(is_master) then 3746 3747 n = 36 3748 OPEN(kin,FILE=fil,STATUS='OLD') 3749 DO i = 1,4 3750 READ(kin,*) 3751 ENDDO 3752 DO i = 1,n 3753 READ(kin,*) x1(i), y1(i) 3754 ENDDO 3755 CLOSE(kin) 3756 3757 CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) 3758 CALL addpnt(x1,y1,kdata,n, 0.,0.) 3759 CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) 3760 CALL addpnt(x1,y1,kdata,n, 1E38,0.) 3761 3762 CALL inter2(nw,wl,yg,n,x1,y1,ierr) 3763 !print*,'H2S cross sections',nw,yg 3764 3765 IF (ierr .NE. 0) THEN 3766 WRITE(*,*) ierr, fil 3767 STOP 3768 ENDIF 3769 3770 endif !is_master 3771 3772 call bcast(yg) 3773 3774 end subroutine rdxsh2s 3775 3776 subroutine rdxss3(nw, wl, yg) 3777 3778 !-----------------------------------------------------------------------------* 3779 != PURPOSE: =* 3780 != Read S3 cross-sections =* 3781 != Billmers and Smith(1991) J. Phys. Chem. ; MPI-Mainz UV/VIS Spectral Atlas=* 3782 !-----------------------------------------------------------------------------* 3783 != PARAMETERS: =* 3784 != NW - INTEGER, number of specified intervals + 1 in working (I)=* 3785 != wavelength grid =* 3786 !-----------------------------------------------------------------------------* 3787 3788 USE mod_phys_lmdz_para, ONLY: is_master 3789 USE mod_phys_lmdz_transfert_para, ONLY: bcast 3790 3791 IMPLICIT NONE 3792 3793 ! input 3794 3795 integer :: nw ! number of wavelength grid points 3796 real, dimension(nw) :: wl ! lower wavelength for each interval 3797 3798 ! output 3799 3800 real, dimension(nw) :: yg ! S3 cross-sections (cm2) 3801 3802 ! local 3803 3804 real, parameter :: deltax = 1.e-4 3805 integer, parameter :: kdata = 1000 3806 real, dimension(kdata) :: x1, y1 3807 integer :: i, n, ierr 3808 character*100 fil 3809 integer :: kin, kout ! input/output logical units 3810 3811 kin = 10 3812 3813 !*** Billmers and Smith(1991) J. Phys. Chem. ; MPI-Mainz UV/VIS Spectral Atlas 3814 3815 !fil = 'cross_sections/s3_cross_sections_Billmers1991.txt' 3816 fil = 'cross_sections/s3_cross_sections_frandsen.txt' 3817 print*, 'section efficace S3: ', fil 3818 3819 if(is_master) then 3820 3821 !n = 6 3822 n = 983 3823 OPEN(kin,FILE=fil,STATUS='OLD') 3824 DO i = 1,4 3825 READ(kin,*) 3826 ENDDO 3827 DO i = 1,n 3828 READ(kin,*) x1(i), y1(i) 3829 ENDDO 3830 CLOSE(kin) 3831 3832 CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) 3833 CALL addpnt(x1,y1,kdata,n, 0.,0.) 3834 CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) 3835 CALL addpnt(x1,y1,kdata,n, 1E38,0.) 3836 3837 CALL inter2(nw,wl,yg,n,x1,y1,ierr) 3838 ! print*,'S3 cross sections',nw,yg 3839 3840 IF (ierr .NE. 0) THEN 3841 WRITE(*,*) ierr, fil 3842 STOP 3843 ENDIF 3844 3845 endif !is_master 3846 3847 call bcast(yg) 3848 3849 end subroutine rdxss3 3850 3851 subroutine rdxss4(nw, wl, yg)!1, yg2) 3852 3853 !-----------------------------------------------------------------------------* 3854 != PURPOSE: =* 3855 != Read S4 cross-sections =* 3856 != Billmers and Smith(1991) J. Phys. Chem. ; MPI-Mainz UV/VIS Spectral Atlas=* 3857 !-----------------------------------------------------------------------------* 3858 != PARAMETERS: =* 3859 != NW - INTEGER, number of specified intervals + 1 in working (I)=* 3860 != wavelength grid =* 3861 !-----------------------------------------------------------------------------* 3862 3863 USE mod_phys_lmdz_para, ONLY: is_master 3864 USE mod_phys_lmdz_transfert_para, ONLY: bcast 3865 3866 IMPLICIT NONE 3867 3868 ! input 3869 3870 integer :: nw ! number of wavelength grid points 3871 real, dimension(nw) :: wl ! lower wavelength for each interval 3872 3873 ! output 3874 3875 real, dimension(nw) :: yg,yg1,yg2 ! S4 cross-sections (cm2) 3876 3877 ! local 3878 3879 real, parameter :: deltax = 1.e-4 3880 integer, parameter :: kdata = 1000 3881 real, dimension(kdata) :: x1, y1 3882 integer :: i, n, ierr, iw 3883 character*100 fil 3884 integer :: kin, kout ! input/output logical units 3885 3886 kin = 10 3887 3888 !*** Billmers and Smith(1991) J. Phys. Chem. ; MPI-Mainz UV/VIS Spectral Atlas 3889 3890 !fil = 'cross_sections/s4_cross_sections_Billmers1991.txt' 3891 fil = 'cross_sections/s4_cross_sections_frandsen.txt' 3892 print*, 'section efficace S4: ', fil 3893 3894 if(is_master) then 3895 3896 !n = 7 3897 n = 945 3898 OPEN(kin,FILE=fil,STATUS='OLD') 3899 DO i = 1,4 3900 READ(kin,*) 3901 ENDDO 3902 DO i = 1,n 3903 READ(kin,*) x1(i), y1(i) 3904 ENDDO 3905 CLOSE(kin) 3906 3907 CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) 3908 CALL addpnt(x1,y1,kdata,n, 0.,0.) 3909 CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) 3910 CALL addpnt(x1,y1,kdata,n, 1E38,0.) 3911 3912 CALL inter2(nw,wl,yg,n,x1,y1,ierr) 3913 print*,'S4 cross sections',wl 3914 ! print*,'S4 cross sections',yg 3915 3916 IF (ierr .NE. 0) THEN 3917 WRITE(*,*) ierr, fil 3918 STOP 3919 ENDIF 3920 3921 ! DO iw = 1,nw 3922 ! if (wl(iw) <= 492.) then 3923 ! yg1(iw) = 1./3. * yg(iw) !S4 + hv -> S2 + S2 3924 ! yg2(iw) = 2./3. * yg(iw) !S4 + hv -> S3 + S 3925 ! else 3926 ! yg1(iw) = 1.*yg(iw) 3927 ! yg2(iw) = 0. 3928 ! end if 3929 ! enddo 3930 3931 ! print*,'yg',yg 3932 ! print*,'yg1',yg1 3933 ! print*,'yg2',yg2 3934 3935 endif !is_master 3936 3937 call bcast(yg) 3938 !call bcast(yg1) 3939 !call bcast(yg2) 3940 3941 end subroutine rdxss4 3942 3943 subroutine rdxss8(nw, wl, yg) 3944 3945 !-----------------------------------------------------------------------------* 3946 != PURPOSE: =* 3947 != Read S8 cross-sections =* 3948 != Meyer 1976 / Zahnle 2016 =* 3949 !-----------------------------------------------------------------------------* 3950 != PARAMETERS: =* 3951 != NW - INTEGER, number of specified intervals + 1 in working (I)=* 3952 != wavelength grid =* 3953 !-----------------------------------------------------------------------------* 3954 3955 USE mod_phys_lmdz_para, ONLY: is_master 3956 USE mod_phys_lmdz_transfert_para, ONLY: bcast 3957 3958 IMPLICIT NONE 3959 3960 ! input 3961 3962 integer :: nw ! number of wavelength grid points 3963 real, dimension(nw) :: wl ! lower wavelength for each interval 3964 3965 ! output 3966 3967 real, dimension(nw) :: yg ! S8 cross-sections (cm2) 3968 3969 ! local 3970 3971 real, parameter :: deltax = 1.e-4 3972 integer, parameter :: kdata = 1000 3973 real, dimension(kdata) :: x1, y1 3974 integer :: i, n, ierr 3975 character*100 fil 3976 integer :: kin, kout ! input/output logical units 3977 3978 kin = 10 3979 3980 !*** Meyer 1976 / Zahnle 2016 3981 3982 ! fil = 'cross_sections/s8_cross_sections_visible.txt' 3983 fil = 'cross_sections/s8_cross_sections_frandsen.txt' 3984 print*, 'section efficace S8: ', fil 3985 3986 if(is_master) then 3987 3988 !n = 14! 3989 n = 380 3990 OPEN(kin,FILE=fil,STATUS='OLD') 3991 DO i = 1,4 3992 READ(kin,*) 3993 ENDDO 3994 DO i = 1,n 3995 READ(kin,*) x1(i), y1(i) 3996 ENDDO 3997 CLOSE(kin) 3998 3999 CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) 4000 CALL addpnt(x1,y1,kdata,n, 0.,0.) 4001 CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) 4002 CALL addpnt(x1,y1,kdata,n, 1E38,0.) 4003 4004 CALL inter2(nw,wl,yg,n,x1,y1,ierr) 4005 !yg(:) = yg(:)/100. 4006 ! print*,'S8 cross sections',nw,yg 4007 4008 IF (ierr .NE. 0) THEN 4009 WRITE(*,*) ierr, fil 4010 STOP 4011 ENDIF 4012 4013 endif !is_master 4014 4015 call bcast(yg) 4016 4017 end subroutine rdxss8 4018 3683 4019 !============================================================================== 3684 4020 -
trunk/LMDZ.VENUS/libf/phyvenus/photolysis_online.F
r3755 r4105 8 8 $ i_osso_cis, i_osso_trans, i_s2o2_cyc, i_clso2, 9 9 $ i_cl2so2, i_ocs, i_cocl2, i_h2so4, 10 $ i_no2, i_no, i_n2, i_n2d, 10 $ i_no2, i_no, i_n2, i_n2d, i_h2s, i_hs, 11 $ i_s3, i_s4, i_s8, 11 12 & nesp, rm, sza, dist_sol, v_phot) 12 13 … … 26 27 $ i_s2o2_cyc, 27 28 $ i_clso2, i_cl2so2, i_ocs, i_cocl2, i_h2so4, 28 $ i_no2, i_no, i_n2, i_n2d 29 $ i_no2, i_no, i_n2, i_n2d, i_h2s, i_hs, 30 $ i_s3, i_s4, i_s8 29 31 30 32 real, dimension(nlayer), intent(in) :: press, temp, mmean ! pressure (hpa)/temperature (k)/mean molecular mass (g.mol-1) … … 73 75 $ j_so2, j_so, j_so3, j_s2, j_osso_cis, j_osso_trans, 74 76 $ j_s2o2_cyc, j_clso2, j_cl2so2, j_ocs, j_cocl2, j_h2so4, 75 $ j_no2, j_no, j_n2, j_h2 77 $ j_no2, j_no, j_n2, j_h2, j_h2s, j_s3, j_s4_s2, j_s4_s3, 78 $ j_s8 76 79 77 80 integer :: a_o2, a_co2, a_o3, a_h2o, a_h2o2, a_ho2, a_hcl, a_cl2, 78 81 $ a_hocl, a_clo, a_so2, a_so, a_so3, a_s2, a_osso_cis, 79 82 $ a_osso_trans, a_s2o2_cyc, a_clso2, a_cl2so2, a_ocs, 80 $ a_cocl2, a_h2so4, a_no2, a_no, a_n2, a_h2 83 $ a_cocl2, a_h2so4, a_no2, a_no, a_n2, a_h2, a_h2s, a_s3, 84 $ a_s4, a_s8 81 85 82 86 integer :: nlev, i, ilay, ilev, iw, ialt … … 112 116 a_no = 25 ! no 113 117 a_n2 = 26 ! n2 118 a_h2s = 27 ! h2s 119 a_s3 = 28 ! s3 120 a_s4 = 29 ! s4 121 a_s8 = 30 ! s8 114 122 115 123 ! photodissociation rates numbering. … … 145 153 j_no = 28 ! no + hv -> n + o 146 154 j_n2 = 29 ! n2 + hv -> n(2d) + n 155 j_h2s = 30 ! h2s + hv -> hs + h 156 j_s3 = 31 ! s3 + hv -> s2 + s 157 j_s4_s2 = 32 ! s4 + hv -> s2 + s2 158 j_s4_s3 = 33 ! s4 + hv -> s3 + s 159 j_s8 = 34 ! s8 + hv -> s4 + s4 147 160 148 161 ! j_hdo_od = ! hdo + hv -> od + h … … 251 264 dtgas(ilay,iw,a_no) = colinc(ilay)*rm(ilay,i_no)*xsno(iw) 252 265 dtgas(ilay,iw,a_n2) = colinc(ilay)*rm(ilay,i_n2)*xsn2(iw) 266 dtgas(ilay,iw,a_h2s) = colinc(ilay)*rm(ilay,i_h2s)*xsh2s(iw) 267 dtgas(ilay,iw,a_s3) = colinc(ilay)*rm(ilay,i_s3)*xss3(iw) 268 dtgas(ilay,iw,a_s4) = colinc(ilay)*rm(ilay,i_s4)*xss4(iw) 269 dtgas(ilay,iw,a_s8) = colinc(ilay)*rm(ilay,i_s8)*xss8(iw) 253 270 end do 254 271 end do … … 289 306 sj(ilay,iw,j_no) = xsno(iw)*yieldno(iw) ! no 290 307 sj(ilay,iw,j_n2) = xsn2(iw)*yieldn2(iw) ! n2 308 sj(ilay,iw,j_h2s) = xsh2s(iw) ! h2s 309 sj(ilay,iw,j_s3) = xss3(iw) ! s3 310 sj(ilay,iw,j_s4) = xss4(iw) ! s4 311 sj(ilay,iw,j_s8) = xss8(iw) ! s8 291 312 end do 292 313 end do
Note: See TracChangeset
for help on using the changeset viewer.
