Changeset 1125
- Timestamp:
- Dec 11, 2013, 5:43:59 PM (11 years ago)
- Location:
- trunk/LMDZ.MARS/libf/aeronomars
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.MARS/libf/aeronomars/calchim.F90
r1047 r1125 13 13 igcm_noplus, igcm_n2plus, igcm_hplus, & 14 14 igcm_hco2plus, igcm_elec, mmol 15 15 16 use conc_mod, only: mmean ! mean molecular mass of the atmosphere 16 17 … … 33 34 ! update 05/12/2011 synchronize with latest version of chemistry (Franck Lefevre) 34 35 ! update 16/03/2012 optimization (Franck Lefevre) 36 ! update 11/12/2013 optimization (Franck Lefevre) 35 37 ! 36 38 ! Arguments: … … 74 76 ! input: 75 77 76 integer,intent(in) :: ngrid ! number of atmospheric columns77 integer,intent(in) :: nlayer ! number of atmospheric layers78 integer,intent(in) :: nq ! number of tracers78 integer,intent(in) :: ngrid ! number of atmospheric columns 79 integer,intent(in) :: nlayer ! number of atmospheric layers 80 integer,intent(in) :: nq ! number of tracers 79 81 real :: ptimestep 80 82 real :: pplay(ngrid,nlayer) ! pressure at the middle of the layers … … 88 90 real :: pv(ngrid,nlayer) ! v component of the wind (m.s-1) 89 91 real :: pdv(ngrid,nlayer) ! v component tendency 90 real :: dist_sol 91 real :: mu0(ngrid) 92 real :: pq(ngrid,nlayer,nq) ! tracers mass mixing ratio93 real :: pdq(ngrid,nlayer,nq) ! previous tendencies94 real :: zday 95 real :: tauref(ngrid) 96 real :: co2ice(ngrid) 92 real :: dist_sol ! distance of the sun (AU) 93 real :: mu0(ngrid) ! cos of solar zenith angle (=1 when sun at zenith) 94 real :: pq(ngrid,nlayer,nq) ! tracers mass mixing ratio 95 real :: pdq(ngrid,nlayer,nq) ! previous tendencies 96 real :: zday ! date (time since Ls=0, in martian days) 97 real :: tauref(ngrid) ! optical depth at 7 hPa 98 real :: co2ice(ngrid) ! co2 ice surface layer (kg.m-2) 97 99 real :: surfdust(ngrid,nlayer) ! dust surface area (m2/m3) 98 100 real :: surfice(ngrid,nlayer) ! ice surface area (m2/m3) … … 100 102 ! output: 101 103 102 real :: dqchim(ngrid,nlayer,nq) ! tendencies on pq due to chemistry104 real :: dqchim(ngrid,nlayer,nq) ! tendencies on pq due to chemistry 103 105 real :: dqschim(ngrid,nq) ! tendencies on qsurf 104 real :: dqcloud(ngrid,nlayer,nq) ! tendencies on pq due to condensation106 real :: dqcloud(ngrid,nlayer,nq) ! tendencies on pq due to condensation 105 107 real :: dqscloud(ngrid,nq) ! tendencies on qsurf 106 108 … … 109 111 integer,save :: nbq ! number of tracers used in the chemistry 110 112 integer,allocatable,save :: niq(:) ! array storing the indexes of the tracers 111 integer :: iloc(1) ! index of major species113 integer :: iloc(1) ! index of major species 112 114 integer :: ig,l,i,iq,iqmax 113 115 integer :: foundswitch, lswitch … … 147 149 148 150 real :: latvl1, lonvl1 149 real :: zq(ngrid,nlayer,nq) ! pq+pdq*ptimestep before chemistry150 151 real :: zq(ngrid,nlayer,nq) ! pq+pdq*ptimestep before chemistry 152 ! new mole fraction after 151 153 real :: zt(ngrid,nlayer) ! temperature 152 154 real :: zu(ngrid,nlayer) ! u component of the wind 153 155 real :: zv(ngrid,nlayer) ! v component of the wind 154 real :: taucol 156 real :: taucol ! optical depth at 7 hPa 155 157 156 158 logical,save :: firstcall = .true. 157 logical,save :: depos = .false. 159 logical,save :: depos = .false. ! switch for dry deposition 158 160 159 161 ! for each column of atmosphere: 160 162 161 real :: zpress(nlayer) ! 162 real :: zdens(nlayer) ! 163 real :: ztemp(nlayer) ! 164 real :: zlocal(nlayer) ! 165 real :: zycol(nlayer,nq) !Composition (mole fractions)166 real :: szacol !Solar zenith angle167 real :: surfice1d(nlayer) ! 168 real :: surfdust1d(nlayer) ! 169 real :: jo3(nlayer) ! 163 real :: zpress(nlayer) ! Pressure (mbar) 164 real :: zdens(nlayer) ! Density (cm-3) 165 real :: ztemp(nlayer) ! Temperature (K) 166 real :: zlocal(nlayer) ! Altitude (km) 167 real :: zycol(nlayer,nq) ! Composition (mole fractions) 168 real :: szacol ! Solar zenith angle 169 real :: surfice1d(nlayer) ! Ice surface area (cm2/cm3) 170 real :: surfdust1d(nlayer) ! Dust surface area (cm2/cm3) 171 real :: jo3(nlayer) ! Photodissociation rate O3->O1D (s-1) 170 172 171 173 ! for output: 172 174 173 logical :: output 175 logical :: output ! to issue calls to writediagfi and stats 174 176 parameter (output = .true.) 175 177 real :: jo3_3d(ngrid,nlayer) ! Photodissociation rate O3->O1D (s-1) … … 645 647 646 648 if (photochem) then 647 call photochemistry(lswitch,zycol,szacol,ptimestep, & 649 call photochemistry(nlayer,nq, & 650 lswitch,zycol,szacol,ptimestep, & 648 651 zpress,ztemp,zdens,dist_sol, & 649 652 surfdust1d,surfice1d,jo3,taucol) -
trunk/LMDZ.MARS/libf/aeronomars/photochemistry.F
r1036 r1125 6 6 c ------ 7 7 c 8 c Version: 1 7/03/20118 c Version: 11/12/2013 9 9 c 10 10 c***************************************************************** 11 c 12 subroutine photochemistry(lswitch, zycol, sza, ptimestep, 11 12 subroutine photochemistry(nlayer, nq, 13 $ lswitch, zycol, sza, ptimestep, 13 14 $ press,temp, dens, dist_sol, surfdust1d, 14 15 $ surfice1d, jo3, tau) 15 c 16 use tracer_mod, only: nqmx 16 17 17 implicit none 18 c 19 #include "dimensions.h"20 #include "dimphys.h"18 19 !#include "dimensions.h" 20 !#include "dimphys.h" 21 21 #include "chimiedata.h" 22 22 #include "callkeys.h" 23 23 !#include "tracer.h" 24 c 24 25 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 26 c inputs: 27 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 28 29 integer, intent(in) :: nlayer ! number of atmospheric layers 30 integer, intent(in) :: nq ! number of tracers 31 32 real :: sza ! solar zenith angle (deg) 33 real :: ptimestep ! physics timestep (s) 34 real :: press(nlayer) ! pressure (hpa) 35 real :: temp(nlayer) ! temperature (k) 36 real :: dens(nlayer) ! density (cm-3) 37 real :: dist_sol ! sun distance (au) 38 real :: surfdust1d(nlayer) ! dust surface area (cm2/cm3) 39 real :: surfice1d(nlayer) ! ice surface area (cm2/cm3) 40 real :: tau ! optical depth at 7 hpa 41 25 42 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 26 43 c input/output: 27 44 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 28 c 29 real zycol(nlayermx,nqmx) ! chemical species volume mixing ratio 30 c 31 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 32 c inputs: 33 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 34 c 35 real sza ! solar zenith angle (deg) 36 real ptimestep ! physics timestep (s) 37 real press(nlayermx) ! pressure (hpa) 38 real temp(nlayermx) ! temperature (k) 39 real dens(nlayermx) ! density (cm-3) 40 real dist_sol ! sun distance (au) 41 real surfdust1d(nlayermx) ! dust surface area (cm2/cm3) 42 real surfice1d(nlayermx) ! ice surface area (cm2/cm3) 43 real tau ! optical depth at 7 hpa 44 c 45 46 real :: zycol(nlayer,nq) ! chemical species volume mixing ratio 47 45 48 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 46 49 c output: 47 50 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 48 c49 real jo3(nlayermx) ! photodissociation rate o3 -> o1d50 c 51 52 real :: jo3(nlayer) ! photodissociation rate o3 -> o1d 53 51 54 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 52 55 c local: 53 56 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 54 c 55 integer phychemrat ! ratio physics timestep/chemistry timestep 56 integer istep 57 integer i_co2,i_o3,j_o3_o1d,lev 58 integer nesp 59 integer lswitch 60 c 61 parameter (nesp = 16) ! number of species in the chemistry 62 c 63 real stimestep ! standard timestep for the chemistry (s) 64 real ctimestep ! real timestep for the chemistry (s) 65 real rm(nlayermx,nesp) ! species volume mixing ratio 66 real j(nlayermx,nd) ! interpolated photolysis rates (s-1) 67 real rmco2(nlayermx) ! co2 mixing ratio 68 real rmo3(nlayermx) ! ozone mixing ratio 69 c 57 58 integer, parameter :: nesp = 16 ! number of species in the chemistry 59 60 integer :: phychemrat ! ratio physics timestep/chemistry timestep 61 integer :: istep 62 integer :: i_co2,i_o3,j_o3_o1d,lev 63 integer :: lswitch 64 65 real :: stimestep ! standard timestep for the chemistry (s) 66 real :: ctimestep ! real timestep for the chemistry (s) 67 real :: rm(nlayer,nesp) ! species volume mixing ratio 68 real :: j(nlayer,nd) ! interpolated photolysis rates (s-1) 69 real :: rmco2(nlayer) ! co2 mixing ratio 70 real :: rmo3(nlayer) ! ozone mixing ratio 71 70 72 c reaction rates 71 c 72 real a001(nlayermx), a002(nlayermx), a003(nlayermx)73 real b001(nlayermx), b002(nlayermx), b003(nlayermx),74 $ b004(nlayermx), b005(nlayermx), b006(nlayermx),75 $ b007(nlayermx), b008(nlayermx), b009(nlayermx)76 real c001(nlayermx), c002(nlayermx), c003(nlayermx),77 $ c004(nlayermx), c005(nlayermx), c006(nlayermx),78 $ c007(nlayermx), c008(nlayermx), c009(nlayermx),79 $ c010(nlayermx), c011(nlayermx), c012(nlayermx),80 $ c013(nlayermx), c014(nlayermx), c015(nlayermx),81 $ c016(nlayermx), c017(nlayermx), c018(nlayermx)82 real d001(nlayermx), d002(nlayermx), d003(nlayermx)83 real e001(nlayermx), e002(nlayermx), e003(nlayermx)84 real h001(nlayermx), h002(nlayermx), h003(nlayermx),85 $ h004(nlayermx), h005(nlayermx)86 real t001(nlayermx), t002(nlayermx), t003(nlayermx)87 c 73 74 real :: a001(nlayer), a002(nlayer), a003(nlayer) 75 real :: b001(nlayer), b002(nlayer), b003(nlayer), 76 $ b004(nlayer), b005(nlayer), b006(nlayer), 77 $ b007(nlayer), b008(nlayer), b009(nlayer) 78 real :: c001(nlayer), c002(nlayer), c003(nlayer), 79 $ c004(nlayer), c005(nlayer), c006(nlayer), 80 $ c007(nlayer), c008(nlayer), c009(nlayer), 81 $ c010(nlayer), c011(nlayer), c012(nlayer), 82 $ c013(nlayer), c014(nlayer), c015(nlayer), 83 $ c016(nlayer), c017(nlayer), c018(nlayer) 84 real :: d001(nlayer), d002(nlayer), d003(nlayer) 85 real :: e001(nlayer), e002(nlayer), e003(nlayer) 86 real :: h001(nlayer), h002(nlayer), h003(nlayer), 87 $ h004(nlayer), h005(nlayer) 88 real :: t001(nlayer), t002(nlayer), t003(nlayer) 89 88 90 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 89 91 c stimestep : standard timestep for the chemistry (s) c … … 91 93 c phychemrat : ratio physical/chemical timestep c 92 94 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 93 c 95 94 96 stimestep = 600. ! standard value : 10 mn 95 c 97 96 98 phychemrat = nint(ptimestep/stimestep) 97 c 99 98 100 ctimestep = ptimestep/real(phychemrat) 99 c 101 100 102 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 101 103 c initialisation of chemical species and families c 102 104 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 103 c 104 call gcmtochim( zycol, lswitch, nesp, rm)105 c 105 106 call gcmtochim(nlayer, nq, zycol, lswitch, nesp, rm) 107 106 108 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 107 109 c compute reaction rates c 108 110 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 109 c 110 call chemrates(lswitch, dens, press, temp, 111 112 call chemrates(nlayer, 113 $ lswitch, dens, press, temp, 111 114 $ surfdust1d, surfice1d, 112 115 $ a001, a002, a003, … … 120 123 $ h001, h002, h003, h004, h005, 121 124 $ t001, t002, t003, tau) 122 c 125 123 126 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 124 127 c interpolation of photolysis rates in the lookup table c 125 128 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 126 c 129 127 130 i_co2 = 1 128 131 i_o3 = 6 129 c 132 130 133 do lev = 1,lswitch-1 131 134 rmco2(lev) = rm(lev,i_co2) 132 135 rmo3(lev) = rm(lev, i_o3) 133 136 end do 134 c 135 call phot( lswitch, press, temp, sza, tau, dist_sol,137 138 call phot(nlayer, lswitch, press, temp, sza, tau, dist_sol, 136 139 $ rmco2, rmo3, j) 137 c 140 138 141 j_o3_o1d = 5 139 c 142 140 143 do lev = 1,lswitch-1 141 144 jo3(lev) = j(lev,j_o3_o1d) 142 145 end do 143 c 146 144 147 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 145 148 c loop over time within the physical timestep c 146 149 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 147 c 150 148 151 do istep = 1,phychemrat 149 call chimie( lswitch,nesp, rm, j, dens, ctimestep,152 call chimie(nlayer, lswitch, nesp, rm, j, dens, ctimestep, 150 153 $ press, temp, sza, dist_sol, 151 154 $ a001, a002, a003, … … 160 163 $ t001, t002, t003) 161 164 end do 162 c 165 163 166 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 164 167 c save chemical species for the gcm c 165 168 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 166 c 167 call chimtogcm( zycol, lswitch, nesp, rm)168 c 169 170 call chimtogcm(nlayer, nq, zycol, lswitch, nesp, rm) 171 169 172 return 170 173 end 171 c 174 172 175 c***************************************************************** 173 c 174 subroutine chimie(lswitch, nesp, rm, j, dens, dt, 176 177 subroutine chimie(nlayer, 178 $ lswitch, nesp, rm, j, dens, dt, 175 179 $ press, t, sza, dist_sol, 176 180 $ a001, a002, a003, … … 184 188 $ h001, h002, h003, h004, h005, 185 189 $ t001, t002, t003) 186 c 190 187 191 c***************************************************************** 188 c 192 189 193 implicit none 190 c 191 #include "dimensions.h"192 #include "dimphys.h"194 195 !#include "dimensions.h" 196 !#include "dimphys.h" 193 197 #include "chimiedata.h" 194 198 #include "callkeys.h" 195 c 199 200 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 201 c inputs: 202 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 203 204 integer, intent(in) :: nlayer ! number of atmospheric layers 205 integer :: lswitch ! interface level between chemistries 206 integer :: nesp ! number of species 207 208 real :: dens(nlayer) ! density (cm-3) 209 real :: dt ! chemistry timestep (s) 210 real :: j(nlayer,nd) ! interpolated photolysis rates (s-1) 211 real :: press(nlayer) ! pressure (hpa) 212 real :: t(nlayer) ! temperature (k) 213 real :: sza ! solar zenith angle (deg) 214 real :: dist_sol ! sun distance (au) 215 216 c reaction rates 217 218 real :: a001(nlayer), a002(nlayer), a003(nlayer) 219 real :: b001(nlayer), b002(nlayer), b003(nlayer), 220 $ b004(nlayer), b005(nlayer), b006(nlayer), 221 $ b007(nlayer), b008(nlayer), b009(nlayer) 222 real :: c001(nlayer), c002(nlayer), c003(nlayer), 223 $ c004(nlayer), c005(nlayer), c006(nlayer), 224 $ c007(nlayer), c008(nlayer), c009(nlayer), 225 $ c010(nlayer), c011(nlayer), c012(nlayer), 226 $ c013(nlayer), c014(nlayer), c015(nlayer), 227 $ c016(nlayer), c017(nlayer), c018(nlayer) 228 real :: d001(nlayer), d002(nlayer), d003(nlayer) 229 real :: e001(nlayer), e002(nlayer), e003(nlayer) 230 real :: h001(nlayer), h002(nlayer), h003(nlayer), 231 $ h004(nlayer), h005(nlayer) 232 real :: t001(nlayer), t002(nlayer), t003(nlayer) 233 196 234 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 197 235 c input/output: 198 236 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 199 c 200 integer lswitch ! interface level between chemistries 201 integer nesp ! number of species 202 c 203 real rm(nlayermx,nesp) ! volume mixing ratios 204 c 205 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 206 c inputs: 207 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 208 c 209 real dens(nlayermx) ! density (cm-3) 210 real dt ! chemistry timestep (s) 211 real j(nlayermx,nd) ! interpolated photolysis rates (s-1) 212 real press(nlayermx) ! pressure (hpa) 213 real t(nlayermx) ! temperature (k) 214 real sza ! solar zenith angle (deg) 215 real dist_sol ! sun distance (au) 216 c 217 c reaction rates 218 c 219 real a001(nlayermx), a002(nlayermx), a003(nlayermx) 220 real b001(nlayermx), b002(nlayermx), b003(nlayermx), 221 $ b004(nlayermx), b005(nlayermx), b006(nlayermx), 222 $ b007(nlayermx), b008(nlayermx), b009(nlayermx) 223 real c001(nlayermx), c002(nlayermx), c003(nlayermx), 224 $ c004(nlayermx), c005(nlayermx), c006(nlayermx), 225 $ c007(nlayermx), c008(nlayermx), c009(nlayermx), 226 $ c010(nlayermx), c011(nlayermx), c012(nlayermx), 227 $ c013(nlayermx), c014(nlayermx), c015(nlayermx), 228 $ c016(nlayermx), c017(nlayermx), c018(nlayermx) 229 real d001(nlayermx), d002(nlayermx), d003(nlayermx) 230 real e001(nlayermx), e002(nlayermx), e003(nlayermx) 231 real h001(nlayermx), h002(nlayermx), h003(nlayermx), 232 $ h004(nlayermx), h005(nlayermx) 233 real t001(nlayermx), t002(nlayermx), t003(nlayermx) 234 c 237 238 real :: rm(nlayer,nesp) ! volume mixing ratios 239 235 240 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 236 241 c local: 237 242 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 238 c 239 real hetero_ice, hetero_dust 240 c 241 integer iesp, iter, l, niter 242 integer i_co2, i_co, i_o2, i_h2, i_h2o, i_h2o2, i_hox, i_ox, 243 $ i_o1d, i_o, i_o3, i_h, i_oh, i_ho2, i_ch4, i_n2 244 integer j_o2_o, j_o2_o1d, j_co2_o, j_co2_o1d, 245 $ j_o3_o1d, j_o3_o, j_h2o, j_hdo, j_h2o2, 246 $ j_ho2, j_no2, j_ch4_ch3_h, j_ch4_1ch2_h2, 247 $ j_ch4_3ch2_h_h, j_ch4_ch_h2_h, j_ch3o2h, 248 $ j_ch2o_co, j_ch2o_hco, j_ch3oh, j_c2h6, j_hcl, 249 $ j_hocl, j_clo, j_so2, j_so, j_h2s, j_so3, 250 $ j_hno3, j_hno4 251 c 252 parameter (hetero_ice = 1.) ! switch for het. chem. on ice clouds 253 parameter (hetero_dust = 0.) ! switch for het. chem. on dust 254 ! hetero_dust = 0. advised for the moment 255 c 256 parameter (niter = 5) ! iterations in the chemical scheme 257 c 258 real cc0(nlayermx,nesp) ! initial number density (cm-3) 259 real cc(nlayermx,nesp) ! final number density (cm-3) 260 real nox(nlayermx) ! nox number density (cm-3) 261 real no(nlayermx) ! no number density (cm-3) 262 real no2(nlayermx) ! no2 number density (cm-3) 263 real production(nlayermx,nesp) ! production rate 264 real loss(nlayermx,nesp) ! loss rate 265 c 266 real ro_o3, rh_ho2, roh_ho2, rno2_no 267 c 243 244 real, parameter :: hetero_ice = 1. ! switch for het. chem. on ice clouds 245 real, parameter :: hetero_dust = 0. ! switch for het. chem. on dust 246 247 integer :: iesp, iter, l 248 integer :: i_co2, i_co, i_o2, i_h2, i_h2o, i_h2o2, i_hox, i_ox, 249 $ i_o1d, i_o, i_o3, i_h, i_oh, i_ho2, i_ch4, i_n2 250 integer :: j_o2_o, j_o2_o1d, j_co2_o, j_co2_o1d, 251 $ j_o3_o1d, j_o3_o, j_h2o, j_hdo, j_h2o2, 252 $ j_ho2, j_no2, j_ch4_ch3_h, j_ch4_1ch2_h2, 253 $ j_ch4_3ch2_h_h, j_ch4_ch_h2_h, j_ch3o2h, 254 $ j_ch2o_co, j_ch2o_hco, j_ch3oh, j_c2h6, j_hcl, 255 $ j_hocl, j_clo, j_so2, j_so, j_h2s, j_so3, 256 $ j_hno3, j_hno4 257 258 integer, parameter :: niter = 5 ! iterations in the chemical scheme 259 260 real :: cc0(nlayer,nesp) ! initial number density (cm-3) 261 real :: cc(nlayer,nesp) ! final number density (cm-3) 262 real :: nox(nlayer) ! nox number density (cm-3) 263 real :: no(nlayer) ! no number density (cm-3) 264 real :: no2(nlayer) ! no2 number density (cm-3) 265 real :: production(nlayer,nesp) ! production rate 266 real :: loss(nlayer,nesp) ! loss rate 267 268 real :: ro_o3, rh_ho2, roh_ho2, rno2_no 269 268 270 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 269 271 c tracer numbering in the chemistry 270 272 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 271 c 273 272 274 i_co2 = 1 273 275 i_co = 2 … … 286 288 i_hox = 15 287 289 i_ox = 16 288 c 290 289 291 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 290 292 c numbering of photolysis rates 291 293 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 292 c 294 293 295 j_o2_o = 1 ! o2 + hv -> o + o 294 296 j_o2_o1d = 2 ! o2 + hv -> o + o(1d) … … 320 322 j_hno3 = 28 ! hno3 + hv -> oh + no2 321 323 j_hno4 = 29 ! hno4 + hv -> ho2 + no2 322 c 324 323 325 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 324 326 c volume mixing ratio -> density conversion 325 327 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 326 c 328 327 329 do iesp = 1,nesp 328 330 do l = 1,lswitch-1 … … 331 333 end do 332 334 end do 333 c 335 334 336 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 335 337 c co2 and nox number densities (cm-3) … … 337 339 c nox mixing ratio: 6.e-10 (yung and demore, 1999) 338 340 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 339 c 341 340 342 do l = 1,lswitch-1 341 343 nox(l) = 6.e-10*dens(l) 342 344 end do 343 c 345 344 346 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 345 347 c loop over iterations in the chemical scheme 346 348 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 347 c 349 348 350 do iter = 1,niter 349 c 351 350 352 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 351 353 c nox species … … 353 355 c no2/no 354 356 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 355 c 357 356 358 do l = 1,lswitch-1 357 c 359 358 360 rno2_no = (d002(l)*cc(l,i_o3) + d003(l)*cc(l,i_ho2)) 359 361 $ /(j(l,j_no2) + 360 362 $ d001(l)*max(cc(l,i_o),1.e-30*dens(l))) 361 c 363 362 364 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 363 365 c no 364 366 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 365 c 367 366 368 no(l) = nox(l)/(1. + rno2_no) 367 c 369 368 370 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 369 371 c no2 370 372 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 371 c 373 372 374 no2(l) = no(l)*rno2_no 373 c 375 374 376 end do 375 c 377 376 378 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 377 379 c hox species … … 381 383 c h/ho2 382 384 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 383 c 385 384 386 do l = 1,lswitch-1 385 c 387 386 388 rh_ho2 = (c001(l)*cc(l,i_o) 387 389 $ + c004(l)*cc(l,i_h) … … 400 402 $ /max(cc(l,i_h),dens(l)*1.e-30) ! ajout 20090401 401 403 $ ) 402 c 404 403 405 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 404 406 c oh/ho2 405 407 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 406 c 408 407 409 roh_ho2 = (c001(l)*cc(l,i_o) 408 410 $ + c003(l)*cc(l,i_o3)*rh_ho2 … … 428 430 $ + e001(l)*cc(l,i_co) 429 431 $ + h002(l)*hetero_ice) 430 c 432 431 433 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 432 434 c h 433 435 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 434 c 436 435 437 cc(l,i_h) = cc(l,i_hox) 436 438 $ /(1. + (1. + roh_ho2)/rh_ho2) 437 c 439 438 440 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 439 441 c ho2 440 442 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 441 c 443 442 444 cc(l,i_ho2) = cc(l,i_h)/rh_ho2 443 c 445 444 446 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 445 447 c oh 446 448 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 447 c 449 448 450 cc(l,i_oh) = cc(l,i_ho2)*roh_ho2 449 c 451 450 452 end do 451 c 453 452 454 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 453 455 c ox species … … 462 464 c - continuity equation for o 463 465 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 464 c466 465 467 if (sza .le. 95.) then 466 c 468 467 469 do l = 1,lswitch-1 468 c 470 469 471 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 470 472 c o(1d) 471 473 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 472 c 474 473 475 cc(l,i_o1d) = (j(l,j_co2_o1d)*cc(l,i_co2) 474 476 $ + j(l,j_o2_o1d)*cc(l,i_o2) … … 480 482 $ + b005(l)*cc(l,i_o3) 481 483 $ + b006(l)*cc(l,i_o3)) 482 c 484 483 485 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 484 486 c o/o3 485 487 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 486 c 488 487 489 ro_o3 = (j(l,j_o3_o1d) + j(l,j_o3_o) 488 490 $ + a003(l)*cc(l,i_o) … … 492 494 $ ) 493 495 $ /(a001(l)*cc(l,i_o2)) 494 c 496 495 497 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 496 498 c o3 497 499 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 498 c 500 499 501 cc(l,i_o3) = cc(l,i_ox)/(1. + ro_o3) 500 c 502 501 503 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 502 504 c o 503 505 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 504 c 506 505 507 cc(l,i_o) = cc(l,i_o3)*ro_o3 506 c 508 507 509 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 508 510 c ox = o + o3 509 511 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 510 c 512 511 513 production(l,i_ox) = 512 514 $ + j(l,j_co2_o)*cc(l,i_co2) … … 518 520 $ + c013(l)*cc(l,i_oh)*cc(l,i_oh) 519 521 $ + d003(l)*cc(l,i_ho2)*no(l) 520 c 522 521 523 loss(l,i_ox) = 2.*a002(l)*cc(l,i_o)*cc(l,i_o) 522 524 $ + 2.*a003(l)*cc(l,i_o)*cc(l,i_o3) … … 529 531 $ + d001(l)*cc(l,i_o)*no2(l) 530 532 $ + e002(l)*cc(l,i_o)*cc(l,i_co) 531 c 533 532 534 loss(l,i_ox) = loss(l,i_ox)/cc(l,i_ox) 533 c 535 534 536 end do 535 c 537 536 538 else 537 c 539 538 540 do l = 1,lswitch-1 539 c 541 540 542 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 541 543 c o(1d) 542 544 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 543 c 545 544 546 cc(l,i_o1d) = 0. 545 c 547 546 548 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 547 549 c o3 548 550 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 549 c 551 550 552 production(l,i_o3) = a001(l)*cc(l,i_o2)*cc(l,i_o) 551 c 553 552 554 loss(l,i_o3) = a003(l)*cc(l,i_o) 553 555 $ + c003(l)*cc(l,i_h) 554 556 $ + c014(l)*cc(l,i_oh) 555 557 $ + c015(l)*cc(l,i_ho2) 556 c557 558 558 559 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 559 560 c o 560 561 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 561 c 562 562 563 production(l,i_o) = c006(l)*cc(l,i_h)*cc(l,i_ho2) 563 564 $ + c013(l)*cc(l,i_oh)*cc(l,i_oh) 564 c 565 565 566 loss(l,i_o) = a001(l)*cc(l,i_o2) 566 567 $ + 2.*a002(l)*cc(l,i_o) … … 570 571 $ + c012(l)*cc(l,i_h2o2) 571 572 $ + e002(l)*cc(l,i_co) 572 c 573 573 574 end do 574 575 end if 575 c 576 576 577 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 577 578 c other species 578 579 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 579 c 580 580 581 do l = 1,lswitch-1 581 c 582 582 583 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 583 584 c co2 584 585 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 585 c 586 586 587 production(l,i_co2) = e001(l)*cc(l,i_oh)*cc(l,i_co) 587 588 $ + e002(l)*cc(l,i_o)*cc(l,i_co) 588 589 $ + t002(l)*cc(l,i_ch4)*16./44. ! ajout 20090401 589 590 $ + t003(l)*cc(l,i_co2)*8./44. ! ajout 20090401 590 c 591 591 592 loss(l,i_co2) = j(l,j_co2_o) 592 593 $ + j(l,j_co2_o1d) 593 594 $ + t003(l) 594 c 595 595 596 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 596 597 c co 597 598 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 598 c 599 599 600 production(l,i_co) = j(l,j_co2_o)*cc(l,i_co2) 600 601 $ + j(l,j_co2_o1d)*cc(l,i_co2) 601 602 $ + t003(l)*cc(l,i_co2) 602 c 603 603 604 loss(l,i_co) = e001(l)*cc(l,i_oh) 604 605 $ + e002(l)*cc(l,i_o) 605 c 606 606 607 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 607 608 c o2 608 609 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 609 c 610 610 611 production(l,i_o2) = 611 612 $ j(l,j_o3_o)*cc(l,i_o3) … … 625 626 $ + c016(l)*cc(l,i_ho2)*cc(l,i_ho2) 626 627 $ + d001(l)*cc(l,i_o)*no2(l) 627 c 628 628 629 loss(l,i_o2) = j(l,j_o2_o) 629 630 $ + j(l,j_o2_o1d) 630 631 $ + a001(l)*cc(l,i_o) 631 632 $ + c011(l)*cc(l,i_h) 632 c 633 633 634 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 634 635 c h2 635 636 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 636 c 637 637 638 production(l,i_h2) = c005(l)*cc(l,i_h)*cc(l,i_ho2) 638 639 $ + c018(l)*cc(l,i_h)*cc(l,i_h) 639 c 640 640 641 loss(l,i_h2) = b003(l)*cc(l,i_o1d) 641 642 $ + c010(l)*cc(l,i_oh) 642 c 643 643 644 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 644 645 c h2o 645 646 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 646 c 647 647 648 production(l,i_h2o) = 648 649 $ c006(l)*cc(l,i_h)*cc(l,i_ho2) … … 652 653 $ + c013(l)*cc(l,i_oh)*cc(l,i_oh) 653 654 $ + h004(l)*cc(l,i_h2o2)*hetero_ice 654 c 655 655 656 loss(l,i_h2o) = j(l,j_h2o) 656 657 $ + b002(l)*cc(l,i_o1d) 657 658 $ + t001(l) 658 c 659 659 660 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 660 661 c h2o2 661 662 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 662 c 663 663 664 production(l,i_h2o2) = 664 665 $ c008(l)*cc(l,i_ho2)*cc(l,i_ho2) … … 667 668 c $ + 0.5*h001(l)*cc(l,i_ho2)*hetero_ice 668 669 c $ + 0.5*h002(l)*cc(l,i_oh)*hetero_ice 669 c 670 670 671 loss(l,i_h2o2) = j(l,j_h2o2) 671 672 $ + c009(l)*cc(l,i_oh) … … 673 674 $ + h004(l)*hetero_ice 674 675 $ + h005(l)*hetero_dust 675 c 676 676 677 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 677 678 c hox = h + oh + ho2 678 679 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 679 c 680 680 681 production(l,i_hox) = 681 682 $ 2.*j(l,j_h2o)*cc(l,i_h2o) … … 685 686 $ + 2.*c012(l)*cc(l,i_o)*cc(l,i_h2o2) 686 687 $ + 2.*t001(l)*cc(l,i_h2o) 687 c 688 688 689 loss(l,i_hox) = 2.*c005(l)*cc(l,i_h)*cc(l,i_ho2) 689 690 $ + 2.*c006(l)*cc(l,i_h)*cc(l,i_ho2) … … 697 698 $ + h002(l)*cc(l,i_oh)*hetero_ice 698 699 $ + h003(l)*cc(l,i_ho2)*hetero_dust 699 c 700 700 701 loss(l,i_hox) = loss(l,i_hox)/cc(l,i_hox) 701 c 702 702 703 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 703 704 c ch4 704 705 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 705 c 706 706 707 production(l,i_ch4) = 0. 707 c 708 708 709 loss(l,i_ch4) = j(l,j_ch4_ch3_h) 709 710 $ + j(l,j_ch4_1ch2_h2) … … 714 715 $ + b009(l)*cc(l,i_o1d) 715 716 $ + e003(l)*cc(l,i_oh) 716 c 717 717 718 end do 718 c 719 719 720 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 720 721 c update number densities 721 722 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 722 c 723 723 724 c long-lived species 724 c 725 725 726 do l = 1,lswitch-1 726 727 cc(l,i_co2) = (cc0(l,i_co2) + production(l,i_co2)*dt) … … 741 742 $ /(1. + loss(l,i_ch4)*dt) 742 743 end do 743 c 744 744 745 c ox species 745 c 746 746 747 if (sza .le. 95.) then 747 748 do l = 1,lswitch-1 … … 758 759 end do 759 760 end if 760 c 761 761 762 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 762 763 c end of loop over iterations 763 764 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 764 c 765 765 766 end do 766 c 767 767 768 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 768 769 c density -> volume mixing ratio conversion 769 770 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 770 c 771 771 772 do iesp = 1,nesp 772 773 do l = 1,lswitch-1 … … 774 775 end do 775 776 end do 776 c 777 777 778 return 778 779 end 779 c 780 780 781 c***************************************************************** 781 c 782 subroutine phot(lswitch, press, temp, sza, tauref, dist_sol, 782 783 subroutine phot(nlayer, 784 $ lswitch, press, temp, sza, tauref, dist_sol, 783 785 $ rmco2, rmo3, j) 784 c 786 785 787 c***************************************************************** 786 c 788 787 789 implicit none 788 c 789 #include "dimensions.h"790 #include "dimphys.h"790 791 !#include "dimensions.h" 792 !#include "dimphys.h" 791 793 #include "chimiedata.h" 792 794 #include "comcstfi.h" 793 c 795 794 796 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 795 797 c inputs: 796 798 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 797 c 798 integer lswitch ! interface level between chemistries 799 real press(nlayermx) ! pressure (hPa) 800 real temp(nlayermx) ! temperature (K) 801 real sza ! solar zenith angle (deg) 802 real tauref ! optical depth at 7 hpa 803 real dist_sol ! sun distance (AU) 804 real rmco2(nlayermx) ! co2 mixing ratio 805 real rmo3(nlayermx) ! ozone mixing ratio 806 c 799 800 integer, intent(in) :: nlayer ! number of atmospheric layers 801 integer :: lswitch ! interface level between chemistries 802 real :: press(nlayer) ! pressure (hPa) 803 real :: temp(nlayer) ! temperature (K) 804 real :: sza ! solar zenith angle (deg) 805 real :: tauref ! optical depth at 7 hpa 806 real :: dist_sol ! sun distance (AU) 807 real :: rmco2(nlayer) ! co2 mixing ratio 808 real :: rmo3(nlayer) ! ozone mixing ratio 809 807 810 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 808 811 c output: 809 812 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 810 c 811 real j(nlayermx,nd)! interpolated photolysis rates (s-1)812 c 813 814 real :: j(nlayer,nd) ! interpolated photolysis rates (s-1) 815 813 816 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 814 817 c local: 815 818 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 816 c 817 integer icol, ij, indsza, indtau, indcol, indozo, indtemp,818 $ iozo, isza, itau, it, l819 c 820 real col(nlayermx)! overhead air column (molecule cm-2)821 real colo3(nlayermx)! overhead ozone column (molecule cm-2)822 real poids(2,2,2,2,2) ! 5D interpolation weights823 real tref ! temperature at 1.9 hPa in the gcm (K)824 real table_temp(ntemp) ! temperatures at 1.9 hPa in jmars (K)825 real cinf, csup, cicol,826 $ ciozo, cisza, citemp, citau827 real colo3min, dp, coef828 real ratio_o3(nlayermx)829 real tau830 c 819 820 integer :: icol, ij, indsza, indtau, indcol, indozo, indtemp, 821 $ iozo, isza, itau, it, l 822 823 real :: col(nlayer) ! overhead air column (molecule cm-2) 824 real :: colo3(nlayer) ! overhead ozone column (molecule cm-2) 825 real :: poids(2,2,2,2,2) ! 5D interpolation weights 826 real :: tref ! temperature at 1.9 hPa in the gcm (K) 827 real :: table_temp(ntemp) ! temperatures at 1.9 hPa in jmars (K) 828 real :: cinf, csup, cicol, 829 $ ciozo, cisza, citemp, citau 830 real :: colo3min, dp, coef 831 real :: ratio_o3(nlayer) 832 real :: tau 833 831 834 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 832 835 c day/night criterion 833 836 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 834 c 837 835 838 if (sza .le. 95.) then 836 c 839 837 840 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 838 841 c temperatures at 1.9 hPa in lookup table 839 842 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 840 c843 841 844 table_temp(1) = 226.2 842 845 table_temp(2) = 206.2 843 846 table_temp(3) = 186.2 844 847 table_temp(4) = 169.8 845 c 848 846 849 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 847 850 c interpolation in solar zenith angle 848 851 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 849 c 852 850 853 indsza = nsza - 1 851 854 do isza = 1,nsza … … 857 860 cisza = (sza - szatab(indsza)) 858 861 $ /(szatab(indsza + 1) - szatab(indsza)) 859 c 862 860 863 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 861 864 c interpolation in dust (tau) 862 865 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 863 c 866 864 867 tau = min(tauref, tautab(ntau)) 865 868 tau = max(tau, tautab(1)) 866 c 869 867 870 indtau = ntau - 1 868 871 do itau = 1,ntau … … 874 877 citau = (tau - tautab(indtau)) 875 878 $ /(tautab(indtau + 1) - tautab(indtau)) 876 c 879 877 880 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 878 881 c co2 and ozone columns 879 882 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 880 c 883 881 884 c co2 column at model top (molecule.cm-2) 882 c 885 883 886 col(lswitch-1) = 6.022e22*rmco2(lswitch-1)*press(lswitch-1)*100. 884 887 $ /(mugaz*g) 885 c 888 886 889 c ozone column at model top 887 c 890 888 891 colo3(lswitch-1) = 0. 889 c 892 890 893 c co2 and ozone columns for other levels (molecule.cm-2) 891 c 894 892 895 do l = lswitch-2,1,-1 893 896 dp = (press(l) - press(l+1))*100. … … 900 903 $ *6.022e22*dp/(mugaz*g) 901 904 end do 902 c 905 903 906 c ratio ozone column/minimal theoretical column (0.1 micron-atm) 904 907 c … … 906 909 c profile giving a column 0.1 micron-atmosphere at 907 910 c a surface pressure of 10 hpa. 908 c 911 909 912 do l = 1,lswitch-1 910 913 colo3min = col(l)*7.171e-10 … … 913 916 ratio_o3(l) = max(ratio_o3(l), 1.) 914 917 end do 915 c 918 916 919 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 917 920 c temperature dependence 918 921 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 919 c 922 920 923 c 1) search for temperature at 1.9 hPa (tref): vertical interpolation 921 c 924 922 925 tref = temp(1) 923 926 do l = (lswitch-1)-1,1,-1 … … 931 934 end do 932 935 10 continue 933 c 936 934 937 c 2) interpolation in temperature 935 c 938 936 939 tref = min(tref,table_temp(1)) 937 940 tref = max(tref,table_temp(ntemp)) 938 c 941 939 942 do it = 2, ntemp 940 943 if (table_temp(it) .le. tref) then … … 946 949 end do 947 950 20 continue 948 c 951 949 952 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 950 953 c loop over vertical levels 951 954 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 952 c 955 953 956 do l = 1,lswitch-1 954 c 957 955 958 c interpolation in air column 956 c 959 957 960 do icol = 0,200 958 961 if (colairtab(icol) .lt. col(l)) then … … 964 967 end do 965 968 30 continue 966 c 969 967 970 cc interpolation in ozone column 968 c 971 969 972 indozo = nozo - 1 970 973 do iozo = 1,nozo … … 976 979 ciozo = (ratio_o3(l) - table_ozo(indozo)*10.) 977 980 $ /(table_ozo(indozo + 1)*10. - table_ozo(indozo)*10.) 978 c 981 979 982 cc 4-dimensional interpolation weights 980 c 983 981 984 c poids(temp,sza,co2,o3,tau) 982 c 985 983 986 poids(1,1,1,1,1) = citemp 984 987 $ *(1.-cisza)*cicol*(1.-ciozo)*(1.-citau) … … 1013 1016 poids(2,2,2,2,1) = (1.-citemp) 1014 1017 $ *cisza*(1.-cicol)*ciozo*(1.-citau) 1015 c 1018 1016 1019 poids(1,1,1,1,2) = citemp 1017 1020 $ *(1.-cisza)*cicol*(1.-ciozo)*citau … … 1046 1049 poids(2,2,2,2,2) = (1.-citemp) 1047 1050 $ *cisza*(1.-cicol)*ciozo*citau 1048 c 1051 1049 1052 cc 4-dimensional interpolation in the lookup table 1050 c 1053 1051 1054 do ij = 1,nd 1052 1055 j(l,ij) = … … 1083 1086 $ + poids(2,2,2,2,1) 1084 1087 $ *jphot(indtemp+1,indsza+1,indcol+1,indozo+1,indtau,ij) 1085 c 1088 1086 1089 $ + poids(1,1,1,1,2) 1087 1090 $ *jphot(indtemp,indsza,indcol,indozo,indtau+1,ij) … … 1117 1120 $ *jphot(indtemp+1,indsza+1,indcol+1,indozo+1,indtau+1,ij) 1118 1121 end do 1119 c 1122 1120 1123 cc correction for sun distance 1121 c 1124 1122 1125 do ij = 1,nd 1123 1126 j(l,ij) = j(l,ij)*(1.52/dist_sol)**2. 1124 1127 end do 1125 c 1128 1126 1129 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1127 1130 c end of loop over vertical levels 1128 1131 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1129 c 1132 1130 1133 end do 1131 c 1134 1132 1135 else 1133 c 1136 1134 1137 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1135 1138 c night 1136 1139 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1137 c 1140 1138 1141 do ij = 1,nd 1139 1142 do l = 1,lswitch-1 … … 1141 1144 end do 1142 1145 end do 1143 c 1146 1144 1147 end if 1145 c 1148 1146 1149 return 1147 1150 end 1148 c 1151 1149 1152 c***************************************************************** 1150 c 1151 subroutine gcmtochim( zycol, lswitch, nesp, rm)1152 c 1153 1154 subroutine gcmtochim(nlayer, nq, zycol, lswitch, nesp, rm) 1155 1153 1156 c***************************************************************** 1154 c 1155 use tracer_mod, only: nqmx,igcm_co2, igcm_co, igcm_o, igcm_o1d,1157 1158 use tracer_mod, only: igcm_co2, igcm_co, igcm_o, igcm_o1d, 1156 1159 & igcm_o2, igcm_o3, igcm_h, igcm_h2, igcm_oh, 1157 1160 & igcm_ho2, igcm_h2o2, igcm_n2, igcm_h2o_vap, 1158 1161 & igcm_ch4 1162 1159 1163 implicit none 1160 c 1161 #include "dimensions.h"1162 #include "dimphys.h"1164 1165 !#include "dimensions.h" 1166 !#include "dimphys.h" 1163 1167 #include "callkeys.h" 1164 1168 !#include "tracer.h" 1165 c 1169 1166 1170 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1167 1171 c inputs: 1168 1172 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1169 c 1170 real zycol(nlayermx,nqmx)! species volume mixing ratio in the gcm 1171 c 1172 integer nesp ! number of species in the chemistry 1173 integer lswitch ! interface level between chemistries 1174 c 1173 1174 integer, intent(in) :: nlayer ! number of atmospheric layers 1175 integer, intent(in) :: nq ! number of tracers 1176 real :: zycol(nlayer,nq) ! species volume mixing ratio in the gcm 1177 1178 integer :: nesp ! number of species in the chemistry 1179 integer :: lswitch ! interface level between chemistries 1180 1175 1181 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1176 1182 c outputs: 1177 1183 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1178 c 1179 real rm(nlayermx,nesp) ! species volume mixing ratio1180 c1184 1185 real :: rm(nlayer,nesp) ! species volume mixing ratio 1186 1181 1187 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1182 1188 c local: 1183 1189 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1184 c 1185 integer l,iq1190 1191 integer :: l, iq 1186 1192 1187 1193 c tracer indexes in the chemistry: … … 1203 1209 integer,parameter :: i_hox = 15 1204 1210 integer,parameter :: i_ox = 16 1205 c 1211 1206 1212 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1207 1213 c initialise chemical species 1208 1214 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1209 c 1215 1210 1216 do l = 1,lswitch-1 1211 1217 rm(l,i_co2) = max(zycol(l, igcm_co2), 1.e-30) … … 1233 1239 end do 1234 1240 end if 1235 c 1241 1236 1242 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1237 1243 c initialise chemical families c 1238 1244 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1239 c 1245 1240 1246 do l = 1,lswitch-1 1241 1247 rm(l,i_hox) = rm(l,i_h) … … 1245 1251 $ + rm(l,i_o3) 1246 1252 end do 1247 c 1253 1248 1254 return 1249 1255 end 1250 c 1256 1251 1257 c***************************************************************** 1252 1258 c 1253 subroutine chimtogcm( zycol, lswitch, nesp, rm)1259 subroutine chimtogcm(nlayer, nq, zycol, lswitch, nesp, rm) 1254 1260 c 1255 1261 c***************************************************************** 1256 1262 c 1257 use tracer_mod, only: nqmx,igcm_co2, igcm_co, igcm_o, igcm_o1d,1263 use tracer_mod, only: igcm_co2, igcm_co, igcm_o, igcm_o1d, 1258 1264 & igcm_o2, igcm_o3, igcm_h, igcm_h2, igcm_oh, 1259 1265 & igcm_ho2, igcm_h2o2, igcm_n2, igcm_h2o_vap, 1260 1266 & igcm_ch4 1267 1261 1268 implicit none 1262 c 1263 #include "dimensions.h"1264 #include "dimphys.h"1269 1270 !#include "dimensions.h" 1271 !#include "dimphys.h" 1265 1272 #include "callkeys.h" 1266 1273 !#include "tracer.h" 1267 c 1274 1268 1275 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1269 1276 c inputs: 1270 1277 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1271 c 1272 integer nesp ! number of species in the chemistry 1273 integer lswitch ! interface level between chemistries 1274 c 1275 real rm(nlayermx,nesp) ! species volume mixing ratio 1276 c 1278 1279 integer, intent(in) :: nlayer ! number of atmospheric layers 1280 integer, intent(in) :: nq ! number of tracers 1281 integer :: nesp ! number of species in the chemistry 1282 integer :: lswitch ! interface level between chemistries 1283 1284 real :: rm(nlayer,nesp) ! species volume mixing ratio 1285 1277 1286 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1278 1287 c output: 1279 1288 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1280 c 1281 real zycol(nlayermx,nqmx) ! species volume mixing ratio in the gcm1282 c 1289 1290 real :: zycol(nlayer,nq) ! species volume mixing ratio in the gcm 1291 1283 1292 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1284 1293 c local: 1285 1294 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1286 c 1287 integer l, iq1295 1296 integer l, iq 1288 1297 1289 1298 c tracer indexes in the chemistry: … … 1305 1314 integer,parameter :: i_hox = 15 1306 1315 integer,parameter :: i_ox = 16 1307 c 1316 1308 1317 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1309 1318 c save mixing ratios for the gcm 1310 1319 cccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1311 c 1320 1312 1321 do l = 1,lswitch-1 1313 1322 zycol(l, igcm_co2) = rm(l,i_co2) … … 1331 1340 end do 1332 1341 end if 1333 c 1342 1334 1343 return 1335 1344 end 1336 c 1345 1337 1346 c***************************************************************** 1338 c 1339 subroutine chemrates(lswitch, dens, press, t, 1347 1348 subroutine chemrates(nlayer, 1349 $ lswitch, dens, press, t, 1340 1350 $ surfdust1d, surfice1d, 1341 1351 $ a001, a002, a003, … … 1349 1359 $ h001, h002, h003, h004, h005, 1350 1360 $ t001, t002, t003, tau) 1351 c 1361 1352 1362 c***************************************************************** 1353 c 1363 1354 1364 implicit none 1355 c 1356 #include "dimensions.h"1357 #include "dimphys.h"1365 1366 !#include "dimensions.h" 1367 !#include "dimphys.h" 1358 1368 #include "comcstfi.h" 1359 c 1369 1360 1370 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1361 1371 c inputs: c 1362 1372 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1363 c 1364 integer lswitch ! interface level between chemistries1365 1366 real dens(nlayermx) ! density (cm-3) 1367 real press(nlayermx) ! pressure (hpa)1368 real t(nlayermx) ! temperature (k)1369 real surfdust1d(nlayermx) ! dust surface area (cm^2/cm^3)1370 real surfice1d(nlayermx) ! icesurface area (cm^2/cm^3)1371 real tribo ! switch for triboelectricity1372 real tau! dust opacity at 7 hpa1373 c 1374 parameter (tribo = 0.)! switch for triboelectricity1375 c 1373 1374 integer, intent(in) :: nlayer ! number of atmospheric layers 1375 integer :: lswitch ! interface level between chemistries 1376 1377 real :: dens(nlayer) ! density (cm-3) 1378 real :: press(nlayer) ! pressure (hpa) 1379 real :: t(nlayer) ! temperature (k) 1380 real :: surfdust1d(nlayer) ! dust surface area (cm^2/cm^3) 1381 real :: surfice1d(nlayer) ! ice surface area (cm^2/cm^3) 1382 real :: tau ! dust opacity at 7 hpa 1383 1384 real, parameter :: tribo = 0. ! switch for triboelectricity 1385 1376 1386 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1377 1387 c outputs: c 1378 1388 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1379 c 1380 real a001(nlayermx), a002(nlayermx), a003(nlayermx)1381 real b001(nlayermx), b002(nlayermx), b003(nlayermx),1382 $ b004(nlayermx), b005(nlayermx), b006(nlayermx),1383 $ b007(nlayermx), b008(nlayermx), b009(nlayermx)1384 real c001(nlayermx), c002(nlayermx), c003(nlayermx),1385 $ c004(nlayermx), c005(nlayermx), c006(nlayermx),1386 $ c007(nlayermx), c008(nlayermx), c009(nlayermx),1387 $ c010(nlayermx), c011(nlayermx), c012(nlayermx),1388 $ c013(nlayermx), c014(nlayermx), c015(nlayermx),1389 $ c016(nlayermx), c017(nlayermx), c018(nlayermx)1390 real d001(nlayermx), d002(nlayermx), d003(nlayermx)1391 real e001(nlayermx), e002(nlayermx), e003(nlayermx)1392 real h001(nlayermx), h002(nlayermx), h003(nlayermx),1393 $ h004(nlayermx), h005(nlayermx)1394 real t001(nlayermx), t002(nlayermx), t003(nlayermx)1395 c 1389 1390 real :: a001(nlayer), a002(nlayer), a003(nlayer) 1391 real :: b001(nlayer), b002(nlayer), b003(nlayer), 1392 $ b004(nlayer), b005(nlayer), b006(nlayer), 1393 $ b007(nlayer), b008(nlayer), b009(nlayer) 1394 real :: c001(nlayer), c002(nlayer), c003(nlayer), 1395 $ c004(nlayer), c005(nlayer), c006(nlayer), 1396 $ c007(nlayer), c008(nlayer), c009(nlayer), 1397 $ c010(nlayer), c011(nlayer), c012(nlayer), 1398 $ c013(nlayer), c014(nlayer), c015(nlayer), 1399 $ c016(nlayer), c017(nlayer), c018(nlayer) 1400 real :: d001(nlayer), d002(nlayer), d003(nlayer) 1401 real :: e001(nlayer), e002(nlayer), e003(nlayer) 1402 real :: h001(nlayer), h002(nlayer), h003(nlayer), 1403 $ h004(nlayer), h005(nlayer) 1404 real :: t001(nlayer), t002(nlayer), t003(nlayer) 1405 1396 1406 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1397 1407 c local: c 1398 1408 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1399 c 1400 real ak0, ak1, rate, rate1, rate2, xpo, xpo1, xpo21401 real ef, efmax, lossh2o, lossch4, lossco21402 c 1403 integer l1404 real k1a, k1b, k1a0, k1b0, k1ainf1405 real x, y, fc, fx1406 c 1409 1410 real :: ak0, ak1, rate, rate1, rate2, xpo, xpo1, xpo2 1411 real :: ef, efmax, lossh2o, lossch4, lossco2 1412 1413 integer :: l 1414 real :: k1a, k1b, k1a0, k1b0, k1ainf 1415 real :: x, y, fc, fx 1416 1407 1417 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1408 1418 c compute reaction rates 1409 1419 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1410 c 1420 1411 1421 do l = 1,lswitch-1 1412 c 1422 1413 1423 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1414 1424 c oxygen compounds
Note: See TracChangeset
for help on using the changeset viewer.