| 1 | SUBROUTINE initracer() |
|---|
| 2 | |
|---|
| 3 | use comgeomfi_h |
|---|
| 4 | use aerosol_mod |
|---|
| 5 | IMPLICIT NONE |
|---|
| 6 | c======================================================================= |
|---|
| 7 | c subject: |
|---|
| 8 | c -------- |
|---|
| 9 | c Initialization related to tracer |
|---|
| 10 | c (transported dust, water, chemical species, ice...) |
|---|
| 11 | c |
|---|
| 12 | c Name of the tracer |
|---|
| 13 | c |
|---|
| 14 | c Test of dimension : |
|---|
| 15 | c Initialize COMMON tracer in tracer.h, using tracer names provided |
|---|
| 16 | c by the dynamics in "advtrac.h" |
|---|
| 17 | c |
|---|
| 18 | c author: F.Forget |
|---|
| 19 | c ------ |
|---|
| 20 | c Ehouarn Millour (oct. 2008) identify tracers by their names |
|---|
| 21 | c Tanguy Bertrand (oct. 2014) Adaptation Pluto |
|---|
| 22 | c Tanguy Bertrand (dec. 2014) Adding tracers for haze |
|---|
| 23 | c -precurseur |
|---|
| 24 | c -haze |
|---|
| 25 | c======================================================================= |
|---|
| 26 | |
|---|
| 27 | |
|---|
| 28 | #include "dimensions.h" |
|---|
| 29 | #include "dimphys.h" |
|---|
| 30 | #include "comcstfi.h" |
|---|
| 31 | #include "callkeys.h" |
|---|
| 32 | #include "tracer.h" |
|---|
| 33 | #include "advtrac.h" |
|---|
| 34 | #include "fisice.h" |
|---|
| 35 | #include "surfdat.h" |
|---|
| 36 | |
|---|
| 37 | ! real qsurf(ngridmx,nqmx) ! tracer on surface (e.g. kg.m-2) |
|---|
| 38 | character(len=20) :: txt ! to store some text |
|---|
| 39 | integer iq,ig,count,i |
|---|
| 40 | real r0_lift , reff_lift, rho_haze |
|---|
| 41 | integer nqhaze(nqmx) ! to store haze tracers |
|---|
| 42 | ! logical :: oldnames ! =.true. if old tracer naming convention (q01,...) |
|---|
| 43 | integer ia, block |
|---|
| 44 | CHARACTER(LEN=20) :: tracername ! to temporarily store text |
|---|
| 45 | |
|---|
| 46 | c----------------------------------------------------------------------- |
|---|
| 47 | c radius(nqmx) ! aerosol particle radius (m) |
|---|
| 48 | c rho_q(nqmx) ! tracer densities (kg.m-3) |
|---|
| 49 | c rho_ch4_ice ! ch4 ice density |
|---|
| 50 | c rho_co_ice ! co ice density |
|---|
| 51 | c varian ! Characteristic variance of log-normal distribution |
|---|
| 52 | c----------------------------------------------------------------------- |
|---|
| 53 | |
|---|
| 54 | ! Initialization: get tracer names from the dynamics and check if we are |
|---|
| 55 | ! using 'old' tracer convention ('q01',q02',...) |
|---|
| 56 | ! or new convention (full tracer names) |
|---|
| 57 | |
|---|
| 58 | ! copy tracer names from dynamics |
|---|
| 59 | do iq=1,nqmx |
|---|
| 60 | noms(iq)=tnom(iq) |
|---|
| 61 | enddo |
|---|
| 62 | |
|---|
| 63 | print*,'initracer : number of tracers nqmx=',nqmx |
|---|
| 64 | ! Identify tracers by their names: (and set corresponding values of mmol) |
|---|
| 65 | ! 0. initialize tracer indexes to zero: |
|---|
| 66 | ! NB: igcm_* indexes are commons in 'tracer.h' |
|---|
| 67 | igcm_n2=0 |
|---|
| 68 | igcm_ch4_gas=0 |
|---|
| 69 | igcm_ch4_ice=0 |
|---|
| 70 | igcm_prec_haze=0 |
|---|
| 71 | igcm_co_gas=0 |
|---|
| 72 | igcm_co_ice=0 |
|---|
| 73 | |
|---|
| 74 | nqhaze(:)=0 |
|---|
| 75 | i=0 |
|---|
| 76 | DO iq=1,nqmx |
|---|
| 77 | txt=noms(iq) |
|---|
| 78 | IF (txt(1:4).eq."haze") THEN |
|---|
| 79 | i=i+1 |
|---|
| 80 | nqhaze(i)=iq |
|---|
| 81 | ENDIF |
|---|
| 82 | ENDDO |
|---|
| 83 | if ((haze.or.fasthaze).and.i==0) then |
|---|
| 84 | print*, 'Haze active but no haze tracer in traceur.def' |
|---|
| 85 | stop |
|---|
| 86 | endif |
|---|
| 87 | igcm_haze=0 |
|---|
| 88 | igcm_haze10=0 |
|---|
| 89 | igcm_haze30=0 |
|---|
| 90 | igcm_haze50=0 |
|---|
| 91 | igcm_haze100=0 |
|---|
| 92 | |
|---|
| 93 | ! Eddy diffusion tracers |
|---|
| 94 | igcm_eddy1e6=0 |
|---|
| 95 | igcm_eddy1e7=0 |
|---|
| 96 | igcm_eddy5e7=0 |
|---|
| 97 | igcm_eddy1e8=0 |
|---|
| 98 | igcm_eddy5e8=0 |
|---|
| 99 | write(*,*) 'initracer: noms() ', noms |
|---|
| 100 | |
|---|
| 101 | c Radius and densities |
|---|
| 102 | rho_n2=1000 ! n2 ice |
|---|
| 103 | rho_ch4_ice=520. ! rho ch4 ice |
|---|
| 104 | rho_co_ice=520. ! rho ch4 ice |
|---|
| 105 | rho_haze=800. ! haze |
|---|
| 106 | ! first initialization |
|---|
| 107 | call zerophys(nqmx,rho_q) |
|---|
| 108 | call zerophys(nqmx,radius) |
|---|
| 109 | |
|---|
| 110 | ! find tracers |
|---|
| 111 | count=0 |
|---|
| 112 | do iq=1,nqmx |
|---|
| 113 | if (noms(iq).eq."n2") then |
|---|
| 114 | igcm_n2=iq |
|---|
| 115 | mmol(igcm_n2)=28. |
|---|
| 116 | count=count+1 |
|---|
| 117 | write(*,*) 'Tracer ',count,' = n2' |
|---|
| 118 | endif |
|---|
| 119 | if (noms(iq).eq."ch4_gas") then |
|---|
| 120 | igcm_ch4_gas=iq |
|---|
| 121 | mmol(igcm_ch4_gas)=16. |
|---|
| 122 | count=count+1 |
|---|
| 123 | write(*,*) 'Tracer ',count,' = ch4 gas' |
|---|
| 124 | endif |
|---|
| 125 | if (noms(iq).eq."ch4_ice") then |
|---|
| 126 | igcm_ch4_ice=iq |
|---|
| 127 | mmol(igcm_ch4_ice)=16. |
|---|
| 128 | radius(iq)=3.e-6 |
|---|
| 129 | rho_q(iq)=rho_ch4_ice |
|---|
| 130 | count=count+1 |
|---|
| 131 | write(*,*) 'Tracer ',count,' = ch4 ice' |
|---|
| 132 | endif |
|---|
| 133 | if (noms(iq).eq."co_gas") then |
|---|
| 134 | igcm_co_gas=iq |
|---|
| 135 | mmol(igcm_co_gas)=28. |
|---|
| 136 | count=count+1 |
|---|
| 137 | write(*,*) 'Tracer ',count,' = co gas' |
|---|
| 138 | endif |
|---|
| 139 | if (noms(iq).eq."co_ice") then |
|---|
| 140 | igcm_co_ice=iq |
|---|
| 141 | mmol(igcm_co_ice)=28. |
|---|
| 142 | radius(iq)=3.e-6 |
|---|
| 143 | rho_q(iq)=rho_co_ice |
|---|
| 144 | count=count+1 |
|---|
| 145 | write(*,*) 'Tracer ',count,' = co ice' |
|---|
| 146 | endif |
|---|
| 147 | if (noms(iq).eq."prec_haze") then |
|---|
| 148 | igcm_prec_haze=iq |
|---|
| 149 | count=count+1 |
|---|
| 150 | write(*,*) 'Tracer ',count,' = prec haze' |
|---|
| 151 | endif |
|---|
| 152 | if (noms(iq).eq."haze") then |
|---|
| 153 | igcm_haze=iq |
|---|
| 154 | count=count+1 |
|---|
| 155 | radius(iq)=rad_haze |
|---|
| 156 | rho_q(iq)=rho_haze |
|---|
| 157 | write(*,*) 'Tracer ',count,' = haze' |
|---|
| 158 | endif |
|---|
| 159 | if (noms(iq).eq."haze10") then |
|---|
| 160 | igcm_haze10=iq |
|---|
| 161 | count=count+1 |
|---|
| 162 | radius(iq)=10.e-9 |
|---|
| 163 | rho_q(iq)=rho_haze |
|---|
| 164 | write(*,*) 'Tracer ',count,' = haze10' |
|---|
| 165 | endif |
|---|
| 166 | if (noms(iq).eq."haze30") then |
|---|
| 167 | igcm_haze30=iq |
|---|
| 168 | count=count+1 |
|---|
| 169 | radius(iq)=30.e-9 |
|---|
| 170 | rho_q(iq)=rho_haze |
|---|
| 171 | write(*,*) 'Tracer ',count,' = haze30' |
|---|
| 172 | endif |
|---|
| 173 | if (noms(iq).eq."haze50") then |
|---|
| 174 | igcm_haze50=iq |
|---|
| 175 | count=count+1 |
|---|
| 176 | radius(iq)=50.e-9 |
|---|
| 177 | rho_q(iq)=rho_haze |
|---|
| 178 | write(*,*) 'Tracer ',count,' = haze50' |
|---|
| 179 | endif |
|---|
| 180 | if (noms(iq).eq."haze100") then |
|---|
| 181 | igcm_haze100=iq |
|---|
| 182 | count=count+1 |
|---|
| 183 | radius(iq)=100.e-9 |
|---|
| 184 | rho_q(iq)=rho_haze |
|---|
| 185 | write(*,*) 'Tracer ',count,' = haze100' |
|---|
| 186 | endif |
|---|
| 187 | ! Eddy diffusion tracers |
|---|
| 188 | if (noms(iq).eq."eddy1e6") then |
|---|
| 189 | igcm_eddy1e6=iq |
|---|
| 190 | count=count+1 |
|---|
| 191 | write(*,*) 'Tracer ',count,' = eddy1e6' |
|---|
| 192 | endif |
|---|
| 193 | if (noms(iq).eq."eddy1e7") then |
|---|
| 194 | igcm_eddy1e7=iq |
|---|
| 195 | count=count+1 |
|---|
| 196 | write(*,*) 'Tracer ',count,' = eddy1e7' |
|---|
| 197 | endif |
|---|
| 198 | if (noms(iq).eq."eddy5e7") then |
|---|
| 199 | igcm_eddy5e7=iq |
|---|
| 200 | count=count+1 |
|---|
| 201 | write(*,*) 'Tracer ',count,' = eddy5e7' |
|---|
| 202 | endif |
|---|
| 203 | if (noms(iq).eq."eddy1e8") then |
|---|
| 204 | igcm_eddy1e8=iq |
|---|
| 205 | count=count+1 |
|---|
| 206 | write(*,*) 'Tracer ',count,' = eddy1e8' |
|---|
| 207 | endif |
|---|
| 208 | if (noms(iq).eq."eddy5e8") then |
|---|
| 209 | igcm_eddy5e8=iq |
|---|
| 210 | count=count+1 |
|---|
| 211 | write(*,*) 'Tracer ',count,' = eddy5e8' |
|---|
| 212 | endif |
|---|
| 213 | enddo ! of do iq=1,nqmx |
|---|
| 214 | |
|---|
| 215 | ! check that we identified all tracers: |
|---|
| 216 | if (count.ne.nqmx) then |
|---|
| 217 | write(*,*) "initracer: found only ",count," tracers" |
|---|
| 218 | write(*,*) " expected ",nqmx |
|---|
| 219 | do iq=1,count |
|---|
| 220 | write(*,*)' ',iq,' ',trim(noms(iq)) |
|---|
| 221 | enddo |
|---|
| 222 | stop |
|---|
| 223 | else |
|---|
| 224 | write(*,*) "initracer: found all expected tracers, namely:" |
|---|
| 225 | do iq=1,nqmx |
|---|
| 226 | write(*,*)' ',iq,' ',trim(noms(iq)) |
|---|
| 227 | enddo |
|---|
| 228 | endif |
|---|
| 229 | |
|---|
| 230 | c------------------------------------------------------------ |
|---|
| 231 | c Initialisation tracers .... |
|---|
| 232 | c------------------------------------------------------------ |
|---|
| 233 | |
|---|
| 234 | c Other initializations |
|---|
| 235 | c ------------------------------ |
|---|
| 236 | |
|---|
| 237 | c Latent heat : |
|---|
| 238 | lw_co=274000. |
|---|
| 239 | lw_ch4=586700. |
|---|
| 240 | lw_n2=2.5e5 |
|---|
| 241 | |
|---|
| 242 | c HAZE: |
|---|
| 243 | if (haze) then |
|---|
| 244 | ! the sedimentation radius remains radius(igcm_haze) |
|---|
| 245 | if (fractal) then |
|---|
| 246 | nmono=nb_monomer |
|---|
| 247 | else |
|---|
| 248 | nmono=1 |
|---|
| 249 | endif |
|---|
| 250 | |
|---|
| 251 | ia=0 |
|---|
| 252 | if (aerohaze) then |
|---|
| 253 | ia=ia+1 |
|---|
| 254 | iaero_haze=ia |
|---|
| 255 | write(*,*) '--- number of haze aerosol = ', iaero_haze |
|---|
| 256 | |
|---|
| 257 | block=0 ! Only one type of haze is active : the first one set in traceur.def |
|---|
| 258 | do iq=1,nqmx |
|---|
| 259 | tracername=noms(iq) |
|---|
| 260 | write(*,*) "--> tracername ",iq,'/',nqmx,' = ',tracername |
|---|
| 261 | if (tracername(1:4).eq."haze".and.block.eq.0) then |
|---|
| 262 | i_haze=iq |
|---|
| 263 | block=1 |
|---|
| 264 | write(*,*) "i_haze=",i_haze |
|---|
| 265 | write(*,*) "Careful: if you set many haze traceurs in |
|---|
| 266 | & traceur.def,only ",tracername," will be radiatively active |
|---|
| 267 | & (first one in traceur.def)" |
|---|
| 268 | endif |
|---|
| 269 | enddo |
|---|
| 270 | endif |
|---|
| 271 | endif |
|---|
| 272 | |
|---|
| 273 | c Output for records: |
|---|
| 274 | c ~~~~~~~~~~~~~~~~~~ |
|---|
| 275 | write(*,*) |
|---|
| 276 | Write(*,*) '******** initracer : parameters :' |
|---|
| 277 | write(*,*) 'radius = ', radius |
|---|
| 278 | write(*,*) 'density = ', rho_q |
|---|
| 279 | write(*,*) |
|---|
| 280 | write(*,*) 'monomers = ', nmono |
|---|
| 281 | |
|---|
| 282 | end |
|---|