From 5780a42a3df980f73b11bfccbe760a8a5239ec37 Mon Sep 17 00:00:00 2001 From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr> Date: Thu, 26 Apr 2018 14:56:18 +0200 Subject: [PATCH] Maud et Gaelle 26/04/2018 : TUV 531 --- .../009_ICARTT/001_pgd1/get_chimie_files | 2 +- .../009_ICARTT/003_mesonh/run_mesonh_xyz | 5 +- .../011_KW78CHEM/002_mesonh/run_mesonh_xyz | 5 +- src/MNH/BASIC.f90 | 89 +- src/MNH/ch_f77.fx90 | 12407 +++++++++++----- src/MNH/ch_init_jvalues.f90 | 6 +- src/MNH/modd_ch_init_jvalues.f90 | 2 +- 7 files changed, 8645 insertions(+), 3871 deletions(-) diff --git a/MY_RUN/KTEST/009_ICARTT/001_pgd1/get_chimie_files b/MY_RUN/KTEST/009_ICARTT/001_pgd1/get_chimie_files index e8947cd23..6718c71c1 100755 --- a/MY_RUN/KTEST/009_ICARTT/001_pgd1/get_chimie_files +++ b/MY_RUN/KTEST/009_ICARTT/001_pgd1/get_chimie_files @@ -20,7 +20,7 @@ cd ${CHIMIE_FILES} CHIMIE_URL="http://mesonh.aero.obs-mip.fr/mesonh/dir_open/dir_CHIMIE" WGET="wget" export CHIMIE_URL -for dir in EMISSIONS tuv50 +for dir in EMISSIONS tuv531 do [ -d $dir ] || ( ${WGET} -c -nd $CHIMIE_URL/$dir.tar.gz ; tar xvfz $dir.tar.gz ; rm -f $dir.tar.gz ) done diff --git a/MY_RUN/KTEST/009_ICARTT/003_mesonh/run_mesonh_xyz b/MY_RUN/KTEST/009_ICARTT/003_mesonh/run_mesonh_xyz index 1d748be8e..afab5d0c2 100755 --- a/MY_RUN/KTEST/009_ICARTT/003_mesonh/run_mesonh_xyz +++ b/MY_RUN/KTEST/009_ICARTT/003_mesonh/run_mesonh_xyz @@ -9,9 +9,8 @@ rm -f ICART* OUT* EXSEG?.nam export CHIMIE_FILES=${CHIMIE_FILES:-"$HOME/CHIMIE_FILES"} -ln -sf ${CHIMIE_FILES}/tuv50/DATAE1 . -ln -sf ${CHIMIE_FILES}/tuv50/DATAJ1 . -ln -sf ${CHIMIE_FILES}/tuv50/DATAS1 . +ln -sf ${CHIMIE_FILES}/tuv531/DATAE1 . +ln -sf ${CHIMIE_FILES}/tuv531/DATAJ1 . cp EXSEG1.nam.src EXSEG1.nam ln -sf ../002_arp2lfi/CPLCH20040810.18.{des,lfi,nc} . ln -sf ../001_pgd1/ICARTT1008_PGD_15km.{des,lfi,nc} . diff --git a/MY_RUN/KTEST/011_KW78CHEM/002_mesonh/run_mesonh_xyz b/MY_RUN/KTEST/011_KW78CHEM/002_mesonh/run_mesonh_xyz index d9adc3576..02331f2de 100755 --- a/MY_RUN/KTEST/011_KW78CHEM/002_mesonh/run_mesonh_xyz +++ b/MY_RUN/KTEST/011_KW78CHEM/002_mesonh/run_mesonh_xyz @@ -5,9 +5,8 @@ set -x set -e export CHIMIE_FILES=${CHIMIE_FILES:-"$HOME/CHIMIE_FILES"} -ln -sf ${CHIMIE_FILES}/tuv50/DATAE1 . -ln -sf ${CHIMIE_FILES}/tuv50/DATAJ1 . -ln -sf ${CHIMIE_FILES}/tuv50/DATAS1 . +ln -sf ${CHIMIE_FILES}/tuv531/DATAE1 . +ln -sf ${CHIMIE_FILES}/tuv531/DATAJ1 . ln -fs ../001_prep_ideal_case/KWRAIN.{des,lfi,nc} . rm -f KWRAI.1.SEGCH OUT* time ${MPIRUN} MESONH${XYZ} diff --git a/src/MNH/BASIC.f90 b/src/MNH/BASIC.f90 index 699563349..cd557a6ee 100644 --- a/src/MNH/BASIC.f90 +++ b/src/MNH/BASIC.f90 @@ -1,7 +1,3 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. ! !======================================================================== ! @@ -250,7 +246,7 @@ ! KTR38=@KT(0.03,60.,TPK%T,TPK%RADR,KVECNPT)/(@HEFFA(4.1e3,-6200.,1.74e-5,0.,0.,0.,TPK%PHR,TPK%T,KVECNPT)*TPK%RCH*TPK%T)::WR_ORA2-->ORA2 ! KTR39=@KT(0.05,47.,TPK%T,TPK%RADR,KVECNPT)/(@HENRY(2.7e0,-2030.,TPK%T,KVECNPT)*TPK%RCH*TPK%T)::WR_MO2-->MO2 ! KTR40=@KT(0.007,48.,TPK%T,TPK%RADR,KVECNPT)/(@HENRY(3.e2,-5280.,TPK%T,KVECNPT)*TPK%RCH*TPK%T)::WR_OP1-->OP1 -! KC1=7.e-6::WC_H2O2-->WC_OH+WC_OH +! KC1=!ZRATES(:,018)::WC_H2O2-->WC_OH+WC_OH ! KC2=(3.6E+9*exp(-930.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECCLOUD::WC_OH+WC_OH-->WC_H2O2 ! KC3=((2.8E+10*10.**(-TPK%PHC)+3.5E+10*exp(-720.*(1./TPK%T-1./298.15))*1.6e-5)/(1.6e-5+10.**(-TPK%PHC)))/TPK%MOL2MOLECCLOUD::WC_OH+WC_HO2--> ! KC4=(3.2E+7*exp(-1700.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECCLOUD::WC_H2O2+WC_OH-->WC_HO2 @@ -262,7 +258,7 @@ ! KC10=2.6E-2*10.**(-TPK%PHC)/(1.26e-6+10.**(-TPK%PHC))::WC_HNO4-->WC_HO2+WC_NO2 ! KC11=1.1E0*1.26e-6/(1.26e-6+10.**(-TPK%PHC))::WC_HNO4-->WC_HONO ! KC12=(3.3E+5*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*(10.**(-TPK%PHC))**2./((1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.)*(1.26e-6+10.**(-TPK%PHC))))/TPK%MOL2MOLECCLOUD::WC_HNO4+WC_SO2-->WC_SULF+WC_HNO3 -! KC13=4.e-7*2.2e+1/(2.2e+1+10.**(-TPK%PHC))::WC_HNO3-->WC_NO2+WC_OH +! KC13=!ZRATES(:,019)*2.2e+1/(2.2e+1+10.**(-TPK%PHC))::WC_HNO3-->WC_NO2+WC_OH ! KC14=1.0E+10::WC_N2O5-->WC_HNO3+WC_HNO3 ! KC15=(1.0E+5*1.0e+3*1.0e-2/(1.0e+3*1.0e-2+1.0e+3*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.))/TPK%MOL2MOLECCLOUD::WC_NO3+WC_SULF-->WC_HNO3+WC_ASO4 ! KC16=(1.3E+9*exp(-2200.*(1./TPK%T-1./298.15))*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)/(1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.))/TPK%MOL2MOLECCLOUD::WC_NO3+WC_SO2-->WC_HNO3+WC_ASO3 @@ -280,7 +276,7 @@ ! KC28=4.6E+2*exp(-1100.*(1./TPK%T-1./298.15))::WC_ASO4-->WC_SULF+WC_OH ! KC29=((3.7E+5*exp(-5500.*(1./TPK%T-1./298.15))*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+1.5E+9*exp(-5300.*(1./TPK%T-1./298.15))*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15)))/(1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.))/TPK%MOL2MOLECCLOUD::WC_SO2+WC_O3-->WC_SULF ! KC30=(9.1E+7*exp(-3600.*(1./TPK%T-1./298.15))*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)*10.**(-TPK%PHC)/(1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.))/TPK%MOL2MOLECCLOUD::WC_SO2+WC_H2O2-->WC_SULF -! KR1=7.e-6::WR_H2O2-->WR_OH+WR_OH +! KR1=!ZRATES(:,018)::WR_H2O2-->WR_OH+WR_OH ! KR2=(3.6E+9*exp(-930.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECRAIN::WR_OH+WR_OH-->WR_H2O2 ! KR3=((2.8E+10*10.**(-TPK%PHR)+3.5E+10*exp(-720.*(1./TPK%T-1./298.15))*1.6e-5)/(1.6e-5+10.**(-TPK%PHR)))/TPK%MOL2MOLECRAIN::WR_OH+WR_HO2--> ! KR4=(3.2E+7*exp(-1700.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECRAIN::WR_H2O2+WR_OH-->WR_HO2 @@ -292,7 +288,7 @@ ! KR10=2.6E-2*10.**(-TPK%PHR)/(1.26e-6+10.**(-TPK%PHR))::WR_HNO4-->WR_HO2+WR_NO2 ! KR11=1.1E0*1.26e-6/(1.26e-6+10.**(-TPK%PHR))::WR_HNO4-->WR_HONO ! KR12=(3.3E+5*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*(10.**(-TPK%PHR))**2./((1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHR)+(10.**(-TPK%PHR))**2.)*(1.26e-6+10.**(-TPK%PHR))))/TPK%MOL2MOLECRAIN::WR_HNO4+WR_SO2-->WR_SULF+WR_HNO3 -! KR13=4.e-7*2.2e+1/(2.2e+1+10.**(-TPK%PHR))::WR_HNO3-->WR_NO2+WR_OH +! KR13=!ZRATES(:,019)*2.2e+1/(2.2e+1+10.**(-TPK%PHR))::WR_HNO3-->WR_NO2+WR_OH ! KR14=1.0E+10::WR_N2O5-->WR_HNO3+WR_HNO3 ! KR15=(1.0E+5*1.0e+3*1.0e-2/(1.0e+3*1.0e-2+1.0e+3*10.**(-TPK%PHR)+(10.**(-TPK%PHR))**2.))/TPK%MOL2MOLECRAIN::WR_NO3+WR_SULF-->WR_HNO3+WR_ASO4 ! KR16=(1.3E+9*exp(-2200.*(1./TPK%T-1./298.15))*1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHR)/(1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHR)+(10.**(-TPK%PHR))**2.))/TPK%MOL2MOLECRAIN::WR_NO3+WR_SO2-->WR_HNO3+WR_ASO3 @@ -3572,7 +3568,7 @@ IF (GFIRSTCALL) THEN &030.,TPK%T,KVECNPT)*TPK%RCH*TPK%T)::WR_MO2-->MO2' CFULLREACS(212) = 'KTR40=@KT(0.007,48.,TPK%T,TPK%RADR,KVECNPT)/(@HENRY(3.e2,-5& &280.,TPK%T,KVECNPT)*TPK%RCH*TPK%T)::WR_OP1-->OP1' - CFULLREACS(213) = 'KC1=7.e-6::WC_H2O2-->WC_OH+WC_OH' + CFULLREACS(213) = 'KC1=!ZRATES(:,018)::WC_H2O2-->WC_OH+WC_OH' CFULLREACS(214) = 'KC2=(3.6E+9*exp(-930.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECC& &LOUD::WC_OH+WC_OH-->WC_H2O2' CFULLREACS(215) = 'KC3=((2.8E+10*10.**(-TPK%PHC)+3.5E+10*exp(-720.*(1./TPK%T-1& @@ -3602,8 +3598,8 @@ IF (GFIRSTCALL) THEN &PK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**& &(-TPK%PHC))**2.)*(1.26e-6+10.**(-TPK%PHC))))/TPK%MOL2MOLECCLOUD::WC_HNO4+WC_SO& &2-->WC_SULF+WC_HNO3' - CFULLREACS(225) = 'KC13=4.e-7*2.2e+1/(2.2e+1+10.**(-TPK%PHC))::WC_HNO3-->WC_NO& -&2+WC_OH' + CFULLREACS(225) = 'KC13=!ZRATES(:,019)*2.2e+1/(2.2e+1+10.**(-TPK%PHC))::WC_HNO& +&3-->WC_NO2+WC_OH' CFULLREACS(226) = 'KC14=1.0E+10::WC_N2O5-->WC_HNO3+WC_HNO3' CFULLREACS(227) = 'KC15=(1.0E+5*1.0e+3*1.0e-2/(1.0e+3*1.0e-2+1.0e+3*10.**(-TPK& &%PHC)+(10.**(-TPK%PHC))**2.))/TPK%MOL2MOLECCLOUD::WC_NO3+WC_SULF-->WC_HNO3+WC_& @@ -3659,7 +3655,7 @@ IF (GFIRSTCALL) THEN &./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15))+1.3e-2*exp(1965.*(1& &./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.))/TPK%MOL2MOLECCLOUD& &::WC_SO2+WC_H2O2-->WC_SULF' - CFULLREACS(243) = 'KR1=7.e-6::WR_H2O2-->WR_OH+WR_OH' + CFULLREACS(243) = 'KR1=!ZRATES(:,018)::WR_H2O2-->WR_OH+WR_OH' CFULLREACS(244) = 'KR2=(3.6E+9*exp(-930.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECR& &AIN::WR_OH+WR_OH-->WR_H2O2' CFULLREACS(245) = 'KR3=((2.8E+10*10.**(-TPK%PHR)+3.5E+10*exp(-720.*(1./TPK%T-1& @@ -3689,8 +3685,8 @@ IF (GFIRSTCALL) THEN &PK%T-1./298.15))+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHR)+(10.**& &(-TPK%PHR))**2.)*(1.26e-6+10.**(-TPK%PHR))))/TPK%MOL2MOLECRAIN::WR_HNO4+WR_SO2& &-->WR_SULF+WR_HNO3' - CFULLREACS(255) = 'KR13=4.e-7*2.2e+1/(2.2e+1+10.**(-TPK%PHR))::WR_HNO3-->WR_NO& -&2+WR_OH' + CFULLREACS(255) = 'KR13=!ZRATES(:,019)*2.2e+1/(2.2e+1+10.**(-TPK%PHR))::WR_HNO& +&3-->WR_NO2+WR_OH' CFULLREACS(256) = 'KR14=1.0E+10::WR_N2O5-->WR_HNO3+WR_HNO3' CFULLREACS(257) = 'KR15=(1.0E+5*1.0e+3*1.0e-2/(1.0e+3*1.0e-2+1.0e+3*10.**(-TPK& &%PHR)+(10.**(-TPK%PHR))**2.))/TPK%MOL2MOLECRAIN::WR_NO3+WR_SULF-->WR_HNO3+WR_A& @@ -28919,7 +28915,6 @@ SUBROUTINE SUBSRW8 ! !Indices 213 a 222 ! - TPK%KC1=7.e-6 TPK%KC2=(3.6E+9*exp(-930.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECCLOUD TPK%KC3=((2.8E+10*10.**(-TPK%PHC)+3.5E+10*exp(-720.*(1./TPK%T-1./298.15))*1.6e& &-5)/(1.6e-5+10.**(-TPK%PHC)))/TPK%MOL2MOLECCLOUD @@ -28951,7 +28946,6 @@ SUBROUTINE SUBSRW9 &((1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15)& &)+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHC)+(10.**(-TPK%PHC))**2.& &)*(1.26e-6+10.**(-TPK%PHC))))/TPK%MOL2MOLECCLOUD - TPK%KC13=4.e-7*2.2e+1/(2.2e+1+10.**(-TPK%PHC)) TPK%KC14=1.0E+10 TPK%KC15=(1.0E+5*1.0e+3*1.0e-2/(1.0e+3*1.0e-2+1.0e+3*10.**(-TPK%PHC)+(10.**(-T& &PK%PHC))**2.))/TPK%MOL2MOLECCLOUD @@ -29012,7 +29006,6 @@ SUBROUTINE SUBSRW11 ! !Indices 243 a 252 ! - TPK%KR1=7.e-6 TPK%KR2=(3.6E+9*exp(-930.*(1./TPK%T-1./298.15)))/TPK%MOL2MOLECRAIN TPK%KR3=((2.8E+10*10.**(-TPK%PHR)+3.5E+10*exp(-720.*(1./TPK%T-1./298.15))*1.6e& &-5)/(1.6e-5+10.**(-TPK%PHR)))/TPK%MOL2MOLECRAIN @@ -29044,7 +29037,6 @@ SUBROUTINE SUBSRW12 &((1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*6.4e-8*exp(1430.*(1./TPK%T-1./298.15)& &)+1.3e-2*exp(1965.*(1./TPK%T-1./298.15))*10.**(-TPK%PHR)+(10.**(-TPK%PHR))**2.& &)*(1.26e-6+10.**(-TPK%PHR))))/TPK%MOL2MOLECRAIN - TPK%KR13=4.e-7*2.2e+1/(2.2e+1+10.**(-TPK%PHR)) TPK%KR14=1.0E+10 TPK%KR15=(1.0E+5*1.0e+3*1.0e-2/(1.0e+3*1.0e-2+1.0e+3*10.**(-TPK%PHR)+(10.**(-T& &PK%PHR))**2.))/TPK%MOL2MOLECRAIN @@ -29193,8 +29185,8 @@ REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PJVALUES ! Tuv coefficient ! /BEGIN_SET_PHOTO_RATES/ ! parameter for use by subroutine JVALUES, ! contains the actual photolysis rates -REAL, DIMENSION(KVECNPT,21) :: ZRATESIO ! TUV photolysis rates at one level -REAL, DIMENSION(KVECNPT,17) :: ZRATES ! photolysis rates of RACM (vector) +REAL, DIMENSION(KVECNPT,41) :: ZRATESIO ! TUV photolysis rates at one level +REAL, DIMENSION(KVECNPT,19) :: ZRATES ! photolysis rates of RACM (vector) INTEGER :: JITPK ! loop counter for J-Value transfer INTEGER :: IDTI,IDTJ INTEGER :: JITPKPLUS @@ -29229,29 +29221,34 @@ DO JITPK = 0, KVECNPT-1 ! ! associate TUV J-Values to ReLACS J-Values ! - ZRATES(JITPK+1, 1) = ZRATESIO(JITPK+1,2) - ZRATES(JITPK+1, 2) = ZRATESIO(JITPK+1,3) - ZRATES(JITPK+1, 3) = ZRATESIO(JITPK+1,4) - ZRATES(JITPK+1, 4) = ZRATESIO(JITPK+1,9) - ZRATES(JITPK+1, 5) = ZRATESIO(JITPK+1,10) - ZRATES(JITPK+1, 6) = ZRATESIO(JITPK+1,11) - ZRATES(JITPK+1, 7) = ZRATESIO(JITPK+1,5) - ZRATES(JITPK+1, 8) = ZRATESIO(JITPK+1,6) - ZRATES(JITPK+1, 9) = ZRATESIO(JITPK+1,12) - ZRATES(JITPK+1, 10) = ZRATESIO(JITPK+1,14) - ZRATES(JITPK+1, 11) = ZRATESIO(JITPK+1,13) - ZRATES(JITPK+1, 12) = ZRATESIO(JITPK+1,17) - ZRATES(JITPK+1, 13) = ZRATESIO(JITPK+1,15) - ZRATES(JITPK+1, 14) = 0.962055 *ZRATESIO(JITPK+1,15)+& - & 1.06247E-02 *ZRATESIO(JITPK+1,12) - ZRATES(JITPK+1, 15) = ZRATESIO(JITPK+1,20) - ZRATES(JITPK+1, 16) = 3.16657 *ZRATESIO(JITPK+1,15)& - &+ 0.372446 *ZRATESIO(JITPK+1,15)& - &+ 8.42257 *ZRATESIO(JITPK+1,15)& - &+ 207.5913 *ZRATESIO(JITPK+1,20)& - &+ 0.0 *ZRATESIO(JITPK+1,20)& - &+ 8.44837E-04 *ZRATESIO(JITPK+1,20) - ZRATES(JITPK+1, 17) = ZRATESIO(JITPK+1,16) +! change according to original coefficients and modified RACM +! + ZRATES(JITPK+1, 1) = ZRATESIO(JITPK+1,5) + ZRATES(JITPK+1, 2) = ZRATESIO(JITPK+1,2) + ZRATES(JITPK+1, 3) = ZRATESIO(JITPK+1,3) + ZRATES(JITPK+1, 4) = ZRATESIO(JITPK+1,8) + ZRATES(JITPK+1, 5) = ZRATESIO(JITPK+1,9) + ZRATES(JITPK+1, 6) = ZRATESIO(JITPK+1,10) + ZRATES(JITPK+1, 7) = ZRATESIO(JITPK+1,6) + ZRATES(JITPK+1, 8) = ZRATESIO(JITPK+1,7) + ZRATES(JITPK+1, 9) = ZRATESIO(JITPK+1,4) + ZRATES(JITPK+1, 10) = ZRATESIO(JITPK+1,12) + ZRATES(JITPK+1, 11) = ZRATESIO(JITPK+1,11) + ZRATES(JITPK+1, 12) = ZRATESIO(JITPK+1,13) + ZRATES(JITPK+1, 13) = ZRATESIO(JITPK+1,17) + ZRATES(JITPK+1, 14) = 0.962055 *ZRATESIO(JITPK+1,17)+& + & 3.79454E-02 *ZRATESIO(JITPK+1,38) + ZRATES(JITPK+1, 15) = ZRATESIO(JITPK+1,33) + ZRATES(JITPK+1, 16) = 0.20842 *ZRATESIO(JITPK+1,35)& + &+ 6.43207E-02 *ZRATESIO(JITPK+1,36)& + &+ 3.10372E-02 *ZRATESIO(JITPK+1,34)& + &+ 0.376 *ZRATESIO(JITPK+1,37)& + &+ 0.31937 *ZRATESIO(JITPK+1,26) + ZRATES(JITPK+1, 17) = 0.20*ZRATESIO(JITPK+1,20)& + &+ 0.80*ZRATESIO(JITPK+1,21) +! aqueous phase photolysis + ZRATES(JITPK+1, 18) = ZRATESIO(JITPK+1,40) + ZRATES(JITPK+1, 19) = ZRATESIO(JITPK+1,41) ! END DO ! @@ -29273,6 +29270,12 @@ END DO TPK%K015=ZRATES(:,015) TPK%K016=ZRATES(:,016) TPK%K017=ZRATES(:,017) +IF (TPK%LUSECHAQ) THEN + TPK%KC1=ZRATES(:,018) + TPK%KC13=ZRATES(:,019)*2.2e+1/(2.2e+1+10.**(-TPK%PHC)) + TPK%KR1=ZRATES(:,018) + TPK%KR13=ZRATES(:,019)*2.2e+1/(2.2e+1+10.**(-TPK%PHR)) +END IF TPK%NOUT = KOUT TPK%NVERB = KVERB RETURN diff --git a/src/MNH/ch_f77.fx90 b/src/MNH/ch_f77.fx90 index 54036a24c..f7a653034 100644 --- a/src/MNH/ch_f77.fx90 +++ b/src/MNH/ch_f77.fx90 @@ -1,8 +1,12 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/ch_f77.fx90,v $ $Revision: 1.2.2.1.2.2.2.1.8.2.2.3 $ $Date: 2014/06/19 15:18:13 $ +!----------------------------------------------------------------- C**FILE: svode.f C**AUTHOR: Karsten Suhre C**DATE: Fri Nov 10 09:17:45 GMT 1995 @@ -16,7 +20,6 @@ C** in exponential calculation --> problem with "ifort -O2" compiler C**MODIFIED: 22/02/2011 (J.Escobar) remove erroneous 'CALL ABORT' C**MODIFIED: 19/06/2014 (J.Escobar & M.Leriche) write(kout,...) to OUTPUT_LISTING file C & correct IN_LUN = 11 => IN_LUN = 78 to avoid fort.11 creation -C**MODIFIED: 13/02/2018 (P.Wautelet) use ifdef MNH_REAL to prevent problems with intrinsics on Blue Gene/Q C! C! C! @@ -4456,6 +4459,11 @@ c 30 continue return end + +*======= BEGIN of TUV 5.3.1 =======* +* M.LERICHE Update Feb. 2018 + +CCC FILE TUV.f *---------------------------------------------------------------------------- subroutine tuvmain (asza, idate, + albnew, dobnew, @@ -4464,8 +4472,8 @@ c + kout ) *-----------------------------------------------------------------------------* *= Tropospheric Ultraviolet-Visible (TUV) radiation model =* -*= Version 5.0 =* -*= November 2010 =* +*= Version 5.3 =* +*= June 2016 =* *-----------------------------------------------------------------------------* *= Developed by Sasha Madronich with important contributions from: =* *= Chris Fischer, Siri Flocke, Julia Lee-Taylor, Bernhard Meyer, =* @@ -4490,10 +4498,11 @@ c *= To obtain a copy of the GNU General Public License, write to: =* *= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* *-----------------------------------------------------------------------------* -*= Copyright (C) 1994-2010 by the University Corporation for Atmospheric =* +*= Copyright (C) 1994-2016 by the University Corporation for Atmospheric =* *= Research, extending to all called subroutines, functions, and data unless =* *= another source is specified. =* *-----------------------------------------------------------------------------* +*= Adapted to MesoNH : ONLY JVALUES are computed IMPLICIT NONE SAVE @@ -4519,18 +4528,15 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) - * delta for adding points at beginning or end of data grids REAL deltax PARAMETER (deltax = 1.E-5) +*_________________________________________________ * some constants... - * pi: REAL pi PARAMETER(pi=3.1415926535898) @@ -4540,7 +4546,6 @@ c INCLUDE 'params' PARAMETER(radius=6.371E+3) * Planck constant x speed of light, J m - REAL hc PARAMETER(hc = 6.626068E-34 * 2.99792458E8) @@ -4554,7 +4559,6 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - REAL precis PARAMETER(precis = 1.e-7) @@ -4636,19 +4640,13 @@ c INCLUDE 'params' REAL fdir(kz), fdn(kz), fup(kz) REAL saflux(kz,kw) -* Spectral weighting functions and weighted radiation - - INTEGER ns, is - REAL sw(ks,kw), rate(ks,kz), dose(ks) - REAL drdw - CHARACTER*50 slabel(ks) - * Photolysis coefficients (j-values) INTEGER nj, ij REAL sj(kj,kz,kw), valj(kj,kz) REAL djdw CHARACTER*50 jlabel(kj) + INTEGER tpflag(kj) **** Re-scaling factors (can be read from input file) * New surface albedo and surface pressure (milli bar) @@ -4672,7 +4670,7 @@ c INCLUDE 'params' INTEGER iyear, imonth, iday INTEGER it, nt REAL t, tstart, tstop - REAL tmzone, ut + REAL tmzone LOGICAL lzenit * number of radiation streams @@ -4692,20 +4690,9 @@ c INCLUDE 'params' * Save arrays for output: - LOGICAL lirrad, laflux, lrates, ljvals, lmmech + LOGICAL laflux, ljvals, lmmech INTEGER isfix, ijfix, itfix, izfix, iwfix, i - INTEGER nms, ims(ks), nmj, imj(kj) - -c REAL svj_zj(kz,kj), svj_tj(kt,kj), svj_zt(kz,kt) -c REAL svr_zs(kz,ks), svr_ts(kt,ks), svr_zt(kz,kt) -c REAL svf_zw(kz,kw), svf_tw(kt,kw), svf_zt(kz,kt) -c REAL svi_zw(kz,kw), svi_tw(kt,kw), svi_zt(kz,kt) - -* Parameters for shifting wavelengths air <--> vacuum - - INTEGER mrefr - LOGICAL lrefr - REAL airout + INTEGER nmj, imj(kj) * Planetary boundary layer height and pollutant concentrations @@ -4717,7 +4704,7 @@ c REAL svi_zw(kz,kw), svi_tw(kt,kw), svi_zt(kz,kt) C method: C C on first call, all necessary data will be read from the files -C in directories DATA0, DATA4, and DATAX; +C in directories DATAE1, DATAJ1; C all variables are saved for future calls to TUV C REAL, INTENT(IN) :: asza @@ -4827,17 +4814,11 @@ C * ztemp = air temperature (K) at zout. Set to negative value for * default USSA76 value interpolated to zout. * Output options, logical switches: -* lirrad = output spectral irradiance * laflux = output spectral actinic flux * lmmech = output for NCAR Master Mechanism use -* lrates = output dose rates (UVB, UVA, CIE/erythema, etc.) - lirrad =.FALSE. laflux =.FALSE. lmmech =.FALSE. - lrates =.FALSE. * Output options, integer selections: -* isfix: if > 0, output dose rate for action spectrum is=isfix, tabulated -* for different times and altitudes. * ijfix: if > 0, output j-values for reaction ij=ijfix, tabulated * for different times and altitudes. * iwfix: if > 0, output spectral irradiance and/or spectral actinic @@ -4849,16 +4830,13 @@ C * izfix: if > 0, output spectral irradiance and/or spectral actinic * flux at altitude iz=izfix, tabulated for different times * and wavelengths. -* nms: number of dose rates that will be reported. Selections must be -* made interactively, or by editing input file. * nmj: number of j-values that will be reported. Selections must be * made interactively, or by editing input file. -* The following default settings are also found in the input file 'defin1': - izfix = 1 + izfix = 1 IF (LFIRSTCALL) THEN - WRITE(kout,*) 'running TUVMAIN, version 5.0' + WRITE(kout,*) 'running TUVMAIN, version 5.3.1' IF(nstr .LT. 2) THEN WRITE(kout,*) 'Delta-Eddington 2-stream radiative transfer' @@ -4869,17 +4847,9 @@ C * ___ SECTION 2: SET GRIDS _________________________________________________ -* wavelengths (creates wavelength grid: lower, center, upper of each bin) -* NOTE: Wavelengths are in vacuum. To use wavelengths in air, see -* Section 3 below, where you must set lrefr= .TRUE. - - CALL gridw(wstart, wstop, nwint, - $ nw, wl, wc, wu) -c - * altitudes (creates altitude grid, locates index for selected output, izout) - CALL gridz(zin,nlevel, zstart, zstop, nz, z, zout, izout) + CALL gridz(zin,nlevel, zstart, zstop, nz, z, zout, izout,kout) if(izfix .gt. 0) izout = izfix * time/zenith (creates time/zenith angle grid, starting at tstart) @@ -4890,6 +4860,13 @@ c $ lzenit, tstart, tstop, c $ nt, t, sza, esfact) sza = asza +* wavelength grid, user-set range and spacing. +* NOTE: Wavelengths are in vacuum, and therefore independent of altitude. +* To use wavelengths in air, see options in subroutine gridw + + CALL gridw(wstart, wstop, nwint, + $ nw, wl, wc, wu, kout) + * ___ SECTION 3: SET UP VERTICAL PROFILES OF TEMPERATURE, AIR DENSITY, and OZONE______ ***** Temperature vertical profile, Kelvin @@ -4905,40 +4882,6 @@ c IF(ztemp .GT. nzero) tlev(izout) = ztemp $ aircon, aircol, kout) c IF(zaird .GT. nzero) aircon(izout) = zaird -***** Correction for air-vacuum wavelength shift: -* The TUV code assumes that all working wavelengths are strictly IN-VACUUM. This is for ALL -* spectral data including extraterrestrial fluxes, ozone (and other) absorption cross sections, -* and various weighting functons (action spectra, photolysis cross sections, instrument spectral -* response functions). If the original data are specified in-air, conversion to in-vacuum must be -* made when reading those data. - -* Occasionally, users may want their results to be given for wavelengths measured IN-AIR. -* The shift between IN-VACUUM and IN-AIR wavelengths depends on the index of refraction -* of air, which in turn depends on the local density of air, which in turn depends on -* altitude, temperature, etc. -* Here, we provide users with the option to use a wavelength grid IN-AIR, at the air density -* corresponding to the output altitude, airout = aircon(izout), by setting the logical variable -* lrefr = .TRUE. (default is lrefr = .FALSE.). The wavelengths specified in gridw.f will be assumed -* to be IN-AIR, and will be shifted here to IN-VACUUM values to carry out the calculatons. -* The actual radiative transfer calculations will be done strictly with IN-VACUUM values. -* If this shift is applied (i.e., if lrefr = .TRUE.), the wavelength grid will be shifted back to air -* values just before the output is written. -* Note: if this option is used (lref = .TRUE.), the wavelength values will be correct ONLY at the -* selected altitude, iz = iout. The wavelength shift will be INCORRECT at all other altitudes. -* Note: This option cannot be changed interactively in the input table. It must be changed here. - -C lrefr = .TRUE. - lrefr = .FALSE. - IF(lrefr) THEN - airout = aircon(izout) - write(*,*) 'applying air to vacuum wavelength shift', - $ izout, airout - mrefr = 1 - CALL wshift(mrefr, nw, wl, airout) - CALL wshift(mrefr, nwint, wc, airout) - CALL wshift(mrefr, nwint, wu, airout) - ENDIF - ***** *! PBL pollutants will be added if zpbl > 0. * CAUTIONS: @@ -4999,64 +4942,25 @@ C lrefr = .TRUE. * NO2 nzm1 = nz - 1 - CALL rdo2xs(nw,wl, o2xs1) + CALL rdo2xs(nw,wl, o2xs1,kout) mabs = 1 - CALL rdo3xs(mabs,nzm1,tlay,nw,wl, o3xs) - CALL rdso2xs(nw,wl, so2xs) - CALL rdno2xs(nz,tlay,nw,wl, no2xs) + CALL rdo3xs(mabs,nzm1,tlay,nw,wl, o3xs,kout) + CALL rdso2xs(nw,wl, so2xs,kout) + CALL rdno2xs(nz,tlay,nw,wl, no2xs,kout) ****** Spectral weighting functions * (Some of these depend on temperature T and pressure P, and therefore * on altitude z. Therefore they are computed only after the T and P profiles * are set above with subroutines settmp and setair.) -* Photo-physical set in swphys.f (transmission functions) -* Photo-biological set in swbiol.f (action spectra) * Photo-chemical set in swchem.f (cross sections x quantum yields) -* Physical and biological weigthing functions are assumed to depend -* only on wavelength. * Chemical weighting functions (product of cross-section x quantum yield) * for many photolysis reactions are known to depend on temperature * and/or pressure, and therefore are functions of wavelength and altitude. * Output: -* from pphys & pbiol: s(ks,kw) - for each weighting function slabel(ks) -* from pchem: sj(kj,kz,kw) - for each reaction jlabel(kj) -* For pchem, need to know temperature and pressure profiles. - - CALL swphys(nw,wl,wc, ns,sw,slabel) - CALL swbiol(nw,wl,wc, ns,sw,slabel) - CALL swchem(nw,wl,nz,tlev,aircon, nj,sj,jlabel) - -c CALL swbiol2(nw,wl,wc, ns,sw,slabel) -c CALL swbiol3(nw,wl,wc, ns,sw,slabel) - -**** The following lines are normally commented out. -* The only serve to print a list of the spectral weighting -* functions. If new functions (e.g. action spectra, photo-reactions) -* are added, this list should be used to replace the list in the -* default input files (defin1, defin2, etc.). The true/false toggle -* will be set to F, and should be changed manually to select weighting -* functions for output. Note that if many more functions are added, it -* may be necessary to increase the parameters ks and kj in the include -* file 'params' -* The program will stop after writing this list. -* Comment out these lines when not generating a new list. - -c OPEN(UNIT=50,FILE='spectra.list',STATUS='NEW') -c WRITE(50,500) -c 500 FORMAT(5('='),1X,'Available spectral weighting functions:') -c DO is = 1, ns -c WRITE(50,505) is, slabel(is) -c ENDDO -c WRITE(50,510) -c 510 FORMAT(5('='),1X,'Available photolysis reactions') -c DO ij = 1, nj -c WRITE(50,505) ij, jlabel(ij) -c ENDDO -c 505 FORMAT('F',I3,1X,A50) -c WRITE(50,520) -c 520 FORMAT(66('=')) -c CLOSE (50) -c STOP +* from swchem: sj(kj,kz,kw) - for each reaction jlabel(kj) +* For swchem, need to know temperature and pressure profiles. + + CALL swchem(nw,wl,nz,tlev,aircon, nj,sj,jlabel,tpflag,kout) ****** @@ -5064,7 +4968,7 @@ c STOP * Rayleigh optical depth increments: - CALL odrl(nz, z, nw, wl, aircol, dtrl) + CALL odrl(nz, z, nw, wl, aircol, dtrl,kout) * O2 vertical profile and O2 absorption optical depths * For now, O2 densitiy assumed as 20.95% of air density, can be changed @@ -5072,11 +4976,11 @@ c STOP * Optical depths in Lyman-alpha and SRB will be over-written * in subroutine la_srb.f - CALL seto2(nz,z,nw,wl,aircol,o2xs1, dto2) + CALL seto2(nz,z,nw,wl,aircol,o2xs1, dto2, kout) * Ozone optical depths - CALL odo3(nz,z,nw,wl,o3xs,co3, dto3) + CALL odo3(nz,z,nw,wl,o3xs,co3, dto3,kout) * SO2 vertical profile and optical depths @@ -5084,7 +4988,7 @@ c STOP CALL setso2(ipbl, zpbl, so2pbl, $ so2_tc, nz, z, nw, wl, so2xs, $ tlay, aircol, - $ dtso2) + $ dtso2,kout) * NO2 vertical profile and optical depths @@ -5092,7 +4996,7 @@ c STOP CALL setno2(ipbl, zpbl, no2pbl, $ no2_tc, nz, z, nw, wl, no2xs, $ tlay, aircol, - $ dtno2) + $ dtno2,kout) * Aerosol vertical profile, optical depths, single scattering albedo, asymmetry factor @@ -5127,7 +5031,7 @@ C WRITE(kout,*)'wavelength-independent albedo = ', albnew enddo else CALL setalb(alsurf,nw,wl, - $ albedo) + $ albedo,kout) endif C cloud optical depth (may be modified at each call, so it has ben moved @@ -5137,15 +5041,13 @@ C outside the if(firstcall) section: CALL setcld(nz,z,nw,wl, $ lwc,nlevel, - $ dtcld,omcld,gcld) + $ dtcld,omcld,gcld,kout) * ___ SECTION 6: TIME/SZA LOOP _____________________________________ * Initialize any time-integrated quantities here - CALL zero1(dose,ks) - zen = asza * Loop over time or solar zenith angle (zen): @@ -5169,22 +5071,21 @@ c * slant path lengths for spherical geometry - CALL sphers(nz,z,zen, dsdh,nid) - CALL airmas(nz, dsdh,nid, aircol,vcol,scol) + CALL sphers(nz,z,zen, dsdh,nid, kout) + CALL airmas(nz, dsdh,nid, aircol,vcol,scol, kout) * Recalculate effective O2 optical depth and cross sections for Lyman-alpha * and Schumann-Runge bands, must know zenith angle * Then assign O2 cross section to sj(1,*,*) CALL la_srb(nz,z,tlev,nw,wl,vcol,scol,o2xs1, - $ dto2,o2xs) - CALL sjo2(nz,nw,o2xs,1, sj) + $ dto2,o2xs,kout) + CALL sjo2(nz,nw,o2xs,1, sj,kout) * ____ SECTION 8: WAVELENGTH LOOP ______________________________________ * initialize for wavelength integration - CALL zero2(rate,ks,kz) CALL zero2(valj,kj,kz) ***** Main wavelength loop: @@ -5208,14 +5109,8 @@ c $ dtcld, omcld, gcld, $ dtaer,omaer,gaer, $ dtsnw,omsnw,gsnw, - $ edir, edn, eup, fdir, fdn, fup) - -* Spectral irradiance, W m-2 nm-1, down-welling: - - DO iz = 1, nz - sirrad(iz,iw) = etf(iw) * - $ (dirsun*edir(iz) + difdn*edn(iz) + difup*eup(iz)) - ENDDO + $ edir, edn, eup, fdir, fdn, fup, + $ kout) * Spectral actinic flux, quanta s-1 nm-1 cm-2, all directions: * units conversion: 1.e-4 * (wc*1e-9) / hc @@ -5227,14 +5122,7 @@ c *** Accumulate weighted integrals over wavelength, at all altitudes: - DO 18 iz = 1, nz - -* Weighted irradiances (dose rates) W m-2 - - DO is = 1, ns - drdw = sirrad(iz,iw) * sw(is,iw) - rate(is,iz) = rate(is,iz) + drdw * (wu(iw) - wl(iw)) - ENDDO + DO iz = 1, nz * Photolysis rate coefficients (J-values) s-1 @@ -5243,57 +5131,18 @@ c valj(ij,iz) = valj(ij,iz) + djdw * (wu(iw) - wl(iw)) ENDDO - 18 CONTINUE - -* Save irradiances and actinic fluxes for output - -c CALL saver1(it, itfix, iw, iwfix, nz, izout, -c $ sirrad, saflux, -c $ svi_zw, svf_zw, svi_zt, svf_zt, svi_tw, svf_tw) + ENDDO 10 CONTINUE *^^^^^^^^^^^^^^^^ end wavelength loop -* Save dose rates and j-values for output - -c CALL saver2(it,itfix, nz,izout, ns,isfix,ims, nj,ijfix,imj, -c $ rate, valj, -c $ svr_zs, svj_zj, svr_zt, svj_zt, svr_ts, svj_tj) +* ____ SECTION 9: OUTPUT ______________________________________________ -c 20 CONTINUE - -*^^^^^^^^^^^^^^^^ end time/zenith loop - -** reset wavelength scale if needed: - - IF(lrefr) THEN - write(*,*) 'applying vacuum to air wavelength shift' - $ , izout, airout - mrefr = -mrefr - CALL wshift(mrefr, nw, wl, airout) - CALL wshift(mrefr, nwint, wc, airout) - CALL wshift(mrefr, nwint, wu, airout) - ENDIF - -* ____ SECTION 8: OUTPUT ______________________________________________ - -c call outpt1( outfil, iout, -c $ lirrad, laflux, lrates, ljvals, lmmech, lzenit, -c $ nms, ims, nmj, imj, -c $ nz, z, tlev, aircon, izout, -c $ nw, wl, etf, iwfix, -c $ nt, t, sza, itfix, -c $ ns, slabel, isfix, nj, jlabel, ijfix, -c $ svj_zj, svj_tj, svj_zt, -c $ svr_zs, svr_ts, svr_zt, -c $ svf_zw, svf_tw, svf_zt, -c $ svi_zw, svi_tw, svi_zt ) -c C copy labels into output array - if (njout .ne. 21) then - WRITE(kout,*) 'There should be 21 J-Values to be updated!' + if (njout .ne. 41) then + WRITE(kout,*) 'There should be 41 J-Values to be updated!' WRITE(kout,*) 'We better stop here ... in tuvmain.f' C callabortstop CALL ABORT @@ -5329,61 +5178,14 @@ c CLOSE(iout) C CLOSE(kout) END - +CCC FILE functs.f * This file contains the following user-defined fortran functions: -* fery * fo3qy * fo3qy2 * fsum -* futr -*=============================================================================* - -C ############################## - FUNCTION fery(w) -C ############################## - -*-----------------------------------------------------------------------------* -*= PURPOSE: =* -*= Calculate the action spectrum value for erythema at a given wavelength =* -*= according to: McKinlay, A.F and B.L.Diffey, A reference action spectrum =* -*= for ultraviolet induced erythema in human skin, CIE Journal, vol 6, =* -*= pp 17-22, 1987. =* -*= Value at 300 nm = 0.6486 =* -*-----------------------------------------------------------------------------* -*= PARAMETERS: =* -*= W - REAL, wavelength (nm) (I)=* -*-----------------------------------------------------------------------------* - - IMPLICIT NONE - -* input: - REAL w - -* function value: - REAL fery - - IF (w .LT. 250.) THEN - fery = 1. -C outside the ery spectrum range - ELSEIF ((w .GE. 250.) .AND. (w .LT. 298)) THEN - fery = 1. - ELSEIF ((w .GE. 298.) .AND. (w .LT. 328.)) THEN - fery = 10.**( 0.094*(298.-w) ) - ELSEIF ((w .GE. 328.) .AND. (w .LT. 400.)) THEN - fery = 10.**( 0.015*(139.-w) ) - ELSE - fery = 1.E-36 -C outside the ery spectrum range - ENDIF - - RETURN - END - *=============================================================================* -C ############################## FUNCTION fo3qy(w,t) -C ############################## *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -5418,9 +5220,7 @@ C ############################## END -C ############################## FUNCTION fo3qy2(w,t) -C ############################## *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -5465,9 +5265,7 @@ C ############################## *=============================================================================* -C ############################## FUNCTION fsum(n,x) -C ############################## *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -5498,72 +5296,7 @@ C ############################## RETURN END -*=============================================================================* - -C ############################## - FUNCTION futr(w) -C ############################## - -*-----------------------------------------------------------------------------* -*= PURPOSE: =* -*= Calculate the action spectrum value for skin cancer of albino hairless =* -*= mice at a given wavelength according to: deGRuijl, F.R., H.J.C.M.Steren-=* -*= borg, P.D.Forbes, R.E.Davies, C.Colse, G.Kelfkens, H.vanWeelden, =* -*= and J.C.van der Leun, Wavelength dependence of skin cancer induction by =* -*= ultraviolet irradiation of albino hairless mice, Cancer Research, vol 53,=* -*= pp. 53-60, 1993 =* -*= (Action spectrum for carcinomas) =* -*-----------------------------------------------------------------------------* -*= PARAMETERS: =* -*= W - REAL, wavelength (nm) (I)=* -*-----------------------------------------------------------------------------* - - IMPLICIT NONE - -* input: - REAL w - -* function value: - REAL futr - -* local: - REAL a1, a2, a3, a4, a5, - > x1, x2, x3, x4, x5, - > t1, t2, t3, t4, t5, - > b1, b2, b3, b4, b5, - > p - - a1 = -10.91 - a2 = - 0.86 - a3 = - 8.60 - a4 = - 9.36 - a5 = -13.15 - - x1 = 270. - x2 = 302. - x3 = 334. - x4 = 367. - x5 = 400. - - t1 = (w-x2)*(w-x3)*(w-x4)*(w-x5) - t2 = (w-x1)*(w-x3)*(w-x4)*(w-x5) - t3 = (w-x1)*(w-x2)*(w-x4)*(w-x5) - t4 = (w-x1)*(w-x2)*(w-x3)*(w-x5) - t5 = (w-x1)*(w-x2)*(w-x3)*(w-x4) - - b1 = (x1-x2)*(x1-x3)*(x1-x4)*(x1-x5) - b2 = (x2-x1)*(x2-x3)*(x2-x4)*(x2-x5) - b3 = (x3-x1)*(x3-x2)*(x3-x4)*(x3-x5) - b4 = (x4-x1)*(x4-x2)*(x4-x3)*(x4-x5) - b5 = (x5-x1)*(x5-x2)*(x5-x3)*(x5-x4) - - p = a1*t1/b1 + a2*t2/b2 + a3*t3/b3 + a4*t4/b4 + a5*t5/b5 - - futr = EXP(p) - - RETURN - END - +CCC FILE grids.f * This file contains the following subroutine, related to setting up * grids for numerical calculations: * gridw @@ -5574,7 +5307,7 @@ C ############################## *=============================================================================* SUBROUTINE gridw(wstart, wstop, nwint, - $ nw,wl,wc,wu) + $ nw,wl,wc,wu,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -5601,7 +5334,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -5613,9 +5346,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -5673,6 +5404,9 @@ c INCLUDE 'params' CHARACTER*40 fi CHARACTER*20 wlabel + REAL airout + INTEGER mrefr + REAL dum LOGICAL ok @@ -5686,17 +5420,34 @@ c INCLUDE 'params' * mopt = 3 user-defined * mopt = 4 fast-TUV, troposheric wavelengths only * mopt = 5 high resolution grid for O3 isotopologue study +* mopt = 6 create uniform grid in air-wavelength scale + +* mopt = 10 Landgraf and Crutzen, 1998 +* mopt = 11 fastJ, Wild et al. 2000 +* mopt = 12 fastJ2, Bian and Prather, 2002 +* mopt = 13 UV-b, UV-a, Visible mopt = 2 IF(nwint .EQ. -156) mopt = 2 IF(nwint .EQ. -7) mopt = 4 + IF(nwint .eq. -10) mopt = 10 + IF(nwint .eq. -11) mopt = 11 + IF(nwint .eq. -12) mopt = 12 + IF(nwint .eq. -13) mopt = 13 + IF (mopt .EQ. 1) GO TO 1 IF (mopt .EQ. 2) GO TO 2 IF (mopt .EQ. 3) GO TO 3 IF (mopt .EQ. 4) GO TO 4 IF (mopt .EQ. 5) GO TO 5 + IF (mopt .EQ. 6) GO TO 6 + + IF (mopt .EQ. 10) GO TO 10 + IF (mopt .EQ. 11) GO TO 11 + IF (mopt .EQ. 12) GO TO 12 + IF (mopt .EQ. 13) GO TO 13 *_______________________________________________________________________ @@ -5705,11 +5456,11 @@ c INCLUDE 'params' wlabel = 'equal spacing' nw = nwint + 1 wincr = (wstop - wstart) / FLOAT (nwint) - DO 10, iw = 1, nw-1 + DO iw = 1, nw-1 wl(iw) = wstart + wincr*FLOAT(iw-1) wu(iw) = wl(iw) + wincr wc(iw) = ( wl(iw) + wu(iw) )/2. - 10 CONTINUE + ENDDO wl(nw) = wu(nw-1) GO TO 9 @@ -5776,7 +5527,7 @@ c wlabel = 'isaksen.grid' DO iw = 1, 10 READ(kin,*) ENDDO - nw = ABS(nwint) + 1 + nw = 8 DO iw = 1, nw-1 READ(kin,*) dum, wl(iw), dum, dum ENDDO @@ -5806,8 +5557,8 @@ c wlabel = 'isaksen.grid' DO i = 1, 3859 iw = 3859 - i + 39 - wn(iw) = 10000 + 10*FLOAT(i-1) - wl(iw) = 1.E7/wn(iw) + wn(iw) = 10000 + 10*(i-1) + wl(iw) = 1.E7/float(wn(iw)) ENDDO nw = 3859 + 38 @@ -5820,6 +5571,114 @@ c wlabel = 'isaksen.grid' GO TO 9 +*_______________________________________________________________________ + + 6 CONTINUE + +***** Correction for air-vacuum wavelength shift: +* The TUV code assumes that all working wavelengths are strictly IN-VACUUM. This is for ALL +* spectral data including extraterrestrial fluxes, ozone (and other) absorption cross sections, +* and various weighting functons (action spectra, photolysis cross sections, instrument spectral +* response functions). If the original data are specified in-air, conversion to in-vacuum must be +* made when reading those data. + +* Occasionally, users may want their results to be given for wavelengths measured IN-AIR. +* The shift between IN-VACUUM and IN-AIR wavelengths depends on the index of refraction +* of air, which in turn depends on the local density of air, which in turn depends on +* altitude, temperature, etc. +* Here, we provide users with the option to use a wavelength grid IN-AIR, at the air density +* corresponding to the selected altitude, airout. +* The actual radiative transfer calculations will be done strictly with IN-VACUUM values. + +* create grid that will be nicely spaced in air wavelengths. + + wlabel = 'grid in air wavelengths' + nw = nwint + 1 + wincr = (wstop - wstart) / FLOAT (nwint) + DO iw = 1, nw-1 + wl(iw) = wstart + wincr*FLOAT(iw-1) + wu(iw) = wl(iw) + wincr + wc(iw) = ( wl(iw) + wu(iw) )/2. + ENDDO + wl(nw) = wu(nw-1) + +* shift by refractive index to vacuum wavelengths, for use in tuv + + airout = 2.45e19 + mrefr = 1 + CALL wshift(mrefr, nw, wl, airout, kout) + CALL wshift(mrefr, nwint, wc, airout, kout) + CALL wshift(mrefr, nwint, wu, airout, kout) + + GO TO 9 +*_______________________________________________________________________ +* Landgraf and Crutzen 1998 + 10 CONTINUE + nw = 6 + wl(1) = 289.0 + wl(2) = 305.5 + wl(3) = 313.5 + wl(4) = 337.5 + wl(5) = 422.5 + wl(6) = 752.5 + DO iw = 1, nw-1 + wu(iw) = wl(iw+1) + wc(iw) = 0.5*(wl(iw) + wu(iw)) + ENDDO + GO TO 9 +*_______________________________________________________________________ +* Wild 2000 + 11 CONTINUE + nw = 8 + wl(1) = 289.00 + wl(2) = 298.25 + wl(3) = 307.45 + wl(4) = 312.45 + wl(5) = 320.30 + wl(6) = 345.0 + wl(7) = 412.5 + wl(8) = 850.0 + + DO iw = 1, nw-1 + wu(iw) = wl(iw+1) + wc(iw) = 0.5*(wl(iw) + wu(iw)) + ENDDO + GO TO 9 +*_______________________________________________________________________ +* Bian and Prather 2002 + 12 CONTINUE + nw = 8 + wl(1) = 291.0 + wl(2) = 298.3 + wl(3) = 307.5 + wl(4) = 312.5 + wl(5) = 320.3 + wl(6) = 345.0 + wl(7) = 412.5 + wl(8) = 850.0 + + DO iw = 1, nw-1 + wu(iw) = wl(iw+1) + wc(iw) = 0.5*(wl(iw) + wu(iw)) + ENDDO + GO TO 9 +*_______________________________________________________________________ + +*_______________________________________________________________________ +* UV-b, UV-A, Vis + + 13 CONTINUE + nw = 4 + wl(1) = 280.0 + wl(2) = 315.0 + wl(3) = 400.0 + wl(4) = 700.0 + + DO iw = 1, nw-1 + wu(iw) = wl(iw+1) + wc(iw) = 0.5*(wl(iw) + wu(iw)) + ENDDO + GO TO 9 *_______________________________________________________________________ 9 CONTINUE @@ -5840,7 +5699,8 @@ c wlabel = 'isaksen.grid' *=============================================================================* - SUBROUTINE gridz(zin,nlevel,zstart, zstop, nz, z, zout, izout) + SUBROUTINE gridz(zin,nlevel,zstart, zstop, nz, z, + & zout, izout, kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -5860,7 +5720,7 @@ c wlabel = 'isaksen.grid' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -5872,9 +5732,7 @@ c wlabel = 'isaksen.grid' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -5924,7 +5782,7 @@ c wlabel = 'isaksen.grid' * local: - REAL zincr, tol + REAL zincr INTEGER i, n, nlev LOGICAL ok *_______________________________________________________________________ @@ -6080,9 +5938,8 @@ c wlabel = 'isaksen.grid' * insert your grid values here: * specify: -* nz = total number of altutudes +* nz = total number of altitudes * Table: z(iz), where iz goes from 1 to nz -* trivial example of 2-layer (3-altitudes) shown below, user should modify C use model levels for vertical grid where available do 12, i = 1, nlevel z(i) = zin(i) *1E-3 @@ -6101,6 +5958,19 @@ C C GOTO 10 +*-----end of user options. +*-----grid option 6: high resolution window + +6 CONTINUE + +* insert your grid values here: +* specify: +* nz = total number of altutudes +* Table: z(iz), where iz goes from 1 to nz + + WRITE(*,*) 'user-defined grid, named...' + goto 10 + *-----end of user options. *------------------------------------------------ @@ -6161,249 +6031,6 @@ c 99 CONTINUE IMPLICIT NONE c INCLUDE 'params' -* BROADLY USED PARAMETERS: -*_________________________________________________ -* i/o file unit numbers - INTEGER kout, kin -* output - PARAMETER(kout=6) -* input - PARAMETER(kin=78) -*_________________________________________________ -* altitude, wavelength, time (or solar zenith angle) grids - INTEGER kz, kw -* altitude - PARAMETER(kz=151) -* wavelength - PARAMETER(kw=157) -*_________________________________________________ -* number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) -* wavelength and altitude dependent - PARAMETER(kj=90) - -* delta for adding points at beginning or end of data grids - REAL deltax - PARAMETER (deltax = 1.E-5) - -* some constants... - -* pi: - REAL pi - PARAMETER(pi=3.1415926535898) - -* radius of the earth, km: - REAL radius - PARAMETER(radius=6.371E+3) - -* Planck constant x speed of light, J m - - REAL hc - PARAMETER(hc = 6.626068E-34 * 2.99792458E8) - -* largest number of the machine: - REAL largest - PARAMETER(largest=1.E+36) - -* small numbers (positive and negative) - REAL pzero, nzero - PARAMETER(pzero = +10./largest) - PARAMETER(nzero = -10./largest) - -* machine precision - - REAL precis - PARAMETER(precis = 1.e-7) - - REAL zincr ! i - INTEGER nlev ! i - INTEGER n ! i/o - REAL z(kz) ! i/o - INTEGER i, j ! internal - - j = 0 - DO i = n + 1, n + nlev - j = j + 1 - z(i) = z(n) + FLOAT(j)*zincr - ENDDO - n = n + nlev - - RETURN - END - -*=============================================================================* - -c SUBROUTINE gridt(lat, lon, tmzone, -c $ iyear, imonth, iday, -c $ lzenit, tstart, tstop, -c $ nt, t, sza, esrm2) -c -c *-----------------------------------------------------------------------------* -c *= Subroutine to create time (or solar zenith angle) grid =* -c *= Also computes earth-sun distance (1/R**2) correction. =* -c *-----------------------------------------------------------------------------* -c -c IMPLICIT NONE -c -c c INCLUDE 'params' -c -c * BROADLY USED PARAMETERS: -c *_________________________________________________ -c * i/o file unit numbers -c INTEGER kout, kin -c * output -c PARAMETER(kout=6) -c * input -c PARAMETER(kin=78) -c *_________________________________________________ -c * altitude, wavelength, time (or solar zenith angle) grids -c INTEGER kz, kw -c * altitude -c PARAMETER(kz=151) -c * wavelength -c PARAMETER(kw=157) -c *_________________________________________________ -c * number of weighting functions -c INTEGER ks, kj -c * wavelength dependent -c PARAMETER(ks=60) -c * wavelength and altitude dependent -c PARAMETER(kj=90) -c -c * delta for adding points at beginning or end of data grids -c REAL deltax -c PARAMETER (deltax = 1.E-5) -c -c * some constants... -c -c * pi: -c REAL pi -c PARAMETER(pi=3.1415926535898) -c -c * radius of the earth, km: -c REAL radius -c PARAMETER(radius=6.371E+3) -c -c * Planck constant x speed of light, J m -c -c REAL hc -c PARAMETER(hc = 6.626068E-34 * 2.99792458E8) -c -c * largest number of the machine: -c REAL largest -c PARAMETER(largest=1.E+36) -c -c * small numbers (positive and negative) -c REAL pzero, nzero -c PARAMETER(pzero = +10./largest) -c PARAMETER(nzero = -10./largest) -c -c * machine precision -c -c REAL precis -c PARAMETER(precis = 1.e-7) -c -c * INPUTS -c -c REAL lat, lon, tmzone -c INTEGER iyear, imonth, iday -c LOGICAL lzenit -c INTEGER nt -c REAL tstart, tstop -c -c -c * OUTPUTS -c -c REAL t, sza, esrm2 -c -c * INTERNAL -c -c INTEGER it -c REAL ut, dt -c -c INTEGER jday, nday -c LOGICAL oky, okm, okd -c -c REAL az, el, soldia, soldst -c -c * switch for refraction correction to solar zenith angle. Because -c * this is only for the observed sza at the surface, do not use. -c -c LOGICAL lrefr -c DATA lrefr /.FALSE./ -c -c *************** -c -c IF(nt .EQ. 1) THEN -c dt = 0. -c ELSE -c dt = (tstop - tstart) / FLOAT(nt - 1) -c ENDIF -c -c DO 10 it = 1, nt -c t(it) = tstart + dt * FLOAT(it - 1) -c -c * solar zenith angle calculation: -c * If lzenit = .TRUE., use selected solar zenith angles, also -c * set Earth-Sun distance to 1 AU. -c -c IF (lzenit) THEN -c sza(it) = t(it) -c esrm2(it) = 1. -c -c * If lzenit = .FALSE., compute solar zenith angle for specified -c * location, date, time of day. Assume no refraction (lrefr = .FALSE.) -c * Also calculate corresponding -c * Earth-Sun correcton factor. -c -c ELSE -c CALL calend(iyear, imonth, iday, -c $ jday, nday, oky, okm, okd) -c IF( oky .AND. okm .AND. okd) THEN -c -c ut = t(it) - tmzone -c CALL sunae(iyear, jday, ut, lat, lon, lrefr, -c & az, el, soldia, soldst ) -c sza(it) = 90. - el -c esrm2(it) = 1./(soldst*soldst) -c ELSE -c WRITE(*,*) '**** incorrect date specification' -c STOP ' in gridt ' -c ENDIF -c ENDIF -c -c 10 CONTINUE -c RETURN -c END - -*=============================================================================* - - SUBROUTINE gridck(k,n,x,ok, kout) - -*-----------------------------------------------------------------------------* -*= PURPOSE: =* -*= Check a grid X for various improperties. The values in X have to comply =* -*= with the following rules: =* -*= 1) Number of actual points cannot exceed declared length of X =* -*= 2) Number of actual points has to be greater than or equal to 2 =* -*= 3) X-values must be non-negative =* -*= 4) X-values must be unique =* -*= 5) X-values must be in ascending order =* -*-----------------------------------------------------------------------------* -*= PARAMETERS: =* -*= K - INTEGER, length of X as declared in the calling program (I)=* -*= N - INTEGER, number of actual points in X (I)=* -*= X - REAL, vector (grid) to be checked (I)=* -*= OK - LOGICAL, .TRUE. -> X agrees with rules 1)-5) (O)=* -*= .FALSE.-> X violates at least one of 1)-5) =* -*-----------------------------------------------------------------------------* - - IMPLICIT NONE - -c INCLUDE 'params' - * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers @@ -6421,9 +6048,246 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + + REAL zincr ! i + INTEGER nlev ! i + INTEGER n ! i/o + REAL z(kz) ! i/o + INTEGER i, j ! internal + + j = 0 + DO i = n + 1, n + nlev + j = j + 1 + z(i) = z(n) + FLOAT(j)*zincr + ENDDO + n = n + nlev + + RETURN + END + +*=============================================================================* + +c SUBROUTINE gridt(lat, lon, tmzone, +c $ iyear, imonth, iday, +c $ lzenit, tstart, tstop, +c $ nt, t, sza, esrm2) +c +c *-----------------------------------------------------------------------------* +c *= Subroutine to create time (or solar zenith angle) grid =* +c *= Also computes earth-sun distance (1/R**2) correction. =* +c *-----------------------------------------------------------------------------* +c +c IMPLICIT NONE +c +c c INCLUDE 'params' +c +c * BROADLY USED PARAMETERS: +c *_________________________________________________ +c * i/o file unit numbers +c INTEGER kout, kin +c * output +c PARAMETER(kout=6) +c * input +c PARAMETER(kin=78) +c *_________________________________________________ +c * altitude, wavelength, time (or solar zenith angle) grids +c INTEGER kz, kw +c * altitude +c PARAMETER(kz=151) +c * wavelength +c PARAMETER(kw=157) +c *_________________________________________________ +c * number of weighting functions +c INTEGER kj +c * wavelength and altitude dependent +c PARAMETER(kj=90) +c +c * delta for adding points at beginning or end of data grids +c REAL deltax +c PARAMETER (deltax = 1.E-5) +c +c * some constants... +c +c * pi: +c REAL pi +c PARAMETER(pi=3.1415926535898) +c +c * radius of the earth, km: +c REAL radius +c PARAMETER(radius=6.371E+3) +c +c * Planck constant x speed of light, J m +c +c REAL hc +c PARAMETER(hc = 6.626068E-34 * 2.99792458E8) +c +c * largest number of the machine: +c REAL largest +c PARAMETER(largest=1.E+36) +c +c * small numbers (positive and negative) +c REAL pzero, nzero +c PARAMETER(pzero = +10./largest) +c PARAMETER(nzero = -10./largest) +c +c * machine precision +c +c REAL precis +c PARAMETER(precis = 1.e-7) +c +c * INPUTS +c +c REAL lat, lon, tmzone +c INTEGER iyear, imonth, iday +c LOGICAL lzenit +c INTEGER nt +c REAL tstart, tstop +c +c +c * OUTPUTS +c +c REAL t, sza, esrm2 +c +c * INTERNAL +c +c INTEGER it +c REAL ut, dt +c +c INTEGER jday, nday +c LOGICAL oky, okm, okd +c +c REAL az, el, soldia, soldst +c +c * switch for refraction correction to solar zenith angle. Because +c * this is only for the observed sza at the surface, do not use. +c +c LOGICAL lrefr +c DATA lrefr /.FALSE./ +c +c *************** +c +c IF(nt .EQ. 1) THEN +c dt = 0. +c ELSE +c dt = (tstop - tstart) / FLOAT(nt - 1) +c ENDIF +c +c DO 10 it = 1, nt +c t(it) = tstart + dt * FLOAT(it - 1) +c +c * solar zenith angle calculation: +c * If lzenit = .TRUE., use selected solar zenith angles, also +c * set Earth-Sun distance to 1 AU. +c +c IF (lzenit) THEN +c sza(it) = t(it) +c esrm2(it) = 1. +c +c * If lzenit = .FALSE., compute solar zenith angle for specified +c * location, date, time of day. Assume no refraction (lrefr = .FALSE.) +c * Also calculate corresponding +c * Earth-Sun correcton factor. +c +c ELSE +c CALL calend(iyear, imonth, iday, +c $ jday, nday, oky, okm, okd) +c IF( oky .AND. okm .AND. okd) THEN +c +c ut = t(it) - tmzone +c CALL sunae(iyear, jday, ut, lat, lon, lrefr, +c & az, el, soldia, soldst ) +c sza(it) = 90. - el +c esrm2(it) = 1./(soldst*soldst) +c ELSE +c WRITE(*,*) '**** incorrect date specification' +c STOP ' in gridt ' +c ENDIF +c ENDIF +c +c 10 CONTINUE +c RETURN +c END + +*=============================================================================* + + SUBROUTINE gridck(k,n,x,ok, kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Check a grid X for various improperties. The values in X have to comply =* +*= with the following rules: =* +*= 1) Number of actual points cannot exceed declared length of X =* +*= 2) Number of actual points has to be greater than or equal to 2 =* +*= 3) X-values must be non-negative =* +*= 4) X-values must be unique =* +*= 5) X-values must be in ascending order =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= K - INTEGER, length of X as declared in the calling program (I)=* +*= N - INTEGER, number of actual points in X (I)=* +*= X - REAL, vector (grid) to be checked (I)=* +*= OK - LOGICAL, .TRUE. -> X agrees with rules 1)-5) (O)=* +*= .FALSE.-> X violates at least one of 1)-5) =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE + +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -6512,6 +6376,8 @@ c INCLUDE 'params' RETURN END + +CCC FILE la_srb.f * This file contains the following subroutines, related to the calculation * of radiation at Lyman-alpha and Schumann-Runge wavelengths: * la_srb @@ -6525,7 +6391,7 @@ c INCLUDE 'params' * chebev *=============================================================================* - SUBROUTINE la_srb(nz,z,tlev,nw,wl,vcol,scol,o2xs1,dto2,o2xs) + SUBROUTINE la_srb(nz,z,tlev,nw,wl,vcol,scol,o2xs1,dto2,o2xs,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -6561,7 +6427,7 @@ c c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -6573,9 +6439,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -6758,7 +6622,7 @@ c c INCLUDE 'params' * and O2 effective (equivalent) cross section *---------------------------------------------------------------------- - CALL lymana(nz,o2col,secchi,dto2la,o2xsla) + CALL lymana(nz,o2col,secchi,dto2la,o2xsla,kout) DO iw = ila, ila + nla - 1 DO iz = 1, nz dto2(iz,iw) = dto2la(iz, iw - ila + 1) @@ -6771,7 +6635,7 @@ c c INCLUDE 'params' * optical depth and O2 equivalent cross section *------------------------------------------------------------------------------ - CALL schum(nz,o2col,tlev,secchi,dto2k,o2xsk) + CALL schum(nz,o2col,tlev,secchi,dto2k,o2xsk,kout) DO iw = isrb, isrb + nsrb - 1 DO iz = 1, nz dto2(iz,iw) = dto2k(iz, iw - isrb + 1) @@ -6784,7 +6648,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE lymana(nz,o2col,secchi,dto2la,o2xsla) + SUBROUTINE lymana(nz,o2col,secchi,dto2la,o2xsla,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -6815,7 +6679,7 @@ c c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -6827,9 +6691,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -6865,6 +6727,9 @@ c c INCLUDE 'params' REAL precis PARAMETER(precis = 1.e-7) + +* input: + INTEGER nz REAL o2col(kz) REAL secchi(kz) @@ -6875,8 +6740,8 @@ c c INCLUDE 'params' * local variables - REAL rm(kz), ro2(kz) - REAL b(3), c(3), d(3), e(3) + DOUBLE PRECISION rm(kz), ro2(kz) + DOUBLE PRECISION b(3), c(3), d(3), e(3) DATA b/ 6.8431D-01, 2.29841D-01, 8.65412D-02/, > c/8.22114D-21, 1.77556D-20, 8.22112D-21/, > d/ 6.0073D-21, 4.28569D-21, 1.28059D-20/, @@ -6896,8 +6761,8 @@ c c INCLUDE 'params' rm(iz) = 0.D+00 ro2(iz) = 0.D+00 DO i = 1, 3 - rm(iz) = rm(iz) + b(i) * EXP(-c(i) * DBLE(o2col(iz))) - ro2(iz) = ro2(iz) + d(i) * EXP(-e(i) * DBLE(o2col(iz))) + rm(iz) = rm(iz) + b(i) * DEXP(-c(i) * DBLE(o2col(iz))) + ro2(iz) = ro2(iz) + d(i) * DEXP(-e(i) * DBLE(o2col(iz))) ENDDO ENDDO @@ -6942,7 +6807,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE schum(nz, o2col, tlev, secchi, dto2, o2xsk) + SUBROUTINE schum(nz, o2col, tlev, secchi, dto2, o2xsk,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -6965,14 +6830,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -6984,9 +6849,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -7023,6 +6886,7 @@ c c INCLUDE 'params' REAL precis PARAMETER(precis = 1.e-7) +*---------- INTEGER nz REAL o2col(kz), o2col1(kz) REAL tlev(kz), secchi(kz) @@ -7177,9 +7041,9 @@ C------------------------------------------------------------- IMPLICIT NONE - REAL NO2, T, X + REAL NO2, T, X REAL XS(17) - REAL A(17), B(17) + REAL A(17), B(17) INTEGER I CALL CALC_PARAMS( X, A, B ) @@ -7212,8 +7076,8 @@ C------------------------------------------------------------- REAL CHEBEV - REAL AC(20,17) - REAL BC(20,17) ! Chebyshev polynomial coeffs + DOUBLE PRECISION AC(20,17) + DOUBLE PRECISION BC(20,17) ! Chebyshev polynomial coeffs REAL WAVE_NUM(17) COMMON /XS_COEFFS/ AC, BC, WAVE_NUM @@ -7241,8 +7105,8 @@ C polynomial coeffs necessary to calculate O2 effective C cross-sections C C------------------------------------------------------------- - REAL AC(20,17) - REAL BC(20,17) ! Chebyshev polynomial coeffs + DOUBLE PRECISION AC(20,17) + DOUBLE PRECISION BC(20,17) ! Chebyshev polynomial coeffs REAL WAVE_NUM(17) COMMON /XS_COEFFS/ AC, BC, WAVE_NUM @@ -7280,9 +7144,7 @@ C locals *=============================================================================* -C ############################## FUNCTION chebev(a,b,c,m,x) -C ############################## C------------------------------------------------------------- C @@ -7293,7 +7155,7 @@ C------------------------------------------------------------- INTEGER M REAL CHEBEV,A,B,X - REAL C(M) + DOUBLE PRECISION C(M) INTEGER J REAL D,DD,SV,Y,Y2 @@ -7319,7 +7181,7 @@ c WRITE(6,*) 'X NOT IN RANGE IN CHEBEV', X *=============================================================================* - SUBROUTINE sjo2(nz,nw,xso2,nj,sq) + SUBROUTINE sjo2(nz,nw,xso2,nj,sq,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -7343,14 +7205,14 @@ c WRITE(6,*) 'X NOT IN RANGE IN CHEBEV', X *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -7362,9 +7224,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -7427,6 +7287,8 @@ c c INCLUDE 'params' RETURN END + +CCC FILE numer.f * This file contains the following subroutines, related to interpolations * of input data, addition of points to arrays, and zeroing of arrays: * inter1 @@ -8064,9 +7926,11 @@ c c INCLUDE 'params' 1 CONTINUE RETURN END + +CCC FILE odo3.f *=============================================================================* - SUBROUTINE odo3(nz,z,nw,wl,o3xs,c, dto3) + SUBROUTINE odo3(nz,z,nw,wl,o3xs,c, dto3,kout) *-----------------------------------------------------------------------------* *= NAME: Optical Depths of O3 @@ -8097,7 +7961,7 @@ c c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -8109,9 +7973,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -8194,10 +8056,12 @@ c c INCLUDE 'params' RETURN END + +CCC FILE odrl.f *=============================================================================* SUBROUTINE odrl(nz,z,nw,wl, c, - $ dtrl) + $ dtrl,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -8218,14 +8082,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -8237,9 +8101,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -8326,110 +8188,109 @@ C srayl(iw) = 3.90e-28/(wmicrn)**xx RETURN END + +CCC FILE orbit.f * This file contains the following subroutines, related to the orbit and * rotation of the Earth: * calend * sunae *=============================================================================* - SUBROUTINE calend(iyear, imonth, iday, - $ jday, nday, oky, okm, okd) - -*-----------------------------------------------------------------------------* -*= calculates julian day corresponding to specified year, month, day =* -*= also checks validity of date =* -*-----------------------------------------------------------------------------* - - IMPLICIT NONE - -* input: - - INTEGER iyear, imonth, iday - -* output: - - INTEGER jday, nday - LOGICAL oky, okm, okd - -* internal - - INTEGER mday, month, imn(12) - DATA imn/31,28,31,30,31,30,31,31,30,31,30,31/ - - oky = .TRUE. - okm = .TRUE. - okd = .TRUE. - - IF(iyear .LT. 1950 .OR. iyear .GT. 2050) THEN - WRITE(*,*) 'Year must be between 1950 and 2050)' - oky = .FALSE. - ENDIF - - IF(imonth .LT. 1 .OR. imonth .GT. 12) THEN - WRITE(*,*) 'Month must be between 1 and 12' - okm = .FALSE. - ENDIF - - IF ( MOD(iyear,4) .EQ. 0) THEN - imn(2) = 29 - ELSE - imn(2) = 28 - ENDIF - - IF (iday. GT. imn(imonth)) THEN - WRITE(*,*) 'Day in date exceeds days in month' - WRITE(*,*) 'month = ', imonth - WRITE(*,*) 'day = ', iday - okd = .FALSE. - ENDIF - - mday = 0 - DO 12, month = 1, imonth-1 - mday = mday + imn(month) - 12 CONTINUE - jday = mday + iday - - nday = 365 - IF(imn(2) .EQ. 29) nday = 366 - - RETURN - END - -c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -c RCS version control information: -c $Header: /home/cvsroot/MNH-VX-Y-Z/src/MNH/ch_f77.fx90,v 1.2.2.1.2.2.2.1.8.2.2.3 2014/06/19 15:18:13 escj Exp $ +c SUBROUTINE calend(iyear, imonth, iday, +c $ jday, nday, oky, okm, okd) +c +c*-----------------------------------------------------------------------------* +c*= calculates julian day corresponding to specified year, month, day =* +c*= also checks validity of date =* +c*-----------------------------------------------------------------------------* +c +c IMPLICIT NONE +c +c* input: +c +c INTEGER iyear, imonth, iday +c +c* output: +c +c INTEGER jday, nday +c LOGICAL oky, okm, okd +c +c* internal +c +c INTEGER mday, month, imn(12) +c DATA imn/31,28,31,30,31,30,31,31,30,31,30,31/ +c +c oky = .TRUE. +c okm = .TRUE. +c okd = .TRUE. +c +c IF(iyear .LT. 1950 .OR. iyear .GT. 2050) THEN +c WRITE(*,*) 'Year must be between 1950 and 2050)' +c oky = .FALSE. +c ENDIF +c +c IF(imonth .LT. 1 .OR. imonth .GT. 12) THEN +c WRITE(*,*) 'Month must be between 1 and 12' +c okm = .FALSE. +c ENDIF +c +c IF ( MOD(iyear,4) .EQ. 0) THEN +c imn(2) = 29 +c ELSE +c imn(2) = 28 +c ENDIF +c +c IF (iday. GT. imn(imonth)) THEN +c WRITE(*,*) 'Day in date exceeds days in month' +c WRITE(*,*) 'month = ', imonth +c WRITE(*,*) 'day = ', iday +c okd = .FALSE. +c ENDIF +c +c mday = 0 +c DO 12, month = 1, imonth-1 +c mday = mday + imn(month) +c 12 CONTINUE +c jday = mday + iday +c +c nday = 365 +c IF(imn(2) .EQ. 29) nday = 366 +c +c RETURN +c END +c c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - SUBROUTINE SUNAE( YEAR, DAY, HOUR, LAT, LONG, lrefr, - & AZ, EL, SOLDIA, SOLDST ) - +c +c SUBROUTINE SUNAE( YEAR, DAY, HOUR, LAT, LONG, lrefr, +c & AZ, EL, SOLDIA, SOLDST ) +c c Calculates the local solar azimuth and elevation angles, and c the distance to and angle subtended by the Sun, at a specific c location and time using approximate formulas in The Astronomical c Almanac. Accuracy of angles is 0.01 deg or better (the angular c width of the Sun is about 0.5 deg, so 0.01 deg is more than c sufficient for most applications). - +c c Unlike many GCM (and other) sun angle routines, this c one gives slightly different sun angles depending on c the year. The difference is usually down in the 4th c significant digit but can slowly creep up to the 3rd c significant digit after several decades to a century. - +c c A refraction correction appropriate for the "US Standard c Atmosphere" is added, so that the returned sun position is c the APPARENT one. The correction is below 0.1 deg for solar c elevations above 9 deg. To remove it, comment out the code c block where variable REFRAC is set, and replace it with c REFRAC = 0.0. - +c c References: - +c c Michalsky, J., 1988: The Astronomical Almanac's algorithm for c approximate solar position (1950-2050), Solar Energy 40, c 227-235 (but the version of this program in the Appendix c contains errors and should not be used) - +c c The Astronomical Almanac, U.S. Gov't Printing Office, Washington, c D.C. (published every year): the formulas used from the 1995 c version are as follows: @@ -8440,31 +8301,31 @@ c p. C24: mean longitude, mean anomaly, ecliptic longitude, c obliquity of ecliptic, right ascension, declination, c Earth-Sun distance, angular diameter of Sun c p. L2: Greenwich mean sidereal time (ignoring T^2, T^3 terms) - - +c +c c Authors: Dr. Joe Michalsky (joe@asrc.albany.edu) c Dr. Lee Harrison (lee@asrc.albany.edu) c Atmospheric Sciences Research Center c State University of New York c Albany, New York - +c c Modified by: Dr. Warren Wiscombe (wiscombe@climate.gsfc.nasa.gov) c NASA Goddard Space Flight Center c Code 913 c Greenbelt, MD 20771 - - +c +c c WARNING: Do not use this routine outside the year range c 1950-2050. The approximations become increasingly c worse, and the calculation of Julian date becomes c more involved. - +c c Input: - +c c YEAR year (INTEGER; range 1950 to 2050) - +c c DAY day of year at LAT-LONG location (INTEGER; range 1-366) - +c c HOUR hour of DAY [GMT or UT] (REAL; range -13.0 to 36.0) c = (local hour) + (time zone number) c + (Daylight Savings Time correction; -1 or 0) @@ -8475,56 +8336,56 @@ c (summer half of year), 0 otherwise; c Example: 8:30 am Eastern Daylight Time would be c c HOUR = 8.5 + 5 - 1 = 12.5 - +c c LAT latitude [degrees] c (REAL; range -90.0 to 90.0; north is positive) - +c c LONG longitude [degrees] c (REAL; range -180.0 to 180.0; east is positive) - - +c +c c Output: - +c c AZ solar azimuth angle (measured east from north, c 0 to 360 degs) - +c c EL solar elevation angle [-90 to 90 degs]; c solar zenith angle = 90 - EL - +c c SOLDIA solar diameter [degs] - +c c SOLDST distance to sun [Astronomical Units, AU] c (1 AU = mean Earth-sun distance = 1.49597871E+11 m c in IAU 1976 System of Astronomical Constants) - - +c +c c Local Variables: - +c c DEC Declination (radians) - +c c ECLONG Ecliptic longitude (radians) - +c c GMST Greenwich mean sidereal time (hours) - +c c HA Hour angle (radians, -pi to pi) - +c c JD Modified Julian date (number of days, including c fractions thereof, from Julian year J2000.0); c actual Julian date is JD + 2451545.0 - +c c LMST Local mean sidereal time (radians) - +c c MNANOM Mean anomaly (radians, normalized to 0 to 2*pi) - +c c MNLONG Mean longitude of Sun, corrected for aberration c (deg; normalized to 0-360) - +c c OBLQEC Obliquity of the ecliptic (radians) - +c c RA Right ascension (radians) - +c c REFRAC Refraction correction for US Standard Atmosphere (degs) - +c c -------------------------------------------------------------------- c Uses double precision for safety and because Julian dates can c have a large number of digits in their full form (but in practice @@ -8532,7 +8393,7 @@ c this version seems to work fine in single precision if you only c need about 3 significant digits and aren't doing precise climate c change or solar tracking work). c -------------------------------------------------------------------- - +c c Why does this routine require time input as Greenwich Mean Time c (GMT; also called Universal Time, UT) rather than "local time"? c Because "local time" (e.g. Eastern Standard Time) can be off by @@ -8546,9 +8407,9 @@ c Thus it is far simpler to calculate local mean solar time from GMT, c by adding 4 min for each degree of longitude the location is c east of the Greenwich meridian or subtracting 4 min for each degree c west of it. - +c c -------------------------------------------------------------------- - +c c TIME c c The measurement of time has become a complicated topic. A few @@ -8559,7 +8420,7 @@ c Julian calendar; in it, every year divisible by four is a leap c year just as in the Julian calendar except for centurial years c which must be exactly divisible by 400 to be leap years. Thus c 2000 is a leap year, but not 1900 or 2100. - +c c (2) The Julian day begins at Greenwich noon whereas the calendar c day begins at the preceding midnight; and Julian years begin on c "Jan 0" which is really Greenwich noon on Dec 31. True Julian @@ -8567,236 +8428,217 @@ c dates are a continous count of day numbers beginning with JD 0 on c 1 Jan 4713 B.C. The term "Julian date" is widely misused and few c people understand it; it is best avoided unless you want to study c the Astronomical Almanac and learn to use it correctly. - +c c (3) Universal Time (UT), the basis of civil timekeeping, is c defined by a formula relating UT to GMST (Greenwich mean sidereal c time). UTC (Coordinated Universal Time) is the time scale c distributed by most broadcast time services. UT, UTC, and other c related time measures are within a few sec of each other and are c frequently used interchangeably. - +c c (4) Beginning in 1984, the "standard epoch" of the astronomical c coordinate system is Jan 1, 2000, 12 hr TDB (Julian date c 2,451,545.0, denoted J2000.0). The fact that this routine uses c 1949 as a point of reference is merely for numerical convenience. c -------------------------------------------------------------------- - +c c .. Scalar Arguments .. - - LOGICAL lrefr - - - INTEGER YEAR, DAY - REAL AZ, EL, HOUR, LAT, LONG, SOLDIA, SOLDST +c +c LOGICAL lrefr +c +c +c INTEGER YEAR, DAY +c REAL AZ, EL, HOUR, LAT, LONG, SOLDIA, SOLDST c .. c .. Local Scalars .. - - LOGICAL PASS1 - INTEGER DELTA, LEAP - REAL DEC, DEN, ECLONG, GMST, HA, JD, LMST, - & MNANOM, MNLONG, NUM, OBLQEC, PI, RA, - & RPD, REFRAC, TIME, TWOPI +c +c LOGICAL PASS1 +c INTEGER DELTA, LEAP +c REAL DEC, DEN, ECLONG, GMST, HA, JD, LMST, +c & MNANOM, MNLONG, NUM, OBLQEC, PI, RA, +c & RPD, REFRAC, TIME, TWOPI c .. c .. Intrinsic Functions .. - - INTRINSIC AINT, ASIN, ATAN, COS, MOD, SIN, TAN +c +c INTRINSIC AINT, ASIN, ATAN, COS, MOD, SIN, TAN c .. c .. Data statements .. - - SAVE PASS1, PI, TWOPI, RPD - DATA PASS1 /.True./ +c +c SAVE PASS1, PI, TWOPI, RPD +c DATA PASS1 /.True./ c .. - - IF( YEAR.LT.1950 .OR. YEAR.GT.2050 ) - & STOP 'SUNAE--bad input variable YEAR' - IF( DAY.LT.1 .OR. DAY.GT.366 ) - & STOP 'SUNAE--bad input variable DAY' - IF( HOUR.LT.-13.0 .OR. HOUR.GT.36.0 ) - & STOP 'SUNAE--bad input variable HOUR' - IF( LAT.LT.-90.0 .OR. LAT.GT.90.0 ) - & STOP 'SUNAE--bad input variable LAT' - IF( LONG.LT.-180.0 .OR. LONG.GT.180.0 ) - & STOP 'SUNAE--bad input variable LONG' - - IF(PASS1) THEN - PI = 2.*ASIN( 1.0 ) - TWOPI = 2.*PI - RPD = PI / 180. - PASS1 = .False. - ENDIF - +c +c IF( YEAR.LT.1950 .OR. YEAR.GT.2050 ) +c & STOP 'SUNAE--bad input variable YEAR' +c IF( DAY.LT.1 .OR. DAY.GT.366 ) +c & STOP 'SUNAE--bad input variable DAY' +c IF( HOUR.LT.-13.0 .OR. HOUR.GT.36.0 ) +c & STOP 'SUNAE--bad input variable HOUR' +c IF( LAT.LT.-90.0 .OR. LAT.GT.90.0 ) +c & STOP 'SUNAE--bad input variable LAT' +c IF( LONG.LT.-180.0 .OR. LONG.GT.180.0 ) +c & STOP 'SUNAE--bad input variable LONG' +c +c IF(PASS1) THEN +c PI = 2.*ASIN( 1.0 ) +c TWOPI = 2.*PI +c RPD = PI / 180. +c PASS1 = .False. +c ENDIF +c c ** current Julian date (actually add 2,400,000 c ** for true JD); LEAP = leap days since 1949; c ** 32916.5 is midnite 0 jan 1949 minus 2.4e6 - - DELTA = YEAR - 1949 - LEAP = DELTA / 4 - JD = 32916.5 + (DELTA*365 + LEAP + DAY) + HOUR / 24. - +c +c DELTA = YEAR - 1949 +c LEAP = DELTA / 4 +c JD = 32916.5 + (DELTA*365 + LEAP + DAY) + HOUR / 24. +c c ** last yr of century not leap yr unless divisible c ** by 400 (not executed for the allowed YEAR range, c ** but left in so our successors can adapt this for c ** the following 100 years) - - IF( MOD( YEAR, 100 ).EQ.0 .AND. - & MOD( YEAR, 400 ).NE.0 ) JD = JD - 1. - +c +c IF( MOD( YEAR, 100 ).EQ.0 .AND. +c & MOD( YEAR, 400 ).NE.0 ) JD = JD - 1. +c c ** ecliptic coordinates c ** 51545.0 + 2.4e6 = noon 1 jan 2000 - - TIME = JD - 51545.0 - +c +c TIME = JD - 51545.0 +c c ** force mean longitude between 0 and 360 degs - - MNLONG = 280.460 + 0.9856474*TIME -#if (MNH_REAL == 8) - MNLONG = MOD( MNLONG, 360.E0 ) -#else - MNLONG = MOD( MNLONG, 360.D0 ) -#endif - IF( MNLONG.LT.0. ) MNLONG = MNLONG + 360. - +c +c MNLONG = 280.460 + 0.9856474*TIME +c MNLONG = MOD( MNLONG, 360.D0 ) +c IF( MNLONG.LT.0. ) MNLONG = MNLONG + 360. +c c ** mean anomaly in radians between 0 and 2*pi - - MNANOM = 357.528 + 0.9856003*TIME -#if (MNH_REAL == 8) - MNANOM = MOD( MNANOM, 360.E0 ) -#else - MNANOM = MOD( MNANOM, 360.D0 ) -#endif - IF( MNANOM.LT.0.) MNANOM = MNANOM + 360. - - MNANOM = MNANOM*RPD - +c +c MNANOM = 357.528 + 0.9856003*TIME +c MNANOM = MOD( MNANOM, 360.D0 ) +c IF( MNANOM.LT.0.) MNANOM = MNANOM + 360. +c +c MNANOM = MNANOM*RPD +c c ** ecliptic longitude and obliquity c ** of ecliptic in radians - - ECLONG = MNLONG + 1.915*SIN( MNANOM ) + 0.020*SIN( 2.*MNANOM ) -#if (MNH_REAL == 8) - ECLONG = MOD( ECLONG, 360.E0 ) -#else - ECLONG = MOD( ECLONG, 360.D0 ) -#endif - IF( ECLONG.LT.0. ) ECLONG = ECLONG + 360. - - OBLQEC = 23.439 - 0.0000004*TIME - ECLONG = ECLONG*RPD - OBLQEC = OBLQEC*RPD - +c +c ECLONG = MNLONG + 1.915*SIN( MNANOM ) + 0.020*SIN( 2.*MNANOM ) +c ECLONG = MOD( ECLONG, 360.D0 ) +c IF( ECLONG.LT.0. ) ECLONG = ECLONG + 360. +c +c OBLQEC = 23.439 - 0.0000004*TIME +c ECLONG = ECLONG*RPD +c OBLQEC = OBLQEC*RPD +c c ** right ascension - - NUM = COS( OBLQEC )*SIN( ECLONG ) - DEN = COS( ECLONG ) - RA = ATAN( NUM / DEN ) - +c +c NUM = COS( OBLQEC )*SIN( ECLONG ) +c DEN = COS( ECLONG ) +c RA = ATAN( NUM / DEN ) +c c ** Force right ascension between 0 and 2*pi - - IF( DEN.LT.0.0 ) THEN - RA = RA + PI - ELSE IF( NUM.LT.0.0 ) THEN - RA = RA + TWOPI - END IF - +c +c IF( DEN.LT.0.0 ) THEN +c RA = RA + PI +c ELSE IF( NUM.LT.0.0 ) THEN +c RA = RA + TWOPI +c END IF +c c ** declination - - DEC = ASIN( SIN( OBLQEC )*SIN( ECLONG ) ) - +c +c DEC = ASIN( SIN( OBLQEC )*SIN( ECLONG ) ) +c c ** Greenwich mean sidereal time in hours - - GMST = 6.697375 + 0.0657098242*TIME + HOUR - +c +c GMST = 6.697375 + 0.0657098242*TIME + HOUR +c c ** Hour not changed to sidereal time since c ** 'time' includes the fractional day - -#if (MNH_REAL == 8) - GMST = MOD( GMST, 24.E0) -#else - GMST = MOD( GMST, 24.D0) -#endif - IF( GMST.LT.0. ) GMST = GMST + 24. - +c +c GMST = MOD( GMST, 24.D0) +c IF( GMST.LT.0. ) GMST = GMST + 24. +c c ** local mean sidereal time in radians - - LMST = GMST + LONG / 15. -#if (MNH_REAL == 8) - LMST = MOD( LMST, 24.E0 ) -#else - LMST = MOD( LMST, 24.D0 ) -#endif - IF( LMST.LT.0. ) LMST = LMST + 24. - - LMST = LMST*15.*RPD - +c +c LMST = GMST + LONG / 15. +c LMST = MOD( LMST, 24.D0 ) +c IF( LMST.LT.0. ) LMST = LMST + 24. +c +c LMST = LMST*15.*RPD +c c ** hour angle in radians between -pi and pi - - HA = LMST - RA - - IF( HA.LT.- PI ) HA = HA + TWOPI - IF( HA.GT.PI ) HA = HA - TWOPI - +c +c HA = LMST - RA +c +c IF( HA.LT.- PI ) HA = HA + TWOPI +c IF( HA.GT.PI ) HA = HA - TWOPI +c c ** solar azimuth and elevation - - EL = ASIN( SIN( DEC )*SIN( LAT*RPD ) + - & COS( DEC )*COS( LAT*RPD )*COS( HA ) ) - - AZ = ASIN( - COS( DEC )*SIN( HA ) / COS( EL ) ) - +c +c EL = ASIN( SIN( DEC )*SIN( LAT*RPD ) + +c & COS( DEC )*COS( LAT*RPD )*COS( HA ) ) +c +c AZ = ASIN( - COS( DEC )*SIN( HA ) / COS( EL ) ) +c c ** Put azimuth between 0 and 2*pi radians - - IF( SIN( DEC ) - SIN( EL )*SIN( LAT*RPD ).GE.0. ) THEN - - IF( SIN(AZ).LT.0.) AZ = AZ + TWOPI - - ELSE - - AZ = PI - AZ - - END IF - +c +c IF( SIN( DEC ) - SIN( EL )*SIN( LAT*RPD ).GE.0. ) THEN +c +c IF( SIN(AZ).LT.0.) AZ = AZ + TWOPI +c +c ELSE +c +c AZ = PI - AZ +c +c END IF +c c ** Convert elevation and azimuth to degrees - EL = EL / RPD - AZ = AZ / RPD - +c EL = EL / RPD +c AZ = AZ / RPD +c c ======== Refraction correction for U.S. Standard Atmos. ========== c (assumes elevation in degs) (3.51823=1013.25 mb/288 K) - - IF( EL.GE.19.225 ) THEN - - REFRAC = 0.00452*3.51823 / TAN( EL*RPD ) - - ELSE IF( EL.GT.-0.766 .AND. EL.LT.19.225 ) THEN - - REFRAC = 3.51823 * ( 0.1594 + EL*(0.0196 + 0.00002*EL) ) / - & ( 1. + EL*(0.505 + 0.0845*EL) ) - - ELSE IF( EL.LE.-0.766 ) THEN - - REFRAC = 0.0 - - END IF - -* sm: switch off refraction: - - IF(lrefr) THEN - EL = EL + REFRAC - ENDIF - -c =================================================================== - +c +c IF( EL.GE.19.225 ) THEN +c +c REFRAC = 0.00452*3.51823 / TAN( EL*RPD ) +c +c ELSE IF( EL.GT.-0.766 .AND. EL.LT.19.225 ) THEN +c +c REFRAC = 3.51823 * ( 0.1594 + EL*(0.0196 + 0.00002*EL) ) / +c & ( 1. + EL*(0.505 + 0.0845*EL) ) +c +c ELSE IF( EL.LE.-0.766 ) THEN +c +c REFRAC = 0.0 +c +c END IF +c +c* sm: switch off refraction: +c +c IF(lrefr) THEN +c EL = EL + REFRAC +c ENDIF +c +cc =================================================================== +c c ** distance to sun in A.U. & diameter in degs - - SOLDST = 1.00014 - 0.01671*COS(MNANOM) - 0.00014*COS( 2.*MNANOM ) - SOLDIA = 0.5332 / SOLDST - - IF( EL.LT.-90.0 .OR. EL.GT.90.0 ) - & STOP 'SUNAE--output argument EL out of range' - IF( AZ.LT.0.0 .OR. AZ.GT.360.0 ) - & STOP 'SUNAE--output argument AZ out of range' - - RETURN - - END - +c +c SOLDST = 1.00014 - 0.01671*COS(MNANOM) - 0.00014*COS( 2.*MNANOM ) +c SOLDIA = 0.5332 / SOLDST +c +c IF( EL.LT.-90.0 .OR. EL.GT.90.0 ) +c & STOP 'SUNAE--output argument EL out of range' +c IF( AZ.LT.0.0 .OR. AZ.GT.360.0 ) +c & STOP 'SUNAE--output argument AZ out of range' +c +c RETURN +c +c END +c +CCC FILE qys.f * This file contains subroutines used for calculation of quantum yields for * various photoreactions: * qyacet - q.y. for acetone, based on Blitz et al. (2004) @@ -8827,6 +8669,8 @@ c ** distance to sun in A.U. & diameter in degs REAL c3 REAL cA0, cA1, cA2, cA3, cA4 + real dumexp + * output * fco = quantum yield for product CO * fac = quantum yield for product CH3CO (acetyl radical) @@ -8853,9 +8697,16 @@ c ** distance to sun in A.U. & diameter in degs a0 = 0.350 * (T/295.)**(-1.28) b0 = 0.068 * (T/295.)**(-2.65) - cA0 = exp(b0*(w - 248.)) * a0 / (1. - a0) +**SM: prevent exponent overflow in rare cases: - fco = 1. / (1 + cA0) + dumexp = b0*(w - 248.) + if (dumexp .gt. 80.) then + cA0 = 5.e34 + else + cA0 = exp(dumexp) * a0 / (1. - a0) + endif + + fco = 1. / (1. + cA0) *** CH3CO (acetyl radical) quantum yields: @@ -8953,9 +8804,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -9331,7 +9180,7 @@ c c INCLUDE 'params' ELSEIF (msun .EQ. 10) THEN WRITE(kout,*) 'DATAE1/SUN/susim_hi.flx' - CALL read1(nw,wl,yg1) + CALL read1(nw,wl,yg1,kout) DO iw = 1, nw-1 f(iw) = yg1(iw) ENDDO @@ -9339,14 +9188,14 @@ c c INCLUDE 'params' ELSEIF (msun .EQ. 11) THEN WRITE(kout,*) 'DATAE1/SUN/wmo85.flx' - CALL read2(nw,wl,yg1) + CALL read2(nw,wl,yg1,kout) DO iw = 1, nw-1 f(iw) = yg1(iw) ENDDO ELSEIF (msun .EQ. 12) THEN WRITE(kout,*) 'DATAE1/SUN/susim_hi.flx' - CALL read1(nw,wl,yg1) + CALL read1(nw,wl,yg1,kout) fil = 'DATAE1/SUN/neckel.flx' write(kout,*) fil OPEN(UNIT=kin,FILE=fil,STATUS='old') @@ -9383,7 +9232,7 @@ c c INCLUDE 'params' ELSEIF (msun .EQ. 13) THEN WRITE(kout,*) 'DATAE1/SUN/susim_hi.flx' - CALL read1(nw,wl,yg1) + CALL read1(nw,wl,yg1,kout) nhead = 5 fil = 'DATAE1/SUN/atlas3_1994_317_a.dat' @@ -9443,7 +9292,7 @@ c c INCLUDE 'params' ELSEIF (msun .EQ. 14) THEN WRITE(kout,*) 'DATAE1/SUN/susim_hi.flx' - CALL read1(nw,wl,yg1) + CALL read1(nw,wl,yg1,kout) fil = 'DATAE1/SUN/neckel.flx' write(kout,*) fil @@ -9478,7 +9327,7 @@ c c INCLUDE 'params' ELSEIF (msun .EQ. 15) THEN WRITE(kout,*) 'DATAE1/SUN/susim_hi.flx' - CALL read1(nw,wl,yg1) + CALL read1(nw,wl,yg1,kout) nhead = 5 fil = 'DATAE1/SUN/atlas3_1994_317_a.dat' @@ -9573,7 +9422,7 @@ c y1(i) = y1(i) * 1.E4 * hc / (x1(i) * 1.E-9) *=============================================================================* - SUBROUTINE read1(nw,wl,f) + SUBROUTINE read1(nw,wl,f,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -9597,7 +9446,7 @@ c c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -9609,9 +9458,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -9719,7 +9566,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE read2(nw,wl,f) + SUBROUTINE read2(nw,wl,f,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -9743,7 +9590,7 @@ c c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -9755,9 +9602,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -9859,6 +9704,8 @@ C inter3 is used for interpolation RETURN END + +CCC FILE rdxs.f * This file contains subroutines related to reading the * absorption cross sections of gases that contribute to atmospheric transmission: * Some of these subroutines are also called from rxn.f when loading photolysis cross sections @@ -9884,7 +9731,7 @@ C inter3 is used for interpolation * rdso2xs *=============================================================================* - SUBROUTINE rdo3xs(mabs, nz,t,nw,wl, xs) + SUBROUTINE rdo3xs(mabs, nz,t,nw,wl, xs, kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -9905,14 +9752,14 @@ C inter3 is used for interpolation *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -9924,9 +9771,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -10010,15 +9855,17 @@ c c INCLUDE 'params' * mol = Molina and Molina * bas = Bass et al. - CALL o3_rei(nw,wl, rei218,rei228,rei243,rei295, v195,v345,v830) + CALL o3_rei(nw,wl, rei218,rei228,rei243,rei295, + $ v195,v345,v830,kout) - CALL o3_jpl(nw,wl, jpl218,jpl295, v186,v825) + CALL o3_jpl(nw,wl, jpl218,jpl295, v186,v825,kout) - CALL o3_wmo(nw,wl, wmo203,wmo273, v176,v850) + CALL o3_wmo(nw,wl, wmo203,wmo273, v176,v850,kout) - CALL o3_mol(nw,wl, mol226,mol263,mol298, v185,v240,v350) + CALL o3_mol(nw,wl, mol226,mol263,mol298, v185,v240, + $ v350,kout) - CALL o3_bas(nw,wl, c0,c1,c2, vb245,vb342) + CALL o3_bas(nw,wl, c0,c1,c2, vb245,vb342,kout) ****** option 1: @@ -10134,7 +9981,7 @@ c c INCLUDE 'params' *=============================================================================* SUBROUTINE o3_rei(nw,wl, - $ rei218,rei228,rei243,rei295, v195,v345,v830) + $ rei218,rei228,rei243,rei295, v195,v345,v830,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -10156,14 +10003,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -10175,9 +10022,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -10342,7 +10187,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE o3_wmo(nw,wl, wmo203,wmo273, v176,v850) + SUBROUTINE o3_wmo(nw,wl, wmo203,wmo273, v176,v850,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -10369,7 +10214,7 @@ c c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -10381,9 +10226,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -10508,7 +10351,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE o3_jpl(nw,wl, jpl218,jpl295, v186,v825) + SUBROUTINE o3_jpl(nw,wl, jpl218,jpl295, v186,v825,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -10527,14 +10370,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -10546,9 +10389,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -10670,7 +10511,8 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE o3_mol(nw,wl, mol226,mol263,mol298, v185,v240,v350) + SUBROUTINE o3_mol(nw,wl, mol226,mol263,mol298, + & v185,v240,v350,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -10691,14 +10533,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -10710,9 +10552,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -10866,7 +10706,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE o3_bas(nw,wl, c0,c1,c2, vb245,vb342) + SUBROUTINE o3_bas(nw,wl, c0,c1,c2, vb245,vb342,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -10886,14 +10726,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -10905,9 +10745,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11041,7 +10879,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE rdo2xs(nw,wl,o2xs1) + SUBROUTINE rdo2xs(nw,wl,o2xs1,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -11059,14 +10897,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11078,9 +10916,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11194,7 +11030,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE rdno2xs(nz,tlay,nw,wl,no2xs) + SUBROUTINE rdno2xs(nz,tlay,nw,wl,no2xs,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -11211,14 +11047,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11230,9 +11066,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11294,11 +11128,11 @@ c c INCLUDE 'params' mabs = 4 - IF (mabs. EQ. 1) CALL no2xs_d(nz,tlay,nw,wl, no2xs) - IF (mabs .EQ. 2) CALL no2xs_jpl94(nz,tlay,nw,wl, no2xs) - IF (mabs .EQ. 3) CALL no2xs_har(nz,tlay,nw,wl, no2xs) - IF (mabs .EQ. 4) CALL no2xs_jpl06a(nz,tlay,nw,wl, no2xs) - IF (mabs .EQ. 5) CALL no2xs_jpl06b(nz,tlay,nw,wl, no2xs) + IF (mabs. EQ. 1) CALL no2xs_d(nz,tlay,nw,wl, no2xs,kout) + IF (mabs .EQ. 2) CALL no2xs_jpl94(nz,tlay,nw,wl, no2xs,kout) + IF (mabs .EQ. 3) CALL no2xs_har(nz,tlay,nw,wl, no2xs,kout) + IF (mabs .EQ. 4) CALL no2xs_jpl06a(nz,tlay,nw,wl, no2xs,kout) + IF (mabs .EQ. 5) CALL no2xs_jpl06b(nz,tlay,nw,wl, no2xs,kout) *_______________________________________________________________________ @@ -11307,17 +11141,17 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE no2xs_d(nz,t,nw,wl, no2xs) + SUBROUTINE no2xs_d(nz,t,nw,wl, no2xs,kout) IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11329,9 +11163,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11437,17 +11269,17 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE no2xs_jpl94(nz,t,nw,wl, no2xs) + SUBROUTINE no2xs_jpl94(nz,t,nw,wl, no2xs,kout) IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11459,9 +11291,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11570,17 +11400,17 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE no2xs_har(nz,t,nw,wl, no2xs) + SUBROUTINE no2xs_har(nz,t,nw,wl, no2xs,kout) IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11592,9 +11422,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11682,19 +11510,19 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE no2xs_jpl06a(nz,t,nw,wl, no2xs) + SUBROUTINE no2xs_jpl06a(nz,t,nw,wl, no2xs,kout) * read and interpolate NO2 xs from JPL2006 IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11706,9 +11534,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11808,19 +11634,19 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE no2xs_jpl06b(nz,t,nw,wl, no2xs) + SUBROUTINE no2xs_jpl06b(nz,t,nw,wl, no2xs,kout) * read and interpolate NO2 xs from Harder et al. IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11832,9 +11658,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -11886,7 +11710,7 @@ c c INCLUDE 'params' * local INTEGER kdata - PARAMETER (kdata=80) + PARAMETER (kdata=100) INTEGER i, n, n1, n2, ierr REAL x1(kdata), x2(kdata), y1(kdata), y2(kdata) REAL x3(kdata), y3(kdata) @@ -11897,7 +11721,7 @@ c c INCLUDE 'params' DO i = 1, 3 READ(kin,*) ENDDO - n = 73 + n = 81 do i = 1, n read(kin,*) x1(i), x3(i), y1(i), y2(i) y1(i) = (x3(i)-x1(i)) * y1(i)*1.E-20 @@ -11934,7 +11758,7 @@ c c INCLUDE 'params' *=============================================================================* - SUBROUTINE rdso2xs(nw,wl,so2xs) + SUBROUTINE rdso2xs(nw,wl,so2xs,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -11970,14 +11794,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -11989,9 +11813,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -12088,6 +11910,7 @@ c n = 681 *=============================================================================* +CCC FILE rtrans.f * This file contains the following subroutines, related to the solution of * the equation of radiative transfer in multiple homogeneous layers. * rtlink @@ -12147,18 +11970,19 @@ c n = 681 $ dtcld, omcld, gcld, $ dtaer, omaer, gaer, $ dtsnw, omsnw, gsnw, - $ edir, edn, eup, fdir, fdn, fup) + $ edir, edn, eup, fdir, fdn, fup, + $ kout) IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -12170,9 +11994,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -12360,7 +12182,8 @@ c c INCLUDE 'params' CALL ps2str(nz,zen,ag,dt,om,g, $ dsdh, nid, delta, - $ fdiri, fupi, fdni, ediri, eupi, edni) + $ fdiri, fupi, fdni, ediri, eupi, edni, + $ kout) ELSE @@ -12371,7 +12194,8 @@ c c INCLUDE 'params' $ MAXCLY, MAXULV, MAXUMU, MAXCMU, MAXPHI, $ RFLDIR,RFLDN, FLUP, U0U, $ uavgso, uavgup, uavgdn, - $ sindir, sinup, sindn) + $ sindir, sinup, sindn, + $ kout) ENDIF @@ -12433,7 +12257,8 @@ c WRITE (*,*) edn(1),' = ',irrad,' ?' SUBROUTINE ps2str(nlevel,zen,rsfc,tauu,omu,gu, $ dsdh, nid, delta, - $ fdr, fup, fdn, edr, eup, edn) + $ fdr, fup, fdn, edr, eup, edn, + $ kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -12474,14 +12299,14 @@ c WRITE (*,*) edn(1),' = ',irrad,' ?' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -12493,9 +12318,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -12568,7 +12391,7 @@ c c INCLUDE 'params' ******* * other: ******* - REAL pifs, fdn0 + REAL pifs, fdn0, surfem REAL gi(kz), omi(kz), tempg REAL f, g, om REAL gam1, gam2, gam3, gam4 @@ -12609,9 +12432,12 @@ C > BETA1, BETAn, amu1, subd pifs = 1. fdn0 = 0. - nlayer = nlevel - 1 +* emission at surface (for night light pollution, set pifs = 0, surfem = 1.) + + surfem = 0. - mu = COS(zen*pi/180.) + nlayer = nlevel - 1 + mu = COS(zen*pi/180.) ************** compute coefficients for each layer: * GAM1 - GAM4 = 2-stream coefficients, different for different approximations @@ -12862,7 +12688,7 @@ c mu1(i) = 0.5 ***************** set up matrix ****** * ssfc = pg 16,292 equation 37 where pi Fs is one (unity). - ssfc = rsfc*mu*EXP(-tausla(nlayer))*pifs + ssfc = rsfc*mu*EXP(-tausla(nlayer))*pifs + surfem * MROWS = the number of rows in the matrix @@ -12915,7 +12741,7 @@ c mu1(i) = 0.5 * solve tri-diagonal matrix: - CALL tridag(a, b, d, e, y, mrows) + CALL tridag(a, b, d, e, y, mrows,kout) **** unfold solution of matrix, compute output fluxes: @@ -12925,7 +12751,7 @@ c mu1(i) = 0.5 * the following equations are from pg 16,291 equations 31 & 32 - fdr(lev) = EXP( -tausla(0) ) + fdr(lev) = pifs * EXP( -tausla(0) ) edr(lev) = mu * fdr(lev) edn(lev) = fdn0 eup(lev) = y(row)*e3(j) - y(row + 1)*e4(j) + cup(j) @@ -12933,7 +12759,7 @@ c mu1(i) = 0.5 fup(lev) = eup(lev)/mu1(lev) DO 60, lev = 2, nlayer + 1 - fdr(lev) = EXP(-tausla(lev-1)) + fdr(lev) = pifs * EXP(-tausla(lev-1)) edr(lev) = mu *fdr(lev) edn(lev) = y(row)*e3(j) + y(row + 1)*e4(j) + cdntn(j) eup(lev) = y(row)*e1(j) + y(row + 1)*e2(j) + cuptn(j) @@ -12950,7 +12776,7 @@ c mu1(i) = 0.5 *=============================================================================* - SUBROUTINE tridag(a,b,c,r,u,n) + SUBROUTINE tridag(a,b,c,r,u,n,kout) *_______________________________________________________________________ * solves tridiagonal system. From Numerical Recipies, p. 40 @@ -12970,14 +12796,14 @@ c mu1(i) = 0.5 * local: INTEGER j -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -12989,9 +12815,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -13063,7 +12887,8 @@ C SUBROUTINE DISORT( dsdh, nid, & MAXCLY, MAXULV, MAXUMU, MAXCMU, MAXPHI, $ RFLDIR, RFLDN, FLUP, U0U, & uavgso, uavgup, uavgdn, - & sindir, sinup, sindn ) + & sindir, sinup, sindn, + & kout ) c Improved handling of numerical instabilities. Bernhard Mayer on 5/3/99. c disort seems to produce unstable results for certain combinations @@ -13369,14 +13194,14 @@ c MXPHI = Max no. of output azimuthal angles c +-------------------------------------------------------------------+ -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -13388,9 +13213,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -13608,7 +13431,7 @@ c ** Perform various setup operations & GL, HL, HLPR, IBCND, LAMBER, LAYRU, LYRCUT, MAXUMU, & MAXCMU, MXCMU, NCUT, NLYR, NTAU, NN, NSTR, PLANK, & NUMU, ONLYFL, OPRIM, PMOM, SSALB, TAUC, TAUCPR, UTAU, - & UTAUPR, UMU, UMU0, USRTAU, USRANG ) + & UTAUPR, UMU, UMU0, USRTAU, USRANG, kout ) c ** Print input information IF ( PRNT(1) ) @@ -15670,12 +15493,12 @@ c .. Local Scalars .. INTEGER ITER, K, LIM, MAXIT, NN, NP1 REAL CONA, PI, T - REAL EN, NNP1, ONE, P, P2PRI, PM1, PM2, PPR, PROD, + DOUBLE PRECISION EN, NNP1, ONE, P, P2PRI, PM1, PM2, PPR, PROD, & TMP, TOL, TWO, X, XI c .. c .. External Functions .. - REAL D1MACH + DOUBLE PRECISION D1MACH EXTERNAL D1MACH c .. c .. External Subroutines .. @@ -15789,7 +15612,7 @@ c ** Convert from (-1,1) to (0,1) & LYRCUT, MAXUMU, MAXCMU, MXCMU, NCUT, NLYR, & NTAU, NN, NSTR, PLANK, NUMU, ONLYFL, OPRIM, & PMOM, SSALB, TAUC, TAUCPR, UTAU, UTAUPR, UMU, - & UMU0, USRTAU, USRANG ) + & UMU0, USRTAU, USRANG, kout ) c Perform miscellaneous setting-up operations @@ -15819,14 +15642,14 @@ c Called by- DISORT c Calls- QGAUSN, ERRMSG c ---------------------------------------------------------------------- -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -15838,9 +15661,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -16436,7 +16257,7 @@ c .. Array Arguments .. & CC( MXCMU, MXCMU ), CMU( MXCMU ), CWT( MXCMU ), & EVAL( MI ), EVECC( MXCMU, MXCMU ), GC( MXCMU, MXCMU ), & GL( 0:MXCMU ), KK( MXCMU ), YLMC( 0:MXCMU, MXCMU ) - REAL AAD( MI, MI ), EVALD( MI ), EVECCD( MI, MI ), + DOUBLE PRECISION AAD( MI, MI ), EVALD( MI ), EVECCD( MI, MI ), & WKD( MXCMU ) c .. c .. Local Scalars .. @@ -17177,7 +16998,7 @@ c .. Array Arguments .. & YLM0( 0:MXCMU ), YLMC( 0:MXCMU, MXCMU ), & WK( MXCMU ), ZJ( MXCMU ), ZZ( MXCMU ) - REAL AAD( MI, MI ), EVALD( MI ), EVECCD( MI, MI ), + DOUBLE PRECISION AAD( MI, MI ), EVALD( MI ), EVECCD( MI, MI ), & WKD( MXCMU ) *bm Variables for instability fix @@ -18169,7 +17990,7 @@ C ROUTINES CALLED: FROM LINPACK: SGBFA C FROM BLAS: SAXPY, SDOT, SSCAL, SASUM C FROM FORTRAN: ABS, AMAX1, MAX0, MIN0, SIGN - EXTERNAL SAXPY, SDOT, SASUM, SSCAL + EXTERNAL SGBFA, SAXPY, SDOT, SASUM, SSCAL INTEGER LDA, N, ML, MU, IPVT(*) REAL ABD(LDA,*), Z(*) @@ -18480,6 +18301,7 @@ C 10 CONTINUE C ROUTINES CALLED: FROM BLAS: SAXPY, SDOT C FROM FORTRAN: MIN0 + EXTERNAL SAXPY, SDOT INTEGER LDA, N, ML, MU, IPVT(*), JOB @@ -18600,7 +18422,8 @@ C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) . C ROUTINES CALLED: FROM LINPACK: SGEFA C FROM BLAS: SAXPY, SDOT, SSCAL, SASUM C FROM FORTRAN: ABS, AMAX1, SIGN - EXTERNAL SAXPY, SDOT, SSCAL, SASUM + + EXTERNAL SGEFA, SAXPY, SDOT, SSCAL, SASUM INTEGER LDA, N, IPVT(*) REAL A(LDA,*), Z(*) @@ -18752,6 +18575,7 @@ C IF CALLED. USE RCOND IN SGECO FOR A RELIABLE C INDICATION OF SINGULARITY. C ROUTINES CALLED: FROM BLAS: SAXPY, SSCAL, ISAMAX + EXTERNAL SAXPY, SSCAL, ISAMAX INTEGER LDA, N, IPVT(*), INFO @@ -18857,6 +18681,7 @@ C 10 CONTINUE C ROUTINES CALLED: FROM BLAS: SAXPY, SDOT + EXTERNAL SAXPY, SDOT INTEGER LDA, N, IPVT(*), JOB @@ -19286,14 +19111,15 @@ C ############################## *= (see routine T665D for more information on different constants) =* *-----------------------------------------------------------------------------* - REAL d1mach + EXTERNAL t665d + DOUBLE PRECISION d1mach INTEGER i LOGICAL doinit DATA doinit/.TRUE./ SAVE doinit - REAL dmach(4) + DOUBLE PRECISION dmach(4) SAVE dmach IF (( i .GE. 1 ) .AND. ( i .LE. 4 )) THEN @@ -19325,12 +19151,12 @@ C----------------------------------------------------------------------- C This subroutine is a double precision version of subroutine T665R. C See code of T665R for detailed comments and explanation C----------------------------------------------------------------------- - REAL DMACH(4) + DOUBLE PRECISION DMACH(4) INTEGER I,IBETA,IEXP,IRND,IT,ITEMP,IZ,J,K,MACHEP,MAXEXP, 1 MINEXP,MX,NEGEP,NGRD,NXRES CS REAL A,B,BETA,BETAIN,BETAH,CONV,EPS,EPSNEG,ONE,T,TEMP,TEMPA, CS 1 TEMP1,TWO,XMAX,XMIN,Y,Z,ZERO - REAL A,B,BETA,BETAIN,BETAH,CONV,EPS,EPSNEG,ONE, + DOUBLE PRECISION A,B,BETA,BETAIN,BETAH,CONV,EPS,EPSNEG,ONE, 1 T,TEMP,TEMPA,TEMP1,TWO,XMAX,XMIN,Y,Z,ZERO C----------------------------------------------------------------------- CS CONV(I) = REAL(I) @@ -19517,9 +19343,7 @@ C---------- LAST CARD OF T665D ---------- END -C ############################## FUNCTION R1MACH(i) -C ############################## *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -19578,9 +19402,7 @@ C ############################## C ALGORITHM 665, COLLECTED ALGORITHMS FROM ACM. C THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE, C VOL. 14, NO. 4, PP. 303-311. -C ############################## SUBROUTINE T665R(RMACH) -C ############################## C----------------------------------------------------------------------- C This Fortran 77 subroutine is intended to determine the parameters C of the floating-point arithmetic system specified below. The @@ -19851,7 +19673,14 @@ C----------------------------------------------------------------- C---------- LAST CARD OF T665R ---------- END - SUBROUTINE r01(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +CCC FILE rxn.f +* This file contains the following subroutines, related to reading/loading +* the product (cross section) x (quantum yield) for photo-reactions: +* r01 through r47 +* r101 through r148 +* r149, r150 and r151 added from original TUV code +*=============================================================================* + SUBROUTINE r01(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -19889,14 +19718,14 @@ C---------- LAST CARD OF T665R ---------- *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -19908,9 +19737,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -19960,6 +19787,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -20016,7 +19844,7 @@ c c INCLUDE 'params' * mabs = 2 = JPL 2006 mabs = 1 - CALL rdo3xs(mabs, nz,tlev,nw,wl, xs) + CALL rdo3xs(mabs, nz,tlev,nw,wl, xs, kout) ******* quantum yield: @@ -20309,18 +20137,17 @@ c myld = kjpl00 20 CONTINUE 10 CONTINUE +* declare temperature dependence + + tpflag(j-1) = 1 + tpflag(j) = 1 + RETURN END -* This file contains the following subroutines, related to reading/loading -* the product (cross section) x (quantum yield) for photo-reactions: -* r01 through r47 -* r101 through r110 -*=============================================================================* - *=============================================================================* - SUBROUTINE r02(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r02(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -20350,14 +20177,14 @@ c myld = kjpl00 IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -20369,9 +20196,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -20421,6 +20246,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -20502,9 +20328,9 @@ c c INCLUDE 'params' else if(myld. eq. 2) then -* from jpl 2006 +* from jpl 2011 - OPEN(UNIT=kin,FILE='DATAJ1/YLD/NO2_jpl2006.yld',STATUS='old') + OPEN(UNIT=kin,FILE='DATAJ1/YLD/NO2_jpl11.yld',STATUS='old') DO i = 1, 2 READ(kin,*) ENDDO @@ -20537,15 +20363,15 @@ c c INCLUDE 'params' STOP ENDIF - do iw = 1, nw - 1 - do iz = 1, nz - qy(iz,iw) = yg1(iw) + - $ (yg1(iw)-yg2(iw)) * (tlev(iz)-298)/50. - qy(iz,iw) = amax1(qy(iz,iw),0.) - enddo - enddo + DO iw = 1, nw - 1 + DO iz = 1, nz + qy(iz,iw) = yg1(iw) + + $ (yg1(iw)-yg2(iw)) * (tlev(iz)-298)/50. + qy(iz,iw) = amax1(qy(iz,iw),0.) + ENDDO + ENDDO - endif + ENDIF * combine @@ -20555,13 +20381,15 @@ c c INCLUDE 'params' ENDDO ENDDO +* declare temperature dependence + tpflag(j) = 1 - + RETURN END *=============================================================================* - SUBROUTINE r03(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r03(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -20591,13 +20419,13 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -20609,9 +20437,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -20661,6 +20487,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -20671,121 +20498,305 @@ c c INCLUDE 'params' INTEGER kdata PARAMETER(kdata=350) - REAL x1(kdata) + REAL x(kdata), x1(kdata) REAL y1(kdata) + real q1_298(kdata), q1_230(kdata), q1_190(kdata) + real q2_298(kdata), q2_230(kdata), q2_190(kdata) * local REAL yg(kw), yg1(kw) - REAL qy + REAL qy,qy1, qy2 + real yg1_298(kw), yg1_230(kw), yg1_190(kw) + real yg2_298(kw), yg2_230(kw), yg2_190(kw) + INTEGER irow, icol - INTEGER i, iw, n, idum + INTEGER i, iw, iz, n, idum INTEGER ierr + integer mabs, myld + **************** jlabel(j) = 'NO3 -> NO2 + O(3P)' **************** jlabel(j) = 'NO3 -> NO + O2' + j = j + 1 + jlabel(j) = 'NO3 -> NO + O2' + j = j + 1 + jlabel(j) = 'NO3 -> NO2 + O(3P)' + + +* mabs = 1: Graham and Johnston 1978 +* mabs = 2: JPL94 +* mabs = 3: JPL11 + + mabs = 3 + +* myld = 1 from Madronich (1988) see CEC NO3 book. +* myld = 2 from JPL-2011 + + myld = 2 + +* cross section + + IF(mabs. eq. 1) then + * cross section * measurements of Graham and Johnston 1978 - OPEN(UNIT=kin,FILE='DATAJ1/ABS/NO3_gj78.abs',STATUS='old') - DO i = 1, 9 - READ(kin,*) - ENDDO - n = 305 - DO irow = 1, 30 - READ(kin,*) ( y1(10*(irow-1) + icol), icol = 1, 10 ) - ENDDO - READ(kin,*) ( y1(300 + icol), icol = 1, 5 ) - CLOSE (kin) - DO i = 1, n - y1(i) = y1(i) * 1.E-19 - x1(i) = 400. + 1.*FLOAT(i-1) - ENDDO + OPEN(UNIT=kin,FILE='DATAJ1/ABS/NO3_gj78.abs',STATUS='old') + DO i = 1, 9 + READ(kin,*) + ENDDO + n = 305 + DO irow = 1, 30 + READ(kin,*) ( y1(10*(irow-1) + icol), icol = 1, 10 ) + ENDDO + READ(kin,*) ( y1(300 + icol), icol = 1, 5 ) + CLOSE (kin) + DO i = 1, n + y1(i) = y1(i) * 1.E-19 + x1(i) = 400. + 1.*FLOAT(i-1) + ENDDO - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP - ENDIF + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .EQ. 2) THEN * cross section from JPL94: - OPEN(UNIT=kin,FILE='DATAJ1/ABS/NO3_jpl94.abs',STATUS='old') - READ(kin,*) idum, n - DO i = 1, idum-2 - READ(kin,*) - ENDDO - DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i)*1E-20 - ENDDO - CLOSE (kin) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg1,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP - ENDIF + OPEN(UNIT=kin,FILE='DATAJ1/ABS/NO3_jpl94.abs',STATUS='old') + READ(kin,*) idum, n + DO i = 1, idum-2 + READ(kin,*) + ENDDO + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i)*1E-20 + ENDDO + CLOSE (kin) + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF * use JPL94 for wavelengths longer than 600 nm - DO iw = 1, nw-1 - IF(wl(iw) .GT. 600.) yg(iw) = yg1(iw) - ENDDO + DO iw = 1, nw-1 + IF(wl(iw) .GT. 600.) yg(iw) = yg1(iw) + ENDDO + +* cross sections from JPL2011 + + ELSEIF(MABS .EQ. 3) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/NO3_jpl11.abs',STATUS='old') + DO i = 1, 6 + READ(kin,*) + ENDDO + DO i = 1, 289 + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i)*1E-20 + ENDDO + CLOSE (kin) + + n = 289 + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ENDIF * quantum yield: -* from Madronich (1988) see CEC NO3 book. + + if (myld .eq. 1) then * for NO3 ->NO+O2 - j = j + 1 - jlabel(j) = 'NO3 -> NO + O2' - DO iw = 1, nw - 1 - IF (wc(iw).LT.584.) THEN + DO iw = 1, nw - 1 + IF (wc(iw).LT.584.) THEN qy = 0. - ELSEIF (wc(iw).GE.640.) THEN + ELSEIF (wc(iw).GE.640.) THEN qy = 0. - ELSEIF (wc(iw).GE.595.) THEN + ELSEIF (wc(iw).GE.595.) THEN qy = 0.35*(1.-(wc(iw)-595.)/45.) - ELSE + ELSE qy = 0.35*(wc(iw)-584.)/11. - ENDIF - DO i = 1, nz + ENDIF + DO i = 1, nz sq(j,i,iw) = yg(iw)*qy - ENDDO - ENDDO + ENDDO + ENDDO * for NO3 ->NO2+O - j = j + 1 - jlabel(j) = 'NO3 -> NO2 + O(3P)' - DO iw = 1, nw - 1 - IF (wc(iw).LT.584.) THEN + + DO iw = 1, nw - 1 + IF (wc(iw).LT.584.) THEN qy = 1. - ELSEIF (wc(iw).GT.640.) THEN + ELSEIF (wc(iw).GT.640.) THEN qy = 0. - ELSEIF (wc(iw).GT.595.) THEN + ELSEIF (wc(iw).GT.595.) THEN qy = 0.65*(1-(wc(iw)-595.)/45.) - ELSE + ELSE qy = 1.-0.35*(wc(iw)-584.)/11. - ENDIF - DO i = 1, nz + ENDIF + DO i = 1, nz sq(j,i,iw) = yg(iw)*qy + ENDDO + ENDDO + +* yields from JPL2011: + + ELSEIF(myld .EQ. 2) THEN + + open(unit=kin,file='DATAJ1/YLD/NO3_jpl2011.qy',status='old') + do i = 1, 5 + read(kin,*) + enddo + do i = 1, 56 + read(kin,*) x(i), q1_298(i), q1_230(i), q1_190(i), + $ q2_298(i), q2_230(i), q2_190(i) + + q1_298(i) = q1_298(i)/1000. + q1_230(i) = q1_230(i)/1000. + q1_190(i) = q1_190(i)/1000. + q2_298(i) = q2_298(i)/1000. + q2_230(i) = q2_230(i)/1000. + q2_190(i) = q2_190(i)/1000. + + enddo + close(kin) + + n = 56 + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,q1_298,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,q1_298,kdata,n, 0.,0.) + CALL addpnt(x1,q1_298,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,q1_298,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg1_298,n,x1,q1_298,ierr) + + n = 56 + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,q1_230,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,q1_230,kdata,n, 0.,0.) + CALL addpnt(x1,q1_230,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,q1_230,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg1_230,n,x1,q1_230,ierr) + + n = 56 + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,q1_190,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,q1_190,kdata,n, 0.,0.) + CALL addpnt(x1,q1_190,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,q1_190,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg1_190,n,x1,q1_190,ierr) + + n = 56 + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,q2_298,kdata,n,x1(1)*(1.-deltax),1.) + CALL addpnt(x1,q2_298,kdata,n, 0.,1.) + CALL addpnt(x1,q2_298,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,q2_298,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg2_298,n,x1,q2_298,ierr) + + n = 56 + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,q2_230,kdata,n,x1(1)*(1.-deltax),1.) + CALL addpnt(x1,q2_230,kdata,n, 0.,1.) + CALL addpnt(x1,q2_230,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,q2_230,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg2_230,n,x1,q2_230,ierr) + + n = 56 + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,q2_190,kdata,n,x1(1)*(1.-deltax),1.) + CALL addpnt(x1,q2_190,kdata,n, 0.,1.) + CALL addpnt(x1,q2_190,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,q2_190,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg2_190,n,x1,q2_190,ierr) + +* compute T-dependent quantum yields + + DO iw = 1, nw-1 + DO iz = 1, nz + + if(tlev(iz) .le. 190.) then + + qy1 = yg1_190(iw) + qy2 = yg2_190(iw) + + elseif(tlev(iz) .gt. 190. .and. tlev(iz) .le. 230.) then + + qy1 = yg1_190(iw) + (yg1_230(iw) - yg1_190(iw))* + $ (tlev(iz) - 190.)/(230.-190.) + qy2 = yg2_190(iw) + (yg2_230(iw) - yg2_190(iw))* + $ (tlev(iz) - 190.)/(230.-190.) + + elseif(tlev(iz) .gt. 230. .and. tlev(iz) .le. 298.) then + + qy1 = yg1_230(iw) + (yg1_298(iw) - yg1_230(iw))* + $ (tlev(iz) - 230.)/(298.-230.) + + qy2 = yg2_230(iw) + (yg2_298(iw) - yg2_230(iw))* + $ (tlev(iz) - 230.)/(298.-230.) + + elseif(tlev(iz) .gt. 298.) then + + qy1 = yg1_298(iw) + qy2 = yg2_298(iw) + + endif + + sq(j-1, iz, iw) = qy1 * yg1(iw) + sq(j, iz, iw) = qy2 * yg1(iw) + + ENDDO ENDDO - ENDDO + + ENDIF + +* declare temperature dependence for both channels: + + tpflag(j-1) = 1 + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r04(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r04(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -20817,14 +20828,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -20836,9 +20847,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -20888,6 +20897,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -20896,20 +20906,18 @@ c c INCLUDE 'params' * data arrays INTEGER kdata - PARAMETER(kdata=100) + PARAMETER(kdata=200) - REAL x1(kdata) - REAL y1(kdata) + REAL x1(kdata), x2(kdata) + REAL y1(kdata), A(kdata), B(kdata) + INTEGER n1, n2 * local - REAL yg(kw) - REAL qy - REAL xs, xs270, xs280, xst290, xst300 - REAL dum1, dum2 - REAL t - INTEGER i, iw, n, idum + REAL yg1(kw), yg2(kw) + INTEGER i, iz, iw INTEGER ierr + REAL t, xs, dum **************** N2O5 photodissociation @@ -20919,92 +20927,84 @@ c c INCLUDE 'params' j = j + 1 jlabel(j) = 'N2O5 -> NO3 + NO2' -* cross section from jpl97, table up to 280 nm +* cross section from jpl2011, at 300 K - OPEN(UNIT=kin,FILE='DATAJ1/ABS/N2O5_jpl97.abs',STATUS='old') - READ(kin,*) idum, n - DO i = 1, idum-2 + OPEN(UNIT=kin,FILE='DATAJ1/ABS/N2O5_jpl11.abs',STATUS='old') + DO i = 1, 4 READ(kin,*) ENDDO - DO i = 1, n + n1 = 103 + DO i = 1, n1 READ(kin,*) x1(i), y1(i) y1(i) = y1(i) * 1.E-20 ENDDO - xs270 = y1(n-2) - xs280 = y1(n) +* read temperature dependence coefficients: + + DO i = 1, 4 + READ(kin,*) + ENDDO + n2 = 8 + DO i = 1, n2 + READ(kin,*) x2(i), A(i), B(i) + ENDDO CLOSE(kin) - CALL addpnt(x1,y1,kdata, n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata, n, 0.,0.) - CALL addpnt(x1,y1,kdata, n,x1(n)*(1.+deltax),y1(n)) - CALL addpnt(x1,y1,kdata, n, 1.E36,y1(n)) + CALL addpnt(x1,y1,kdata, n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata, n1, 0.,0.) + CALL addpnt(x1,y1,kdata, n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata, n1, 1.E36 ,0.) - CALL inter2(nw,wl,yg, n,x1,y1, ierr) + CALL inter2(nw,wl,yg1, n1,x1,y1, ierr) IF (ierr .NE. 0) THEN - WRITE(0,*) ierr,jlabel(j) + WRITE(*,*) ierr,jlabel(j) STOP - ENDIF - -* quantum yield : see DATAJ1/YLD/N2O5.qy for explanation -* correct for T-dependence of cross section - - DO iw = 1, nw - 1 - - qy = MIN( 1., 3.832441 - 0.012809638 * wc(iw) ) - qy = MAX( 0., qy ) - - DO i = 1, nz - -* temperature dependence only valid for 225 - 300 K. - - t = MAX(225.,MIN(tlev(i),300.)) - -* evaluation of exponential + ENDIF - IF (wc(iw) .GE. 285. .AND. wc(iw) .LE. 380.) THEN + CALL addpnt(x2,B,kdata, n2,x2(1)*(1.-deltax),0.) + CALL addpnt(x2,B,kdata, n2, 0.,0.) + CALL addpnt(x2,B,kdata, n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,B,kdata, n2, 1.E36 ,0.) - sq(j-1,i,iw) = qy * - $ 1.E-20*EXP( 2.735 + (4728.5-17.127*wc(iw)) / t ) - sq(j,i,iw) = (1.-qy) * - $ 1.E-20*EXP( 2.735 + (4728.5-17.127*wc(iw)) / t ) + CALL inter2(nw,wl,yg2, n2,x2,B, ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr,jlabel(j) + STOP + ENDIF -* between 280 and 285 nm: Extrapolate from both sides, then average. - ELSEIF (wc(iw) .GE. 280. .AND. wc(iw) .LT. 285.) THEN + DO iw = 1, nw - 1 + DO iz = 1, nz - xst290 = 1.E-20* - > EXP( 2.735 + (4728.5-17.127*290.) / t ) - xst300 = 1.E-20* - > EXP( 2.735 + (4728.5-17.127*300.) / t ) - - dum1 = xs270 + (wc(iw) - 270.)*(xs280 - xs270)/10. - dum2 = xst290 + (wc(iw) - 290.)*(xst300 - xst290)/10. - xs = 0.5*(dum1 + dum2) +* temperature dependence only valid for 233 - 295 K. Extend to 300. - sq(j-1,i,iw) = qy * xs - sq(j,i,iw) = (1.-qy) * xs + t = MAX(233.,MIN(tlev(iz),300.)) -* for less than 280 nm, use tabulated values +* Apply temperature correction to 300K values. Do not use A-coefficients +* because they are inconsistent with the values at 300K. - ELSEIF (wc(iw) .LT. 280.) THEN + dum = 1000.*yg2(iw)*((1./t) - (1./300.)) + xs = yg1(iw) * 10.**(dum) - sq(j-1,i,iw) = qy * yg(iw) - sq(j,i,iw) = (1.-qy) * yg(iw) +* quantum yield = 1 for NO2 + NO3, zero for other channels -* beyond 380 nm, set to zero + sq(j-1, iz, iw) = 0. * xs + sq(j , iz, iw) = 1. * xs - ELSE - sq(j-1,i,iw) = 0. - sq(j,i,iw) = 0. - ENDIF ENDDO ENDDO + +* declare temperature dependence + + tpflag(j-1) = 1 + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r05(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r05(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -21035,14 +21035,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -21054,9 +21054,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -21106,6 +21104,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -21114,7 +21113,7 @@ c c INCLUDE 'params' * data arrays INTEGER kdata - PARAMETER(kdata=100) + PARAMETER(kdata=200) REAL x1(kdata) REAL y1(kdata) @@ -21126,31 +21125,66 @@ c c INCLUDE 'params' INTEGER i, iw, n INTEGER ierr + INTEGER mabs + **************** HNO2 photodissociation +* mabs = 2: JPL 2011 recommendation +* mabs = 1: earlier JPL recommendations + + mabs = 2 + * cross section from JPL92 * (from Bongartz et al., identical to JPL94, JPL97 recommendation) j = j + 1 jlabel(j) = 'HNO2 -> OH + NO' - OPEN(UNIT=kin,FILE='DATAJ1/ABS/HNO2_jpl92.abs',STATUS='old') - DO i = 1, 13 - READ(kin,*) - ENDDO - n = 91 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i) * 1.E-20 - ENDDO - CLOSE (kin) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP + IF(mabs .eq. 1) then + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/HNO2_jpl92.abs',STATUS='old') + DO i = 1, 13 + READ(kin,*) + ENDDO + n = 91 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.E-20 + ENDDO + CLOSE (kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .eq. 2) then + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/HONO_jpl11.abs',STATUS='old') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 192 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.E-20 + ENDDO + CLOSE (kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF * quantum yield = 1 @@ -21162,11 +21196,16 @@ c c INCLUDE 'params' ENDDO ENDDO +* no t or p dependence + + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r06(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r06(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -21194,14 +21233,14 @@ c c INCLUDE 'params' *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -21213,9 +21252,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -21265,6 +21302,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -21369,11 +21407,14 @@ C ENDDO ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r07(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r07(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -21401,14 +21442,14 @@ C ENDDO *-----------------------------------------------------------------------------* IMPLICIT NONE -c c INCLUDE 'params' +c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -21420,9 +21461,7 @@ c c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -21472,6 +21511,7 @@ c c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -21493,17 +21533,15 @@ C* local INTEGER ierr **************** HNO4 photodissociation - -* cross section from JPL85 (identical to JPL92 and JPL94 and JPL97) +* cross section from JPL2011 j = j + 1 jlabel(j) = 'HNO4 -> HO2 + NO2' -C OPEN(UNIT=kin,FILE='DATAJ1/ABS/HNO4.abs',STATUS='old') - OPEN(UNIT=kin,FILE='DATAJ1/ABS/HNO4_jpl92.abs',STATUS='old') - DO i = 1, 4 + OPEN(UNIT=kin,FILE='DATAJ1/ABS/HNO4_jpl11.abs',STATUS='old') + DO i = 1, 2 READ(kin,*) ENDDO - n = 31 + n = 54 DO i = 1, n READ(kin,*) x1(i), y1(i) y1(i) = y1(i) * 1.E-20 @@ -21529,11 +21567,16 @@ C OPEN(UNIT=kin,FILE='DATAJ1/ABS/HNO4.abs',STATUS='old') ENDDO ENDDO +* no T or P dependence + + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r08(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r08(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -21569,7 +21612,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -21581,9 +21624,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -21633,6 +21674,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -21641,7 +21683,7 @@ c INCLUDE 'params' * data arrays INTEGER kdata - PARAMETER(kdata=100) + PARAMETER(kdata=600) C INTEGER n1, n2, n3, n4, n5 REAL x1(kdata) @@ -21701,6 +21743,12 @@ C ENDIF ENDDO CLOSE (kin) + OPEN(UNIT=kin,FILE='DATAJ1/ABS/H2O2_Kahan.abs',STATUS='old') + DO i = 1, 494 + n = n + 1 + READ(kin,*) x1(n), y1(n) + ENDDO + CLOSE (kin) CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) CALL addpnt(x1,y1,kdata,n, 0.,0.) @@ -21759,11 +21807,14 @@ C ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r09(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r09(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -21798,7 +21849,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -21810,9 +21861,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -21862,6 +21911,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -22092,11 +22142,14 @@ c INCLUDE 'params' ENDIF + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r10(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r10(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -22145,7 +22198,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -22157,9 +22210,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -22212,6 +22263,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -22706,11 +22758,16 @@ c ENDDO ENDDO ENDDO +* declare T and P dependence + + tpflag(j) = 3 + + RETURN END *=============================================================================* - SUBROUTINE r11(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r11(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -22754,7 +22811,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -22766,9 +22823,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -22818,6 +22873,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -22842,6 +22898,7 @@ c INCLUDE 'params' REAL dum INTEGER ierr INTEGER iz, iw + REAL qy1_n0, qy1_0, x INTEGER mabs, myld @@ -22868,6 +22925,7 @@ c INCLUDE 'params' * 2: Calvert and Pitts * 3: Martinez et al., Table 1 scanned from paper * 4: KFA tabulations, 6 choices, see file OPEN statements +* 5: JPL2011 * Quantum yield * 1: DATAJ1/CH3CHO/CH3CHO_iup.yld @@ -22879,8 +22937,8 @@ c INCLUDE 'params' * DATAJ1/CH3CHO/d021_i.yld * DATAJ1/CH3CHO/d021_i.yld - mabs = 3 - myld = 2 + mabs = 5 + myld = 1 IF (mabs .EQ. 1) THEN @@ -22991,6 +23049,30 @@ c n = 1705 STOP ENDIF + ELSEIF (mabs .EQ. 5) THEN + + OPEN(UNIT=kin, + $ FILE='DATAJ1/CH3CHO/CH3CHO_jpl11.abs',STATUS='old') + do i = 1, 2 + read(kin,*) + enddo + n = 101 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF * quantum yields @@ -23124,20 +23206,39 @@ c n = 1705 * combine: DO iw = 1, nw - 1 - DO i = 1, nz - sig = yg(iw) + sig = yg(iw) * quantum yields: +* input yields at n0 = 1 atm + + qy1_n0 = yg1(iw) + qy2 = yg2(iw) + qy3 = yg3(iw) + +* Pressure correction for CH3 + CHO channel: +* Assume pressure-dependence only for qy1, not qy2 or qy2. +* Assume total yield 1 at zero pressure + + qy1_0 = 1. - qy2 - qy3 - qy1 = yg1(iw) - qy2 = yg2(iw) - qy3 = yg3(iw) +* compute coefficient: +* Stern-Volmer: 1/q = 1/q0 + k N and N0 = 1 atm, +* then x = K N0 q0 = qy_0/qy_N0 - 1 -* pressure correction for channel 1, CH3 + CHO -* based on Horowitz and Calvert 1982. + if (qy1_n0 .gt. 0.) then + x = qy1_0/qy1_n0 - 1. + else + x = 0. + endif + +* use instead slope/intercept ratio from Horowitz and Calvert 1982, +c x = yg4(iw) + + DO i = 1, nz + + qy1 = qy1_n0 * (1. + x) / (1. + x * airden(i)/2.465E19 ) - qy1 = qy1 * (1. + yg4(iw))/(1. + yg4(iw)*airden(i)/2.465E19) qy1 = MIN(1., qy1) qy1 = MAX(0., qy1) @@ -23148,11 +23249,19 @@ c n = 1705 ENDDO ENDDO +* declare P dependence for channel 1 + + tpflag(j-2) = 2 + tpflag(j) = 0 + tpflag(j) = 0 + + RETURN + END *=============================================================================* - SUBROUTINE r12(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r12(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -23191,7 +23300,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -23203,9 +23312,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -23255,6 +23362,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -23402,11 +23510,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 2 + + RETURN END *=============================================================================* - SUBROUTINE r13(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r13(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -23447,7 +23558,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -23459,9 +23570,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -23511,6 +23620,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -23522,15 +23632,15 @@ c INCLUDE 'params' INTEGER kdata PARAMETER(kdata=500) - INTEGER i, n - REAL x1(kdata) - REAL y1(kdata) + INTEGER i, n, n1, n2, n3 + REAL x(kdata), x1(kdata), x2(kdata), x3(kdata) + REAL y1(kdata), y2(kdata), y3(kdata) * local - REAL yg(kw) - REAL qyII, qyIII - REAL sig + REAL yg(kw), yg1(kw), yg2(kw), yg3(kw) + REAL qyI, qyII, qyIII + REAL sig, dum INTEGER ierr INTEGER iw @@ -23567,6 +23677,9 @@ c INCLUDE 'params' j = j + 1 jlabel(j) = 'CHOCHO -> CH2O + CO' + j = j + 1 + jlabel(j) = 'CHOCHO -> CH2O + CO' + * options * mabs for cross sections * myld for quantum yields @@ -23580,12 +23693,14 @@ c INCLUDE 'params' * The UV-VIS absorption cross sectiono of the a-dicarbonyl compounds: * pyruvic acid, biacetyl, and glyoxal. * J. Photochem. Photobiol. A:Chemistry, v.146, pp.19-27, 2001. +* 5: From JPL 2011, derived mostly from Volkamer et al. * Quantum yield * 1: IUPAC-97 data +* 2: JPL 2011 - mabs = 4 - myld = 1 + mabs = 5 + myld = 2 IF (mabs .EQ. 1) THEN @@ -23688,10 +23803,95 @@ c INCLUDE 'params' WRITE(*,*) ierr, jlabel(j) STOP ENDIF + + ELSEIF(mabs .eq. 5) then + + open(unit=kin, + $ FILE='DATAJ1/CHOCHO/glyoxal_jpl11.abs',STATUS='old') + + DO i = 1, 2 + read(kin,*) + ENDDO + n = 277 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE (kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF * quantum yields + IF(myld .eq. 2) then + + open(unit=kin, + $ FILE='DATAJ1/CHOCHO/glyoxal_jpl11.qy',STATUS='old') + + DO i = 1, 3 + read(kin,*) + ENDDO + n = 40 + DO i = 1, n + READ(kin,*) x(i), dum, y1(i), y2(i), y3(i) + ENDDO + CLOSE (kin) + + n1 = n + do i = 1, n + x1(i) = x(i) + enddo + + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),y1(1)) + CALL addpnt(x1,y1,kdata,n1, 0.,y1(1)) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + n2 = n + + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,y2,kdata,n2,x1(1)*(1.-deltax),y2(1)) + CALL addpnt(x1,y2,kdata,n2, 0.,y2(1)) + CALL addpnt(x1,y2,kdata,n2,x1(n2)*(1.+deltax),0.) + CALL addpnt(x1,y2,kdata,n2, 1.e+38,0.) + CALL inter2(nw,wl,yg2,n2,x1,y2,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + n3 = n + do i = 1, n + x1(i) = x(i) + enddo + CALL addpnt(x1,y3,kdata,n3,x1(1)*(1.-deltax),y3(1)) + CALL addpnt(x1,y3,kdata,n3, 0.,y3(1)) + CALL addpnt(x1,y3,kdata,n3,x1(n3)*(1.+deltax),0.) + CALL addpnt(x1,y3,kdata,n3, 1.e+38,0.) + CALL inter2(nw,wl,yg3,n3,x1,y3,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ENDIF + * combine: DO iw = 1, nw - 1 @@ -23699,29 +23899,48 @@ c INCLUDE 'params' sig = yg(iw) * quantum yields: + IF(myld .EQ. 1) THEN + * Use values from Bauerle, but corrected to cutoff at 417 rather than 380. * this correction is a reduction by 7.1. -* so that qyII = 0.63/7.1 and qyIII = 0.2/7.1 +* so that qyI = 0.63/7.1 and qyII = 0.2/7.1 + qyII = 0. if(wc(iw) .lt. 417. ) then - qyII = 0.089 + qyI = 0.089 qyIII = 0.028 else - qyII = 0. + qyI = 0. qyIII = 0. endif - - DO i = 1, nz - sq(j-1,i,iw) = sig * qyII - sq(j,i, iw) = sig * qyIII - ENDDO + + DO i = 1, nz + sq(j-2,i,iw) = sig * qyI + sq(j-1,i,iw) = sig * qyII + sq(j, i,iw) = sig * qyIII + ENDDO + + ELSEIF(myld .EQ. 2) THEN + + DO i = 1, nz + sq(j-2,i,iw) = sig * yg1(iw) + sq(j-1,i,iw) = sig * yg2(iw) + sq(j, i,iw) = sig * yg3(iw) + ENDDO + + ENDIF ENDDO + tpflag(j-2) = 0 + tpflag(j-1) = 0 + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r14(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r14(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -23772,7 +23991,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -23784,9 +24003,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -23836,6 +24053,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -23887,6 +24105,7 @@ c INCLUDE 'params' * 5: ch3cocho.003 - Meller et al. 1991, 1.0 nm resolution * 6: ch3cocho.004 - Staffelbach et al. 1995 * 7: use synthetic spectrum, average of CHOCHO and CH3COCOCH3: +* 8: cross section from JPL2011 @@ -23899,7 +24118,7 @@ c INCLUDE 'params' * 5: Chen, Y., W. Wang, and L. Zhu, Wavelength-dependent photolysis of methylglyoxal * in the 290-440 nm region, J Phys Chem A, 104, 11126-11131, 2000. - mabs = 2 + mabs = 8 myld = 5 IF (mabs .EQ. 1) THEN @@ -24063,6 +24282,30 @@ c INCLUDE 'params' yg(iw) = 0.5*(yg1(iw) + yg2(iw)) enddo + ELSEIF(mabs .eq. 8) then + + OPEN(UNIT=kin, + $ FILE='DATAJ1/CH3COCHO/CH3COCHO_jpl11.abs',STATUS='old') + do i = 1, 2 + read(kin,*) + enddo + n = 294 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE (kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF * quantum yields @@ -24178,11 +24421,14 @@ c kq = 1.93e4 * EXP(-5639/wc(iw)) ENDDO ENDDO + tpflag(j) = 2 + + RETURN END *=============================================================================* - SUBROUTINE r15(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r15(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -24224,7 +24470,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -24236,9 +24482,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -24288,6 +24532,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -24300,13 +24545,13 @@ c INCLUDE 'params' PARAMETER(kdata=150) INTEGER i, n - INTEGER n1, n2, n3 - REAL x1(kdata), x2(kdata), x3(kdata) - REAL y1(kdata), y2(kdata), y3(kdata) + INTEGER n1, n2, n3, n4 + REAL x1(kdata), x2(kdata), x3(kdata), x4(kdata) + REAL y1(kdata), y2(kdata), y3(kdata), y4(kdata) * local - REAL yg(kw), yg1(kw), yg2(kw), yg3(kw) + REAL yg(kw), yg1(kw), yg2(kw), yg3(kw), yg4(kw) REAL qy REAL sig INTEGER ierr @@ -24329,6 +24574,7 @@ c INCLUDE 'params' * 1: cross section from Calvert and Pitts * 2: Martinez et al. 1991, also in IUPAC'97 * 3: NOAA 1998, unpublished as of Jan 98. +* 4: JPL-2011 * Quantum yield * 1: Gardiner et al. 1984 @@ -24342,7 +24588,7 @@ c INCLUDE 'params' * photodissociation of acetone between 279 and 327.5 nm, Geophys. * Res. Lett., 31, L06111, doi:10.1029/2003GL018793. - mabs = 2 + mabs = 4 myld = 4 IF (mabs .EQ. 1) THEN @@ -24442,6 +24688,69 @@ c INCLUDE 'params' STOP ENDIF + ELSEIF(mabs.eq.4) then + OPEN(UNIT=kin,FILE='DATAJ1/CH3COCH3/CH3COCH3_jpl11.abs', + $ STATUS='old') + DO i = 1, 5 + READ(kin,*) + ENDDO + n = 135 + DO i = 1, n + READ(kin,*) x1(i), y1(i), y2(i), y3(i), y4(i) + x2(i) = x1(i) + x3(i) = x1(i) + x4(i) = x1(i) + y1(i) = y1(i) * 1.e-20 + y2(i) = y2(i) / 1.e3 + y3(i) = y3(i) / 1.e5 + y4(i) = y4(i) / 1.e8 + ENDDO + CLOSE (kin) + n1 = n + n2 = n + n3 = n + n4 = n + + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + CALL addpnt(x2,y2,kdata,n2,x2(1)*(1.-deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 0.,0.) + CALL addpnt(x2,y2,kdata,n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 1.e+38,0.) + CALL inter2(nw,wl,yg2,n2,x2,y2,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + CALL addpnt(x3,y3,kdata,n3,x3(1)*(1.-deltax),0.) + CALL addpnt(x3,y3,kdata,n3, 0.,0.) + CALL addpnt(x3,y3,kdata,n3,x3(n3)*(1.+deltax),0.) + CALL addpnt(x3,y3,kdata,n3, 1.e+38,0.) + CALL inter2(nw,wl,yg3,n3,x3,y3,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + CALL addpnt(x4,y4,kdata,n4,x4(1)*(1.-deltax),0.) + CALL addpnt(x4,y4,kdata,n4, 0.,0.) + CALL addpnt(x4,y4,kdata,n4,x4(n4)*(1.+deltax),0.) + CALL addpnt(x4,y4,kdata,n4, 1.e+38,0.) + CALL inter2(nw,wl,yg4,n4,x4,y4,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF IF (myld .EQ. 2) THEN @@ -24476,11 +24785,20 @@ c INCLUDE 'params' sig = yg(iw) IF(mabs .EQ. 3) THEN +*!!! this definition of t is not consistent with JPL2011 + t = 298. - tlev(i) t = MIN(t, 298.-235.) t = MAX(t, 0.) - sig = yg(iw)*(1. + yg2(iw)*t + yg3(iw)*t*t) + sig = yg(iw)*(1. + yg2(iw)*t + yg3(iw)*t*t + $ + yg4(iw)*t*t*t) + + ELSEIF (mabs .eq. 4)THEN + + t = MIN(MAX(tlev(i), 235.),298.) + sig = yg(iw)*(1. + yg2(iw)*t + yg3(iw)*t*t + $ + yg4(iw)*t*t*t) ENDIF @@ -24522,12 +24840,17 @@ c INCLUDE 'params' ENDDO ENDDO +* both T and P + + tpflag(j) = 3 + + RETURN END *=============================================================================* - SUBROUTINE r16(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r16(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -24569,7 +24892,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -24581,9 +24904,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -24633,6 +24954,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -24670,8 +24992,9 @@ c INCLUDE 'params' * 3: Cox and Tyndall (1978), only for wavelengths < 280 nm * 4: Molina and Arguello (1979). According to Vaghjiani and Ravishankara (1989), * Molina and Arguello had a problem measuring CH3OOH, cross sections 40% too high. +* 5: JPL2011 - mabs = 2 + mabs = 5 IF (mabs .EQ. 1) THEN @@ -24773,6 +25096,30 @@ c $ STATUS='old') STOP ENDIF + ELSEIF (mabs .EQ. 5) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/CH3OOH/CH3OOH_jpl11.abs', + $ STATUS='old') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 40 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE (kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF * quantum yield = 1 @@ -24785,11 +25132,16 @@ c $ STATUS='old') ENDDO ENDDO +* no T or P dep + + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r17(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r17(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -24835,7 +25187,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -24847,9 +25199,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -24899,6 +25249,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -24939,8 +25290,9 @@ c INCLUDE 'params' * 6: fit from Roberts and Fajer, 1989 * 7: Rattigan et al. 1992 * 8: Libuda and Zabel 1995 +* 9: JPL2011 including T-dependence - mabs = 2 + mabs = 9 IF (mabs .EQ. 1) THEN @@ -25151,6 +25503,44 @@ c INCLUDE 'params' STOP ENDIF + ELSEIF (mabs. eq. 9) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/RONO2/CH3ONO2_jpl11.abs', + $ STATUS='old') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 65 + DO i = 1, n + READ(kin,*) x1(i), y1(i), y2(i) + y1(i) = y1(i) * 1.e-20 + x2(i) = x1(i) + y2(i) = y2(i) * 1.e-3 + ENDDO + CLOSE (kin) + + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + n2 = n + CALL addpnt(x2,y2,kdata,n2,x2(1)*(1.-deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 0.,0.) + CALL addpnt(x2,y2,kdata,n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n2,x2,y2,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + ENDIF * quantum yield = 1 @@ -25162,12 +25552,10 @@ c INCLUDE 'params' DO i = 1, nz - IF(mabs .EQ. 2) THEN + IF(mabs .EQ. 2 .OR. mabs .EQ. 9) THEN sig = yg(iw) * exp (yg1(iw) * (tlev(i)-298.)) - ELSEIF (mabs .EQ. 4) THEN sig = yg(iw)*10.**(yg1(iw)*tlev(i)) - ENDIF sq(j,i,iw) = qy * sig @@ -25175,11 +25563,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r18(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r18(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -25215,7 +25606,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -25227,9 +25618,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -25279,6 +25668,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -25371,10 +25761,10 @@ C ENDIF ENDIF * quantum yield: -* from JPL 2006, values at 308 nm. +* from JPL 2011 values for >300 nm. - qyNO2 = 0.6 - qyNO3 = 0.4 + qyNO2 = 0.7 + qyNO3 = 0.3 DO iw = 1, nw-1 DO i = 1, nz @@ -25383,15 +25773,19 @@ C ENDIF sq(j-1,i,iw) = qyNO2 * sig sq(j,i,iw) = qyNO3 * sig - + ENDDO - ENDDO + ENDDO + + tpflag(j-1) = 1 + tpflag(j) = 1 + RETURN END *=============================================================================* - SUBROUTINE r19(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r19(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -25427,7 +25821,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -25439,9 +25833,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -25491,6 +25883,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -25549,11 +25942,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r20(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r20(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -25588,7 +25984,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -25600,9 +25996,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -25652,6 +26046,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -25672,6 +26067,9 @@ c INCLUDE 'params' INTEGER i, iw, n, idum INTEGER ierr INTEGER iz + INTEGER mabs + REAL b0, b1, b2, b3, b4, tcoeff, sig + REAL w1, w2, w3, w4, temp ************************************************************** ************* CCl4 photodissociation @@ -25679,43 +26077,112 @@ c INCLUDE 'params' j = j+1 jlabel(j) = 'CCl4 -> Products' +* mabs = 1: jpl 1997 recommendation +* mabs = 2: jpl 2011 recommendation, with T dependence + + mabs = 2 + *** cross sections from JPL97 recommendation (identical to 94 data) - OPEN(kin,FILE='DATAJ1/ABS/CCl4_jpl94.abs',STATUS='OLD') - READ(kin,*) idum, n - DO i = 1, idum-2 - READ(kin,*) - ENDDO - DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i) * 1E-20 - ENDDO - CLOSE(kin) + IF(mabs .EQ. 1) THEN - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1E38,0.) + OPEN(kin,FILE='DATAJ1/ABS/CCl4_jpl94.abs',STATUS='OLD') + READ(kin,*) idum, n + DO i = 1, idum-2 + READ(kin,*) + ENDDO + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1E-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1E38,0.) + + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .EQ. 2) THEN + + OPEN(kin,FILE='DATAJ1/ABS/CCl4_jpl11.abs',STATUS='OLD') + DO i = 1, 5 + READ(kin,*) + ENDDO + n = 44 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1E-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1E38,0.) + + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP ENDIF +* compute temperature correction factors: + + b0 = 1.0739 + b1 = -1.6275e-2 + b2 = 8.8141e-5 + b3 = -1.9811e-7 + b4 = 1.5022e-10 + *** quantum yield assumed to be unity + qy = 1. DO iw = 1, nw-1 - DO iz = 1, nz - sq(j,iz,iw) = qy * yg(iw) - ENDDO + +* compute temperature correction coefficients: + + tcoeff = 0. + IF(wc(iw) .GT. 194. .AND. wc(iw) .LT. 250.) THEN + w1 = wc(iw) + w2 = w1**2 + w3 = w1**3 + w4 = w1**4 + tcoeff = b0 + b1*w1 + b2*w2 + b3*w3 + b4*w4 + ENDIF + + DO iz = 1, nz + + IF(mabs .EQ. 1) THEN + sig = yg(iw) + ELSEIF (mabs .EQ. 2) THEN + + temp = tlev(iz) + temp = min(max(temp,210.),300.) + + sig = yg(iw) * 10.**(tcoeff*(temp-295.)) + ENDIF + + sq(j,iz,iw) = qy * sig + + ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r21(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r21(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -25750,7 +26217,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -25762,9 +26229,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -25814,6 +26279,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -25873,11 +26339,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r22(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r22(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -25912,7 +26381,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -25924,9 +26393,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -25976,6 +26443,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -26035,11 +26503,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r23(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r23(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -26075,7 +26546,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -26087,9 +26558,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -26139,6 +26608,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -26226,11 +26696,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r24(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r24(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -26266,7 +26739,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -26278,9 +26751,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -26330,6 +26801,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -26417,11 +26889,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r25(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r25(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -26456,7 +26931,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -26468,9 +26943,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -26520,6 +26993,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -26581,11 +27055,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r26(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r26(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -26620,7 +27097,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -26632,9 +27109,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -26684,6 +27159,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -26749,11 +27225,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r27(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r27(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -26788,7 +27267,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -26800,9 +27279,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -26852,6 +27329,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -26917,11 +27395,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r28(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r28(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -26956,7 +27437,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -26968,9 +27449,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -27020,6 +27499,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -27080,11 +27560,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r29(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r29(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -27120,7 +27603,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -27132,9 +27615,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -27184,6 +27665,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -27295,11 +27777,14 @@ c INCLUDE 'params' ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r30(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r30(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -27335,7 +27820,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -27347,9 +27832,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -27399,6 +27882,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -27510,11 +27994,14 @@ c INCLUDE 'params' ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r31(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r31(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -27549,7 +28036,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -27561,9 +28048,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -27613,6 +28098,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -27675,11 +28161,14 @@ C INTEGER n1, n2, n3, n4, n5 ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r32(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r32(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -27714,7 +28203,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -27726,9 +28215,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -27778,6 +28265,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -27880,11 +28368,14 @@ C the measurements beyond 220 nm are very large (Orlando, priv.comm.) ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r33(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r33(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -27919,7 +28410,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -27931,9 +28422,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -27982,6 +28471,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -28082,11 +28572,14 @@ C ENDDO ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r34(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r34(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -28122,7 +28615,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -28134,9 +28627,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -28186,6 +28677,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -28247,11 +28739,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r35(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r35(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -28288,7 +28783,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -28300,9 +28795,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -28352,6 +28845,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -28460,12 +28954,14 @@ c sq(j,iz,iw) = qy * EXP(sum) ENDDO + tpflag(j) = 1 + RETURN END *=============================================================================* - SUBROUTINE r36(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r36(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -28501,7 +28997,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -28513,9 +29009,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -28565,6 +29059,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -28626,11 +29121,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r37(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r37(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -28666,7 +29164,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -28678,9 +29176,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -28730,6 +29226,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -28791,11 +29288,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r38(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r38(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -28831,7 +29331,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -28843,9 +29343,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -28895,6 +29393,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -29050,11 +29549,14 @@ c INCLUDE 'params' ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r39(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r39(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -29090,7 +29592,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -29102,9 +29604,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -29154,6 +29654,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -29181,13 +29682,13 @@ c INCLUDE 'params' j = j+1 jlabel(j) = 'HO2 -> OH + O' -**** cross sections from JPL97 recommendation (identical to 94 recommendation) +**** cross sections from JPL11 recommendation - OPEN(kin,FILE='DATAJ1/ABS/HO2_jpl94.abs',STATUS='OLD') - READ(kin,*) idum, n - DO i = 1, idum-2 + OPEN(kin,FILE='DATAJ1/ABS/HO2_jpl11.abs',STATUS='OLD') + DO i = 1, 10 READ(kin,*) ENDDO + n = 15 DO i = 1, n READ(kin,*) x1(i), y1(i) y1(i) = y1(i) * 1E-20 @@ -29224,11 +29725,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r40(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r40(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -29263,7 +29767,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -29275,9 +29779,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -29327,6 +29829,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -29388,11 +29891,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r41(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r41(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -29428,7 +29934,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -29440,9 +29946,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -29492,6 +29996,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -29553,11 +30058,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r42(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r42(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -29593,7 +30101,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -29605,9 +30113,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -29657,6 +30163,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -29718,11 +30225,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r43(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r43(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -29758,7 +30268,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -29770,9 +30280,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -29822,6 +30330,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -29885,11 +30394,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r44(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r44(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -29924,7 +30436,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -29936,9 +30448,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -29988,6 +30498,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -30044,11 +30555,14 @@ c INCLUDE 'params' ENDIF ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r45(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r45(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -30084,7 +30598,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -30096,9 +30610,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -30148,6 +30660,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -30179,7 +30692,7 @@ c INCLUDE 'params' j = j+1 jlabel(j) = 'ClONO2 -> ClO + NO2' -*** cross sections from JPL97 recommendation +*** cross sections from JPL97 recommendation. Same in JPL-2011. OPEN(kin,FILE='DATAJ1/ABS/ClONO2_jpl97.abs',STATUS='OLD') n = 119 @@ -30226,7 +30739,7 @@ c INCLUDE 'params' DO iw = 1, nw-1 -*** quantum yields (from jpl97) +*** quantum yields (from jpl97, same in jpl2011) IF( wc(iw) .LT. 308.) THEN qy1 = 0.6 @@ -30249,11 +30762,15 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j-1) = 1 + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r46(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r46(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -30289,7 +30806,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -30301,9 +30818,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -30353,6 +30868,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -30370,7 +30886,7 @@ c INCLUDE 'params' * local REAL yg1(kw) - REAL qy1, qy2 + REAL qyNO2, qyNO3 INTEGER i, iw, n, idum INTEGER ierr INTEGER iz @@ -30409,20 +30925,24 @@ c INCLUDE 'params' *** quantum yields (from jpl97) - qy1 = 0.71 - qy2 = 0.29 + qyNO2 = 0.15 + qyNO3 = 0.85 DO iw = 1, nw-1 DO iz = 1, nz - sq(j-1,iz,iw) = qy1 * yg1(iw) - sq(j,iz,iw) = qy2 * yg1(iw) + sq(j-1,iz,iw) = qyNO2 * yg1(iw) + sq(j,iz,iw) = qyNO3 * yg1(iw) ENDDO ENDDO + tpflag(j-1) = 0 + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r47(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r47(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -30458,7 +30978,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -30470,9 +30990,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -30522,6 +31040,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -30543,50 +31062,85 @@ c INCLUDE 'params' INTEGER iz, iw INTEGER ierr + integer mabs + real aa, bb, ex1, ex2, sig, alpha(kz) ************* CL2 photodissociation j = j+1 jlabel(j) = 'Cl2 -> Cl + Cl' +* mabs = 1: Finlayson-Pitts and Pitts +* mabs = 2: JPL2011 formula + + mabs = 2 + + IF (mabs .EQ. 1) THEN + *** cross sections from JPL97 recommendation (as tab by Finlayson-Pitts * and Pitts, 1999. - OPEN(kin,FILE='DATAJ1/ABS/CL2_fpp.abs',STATUS='OLD') - do i = 1, 5 - read(kin,*) - enddo - n = 22 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i) * 1E-20 - ENDDO - CLOSE(kin) + OPEN(kin,FILE='DATAJ1/ABS/CL2_fpp.abs',STATUS='OLD') + do i = 1, 5 + read(kin,*) + enddo + n = 22 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1E-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1E38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .EQ. 2) THEN + + DO iz = 1, nz + aa = 402.7/tlev(iz) + bb = exp(aa) + alpha(iz) = (bb - 1./bb) / (bb + 1./bb) + ENDDO - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1E38,0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP ENDIF *** quantum yield = 1 (Calvert and Pitts, 1966) qy = 1. DO iw = 1, nw-1 + + if(mabs .eq. 1) sig = yg(iw) + DO iz = 1, nz - sq(j,iz,iw) = qy * yg(iw) + + if (mabs .eq. 2) then + + ex1 = 27.3 * exp(-99.0 * alpha(iz) * (log(329.5/wc(iw)))**2) + ex2 = 0.932 * exp(-91.5 * alpha(iz) * (log(406.5/wc(iw)))**2) + sig = 1e-20 * alpha(iz)**0.5 * (ex1 + ex2) + + ENDIF + + sq(j,iz,iw) = qy * sig + ENDDO ENDDO + tpflag(j) = 1 + RETURN END *=============================================================================* - SUBROUTINE r101(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + + SUBROUTINE r101(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -30626,7 +31180,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -30638,9 +31192,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -30690,6 +31242,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -30710,49 +31263,98 @@ c INCLUDE 'params' REAL qy INTEGER ierr INTEGER iw + INTEGER mabs + real qy1, qy2, qy3 ************************* CH2(OH)CHO photolysis * 1: CH2(OH)CHO j = j+1 - jlabel(j) = 'CH2(OH)CHO -> Products' + jlabel(j) = 'HOCH2CHO -> CH2OH + HCO' + j = j+1 + jlabel(j) = 'HOCH2CHO -> CH3OH + CO' + j = j+1 + jlabel(j) = 'HOCH2CHO -> CH2CHO + OH' - OPEN(UNIT=kin,FILE='DATAJ1/CH2OHCHO/glycolaldehyde.abs', - $ STATUS='old') - DO i = 1, 15 - READ(kin,*) - ENDDO - n = 131 - DO i = 1, n - READ(kin,*) x(i), y(i) - ENDDO - CLOSE(kin) + mabs = 2 + + IF(mabs .EQ. 1) THEN + +*= Cross section from =* +*= The Atmospheric Chemistry of Glycolaldehyde, C. Bacher, G. S. Tyndall =* +*= and J. J. Orlando, J. Atmos. Chem., 39 (2001) 171-189. =* + + OPEN(UNIT=kin,FILE='DATAJ1/CH2OHCHO/glycolaldehyde.abs', + $ STATUS='old') + DO i = 1, 15 + READ(kin,*) + ENDDO + n = 131 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .EQ. 2) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/CH2OHCHO/glycolaldehyde_jpl11.abs', + $ STATUS='old') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 63 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) - CALL addpnt(x,y,kdata,n, 0.,0.) - CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) - CALL addpnt(x,y,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x,y,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP ENDIF * combine: - qy = 0.5 + qy1 = 0.83 + qy2 = 0.10 + qy3 = 0.07 DO iw = 1, nw - 1 DO i = 1, nz - sq(j,i,iw) = yg(iw) * qy + sq(j-2,i,iw) = yg(iw) * qy1 + sq(j-1,i,iw) = yg(iw) * qy2 + sq(j ,i,iw) = yg(iw) * qy3 ENDDO ENDDO + tpflag(j-2) = 0 + tpflag(j-1) = 0 + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r102(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r102(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -30792,7 +31394,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -30804,9 +31406,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -30856,6 +31456,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -30948,11 +31549,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r103(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r103(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -30995,7 +31599,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -31007,9 +31611,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -31059,6 +31661,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -31079,31 +31682,66 @@ c INCLUDE 'params' REAL qy INTEGER ierr INTEGER iw + INTEGER mabs ************************* CH3COCHCH2 photolysis j = j+1 jlabel(j) = 'CH3COCHCH2 -> Products' - OPEN(UNIT=kin,FILE='DATAJ1/ABS/methylvinylketone.abs', - $ STATUS='old') - DO i = 1, 9 - READ(kin,*) - ENDDO - n = 19682 - DO i = 1, n - READ(kin,*) x(i), y(i) - ENDDO - CLOSE(kin) +* mabs = 1: Schneider and moortgat +* mabs = 2: jpl 2011 + + mabs = 2 + + + IF(mabs .EQ. 1) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/MVK_schneider.abs', + $ STATUS='old') + DO i = 1, 9 + READ(kin,*) + ENDDO + n = 19682 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .EQ. 2) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/MVK_jpl11.abs', + $ STATUS='old') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 146 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) - CALL addpnt(x,y,kdata,n, 0.,0.) - CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) - CALL addpnt(x,y,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x,y,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP ENDIF * quantum yield from @@ -31121,12 +31759,15 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 2 + + RETURN END *=============================================================================* - SUBROUTINE r104(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r104(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -31162,7 +31803,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -31174,9 +31815,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -31226,6 +31865,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -31258,7 +31898,7 @@ c INCLUDE 'params' * cross section from * JPL 2006 (originally from Gierczak et al.) - OPEN(UNIT=kin,FILE='DATAJ1/ABS/Methacrolein_jpl2007.txt', + OPEN(UNIT=kin,FILE='DATAJ1/ABS/Methacrolein_jpl11.abs', $ STATUS='OLD') DO i = 1, 7 READ(kin,*) @@ -31291,11 +31931,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r105(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r105(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -31336,7 +31979,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -31348,9 +31991,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -31400,6 +32041,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -31419,36 +32061,69 @@ c INCLUDE 'params' REAL yg(kw) REAL qy INTEGER ierr - INTEGER iw + INTEGER iw, mabs ************************* CH3COCO(OH) photolysis j = j+1 jlabel(j) = 'CH3COCO(OH) -> Products' - OPEN(UNIT=kin,FILE='DATAJ1/CH3COCOOH/pyruvic_horowitz.abs', - $ STATUS='old') - DO i = 1, 8 - READ(kin,*) - ENDDO - n = 148 - DO i = 1, n - READ(kin,*) x(i), y(i) - y(i) = y(i) * 1.e-20 - ENDDO - CLOSE(kin) + mabs = 2 + +* mabs = 1: Horowitz et al. +* mabs = 2: JPL2011 + + IF (mabs .EQ. 1) THEN + + OPEN(UNIT=kin,FILE='DATAJ1/CH3COCOOH/pyruvic_horowitz.abs', + $ STATUS='old') + DO i = 1, 8 + READ(kin,*) + ENDDO + n = 148 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF (mabs .eq. 2) then + + OPEN(UNIT=kin,FILE='DATAJ1/CH3COCOOH/pyruvic_jpl11.abs', + $ STATUS='old') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 139 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) - CALL addpnt(x,y,kdata,n, 0.,0.) - CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) - CALL addpnt(x,y,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x,y,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP ENDIF -* quantum yield = 1 +* quantum yield = 1 (sum of all channels) qy = 1. @@ -31458,11 +32133,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r106(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r106(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -31503,7 +32181,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -31515,9 +32193,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -31567,6 +32243,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -31641,11 +32318,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r107(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r107(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -31686,7 +32366,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -31698,9 +32378,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -31750,6 +32428,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -31824,11 +32503,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 1 + + RETURN END *=============================================================================* - SUBROUTINE r108(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r108(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -31868,7 +32550,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -31880,9 +32562,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -31932,6 +32612,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -31971,11 +32652,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r109(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r109(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32015,7 +32699,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32027,9 +32711,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32079,6 +32761,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -32118,11 +32801,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r110(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r110(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32162,7 +32848,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32174,9 +32860,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32226,6 +32910,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -32265,11 +32950,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r111(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r111(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32307,7 +32995,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32319,9 +33007,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32371,6 +33057,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -32393,17 +33080,17 @@ c INCLUDE 'params' INTEGER iw ************************* ClOOCl photolysis -* from JPL-2002 +* from JPL-2011 j = j+1 jlabel(j) = 'ClOOCl -> Cl + ClOO' - OPEN(UNIT=kin,FILE='DATAJ1/ABS/CLOOCL_jpl02.abs', + OPEN(UNIT=kin,FILE='DATAJ1/ABS/CLOOCL_jpl11.abs', $ STATUS='old') - DO i = 1, 25 + DO i = 1, 3 READ(kin,*) ENDDO - n = 131 + n = 111 DO i = 1, n READ(kin,*) x(i), y(i) y(i) = y(i) * 1.e-20 @@ -32430,11 +33117,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r112(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r112(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32473,7 +33163,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32485,9 +33175,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32537,6 +33225,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -32556,7 +33245,7 @@ c INCLUDE 'params' REAL yg(kw) REAL qy INTEGER ierr - INTEGER iw + INTEGER iw, mabs ************************* CH2(OH)COCH3 photolysis * from Orlando et al. 1999 @@ -32566,28 +33255,60 @@ c INCLUDE 'params' j = j+1 jlabel(j) = 'CH2(OH)COCH3 -> CH2(OH)CO + CH3' - OPEN(UNIT=kin,FILE='DATAJ1/ABS/Hydroxyacetone.abs', - $ STATUS='old') - DO i = 1, 8 - READ(kin,*) - ENDDO - n = 101 - DO i = 1, n - READ(kin,*) x(i), y(i) - ENDDO - CLOSE(kin) +* mabs = 1: from Orlando et al. 1999 +* mabs = 2: from jpl 2011 + + mabs = 2 + + if (mabs.eq.1) then + OPEN(UNIT=kin,FILE='DATAJ1/ABS/Hydroxyacetone.abs', + $ STATUS='old') + DO i = 1, 8 + READ(kin,*) + ENDDO + n = 101 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + ELSEIF(mabs .eq. 2) then + OPEN(UNIT=kin,FILE='DATAJ1/ABS/Hydroxyacetone_jpl11.abs', + $ STATUS='old') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 96 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) - CALL addpnt(x,y,kdata,n, 0.,0.) - CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) - CALL addpnt(x,y,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x,y,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP ENDIF -* Total quantum yield = 0.65, equal for each of the two channels +* Total quantum yield = 0.65, from Orlando et al. Assume equal for each of +* the two channels qy = 0.325 @@ -32598,11 +33319,15 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j-1) = 0 + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r113(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r113(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32637,7 +33362,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32649,9 +33374,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32701,6 +33424,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -32733,11 +33457,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r114(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r114(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32772,7 +33499,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32784,9 +33511,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32837,6 +33562,7 @@ c INCLUDE 'params' INTEGER j CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * data arrays @@ -32880,11 +33606,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r115(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r115(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -32917,7 +33646,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -32929,9 +33658,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -32982,6 +33709,7 @@ c INCLUDE 'params' INTEGER j CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * data arrays @@ -33035,10 +33763,15 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r118(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + + SUBROUTINE r118(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + *-----------------------------------------------------------------------------* *= NO3-(aq) photolysis for snow simulations =* *= a) NO3-(aq) + hv -> NO2 + O- =* @@ -33063,7 +33796,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -33075,9 +33808,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -33120,6 +33851,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -33127,21 +33859,24 @@ c INCLUDE 'params' * data arrays INTEGER kdata - PARAMETER(kdata=30) + PARAMETER(kdata=50) REAL x1(kdata),x2(kdata) REAL y1(kdata),y2(kdata) ! y1 = 20'C, y2 = -20'C * local - REAL yg(kw),yg1(kw),yg2(kw) - REAL qy1(kz), qy2 + REAL yg(kw),yg1(kw),yg2(kw), dum + REAL qy1(kz), qy2, qy3 INTEGER i, iw, n, n1, n2, idum, ierr, iz + integer mabs *** NO3-(aq) quantum yields * O- (OH and NO2) production j = j + 1 jlabel(j) = 'NO3-(aq) -> NO2(aq) + O-' DO iz = 1, nz + * qy1(iz) = 9.3e-3 ! Warneck & Wurzinger 1988 + qy1(iz) = exp(-2400./tlev(iz) + 3.6) ! Chu & Anastasio, 2003 ENDDO @@ -33150,60 +33885,107 @@ c INCLUDE 'params' jlabel(j) = 'NO3-(aq) -> NO2-(aq) + O(3P)' qy2 = 1.1e-3 ! Warneck & Wurzinger '88 +* NO2- with qy=1 -*** NO3-(aq) cross sections from Burley & Johnston (header lines = 24, data lines = 19) - OPEN(kin,FILE='DATAJ1/ABS/NO3-_BJ92.abs',STATUS='OLD') + j = j + 1 + jlabel(j) = 'NO3-(aq) with qy=1' + qy3 = 1. - n = 24 - DO i = 1, n - READ(kin,*) - ENDDO - n = 19 - DO i = 1, n - READ(kin,*) x1(i), y1(i), y2(i) - x2(i) = x1(i) - y1(i)=y1(i)*1e-20 - y2(i)=y2(i)*1e-20 - ENDDO - CLOSE(kin) - n1 = n - CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n1, 0.,0.) - CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n1, 1E38,0.) - CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP - ENDIF +* options for cross section - n2 = n - CALL addpnt(x2,y2,kdata,n2,x2(1)*(1.-deltax),0.) - CALL addpnt(x2,y2,kdata,n2, 0.,0.) - CALL addpnt(x2,y2,kdata,n2,x2(n2)*(1.+deltax),0.) - CALL addpnt(x2,y2,kdata,n2, 1E38,0.) - CALL inter2(nw,wl,yg2,n2,x2,y2,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP - ENDIF + mabs = 2 + + if (mabs .eq. 1) then +*** NO3-(aq) cross sections from Burley & Johnston (header lines = 24, +* data lines = 19) + OPEN(kin,FILE='DATAJ1/ABS/NO3-_BJ92.abs',STATUS='OLD') + + n = 24 + DO i = 1, n + READ(kin,*) + ENDDO + n = 19 + DO i = 1, n + READ(kin,*) x1(i), y1(i), y2(i) + x2(i) = x1(i) + y1(i)=y1(i)*1e-20 + y2(i)=y2(i)*1e-20 + ENDDO + CLOSE(kin) + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1E38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + n2 = n + CALL addpnt(x2,y2,kdata,n2,x2(1)*(1.-deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 0.,0.) + CALL addpnt(x2,y2,kdata,n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 1E38,0.) + CALL inter2(nw,wl,yg2,n2,x2,y2,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + elseif (mabs .eq. 2) then + +*** NO3-(aq) cross sections from Chu and Anastasio 2003: +* convert from molar abs log10 to cm2 per molec + + OPEN(kin,FILE='DATAJ1/ABS/NO3-_CA03.abs',STATUS='OLD') + n = 7 + do i = 1, n + read(kin,*) + enddo + n = 43 + DO i = 1, n + read(kin,*) x1(i), y1(i), dum, dum, dum, dum + y1(i) = y1(i) * 3.82e-21 + enddo + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1E38,0.) + CALL inter2(nw,wl,yg2,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + endif DO iw = 1, nw-1 ! yg(iw)=yg1(iw) ! for 20'C yg(iw)=yg2(iw) ! for -20'C DO iz = 1, nz - sq(j-1,iz,iw) = qy1(iz)*yg(iw) - sq(j,iz,iw) = qy2*yg(iw) + + sq(j-2,iz,iw) = qy1(iz)*yg(iw) + sq(j-1,iz,iw) = qy2*yg(iw) + sq(j, iz,iw) = qy3*yg(iw) + ENDDO ENDDO - END +* chu and anastasio qy is T dependent: -*=============================================================================* + tpflag(j-2) = 1 + tpflag(j-1) = 1 + tpflag(j) = 1 + + RETURN + END *=============================================================================* - SUBROUTINE r119(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r119(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -33242,7 +34024,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -33254,9 +34036,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -33306,6 +34086,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -33340,7 +34121,7 @@ c INCLUDE 'params' ENDDO n = 96 DO i = 1, n - READ(kin,*) x(i), dum, dum, y(i), dum + READ(kin,*) x(i), dum, y(i), dum, dum y(i) = y(i) * 1.e-20 ENDDO CLOSE(kin) @@ -33372,10 +34153,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 2 + + RETURN END + *=============================================================================* - SUBROUTINE r120(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r120(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -33411,7 +34196,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -33423,9 +34208,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -33475,6 +34258,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -33508,7 +34292,7 @@ c INCLUDE 'params' * cross section from -* JPL 2006 (originally from Harwood et al. 2003) +* JPL 2011 (originally from Harwood et al. 2003) OPEN(UNIT=kin,FILE='DATAJ1/ABS/PPN_Harwood.txt',STATUS='OLD') DO i = 1, 10 @@ -33560,10 +34344,15 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j-1) = 0 + tpflag(j) = 0 + + RETURN END + *=============================================================================* - SUBROUTINE r121(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r121(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -33600,7 +34389,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -33612,9 +34401,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -33664,6 +34451,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -33730,10 +34518,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END + *=============================================================================* - SUBROUTINE r122(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r122(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -33770,7 +34562,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -33782,9 +34574,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -33834,6 +34624,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -33906,11 +34697,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 2 + + RETURN END *=============================================================================* - SUBROUTINE r123(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r123(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -33947,7 +34741,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -33959,9 +34753,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -34011,6 +34803,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -34075,11 +34868,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r124(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r124(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -34116,7 +34912,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -34128,9 +34924,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -34180,6 +34974,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -34241,11 +35036,14 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END *=============================================================================* - SUBROUTINE r125(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r125(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -34281,7 +35079,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -34293,9 +35091,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -34345,6 +35141,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -34453,16 +35250,15 @@ c INCLUDE 'params' ENDDO ENDDO -c do iw = 1, nw-1 -c write(33,*) iw, wl(iw), sq(j,1,iw) -c write(33,*) iw, wl(iw+1), sq(j,1,iw) -c enddo + tpflag(j-1) = 1 + tpflag(j) = 1 + RETURN END *=============================================================================* - SUBROUTINE r126(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE r126(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* @@ -34498,7 +35294,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -34510,9 +35306,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -34562,6 +35356,7 @@ c INCLUDE 'params' * weighting functions CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) REAL sq(kj,kz,kw) * input/output: @@ -34583,6 +35378,7 @@ c INCLUDE 'params' REAL yg(kw) REAL qy + integer mabs **************** ClNO2 photodissociation @@ -34590,28 +35386,56 @@ c INCLUDE 'params' jlabel(j) = 'ClNO2 -> Cl + NO2' * cross section from -* JPL 2006 +* mabs = 1: JPL 2006, same as JPL-2011 +* mabs = 2: IUPAC 2007 - OPEN(UNIT=kin,FILE='DATAJ1/ABS/ClNO2.abs',STATUS='OLD') - DO i = 1, 2 - READ(kin,*) - ENDDO - n = 26 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i) * 1.E-20 - ENDDO - CLOSE(kin) - - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, jlabel(j) - STOP - ENDIF + mabs = 1 + if(mabs.eq.1) then + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/ClNO2.abs',STATUS='OLD') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 26 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.E-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + elseif (mabs .eq. 2) then + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/ClNO2_iupac.abs',STATUS='OLD') + DO i = 1, 6 + READ(kin,*) + ENDDO + n = 17 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + endif * quantum yields assumed unity @@ -34623,41 +35447,39 @@ c INCLUDE 'params' ENDDO ENDDO + tpflag(j) = 0 + + RETURN END -* This file contains the following subroutine, related to setting up the -* vertical profiles of atmospheric variables -* setaer - *=============================================================================* - SUBROUTINE setaer(ipbl, zpbl, aod330, - $ tau550, ssaaer, alpha, - $ nz, z, nw, wl, - $ dtaer, omaer, gaer, kout ) + SUBROUTINE r127(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set up an altitude profile of aerosols, and corresponding absorption =* -*= optical depths, single scattering albedo, and asymmetry factor. =* -*= Single scattering albedo and asymmetry factor can be selected for each =* -*= input aerosol layer (do not have to correspond to working altitude =* -*= grid). See loop 27. =* +*= Provide product (cross section) x (quantum yield) for nitrosyl bromide =* +*= BrNO -> Br + NO =* +*= =* +*= Cross section: from JPL 2006 =* +*= Quantum yield: Assumed to be unity =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= Z - REAL, specified altitude working grid (km) (I)=* *= NW - INTEGER, number of specified intervals + 1 in working (I)=* *= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= DTAER - REAL, optical depth due to absorption by aerosols at each (O)=* -*= altitude and wavelength =* -*= OMAER - REAL, single scattering albedo due to aerosols at each (O)=* -*= defined altitude and wavelength =* -*= GAER - REAL, aerosol asymmetry factor at each defined altitude and (O)=* -*= wavelength =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -34666,7 +35488,7 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output * PARAMETER(kout=6) * input @@ -34680,9 +35502,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -34715,206 +35535,129 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=51) - -* input: +* input - REAL wl(kw) - REAL z(kz) - INTEGER nz INTEGER nw + REAL wl(kw), wc(kw) - REAL tau550 - REAL ssaaer, alpha - -* output: (on converted grid) - REAL dtaer(kz,kw), omaer(kz,kw), gaer(kz,kw) - -* local: - REAL zd(kdata), aer(kdata) - REAL cd(kdata), omd(kdata), gd(kdata) - REAL womd(kdata), wgd(kdata) - - REAL cz(kz) - REAL omz(kz) - REAL gz(kz) - - REAL colold - - REAL wc, wscale - INTEGER i, iw, nd - - REAL fsum - EXTERNAL fsum - - REAL zpbl - INTEGER ipbl - - REAL aod330 - - REAL aodw(kw), ssaw(kw) - REAL fract(kz) + INTEGER nz -*_______________________________________________________________________ + REAL tlev(kz) + REAL airden(kz) -* Aerosol data from Elterman (1968) -* These are vertical optical depths per km, in 1 km -* intervals from 0 km to 50 km, at 340 nm. -* This is one option. User can specify different data set. +* weighting functions - DATA aer/ - 1 2.40E-01,1.06E-01,4.56E-02,1.91E-02,1.01E-02,7.63E-03, - 2 5.38E-03,5.00E-03,5.15E-03,4.94E-03,4.82E-03,4.51E-03, - 3 4.74E-03,4.37E-03,4.28E-03,4.03E-03,3.83E-03,3.78E-03, - 4 3.88E-03,3.08E-03,2.26E-03,1.64E-03,1.23E-03,9.45E-04, - 5 7.49E-04,6.30E-04,5.50E-04,4.21E-04,3.22E-04,2.48E-04, - 6 1.90E-04,1.45E-04,1.11E-04,8.51E-05,6.52E-05,5.00E-05, - 7 3.83E-05,2.93E-05,2.25E-05,1.72E-05,1.32E-05,1.01E-05, - 8 7.72E-06,5.91E-06,4.53E-06,3.46E-06,2.66E-06,2.04E-06, - 9 1.56E-06,1.19E-06,9.14E-07/ -*_______________________________________________________________________ + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) +* input/output: -* Altitudes corresponding to Elterman profile, from bottom to top: + INTEGER j - WRITE(kout,*)'aerosols: Elterman (1968) continental profile' - nd = 51 - DO 22, i = 1, nd - zd(i) = FLOAT(i-1) - 22 CONTINUE +* data arrays -* assume these are point values (at each level), so find column -* increments + INTEGER kdata + PARAMETER(kdata=150) - DO 27, i = 1, nd - 1 - cd(i) = (aer(i+1) + aer(i)) / 2. - omd(i) = ssaaer - gd(i) = .61 - 27 CONTINUE + INTEGER iw + INTEGER i, n + REAL x1(kdata) + REAL y1(kdata) + INTEGER ierr -*********** end data input. +* local -* Compute integrals and averages over grid layers: -* for g and omega, use averages weighted by optical depth + REAL yg(kw) + REAL qy - DO 29, i = 1, nd-1 - womd(i) = omd(i) * cd(i) - wgd(i) = gd(i) * cd(i) - 29 CONTINUE - CALL inter3(nz,z,cz, nd,zd,cd, 1) - CALL inter3(nz,z,omz, nd, zd,womd, 1) - CALL inter3(nz,z,gz , nd, zd,wgd, 1) - DO 30, i = 1, nz-1 - IF (cz(i) .GT. 0.) THEN - omz(i) = omz(i)/cz(i) - gz(i) = gz(i) /cz(i) - ELSE - omz(i) = 1. - gz(i) = 0. - ENDIF - 30 CONTINUE +******************** BrNO photodissociation -* old column at 340 nm -* (minimum value is pzero = 10./largest) + j = j+1 + jlabel(j) = 'BrNO -> Br + NO' - colold = MAX(fsum(nz-1,cz),pzero) +* cross section from +* JPL 2006 -* scale with new column tau at 550 nm + OPEN(UNIT=kin,FILE='DATAJ1/ABS/BrNO.abs',STATUS='OLD') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 27 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + ENDDO + CLOSE(kin) - IF(tau550 .GT. nzero) THEN - DO i = 1, nz-1 - cz(i) = cz(i) * (tau550/colold) * (550./340.)**alpha - ENDDO + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP ENDIF -* assign at all wavelengths -* (can move wavelength loop outside if want to vary with wavelength) - - DO 50, iw = 1, nw - 1 - wc = (wl(iw)+wl(iw+1))/2. - -* Elterman's data are for 340 nm, so assume optical depth scales -* inversely with first power of wavelength. - - wscale = (340./wc)**alpha - -* optical depths: - - DO 40, i = 1, nz - 1 - dtaer(i,iw) = cz(i) * wscale - omaer(i,iw) = omz(i) - gaer(i,iw) = gz(i) - 40 CONTINUE - 50 CONTINUE - -*! overwrite for pbl: - - IF(ipbl .GT. 0) THEN - write (*,*) 'pbl aerosols, aod330 = ', aod330 - -* create wavelength-dependent optical depth and single scattering albedo: - - DO iw = 1, nw-1 - wc = (wl(iw)+wl(iw+1))/2. - aodw(iw) = aod330*(wc/330.)**(-1.0) - IF(wc .LT. 400.) THEN - ssaw(iw) = 0.6 - ELSE - ssaw(iw) = 0.9 - ENDIF - ENDDO +* quantum yields assumed unity -* divide aod among pbl layers, overwrite Elterman profile in pbl + qy = 1. - DO i = 1, ipbl - fract(i) = (z(i+1) - z(i))/zpbl - ENDDO - - DO iw = 1, nw-1 - DO i = 1, ipbl - dtaer(i, iw) = aodw(iw) * fract(i) - omaer(i,iw) = ssaw(iw) - ENDDO - ENDDO + DO iw = 1, nw-1 + DO i = 1, nz + sq(j,i,iw) = qy * yg(iw) + ENDDO + ENDDO - ENDIF -*_______________________________________________________________________ + tpflag(j) = 0 RETURN END *=============================================================================* - SUBROUTINE setalb(albnew,nw,wl,albedo) + SUBROUTINE r128(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set the albedo of the surface. The albedo is assumed to be Lambertian, =* -*= i.e., the reflected light is isotropic, and independent of direction =* -*= of incidence of light. Albedo can be chosen to be wavelength dependent. =* +*= Provide product (cross section) x (quantum yield) for bromine nitritee =* +*= BrNO2 -> Br + NO2 =* +*= =* +*= Cross section: from JPL 2006 =* +*= Quantum yield: Assumed to be unity =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NW - INTEGER, number of specified intervals + 1 in working (I)=* -*= wavelength grid =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= ALBEDO - REAL, surface albedo at each specified wavelength (O)=* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE + c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -34926,9 +35669,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -34961,72 +35702,129 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) -* input: (wavelength working grid data) +* input INTEGER nw - REAL wl(kw) + REAL wl(kw), wc(kw) - REAL albnew + INTEGER nz -* output: - REAL albedo(kw) + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=150) -* local: INTEGER iw -*_______________________________________________________________________ + INTEGER i, n + REAL x1(kdata) + REAL y1(kdata) + INTEGER ierr - DO 10, iw = 1, nw - 1 - albedo(iw) = albnew - 10 CONTINUE +* local -* alternatively, can input wavelenght-dependent values if avaialble. -*_______________________________________________________________________ + REAL yg(kw) + REAL qy + +******************** BrNO2 photodissociation + + j = j+1 + jlabel(j) = 'BrNO2 -> Br + NO2' + +* cross section from +* IUPAC (vol III) 2007 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/BrNO2.abs',STATUS='OLD') + DO i = 1, 6 + READ(kin,*) + ENDDO + n = 54 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + sq(j,i,iw) = qy * yg(iw) + ENDDO + ENDDO + + tpflag(j) = 0 RETURN END -*======================================================================* - - SUBROUTINE setcld(nz,z,nw,wl, - $ lwc, nlevel, - $ dtcld,omcld,gcld) +*=============================================================================* + SUBROUTINE r129(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set cloud properties for each specified altitude layer. Properties =* -*= may be wavelength dependent. =* -*= Assumes horizontally infinite homogeneous cloud layers. +*= Provide product (cross section) x (quantum yield) for bromine nitrite =* +*= BrONO -> Br + NO2 =* +*= BrONO -> BrO + NO =* +*= =* +*= Cross section: from IUPAC (vol.3) =* +*= Quantum yield: Assumed to be 0.5 for each channel =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= Z - REAL, specified altitude working grid (km) (I)=* -*= NW - INTEGER, number of specified intervals + 1 in working (I)=* -*= wavelength grid =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= DTCLD - REAL, optical depth due to absorption by clouds at each (O)=* -*= altitude and wavelength =* -*= OMCLD - REAL, single scattering albedo due to clouds at each (O)=* -*= defined altitude and wavelength =* -*= GCLD - REAL, cloud asymmetry factor at each defined altitude and (O)=* -*= wavelength =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE -c INCLUDE 'params' +C INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -35038,9 +35836,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -35073,172 +35869,121 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=151) +* input -***** input + INTEGER nw + REAL wl(kw), wc(kw) -* (grids) - REAL wl(kw) - REAL z(kz) INTEGER nz - INTEGER nw -* new total cloud optical depth: + REAL tlev(kz) + REAL airden(kz) - REAL taucld -C REAL zbase, ztop -C LWC is the liquid water content (!! kg/m3 !!) on the calling model -C grid (which has NLEVEL points: Z(1:NLEVEL) = AZ(*) - REAL lwc(*) - INTEGER nlevel +* weighting functions + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) -***** Output: +* input/output: - REAL dtcld(kz,kw), omcld(kz,kw), gcld(kz,kw) + INTEGER j -***** specified default data: +* data arrays - REAL zd(kdata), cd(kdata), omd(kdata), gd(kdata) - REAL womd(kdata), wgd(kdata) - REAL cldold + INTEGER kdata + PARAMETER(kdata=150) -* other: + INTEGER iw + INTEGER i, n + REAL x1(kdata) + REAL y1(kdata) + INTEGER ierr - REAL cz(kz) - REAL omz(kz) - REAL gz(kz) - INTEGER i, iw, n - REAL scale +* local -* External functions: - REAL fsum - EXTERNAL fsum -*_______________________________________________________________________ + REAL yg(kw) + REAL qy1, qy2 -* Set up clouds: -* All clouds are assumed to be infinite homogeneous layers -* Can have different clouds at different altitudes. -* If multiple cloud layers are specified, non-cloudy layers -* between them (if any) must be assigned zero optical depth. -* Set cloud optical properties: -* cd(i) = optical depth of i_th cloudy layer -* omd(i) = singel scattering albedo of i_th cloudy layer -* gd(i) = asymmetry factorof i_th cloudy layer -* Cloud top and bottom can be set to any height zd(i), but if they don't -* match the z-grid (see subroutine gridz.f), they will be interpolated to -* the z-grid. +******************** BrONO photodissociation -* Example: set two separate cloudy layers: -* cloud 1: -* base = 4 km -* top = 7 km -* optical depth = 20. (6.67 per km) -* single scattering albedo = 0.9999 -* asymmetry factor = 0.85 -* cloud 2: -* base = 9 km -* top = 11 km -* optical depth = 5. (2.50 per km) -* single scattering albedo = 0.99999 -* asymmetry factor = 0.85 + j = j+1 + jlabel(j) = 'BrONO -> Br + NO2' + j = j+1 + jlabel(j) = 'BrONO -> BrO + NO' - n = nlevel + 1 - if (n .gt. kdata) stop "SETCLD: not enough memory: KDATA" - zd(1) = 0. - do 110, i = 2, n - zd(i) = 0.5*( z(i-1) + z(i) ) -110 continue +* cross section from +* IUPAC (vol III) 2007 -C calculate cloud optical properties - do 120, i = 1, nlevel -C -C reference: Fouquart et al., Rev. Geophys., 1990 -C TAU = 3/2 LWC*DZ / (RHOWATER * Reff) -C RHOWATER = 1E3 kg/m3 -C Reff = (11 w + 4) 1E-6 -C w = LWC * 1E+3 (in g/cm3, since LWC is given in kg/m3) -C - cd(i) = 1.5 * ( lwc(i) * 1E3*(zd(i+1) - zd(i)) ) - + / ( 1E3 * (11.*lwc(i)*1E+3+4.) * 1E-6) - omd(i) = .9999 - gd(i) = .85 -C print '(A,I5,99E12.5)', "I,TAU,LWC,REFF(um)" -C + , i, cd(i), lwc(i) -C + , ((11.*lwc(i)*1E+3+4.)) -120 continue + OPEN(UNIT=kin,FILE='DATAJ1/ABS/BrONO.abs',STATUS='OLD') + DO i = 1, 8 + READ(kin,*) + ENDDO + n = 32 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + ENDDO + CLOSE(kin) + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF -****************** -* compute integrals and averages over grid layers: -* for g and omega, use averages weighted by optical depth +* quantum yields assumed unity - DO 10, i = 1, n-1 - womd(i) = omd(i) * cd(i) - wgd(i) = gd(i) * cd(i) - 10 CONTINUE - CALL inter3(nz,z,cz, n, zd,cd, 0) - CALL inter3(nz,z,omz, n, zd,womd, 0) - CALL inter3(nz,z,gz , n, zd,wgd, 0) + qy1 = 0.5 + qy2 = 0.5 - DO 15, i = 1, nz-1 - IF (cz(i) .GT. 0.) THEN - omz(i) = omz(i)/cz(i) - gz(i) = gz(i) /cz(i) - ELSE - omz(i) = 1. - gz(i) = 0. - ENDIF - 15 CONTINUE - -* assign at all wavelengths -* (can move wavelength loop outside if want to vary with wavelength) + DO iw = 1, nw-1 + DO i = 1, nz + sq(j-1,i,iw) = qy1 * yg(iw) + sq(j,i,iw) = qy2 * yg(iw) + ENDDO + ENDDO - DO 20, iw = 1, nw-1 - DO 25, i = 1, nz-1 - dtcld(i,iw) = cz(i) - omcld(i,iw) = omz(i) - gcld (i,iw) = gz(i) - 25 CONTINUE - 20 CONTINUE -*_______________________________________________________________________ + tpflag(j-1) = 0 + tpflag(j) = 0 RETURN END + *=============================================================================* - SUBROUTINE setno2(ipbl, zpbl, xpbl, - $ no2new, nz, z, nw, wl, no2xs, - $ tlay, dcol, - $ dtno2) + SUBROUTINE r130(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set up an altitude profile of NO2 molecules, and corresponding absorption=* -*= optical depths. Subroutine includes a shape-conserving scaling method =* -*= that allows scaling of the entire profile to a given overhead NO2 =* -*= column amount. =* +*= Provide product (cross section) x (quantum yield) for +*= HOCl -> HO + Cl =* +*= Cross section: from IUPAC (vol.3) =* +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NO2NEW - REAL, overhead NO2 column amount (molec/cm^2) to which (I)=* -*= profile should be scaled. If NO2NEW < 0, no scaling is done =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= Z - REAL, specified altitude working grid (km) (I)=* *= NW - INTEGER, number of specified intervals + 1 in working (I)=* *= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= NO2XS - REAL, molecular absoprtion cross section (cm^2) of O2 at (I)=* -*= each specified wavelength =* -*= TLAY - REAL, temperature (K) at each specified altitude layer (I)=* -*= DTNO2 - REAL, optical depth due to NO2 absorption at each (O)=* -*= specified altitude at each specified wavelength =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -35247,9 +35992,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -35261,9 +36006,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -35296,167 +36039,116 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=51) - -******** -* input: -******** - -* grids: +* input - REAL wl(kw) - REAL z(kz) INTEGER nw - INTEGER nz - REAL no2new - -* mid-layer temperature, layer air column - - REAL tlay(kz), dcol(kz) - -******** -* output: -******** - - REAL dtno2(kz,kw) - -******** -* local: -******** - -* absorption cross sections - - REAL no2xs(kz,kw) - REAL cz(kz) - -* nitrogen dioxide profile data: - - REAL zd(kdata), no2(kdata) - REAL cd(kdata) - REAL hscale - REAL colold, scale - REAL sno2 - REAL zpbl, xpbl - INTEGER ipbl - -* other: - - INTEGER i, l, nd - - -******** -* External functions: -******** - - REAL fsum - EXTERNAL fsum + REAL wl(kw), wc(kw) -*_______________________________________________________________________ -* Data input: + INTEGER nz -* Example: set to 1 ppb in lowest 1 km, set to zero above that. -* - do by specifying concentration at 3 altitudes. + REAL tlev(kz) + REAL airden(kz) - nd = 3 - zd(1) = 0. - no2(1) = 1. * 2.69e10 +* weighting functions - zd(2) = 1. - no2(2) = 1. * 2.69e10 + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) - zd(3) = zd(2)* 1.000001 - no2(3) = 10./largest +* input/output: -* compute column increments (alternatively, can specify these directly) + INTEGER j - DO 11, i = 1, nd - 1 - cd(i) = (no2(i+1)+no2(i)) * 1.E5 * (zd(i+1)-zd(i)) / 2. - 11 CONTINUE +* data arrays -* Include exponential tail integral from top level to infinity. -* fold tail integral into top layer -* specify scale height near top of data (use ozone value) + INTEGER kdata + PARAMETER(kdata=150) - hscale = 4.50e5 - cd(nd-1) = cd(nd-1) + hscale * no2(nd) + INTEGER iw + INTEGER i, n + REAL x1(kdata) + REAL y1(kdata) + INTEGER ierr -*********** -*********** end data input. +* local -* Compute column increments and total column on standard z-grid. + REAL yg(kw) + REAL qy - CALL inter3(nz,z,cz, nd,zd,cd, 1) +******************** HOCl photodissociation -**** Scaling of vertical profile by ratio of new to old column: -* If old column is near zero (less than 1 molec cm-2), -* use constant mixing ratio profile (nominal 1 ppt before scaling) -* to avoid numerical problems when scaling. + j = j + 1 + jlabel(j) = 'HOCl -> HO + Cl' - IF(fsum(nz-1,cz) .LT. 1.) THEN - DO i = 1, nz-1 - cz(i) = 1.E-12 * dcol(i) - ENDDO - ENDIF - colold = fsum(nz-1, cz) - scale = 2.687e16 * no2new / colold +* cross section from +* IUPAC (vol III) 2007 - DO i = 1, nz-1 - cz(i) = cz(i) * scale + OPEN(UNIT=kin,FILE='DATAJ1/ABS/HOCl.abs',STATUS='OLD') + DO i = 1, 7 + READ(kin,*) + ENDDO + n = 111 + DO i = 1, n + READ(kin,*) x1(i), y1(i) ENDDO + CLOSE(kin) -*! overwrite for specified pbl height + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - IF(ipbl .GT. 0) THEN - write(*,*) 'pbl NO2 = ', xpbl, ' ppb' +* quantum yields assumed unity - DO i = 1, nz-1 - IF (i .LE. ipbl) THEN - cz(i) = xpbl*1.E-9 * dcol(i) - ELSE - cz(i) = 0. - ENDIF - ENDDO - ENDIF + qy = 1 -************************************ -* calculate optical depth for each layer. Output: dtno2(kz,kw) + DO iw = 1, nw-1 + DO i = 1, nz + sq(j,i,iw) = qy * yg(iw) + ENDDO + ENDDO -98 continue - DO 20, l = 1, nw-1 - DO 10, i = 1, nz-1 - dtno2(i,l) = cz(i)*no2xs(i,l) - 10 CONTINUE - 20 CONTINUE -*_______________________________________________________________________ + tpflag(j) = 0 RETURN END + *=============================================================================* - SUBROUTINE seto2(nz, z, nw, wl, cz, o2xs1, dto2) + SUBROUTINE r131(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set up an altitude profile of air molecules. Subroutine includes a =* -*= shape-conserving scaling method that allows scaling of the entire =* -*= profile to a given sea-level pressure. =* +*= Provide product (cross section) x (quantum yield) for +*= NOCl -> NO + Cl =* +*= Cross section: from IUPAC (vol.3) =* +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= Z - REAL, specified altitude working grid (km) (I)=* -*= NW - INTEGER, number of specified intervals + 1 in working (I)=* -*= wavelength grid =* -*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* -*= working wavelength grid =* -*= and each specified wavelength =* -*= CZ - REAL, number of air molecules per cm^2 at each specified (O)=* -*= altitude layer =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -35465,9 +36157,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -35479,9 +36171,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -35514,90 +36204,235 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) -* input: (grids) +* input - REAL wl(kw) - REAL z(kz) - INTEGER iw, nw - INTEGER iz, nz - REAL cz(kz) - REAL o2xs1(kw) + INTEGER nw + REAL wl(kw), wc(kw) -* output: -* O2 absorption optical depth per layer at each wavelength + INTEGER nz - REAL dto2(kz,kw) + REAL tlev(kz) + REAL airden(kz) -*_______________________________________________________________________ -* Assumes that O2 = 20.95 % of air density. If desire different O2 -* profile (e.g. for upper atmosphere) then can load it here. +* weighting functions - DO iz = 1, nz - DO iw =1, nw - 1 - dto2(iz,iw) = 0.2095 * cz(iz) * o2xs1(iw) - ENDDO + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=150) + + INTEGER iw + INTEGER i, n, ii + REAL x1(kdata), y1(kdata) + integer nn + REAL x223(kdata),x243(kdata),x263(kdata),x298(kdata), + $ x323(kdata), x343(kdata) + REAL y223(kdata),y243(kdata),y263(kdata),y298(kdata), + $ y323(kdata), y343(kdata) + INTEGER ierr + +* local + + REAL yg223(kw),yg243(kw),yg263(kw),yg298(kw), + $ yg323(kw), yg343(kw) + REAL qy, sig + +******************** NOCl photodissociation + + j = j + 1 + jlabel(j) = 'NOCl -> NO + Cl' + +* cross section from +* IUPAC (vol III) 2007 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/NOCl.abs',STATUS='OLD') + DO i = 1, 7 + READ(kin,*) ENDDO + n = 80 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y223(i) = y1(i) + y243(i) = y1(i) + y263(i) = y1(i) + y298(i) = y1(i) + y323(i) = y1(i) + y343(i) = y1(i) + + x223(i) = x1(i) + x243(i) = x1(i) + x263(i) = x1(i) + x298(i) = x1(i) + x323(i) = x1(i) + x343(i) = x1(i) + + ENDDO + READ(kin,*) + n = 61 + do i = 1, n + ii = i + 80 + read(kin,*) x1(ii), y223(ii), y243(ii), y263(ii), + $ y298(ii), y323(ii), y343(ii) -*_______________________________________________________________________ + x223(ii) = x1(ii) + x243(ii) = x1(ii) + x263(ii) = x1(ii) + x298(ii) = x1(ii) + x323(ii) = x1(ii) + x343(ii) = x1(ii) + + enddo + n = ii + CLOSE(kin) + + nn = n + CALL addpnt(x223,y223,kdata,nn,x223(1)*(1.-deltax),0.) + CALL addpnt(x223,y223,kdata,nn, 0.,0.) + CALL addpnt(x223,y223,kdata,nn,x223(nn)*(1.+deltax),0.) + CALL addpnt(x223,y223,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg223,nn,x223,y223,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + nn = n + CALL addpnt(x243,y243,kdata,nn,x243(1)*(1.-deltax),0.) + CALL addpnt(x243,y243,kdata,nn, 0.,0.) + CALL addpnt(x243,y243,kdata,nn,x243(nn)*(1.+deltax),0.) + CALL addpnt(x243,y243,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg243,nn,x243,y243,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + nn = n + CALL addpnt(x263,y263,kdata,nn,x263(1)*(1.-deltax),0.) + CALL addpnt(x263,y263,kdata,nn, 0.,0.) + CALL addpnt(x263,y263,kdata,nn,x263(nn)*(1.+deltax),0.) + CALL addpnt(x263,y263,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg263,nn,x263,y263,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + nn = n + CALL addpnt(x298,y298,kdata,nn,x298(1)*(1.-deltax),0.) + CALL addpnt(x298,y298,kdata,nn, 0.,0.) + CALL addpnt(x298,y298,kdata,nn,x298(nn)*(1.+deltax),0.) + CALL addpnt(x298,y298,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg298,nn,x298,y298,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + nn = n + CALL addpnt(x323,y323,kdata,nn,x323(1)*(1.-deltax),0.) + CALL addpnt(x323,y323,kdata,nn, 0.,0.) + CALL addpnt(x323,y323,kdata,nn,x323(nn)*(1.+deltax),0.) + CALL addpnt(x323,y323,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg323,nn,x323,y323,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + nn = n + CALL addpnt(x343,y343,kdata,nn,x343(1)*(1.-deltax),0.) + CALL addpnt(x343,y343,kdata,nn, 0.,0.) + CALL addpnt(x343,y343,kdata,nn,x343(nn)*(1.+deltax),0.) + CALL addpnt(x343,y343,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg343,nn,x343,y343,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 1 + sig = 0. + + DO iw = 1, nw-1 + DO i = 1, nz + + if(tlev(i) .le. 223.) then + sig = yg223(iw) + + elseif (tlev(i) .gt. 223. .and. tlev(i) .le. 243.) then + sig = yg223(iw) + + $ (yg243(iw) - yg223(iw))*(tlev(i) - 223.)/20. + + elseif (tlev(i) .gt. 243. .and. tlev(i) .le. 263.) then + sig = yg243(iw) + + $ (yg263(iw) - yg243(iw))*(tlev(i) - 243.)/20. + + elseif (tlev(i) .gt. 263. .and. tlev(i) .le. 298.) then + sig = yg263(iw) + + $ (yg298(iw) - yg263(iw))*(tlev(i) - 263.)/35. + + elseif (tlev(i) .gt. 298. .and. tlev(i) .le. 323.) then + sig = yg298(iw) + + $ (yg323(iw) - yg298(iw))*(tlev(i) - 298.)/25. + + elseif (tlev(i) .gt. 323. .and. tlev(i) .le. 343.) then + sig = yg323(iw) + + $ (yg343(iw) - yg323(iw))*(tlev(i) - 323.)/20. + + endif + + sq(j,i,iw) = qy * sig + + ENDDO + ENDDO + + tpflag(j) = 1 RETURN END - SUBROUTINE setsnw(nz,z,nw,wl,dtsnw,omsnw,gsnw,kout) + +*=============================================================================* + + SUBROUTINE r132(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set optical and physical properties for snowpack. =* -*= Currently for wavelength-independent properties. =* -*= Subroutine outputs spectral quantities. =* -*= Lee-Taylor, J., and S. Madronich (2002), Calculation of actinic fluxes =* -*= with a coupled atmosphere-snow radiative transfer model, J. Geophys. =* -*= Res., 107(D24) 4796 (2002) doi:10.1029/2002JD002084 =* +*= Provide product (cross section) x (quantum yield) for +*= OClO -> Products =* +*= Cross section: from Wahner et al., J. Phys. Chem. 91, 2734, 1987 =* +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* -*= USER-DEFINED VARIABLES: =* -*= zs - height (km) of snow layer boundary above GROUND level =* -*= snwdens - density (g/cm3) =* -*= ksct - mass-specific scattering coefficient (m2/kg) =* -*= csoot - soot content (ng Carbon / g snow) =* -*= snow - (=T/F) switch for presence of snow -*= =* *= PARAMETERS: =* -*= nz - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= z - REAL, specified altitude working grid (km) (I)=* -*= nw - INTEGER, number of specified intervals + 1 in working (I)=* -*= wavelength grid =* -*= wl - REAL, vector of lower limits of wavelength intervals in (I)=* -*= working wavelength grid =* -*= dtsnw - REAL, optical depth due to absorption by snow at each (O)=* -*= altitude and wavelength =* -*= omsnw - REAL, single scattering albedo due to snow at each (O)=* -*= defined altitude and wavelength =* -*= gsnw - REAL, snow asymmetry factor at each defined altitude and (O)=* -*= wavelength =* -*= rabs - absorption coefficient of snow, wavelength-dependent =* -*= rsct - scattering coefficient of snow, assume wavelength-independent =* -*-----------------------------------------------------------------------------* -*= EDIT HISTORY: =* -*= 10/00 adapted from setcld.f, Julia Lee-Taylor, ACD, NCAR =* -*-----------------------------------------------------------------------------* -*= This program is free software; you can redistribute it and/or modify =* -*= it under the terms of the GNU General Public License as published by the =* -*= Free Software Foundation; either version 2 of the license, or (at your =* -*= option) any later version. =* -*= The TUV package is distributed in the hope that it will be useful, but =* -*= WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBI- =* -*= LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public =* -*= License for more details. =* -*= To obtain a copy of the GNU General Public License, write to: =* -*= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* -*-----------------------------------------------------------------------------* -*= To contact the authors, please mail to: =* -*= Jula Lee-Taylor, NCAR/ACD, P.O.Box 3000, Boulder, CO, 80307-3000, USA or =* -*= send email to: julial@ucar.edu =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -35606,7 +36441,7 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output * PARAMETER(kout=6) * input @@ -35620,9 +36455,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -35655,182 +36488,175 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=51) +* input -* input: (grids) - REAL wl(kw) - REAL z(kz) - INTEGER nz INTEGER nw + REAL wl(kw), wc(kw) -* Output: - REAL dtsnw(kz,kw), omsnw(kz,kw), gsnw(kz,kw) + INTEGER nz -* local: + REAL tlev(kz) + REAL airden(kz) -* specified data: - REAL zs(kdata),dzs - REAL cd(kdata), omd(kdata), gd - REAL snwdens(kdata) ! snwdens = snow density, g/cm3 - REAL csoot(kdata) ! conc of elemental carbon, ng/g - REAL r_ice(kw),rsoot - REAL womd(kdata), wgd(kdata) - REAL rsct(kdata),ksct(kdata),rabs(kdata) +* weighting functions -* other: - REAL cz(kz),omz(kz),gz(kz) - INTEGER i,is,iw,iz,nsl + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) -* External functions: - REAL fsum - EXTERNAL fsum -*-------------------------------------------------------------------------- -* SNOW PROPERTIES: USER-DEFINED -*-------------------------------------------------------------------------- -** define "number of snow layers + 1" (0 = no snow, 2 = single snow layer) - nsl = 0 +* input/output: - IF(nsl.GE.2)THEN -** define snow grid, zs(ns), in km above GROUND level -* NOTE: to get good vertical resolution, subroutine gridz (in grids.f) should -* be modified to include small (1cm - 1mm) layers near snowpack top. + INTEGER j - zs(1) = 0.0 - zs(2) = 0.001 +* data arrays -** define snow scattering coefficient, ksct, m2/kg snow -* melting midlatitude maritime (mountain) snow, ksct = 1-5 m2/kg_snow -* warmer polar coastal/maritime snow, ksct = 6-13 m2/kg_snow -* cold dry polar/tundra snow, ksct = 20-30 m2/kg_snow -* Fisher, King and Lee-Taylor (2005), JGR 110(D21301) doi:10.1029/2005JD005963 + INTEGER kdata + PARAMETER(kdata=2000) - ksct(1) = 25. ! m2.kg-1 snow + INTEGER iw + INTEGER i, n + REAL x1(kdata), y1(kdata) + integer nn, n204, n296, n378 + REAL x204(kdata),x296(kdata),x378(kdata) + REAL y204(kdata),y296(kdata),y378(kdata) -** define snow density, snwdens, g/cm3 + INTEGER ierr - snwdens(1) = 0.4 ! g/cm3 +* local -** define soot content, csoot, ng/g elemental carbon + REAL yg204(kw),yg296(kw),yg378(kw) + REAL qy, sig - csoot(1) = 0. ! ng/g elemental carbon +******************** NOCl photodissociation -*---------------------------------------------------------------------------- -* SNOW PROPERTIES: FROM LITERATURE -*-------------------------------------------------------------------------- -* read absorption coefficients - CALL rdice_acff(nw,wl,r_ice) ! cm^-1 ice + j = j + 1 + jlabel(j) = 'OClO -> Products' -* absorption due to soot, assume wavelength-independent -* rsoot ~ 10 m2/gC @500nm : Warren & Wiscombe, Nature 313,467-470 (1985) - rsoot = 10. ! m2/gC +* cross section from +*A. Wahner, G.S. tyndall, A.R. Ravishankara, J. Phys. Chem., 91, 2734, (1987). +*Supplementary Data, as quoted at: +*http://www.atmosphere.mpg.de/enid/26b4b5172008b02407b2e47f08de2fa1,0/Spectra/Introduction_1rr.html -* asymmetry factor : Wiscombe & Warren, J. Atmos. Sci, 37, 2712-2733 (1980) - gd = 0.89 -*---------------------------------------------------------------------------- + OPEN(UNIT=kin,FILE='DATAJ1/ABS/OClO.abs',STATUS='OLD') + DO i = 1, 6 + READ(kin,*) + ENDDO + n204 = 1074-6 + DO i = 1, n204 + READ(kin,*) x204(i), y204(i) + ENDDO -* loop snow layers, assigning optical properties at each wavelength - DO 17, iw = 1, nw-1 - DO 11 is = 1,nsl-1 - rsct(is)=ksct(is)*snwdens(is)*1.e+3 ! m-1 - rsct(is)=rsct(is)*(zs(is+1)-zs(is))*1.e+3 ! no units + READ(kin,*) + n296 = 1067 + do i = 1, n296 + read(kin,*) x296(i), y296(i) + enddo - rabs(is) = (r_ice(iw)/0.9177*1.e5 + rsoot*csoot(is)) - $ * snwdens(is)*(zs(is+1)-zs(is)) ! no units - - cd(is) = rsct(is) + rabs(is) - omd(is)= rsct(is) / cd(is) - - if(iw.EQ.1)then - print*,"Snowpack: is =",is,"; zs =",zs(is) - PRINT*," ksct =", ksct(is) - PRINT*," density =",snwdens(is) - PRINT*," csoot =",csoot(is) - PRINT*, 'cd = ',cd(is),' omd = ',omd(is),' gd = ',gd - WRITE(kout,*)'snwdens = ',snwdens,' g/cm3' - WRITE(kout,*)'ksct_snow = ',ksct(is),' m2.kg-1' - WRITE(kout,*)'soot = ',csoot(is),' ng/g' - WRITE(kout,*)'cd = ',cd(is),'omd = ',omd(is),'gd = ',gd - endif + read(kin,*) + n378 = 1068 + do i = 1, n378 + read(kin,*) x378(i), y378(i) + enddo -* compute integrals and averages over snow layers: -* for g and omega, use averages weighted by optical depth - womd(is) = omd(is) * cd(is) - wgd(is) = gd * cd(is) - 11 CONTINUE + CLOSE(kin) -* interpolate snow layers onto TUV altitude grid (gridz) - CALL inter3(nz,z,cz, nsl,zs,cd, 0) - CALL inter3(nz,z,omz,nsl,zs,womd, 0) - CALL inter3(nz,z,gz ,nsl,zs,wgd, 0) + nn = n204 + CALL addpnt(x204,y204,kdata,nn,x204(1)*(1.-deltax),0.) + CALL addpnt(x204,y204,kdata,nn, 0.,0.) + CALL addpnt(x204,y204,kdata,nn,x204(nn)*(1.+deltax),0.) + CALL addpnt(x204,y204,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg204,nn,x204,y204,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - DO 15, iz = 1, nz-1 - IF (cz(iz) .GT. 0.) THEN - omz(iz) = omz(iz)/cz(iz) - gz(iz) = gz(iz) /cz(iz) - ELSE - omz(iz) = 0. - gz(iz) = 0. - ENDIF - dtsnw(iz,iw) = cz(iz) - omsnw(iz,iw) = omz(iz) - gsnw(iz,iw) = gz(iz) - 15 CONTINUE - 17 CONTINUE + nn = n296 + CALL addpnt(x296,y296,kdata,nn,x296(1)*(1.-deltax),0.) + CALL addpnt(x296,y296,kdata,nn, 0.,0.) + CALL addpnt(x296,y296,kdata,nn,x296(nn)*(1.+deltax),0.) + CALL addpnt(x296,y296,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg296,nn,x296,y296,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - PRINT*,"Snowpack top: zs =",zs(nsl) + nn = n378 + CALL addpnt(x378,y378,kdata,nn,x378(1)*(1.-deltax),0.) + CALL addpnt(x378,y378,kdata,nn, 0.,0.) + CALL addpnt(x378,y378,kdata,nn,x378(nn)*(1.+deltax),0.) + CALL addpnt(x378,y378,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg378,nn,x378,y378,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF - ELSE ! no snow - DO 16, iz = 1, nz-1 - cz(iz) = 0. - omz(iz) = 1. - gz(iz) = 0. - DO 18, iw = 1, nw-1 - dtsnw(iz,iw) = cz(iz) - omsnw(iz,iw) = omz(iz) - gsnw(iz,iw) = gz(iz) - 18 CONTINUE - 16 CONTINUE - ENDIF ! snow exists +* quantum yields assumed unity + + qy = 1 + + DO iw = 1, nw-1 + DO i = 1, nz + + if(tlev(i) .le. 204.) then + sig = yg204(iw) + + elseif (tlev(i) .gt. 204. .and. tlev(i) .le. 296.) then + sig = yg204(iw) + + $ (yg296(iw) - yg204(iw))*(tlev(i) - 204.)/92. + + elseif (tlev(i) .gt. 296. .and. tlev(i) .le. 378.) then + sig = yg296(iw) + + $ (yg378(iw) - yg296(iw))*(tlev(i) - 296.)/82. + + elseif (tlev(i) .gt. 378.) then + sig = yg378(iw) + endif + + sq(j,i,iw) = qy * sig + + ENDDO + ENDDO + + tpflag(j) = 1 RETURN END -******************************************************************************* - SUBROUTINE rdice_acff(nw,wl,rabs) + +*=============================================================================* + + SUBROUTINE r133(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Read ice absorption coefficient. Re-grid data to match =* -*= specified wavelength working grid. =* +*= Provide product (cross section) x (quantum yield) for =* +*= BrCl -> Br + Cl =* +*= Cross section: from Maric et al., J. Phtoochem Photobiol. A: Chem =* +*= 83, 179-192, 1994. =* +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* *= NW - INTEGER, number of specified intervals + 1 in working (I)=* *= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= RABS_ice - REAL, absorption coefficient (cm^-1) of ice at (O)=* -*= each specified wavelength =* -*-----------------------------------------------------------------------------* -*= EDIT HISTORY: =* -*= 10/00 Created routine by editing rdh2oxs. =* -*-----------------------------------------------------------------------------* -*= This program is free software; you can redistribute it and/or modify =* -*= it under the terms of the GNU General Public License as published by the =* -*= Free Software Foundation; either version 2 of the license, or (at your =* -*= option) any later version. =* -*= The TUV package is distributed in the hope that it will be useful, but =* -*= WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBI- =* -*= LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public =* -*= License for more details. =* -*= To obtain a copy of the GNU General Public License, write to: =* -*= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* -*-----------------------------------------------------------------------------* -*= To contact the authors, please mail to: =* -*= Sasha Madronich, NCAR/ACD, P.O.Box 3000, Boulder, CO, 80307-3000, USA or =* -*= send email to: sasha@ucar.edu =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -35839,9 +36665,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -35853,9 +36679,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -35888,97 +36712,124 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=1000) +* input -* input: (altitude working grid) INTEGER nw - REAL wl(kw) + REAL wl(kw), wc(kw) -* output: + INTEGER nz - REAL rabs(kw) + REAL tlev(kz) + REAL airden(kz) -* local: - REAL x1(kdata) - REAL y1(kdata),y2(kdata),y3(kdata) - REAL yg(kw) - REAL a1, a2, dum +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=200) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn INTEGER ierr - INTEGER i,l,m, n, idum - CHARACTER*40 fil -*_______________________________________________________________________ -************* absorption cross sections: -* ice absorption cross sections from +* local - fil = 'DATA/ice' - OPEN(UNIT=kin,FILE='DATAJ1/ABS/ICE_Perov.acff',STATUS='old') - m = 17 ! header lines - n = 79 ! data lines - !OPEN(UNIT=kin,FILE='DATAJ1/ABS/ICE_min.acff',STATUS='old') - !m = 13 ! header lines - !n = 52 ! data lines + REAL yg(kw) + REAL qy - DO 11, i = 1,m - read(kin,*) - 11 CONTINUE - DO 12, i = 1, n - READ(kin,*) x1(i), y1(i) - 12 CONTINUE - CLOSE (kin) +******************** BrCl photodissociation - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) + j = j + 1 + jlabel(j) = 'BrCl -> Br + Cl' + +* cross section from +* D. Maric, J.P. Burrows, and G.K. Moortgat, "A study of the UV-visible +* absorption spectra of Br2 and BrCl," J. Photochem. Photobiol. A: Chem. +* 83, 179-192 (1994). + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/BrCl.abs',STATUS='OLD') + DO i = 1, 9 + READ(kin,*) + ENDDO + n = 81 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, fil + WRITE(*,*) ierr, jlabel(j) STOP ENDIF - - DO 13, l = 1, nw-1 - rabs(l) = yg(l) - 13 CONTINUE -*_______________________________________________________________________ +* quantum yields assumed unity + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 RETURN END + *=============================================================================* - SUBROUTINE setso2(ipbl, zpbl, xpbl, - $ so2new, nz, z, nw, wl, so2xs, - $ tlay, dcol, - $ dtso2) + SUBROUTINE r134(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Set up an altitude profile of SO2 molecules, and corresponding absorption=* -*= optical depths. Subroutine includes a shape-conserving scaling method =* -*= that allows scaling of the entire profile to a given overhead SO2 =* -*= column amount. =* +*= Provide product (cross section) x (quantum yield) for =* +*= CH3(OONO2) -> CH3(OO) + NO2 =* +*= Cross section: from +*= I. Bridier, R. Lesclaux, and B. Veyret, "Flash photolysis kinetic study +*= of the equilibrium CH3O2 + NO2 « CH3O2NO2," Chemical Physics Letters +*= 191, 259-263 (1992). +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= SO2NEW - REAL, overhead SO2 column amount (molec/cm^2) to which (I)=* -*= profile should be scaled. If SO2NEW < 0, no scaling is done =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= Z - REAL, specified altitude working grid (km) (I)=* *= NW - INTEGER, number of specified intervals + 1 in working (I)=* *= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= SO2XS - REAL, molecular absoprtion cross section (cm^2) of O2 at (I)=* -*= each specified wavelength =* -*= TLAY - REAL, temperature (K) at each specified altitude layer (I)=* -*= DTSO2 - REAL, optical depth due to SO2 absorption at each (O)=* -*= specified altitude at each specified wavelength =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -35987,9 +36838,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -36001,9 +36852,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -36036,204 +36885,123 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=51) - -******** -* input: -******** - -* grids: +* input - REAL wl(kw) - REAL z(kz) INTEGER nw - INTEGER nz - REAL so2new - -* mid-layer temperature and layer air column - - REAL tlay(kz), dcol(kz) - -******** -* output: -******** - - REAL dtso2(kz,kw) - -******** -* local: -******** - -* absorption cross sections - - REAL so2xs(kw) - REAL cz(kz) - -* sulfur dioxide profile data: - - REAL zd(kdata), so2(kdata) - REAL cd(kdata) - REAL hscale - REAL colold, scale - REAL sso2 - REAL zpbl, xpbl - INTEGER ipbl - -* other: - - INTEGER i, l, nd - -******** -* External functions: -******** + REAL wl(kw), wc(kw) - REAL fsum - EXTERNAL fsum + INTEGER nz -*_______________________________________________________________________ -* Data input: + REAL tlev(kz) + REAL airden(kz) -* Example: set to 1 ppb in lowest 1 km, set to zero above that. -* - do by specifying concentration at 3 altitudes. +* weighting functions - nd = 3 - zd(1) = 0. - so2(1) = 1. * 2.69e10 + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) - zd(2) = 1. - so2(2) = 1. * 2.69e10 +* input/output: - zd(3) = zd(2)* 1.000001 - so2(3) = 10./largest + INTEGER j -* compute column increments (alternatively, can specify these directly) +* data arrays - DO 11, i = 1, nd - 1 - cd(i) = (so2(i+1)+so2(i)) * 1.E5 * (zd(i+1)-zd(i)) / 2. - 11 CONTINUE + INTEGER kdata + PARAMETER(kdata=200) -* Include exponential tail integral from top level to infinity. -* fold tail integral into top layer -* specify scale height near top of data (use ozone value) + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr - hscale = 4.50e5 - cd(nd-1) = cd(nd-1) + hscale * so2(nd) +* local -*********** -*********** end data input. + REAL yg(kw) + REAL qy -* Compute column increments on standard z-grid. +******************** CH3(OONO2) photodissociation - CALL inter3(nz,z,cz, nd,zd,cd, 1) + j = j + 1 + jlabel(j) = 'CH3(OONO2) -> CH3(OO) + NO2' -**** Scaling of vertical profile by ratio of new to old column: -* If old column is near zero (less than 1 molec cm-2), -* use constant mixing ratio profile (nominal 1 ppt before scaling) -* to avoid numerical problems when scaling. +* cross section from +*= I. Bridier, R. Lesclaux, and B. Veyret, "Flash photolysis kinetic study +*= of the equilibrium CH3O2 + NO2 « CH3O2NO2," Chemical Physics Letters +*= 191, 259-263 (1992). - IF(fsum(nz-1,cz) .LT. 1.) THEN - DO i = 1, nz-1 - cz(i) = 1.E-12 * dcol(i) - ENDDO - ENDIF - colold = fsum(nz-1,cz) - scale = 2.687e16 * so2new / colold - DO i = 1, nz-1 - cz(i) = cz(i) * scale + OPEN(UNIT=kin,FILE='DATAJ1/ABS/CH3OONO2.abs',STATUS='OLD') + DO i = 1, 9 + READ(kin,*) ENDDO + n = 26 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) -*! overwrite for specified pbl height, set concentration here - - IF(ipbl .GT. 0) THEN - write(*,*) 'pbl SO2 = ', xpbl, ' ppb' - - DO i = 1, nz-1 - IF (i .LE. ipbl) THEN - cz(i) = xpbl*1.E-9 * dcol(i) - ELSE - cz(i) = 0. - ENDIF - ENDDO + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP ENDIF -************************************ -* calculate sulfur optical depth for each layer, with optional temperature -* correction. Output, dtso2(kz,kw) +* quantum yields assumed unity - DO 20, l = 1, nw-1 - sso2 = so2xs(l) - DO 10, i = 1, nz - 1 + qy = 1. -c Leaving this part in in case i want to interpolate between -c the 221K and 298K data. -c -c IF ( wl(l) .GT. 240.5 .AND. wl(l+1) .LT. 350. ) THEN -c IF (tlay(i) .LT. 263.) THEN -c sso2 = s221(l) + (s263(l)-s226(l)) / (263.-226.) * -c $ (tlay(i)-226.) -c ELSE -c sso2 = s263(l) + (s298(l)-s263(l)) / (298.-263.) * -c $ (tlay(i)-263.) -c ENDIF -c ENDIF + DO iw = 1, nw-1 + DO i = 1, nz - dtso2(i,l) = cz(i)*sso2 + sq(j,i,iw) = qy * yg(iw) - 10 CONTINUE - 20 CONTINUE -*_______________________________________________________________________ + ENDDO + ENDDO + + tpflag(j) = 0 RETURN END -* This file contains the following subroutines, related to the -* spherical geometry of the Earth's atmosphere -* sphers -* airmas + *=============================================================================* - SUBROUTINE sphers(nz, z, zen, dsdh, nid) + SUBROUTINE r135(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Calculate slant path over vertical depth ds/dh in spherical geometry. =* -*= Calculation is based on: A.Dahlback, and K.Stamnes, A new spheric model =* -*= for computing the radiation field available for photolysis and heating =* -*= at twilight, Planet.Space Sci., v39, n5, pp. 671-683, 1991 (Appendix B) =* +*= Provide product (cross section) x (quantum yield) for t-butyl nitrite =* +*= C(CH3)3(ONO) -> C(CH3)3(O) + NO =* +*= Cross section: from +*= V. McMillan, 1966, private communication to J.G. Calvert, J.N.Pitts, Jr., +*= Photochemistry, London, 1966, p. 455. +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= Z - REAL, specified altitude working grid (km) (I)=* -*= ZEN - REAL, solar zenith angle (degrees) (I)=* -*= DSDH - REAL, slant path of direct beam through each layer crossed (O)=* -*= when travelling from the top of the atmosphere to layer i; =* -*= DSDH(i,j), i = 0..NZ-1, j = 1..NZ-1 =* -*= NID - INTEGER, number of layers crossed by the direct beam when (O)=* -*= travelling from the top of the atmosphere to layer i; =* -*= NID(i), i = 0..NZ-1 =* -*-----------------------------------------------------------------------------* -*= EDIT HISTORY: =* -*= double precision fix for shallow layers - Julia Lee-Taylor Dec 2000 =* -*-----------------------------------------------------------------------------* -*= This program is free software; you can redistribute it and/or modify =* -*= it under the terms of the GNU General Public License as published by the =* -*= Free Software Foundation; either version 2 of the license, or (at your =* -*= option) any later version. =* -*= The TUV package is distributed in the hope that it will be useful, but =* -*= WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBI- =* -*= LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public =* -*= License for more details. =* -*= To obtain a copy of the GNU General Public License, write to: =* -*= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* -*-----------------------------------------------------------------------------* -*= To contact the authors, please mail to: =* -*= Sasha Madronich, NCAR/ACD, P.O.Box 3000, Boulder, CO, 80307-3000, USA or =* -*= send email to: sasha@ucar.edu =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -36242,9 +37010,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -36256,9 +37024,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -36291,137 +37057,120 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) * input - INTEGER nz - REAL zen, z(kz) - -* output - INTEGER nid(0:kz) - REAL dsdh(0:kz,kz) -* more program constants - REAL re, ze(kz) - REAL dr - PARAMETER ( dr = pi/180.) + INTEGER nw + REAL wl(kw), wc(kw) -* local + INTEGER nz - REAL zenrad, rpsinz, rj, rjp1, dsj, dhj, ga, gb, sm - INTEGER i, j, k - INTEGER id + REAL tlev(kz) + REAL airden(kz) - INTEGER nlayer - REAL zd(0:kz-1) +* weighting functions -*----------------------------------------------------------------------------- + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) - zenrad = zen*dr +* input/output: -* number of layers: - nlayer = nz - 1 + INTEGER j -* include the elevation above sea level to the radius of the earth: - re = radius + z(1) -* correspondingly z changed to the elevation above earth surface: - DO k = 1, nz - ze(k) = z(k) - z(1) - END DO +* data arrays -* inverse coordinate of z - zd(0) = ze(nz) - DO k = 1, nlayer - zd(k) = ze(nz - k) - END DO + INTEGER kdata + PARAMETER(kdata=200) -* initialize dsdh(i,j), nid(i) - DO i = 0, kz - nid(i) = 0 - DO j = 1, kz - dsdh(i,j) = 0. - END DO - END DO + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr -* calculate ds/dh of every layer - DO 100 i = 0, nlayer +* local - rpsinz = (re + zd(i)) * SIN(zenrad) - - IF ( (zen .GT. 90.0) .AND. (rpsinz .LT. re) ) THEN - nid(i) = -1 - ELSE + REAL yg(kw) + REAL qy -* -* Find index of layer in which the screening height lies -* - id = i - IF( zen .GT. 90.0 ) THEN - DO 10 j = 1, nlayer - IF( (rpsinz .LT. ( zd(j-1) + re ) ) .AND. - $ (rpsinz .GE. ( zd(j) + re )) ) id = j - 10 CONTINUE - END IF - - DO 20 j = 1, id +******************** CH3(OONO2) photodissociation - sm = 1.0 - IF(j .EQ. id .AND. id .EQ. i .AND. zen .GT. 90.0) - $ sm = -1.0 - - rj = re + zd(j-1) - rjp1 = re + zd(j) - - dhj = zd(j-1) - zd(j) - - ga = rj*rj - rpsinz*rpsinz - gb = rjp1*rjp1 - rpsinz*rpsinz - IF (ga .LT. 0.0) ga = 0.0 - IF (gb .LT. 0.0) gb = 0.0 - - IF(id.GT.i .AND. j.EQ.id) THEN - dsj = SQRT( ga ) - ELSE - dsj = SQRT( ga ) - sm*SQRT( gb ) - END IF - dsdh(i,j) = dsj / dhj - 20 CONTINUE - - nid(i) = id - - END IF + j = j + 1 + jlabel(j) = 'C(CH3)3(ONO) -> C(CH3)3(O) + NO' - 100 CONTINUE +* cross section from +*= V. McMillan, 1966, private communication to J.G. Calvert, J.N.Pitts, Jr., +*= Photochemistry, London, 1966, p. 455. -*----------------------------------------------------------------------------- + OPEN(UNIT=kin,FILE='DATAJ1/ABS/t-butyl-nitrite.abs',STATUS='OLD') + DO i = 1, 4 + READ(kin,*) + ENDDO + n = 96 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) - RETURN - END + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END *=============================================================================* - SUBROUTINE airmas(nz, dsdh, nid, cz, - $ vcol, scol) + SUBROUTINE r136(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Calculate vertical and slant air columns, in spherical geometry, as a =* -*= function of altitude. =* +*= Provide product (cross section) x (quantum yield) for ClONO =* +*= ClONO -> Cl + NO2 =* +*= cross section from IPUAC, orig from Molina and Molina (1977) =* +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NZ - INTEGER, number of specified altitude levels in the working (I)=* -*= grid =* -*= DSDH - REAL, slant path of direct beam through each layer crossed (O)=* -*= when travelling from the top of the atmosphere to layer i; =* -*= DSDH(i,j), i = 0..NZ-1, j = 1..NZ-1 =* -*= NID - INTEGER, number of layers crossed by the direct beam when (O)=* -*= travelling from the top of the atmosphere to layer i; =* -*= NID(i), i = 0..NZ-1 =* -*= VCOL - REAL, output, vertical air column, molec cm-2, above level iz =* -*= SCOL - REAL, output, slant air column in direction of sun, above iz =* -*= also in molec cm-2 =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -36430,9 +37179,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -36444,9 +37193,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -36479,85 +37226,125 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) -* Input: +* input + + INTEGER nw + REAL wl(kw), wc(kw) INTEGER nz - INTEGER nid(0:kz) - REAL dsdh(0:kz,kz) - REAL cz(kz) -* output: + REAL tlev(kz) + REAL airden(kz) - REAL vcol(kz), scol(kz) +* weighting functions -* internal: + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) - INTEGER id, j - REAL sum, vsum +* input/output: -* calculate vertical and slant column from each level: -* work downward + INTEGER j - vsum = 0. - DO id = 0, nz - 1 - vsum = vsum + cz(nz-id) - vcol(nz-id) = vsum - sum = 0. - IF(nid(id) .LT. 0) THEN - sum = largest - ELSE +* data arrays -* single pass layers: + INTEGER kdata + PARAMETER(kdata=200) - DO j = 1, MIN(nid(id), id) - sum = sum + cz(nz-j)*dsdh(id,j) - ENDDO + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr -* double pass layers: +* local - DO j = MIN(nid(id),id)+1, nid(id) - sum = sum + 2.*cz(nz-j)*dsdh(id,j) - ENDDO + REAL yg(kw) + REAL qy - ENDIF - scol(nz - id) = sum +******************** ClONO photodissociation + j = j + 1 + jlabel(j) = 'ClONO -> Cl + NO2' + +* cross section from JPL-2011 +* Also published (with some minor differences) as: +* R. Atkinson, D.L. Baulch, R.A. Cox, J.N. Crowley, R.F. Hampson, R.G. Hynes, M.E. Jenkin, M.J. Rossi, +* and J. Troe, "Evaluated kinetic and photochemical data for atmospheric chemistry: Volume III - gas +* phase reactions of inorganic halogens", Atmos. Chem. Phys. 7, 981-1191 (2007).Comments: +* IUPAC (2005, 2007) recommendation: +* The preferred values of the absorption cross-sections at 231 K are the values reported by +* L.T. Molina and M.J. Molina, "Ultraviolet absorption spectrum of chlorine nitrite, ClONO," +* Geophys. Res. Lett. 4, 83-86 (1977). + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/ClONO_jpl11.abs',STATUS='OLD') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 34 + DO i = 1, n + READ(kin,*) x(i), y(i) ENDDO + CLOSE(kin) - RETURN - END + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + sq(j,i,iw) = qy * yg(iw) + ENDDO + ENDDO + tpflag(j) = 0 -* This file contains the following subroutines, related to specifying -* biological spectral weighting functions: -* swbiol + RETURN + END *=============================================================================* - SUBROUTINE swbiol(nw,wl,wc,j,s,label) + SUBROUTINE r137(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Create or read various weighting functions, e.g. biological action =* -*= spectra, UV index, etc. =* +*= Provide product (cross section) x (quantum yield) for HCl =* +*= HCl -> H + Cl =* +*= cross section from JPL2011 =* +*= Quantum yield: Assumed to be 1 =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* *= NW - INTEGER, number of specified intervals + 1 in working (I)=* *= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= WC - REAL, vector of central wavelength of wavelength intervals I)=* -*= in working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* *= J - INTEGER, counter for number of weighting functions defined (IO)=* -*= S - REAL, value of each defined weighting function at each (O)=* -*= defined wavelength =* -*= LABEL - CHARACTER*50, string identifier for each weighting function (O)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* *= defined =* *-----------------------------------------------------------------------------* @@ -36567,9 +37354,9 @@ c INCLUDE 'params' * BROADLY USED PARAMETERS: *_________________________________________________ * i/o file unit numbers - INTEGER kout, kin + INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -36581,9 +37368,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -36616,525 +37401,4166 @@ c INCLUDE 'params' PARAMETER(nzero = -10./largest) * machine precision - + REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=1000) +* input -* input: - REAL wl(kw), wc(kw) INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) * input/output: - INTEGER j -* output: (weighting functions and labels) - REAL s(ks,kw) - CHARACTER*50 label(ks) + INTEGER j -* internal: - REAL x1(kdata) - REAL y1(kdata) - REAL yg(kw) +* data arrays - REAL fery, futr - EXTERNAL fery, futr - INTEGER i, iw, n + INTEGER kdata + PARAMETER(kdata=100) + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn INTEGER ierr - INTEGER idum - REAL dum1, dum2 - REAL em, a, b, c - REAL sum +* local - REAL a0, a1, a2, a3 + REAL yg(kw) + REAL qy, dum -*_______________________________________________________________________ +******************** HCl photodissociation -********* Photosynthetic Active Radiation (400 < PAR < 700 nm) -* conversion to micro moles m-2 s-1: -* s = s * (1e6/6.022142E23)(w/1e9)/(6.626068E-34*2.99792458E8) - j = j + 1 - label(j) = 'PAR, 400-700 nm, umol m-2 s-1' - DO iw = 1, nw-1 - IF (wc(iw) .GT. 400. .AND. wc(iw) .LT. 700.) THEN - s(j,iw) = 8.36e-3 * wc(iw) - ELSE - s(j,iw) = 0. - ENDIF - ENDDO + jlabel(j) = 'HCl -> H + Cl' -********** unity raf constant slope: +* cross section from JPL2011 - j = j + 1 - label(j) = 'Exponential decay, 14 nm/10' - DO iw = 1, nw-1 - s(j,iw) = 10.**(-(wc(iw) -300.)/14.) + OPEN(UNIT=kin,FILE='DATAJ1/ABS/HCl_jpl11.abs',STATUS='OLD') + DO i = 1, 3 + READ(kin,*) ENDDO - -************ DNA damage action spectrum -* from: Setlow, R. B., The wavelengths in sunlight effective in -* producing skin cancer: a theoretical analysis, Proceedings -* of the National Academy of Science, 71, 3363 -3366, 1974. -* normalize to unity at 300 nm -* Data read from original hand-drawn plot by Setlow -* received from R. Setlow in May 1995 -* data is per quantum (confirmed with R. Setlow in May 1995). -* Therefore must put on energy basis if irradiance is is energy -* (rather than quanta) units. - - j = j + 1 - label(j) = 'DNA damage, in vitro (Setlow, 1974)' - OPEN(UNIT=kin,FILE='DATAS1/dna.setlow.new',STATUS='old') - do i = 1, 11 - read(kin,*) - enddo - n = 55 + n = 31 DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i) / 2.4E-02 * x1(i)/300. + READ(kin,*) x(i), y(i), dum + y(i) = y(i) * 1.e-20 ENDDO - CLOSE (kin) + CLOSE(kin) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) + WRITE(*,*) ierr, jlabel(j) STOP ENDIF - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO +* quantum yields assumed unity -********* skin cancer in mice, Utrecht/Phildelphia study -*from de Gruijl, F. R., H. J. C. M. Sterenborg, P. D. Forbes, -* R. E. Davies, C. Cole, G. Kelfkens, H. van Weelden, H. Slaper, -* and J. C. van der Leun, Wavelength dependence of skin cancer -* induction by ultraviolet irradiation of albino hairless mice, -* Cancer Res., 53, 53-60, 1993. -* Calculate with function futr(w), normalize at 300 nm. + qy = 1. - j = j + 1 - label(j) = 'SCUP-mice (de Gruijl et al., 1993)' DO iw = 1, nw-1 - s(j,iw) = futr(wc(iw)) / futr(300.) - ENDDO - -*********** Utrecht/Philadelphia mice spectrum corrected for humans skin. -* From de Gruijl, F.R. and J. C. van der Leun, Estimate of the wavelength -* dependency of ultraviolet carcinogenesis and its relevance to the -* risk assessment of a stratospheric ozone depletion, Health Phys., 4, -* 317-323, 1994. + DO i = 1, nz - j = j + 1 - label(j) = 'SCUP-human (de Gruijl and van der Leun, 1994)' - OPEN(UNIT=kin,FILE='DATAS1/SCUP-h',STATUS='old') - n = 28 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - ENDDO + sq(j,i,iw) = qy * yg(iw) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF - - DO iw = 1, nw-1 - s(j,iw) = yg(iw) + ENDDO ENDDO - CLOSE (kin) - -***************** CIE standard human erythema action spectrum -*from: -* McKinlay, A. F., and B. L. Diffey, A reference action spectrum for -* ultraviolet induced erythema in human skin, in Human Exposure to -* Ultraviolet Radiation: Risks and Regulations, W. R. Passchler -* and B. F. M. Bosnajokovic, (eds.), Elsevier, Amsterdam, 1987. - j = j + 1 - label(j) = 'CIE human erythema (McKinlay and Diffey, 1987)' - DO iw = 1, nw-1 - s(j,iw) = fery(wc(iw)) - ENDDO + tpflag(j) = 0 + + RETURN + END -***************** UV index (Canadian - WMO/WHO) -* from: -* Report of the WMO Meeting of experts on UV-B measurements, data quality -* and standardization of UV indices, World Meteorological Organization -* (WMO), report No. 95, Geneva, 1994. -* based on the CIE erythema weighting, multiplied by 40. +*-----------------------------------------------------------------------------* - j = j + 1 - label(j) = 'UV index (WMO, 1994)' - DO iw = 1, nw-1 - s(j,iw) = 40. * fery(wc(iw)) - ENDDO + SUBROUTINE pxCH2O(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) -************* Human erythema - Anders et al. -* from: -* Anders, A., H.-J. Altheide, M. Knalmann, and H. Tronnier, -* Action spectrum for erythema in humands investigated with dye lasers, -* Photochem. and Photobiol., 61, 200-203, 1995. -* for skin types II and III, Units are J m-2. +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= JPL 2011 recommendation. =* +*= Provide product of (cross section) x (quantum yield) for CH2O photolysis =* +*= (a) CH2O + hv -> H + HCO =* +*= (b) CH2O + hv -> H2 + CO =* +*= written by s. madronich march 2013 +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* - j = j + 1 - label(j) = 'Erythema, humans (Anders et al., 1995)' - OPEN(UNIT=kin,FILE='DATAS1/ery.anders',STATUS='old') - do i = 1, 5 + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + + INTEGER kdata + PARAMETER(kdata=200) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER i, j, iz, iw + +* data arrays + + INTEGER n, n1, n2 + REAL x1(kdata), x2(kdata) + REAL y298(kdata), tcoef(kdata) + REAL qr(kdata), qm(kdata) + +* local + + REAL yg1(kw), yg2(kw), yg3(kw), yg4(kw) + REAL ak300, akt, sig + real qyr300, qym300, qymt + + + INTEGER ierr + +*_______________________________________________________________________ + + DO 5, iw = 1, nw - 1 + wc(iw) = (wl(iw) + wl(iw+1))/2. + 5 CONTINUE + +**************************************************************** +**************** CH2O photodissociatation + + j = j+1 + jlabel(j) = 'CH2O -> H + HCO' + + j = j+1 + jlabel(j) = 'CH2O -> H2 + CO' + +* read JPL2011 cross section data: + + OPEN(UNIT=kin,FILE='DATAJ1/CH2O/CH2O_jpl11.abs' + $ ,STATUS='old') + do i = 1, 4 read(kin,*) enddo - n = 28 + n = 150 + n1 = n + n2 = n DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = 1./y1(i) + READ(kin,*) x1(i), y298(i), tcoef(i) + x2(i) = x1(i) + y298(i) = y298(i) * 1.e-20 + tcoef(i) = tcoef(i) * 1.e-24 ENDDO + CLOSE(kin) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) +* terminate endpoints and interpolate to working grid + + CALL addpnt(x1,y298,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y298,kdata,n1, 0.,0.) + CALL addpnt(x1,y298,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y298,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y298,ierr) IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) + WRITE(*,*) ierr, jlabel(j-1) STOP ENDIF - - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - CLOSE (kin) - -********* 1991-92 ACGIH threshold limit values -* from -* ACGIH, 1991-1992 Threshold Limit Values, American Conference -* of Governmental and Industrial Hygienists, 1992. - j = j + 1 - label(j) = 'Occupational TLV (ACGIH, 1992)' - OPEN(UNIT=kin,FILE='DATAS1/acgih.1992',STATUS='old') - n = 56 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - y1(i) = y1(i) - ENDDO - - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) + CALL addpnt(x2,tcoef,kdata,n2,x2(1)*(1.-deltax),0.) + CALL addpnt(x2,tcoef,kdata,n2, 0.,0.) + CALL addpnt(x2,tcoef,kdata,n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,tcoef,kdata,n2, 1.e+38,0.) + CALL inter2(nw,wl,yg2,n2,x2,tcoef,ierr) IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) + WRITE(*,*) ierr, jlabel(j-1) STOP ENDIF - - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - CLOSE (kin) -********* phytoplankton, Boucher et al. (1994) -* from Boucher, N., Prezelin, B.B., Evens, T., Jovine, R., Kroon, B., Moline, M.A., -* and Schofield, O., Icecolors '93: Biological weighting function for the ultraviolet -* inhibition of carbon fixation in a natural antarctic phytoplankton community, -* Antarctic Journal, Review 1994, pp. 272-275, 1994. -* In original paper, value of b and m (em below are given as positive. Correct values -* are negative. Also, limit to positive values. +* quantum yields: Read, terminate, interpolate: - j = j + 1 - label(j) = 'Phytoplankton (Boucher et al., 1994)' - a = 112.5 - b = -6.223E-01 - c = 7.670E-04 - em = -3.17E-06 - DO iw = 1, nw-1 - IF (wc(iw) .GT. 290. .AND. wc(iw) .LT. 400.) THEN - s(j,iw) = em + EXP(a+b*wc(iw)+c*wc(iw)*wc(iw)) - ELSE - s(j,iw) = 0. + OPEN(UNIT=kin,FILE='DATAJ1/CH2O/CH2O_jpl11.yld',STATUS='old') + DO i = 1, 4 + READ(kin,*) + ENDDO + n = 112 + n1 = n + n2 = n + DO i = 1, n + READ(kin,*) x1(i), qr(i), qm(i) + x2(i) = x1(i) + ENDDO + CLOSE(kin) + + CALL addpnt(x1,qr,kdata,n1,x1(1)*(1.-deltax),qr(1)) + CALL addpnt(x1,qr,kdata,n1, 0.,qr(1)) + CALL addpnt(x1,qr,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,qr,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg3,n1,x1,qr,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j-1) + STOP ENDIF - s(j,iw) = max(s(j,iw),0.) - ENDDO -********* phytoplankton, Cullen et al. -* Cullen, J.J., Neale, P.J., and Lesser, M.P., Biological weighting function for the -* inhibition of phytoplankton photosynthesis by ultraviolet radiation, Science, 25, -* 646-649, 1992. -* phaeo + CALL addpnt(x2,qm,kdata,n2,x2(1)*(1.-deltax),qm(1)) + CALL addpnt(x2,qm,kdata,n2, 0.,qm(1)) + CALL addpnt(x2,qm,kdata,n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,qm,kdata,n2, 1.e+38,0.) + CALL inter2(nw,wl,yg4,n2,x2,qm,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j-1) + STOP + ENDIF - j = j + 1 - label(j) = 'Phytoplankton, phaeo (Cullen et al., 1992)' - OPEN(UNIT=kin,FILE='DATAS1/phaeo.bio',STATUS='old') - n = 106 - DO i = 1, n - READ(kin,*) idum, dum1, dum2, y1(i) - x1(i) = (dum1+dum2)/2. - ENDDO +* combine gridded quantities: +* yg1 = cross section at 298K +* yg2 = temperature correction coefficient for cross section +* yg3 = quantum yields for radical channel, H + HCO +* yg4 = quantum yields for molecular channel, H2 + CO. - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF + DO iz = 1, nz - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - CLOSE(kin) + DO iw = 1, nw - 1 -* proro +* correct cross section for temperature dependence: - j = j + 1 - label(j) = 'Phytoplankton, proro (Cullen et al., 1992)' - OPEN(UNIT=kin,FILE='DATAS1/proro.bio',STATUS='old') - n = 100 - DO i = 1, n - READ(kin,*) idum, dum1, dum2, y1(i) - x1(i) = (dum1+dum2)/2. - ENDDO + sig = yg1(iw) + yg2(iw) * (tlev(iz) - 298.) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF +* assign room temperature quantum yields for radical and molecular channels - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - CLOSE (kin) + qyr300 = yg3(iw) + qym300 = yg4(iw) + qymt = qym300 -**** Damage to lens of pig eyes, from -* Oriowo, M. et al. (2001). Action spectrum for in vitro -* UV-induced cataract using whole lenses. Invest. Ophthalmol. & Vis. Sci. 42, -* 2596-2602. For pig eyes. Last two columns computed by L.O.Bjorn. +* between 330 ande 360 nm, molecular channel is pressure and temperature dependent. - j = j + 1 - label(j) = 'Cataract, pig (Oriowo et al., 2001)' - OPEN(UNIT=kin,FILE='DATAS1/cataract_oriowo',STATUS='old') - DO i = 1, 7 - READ(kin,*) - ENDDO - n = 18 - DO i = 1, n - READ(kin,*) x1(i), dum1, dum1, y1(i) - ENDDO + IF (wc(iw) .ge. 330. .and. wc(iw) .lt. 360. .and. + $ qym300 .gt. 0.) then -* extrapolation to 400 nm (has very little effect on raf): -c do i = 1, 30 -c n = n + 1 -c x1(n) = x1(n-1) + 1. -c y1(n) = 10**(5.7666 - 0.0254*x1(n)) -c enddo + ak300 = 1./qym300 - 1./(1. - qyr300) + ak300 = ak300/2.45e19 + akt = ak300 * (1. + 0.05 * (wc(iw) - 329.) * + $ (300. - tlev(iz))/80.) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF + qymt = 1./(1./(1.-qyr300) + akt*airden(iz)) - DO iw = 1, nw-1 - s(j,iw) = yg(iw) + ENDIF + + sq(j-1,iz,iw) = sig * qyr300 + sq(j ,iz,iw) = sig * qymt + + ENDDO ENDDO - CLOSE(kin) -****** Plant damage - Caldwell 1971 -* Caldwell, M. M., Solar ultraviolet radiation and the growth and -* development of higher plants, Photophysiology 6:131-177, 1971. + tpflag(j-1) = 1 + tpflag(j) = 3 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r138(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for acetic acid =* +*= CH3COOH -> CH3 + COOH =* +*= cross section from JPL2011 =* +*= Quantum yield: Assumed to be 0.55 =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=100) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr + +* local + + REAL yg(kw) + REAL qy, dum + +******************** acetic acid photodissociation + + j = j + 1 + jlabel(j) = 'CH3COOH -> CH3 + COOH' + +* cross section from JPL2011 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/CH3COOH_jpl11.abs',STATUS='OLD') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 18 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 0.55 + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r139(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x(quantum yield) for methyl hypochlorite =* +*= CH3OCl -> CH3O + Cl =* +*= cross section from JPL2011 =* +*= Quantum yield: Assumed to be 1 =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=100) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr + +* local + + REAL yg(kw) + REAL qy, dum + +******************** methyl hypochlorite photodissociation + + j = j + 1 + jlabel(j) = 'CH3OCl -> CH3O + Cl' + +* cross section from JPL2011 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/CH3OCl_jpl11.abs',STATUS='OLD') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 83 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r140(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for CHCl3 photolysis: =* +*= CHCL3 + hv -> Products =* +*= Cross section: from JPL 2011 recommendation =* +*= Quantum yield: assumed to be unity =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=100) + + REAL x1(kdata) + REAL y1(kdata) + +* local + + REAL yg(kw) + REAL qy + INTEGER i, iw, n, idum + INTEGER ierr + INTEGER iz + INTEGER mabs + REAL b0, b1, b2, b3, b4, tcoeff, sig + REAL w1, w2, w3, w4, temp + +************************************************************** +************* CHCl3 photodissociation + + j = j+1 + jlabel(j) = 'CHCl3 -> Products' + + OPEN(kin,FILE='DATAJ1/ABS/CHCl3_jpl11.abs',STATUS='OLD') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 39 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1E-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1E38,0.) + + CALL inter2(nw,wl,yg,n,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* compute temperature correction factors: + + b0 = 3.7973 + b1 = -7.0913e-2 + b2 = 4.9397e-4 + b3 = -1.5226e-6 + b4 = 1.7555e-9 + +*** quantum yield assumed to be unity + + qy = 1. + DO iw = 1, nw-1 + +* compute temperature correction coefficients: + + tcoeff = 0. + IF(wc(iw) .GT. 190. .AND. wc(iw) .LT. 240.) THEN + w1 = wc(iw) + w2 = w1**2 + w3 = w1**3 + w4 = w1**4 + tcoeff = b0 + b1*w1 + b2*w2 + b3*w3 + b4*w4 + ENDIF + + DO iz = 1, nz + temp = tlev(iz) + temp = min(max(temp,210.),300.) + sig = yg(iw) * 10.**(tcoeff*(temp-295.)) + sq(j,iz,iw) = qy * sig + ENDDO + + ENDDO + + tpflag(j) = 1 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r141(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for C2H5ONO2 =* +*= photolysis: =* +*= C2H5ONO2 + hv -> C2H5O + NO2 =* +*= =* +*= Cross section: IUPAC 2006 (Atkinson et al., ACP, 6, 3625-4055, 2006) =* +*= Quantum yield: Assumed to be unity =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER (kdata = 200) + + INTEGER i, n + INTEGER iw + INTEGER n1, n2 + REAL x1(kdata), x2(kdata) + REAL y1(kdata), y2(kdata) + +* local + + REAL yg(kw), yg1(kw), yg2(kw) + REAL qy + REAL sig + INTEGER ierr + + INTEGER mabs, myld + +**************** C2H5ONO2 photodissociation + + j = j + 1 + jlabel(j) = 'C2H5ONO2 -> C2H5O + NO2' + +* mabs: absorption cross section options: +* 1: IUPAC 2006 + + OPEN(UNIT=kin,FILE='DATAJ1/RONO2/C2H5ONO2_iup2006.abs', + $ STATUS='old') + DO i = 1, 4 + READ(kin,*) + ENDDO + n = 32 + DO i = 1, n + READ(kin,*) x1(i), y1(i), y2(i) + x2(i) = x1(i) + y1(i) = y1(i) * 1.e-20 + y2(i) = y2(i) * 1.e-3 + ENDDO + CLOSE (kin) + + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + + n2 = n + CALL addpnt(x2,y2,kdata,n2,x2(1)*(1.-deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 0.,0.) + CALL addpnt(x2,y2,kdata,n2,x2(n2)*(1.+deltax),0.) + CALL addpnt(x2,y2,kdata,n2, 1.e+38,0.) + CALL inter2(nw,wl,yg2,n2,x2,y2,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yield = 1 +* sigma(T,lambda) = sigma(298,lambda) * exp(B * (T-298)) + + qy = 1. + + DO iw = 1, nw - 1 + DO i = 1, nz + + sig = yg1(iw) * exp(yg2(iw) * (tlev(i)-298.)) + + sq(j,i,iw) = qy * sig + + ENDDO + ENDDO + + tpflag(j) = 1 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r142(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for n-C3H7ONO2 =* +*= photolysis: =* +*= n-C3H7ONO2 + hv -> C3H7O + NO2 =* +*= =* +*= Cross section: IUPAC 2006 (Atkinson et al., ACP, 6, 3625-4055, 2006) =* +*= Quantum yield: Assumed to be unity =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER (kdata = 200) + + INTEGER i, n + INTEGER iw + INTEGER n1, n2 + REAL x1(kdata), x2(kdata) + REAL y1(kdata), y2(kdata) + +* local + + REAL yg(kw), yg1(kw), yg2(kw) + REAL qy + REAL sig + INTEGER ierr + + INTEGER mabs, myld + +**************** n-C3H7ONO2 photodissociation + + j = j + 1 + jlabel(j) = 'n-C3H7ONO2 -> C3H7O + NO2' + +* 1: IUPAC 2006 + + OPEN(UNIT=kin,FILE='DATAJ1/RONO2/nC3H7ONO2_iup2006.abs', + $ STATUS='old') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 32 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE (kin) + + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yield = 1 + + qy = 1. + + DO iw = 1, nw - 1 + DO i = 1, nz + sq(j,i,iw) = qy * yg1(iw) + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r143(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for 1-C4H9ONO2 =* +*= photolysis: =* +*= 1-C4H9ONO2 + hv -> 1-C4H9O + NO2 =* +*= =* +*= Cross section: IUPAC 2006 (Atkinson et al., ACP, 6, 3625-4055, 2006) =* +*= Quantum yield: Assumed to be unity =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER (kdata = 200) + + INTEGER i, n + INTEGER iw + INTEGER n1, n2 + REAL x1(kdata), x2(kdata) + REAL y1(kdata), y2(kdata) + +* local + + REAL yg(kw), yg1(kw), yg2(kw) + REAL qy + REAL sig + INTEGER ierr + + INTEGER mabs, myld + +**************** 1-C4H9ONO2 photodissociation + + j = j + 1 + jlabel(j) = '1-C4H9ONO2 -> 1-C4H9O + NO2' + +* 1: IUPAC 2006 + + OPEN(UNIT=kin,FILE='DATAJ1/RONO2/1C4H9ONO2_iup2006.abs', + $ STATUS='old') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 32 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE (kin) + + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yield = 1 + + qy = 1. + + DO iw = 1, nw - 1 + DO i = 1, nz + sq(j,i,iw) = qy * yg1(iw) + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r144(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for 2-C4H9ONO2 =* +*= photolysis: =* +*= 2-C4H9ONO2 + hv -> 2-C4H9O + NO2 =* +*= =* +*= Cross section: IUPAC 2006 (Atkinson et al., ACP, 6, 3625-4055, 2006) =* +*= Quantum yield: Assumed to be unity =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER (kdata = 200) + + INTEGER i, n + INTEGER iw + INTEGER n1, n2 + REAL x1(kdata), x2(kdata) + REAL y1(kdata), y2(kdata) + +* local + + REAL yg(kw), yg1(kw), yg2(kw) + REAL qy + REAL sig + INTEGER ierr + + INTEGER mabs, myld + +**************** 2-C4H9ONO2 photodissociation + + j = j + 1 + jlabel(j) = '2-C4H9ONO2 -> 2-C4H9O + NO2' + +* 1: IUPAC 2006 + + OPEN(UNIT=kin,FILE='DATAJ1/RONO2/2C4H9ONO2_iup2006.abs', + $ STATUS='old') + DO i = 1, 3 + READ(kin,*) + ENDDO + n = 15 + DO i = 1, n + READ(kin,*) x1(i), y1(i) + y1(i) = y1(i) * 1.e-20 + ENDDO + CLOSE (kin) + + n1 = n + CALL addpnt(x1,y1,kdata,n1,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 0.,0.) + CALL addpnt(x1,y1,kdata,n1,x1(n1)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n1, 1.e+38,0.) + CALL inter2(nw,wl,yg1,n1,x1,y1,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yield = 1 + + qy = 1. + + DO iw = 1, nw - 1 + DO i = 1, nz + sq(j,i,iw) = qy * yg1(iw) + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*============================================================================* + + SUBROUTINE r145(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for =* +*= perfluoro n-iodo propane (H24) =* +*= cross section from JPL2011 =* +*= Quantum yield: Assumed to be 0.55 =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=100) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr + +* local + + REAL yg(kw) + REAL qy, dum + + j = j + 1 + jlabel(j) = 'perfluoro 1-iodopropane -> products' + +* cross section from JPL2011 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/PF-n-iodopropane.abs',STATUS='OLD') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 16 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed unity + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r146(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for =* +*= molecular Iodine, I2 =* +*= cross section from JPL2011 =* +*= Quantum yield: wave-dep, from Brewer and Tellinhuisen, 1972 =* +*= Quantum yield for Unimolecular Dissociation of I2 in Visible Absorption =* +*= J. Chem. Phys. 56, 3929-3937, 1972. +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=200) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr + +* local + + REAL yg1(kw), yg2(kw) + REAL qy, dum + + j = j + 1 + jlabel(j) = 'I2 -> I + I' + +* cross section from JPL2011 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/I2_jpl11.abs',STATUS='OLD') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 104 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg1,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields + + OPEN(UNIT=kin,FILE='DATAJ1/YLD/I2.qy',STATUS='OLD') + DO i = 1, 4 + READ(kin,*) + ENDDO + n = 12 + DO i = 1, n + READ(kin,*) x(i), y(i) + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),1.) + CALL addpnt(x,y,kdata,nn, 0.,1.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg2,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* combine + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = yg1(iw) * yg2(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*============================================================================* + + SUBROUTINE r147(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for =* +*= Iodine monoxide, IO =* +*= cross section from JPL2011 =* +*= Quantum yield: assumed 1.0 =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=200) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr + +* local + + REAL yg(kw) + REAL qy, dum + + j = j + 1 + jlabel(j) = 'IO -> I + O' + +* cross section from JPL2011 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/IO_jpl11.abs',STATUS='OLD') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 133 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*============================================================================* + + SUBROUTINE r148(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide product (cross section) x (quantum yield) for =* +*= Hypoiodous acid, IOH =* +*= cross section from JPL2011 =* +*= Quantum yield: assumed 1.0 =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=300) + + INTEGER iw + INTEGER i, n + REAL x(kdata), y(kdata) + integer nn + INTEGER ierr + +* local + + REAL yg(kw) + REAL qy, dum + + j = j + 1 + jlabel(j) = 'IOH -> I + OH' + +* cross section from JPL2011 + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/IOH_jpl11.abs',STATUS='OLD') + DO i = 1, 2 + READ(kin,*) + ENDDO + n = 101 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + nn = n + CALL addpnt(x,y,kdata,nn,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,nn, 0.,0.) + CALL addpnt(x,y,kdata,nn,x(nn)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,nn, 1.e+38,0.) + CALL inter2(nw,wl,yg,nn,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields + + qy = 1. + + DO iw = 1, nw-1 + DO i = 1, nz + + sq(j,i,iw) = qy * yg(iw) + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END +*=============================================================================* + + SUBROUTINE r149(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide the product (cross section) x (quantum yield) for 2-pentanone =* +*= photolysis: =* +*= CH3COCH2CH2CH3 + hv -> CH3CO + CH2CH2CH3 =* +*= =* +*= Cross section from Martinez et al. (1992) =* +*= =* +*= Quantum yield assuumed 0.34 (Griffin et al., 2002) =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* +*= Routine added by M. Leriche for specie KETH and KETL of CACM, ReLACS2 =* +*= and ReLACS3 mecanisms - March 2018 =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=20000) + + INTEGER i, n + REAL x(kdata), y(kdata) + +* local + + REAL yg(kw), dum + REAL qy, sig + INTEGER ierr + INTEGER iw + +************************* CH3COCH2CH2CH3 photolysis + + j = j+1 + jlabel(j) = 'CH3COCH2CH2CH3 -> CH3CO + CH2CH2CH3' + + + OPEN(UNIT=kin,FILE='DATAJ1/ABS/Martinez.abs', + $ STATUS='old') + DO i = 1, 4 + READ(kin,*) + ENDDO + n = 96 + DO i = 1, n + READ(kin,*) x(i), dum, dum, y(i), dum + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields assumed to be 0.34 + + qy = 0.34 + + DO iw = 1, nw-1 + DO i = 1, nz + + sig = yg(iw) + sq(j,i,iw) = qy * sig + + ENDDO + ENDDO + + tpflag(j) = 0 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r150(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide the product (cross section) x (quantum yield) for nitrate ion =* +*= photolysis in diluted aqueous atmospheric solution (cloud, rain): =* +*= NO3- + hv + H2O -> NO2 + OH + OH- =* +*= =* +*= Cross section from Graedel and Weschler (1981) =* +*= =* +*= Quantum yield from Zellner, Exner and Herrmann (1990) =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* +*= Routine added by M. Leriche for ReLACS-AQ and ReLACS3 mecanisms =* +*= Adapted from TUVLaMP original 05/98 - March 2018 =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=100) + + INTEGER i, n + REAL x(kdata), y(kdata) + +* local + + REAL yg(kw) + REAL qy, sig + INTEGER ierr + INTEGER iw + +************************* NO3-(aq) photolysis + + j = j+1 + jlabel(j) = 'NO3-(aq) -> NO2(aq) + OH(aq)' + + + OPEN(UNIT=kin,FILE='DATAJ1/ABSAQ/NO3-aq.abs', + $ STATUS='old') + DO i = 1, 6 + READ(kin,*) + ENDDO + n = 9 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-20 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields from: +* Zellner, Exner, Herrmann: Absolute OH quantum Yields +* in the laser photolysis of nitrate, nitrite and dissolved H2O2 +* at 308 and 351 nm in the temperature range 278-353K, JAC, 1990. +* Temperature dependency determined at 308 nm and 4<pH<9 + + DO iw = 1, nw-1 + DO i = 1, nz + + qy = 0.017 * EXP (1800. *((1./298.)-(1./tlev(i)))) + + sig = yg(iw) +* actinic flux in droplet assumes to be 1.6 the interstitial +* actinic flux (see Ruggaber, 1997) + sq(j,i,iw) = qy * sig *1.6 + + ENDDO + ENDDO + + tpflag(j) = 1 + + RETURN + END + +*=============================================================================* + + SUBROUTINE r151(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Provide the product (cross section) x (quantum yield) for H2O2 =* +*= photolysis in diluted aqueous atmospheric solution (cloud, rain): =* +*= H2O2 + hv -> OH + OH =* +*= =* +*= Cross section from Graedel and Weschler (1981) =* +*= =* +*= Quantum yield from Zellner, Exner and Herrmann (1990) =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= WC - REAL, vector of center points of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section x quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* +*= Routine added by M. Leriche for ReLACS-AQ and ReLACS3 mecanisms =* +*= Adapted from TUVLaMP original 05/98 - March 2018 =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input + + INTEGER nw + REAL wl(kw), wc(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + INTEGER TPFLAG(kj) + REAL sq(kj,kz,kw) + +* input/output: + + INTEGER j + +* data arrays + + INTEGER kdata + PARAMETER(kdata=100) + + INTEGER i, n + REAL x(kdata), y(kdata) + +* local + + REAL yg(kw) + REAL qy, sig + INTEGER ierr + INTEGER iw + +************************* H2O2(aq) photolysis + + j = j+1 + jlabel(j) = 'H2O2(aq) -> OH(aq) + OH(aq)' + + + OPEN(UNIT=kin,FILE='DATAJ1/ABSAQ/H2O2aq.abs', + $ STATUS='old') + DO i = 1, 7 + READ(kin,*) + ENDDO + n = 11 + DO i = 1, n + READ(kin,*) x(i), y(i) + y(i) = y(i) * 1.e-23 + ENDDO + CLOSE(kin) + + CALL addpnt(x,y,kdata,n,x(1)*(1.-deltax),0.) + CALL addpnt(x,y,kdata,n, 0.,0.) + CALL addpnt(x,y,kdata,n,x(n)*(1.+deltax),0.) + CALL addpnt(x,y,kdata,n, 1.e+38,0.) + CALL inter2(nw,wl,yg,n,x,y,ierr) + IF (ierr .NE. 0) THEN + WRITE(*,*) ierr, jlabel(j) + STOP + ENDIF + +* quantum yields from: +* Zellner, Exner, Herrmann: Absolute OH quantum Yields +* in the laser photolysis of nitrate, nitrite and dissolved H2O2 +* at 308 and 351 nm in the temperature range 278-353K, JAC, 1990. +* Temperature dependency determined at 308 nm and pH=9 + + DO iw = 1, nw-1 + DO i = 1, nz + + qy = 0.98 * EXP (660. *((1./298.)-(1./tlev(i)))) + + sig = yg(iw) +* actinic flux in droplet assumes to be 1.6 the interstitial +* actinic flux (see Ruggaber, 1997) + sq(j,i,iw) = qy * sig *1.6 + + ENDDO + ENDDO + + tpflag(j) = 1 + + RETURN + END + +CCC FILE setaer.f +* vertical profiles of atmospheric variables +* setaer + +*=============================================================================* + + SUBROUTINE setaer(ipbl, zpbl, aod330, + $ tau550, ssaaer, alpha, + $ nz, z, nw, wl, + $ dtaer, omaer, gaer, kout ) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Set up an altitude profile of aerosols, and corresponding absorption =* +*= optical depths, single scattering albedo, and asymmetry factor. =* +*= Single scattering albedo and asymmetry factor can be selected for each =* +*= input aerosol layer (do not have to correspond to working altitude =* +*= grid). See loop 27. =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= Z - REAL, specified altitude working grid (km) (I)=* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= DTAER - REAL, optical depth due to absorption by aerosols at each (O)=* +*= altitude and wavelength =* +*= OMAER - REAL, single scattering albedo due to aerosols at each (O)=* +*= defined altitude and wavelength =* +*= GAER - REAL, aerosol asymmetry factor at each defined altitude and (O)=* +*= wavelength =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + + INTEGER kdata + PARAMETER(kdata=51) + +* input: + + REAL wl(kw) + REAL z(kz) + INTEGER nz + INTEGER nw + + REAL tau550 + REAL ssaaer, alpha + +* output: (on converted grid) + REAL dtaer(kz,kw), omaer(kz,kw), gaer(kz,kw) + +* local: + REAL zd(kdata), aer(kdata) + REAL cd(kdata), omd(kdata), gd(kdata) + REAL womd(kdata), wgd(kdata) + + REAL cz(kz) + REAL omz(kz) + REAL gz(kz) + + REAL colold + + REAL wc, wscale + INTEGER i, iw, nd + + REAL fsum + EXTERNAL fsum + + REAL zpbl + INTEGER ipbl + + REAL aod330 + + REAL aodw(kw), ssaw(kw) + REAL fract(kz) + +*_______________________________________________________________________ + +* Aerosol data from Elterman (1968) +* These are vertical optical depths per km, in 1 km +* intervals from 0 km to 50 km, at 340 nm. +* This is one option. User can specify different data set. + + DATA aer/ + 1 2.40E-01,1.06E-01,4.56E-02,1.91E-02,1.01E-02,7.63E-03, + 2 5.38E-03,5.00E-03,5.15E-03,4.94E-03,4.82E-03,4.51E-03, + 3 4.74E-03,4.37E-03,4.28E-03,4.03E-03,3.83E-03,3.78E-03, + 4 3.88E-03,3.08E-03,2.26E-03,1.64E-03,1.23E-03,9.45E-04, + 5 7.49E-04,6.30E-04,5.50E-04,4.21E-04,3.22E-04,2.48E-04, + 6 1.90E-04,1.45E-04,1.11E-04,8.51E-05,6.52E-05,5.00E-05, + 7 3.83E-05,2.93E-05,2.25E-05,1.72E-05,1.32E-05,1.01E-05, + 8 7.72E-06,5.91E-06,4.53E-06,3.46E-06,2.66E-06,2.04E-06, + 9 1.56E-06,1.19E-06,9.14E-07/ +*_______________________________________________________________________ + + +* Altitudes corresponding to Elterman profile, from bottom to top: + + WRITE(kout,*)'aerosols: Elterman (1968) continental profile' + nd = 51 + DO 22, i = 1, nd + zd(i) = FLOAT(i-1) + 22 CONTINUE + +* assume these are point values (at each level), so find column +* increments + + DO 27, i = 1, nd - 1 + cd(i) = (aer(i+1) + aer(i)) / 2. + omd(i) = ssaaer + gd(i) = .61 + 27 CONTINUE + +*********** end data input. + +* Compute integrals and averages over grid layers: +* for g and omega, use averages weighted by optical depth + + DO 29, i = 1, nd-1 + womd(i) = omd(i) * cd(i) + wgd(i) = gd(i) * cd(i) + 29 CONTINUE + CALL inter3(nz,z,cz, nd,zd,cd, 1) + CALL inter3(nz,z,omz, nd, zd,womd, 1) + CALL inter3(nz,z,gz , nd, zd,wgd, 1) + DO 30, i = 1, nz-1 + IF (cz(i) .GT. 0.) THEN + omz(i) = omz(i)/cz(i) + gz(i) = gz(i) /cz(i) + ELSE + omz(i) = 1. + gz(i) = 0. + ENDIF + 30 CONTINUE + +* old column at 340 nm +* (minimum value is pzero = 10./largest) + + colold = MAX(fsum(nz-1,cz),pzero) + +* scale with new column tau at 550 nm + + IF(tau550 .GT. nzero) THEN + DO i = 1, nz-1 + cz(i) = cz(i) * (tau550/colold) * (550./340.)**alpha + ENDDO + ENDIF + +* assign at all wavelengths +* (can move wavelength loop outside if want to vary with wavelength) + + DO 50, iw = 1, nw - 1 + wc = (wl(iw)+wl(iw+1))/2. + +* Elterman's data are for 340 nm, so assume optical depth scales +* inversely with first power of wavelength. + + wscale = (340./wc)**alpha + +* optical depths: + + DO 40, i = 1, nz - 1 + dtaer(i,iw) = cz(i) * wscale + omaer(i,iw) = omz(i) + gaer(i,iw) = gz(i) + 40 CONTINUE + 50 CONTINUE + +*! overwrite for pbl: + + IF(ipbl .GT. 0) THEN + write (*,*) 'pbl aerosols, aod330 = ', aod330 + +* create wavelength-dependent optical depth and single scattering albedo: + + DO iw = 1, nw-1 + wc = (wl(iw)+wl(iw+1))/2. + aodw(iw) = aod330*(wc/330.)**(-1.0) + IF(wc .LT. 400.) THEN + ssaw(iw) = 0.6 + ELSE + ssaw(iw) = 0.9 + ENDIF + ENDDO + +* divide aod among pbl layers, overwrite Elterman profile in pbl + + DO i = 1, ipbl + fract(i) = (z(i+1) - z(i))/zpbl + ENDDO + + DO iw = 1, nw-1 + DO i = 1, ipbl + dtaer(i, iw) = aodw(iw) * fract(i) + omaer(i,iw) = ssaw(iw) + ENDDO + ENDDO + + ENDIF +*_______________________________________________________________________ + + RETURN + END + +CCC FILE setalb.f +*=============================================================================* + + SUBROUTINE setalb(albnew,nw,wl,albedo,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Set the albedo of the surface. The albedo is assumed to be Lambertian, =* +*= i.e., the reflected light is isotropic, and independent of direction =* +*= of incidence of light. Albedo can be chosen to be wavelength dependent. =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= ALBEDO - REAL, surface albedo at each specified wavelength (O)=* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input: (wavelength working grid data) + + INTEGER nw + REAL wl(kw) + + REAL albnew + +* output: + REAL albedo(kw) + +* local: + INTEGER iw +*_______________________________________________________________________ + + DO 10, iw = 1, nw - 1 + albedo(iw) = albnew + 10 CONTINUE + +* alternatively, can input wavelenght-dependent values if avaialble. +*_______________________________________________________________________ + + RETURN + END + +CCC FILE setcld.f +*======================================================================* + + SUBROUTINE setcld(nz,z,nw,wl, + $ lwc, nlevel, + $ dtcld,omcld,gcld,kout) + + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Set cloud properties for each specified altitude layer. Properties =* +*= may be wavelength dependent. =* +*= Assumes horizontally infinite homogeneous cloud layers. +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= Z - REAL, specified altitude working grid (km) (I)=* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= DTCLD - REAL, optical depth due to absorption by clouds at each (O)=* +*= altitude and wavelength =* +*= OMCLD - REAL, single scattering albedo due to clouds at each (O)=* +*= defined altitude and wavelength =* +*= GCLD - REAL, cloud asymmetry factor at each defined altitude and (O)=* +*= wavelength =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + + INTEGER kdata +C PARAMETER(kdata=51) + PARAMETER(kdata=151) + +***** input + +* (grids) + REAL wl(kw) + REAL z(kz) + INTEGER nz + INTEGER nw + +* new total cloud optical depth: + + REAL taucld +C REAL zbase, ztop +C LWC is the liquid water content (!! kg/m3 !!) on the calling model +C grid (which has NLEVEL points: Z(1:NLEVEL) = AZ(*) + REAL lwc(*) + INTEGER nlevel + + +***** Output: + + REAL dtcld(kz,kw), omcld(kz,kw), gcld(kz,kw) + +***** specified default data: + + REAL zd(kdata), cd(kdata), omd(kdata), gd(kdata) + REAL womd(kdata), wgd(kdata) + REAL cldold + +* other: + + REAL cz(kz) + REAL omz(kz) + REAL gz(kz) + INTEGER i, iw, n + REAL scale + +* External functions: + REAL fsum + EXTERNAL fsum +*_______________________________________________________________________ + +* Set up clouds: +* All clouds are assumed to be infinite homogeneous layers +* Can have different clouds at different altitudes. +* If multiple cloud layers are specified, non-cloudy layers +* between them (if any) must be assigned zero optical depth. +* Set cloud optical properties: +* cd(i) = optical depth of i_th cloudy layer +* omd(i) = singel scattering albedo of i_th cloudy layer +* gd(i) = asymmetry factorof i_th cloudy layer +* Cloud top and bottom can be set to any height zd(i), but if they don't +* match the z-grid (see subroutine gridz.f), they will be interpolated to +* the z-grid. + +* Example: set two separate cloudy layers: +* cloud 1: +* base = 4 km +* top = 7 km +* optical depth = 20. (6.67 per km) +* single scattering albedo = 0.9999 +* asymmetry factor = 0.85 +* cloud 2: +* base = 9 km +* top = 11 km +* optical depth = 5. (2.50 per km) +* single scattering albedo = 0.99999 +* asymmetry factor = 0.85 + + n = nlevel + 1 + if (n .gt. kdata) stop "SETCLD: not enough memory: KDATA" + zd(1) = 0. + do 110, i = 2, n + zd(i) = 0.5*( z(i-1) + z(i) ) +110 continue + +C calculate cloud optical properties + do 120, i = 1, nlevel +C +C reference: Fouquart et al., Rev. Geophys., 1990 +C TAU = 3/2 LWC*DZ / (RHOWATER * Reff) +C RHOWATER = 1E3 kg/m3 +C Reff = (11 w + 4) 1E-6 +C w = LWC * 1E+3 (in g/cm3, since LWC is given in kg/m3) +C + cd(i) = 1.5 * ( lwc(i) * 1E3*(zd(i+1) - zd(i)) ) + + / ( 1E3 * (11.*lwc(i)*1E+3+4.) * 1E-6) + omd(i) = .9999 + gd(i) = .85 +C print '(A,I5,99E12.5)', "I,TAU,LWC,REFF(um)" +C + , i, cd(i), lwc(i) +C + , ((11.*lwc(i)*1E+3+4.)) +120 continue + + +****************** +* compute integrals and averages over grid layers: +* for g and omega, use averages weighted by optical depth + + DO 10, i = 1, n-1 + womd(i) = omd(i) * cd(i) + wgd(i) = gd(i) * cd(i) + 10 CONTINUE + CALL inter3(nz,z,cz, n, zd,cd, 0) + CALL inter3(nz,z,omz, n, zd,womd, 0) + CALL inter3(nz,z,gz , n, zd,wgd, 0) + + DO 15, i = 1, nz-1 + IF (cz(i) .GT. 0.) THEN + omz(i) = omz(i)/cz(i) + gz(i) = gz(i) /cz(i) + ELSE + omz(i) = 1. + gz(i) = 0. + ENDIF + 15 CONTINUE + +* assign at all wavelengths +* (can move wavelength loop outside if want to vary with wavelength) + + DO 20, iw = 1, nw-1 + DO 25, i = 1, nz-1 + dtcld(i,iw) = cz(i) + omcld(i,iw) = omz(i) + gcld (i,iw) = gz(i) + 25 CONTINUE + 20 CONTINUE +*_______________________________________________________________________ + + RETURN + END + +CCC FILE setno2.f +*=============================================================================* + + SUBROUTINE setno2(ipbl, zpbl, xpbl, + $ no2new, nz, z, nw, wl, no2xs, + $ tlay, dcol, + $ dtno2,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Set up an altitude profile of NO2 molecules, and corresponding absorption=* +*= optical depths. Subroutine includes a shape-conserving scaling method =* +*= that allows scaling of the entire profile to a given overhead NO2 =* +*= column amount. =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NO2NEW - REAL, overhead NO2 column amount (molec/cm^2) to which (I)=* +*= profile should be scaled. If NO2NEW < 0, no scaling is done =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= Z - REAL, specified altitude working grid (km) (I)=* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NO2XS - REAL, molecular absoprtion cross section (cm^2) of O2 at (I)=* +*= each specified wavelength =* +*= TLAY - REAL, temperature (K) at each specified altitude layer (I)=* +*= DTNO2 - REAL, optical depth due to NO2 absorption at each (O)=* +*= specified altitude at each specified wavelength =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + + INTEGER kdata + PARAMETER(kdata=51) + +******** +* input: +******** + +* grids: + + REAL wl(kw) + REAL z(kz) + INTEGER nw + INTEGER nz + REAL no2new + +* mid-layer temperature, layer air column + + REAL tlay(kz), dcol(kz) + +******** +* output: +******** + + REAL dtno2(kz,kw) + +******** +* local: +******** + +* absorption cross sections + + REAL no2xs(kz,kw) + REAL cz(kz) + +* nitrogen dioxide profile data: + + REAL zd(kdata), no2(kdata) + REAL cd(kdata) + REAL hscale + REAL colold, scale + REAL sno2 + REAL zpbl, xpbl + INTEGER ipbl + +* other: + + INTEGER i, l, nd + + +******** +* External functions: +******** + + REAL fsum + EXTERNAL fsum + +*_______________________________________________________________________ +* Data input: + +* Example: set to 1 ppb in lowest 1 km, set to zero above that. +* - do by specifying concentration at 3 altitudes. + + nd = 3 + zd(1) = 0. + no2(1) = 1. * 2.69e10 + + zd(2) = 1. + no2(2) = 1. * 2.69e10 + + zd(3) = zd(2)* 1.000001 + no2(3) = 10./largest + +* compute column increments (alternatively, can specify these directly) + + DO 11, i = 1, nd - 1 + cd(i) = (no2(i+1)+no2(i)) * 1.E5 * (zd(i+1)-zd(i)) / 2. + 11 CONTINUE + +* Include exponential tail integral from top level to infinity. +* fold tail integral into top layer +* specify scale height near top of data (use ozone value) + + hscale = 4.50e5 + cd(nd-1) = cd(nd-1) + hscale * no2(nd) + +*********** +*********** end data input. + +* Compute column increments and total column on standard z-grid. + + CALL inter3(nz,z,cz, nd,zd,cd, 1) + +**** Scaling of vertical profile by ratio of new to old column: +* If old column is near zero (less than 1 molec cm-2), +* use constant mixing ratio profile (nominal 1 ppt before scaling) +* to avoid numerical problems when scaling. + + IF(fsum(nz-1,cz) .LT. 1.) THEN + DO i = 1, nz-1 + cz(i) = 1.E-12 * dcol(i) + ENDDO + ENDIF + colold = fsum(nz-1, cz) + scale = 2.687e16 * no2new / colold + + DO i = 1, nz-1 + cz(i) = cz(i) * scale + ENDDO + +*! overwrite for specified pbl height + + IF(ipbl .GT. 0) THEN + write(*,*) 'pbl NO2 = ', xpbl, ' ppb' + + DO i = 1, nz-1 + IF (i .LE. ipbl) THEN + cz(i) = xpbl*1.E-9 * dcol(i) + ELSE + cz(i) = 0. + ENDIF + ENDDO + ENDIF + +************************************ +* calculate optical depth for each layer. Output: dtno2(kz,kw) + +98 continue + DO 20, l = 1, nw-1 + DO 10, i = 1, nz-1 + dtno2(i,l) = cz(i)*no2xs(i,l) + 10 CONTINUE + 20 CONTINUE +*_______________________________________________________________________ + + RETURN + END + +CCC FILE seto2.f +*=============================================================================* + + SUBROUTINE seto2(nz, z, nw, wl, cz, o2xs1, dto2, kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Set up an altitude profile of air molecules. Subroutine includes a =* +*= shape-conserving scaling method that allows scaling of the entire =* +*= profile to a given sea-level pressure. =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= Z - REAL, specified altitude working grid (km) (I)=* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= and each specified wavelength =* +*= CZ - REAL, number of air molecules per cm^2 at each specified (O)=* +*= altitude layer =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input: (grids) + + REAL wl(kw) + REAL z(kz) + INTEGER iw, nw + INTEGER iz, nz + REAL cz(kz) + REAL o2xs1(kw) + +* output: +* O2 absorption optical depth per layer at each wavelength + + REAL dto2(kz,kw) + +*_______________________________________________________________________ +* Assumes that O2 = 20.95 % of air density. If desire different O2 +* profile (e.g. for upper atmosphere) then can load it here. + + DO iz = 1, nz + DO iw =1, nw - 1 + dto2(iz,iw) = 0.2095 * cz(iz) * o2xs1(iw) + ENDDO + ENDDO + +*_______________________________________________________________________ + + RETURN + END + + +CCC FILE setsnw.f +* This file contains the following subroutines related to spectral optical +* propersties of snowpack needed to compute actinic fluxes +* setsnw +* rdice_acff +*=============================================================================* + + SUBROUTINE setsnw(nz,z,nw,wl,dtsnw,omsnw,gsnw,kout) + +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Set optical and physical properties for snowpack. =* +*= Currently for wavelength-independent properties. =* +*= Subroutine outputs spectral quantities. =* +*= Lee-Taylor, J., and S. Madronich (2002), Calculation of actinic fluxes =* +*= with a coupled atmosphere-snow radiative transfer model, J. Geophys. =* +*= Res., 107(D24) 4796 (2002) doi:10.1029/2002JD002084 =* +*-----------------------------------------------------------------------------* +*= USER-DEFINED VARIABLES: =* +*= zs - height (km) of snow layer boundary above GROUND level =* +*= snwdens - density (g/cm3) =* +*= ksct - mass-specific scattering coefficient (m2/kg) =* +*= csoot - soot content (ng Carbon / g snow) =* +*= snow - (=T/F) switch for presence of snow +*= =* +*= PARAMETERS: =* +*= nz - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= z - REAL, specified altitude working grid (km) (I)=* +*= nw - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= wl - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= dtsnw - REAL, optical depth due to absorption by snow at each (O)=* +*= altitude and wavelength =* +*= omsnw - REAL, single scattering albedo due to snow at each (O)=* +*= defined altitude and wavelength =* +*= gsnw - REAL, snow asymmetry factor at each defined altitude and (O)=* +*= wavelength =* +*= rabs - absorption coefficient of snow, wavelength-dependent =* +*= rsct - scattering coefficient of snow, assume wavelength-independent =* +*-----------------------------------------------------------------------------* +*= EDIT HISTORY: =* +*= 10/00 adapted from setcld.f, Julia Lee-Taylor, ACD, NCAR =* +*-----------------------------------------------------------------------------* +*= This program is free software; you can redistribute it and/or modify =* +*= it under the terms of the GNU General Public License as published by the =* +*= Free Software Foundation; either version 2 of the license, or (at your =* +*= option) any later version. =* +*= The TUV package is distributed in the hope that it will be useful, but =* +*= WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBI- =* +*= LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public =* +*= License for more details. =* +*= To obtain a copy of the GNU General Public License, write to: =* +*= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* +*-----------------------------------------------------------------------------* +*= To contact the authors, please mail to: =* +*= Jula Lee-Taylor, NCAR/ACD, P.O.Box 3000, Boulder, CO, 80307-3000, USA or =* +*= send email to: julial@ucar.edu =* +*-----------------------------------------------------------------------------* + + IMPLICIT NONE +c INCLUDE 'params' + +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) + +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) + +* some constants... + +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) + +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) + +* Planck constant x speed of light, J m + + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) + +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) + +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + + INTEGER kdata + PARAMETER(kdata=51) + +* input: (grids) + REAL wl(kw) + REAL z(kz) + INTEGER nz + INTEGER nw + +* Output: + REAL dtsnw(kz,kw), omsnw(kz,kw), gsnw(kz,kw) + +* local: + +* specified data: + REAL zs(kdata),dzs + REAL cd(kdata), omd(kdata), gd + REAL snwdens(kdata) ! snwdens = snow density, g/cm3 + REAL csoot(kdata) ! conc of elemental carbon, ng/g + REAL r_ice(kw),rsoot + REAL womd(kdata), wgd(kdata) + REAL rsct(kdata),ksct(kdata),rabs(kdata) + +* other: + REAL cz(kz),omz(kz),gz(kz) + INTEGER i,is,iw,iz,nsl + +* External functions: + REAL fsum + EXTERNAL fsum +*-------------------------------------------------------------------------- +* SNOW PROPERTIES: USER-DEFINED +*-------------------------------------------------------------------------- +** define "number of snow layers + 1" (0 = no snow, 2 = single snow layer) + nsl = 0 + + IF(nsl.GE.2)THEN +** define snow grid, zs(ns), in km above GROUND level +* NOTE: to get good vertical resolution, subroutine gridz (in grids.f) should +* be modified to include small (1cm - 1mm) layers near snowpack top. + + zs(1) = 0.0 + zs(2) = 0.001 + +** define snow scattering coefficient, ksct, m2/kg snow +* melting midlatitude maritime (mountain) snow, ksct = 1-5 m2/kg_snow +* warmer polar coastal/maritime snow, ksct = 6-13 m2/kg_snow +* cold dry polar/tundra snow, ksct = 20-30 m2/kg_snow +* Fisher, King and Lee-Taylor (2005), JGR 110(D21301) doi:10.1029/2005JD005963 + + ksct(1) = 25. ! m2.kg-1 snow + +** define snow density, snwdens, g/cm3 + + snwdens(1) = 0.4 ! g/cm3 + +** define soot content, csoot, ng/g elemental carbon + + csoot(1) = 0. ! ng/g elemental carbon + +*---------------------------------------------------------------------------- +* SNOW PROPERTIES: FROM LITERATURE +*-------------------------------------------------------------------------- +* read absorption coefficients + CALL rdice_acff(nw,wl,r_ice,kout) ! cm^-1 ice + +* absorption due to soot, assume wavelength-independent +* rsoot ~ 10 m2/gC @500nm : Warren & Wiscombe, Nature 313,467-470 (1985) + rsoot = 10. ! m2/gC + +* asymmetry factor : Wiscombe & Warren, J. Atmos. Sci, 37, 2712-2733 (1980) + gd = 0.89 +*---------------------------------------------------------------------------- + +* loop snow layers, assigning optical properties at each wavelength + DO 17, iw = 1, nw-1 + DO 11 is = 1,nsl-1 + rsct(is)=ksct(is)*snwdens(is)*1.e+3 ! m-1 + rsct(is)=rsct(is)*(zs(is+1)-zs(is))*1.e+3 ! no units + + rabs(is) = (r_ice(iw)/0.9177*1.e5 + rsoot*csoot(is)) + $ * snwdens(is)*(zs(is+1)-zs(is)) ! no units + + cd(is) = rsct(is) + rabs(is) + omd(is)= rsct(is) / cd(is) + + if(iw.EQ.1)then + print*,"Snowpack: is =",is,"; zs =",zs(is) + PRINT*," ksct =", ksct(is) + PRINT*," density =",snwdens(is) + PRINT*," csoot =",csoot(is) + PRINT*, 'cd = ',cd(is),' omd = ',omd(is),' gd = ',gd + WRITE(kout,*)'snwdens = ',snwdens,' g/cm3' + WRITE(kout,*)'ksct_snow = ',ksct(is),' m2.kg-1' + WRITE(kout,*)'soot = ',csoot(is),' ng/g' + WRITE(kout,*)'cd = ',cd(is),'omd = ',omd(is),'gd = ',gd + endif + +* compute integrals and averages over snow layers: +* for g and omega, use averages weighted by optical depth + womd(is) = omd(is) * cd(is) + wgd(is) = gd * cd(is) + 11 CONTINUE + +* interpolate snow layers onto TUV altitude grid (gridz) + CALL inter3(nz,z,cz, nsl,zs,cd, 0) + CALL inter3(nz,z,omz,nsl,zs,womd, 0) + CALL inter3(nz,z,gz ,nsl,zs,wgd, 0) + + DO 15, iz = 1, nz-1 + IF (cz(iz) .GT. 0.) THEN + omz(iz) = omz(iz)/cz(iz) + gz(iz) = gz(iz) /cz(iz) + ELSE + omz(iz) = 0. + gz(iz) = 0. + ENDIF + dtsnw(iz,iw) = cz(iz) + omsnw(iz,iw) = omz(iz) + gsnw(iz,iw) = gz(iz) + 15 CONTINUE + 17 CONTINUE + + PRINT*,"Snowpack top: zs =",zs(nsl) + + ELSE ! no snow + DO 16, iz = 1, nz-1 + cz(iz) = 0. + omz(iz) = 1. + gz(iz) = 0. + DO 18, iw = 1, nw-1 + dtsnw(iz,iw) = cz(iz) + omsnw(iz,iw) = omz(iz) + gsnw(iz,iw) = gz(iz) + 18 CONTINUE + 16 CONTINUE + ENDIF ! snow exists + + RETURN + END + +******************************************************************************* + SUBROUTINE rdice_acff(nw,wl,rabs,kout) +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Read ice absorption coefficient. Re-grid data to match =* +*= specified wavelength working grid. =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= RABS_ice - REAL, absorption coefficient (cm^-1) of ice at (O)=* +*= each specified wavelength =* +*-----------------------------------------------------------------------------* +*= EDIT HISTORY: =* +*= 10/00 Created routine by editing rdh2oxs. =* +*-----------------------------------------------------------------------------* +*= This program is free software; you can redistribute it and/or modify =* +*= it under the terms of the GNU General Public License as published by the =* +*= Free Software Foundation; either version 2 of the license, or (at your =* +*= option) any later version. =* +*= The TUV package is distributed in the hope that it will be useful, but =* +*= WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBI- =* +*= LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public =* +*= License for more details. =* +*= To obtain a copy of the GNU General Public License, write to: =* +*= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* +*-----------------------------------------------------------------------------* +*= To contact the authors, please mail to: =* +*= Sasha Madronich, NCAR/ACD, P.O.Box 3000, Boulder, CO, 80307-3000, USA or =* +*= send email to: sasha@ucar.edu =* +*-----------------------------------------------------------------------------* - j = j + 1 - label(j) = 'Plant damage (Caldwell, 1971)' + IMPLICIT NONE +c INCLUDE 'params' -* Fit to Caldwell (1971) data by -* Green, A. E. S., T. Sawada, and E. P. Shettle, The middle -* ultraviolet reaching the ground, Photochem. Photobiol., 19, -* 251-259, 1974. +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) - DO iw = 1, nw-1 - s(j,iw) = 2.628*(1. - (wc(iw)/313.3)**2)* - $ exp(-(wc(iw)-300.)/31.08) - IF( s(j,iw) .LT. 0. .OR. wc(iw) .GT. 313.) THEN - s(j,iw) = 0. - ENDIF - ENDDO +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) -* Alternative fit to Caldwell (1971) by -* Micheletti, M. I. and R. D. Piacentini, Photochem. Photobiol., -* 76, pp.?, 2002. +* some constants... - a0 = 570.25 - a1 = -4.70144 - a2 = 0.01274 - a3 = -1.13118E-5 - DO iw = 1, nw-1 - s(j,iw) = a0 + a1*wc(iw) + a2*wc(iw)**2 + a3*wc(iw)**3 - IF( s(j,iw) .LT. 0. .OR. wc(iw) .GT. 313.) THEN - s(j,iw) = 0. - ENDIF - ENDDO +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) -****** Plant damage - Flint & Caldwell 2003 -* Flint, S. D. and M. M. Caldwell, A biological spectral weigthing -* function for ozone depletion research with higher plants, Physiologia -* Plantorum, in press, 2003. -* Data available to 366 nm +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) - j = j + 1 - label(j) = 'Plant damage (Flint & Caldwell, 2003)' +* Planck constant x speed of light, J m - DO iw = 1, nw-1 - s(j,iw) = EXP( 4.688272*EXP( - $ -EXP(0.1703411*(wc(iw)-307.867)/1.15))+ - $ ((390-wc(iw))/121.7557-4.183832) ) + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) -* put on per joule (rather than per quantum) basis: +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) - s(j,iw) = s(j,iw) * wc(iw)/300. +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) - IF( s(j,iw) .LT. 0. .OR. wc(iw) .GT. 366.) THEN - s(j,iw) = 0. - ENDIF - - ENDDO +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) -****** Vitamin D - CIE 2006 -* Action spectrum for the production fo previtamin-D3 in human skin, -* CIE Techincal Report TC 6-54, Commission Internatinale del'Eclairage, 2006. -* Wavelength range of data is 252-330 nm, but Values below 260 nm and beyond -* 315 nm were interpolated by CIE using a spline fit. -* TUV also assigns the 252nm value to shorter wavelengths, and zero -* beyond 330nm. + INTEGER kdata + PARAMETER(kdata=1000) - j = j + 1 - label(j) = 'Previtamin-D3 (CIE 2006)' +* input: (altitude working grid) + INTEGER nw + REAL wl(kw) - OPEN(UNIT=kin,FILE='DATAS1/vitamin_D.txt',STATUS='old') - DO i = 1, 7 - READ(kin,*) - ENDDO - n = 79 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - ENDDO +* output: - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF + REAL rabs(kw) - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - CLOSE(kin) +* local: + REAL x1(kdata) + REAL y1(kdata),y2(kdata),y3(kdata) + REAL yg(kw) + REAL a1, a2, dum + INTEGER ierr + INTEGER i,l,m, n, idum + CHARACTER*40 fil +*_______________________________________________________________________ -****** Non-melanoma skin cancer, CIE 2006. -* Action spectrum for the induction of non-melanoma skin cancer. From: -* Photocarcinogenesis Action Spectrum (Non-Melanoma Skin Cancers), -* CIE S 019/E:2006, Commission Internationale de l'Eclairage, 2006. -* 1 nm spacing from 250 to 400 nm. Normalized at maximum, 299 nm. -* Set constanta at 3.94E-04 between 340 and 400 nm. -* Assume zero beyond 400 nm. -* Assume constant below 250 nm. +************* absorption cross sections: +* ice absorption cross sections from - j = j + 1 - label(j) = 'NMSC (CIE 2006)' + fil = 'DATA/ice' + OPEN(UNIT=kin,FILE='DATAJ1/ABS/ICE_Perov.acff',STATUS='old') + m = 17 ! header lines + n = 79 ! data lines + !OPEN(UNIT=kin,FILE='DATAJ1/ABS/ICE_min.acff',STATUS='old') + !m = 13 ! header lines + !n = 52 ! data lines - OPEN(UNIT=kin,FILE='DATAS1/nmsc_cie.txt',STATUS='old') - DO i = 1, 7 - READ(kin,*) - ENDDO - n = 151 - DO i = 1, n + DO 11, i = 1,m + read(kin,*) + 11 CONTINUE + DO 12, i = 1, n READ(kin,*) x1(i), y1(i) - ENDDO + 12 CONTINUE + CLOSE (kin) - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) + CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) + CALL addpnt(x1,y1,kdata,n, 0.,0.) + CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax),0.) + CALL addpnt(x1,y1,kdata,n, 1.e+38,0.) CALL inter2(nw,wl,yg,n,x1,y1,ierr) IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) + WRITE(*,*) ierr, fil STOP ENDIF + + DO 13, l = 1, nw-1 + rabs(l) = yg(l) + 13 CONTINUE - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - CLOSE(kin) -**************************************************************** -**************************************************************** -*_______________________________________________________________________ - - IF (j .GT. ks) STOP '1001' *_______________________________________________________________________ RETURN END -* This file contains the following subroutines, related to specifying -* chemical spectral weighting functions (cross sections x quantum yields) -* swphys +CCC FILE setso2.f *=============================================================================* - SUBROUTINE swchem(nw,wl,nz,tlev,airden, - $ j,sq,jlabel) + SUBROUTINE setso2(ipbl, zpbl, xpbl, + $ so2new, nz, z, nw, wl, so2xs, + $ tlay, dcol, + $ dtso2,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Load various "weighting functions" (products of cross section and =* -*= quantum yield at each altitude and each wavelength). The altitude =* -*= dependence is necessary to ensure the consideration of pressure and =* -*= temperature dependence of the cross sections or quantum yields. =* -*= The actual reading, evaluation and interpolation is done in separate =* -*= subroutines for ease of management and manipulation. Please refer to =* -*= the inline documentation of the specific subroutines for detail =* -*= information. =* +*= Set up an altitude profile of SO2 molecules, and corresponding absorption=* +*= optical depths. Subroutine includes a shape-conserving scaling method =* +*= that allows scaling of the entire profile to a given overhead SO2 =* +*= column amount. =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* +*= SO2NEW - REAL, overhead SO2 column amount (molec/cm^2) to which (I)=* +*= profile should be scaled. If SO2NEW < 0, no scaling is done =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= Z - REAL, specified altitude working grid (km) (I)=* *= NW - INTEGER, number of specified intervals + 1 in working (I)=* *= wavelength grid =* *= WL - REAL, vector of lower limits of wavelength intervals in (I)=* *= working wavelength grid =* -*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* -*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* -*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* -*= J - INTEGER, counter for number of weighting functions defined (IO)=* -*= SQ - REAL, cross section * quantum yield (cm^2) for each (O)=* -*= photolysis reaction defined, at each defined wavelength and =* -*= at each defined altitude level =* -*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* -*= defined =* +*= SO2XS - REAL, molecular absoprtion cross section (cm^2) of O2 at (I)=* +*= each specified wavelength =* +*= TLAY - REAL, temperature (K) at each specified altitude layer (I)=* +*= DTSO2 - REAL, optical depth due to SO2 absorption at each (O)=* +*= specified altitude at each specified wavelength =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -37145,7 +41571,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -37157,9 +41583,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -37196,296 +41620,388 @@ c INCLUDE 'params' REAL precis PARAMETER(precis = 1.e-7) -* input + INTEGER kdata + PARAMETER(kdata=51) + +******** +* input: +******** + +* grids: - INTEGER nw REAL wl(kw) - + REAL z(kz) + INTEGER nw INTEGER nz + REAL so2new - REAL tlev(kz) - REAL airden(kz) +* mid-layer temperature and layer air column -* weighting functions + REAL tlay(kz), dcol(kz) - CHARACTER*50 jlabel(kj) - REAL sq(kj,kz,kw) +******** +* output: +******** -* input/output: - INTEGER j + REAL dtso2(kz,kw) +******** * local: - REAL wc(kw) - INTEGER iw -*_______________________________________________________________________ - -* complete wavelength grid - - DO 5, iw = 1, nw - 1 - wc(iw) = (wl(iw) + wl(iw+1))/2. - 5 CONTINUE - -*____________________________________________________________________________ - -* O2 + hv -> O + O -* reserve first position. Cross section parameterization in Schumman-Runge and -* Lyman-alpha regions are zenith-angle dependent, will be written in -* subroutine seto2.f. -* -* Warning call positions have been changer to match the same order than -* previous versions -* Only 21 jvalues out of 90 are calculated which correspond to ReLACS scheme - - j = 1 - jlabel(j) = 'O2 -> O + O' - -* NO2 + hv -> NO + O(3P) - CALL r02(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* O3 + hv -> (both channels) - CALL r01(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* NO3 + hv -> (both channels) - CALL r03(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* N2O5 + hv -> (both channels) - CALL r04(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* HNO2 + hv -> OH + NO - CALL r05(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* HNO3 + hv -> OH + NO2 - CALL r06(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* HNO4 + hv -> HO2 + NO2 - CALL r07(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* H2O2 + hv -> 2 OH - CALL r08(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +******** -* CH2O + hv -> (both channels) - CALL r10(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* absorption cross sections -* CH3(OOH) + hv -> CH3O + OH - CALL r16(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + REAL so2xs(kw) + REAL cz(kz) -* CH3(ONO2) + hv -> CH3O + NO2 - CALL r17(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* sulfur dioxide profile data: -* CH3CHO + hv -> (all three channels) - CALL r11(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + REAL zd(kdata), so2(kdata) + REAL cd(kdata) + REAL hscale + REAL colold, scale + REAL sso2 + REAL zpbl, xpbl + INTEGER ipbl -* CH3COCH3 + hv -> Products - CALL r15(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* other: -* PAN + hv -> CH3CO(OO) + NO2 -* PAN + hv -> CH3CO(O) + NO3 -c CALL r18(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) - -* HO2 + hv -> OH + O - CALL r39(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + INTEGER i, l, nd -* N2O + hv -> N2 + O(1D) -c CALL r44(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +******** +* External functions: +******** -* NO3-(aq) + hv -> NO2 + O- (for snow) -* NO3-(aq) + hv -> NO2- + O(3P) (for snow) -c CALL r118(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + REAL fsum + EXTERNAL fsum -* C2H5CHO + hv -> C2H5 + HCO -c CALL r12(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +*_______________________________________________________________________ +* Data input: -* CH2(OH)CHO + hv -> Products -c CALL r101(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* Example: set to 1 ppb in lowest 1 km, set to zero above that. +* - do by specifying concentration at 3 altitudes. -* CH2=CHCHO + hv -> Products -c CALL r122(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + nd = 3 + zd(1) = 0. + so2(1) = 1. * 2.69e10 -* CH2=C(CH3)CHO + hv -> Products -c CALL r104(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + zd(2) = 1. + so2(2) = 1. * 2.69e10 -* CH3COCHCH2 + hv -> Products -c CALL r103(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + zd(3) = zd(2)* 1.000001 + so2(3) = 10./largest -* CH3COCH2CH3 -> CH3CO + CH2CH3 -c CALL r119(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* compute column increments (alternatively, can specify these directly) -* CH2(OH)COCH3 -> CH3CO + CH2(OH) -* CH2(OH)COCH3 -> CH2(OH)CO + CH3 -c CALL r112(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + DO 11, i = 1, nd - 1 + cd(i) = (so2(i+1)+so2(i)) * 1.E5 * (zd(i+1)-zd(i)) / 2. + 11 CONTINUE -* HOCH2OOH -> HOCH2O. + OH -c CALL r121(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* Include exponential tail integral from top level to infinity. +* fold tail integral into top layer +* specify scale height near top of data (use ozone value) -* CH3CO(OOH) + hv -> Products -c CALL r123(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + hscale = 4.50e5 + cd(nd-1) = cd(nd-1) + hscale * so2(nd) -* CH3CH2(ONO2) -> CH3CH2O + NO2 -c CALL r106(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +*********** +*********** end data input. -* CH3CH(ONO2)CH3 -> CH3CHOCH3 + NO2 -c CALL r107(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* Compute column increments on standard z-grid. -* CH2(OH)CH2(ONO2) -> CH2(OH)CH2(O.) + NO2 -c CALL r108(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + CALL inter3(nz,z,cz, nd,zd,cd, 1) -* CH3COCH2(ONO2) -> CH3COCH2(O.) + NO2 -c CALL r109(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +**** Scaling of vertical profile by ratio of new to old column: +* If old column is near zero (less than 1 molec cm-2), +* use constant mixing ratio profile (nominal 1 ppt before scaling) +* to avoid numerical problems when scaling. -* C(CH3)3(ONO2) -> C(CH3)3(O.) + NO2 -c CALL r110(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + IF(fsum(nz-1,cz) .LT. 1.) THEN + DO i = 1, nz-1 + cz(i) = 1.E-12 * dcol(i) + ENDDO + ENDIF + colold = fsum(nz-1,cz) + scale = 2.687e16 * so2new / colold + DO i = 1, nz-1 + cz(i) = cz(i) * scale + ENDDO -* CH3CH2COO2NO2 -> CH3CH2CO(OO) + NO2 -* CH3CH2COO2NO2 -> CH2CH2CO(O) + NO3 -c CALL r120(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +*! overwrite for specified pbl height, set concentration here -* CHOCHO + hv -> Products -c CALL r13(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + IF(ipbl .GT. 0) THEN + write(*,*) 'pbl SO2 = ', xpbl, ' ppb' -* CH3COCHO + hv -> Products -c CALL r14(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + DO i = 1, nz-1 + IF (i .LE. ipbl) THEN + cz(i) = xpbl*1.E-9 * dcol(i) + ELSE + cz(i) = 0. + ENDIF + ENDDO + ENDIF -* CH3COCOCH3 + hv -> Products -c CALL r102(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +************************************ +* calculate sulfur optical depth for each layer, with optional temperature +* correction. Output, dtso2(kz,kw) -* CH3COCO(OH) + hv -> Products -c CALL r105(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + DO 20, l = 1, nw-1 + sso2 = so2xs(l) + DO 10, i = 1, nz - 1 -* Cl2 + hv -> Cl + Cl -c CALL r47(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +c Leaving this part in in case i want to interpolate between +c the 221K and 298K data. +c +c IF ( wl(l) .GT. 240.5 .AND. wl(l+1) .LT. 350. ) THEN +c IF (tlay(i) .LT. 263.) THEN +c sso2 = s221(l) + (s263(l)-s226(l)) / (263.-226.) * +c $ (tlay(i)-226.) +c ELSE +c sso2 = s263(l) + (s298(l)-s263(l)) / (298.-263.) * +c $ (tlay(i)-263.) +c ENDIF +c ENDIF -* ClOOCl -> Cl + ClOO -c CALL r111(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + dtso2(i,l) = cz(i)*sso2 -* ClOO + hv -> Products -c CALL r31(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + 10 CONTINUE + 20 CONTINUE +*_______________________________________________________________________ -* ClONO2 + hv -> Products -c CALL r45(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + RETURN + END -* Br2 -> Br + Br -c CALL r115(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +CCC FILE sphers.f +* This file contains the following subroutines, related to the +* spherical geometry of the Earth's atmosphere +* sphers +* airmas +*=============================================================================* -* BrO -> Br + O -c CALL r114(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + SUBROUTINE sphers(nz, z, zen, dsdh, nid, kout) -* HOBr -> OH + Br -c CALL r113(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Calculate slant path over vertical depth ds/dh in spherical geometry. =* +*= Calculation is based on: A.Dahlback, and K.Stamnes, A new spheric model =* +*= for computing the radiation field available for photolysis and heating =* +*= at twilight, Planet.Space Sci., v39, n5, pp. 671-683, 1991 (Appendix B) =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= Z - REAL, specified altitude working grid (km) (I)=* +*= ZEN - REAL, solar zenith angle (degrees) (I)=* +*= DSDH - REAL, slant path of direct beam through each layer crossed (O)=* +*= when travelling from the top of the atmosphere to layer i; =* +*= DSDH(i,j), i = 0..NZ-1, j = 1..NZ-1 =* +*= NID - INTEGER, number of layers crossed by the direct beam when (O)=* +*= travelling from the top of the atmosphere to layer i; =* +*= NID(i), i = 0..NZ-1 =* +*-----------------------------------------------------------------------------* +*= EDIT HISTORY: =* +*= double precision fix for shallow layers - Julia Lee-Taylor Dec 2000 =* +*-----------------------------------------------------------------------------* +*= This program is free software; you can redistribute it and/or modify =* +*= it under the terms of the GNU General Public License as published by the =* +*= Free Software Foundation; either version 2 of the license, or (at your =* +*= option) any later version. =* +*= The TUV package is distributed in the hope that it will be useful, but =* +*= WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBI- =* +*= LITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public =* +*= License for more details. =* +*= To obtain a copy of the GNU General Public License, write to: =* +*= Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =* +*-----------------------------------------------------------------------------* +*= To contact the authors, please mail to: =* +*= Sasha Madronich, NCAR/ACD, P.O.Box 3000, Boulder, CO, 80307-3000, USA or =* +*= send email to: sasha@ucar.edu =* +*-----------------------------------------------------------------------------* -* BrONO2 + hv -> Products -c CALL r46(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + IMPLICIT NONE +c INCLUDE 'params' -* CH3Cl + hv -> Products -c CALL r30(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) -* CCl2O + hv -> Products -c CALL r19(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) -* CCl4 + hv -> Products -c CALL r20(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* some constants... -* CClFO + hv -> Products -c CALL r21(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) -* CCF2O + hv -> Products -c CALL r22(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) -* CF2ClCFCl2 (CFC-113) + hv -> Products -c CALL r23(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* Planck constant x speed of light, J m -* CF2ClCF2Cl (CFC-114) + hv -> Products -c CALL r24(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) -* CF3CF2Cl (CFC-115) + hv -> Products -c CALL r25(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) -* CCl3F (CFC-111) + hv -> Products -c CALL r26(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) -* CCl2F2 (CFC-112) + hv -> Products -c CALL r27(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) -* CH3CCl3 + hv -> Products -c CALL r29(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* input + INTEGER nz + REAL zen, z(kz) -* CF3CHCl2 (HCFC-123) + hv -> Products -c CALL r32(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* output + INTEGER nid(0:kz) + REAL dsdh(0:kz,kz) -* CF3CHFCl (HCFC-124) + hv -> Products -c CALL r33(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* more program constants + REAL re, ze(kz) + REAL dr + PARAMETER ( dr = pi/180.) -* CH3CFCl2 (HCFC-141b) + hv -> Products -c CALL r34(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* local -* CH3CF2Cl (HCFC-142b) + hv -> Products -c CALL r35(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + DOUBLE PRECISION zenrad, rpsinz, rj, rjp1, dsj, dhj, ga, gb, sm + INTEGER i, j, k + INTEGER id -* CF3CF2CHCl2 (HCFC-225ca) + hv -> Products -c CALL r36(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + INTEGER nlayer + REAL zd(0:kz-1) -* CF2ClCF2CHFCl (HCFC-225cb) + hv -> Products -c CALL r37(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +*----------------------------------------------------------------------------- -* CHClF2 (HCFC-22) + hv -> Products -c CALL r38(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + zenrad = zen*dr -* CH3Br + hv -> Products -c CALL r28(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* number of layers: + nlayer = nz - 1 -* CHBr3 + hv -> Products -c CALL r09(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* include the elevation above sea level to the radius of the earth: + re = radius + z(1) +* correspondingly z changed to the elevation above earth surface: + DO k = 1, nz + ze(k) = z(k) - z(1) + END DO -* CF3Br (Halon-1301) + hv -> Products -c CALL r42(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* inverse coordinate of z + zd(0) = ze(nz) + DO k = 1, nlayer + zd(k) = ze(nz - k) + END DO -* CF2BrCF2Br (Halon-2402) + hv -> Products -c CALL r43(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* initialize dsdh(i,j), nid(i) + DO i = 0, kz + nid(i) = 0 + DO j = 1, kz + dsdh(i,j) = 0. + END DO + END DO -* CF2Br2 (Halon-1202) + hv -> Products -c CALL r40(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* calculate ds/dh of every layer + DO 100 i = 0, nlayer -* CF2BrCl (Halon-1211) + hv -> Products -c CALL r41(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + rpsinz = (re + zd(i)) * SIN(zenrad) + + IF ( (zen .GT. 90.0) .AND. (rpsinz .LT. re) ) THEN + nid(i) = -1 + ELSE -* (CH3)2NNO -> products -c call r124(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) +* +* Find index of layer in which the screening height lies +* + id = i + IF( zen .GT. 90.0 ) THEN + DO 10 j = 1, nlayer + IF( (rpsinz .LT. ( zd(j-1) + re ) ) .AND. + $ (rpsinz .GE. ( zd(j) + re )) ) id = j + 10 CONTINUE + END IF + + DO 20 j = 1, id -* ClO -> Cl + O -c call r125(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + sm = 1.0 + IF(j .EQ. id .AND. id .EQ. i .AND. zen .GT. 90.0) + $ sm = -1.0 + + rj = re + zd(j-1) + rjp1 = re + zd(j) + + dhj = zd(j-1) - zd(j) + + ga = rj*rj - rpsinz*rpsinz + gb = rjp1*rjp1 - rpsinz*rpsinz + IF (ga .LT. 0.0) ga = 0.0 + IF (gb .LT. 0.0) gb = 0.0 + + IF(id.GT.i .AND. j.EQ.id) THEN + dsj = SQRT( ga ) + ELSE + dsj = SQRT( ga ) - sm*SQRT( gb ) + END IF + dsdh(i,j) = dsj / dhj + 20 CONTINUE + + nid(i) = id + + END IF -* ClNO2 -> Cl + NO2 -c call r126(nw,wl,wc,nz,tlev,airden,j,sq,jlabel) + 100 CONTINUE -**************************************************************** +*----------------------------------------------------------------------------- - IF (j .GT. kj) STOP '1002' RETURN END -* This file contains the following subroutines, related to specifying -* physical spectral weighting functions: -* swphys *=============================================================================* - SUBROUTINE swphys(nw,wl,wc,j,s,label) + SUBROUTINE airmas(nz, dsdh, nid, cz, + $ vcol, scol,kout) *-----------------------------------------------------------------------------* *= PURPOSE: =* -*= Create or read various spectral weighting functions, physically-based =* -*= e.g. UV-B, UV-A, visible ranges, instrument responses, etc. =* +*= Calculate vertical and slant air columns, in spherical geometry, as a =* +*= function of altitude. =* *-----------------------------------------------------------------------------* *= PARAMETERS: =* -*= NW - INTEGER, number of specified intervals + 1 in working (I)=* -*= wavelength grid =* -*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* -*= working wavelength grid =* -*= WC - REAL, vector of central wavelength of wavelength intervals I)=* -*= in working wavelength grid =* -*= J - INTEGER, counter for number of weighting functions defined (IO)=* -*= S - REAL, value of each defined weighting function at each (O)=* -*= defined wavelength =* -*= LABEL - CHARACTER*40, string identifier for each weighting function (O)=* -*= defined =* +*= NZ - INTEGER, number of specified altitude levels in the working (I)=* +*= grid =* +*= DSDH - REAL, slant path of direct beam through each layer crossed (O)=* +*= when travelling from the top of the atmosphere to layer i; =* +*= DSDH(i,j), i = 0..NZ-1, j = 1..NZ-1 =* +*= NID - INTEGER, number of layers crossed by the direct beam when (O)=* +*= travelling from the top of the atmosphere to layer i; =* +*= NID(i), i = 0..NZ-1 =* +*= VCOL - REAL, output, vertical air column, molec cm-2, above level iz =* +*= SCOL - REAL, output, slant air column in direction of sun, above iz =* +*= also in molec cm-2 =* *-----------------------------------------------------------------------------* IMPLICIT NONE @@ -37496,7 +42012,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -37508,9 +42024,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -37547,227 +42061,510 @@ c INCLUDE 'params' REAL precis PARAMETER(precis = 1.e-7) - INTEGER kdata - PARAMETER(kdata=1000) +* Input: -* input: - REAL wl(kw), wc(kw) - INTEGER nw + INTEGER nz + INTEGER nid(0:kz) + REAL dsdh(0:kz,kz) + REAL cz(kz) -* input/output: - INTEGER j +* output: -* output: (weighting functions and labels) - REAL s(ks,kw) - CHARACTER*50 label(ks) + REAL vcol(kz), scol(kz) * internal: - REAL x1(kdata) - REAL y1(kdata) - REAL yg(kw) - INTEGER i, iw, n + INTEGER id, j + REAL sum, vsum - INTEGER ierr +* calculate vertical and slant column from each level: +* work downward - INTEGER idum - REAL dum1, dum2 - REAL em, a, b, c - REAL sum + vsum = 0. + DO id = 0, nz - 1 + vsum = vsum + cz(nz-id) + vcol(nz-id) = vsum + sum = 0. + IF(nid(id) .LT. 0) THEN + sum = largest + ELSE -*_______________________________________________________________________ +* single pass layers: - j = 0 + DO j = 1, MIN(nid(id), id) + sum = sum + cz(nz-j)*dsdh(id,j) + ENDDO -********* UV-B (280-315 nm) - - j = j + 1 - label(j) = 'UV-B, 280-315 nm' - DO iw = 1, nw-1 - IF (wc(iw) .GT. 280. .AND. wc(iw) .LT. 315.) THEN - s(j,iw) = 1. - ELSE - s(j,iw) = 0. - ENDIF - ENDDO +* double pass layers: -********* UV-B* (280-320 nm) - - j = j + 1 - label(j) = 'UV-B*, 280-320 nm' - DO iw = 1, nw-1 - IF (wc(iw) .GT. 280. .AND. wc(iw) .LT. 320.) THEN - s(j,iw) = 1. - ELSE - s(j,iw) = 0. - ENDIF - ENDDO + DO j = MIN(nid(id),id)+1, nid(id) + sum = sum + 2.*cz(nz-j)*dsdh(id,j) + ENDDO -********* UV-A (315-400 nm) - - j = j + 1 - label(j) = 'UV-A, 315-400 nm' - DO iw = 1, nw-1 - IF (wc(iw) .GT. 315. .AND. wc(iw) .LT. 400.) THEN - s(j,iw) = 1. - ELSE - s(j,iw) = 0. ENDIF - ENDDO + scol(nz - id) = sum -********* visible+ (> 400 nm) - - j = j + 1 - label(j) = 'vis+, > 400 nm' - DO iw = 1, nw-1 - IF (wc(iw) .GT. 400.) THEN - s(j,iw) = 1. - ELSE - s(j,iw) = 0. - ENDIF ENDDO -********** Gaussian transmission functions + RETURN + END - j = j + 1 - label(j) = 'Gaussian, 305 nm, 10 nm FWHM' - sum = 0. - DO iw = 1, nw-1 - s(j,iw) = exp(- ( log(2.) * ((wc(iw)-305.)/(5.))**2) ) - sum = sum + s(j,iw) - ENDDO - DO iw = 1, nw-1 - s(j,iw) = s(j,iw)/sum - ENDDO +CCC FILE swchem.f +*=============================================================================* - j = j + 1 - label(j) = 'Gaussian, 320 nm, 10 nm FWHM' - sum = 0. - DO iw = 1, nw-1 - s(j,iw) = exp(- ( log(2.) * ((wc(iw)-320.)/(5.))**2) ) - sum = sum + s(j,iw) - ENDDO - DO iw = 1, nw-1 - s(j,iw) = s(j,iw)/sum - ENDDO + SUBROUTINE swchem(nw,wl,nz,tlev,airden, + $ j,sq,jlabel,tpflag,kout) - j = j + 1 - label(j) = 'Gaussian, 340 nm, 10 nm FWHM' - sum = 0. - DO iw = 1, nw-1 - s(j,iw) = exp(- ( log(2.) * ((wc(iw)-340.)/(5.))**2) ) - sum = sum + s(j,iw) - ENDDO - DO iw = 1, nw-1 - s(j,iw) = s(j,iw)/sum - ENDDO +*-----------------------------------------------------------------------------* +*= PURPOSE: =* +*= Load various "weighting functions" (products of cross section and =* +*= quantum yield at each altitude and each wavelength). The altitude =* +*= dependence is necessary to ensure the consideration of pressure and =* +*= temperature dependence of the cross sections or quantum yields. =* +*= The actual reading, evaluation and interpolation is done in separate =* +*= subroutines for ease of management and manipulation. Please refer to =* +*= the inline documentation of the specific subroutines for detail =* +*= information. =* +*-----------------------------------------------------------------------------* +*= PARAMETERS: =* +*= NW - INTEGER, number of specified intervals + 1 in working (I)=* +*= wavelength grid =* +*= WL - REAL, vector of lower limits of wavelength intervals in (I)=* +*= working wavelength grid =* +*= NZ - INTEGER, number of altitude levels in working altitude grid (I)=* +*= TLEV - REAL, temperature (K) at each specified altitude level (I)=* +*= AIRDEN - REAL, air density (molec/cc) at each altitude level (I)=* +*= J - INTEGER, counter for number of weighting functions defined (IO)=* +*= SQ - REAL, cross section * quantum yield (cm^2) for each (O)=* +*= photolysis reaction defined, at each defined wavelength and =* +*= at each defined altitude level =* +*= JLABEL - CHARACTER*50, string identifier for each photolysis reaction (O)=* +*= defined =* +*-----------------------------------------------------------------------------* - j = j + 1 - label(j) = 'Gaussian, 380 nm, 10 nm FWHM' - sum = 0. - DO iw = 1, nw-1 - s(j,iw) = exp(- ( log(2.) * ((wc(iw)-380.)/(5.))**2) ) - sum = sum + s(j,iw) - ENDDO - DO iw = 1, nw-1 - s(j,iw) = s(j,iw)/sum - ENDDO + IMPLICIT NONE +c INCLUDE 'params' -********** RB Meter, model 501 -* private communication, M. Morys (Solar Light Co.), 1994. -* From: morys@omni.voicenet.com (Marian Morys) -* Received: from acd.ucar.edu by sasha.acd.ucar.edu (AIX 3.2/UCB 5.64/4.03) -* id AA17274; Wed, 21 Sep 1994 11:35:44 -0600 +* BROADLY USED PARAMETERS: +*_________________________________________________ +* i/o file unit numbers + INTEGER kout, kin +* output +* PARAMETER(kout=6) +* input + PARAMETER(kin=78) +*_________________________________________________ +* altitude, wavelength, time (or solar zenith angle) grids + INTEGER kz, kw +* altitude + PARAMETER(kz=151) +* wavelength + PARAMETER(kw=157) +*_________________________________________________ +* number of weighting functions + INTEGER kj +* wavelength and altitude dependent + PARAMETER(kj=90) - j = j + 1 - label(j) = 'RB Meter, model 501' - OPEN(UNIT=kin,FILE='DATAS1/rbm.501',STATUS='old') - n = 57 - DO i = 1, n - READ(kin,*) x1(i), y1(i) - ENDDO - CLOSE (kin) - - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),y1(1)) - CALL addpnt(x1,y1,kdata,n, 0.,y1(1)) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF - - DO iw = 1, nw-1 - s(j,iw) = yg(iw) - ENDDO - -********** Eppley UV Photometer -* CAUTION: -* Contrary to the manufacturer's claims, the Eppley Total UV photometer does -* not measure integrated uv radiation in any wavelength band. It actually -* measures the *average* spectral irradiance over 295-385 nm, with the -* averaging kernel given by the instrument's spectral response function -* (which is the product of the photodiode response and the filter transmission -* function). -* The calibration factor provided by Eppley Laboratories Inc. is only valid -* when the photometer is exposed to a spectrum that has the same shape as their -* calibration lamp. The calibration factor is not accurate for exposure to the -* solar spectrum. The values of Eppley total UV irradiance for outdoor -* observations, although reported as W m-2, should be used with caution and -* cannot be associated to any specific physical quantity, such as UVA, -* UVA + UVB, the 295-385 nm band, or the 295-400 nm band. -* The value calculated here is the average spectral irradiance using the -* Eppley repsonse kernel, then multiplied by the nominal bandwith of 90 nm -* (295-385 nm). This value is about 10% higher than the un-weighted integral -* over 295-385 nm, and about 10% lower than the UVA (315-400 nm). -* - Sasha Madronich, March 2009 +* delta for adding points at beginning or end of data grids + REAL deltax + PARAMETER (deltax = 1.E-5) - j = j + 1 - label(j) = 'Eppley UV Photometer' - OPEN(UNIT=kin,FILE='DATAS1/eppley_uv',STATUS='old') - DO i = 1, 6 - READ(kin,*) - ENDDO - n = 19 - DO i = 1, n - READ(kin,*) x1(i), dum1, dum2 - y1(i) = dum1*dum2 - ENDDO - CLOSE(kin) +* some constants... - CALL addpnt(x1,y1,kdata,n,x1(1)*(1.-deltax),0.) - CALL addpnt(x1,y1,kdata,n, 0.,0.) - CALL addpnt(x1,y1,kdata,n,x1(n)*(1.+deltax), 0.) - CALL addpnt(x1,y1,kdata,n, 1.e+38, 0.) - CALL inter2(nw,wl,yg,n,x1,y1,ierr) - IF (ierr .NE. 0) THEN - WRITE(*,*) ierr, label(j) - STOP - ENDIF +* pi: + REAL pi + PARAMETER(pi=3.1415926535898) -* compute normalization +* radius of the earth, km: + REAL radius + PARAMETER(radius=6.371E+3) - sum = 0. - DO iw = 1, nw-1 - sum = sum + yg(iw)*(wl(iw+1) - wl(iw)) - ENDDO +* Planck constant x speed of light, J m - DO iw = 1, nw-1 - s(j,iw) = 90.*yg(iw)/sum - ENDDO + REAL hc + PARAMETER(hc = 6.626068E-34 * 2.99792458E8) -**************************************************************** -**************************************************************** +* largest number of the machine: + REAL largest + PARAMETER(largest=1.E+36) -*_______________________________________________________________________ +* small numbers (positive and negative) + REAL pzero, nzero + PARAMETER(pzero = +10./largest) + PARAMETER(nzero = -10./largest) + +* machine precision + + REAL precis + PARAMETER(precis = 1.e-7) + +* input - IF (j .GT. ks) STOP '1001' + INTEGER nw + REAL wl(kw) + + INTEGER nz + + REAL tlev(kz) + REAL airden(kz) + +* weighting functions + + CHARACTER*50 jlabel(kj) + REAL sq(kj,kz,kw) + INTEGER tpflag(kj) + +* input/output: + INTEGER j + +* local: + REAL wc(kw) + INTEGER iw *_______________________________________________________________________ +* complete wavelength grid + + DO 5, iw = 1, nw - 1 + wc(iw) = (wl(iw) + wl(iw+1))/2. + 5 CONTINUE + +*____________________________________________________________________________ + + +******** Ox Photochemistry + +* A1. O2 + hv -> O + O +* reserve first position. Cross section parameterization in Schumman-Runge and +* Lyman-alpha regions are zenith-angle dependent, will be written in +* subroutine seto2.f. +* declare temperature dependence, tpflag = 1 + + j = 1 + jlabel(j) = 'O2 -> O + O' + tpflag(j) = 1 + +*A2. O3 + hv -> (both channels) + CALL r01(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +******** HOx Photochemistry + +*B1. HO2 + hv -> OH + O +C CALL r39(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*B3. H2O2 + hv -> 2 OH + CALL r08(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +******** NOx Photochemistry + +*C1. NO2 + hv -> NO + O(3P) + CALL r02(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*C2. NO3 + hv -> (both channels) + CALL r03(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*C3. N2O + hv -> N2 + O(1D) +C CALL r44(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*C5. N2O5 + hv -> (both channels) +C CALL r04(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*C6. HNO2 + hv -> OH + NO + CALL r05(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*C7. HNO3 + hv -> OH + NO2 + CALL r06(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*C8. HNO4 + hv -> HO2 + NO2 + CALL r07(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* NO3-(aq) + hv -> NO2 + O- (for snow) +* NO3-(aq) + hv -> NO2- + O(3P) (for snow) +C CALL r118(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +******** Organic Photochemistry + +*D1. CH2O + hv -> (both channels) +c CALL r10(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + CALL pxCH2O(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D2. CH3CHO + hv -> (all three channels) + CALL r11(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D3. C2H5CHO + hv -> C2H5 + HCO + CALL r12(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D9. CH3(OOH) + hv -> CH3O + OH + CALL r16(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D10. HOCH2OOH -> HOCH2O. + OH +C CALL r121(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D12. CH3(ONO2) + hv -> CH3O + NO2 + CALL r17(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D13. CH3(OONO2) -> CH3(OO) + NO2 +C call r134(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH3CH2(ONO2) -> CH3CH2O + NO2 + CALL r106(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* C2H5(ONO2) -> C2H5O + NO2 +C call r141(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* n-C3H7ONO2 -> n-C3H7O + NO2 + call r142(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* 1-C4H9ONO2 -> 1-C4H9O + NO2 +C call r143(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* 2-C4H9ONO2 -> 2-C4H9O + NO2 +C call r144(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH3CH(ONO2)CH3 -> CH3CHOCH3 + NO2 + CALL r107(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH2(OH)CH2(ONO2) -> CH2(OH)CH2(O.) + NO2 +C CALL r108(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH3COCH2(ONO2) -> CH3COCH2(O.) + NO2 +C CALL r109(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* C(CH3)3(ONO2) -> C(CH3)3(O.) + NO2 +C CALL r110(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* C(CH3)3(ONO) -> C(CH3)3(O) + NO +C call r135(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D14. PAN + hv -> CH3CO(OO) + NO2 +* PAN + hv -> CH3CO(O) + NO3 + CALL r18(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D15. CH3CH2COO2NO2 -> CH3CH2CO(OO) + NO2 +* CH3CH2COO2NO2 -> CH2CH2CO(O) + NO3 + CALL r120(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D16. CH2=CHCHO + hv -> Products + CALL r122(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D17. CH2=C(CH3)CHO + hv -> Products + CALL r104(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D18. CH3COCH=CH2 + hv -> Products + CALL r103(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D19. CH2(OH)CHO + hv -> Products + CALL r101(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D20. CH3COCH3 + hv -> Products + CALL r15(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH3COCH2CH3 -> CH3CO + CH2CH3 + CALL r119(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D21. CH2(OH)COCH3 -> CH3CO + CH2(OH) +* CH2(OH)COCH3 -> CH2(OH)CO + CH3 +C CALL r112(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D22. CHOCHO + hv -> Products + CALL r13(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D23. CH3COCHO + hv -> Products + CALL r14(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH3COCOCH3 + hv -> Products +C CALL r102(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D25. CH3CO(OH) + hv -> Products +C CALL r138(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D26. CH3CO(OOH) + hv -> Products + CALL r123(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*D28. CH3COCO(OH) + hv -> Products +C CALL r105(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* (CH3)2NNO -> products +C call r124(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +* CH3COCH2CH2CH3 + hv -> CH3CO + CH2CH2CH3 +* M. Leriche added March 2018 for KETL (CACM, ReLACS2 and ReLACS3) +* Uses availble Martinez data for cross section + CALL r149(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +******** FOx Photochemistry + +*E12. CF2O + hv -> Products +C CALL r22(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +******** ClOx Photochemistry + +*F1. Cl2 + hv -> Cl + Cl +C CALL r47(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F2. ClO -> Cl + O +C call r125(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F3. ClOO + hv -> Products +C CALL r31(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F4. OCLO -> Products +C call r132(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F7. ClOOCl -> Cl + ClOO +C CALL r111(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F13. HCl -> H + Cl +C CALL r137(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F14. HOCl -> HO + Cl +C call r130(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F15. NOCl -> NO + Cl +C call r131(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F16. ClNO2 -> Cl + NO2 +C call r126(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F17. ClONO -> Cl + NO2 +C call r136(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F18. ClONO2 + hv -> Products +C CALL r45(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F19. CCl4 + hv -> Products +C CALL r20(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F20. CH3OCl + hv -> Cl + CH3O +C CALL r139(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F21. CHCl3 -> Products +C CALL r140(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F23. CH3Cl + hv -> Products +C CALL r30(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F24. CH3CCl3 + hv -> Products +C CALL r29(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F30. CCl2O + hv -> Products +C CALL r19(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F32. CClFO + hv -> Products +C CALL r21(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F33. CCl3F (CFC-11) + hv -> Products +C CALL r26(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F34. CCl2F2 (CFC-12) + hv -> Products +C CALL r27(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F36. CF2ClCFCl2 (CFC-113) + hv -> Products +C CALL r23(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F37. CF2ClCF2Cl (CFC-114) + hv -> Products +C CALL r24(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F38. CF3CF2Cl (CFC-115) + hv -> Products +C CALL r25(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F40. CHClF2 (HCFC-22) + hv -> Products +C CALL r38(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F42. CF3CHCl2 (HCFC-123) + hv -> Products +C CALL r32(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F43. CF3CHFCl (HCFC-124) + hv -> Products +C CALL r33(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F45. CH3CFCl2 (HCFC-141b) + hv -> Products +C CALL r34(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F46. CH3CF2Cl (HCFC-142b) + hv -> Products +C CALL r35(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F56. CF3CF2CHCl2 (HCFC-225ca) + hv -> Products +C CALL r36(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*F57. CF2ClCF2CHFCl (HCFC-225cb) + hv -> Products +C CALL r37(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +**** BrOx Photochemistry + +*G1. Br2 -> Br + Br +C CALL r115(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G3. BrO -> Br + O +C CALL r114(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G6. HOBr -> OH + Br +C CALL r113(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G7. BrNO -> Br + NO +C call r127(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G8. BrONO -> Br + NO2 +* BrONO -> BrO + NO +C call r129(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G9. BrNO2 -> Br + NO2 +C call r128(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G10. BrONO2 + hv -> Products +C CALL r46(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G11. BrCl -> Br + Cl +C call r133(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G13. CH3Br + hv -> Products +C CALL r28(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G15. CHBr3 + hv -> Products +C CALL r09(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G25. CF2Br2 (Halon-1202) + hv -> Products +C CALL r40(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G26. CF2BrCl (Halon-1211) + hv -> Products +C CALL r41(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G27. CF3Br (Halon-1301) + hv -> Products +C CALL r42(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*G35. CF2BrCF2Br (Halon-2402) + hv -> Products +C CALL r43(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +**** IOx Photochemistry + +*H01. I2 -> I + I +c CALL r146(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*H02. IO -> I + O +C CALL r147(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*H05. IOH -> I + OH +C CALL r148(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*H24. perfluoro n-iodo propane -> products +C CALL r145(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +******** aqueous phase (diluted solution) Photochemistry +*** M. Leriche March 2018 +*** Add from LaMP code (Deguillaume et al., 2004) + +*AQ01. H2O2(aq) -> 2OH + CALL r151(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +*AQ02. NO3-(aq) -> NO2 + OH + CALL r150(nw,wl,wc,nz,tlev,airden,j,sq,jlabel,tpflag,kout) + +**************************************************************** + + IF (j .GT. kj) STOP '1002' RETURN END +CCC FILE vpair.f *=============================================================================* SUBROUTINE vpair(psurf, nz, z, @@ -37812,9 +42609,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -37978,6 +42773,8 @@ c INCLUDE 'params' RETURN END + +CCC FILE vpo3.f *=============================================================================* SUBROUTINE vpo3(ipbl, zpbl, mr_pbl, @@ -38034,9 +42831,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -38213,6 +43008,8 @@ c INCLUDE 'params' RETURN END + +CCC FILE vptmp.f *=============================================================================* SUBROUTINE vptmp(nz,z,tlev,tlay,kout) @@ -38252,9 +43049,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -38347,9 +43142,14 @@ c INCLUDE 'params' RETURN END + +CCC FILE wshift.f This file contains the subroutine: +* wshift +* the function: +* refrac *_______________________________________________________________________ - SUBROUTINE wshift(mrefr, n, w, airden) + SUBROUTINE wshift(mrefr, n, w, airden, kout) * Shift wavelength scale between air and vacuum. * if mrefr = 1, shift input waveelengths in air to vacuum. @@ -38364,7 +43164,7 @@ c INCLUDE 'params' * i/o file unit numbers INTEGER kout, kin * output - PARAMETER(kout=6) +* PARAMETER(kout=6) * input PARAMETER(kin=78) *_________________________________________________ @@ -38376,9 +43176,7 @@ c INCLUDE 'params' PARAMETER(kw=157) *_________________________________________________ * number of weighting functions - INTEGER ks, kj -* wavelength dependent - PARAMETER(ks=60) + INTEGER kj * wavelength and altitude dependent PARAMETER(kj=90) @@ -38445,9 +43243,7 @@ c INCLUDE 'params' *_______________________________________________________________________ *_______________________________________________________________________ -C ############################## FUNCTION refrac(w,airden) -C ############################## IMPLICIT NONE @@ -38487,27 +43283,4 @@ C ############################## RETURN END -! ######spl - SUBROUTINE ZEROIT( A, LENGTH ) - -c Zeros a real array A having LENGTH elements -c -------------------------------------------------------------------- - -c .. Scalar Arguments .. - - INTEGER LENGTH -c .. -c .. Array Arguments .. - - REAL A( LENGTH ) -c .. -c .. Local Scalars .. - - INTEGER L -c .. - - DO 10 L = 1, LENGTH - A( L ) = 0.0 - 10 CONTINUE - - END +*======= END of TUV 5.3.1 =======* diff --git a/src/MNH/ch_init_jvalues.f90 b/src/MNH/ch_init_jvalues.f90 index 1b7e280b4..72cb3783f 100644 --- a/src/MNH/ch_init_jvalues.f90 +++ b/src/MNH/ch_init_jvalues.f90 @@ -72,7 +72,7 @@ END MODULE MODI_CH_INIT_JVALUES !! !! EXTERNAL !! -------- -!! TUV39.f (Fortran 77 code from S. Madronich) +!! TUV version 5.3.1 (Fortran 77 code from S. Madronich) !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -148,8 +148,8 @@ IF (.NOT.ALLOCATED(XJDATA)) ALLOCATE(XJDATA(NSZA_INCR,NZZ_JVAL,JPJVMAX,NBALB)) ZLWC(JKLEV)= 0.0 ENDDO ! - !* CALL TUV 5.0 - ! ------------ + !* CALL TUV 5.3.1 + ! -------------- ! DO JALB=1,NBALB ZALBLOOP=0.02+0.20*FLOAT(JALB-1)/FLOAT(NBALB-1) diff --git a/src/MNH/modd_ch_init_jvalues.f90 b/src/MNH/modd_ch_init_jvalues.f90 index 67aea522c..54cd33967 100644 --- a/src/MNH/modd_ch_init_jvalues.f90 +++ b/src/MNH/modd_ch_init_jvalues.f90 @@ -33,7 +33,7 @@ INTEGER :: NSZA_INCR = 99 + 1 REAL, ALLOCATABLE, DIMENSION(:) :: XSZA_JVAL INTEGER, PARAMETER :: NZZ_JVAL = 30 + 1 REAL, ALLOCATABLE, DIMENSION(:) :: XZZ_JVAL -INTEGER, PARAMETER :: JPJVMAX = 21 +INTEGER, PARAMETER :: JPJVMAX = 41 INTEGER :: NBALB = 10 ! END MODULE MODD_CH_INIT_JVALUES -- GitLab