user_output_general.F90 126 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550
  1. #define TRACEBACK write (gol,'("in ",a," (",a,i6,")")') rname, __FILE__, __LINE__ ; call goErr
  2. #define IF_NOTOK_RETURN(action) if (status/=0) then; TRACEBACK; action; return; end if
  3. #define IF_ERROR_RETURN(action) if (status> 0) then; TRACEBACK; action; return; end if
  4. #define IF_NOTOK_MDF(action) if (status/=0) then; TRACEBACK; action; call MDF_CLose(fid,status); status=1; return; end if
  5. !
  6. #include "tm5.inc"
  7. !
  8. !-----------------------------------------------------------------------------
  9. ! TM5 !
  10. !-----------------------------------------------------------------------------
  11. !BOP
  12. !
  13. ! !MODULE: USER_OUTPUT_GENERAL
  14. !
  15. ! !DESCRIPTION:
  16. !
  17. ! This module provides objects and methods for the AEROCOM-2 related
  18. ! diagnostics package. It is strongly related to the setup of the
  19. ! optics module.
  20. ! A list of parameters are defined for which daily averages are output
  21. ! (so far), result is one file per day containing 50 2d-fields and
  22. ! 4 3d-fields.
  23. !
  24. ! Life cycle(s):
  25. ! 1) output_aerocom_init:
  26. ! - if( newsrun ): - allocation and initialisation of output container
  27. ! (mixf%..., drydepos/wetdepos/emission, wdep_out)
  28. ! - initialisation of optics module
  29. ! - lookuptable
  30. ! - wavelengths
  31. ! - open output file (for today), initialise it and write attributes
  32. ! 2) output_aerocom_step:
  33. ! - gather tracer
  34. ! - add current state of model to containers
  35. ! (weighted by time since last call, --> period of validity)
  36. ! - do fluxes, surface concentrations and loads
  37. ! - do optics
  38. ! - aerocom_aopio_init: initialise and fill input parameters
  39. ! - optics::optics_calculate_aop:
  40. ! calculate optical properties (per wavelength)
  41. ! (take into account additional splitting, facilitated in
  42. ! optics::optics_calculate_aop)
  43. ! - fill containers for optical properties
  44. ! - free optics input parameters
  45. ! - fill aerocom output containers
  46. ! 3) output_aerocom_write:
  47. ! - collect_budgets:
  48. ! - use current budget containers (budemi, buddep, buddry)
  49. ! - compare with saved values and infer by that the increment
  50. ! - add to temporary output containers (wetdepos,drydepos,emission)
  51. ! - write output containers to file
  52. ! - close file
  53. ! 4) output_aerocom_done:
  54. ! - free allocated containers
  55. ! (mixf%..., drydepos/wetdepos/emission, wdep_out)
  56. !
  57. !\\
  58. !\\
  59. ! !INTERFACE:
  60. !
  61. MODULE USER_OUTPUT_GENERAL
  62. !
  63. ! !USES:
  64. !
  65. use go, only : gol, goErr, goPr, goLabel
  66. use dims, only : nregions
  67. use optics, only : wavelendep
  68. use meteodata, only : global_lli, levi
  69. use MDF
  70. use TM5_DISTGRID, only : dgrid, Get_DistGrid, update_halo, update_halo_iband
  71. use mo_aero_m7 , only: ncomp,nmod,naermod
  72. implicit none
  73. private
  74. !
  75. ! !PUBLIC MEMBER FUNCTIONS:
  76. !
  77. public :: output_general_init
  78. public :: output_general_step
  79. public :: output_general_write
  80. public :: output_general_done
  81. public :: wdep_out
  82. ! Control variables
  83. character(len=20), public :: gen_exper ! general experiment name
  84. character(len=20), public :: gen_freq ! general output frequency
  85. logical,public :: all_chemistry=.false.
  86. logical, parameter :: aai_output=.false.
  87. !
  88. ! diagnostic CCN
  89. logical, public :: nCCNdiag = .false. ! diagnostic CCN under given supersaturations for comparison to CCNC measurements
  90. ! nCCNdiag = .false. no diagnostic CCN
  91. ! nCCNdiag = .true. with diagnostic CCN
  92. integer,public :: nSat = 0 ! Number of supersaturations for which number of CCN will be calculated
  93. real, public, allocatable :: SuperSat(:)
  94. ! !PRIVATE DATA MEMBERS:
  95. !
  96. character(len=*), parameter :: mname = 'user_output_general'
  97. ! Changed naming convections to
  98. character(len=20), parameter :: f_dataid='general', f_model='TM5'
  99. character(len=20), parameter :: f_dimmix='global', f_dimstat='stations'
  100. !
  101. ! !PRIVATE TYPES:
  102. !
  103. type metafields
  104. integer :: itm5
  105. character(len=20) :: vname
  106. character(len=64) :: lname
  107. character(len=10) :: unit
  108. character(len=10) :: positive
  109. character(len=130) :: standard_name
  110. end type metafields
  111. type metafields2
  112. integer :: itm5
  113. character(len=17) :: vname
  114. character(len=64) :: lname
  115. character(len=10) :: unit
  116. character(len=130) :: standard_name
  117. end type metafields2
  118. type field3d
  119. type( metafields ) :: mf
  120. real, dimension(:,:,:), pointer :: field
  121. integer :: varid
  122. logical :: writeout
  123. end type field3d
  124. type field2d
  125. type( metafields ) :: mf
  126. real, dimension(:,:), pointer :: field
  127. integer :: varid
  128. logical :: writeout
  129. end type field2d
  130. type field1d
  131. type( metafields2 ) :: mf
  132. real, dimension(:,:), pointer :: field
  133. integer :: varid
  134. end type field1d
  135. type field0d
  136. type( metafields2 ) :: mf
  137. real, dimension(:), pointer :: field
  138. integer :: varid
  139. end type field0d
  140. type mixfile
  141. type( field3d ), dimension(:), pointer :: f3d
  142. type( field2d ), dimension(:), pointer :: f2d
  143. character(len=200) :: fname
  144. integer :: acct ! accumulation time
  145. integer :: funit ! unit number
  146. integer :: nlon ! x dimension of requested field
  147. integer :: nlat ! y dimension of requested field
  148. integer :: nlev ! z dimension of requested field
  149. real,dimension(:),pointer :: lon ! x dimension of requested field
  150. real,dimension(:),pointer :: lat ! y dimension of requested field
  151. real,dimension(:),pointer :: lev ! z dimension of requested field
  152. integer :: lonid ! x dimension id in nc
  153. integer :: latid ! y dimension id in nc
  154. integer :: levid ! z dimension id in nc
  155. integer :: timeid ! time dimension id in nc
  156. integer :: time_varid
  157. end type mixfile
  158. type(mixfile), dimension(nregions), save :: mixf
  159. integer::lon_varid
  160. integer::lat_varid
  161. integer::lev_varid
  162. ! diagnostic CCN
  163. integer, allocatable :: ind_CCN(:)
  164. type budgetstore
  165. real, dimension(:,:,:), allocatable :: f2dslast
  166. integer :: lasttime
  167. end type budgetstore
  168. type(budgetstore), dimension(nregions), save :: drydepos, wetdepos, emission
  169. ! wavelength information
  170. type(wavelendep), dimension(:), allocatable :: wdep_out
  171. integer :: fid ! file id for IF_NOTOK_MDF macro
  172. integer :: access_mode ! netcdf-4 parallel access mode for distributed data
  173. ! generate output if true:
  174. logical :: okdebug = .true.
  175. ! reference time:
  176. integer :: time_reftime6(6) = (/2001,01,01,00,00,00/)
  177. character(len=*), parameter :: time_units = 'days since 2001-01-01 00:00'
  178. ! sizes of arrays
  179. integer, save :: ntracer_3d, ntracer_2d
  180. integer, save :: ntracer_1dstat, ntracer_0dstat, nstations
  181. integer, save :: nextra_1dstat
  182. integer, save :: n_2d_vars=0
  183. integer, save :: n_3d_vars=0
  184. ! index pointers for 1d/2d/3d fields in mixf
  185. integer, save :: temp, hus, airmass, pressure
  186. integer, save :: p_gas_so4,p_liq_so4,p_elvoc,p_svoc,d_nuc,m_nuc_su,m_nuc_soa,p_svoc2d,p_elvoc2d,p_gas_so42d,p_liq_so42d
  187. integer, save :: p_elohterp,p_elo3terp,p_elohisop,p_elo3isop,p_svohterp,p_svo3terp,p_svohisop,p_svo3isop
  188. integer, save :: coag1, gr1_2, co1_soa, co1_su, co2_soa, co3_soa, co4_soa, co5_soa,gph
  189. integer, save :: ec5503Daer, abs5503Daer, ec3503Daer, abs3503Daer
  190. integer, save :: ps , precip , sconcoa , sconcsoa , sconcbc , sconcso4 , sconcdust
  191. integer, save :: sconcss , sconcno3 , loadoa , loadsoa , loadbc , loadso4 , loaddust
  192. integer, save :: loadss , loadno3 , emioa , emibc , emiso2 , emiso4,emisoa
  193. integer, save :: emidust , emidms , emiss , dryso2 , drybc , dryso4
  194. integer, save :: drydust , drydms , dryss , wetoa , wetsoa , wetbc , wetso2
  195. integer, save :: emiterp , emiisop
  196. integer, save :: wetso4 , wetdust , wetdms , wetss , od550aer , od550so4, od550soa
  197. integer, save :: od550bc , od550oa , od550ss , od550dust , od550no3 , od550aerh2o
  198. integer, save :: od550lt1aer , od550lt1dust, od550lt1ss , abs550aer , ec550aer , asyaer
  199. integer, save :: ec550dryaer , abs550dryaer, asydryaer , ec550drylt1aer, abs550drylt1aer
  200. integer, save :: od440aer , od870aer , sconcmsa , dryoa , drysoa , sconcnh4
  201. integer, save :: abs440aer , ec440dryaer , abs440dryaer
  202. integer, save :: abs870aer , ec870dryaer , abs870dryaer
  203. integer, save :: od350aer , abs350aer
  204. integer, save :: bso4nus, bso4ais, bso4acs, bso4cos, bbcais , bbcacs
  205. integer, save :: bbccos , bbcaii , bpomais, bpomacs, bpomcos, bpomaii
  206. integer, save :: bssacs , bsscos , bduacs , bducos , bduaci , bducoi, bno3_a
  207. integer, save :: bnus_n , bais_n , bacs_n , bcos_n , baii_n , baci_n
  208. integer, save :: bcoi_n , bh2onus, bh2oais, bh2oacs, bh2ocos
  209. integer, save :: tr2d_1, tr2d_2, tr2d_3, tr2d_4, tr2d_5, tr2d_6, tr2d_7, tr2d_8, tr2d_9, tr2d_10
  210. integer, save :: tr2d_11, tr2d_12, tr2d_13, tr2d_14, tr2d_15, tr2d_16, tr2d_17, tr2d_18, tr2d_19
  211. integer, save :: tr2d_20, tr2d_21, tr2d_22, tr2d_23
  212. integer, save :: cc01, cc02, cc03, cc04, cc05, cc06, cc07
  213. integer, save :: cc3d01, cc3d02, cc3d03, cc3d04, cc3d05, cc3d06, cc3d07
  214. integer, save :: rw01, rw02, rw03, rw04, rw05, rw06, rw07
  215. integer, save :: rd01, rd02, rd03, rd04, rd05, rd06, rd07
  216. integer, save :: h2o1, h2o2, h2o3, h2o4
  217. integer, save :: tr3d_1, tr3d_2, tr3d_3, tr3d_4, tr3d_5, tr3d_6, tr3d_7, tr3d_8, tr3d_9, tr3d_10
  218. integer, save :: tr3d_11, tr3d_12, tr3d_13, tr3d_14, tr3d_15, tr3d_16, tr3d_17, tr3d_18, tr3d_19
  219. integer, save :: rw3d01, rw3d02, rw3d03, rw3d04, rw3d05, rw3d06, rw3d07
  220. integer, save :: rd3d01, rd3d02, rd3d03, rd3d04, rd3d05, rd3d06, rd3d07
  221. integer, save :: h2o3d1, h2o3d2, h2o3d3, h2o3d4
  222. integer, save ,dimension(2*nmod) :: radius
  223. integer, save ,dimension(ncomp) :: load
  224. integer, save ,dimension(ncomp) :: drydep
  225. integer, save ,dimension(ncomp) :: emi
  226. integer, save ,dimension(ncomp) :: wetdep
  227. integer, save ,dimension(ncomp) :: sed
  228. integer, save ,dimension(nmod) :: number
  229. integer, save ,dimension(naermod) :: masses
  230. integer, save :: ngas_output=10
  231. integer, save, dimension(:),allocatable :: gas_output
  232. integer::itim_opt_out
  233. !
  234. ! !REVISION HISTORY:
  235. ! 16 Nov 2010 - Achim Strunk
  236. ! 8 Dec 2016 - Tommi Bergman - Modified from AEROCOM-output
  237. !
  238. ! !REMARKS:
  239. ! (1) compiled only if with_m7 is used.
  240. !
  241. !EOP
  242. !------------------------------------------------------------------------
  243. contains
  244. !--------------------------------------------------------------------------
  245. ! TM5 !
  246. !--------------------------------------------------------------------------
  247. !BOP
  248. !
  249. ! !IROUTINE: OUTPUT_GENERAL_INIT
  250. !
  251. ! !DESCRIPTION: Initialise various parameters, eg.,
  252. ! wavelengths for optics and output containers.
  253. ! This routine should be called once per day, since fields
  254. ! are daily averages and one file per day is written.
  255. ! Additional tasks are done for newsrun==.true. .
  256. !\\
  257. !\\
  258. ! !INTERFACE:
  259. !
  260. subroutine output_general_init(status, iregion)
  261. !
  262. ! !USES:
  263. !
  264. !use MeteoData, only : sp_dat, set
  265. use GO, only: GO_Timer_Def, GO_Timer_End, GO_Timer_Start
  266. use chem_param, only : ntracet,ntrace,names,mode_tracers,mode_start,mode_nm
  267. use chem_param, only : inus_n, iso4nus, isoanus,nmod
  268. use chem_param, only : iais_n, iso4ais, ibcais, ipomais, isoaais
  269. use chem_param, only : iacs_n, iso4acs, ibcacs, ipomacs, isoaacs, issacs, iduacs
  270. use chem_param, only : icos_n, iso4cos, ibccos, ipomcos, isoacos, isscos, iducos
  271. use chem_param, only : iaii_n, ibcaii, ipomaii, isoaaii
  272. use chem_param, only : iaci_n, icoi_n, iduaci, iducoi
  273. use chem_param, only : ino3_a, inh4, imsa
  274. !use chem_param, only : io3, idms, imsa, inh4, iterp, ioh, ino3, ielvoc, isvoc, iisop,iso2,iso4
  275. use chem_param, only : io3, ih2o2, ieth, irooh, idms, imsa, imgly, inox, ico, ipar, ipan
  276. use chem_param, only : ich2o, iald2, iisop, iso4, irn222, ino3_a, ich4, ich3o2h, iole, iorgntr, inh3
  277. use chem_param, only : ic2h6, iethoh, ic3h8, iterp, iacet, iispd, ihono, ich3o2no2, ino, iho2, ich3o2
  278. use chem_param, only : in2o5, ihno4, ic2o3, iror, irxpar, ixo2, ixo2n, inh2, ih2opart,ic3h7o2, ihypro2
  279. use chem_param, only : isvoc, iso2, inh4, ipb210,io3s, ich3oh, ihcooh , ioh, ino2, ino3, iaco2, inh2o2, ielvoc
  280. USE mo_aero_m7, ONLY : nmod, nsol
  281. use dims, only : nregions, newsrun, idatee, idatei
  282. use dims, only : region_name, parent, itau
  283. use dims, only : xbeg, xend, ybeg, yend, dx, dy, xref, yref
  284. use dims, only : zbeg, zend, dz, zref
  285. use global_data, only : region_dat, outdir
  286. use datetime, only : tau2date, date2tau
  287. use budget_global, only : nbud_vg
  288. use partools, only : MPI_INFO_NULL, localComm
  289. use optics, only : Optics_Init
  290. use datetime, only : date2tau
  291. use dims, only : mlen, idatei
  292. !
  293. ! !OUTPUT PARAMETERS:
  294. !
  295. integer, intent(out) :: status
  296. !
  297. ! !INPUT PARAMETERS:
  298. !
  299. integer, intent(in), optional :: iregion
  300. !
  301. ! !REVISION HISTORY:
  302. ! Nov 2010 - Achim Strunk
  303. ! 16 Dec 2016 - Tommi Bergman KNMI
  304. ! - Modified from AEROCOM output
  305. !
  306. ! !REMARKS:
  307. !
  308. !EOP
  309. !------------------------------------------------------------------------
  310. !BOC
  311. character(len=*), parameter :: rname = mname//'/output_general_init'
  312. ! --- local ------------------------------
  313. integer :: imr, jmr, lmr, access_mode_sta
  314. integer :: lat_dimid,lon_dimid,lev_dimid
  315. integer :: region, varid
  316. integer :: io, istat, i, j, n, sc, iSat
  317. integer :: i1, i2, j1, j2
  318. integer, dimension(6) :: idater
  319. character(len=10) :: idates
  320. character(len=16) :: lidates
  321. character(len=3) :: cwavel
  322. real :: reftime
  323. integer(kind=8) :: itaucur, itauref
  324. integer :: time_shift
  325. real :: dlat, dlon
  326. integer :: mlength
  327. integer :: itracer,index_aer,imass,iout
  328. character(len=14) :: str, str2
  329. character(len=27) :: str_reftime
  330. ! --- begin -------------------------------
  331. call goLabel(rname)
  332. ! access mode for distributed data (2d and 3d)
  333. #ifdef MPI
  334. #ifdef with_netcdf4_par
  335. access_mode = MDF_COLLECTIVE
  336. #else
  337. write(gol,'("General aerosol output requires netcdf4 with parallel access enabled")') ; call goErr
  338. TRACEBACK
  339. status=1; return
  340. #endif
  341. #else
  342. access_mode = MDF_INDEPENDENT
  343. #endif
  344. ! for station
  345. access_mode_sta = MDF_INDEPENDENT
  346. ! initialize (only once)
  347. if( newsrun ) then
  348. call GO_Timer_Def( itim_opt_out, 'optics-output', status )
  349. IF_NOTOK_RETURN(status=1)
  350. ! ensure that required meteo is loaded:
  351. ! call Set( sp_dat(region), status, used=.true. )
  352. ! set wavelength information
  353. ! wl: wavelength in microns
  354. ! split: whether to split into contributions from
  355. ! M7 constituents (incl. water)
  356. allocate( wdep_out( 4 ) )
  357. wdep_out(1)%wl = 0.550 ; wdep_out(1)%split = .true. ; wdep_out(1)%insitu = .true.
  358. wdep_out(2)%wl = 0.440 ; wdep_out(2)%split = .false. ; wdep_out(2)%insitu = .true.
  359. wdep_out(3)%wl = 0.870 ; wdep_out(3)%split = .false. ; wdep_out(3)%insitu = .true.
  360. wdep_out(4)%wl = 0.350 ; wdep_out(4)%split = .false. ; wdep_out(4)%insitu = .false.
  361. ! get the optics code prepared
  362. call Optics_Init(size(wdep_out), wdep_out, status )
  363. IF_NOTOK_RETURN(status=1)
  364. ! -----------------------
  365. ! parameters needed to reference the different 1d/2d/3d-fields
  366. ! (in order to avoid errors in referencing)
  367. ! finally, this list here simply determines the order in the output files
  368. ntracer_3d = 160+nSat
  369. ! list removed, not needed anymore.
  370. ! 2d-output list needed for the moment
  371. ! optics needs to be changed first, since it relies on having optical variables
  372. ! using indices 38->
  373. ntracer_2d = 123
  374. ps = 1 ! 2d
  375. precip = 2 ! 2d
  376. sconcoa = 3 ! 2d
  377. sconcbc = 4 ! 2d
  378. sconcso4 = 5 ! 2d
  379. sconcdust = 6 ! 2d
  380. sconcss = 7 ! 2d
  381. sconcno3 = 8 ! 2d
  382. sconcnh4 = 9 ! 2d
  383. sconcmsa = 10 ! 2d
  384. loadoa = 11 ! 2d
  385. loadbc = 12 ! 2d
  386. loadso4 = 13 ! 2d
  387. loaddust = 14 ! 2d
  388. loadss = 15 ! 2d
  389. loadno3 = 16 ! 2d
  390. emioa = 17 ! 2d
  391. emibc = 18 ! 2d
  392. emiso2 = 19 ! 2d
  393. emiso4 = 20 ! 2d
  394. emidust = 21 ! 2d
  395. emidms = 22 ! 2d
  396. emiss = 23 ! 2d
  397. dryso2 = 24 ! 2d
  398. dryoa = 25 ! 2d
  399. drybc = 26 ! 2d
  400. dryso4 = 27 ! 2d
  401. drydust = 28 ! 2d
  402. drydms = 29 ! 2d
  403. dryss = 30 ! 2d
  404. wetoa = 31 ! 2d
  405. wetbc = 32 ! 2d
  406. wetso2 = 33 ! 2d
  407. wetso4 = 34 ! 2d
  408. wetdust = 35 ! 2d
  409. wetdms = 36 ! 2d
  410. wetss = 37 ! 2d
  411. ! --- from here onwards keep consistent with order in optics (optics.F90)
  412. ! --- begin split order
  413. od550aer = 38 ! 2d
  414. od550so4 = 39 ! 2d
  415. od550bc = 40 ! 2d
  416. od550oa = 41 ! 2d
  417. od550soa = 42 ! 2d
  418. od550ss = 43 ! 2d
  419. od550dust = 44 ! 2d
  420. od550no3 = 45 ! 2d
  421. od550aerh2o = 46 ! 2d
  422. od550lt1aer = 47 ! 2d
  423. od550lt1dust = 48 ! 2d
  424. od550lt1ss = 49 ! 2d
  425. ! --- end split order
  426. abs550aer = 50 ! 2d
  427. asyaer = 51 ! 2d
  428. ec550aer = 52 ! 2d
  429. ! --- begin in-situ data order
  430. ec550dryaer = 53 ! 2d
  431. abs550dryaer = 54 ! 2d
  432. asydryaer = 55 ! 2d
  433. ec550drylt1aer = 56 ! 2d
  434. abs550drylt1aer = 57 ! 2d
  435. ! --- end in-situ data order
  436. !
  437. od440aer = 58 ! 2d
  438. abs440aer = 59 ! 2d
  439. ec440dryaer = 60 ! 2d
  440. abs440dryaer = 61 ! 2d
  441. !
  442. od870aer = 62 ! 2d
  443. abs870aer = 63 ! 2d
  444. ec870dryaer = 64 ! 2d
  445. abs870dryaer = 65 ! 2d
  446. !
  447. od350aer = 66 ! 2d
  448. abs350aer = 67 ! 2d
  449. !
  450. tr2d_1=68
  451. tr2d_2=69
  452. tr2d_3=70
  453. tr2d_4=71
  454. tr2d_5=72
  455. tr2d_6=73
  456. tr2d_7=74
  457. tr2d_8=75
  458. tr2d_9=76
  459. tr2d_10=77
  460. tr2d_11=78
  461. tr2d_12=79
  462. tr2d_13=80
  463. tr2d_14=81
  464. tr2d_15=82
  465. tr2d_16=83
  466. tr2d_17=84
  467. tr2d_18=85
  468. tr2d_19=86
  469. tr2d_20=87
  470. tr2d_21=88
  471. tr2d_22=89
  472. tr2d_23=90
  473. cc01=91
  474. cc02=92
  475. cc03=93
  476. cc04=94
  477. cc05=95
  478. cc06=96
  479. cc07=97
  480. h2o1=98
  481. h2o2=99
  482. h2o3=100
  483. h2o4=101
  484. rw01=102
  485. rw02=103
  486. rw03=104
  487. rw04=105
  488. rw05=106
  489. rw06=107
  490. rw07=108
  491. rd01=109
  492. rd02=110
  493. rd03=111
  494. rd04=112
  495. sconcsoa=113
  496. loadsoa=114
  497. drysoa=115
  498. wetsoa=116
  499. emiterp=117
  500. emiisop=118
  501. p_svoc2d=119
  502. p_elvoc2d=120
  503. p_liq_so42d=121
  504. p_gas_so42d=122
  505. emisoa=123
  506. end if
  507. regionloop: do region = 1, nregions
  508. ! if region given, cycle if other region!
  509. if (present(iregion)) then
  510. if(iregion /= region) cycle regionloop
  511. endif
  512. imr = global_lli(region)%nlon
  513. jmr = global_lli(region)%nlat
  514. lmr = levi%nlev
  515. if( nbud_vg /= lmr ) then
  516. write(gol,*)'output_general_init: nbud_vg /= lmr'; call goErr
  517. write(gol,*)'output_general_init: YOU MUST ADD THE PROJ/BUDGET10 TO SRC CODE !!!!!'; call goErr
  518. TRACEBACK
  519. status=1; return
  520. end if
  521. ! initialize the output:
  522. if( newsrun ) then
  523. if (all_chemistry) then
  524. ngas_output=57
  525. allocate(gas_output(ngas_output))
  526. gas_output=(/&
  527. io3, ih2o2, ieth, irooh, idms, imsa, imgly, inox, ico, ipar, ipan, iso2, inh4, ipb210, &
  528. ich2o, iald2, iisop, iso4, irn222, ino3_a, ich4, ich3o2h, iole, iorgntr, inh3, io3s, ich3oh, ihcooh, &
  529. ic2h6, iethoh, ic3h8, iterp, iacet, iispd, ihono, ich3o2no2, ino, iho2, ich3o2, ioh, ino2, ino3, &
  530. in2o5, ihno4, ic2o3, iror, irxpar, ixo2, ixo2n, inh2, ih2opart,ic3h7o2, ihypro2, iaco2, inh2o2, ielvoc, &
  531. isvoc/)
  532. else
  533. allocate(gas_output(ngas_output))
  534. gas_output=(/io3,idms,iso4,iso2,iterp,ioh,ino3,ielvoc,isvoc,iisop /)
  535. end if
  536. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  537. ! target structures for output
  538. allocate(mixf (region)%f3d(ntracer_3d))
  539. allocate(mixf (region)%f2d(ntracer_2d))
  540. ! allocate data holder for maximum amount of tracers
  541. do i=1,ntracer_3d
  542. allocate( mixf(region)%f3d(i)%field(i1:i2,j1:j2,lmr) )
  543. end do
  544. do i=1,ntracer_2d
  545. allocate( mixf(region)%f2d(i)%field(i1:i2,j1:j2))
  546. end do
  547. ! METEO variables
  548. call add_Variable(region,-1 , 'temp ', 'Temperature ' , 'K ',3,temp,status )
  549. call add_Variable(region,-1 , 'hus ', 'Specific Humidity ' , '1 ',3,hus,status )
  550. call add_Variable(region,-1 , 'airmass ', 'Air Mass ' , 'kg m-2 ',3,airmass,status )
  551. call add_Variable(region,-1 ,'pressure ', 'Pressure ' , 'Pa ',3,pressure,status )
  552. call add_Variable(region,-1 ,'prod_gas_so4 ', 'production of so4 ' , 'kg m-2s-1',3,p_gas_so4,status )
  553. call add_Variable(region,-1 ,'prod_liq_so4 ', 'production of so4 ' , 'kg m-2s-1',3,p_liq_so4,status )
  554. call add_Variable(region,-1 ,'prod_elvoc ', 'production of elvoc ' , 'kg m-2s-1',3,p_elvoc,status )
  555. call add_Variable(region,-1 ,'prod_svoc ', 'production of svoc ' , 'kg m-2s-1',3,p_svoc,status )
  556. call add_Variable(region,-1 ,'p_el_ohterp ', 'production of elvoc, ohterp ' , 'kg m-2s-1',3,p_elohterp,status )
  557. call add_Variable(region,-1 ,'p_el_o3terp ', 'production of elvoc, o3terp ' , 'kg m-2s-1',3,p_elo3terp,status )
  558. call add_Variable(region,-1 ,'p_el_ohisop ', 'production of elvoc, ohisop ' , 'kg m-2s-1',3,p_elohisop,status )
  559. call add_Variable(region,-1 ,'p_el_o3isop ', 'production of elvoc, o3isop ' , 'kg m-2s-1',3,p_elo3isop,status )
  560. call add_Variable(region,-1 ,'p_sv_ohterp ', 'production of svoc, ohterp ' , 'kg m-2s-1',3,p_svohterp,status )
  561. call add_Variable(region,-1 ,'p_sv_o3terp ', 'production of svoc, o3terp ' , 'kg m-2s-1',3,p_svo3terp,status )
  562. call add_Variable(region,-1 ,'p_sv_ohisop ', 'production of svoc, ohisop ' , 'kg m-2s-1',3,p_svohisop,status )
  563. call add_Variable(region,-1 ,'p_sv_o3isop ', 'production of svoc, o3isop ' , 'kg m-2s-1',3,p_svo3isop,status )
  564. call add_Variable(region,-1 ,'d_nuc ', 'production of particles ' , ' cm-3s-1',3,d_nuc,status )
  565. call add_Variable(region,-1 ,'m_nuc_su ', 'nucleation sulfate ' , ' molec cm-3s-1',3,m_nuc_su,status )
  566. call add_Variable(region,-1 ,'m_nuc_soa ', 'nucleation ELVOC ' , ' µg m-3s-1',3,m_nuc_soa,status )
  567. call add_Variable(region,-1 ,'gr1_2 ', 'growth of mode 1 into 2 ' , ' cm-3s-1',3,gr1_2,status )
  568. call add_Variable(region,-1 ,'coag1 ', 'coagulation sink of mode 1 ' , ' cm-3s-1',3,coag1,status )
  569. call add_Variable(region,-1 ,'co1_soa ', 'condensation of ELVOC to mode 1 ' , ' µg m-3s-1',3,co1_soa,status )
  570. call add_Variable(region,-1 ,'co2_soa ', 'condensation of ELVOC to mode 2 ' , ' µg m-3s-1',3,co2_soa,status )
  571. call add_Variable(region,-1 ,'co3_soa ', 'condensation of ELVOC to mode 3 ' , ' µg m-3s-1',3,co3_soa,status )
  572. call add_Variable(region,-1 ,'co4_soa ', 'condensation of ELVOC to mode 4 ' , ' µg m-3s-1',3,co4_soa,status )
  573. call add_Variable(region,-1 ,'co5_soa ', 'condensation of ELVOC to mode 5 ' , ' µg m-3s-1',3,co5_soa,status )
  574. call add_Variable(region,-1 ,'co1_su ', 'condensation of sulfate to mode 1 ' , ' molec cm-3s-1',3,co1_su,status )
  575. IF (nCCNdiag) THEN
  576. ALLOCATE(ind_CCN(nSat))
  577. DO iSat=1,nSat
  578. WRITE(str,'("CCN",F4.2)') SuperSat(iSat)*100.e0
  579. WRITE(str2,'("CCN at ",F4.2,"%")') SuperSat(iSat)*100.e0
  580. call add_Variable(region,-1 ,str, str2, ' cm-3',3,ind_CCN(iSat),status )
  581. ENDDO
  582. ENDIF
  583. call add_Variable(region,-1 ,'gph3D', '3D Geopotential height', 'm',3,gph,status )
  584. ! mass concentrations of different modes
  585. imass=0
  586. do i=1,nmod
  587. do j=1,mode_nm(i)!ncomp
  588. !get tracer id from mode_tracers array
  589. itracer=mode_tracers(j,i)
  590. ! if there is a tracer, add variable to output array
  591. !if (itracer>0)then
  592. imass=imass+1
  593. call add_Variable(region,itracer ,'M_'//names(itracer), 'mass concentration of '//names(itracer), 'kg m-3',3,index_aer,status )
  594. !end if
  595. ! save output array id for masses
  596. masses(imass)=index_aer
  597. end do
  598. end do
  599. call add_Variable(region,imsa ,'M_MSA', 'mass concentration of MSA (ACS)', 'kg m-3',3,index_aer,status )
  600. call add_Variable(region,ino3_a ,'M_NO3', 'mass concentration of NO3 (ACS)', 'kg m-3',3,index_aer,status )
  601. ! Mode number concentrations
  602. do i=1,nmod
  603. !get tracer id from mode_tracers array
  604. ! 0-index of mode_tracers has the number for each mode
  605. itracer=mode_tracers(0,i)
  606. ! if there is a tracer, add variable to output array
  607. if (itracer>0)then
  608. !
  609. call add_Variable(region,itracer ,'N_'//names(itracer)(1:3), 'number concentration of '//names(itracer), '1 m-3',3,index_aer,status )
  610. end if
  611. ! save output array id for number
  612. number(i)=index_aer
  613. end do
  614. ! gas-phase output
  615. do i=1,ngas_output
  616. itracer=gas_output(i)
  617. call add_Variable(region,itracer ,'GAS_'//names(itracer), 'gas phase concentration of '//names(itracer), 'kg m-3',3,index_aer,status )
  618. end do
  619. ! particle water
  620. do i=1,nsol
  621. !write(iout,'(I2.2)') i
  622. itracer=mode_start(i)
  623. call add_Variable(region,-1 , 'aerh2o3d_'//names(itracer)(1:3), 'concentration of aerosol water of mode '//names(itracer)(1:3) , 'kg m-3',3,index_aer,status )
  624. end do
  625. ! Radius of the particles
  626. ! wet radius for all
  627. do i=1,nmod
  628. itracer=mode_start(i)
  629. call add_Variable(region,-1 ,'RWET_'//names(itracer)(1:3), 'wet radius of '//names(itracer)(1:3), 'm',3,index_aer,status )
  630. end do
  631. ! dry radius only for soluble, as rwet=rdry for insoluble
  632. do i=1,nsol
  633. itracer=mode_start(i)
  634. call add_Variable(region,-1 ,'RDRY_'//names(itracer)(1:3), 'dry radius of '//names(itracer)(1:3), 'm',3,index_aer,status )
  635. end do
  636. ! 2d data
  637. ! For now it is exactly the same as in AEROCOM-output, mostly due to optics depending on
  638. ! output indices now in place
  639. mixf(region)%f2d(ps )%mf = metafields( -1 , 'ps ', 'Surface Air Pressure ' , 'Pa ', '', 'surface_air_pressure' )
  640. mixf(region)%f2d(precip )%mf = metafields( -1 , 'precip ', 'Precipitation ' , 'kg m-2 s-1', '', 'precipitation_flux' )
  641. mixf(region)%f2d(sconcoa )%mf = metafields( -1 , 'sconcoa ', 'Surface Concentration POM ' , 'kg m-3 ', '', 'mass_concentration_of_particulate_organic_matter_dry_aerosol_in_air' )
  642. mixf(region)%f2d(sconcbc )%mf = metafields( -1 , 'sconcbc ', 'Surface Concentration BC ' , 'kg m-3 ', '', 'mass_concentration_of_black_carbon_dry_aerosol_in_air' )
  643. mixf(region)%f2d(sconcso4 )%mf = metafields( -1 , 'sconcso4 ', 'Surface Concentration SO4 ' , 'kg m-3 ', '', 'mass_concentration_of_sulfate_dry_aerosol_in_air' )
  644. mixf(region)%f2d(sconcdust )%mf = metafields( -1 , 'sconcdust ', 'Surface Concentration Dust ' , 'kg m-3 ', '', 'mass_concentration_of_dust_dry_aerosol_in_air' )
  645. mixf(region)%f2d(sconcss )%mf = metafields( -1 , 'sconcss ', 'Surface Concentration SS ' , 'kg m-3 ', '', 'mass_concentration_of_seasalt_dry_aerosol_in_air' )
  646. mixf(region)%f2d(sconcno3 )%mf = metafields( -1 , 'sconcno3 ', 'Surface Concentration NO3 ' , 'kg m-3 ', '', 'mass_concentration_of_nitrate_dry_aerosol_in_air' )
  647. mixf(region)%f2d(sconcnh4 )%mf = metafields( -1 , 'sconcnh4 ', 'Surface Concentration NH4 ' , 'kg m-3 ', '', 'mass_concentration_of_ammonium_dry_aerosol_in_air' )
  648. mixf(region)%f2d(sconcmsa )%mf = metafields( -1 , 'sconcmsa ', 'Surface Concentration MSA ' , 'kg m-3 ', '', 'mass_concentration_of_methane_sulfonic_acid_in_air' )
  649. mixf(region)%f2d(loadoa )%mf = metafields( -1 , 'loadoa ', 'Load of POM ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol' )
  650. mixf(region)%f2d(loadbc )%mf = metafields( -1 , 'loadbc ', 'Load of BC ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_black_carbon_dry_aerosol' )
  651. mixf(region)%f2d(loadso4 )%mf = metafields( -1 , 'loadso4 ', 'Load of SO4 ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_sulfate_dry_aerosol' )
  652. mixf(region)%f2d(loaddust )%mf = metafields( -1 , 'loaddust ', 'Load of Dust ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_dust_dry_aerosol' )
  653. mixf(region)%f2d(loadss )%mf = metafields( -1 , 'loadss ', 'Load of SS ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_seasalt_dry_aerosol' )
  654. mixf(region)%f2d(loadno3 )%mf = metafields( -1 , 'loadno3 ', 'Load of NO3 ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_nitrate_dry_aerosol' )
  655. mixf(region)%f2d(emioa )%mf = metafields( -1 , 'emioa ', 'Total Emission of POM ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_due_to_emission' )
  656. mixf(region)%f2d(emibc )%mf = metafields( -1 , 'emibc ', 'Total Emission of BC ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_black_carbon_dry_aerosol_due_to_emission' )
  657. mixf(region)%f2d(emiso2 )%mf = metafields( -1 , 'emiso2 ', 'Total Emission of SO2 ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_sulfur_dioxide_due_to_emission' )
  658. mixf(region)%f2d(emiso4 )%mf = metafields( -1 , 'emiso4 ', 'Total Direct Emission of SO4 ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_due_to_emission' )
  659. mixf(region)%f2d(emidust )%mf = metafields( -1 , 'emidust ', 'Total Emission of Dust ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_due_to_emission' )
  660. mixf(region)%f2d(emidms )%mf = metafields( -1 , 'emidms ', 'Total Emission of DMS ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_dimethyl_sulfide_due_to_emission' )
  661. mixf(region)%f2d(emiss )%mf = metafields( -1 , 'emiss ', 'Total Emission of SeaSalt ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_seasalt_dry_aerosol_due_to_emission' )
  662. mixf(region)%f2d(dryso2 )%mf = metafields( -1 , 'dryso2 ', 'Dry Deposition of SO2 ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_sulfur_dioxide_due_to_dry_deposition' )
  663. mixf(region)%f2d(dryoa )%mf = metafields( -1 , 'dryoa ', 'Dry Deposition of POM ' , 'kg m-2 s-1', 'down', &
  664. 'tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_due_to_dry_deposition' )
  665. mixf(region)%f2d(drybc )%mf = metafields( -1 , 'drybc ', 'Dry Deposition of BC ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_black_carbon_dry_aerosol_due_to_dry_deposition' )
  666. mixf(region)%f2d(dryso4 )%mf = metafields( -1 , 'dryso4 ', 'Dry Deposition of SO4 ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_due_to_dry_deposition' )
  667. mixf(region)%f2d(drydust )%mf = metafields( -1 , 'drydust ', 'Dry Deposition of Dust ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_due_to_dry_deposition' )
  668. mixf(region)%f2d(drydms )%mf = metafields( -1 , 'drydms ', 'Dry Deposition of DMS ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_dimethyl_sulfide_due_to_dry_deposition' )
  669. mixf(region)%f2d(dryss )%mf = metafields( -1 , 'dryss ', 'Dry Deposition of SeaSalt ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_seasalt_dry_aerosol_due_to_dry_deposition' )
  670. mixf(region)%f2d(wetoa )%mf = metafields( -1 , 'wetoa ', 'Wet Deposition of POM ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
  671. mixf(region)%f2d(wetbc )%mf = metafields( -1 , 'wetbc ', 'Wet Deposition of BC ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_black_carbon_dry_aerosol_due_to_wet_deposition' )
  672. mixf(region)%f2d(wetso2 )%mf = metafields( -1 , 'wetso2 ', 'Wet Deposition of SO2 ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_sulfur_dioxide_due_to_wet_deposition' )
  673. mixf(region)%f2d(wetso4 )%mf = metafields( -1 , 'wetso4 ', 'Wet Deposition of SO4 ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_due_to_wet_deposition' )
  674. mixf(region)%f2d(wetdust )%mf = metafields( -1 , 'wetdust ', 'Wet Deposition of Dust ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_due_to_wet_deposition' )
  675. mixf(region)%f2d(wetdms )%mf = metafields( -1 , 'wetdms ', 'Wet Deposition of DMS ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_dimethyl_sulfide_due_to_wet_deposition' )
  676. mixf(region)%f2d(wetss )%mf = metafields( -1 , 'wetss ', 'Wet Deposition of Seasalt ' , 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_seasalt_dry_aerosol_due_to_wet_deposition' )
  677. mixf(region)%f2d(od550aer )%mf = metafields( -1 , 'od550aer ', 'AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
  678. mixf(region)%f2d(od550so4 )%mf = metafields( -1 , 'od550so4 ', 'SO4 AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_sulfate_ambient_aerosol' )
  679. mixf(region)%f2d(od550bc )%mf = metafields( -1 , 'od550bc ', 'Black Carbon AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_black_carbon_ambient_aerosol' )
  680. mixf(region)%f2d(od550oa )%mf = metafields( -1 , 'od550oa ', 'POM AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol' )
  681. mixf(region)%f2d(od550soa )%mf = metafields( -1 , 'od550soa ', 'SOA AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_particulate_secondary_organic_aerosol_ambient_aerosol' )
  682. mixf(region)%f2d(od550ss )%mf = metafields( -1 , 'od550ss ', 'SeaSalt AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_seasalt_ambient_aerosol' )
  683. mixf(region)%f2d(od550dust )%mf = metafields( -1 , 'od550dust ', 'Dust AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_dust_ambient_aerosol' )
  684. mixf(region)%f2d(od550no3 )%mf = metafields( -1 , 'od550no3 ', 'Nitrate AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_nitrate_ambient_aerosol' )
  685. mixf(region)%f2d(od550aerh2o )%mf = metafields( -1 , 'od550aerh2o ', 'Aerosol Water AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_water_in_ambient_aerosol' )
  686. mixf(region)%f2d(od550lt1aer )%mf = metafields( -1 , 'od550lt1aer ', 'Fine Mode AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_pm1_ambient_aerosol' )
  687. mixf(region)%f2d(od550lt1dust)%mf = metafields( -1 , 'od550lt1dust', 'Fine Mode Dust AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_dust_pm1_ambient_aerosol' )
  688. mixf(region)%f2d(od550lt1ss)%mf = metafields( -1 , 'od550lt1ss ', 'Fine Mode SeaSalt AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_seasalt_pm1_ambient_aerosol' )
  689. mixf(region)%f2d(abs550aer )%mf = metafields( -1 , 'abs550aer ', 'Absorption AOD@550nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
  690. mixf(region)%f2d(asyaer )%mf = metafields( -1 , 'asyaer ', 'Asymmetry Parameter ' , '1 ', '', 'atmosphere_asymmetry_parameter_ambient_aerosol' )
  691. mixf(region)%f2d(ec550aer )%mf = metafields( -1 , 'ec550aer ', 'Surface Ambient Aerosol Extinction@550nm' , 'm-1 ', '', 'surface_extinction_due_to_ambient_aerosol' )
  692. mixf(region)%f2d(ec550dryaer )%mf = metafields( -1 , 'ec550dryaer ', 'Surface Dry Aerosol Extinction@550 nm','m-1 ', '', 'surface_extinction_due_to_dry_aerosol' )
  693. mixf(region)%f2d(abs550dryaer)%mf = metafields( -1 , 'abs550dryaer', 'Surface Dry Aerosol Absorption@550 nm','m-1 ', '', 'surface_absorption_due_to_dry_aerosol' )
  694. mixf(region)%f2d(asydryaer )%mf = metafields( -1 , 'asydryaer ', 'Surface Dry Aersol Asymmetry Parameter' , '1 ', '', 'surface_asymmetry_parameter_dry_aerosol' )
  695. mixf(region)%f2d(ec550drylt1aer )%mf = metafields( -1 , 'ec550drylt1aer ', 'Surface Fine Mode Dry Aerosol Extinction@550 nm' , 'm-1', '', 'surface_extinction_due_to_pm1_dry_aerosol' )
  696. mixf(region)%f2d(abs550drylt1aer)%mf = metafields( -1 , 'abs550drylt1aer', 'Surface Fine Mode Dry Aerosol Absorption@550 nm' , 'm-1', '', 'surface_absorption_due_to_pm1_dry_aerosol' )
  697. mixf(region)%f2d(od440aer )%mf = metafields( -1 , 'od440aer ', 'AOD@440nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
  698. mixf(region)%f2d(abs440aer )%mf = metafields( -1 , 'abs440aer ', 'Absorption AOD@440nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
  699. mixf(region)%f2d(ec440dryaer )%mf = metafields( -1 , 'ec440dryaer ', 'Surface Dry Aerosol Extinction@440nm' , 'm-1 ', '', 'surface_extinction_due_to_dry_aerosol' )
  700. mixf(region)%f2d(abs440dryaer)%mf = metafields( -1 , 'abs440dryaer', 'Surface Dry Aerosol Absorption@440nm' , 'm-1 ', '', 'surface_absorption_due_to_dry_aerosol' )
  701. mixf(region)%f2d(od870aer )%mf = metafields( -1 , 'od870aer ', 'AOD@870nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
  702. mixf(region)%f2d(abs870aer )%mf = metafields( -1 , 'abs870aer ', 'Absorption AOD@870nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
  703. mixf(region)%f2d(ec870dryaer )%mf = metafields( -1 , 'ec870dryaer ', 'Surface Dry Aerosol Extinction@870nm' , 'm-1 ', '', 'surface_extinction_due_to_dry_aerosol' )
  704. mixf(region)%f2d(abs870dryaer)%mf = metafields( -1 , 'abs870dryaer', 'Surface Dry Aerosol Absorption@870nm' , 'm-1 ', '', 'surface_absorption_due_to_dry_aerosol' )
  705. mixf(region)%f2d(od350aer )%mf = metafields( -1 , 'od350aer ', 'AOD@350nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
  706. mixf(region)%f2d(abs350aer )%mf = metafields( -1 , 'abs350aer ', 'Absorption AOD@350nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
  707. !!$
  708. !!$
  709. !!$ mixf(region)%f2d(52)%mf = metafields( 'od550soa ', 'AOD@550nm SOA ' , '1 ' )
  710. !!$ mixf(region)%f2d(53)%mf = metafields( 'od550bb ', 'AOD@550nm BB ' , '1 ' )
  711. !!$ mixf(region)%f2d(54)%mf = metafields( 'gf90aer ', 'GF @ 90 % RH ' , '1 ' )
  712. mixf(region)%f2d( tr2d_1)%mf = metafields( iso4nus, 'SO4NUS ', 'concentration of tracer 01' , 'kg m-3', '', 'concentration_of_tracer_dry_aerosol_in_air' )
  713. mixf(region)%f2d( tr2d_2)%mf = metafields( iso4ais, 'SO4AIS ', 'concentration of tracer 02' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  714. mixf(region)%f2d( tr2d_3)%mf = metafields( iso4acs, 'SO4ACS ', 'concentration of tracer 03' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  715. mixf(region)%f2d( tr2d_4)%mf = metafields( iso4cos, 'SO4COS ', 'concentration of tracer 04' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  716. mixf(region)%f2d( tr2d_5)%mf = metafields( ibcais , 'BCAIS ', 'concentration of tracer 05' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  717. mixf(region)%f2d( tr2d_6)%mf = metafields( ibcacs , 'BCACS ', 'concentration of tracer 06' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  718. mixf(region)%f2d( tr2d_7)%mf = metafields( ibccos , 'BCCOS ', 'concentration of tracer 07' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  719. mixf(region)%f2d( tr2d_8)%mf = metafields( ibcaii , 'BCAII ', 'concentration of tracer 08' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  720. mixf(region)%f2d( tr2d_9)%mf = metafields( ipomais, 'POMAIS ', 'concentration of tracer 09' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  721. mixf(region)%f2d(tr2d_10)%mf = metafields( ipomacs, 'POMACS ', 'concentration of tracer 10' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  722. mixf(region)%f2d(tr2d_11)%mf = metafields( ipomcos, 'POMCOS ', 'concentration of tracer 11' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  723. mixf(region)%f2d(tr2d_12)%mf = metafields( ipomaii, 'POMAII ', 'concentration of tracer 12' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  724. mixf(region)%f2d(tr2d_13)%mf = metafields( issacs , 'SSACS ', 'concentration of tracer 13' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  725. mixf(region)%f2d(tr2d_14)%mf = metafields( isscos , 'SSCOS ', 'concentration of tracer 14' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  726. mixf(region)%f2d(tr2d_15)%mf = metafields( iduacs , 'DUACS ', 'concentration of tracer 15' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  727. mixf(region)%f2d(tr2d_16)%mf = metafields( iducos , 'DUCOS ', 'concentration of tracer 16' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  728. mixf(region)%f2d(tr2d_17)%mf = metafields( iduaci , 'DUACI ', 'concentration of tracer 17' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  729. mixf(region)%f2d(tr2d_18)%mf = metafields( iducoi , 'DUCOI ', 'concentration of tracer 18' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  730. mixf(region)%f2d(tr2d_19)%mf = metafields( isoanus, 'SOANUS ', 'concentration of tracer 19' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  731. mixf(region)%f2d(tr2d_20)%mf = metafields( isoaais, 'SOAAIS ', 'concentration of tracer 20' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  732. mixf(region)%f2d(tr2d_21)%mf = metafields( isoaacs, 'SOAACS ', 'concentration of tracer 21' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  733. mixf(region)%f2d(tr2d_22)%mf = metafields( isoacos, 'SOACOS ', 'concentration of tracer 22' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  734. mixf(region)%f2d(tr2d_23)%mf = metafields( isoaaii, 'SOAAII ', 'concentration of tracer 23' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
  735. !!$
  736. mixf(region)%f2d(cc01)%mf = metafields( inus_n , 'conc_NUS', 'number concentration of mode 01' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  737. mixf(region)%f2d(cc02)%mf = metafields( iais_n , 'conc_AIS', 'number concentration of mode 02' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  738. mixf(region)%f2d(cc03)%mf = metafields( iacs_n , 'conc_ACS', 'number concentration of mode 03' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  739. mixf(region)%f2d(cc04)%mf = metafields( icos_n , 'conc_COS', 'number concentration of mode 04' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  740. mixf(region)%f2d(cc05)%mf = metafields( iaii_n , 'conc_AII', 'number concentration of mode 05' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  741. mixf(region)%f2d(cc06)%mf = metafields( iaci_n , 'conc_ACI', 'number concentration of mode 06' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  742. mixf(region)%f2d(cc07)%mf = metafields( icoi_n , 'conc_COI', 'number concentration of mode 07' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
  743. mixf(region)%f2d(h2o1)%mf = metafields( -1 , 'aerh2o01 ', 'conc of aerosol water of mode 01' , 'kg m-3','', 'concentration_of_water_in_ambient_aerosol_in_air' )
  744. mixf(region)%f2d(h2o2)%mf = metafields( -1 , 'aerh2o02 ', 'conc of aerosol water of mode 02' , 'kg m-3','', 'concentration_of_water_in_ambient_aerosol_in_air' )
  745. mixf(region)%f2d(h2o3)%mf = metafields( -1 , 'aerh2o03 ', 'conc of aerosol water of mode 03' , 'kg m-3','', 'concentration_of_water_in_ambient_aerosol_in_air' )
  746. mixf(region)%f2d(h2o4)%mf = metafields( -1 , 'aerh2o04 ', 'conc of aerosol water of mode 04' , 'kg m-3','', 'concentration_of_water_in_ambient_aerosol_in_air' )
  747. mixf(region)%f2d(rw01)%mf = metafields( -1 , 'RWETnus ', 'rwet nus ' , 'm','', 'wet_radius' )
  748. mixf(region)%f2d(rw02)%mf = metafields( -1 , 'RWETais ', 'rwet ais ' , 'm','', 'wet_radius' )
  749. mixf(region)%f2d(rw03)%mf = metafields( -1 , 'RWETacs ', 'rwet acs ' , 'm','', 'wet_radius' )
  750. mixf(region)%f2d(rw04)%mf = metafields( -1 , 'RWETcos ', 'rwet cos ' , 'm','', 'wet_radius' )
  751. mixf(region)%f2d(rw05)%mf = metafields( -1 , 'RWETaii ', 'rwet aii ' , 'm','', 'wet_radius' )
  752. mixf(region)%f2d(rw06)%mf = metafields( -1 , 'RWETaci ', 'rwet aci ' , 'm','', 'wet_radius' )
  753. mixf(region)%f2d(rw07)%mf = metafields( -1 , 'RWETcoi ', 'rwet coi ' , 'm','', 'wet_radius' )
  754. mixf(region)%f2d(rd01)%mf = metafields( -1 , 'RDRYnus ', 'rdry nus ' , 'm','', 'dry radius' )
  755. mixf(region)%f2d(rd02)%mf = metafields( -1 , 'RDRYais ', 'rdry ais ' , 'm','', 'dry radius' )
  756. mixf(region)%f2d(rd03)%mf = metafields( -1 , 'RDRYacs ', 'rdry acs ' , 'm','', 'dry radius' )
  757. mixf(region)%f2d(rd04)%mf = metafields( -1 , 'RDRYcos ', 'rdry cos ' , 'm','', 'dry radius' )
  758. mixf(region)%f2d(emiterp)%mf = metafields( -1 , 'emiterp ', 'emiterp ' , 'kgm-2s-1','', 'emission_of_terpene' )
  759. mixf(region)%f2d(emiisop)%mf = metafields( -1 , 'emiisop ', 'emiisop ' , 'kgm-2s-1','', 'emission_of_isoprene' )
  760. !!$ mixf(region)%f2d(rd05)%mf = metafields( -1 , 'RDRYaii ', 'rdry ' , 'm','', 'precipitation_flux' )
  761. !!$ mixf(region)%f2d(rd06)%mf = metafields( -1 , 'RDRYaci ', 'rdry ' , 'm','', 'precipitation_flux' )
  762. !!$ mixf(region)%f2d(rd07)%mf = metafields( -1 , 'RDRYcoi ', 'rdry ' , 'm','', 'precipitation_flux' )
  763. !!$ !mixf(region)%f2d(31)%mf = metafields( ino3_a , 'mmrno3_a ', 'mmr of nitrate aerosol' , 'kg m-3', 'mass_fraction_of_nitrate_dry_aerosol_in_air' )
  764. !!$ !mixf(region)%f2d(32)%mf = metafields( inh4 , 'mmrnh4 ', 'mmr of ammonium' , 'kg m-3', 'mass_fraction_of_ammonium_dry_aerosol_in_air' )
  765. !!$ !mixf(region)%f2d(33)%mf = metafields( imsa , 'mmrmsa ', 'mmr of methane sulfonic acid' , 'kg m-3', 'mass_fraction_of_methane_sulfonic_acid_in_air' )
  766. mixf(region)%f2d(sconcsoa )%mf = metafields( -1 , 'sconcsoa ', 'Surface Concentration SOA ' , 'kg m-3 ', &
  767. '', 'mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_in_air' )
  768. mixf(region)%f2d(loadsoa )%mf = metafields( -1 , 'loadsoa ', 'Load of SOA ' , 'kg m-2 ', &
  769. '', 'atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol' )
  770. mixf(region)%f2d(drysoa )%mf = metafields( -1 , 'drysoa ', 'Dry Deposition of SOA ' , 'kg m-2 s-1', 'down', &
  771. 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_dry_deposition' )
  772. mixf(region)%f2d(wetsoa )%mf = metafields( -1 , 'wetsoa ', 'Wet Deposition of SOA ' , &
  773. 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
  774. mixf(region)%f2d(p_svoc2d )%mf = metafields( -1 , 'p_svoc2D ', 'Column integral of SVOC production' , &
  775. 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
  776. mixf(region)%f2d(p_elvoc2d )%mf = metafields( -1 , 'p_elvoc2D ', 'Column integral of ELVOC production ' , &
  777. 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
  778. mixf(region)%f2d(p_gas_so42d )%mf = metafields( -1 , 'prod_gas_so42D ', 'Column integral of gas SO4 production' , &
  779. 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_gas_phase_sulfate' )
  780. mixf(region)%f2d(p_liq_so42d )%mf = metafields( -1 , 'prod_liq_so42D ', 'Column integral of liq SO4 production ' , &
  781. 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_liquid_phase_sulfate' )
  782. mixf(region)%f2d(emisoa )%mf = metafields( -1 , 'emisoa ', 'Total Emission of SOA ' , 'kg m-2 s-1', 'up', 'tendency_of_atmosphere_mass_content_of_secondary_organic_matter_dry_aerosol_due_to_emission' )
  783. ! set global dimensions of fields for netcdf definitions
  784. mixf (region)%nlon = imr
  785. mixf (region)%nlat = jmr
  786. mixf (region)%nlev = lmr
  787. !allocate space for lon, lat, lev information
  788. allocate(mixf (region)%lon(imr))
  789. allocate(mixf (region)%lat(jmr))
  790. allocate(mixf (region)%lev(lmr))
  791. ! save the lat and lon data for use in output
  792. mixf (region)%lat=global_lli(region)%lat_deg
  793. mixf (region)%lon=global_lli(region)%lon_deg
  794. mixf (region)%lev=(/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34/)
  795. ! intermediate structures for budgets
  796. allocate(drydepos(region)%f2dslast(i1:i2,j1:j2,8))
  797. allocate(wetdepos(region)%f2dslast(i1:i2,j1:j2,8))
  798. allocate(emission(region)%f2dslast(i1:i2,j1:j2,10))! pom, bc, su, so2, dms, ss, dust, terp, isop, soa(for oldsoa)
  799. ! these here are the initial budgets (monthly): 0.0
  800. drydepos(region)%f2dslast = 0.0
  801. wetdepos(region)%f2dslast = 0.0
  802. emission(region)%f2dslast = 0.0
  803. endif ! newsrun
  804. ! reset counters and accumulators
  805. mixf (region)%acct = 0
  806. do i = 1, ntracer_3d
  807. mixf(region)%f3d(i)%field = 0.0
  808. end do
  809. do i = 1, ntracer_2d
  810. mixf(region)%f2d(i)%field = 0.0
  811. end do
  812. ! ----------------
  813. ! open NetCDF file (mixf)
  814. ! ----------------
  815. call tau2date(itau,idater)
  816. ! time (in days since 2001-01-01 00:00)
  817. !Change to from beginning of a run (idatei)
  818. ! Does not work with monthly restarts date is set for
  819. ! each month...
  820. !time_reftime6=idatei
  821. call date2tau( time_reftime6, itauref )
  822. select case (trim(gen_freq))
  823. case ('hourly')
  824. write(idates, '(i4,3i2.2)') idater(1), idater(2), idater(3), idater(4)
  825. write(lidates, '(i4,"-",i2.2,"-",i2.2," ",i2.2,":30")') idater(1), idater(2), idater(3), idater(4)
  826. idater(5:6) = (/30,0/)
  827. case ('daily')
  828. write(idates, '(i4,2i2.2)') idater(1), idater(2), idater(3)
  829. write(lidates, '(i4,"-",i2.2,"-",i2.2," 12:00")') idater(1), idater(2), idater(3)
  830. ! set noon (recommendations)
  831. idater(4:6) = (/12,0,0/)
  832. case ('monthly')
  833. ! for monthly files, set time to middle of the month
  834. write(idates, '(i4,i2.2)') idater(1), idater(2)
  835. mlength=mlen(idater(2))
  836. if ( mod(mlength,2) == 0 ) then
  837. idater(3:6) = (/mlength/2 + 1,0,0,0/)
  838. write(lidates, '(i4,"-",i2.2,"-",i2.2," 00:00")') idater(1), idater(2), idater(3)
  839. else
  840. idater(3:6) = (/(mlength+1)/2,12,0,0/)
  841. write(lidates, '(i4,"-",i2.2,"-",i2.2," 12:00")') idater(1), idater(2), idater(3)
  842. endif
  843. case default
  844. write (gol,'("Unknown General output frequency;")'); call goErr
  845. end select
  846. call date2tau( idater, itaucur )
  847. !move the timestamp in middle of the average period
  848. if (trim(gen_freq)=='hourly') then
  849. ! if average period is hour move the timestamp 30 min back
  850. time_shift=30*60
  851. else if (trim(gen_freq)=='daily') then
  852. ! if average period is hour move the timestamp 30 min back
  853. time_shift = 12*60*60
  854. else if (trim(gen_freq)=='monthly') then
  855. ! assume 30 day months
  856. time_shift=15*60*60*24
  857. end if
  858. reftime = (itaucur - itauref - time_shift) / 86400.
  859. !call date2tau(
  860. WRITE(str_reftime,'("days since ",i0.4,"-",i0.2,"-",i0.2," ",i0.2,":",i0.2)') idatei(1),idatei(2),idatei(3),idatei(4),idatei(5)
  861. ! Changed file name convention to General Control 2015
  862. mixf(region)%fname = trim(outdir)//'/'//&
  863. trim(f_dataid)//'_'//&
  864. trim(f_model) //'_'//&
  865. trim(gen_exper)//'_'//&
  866. trim(idates) //'_'//&
  867. trim(gen_freq) //'.nc'
  868. #ifdef MPI
  869. ! overwrite existing files (clobber), provide MPI stuff:
  870. call MDF_Create( mixf(region)%fname, MDF_NETCDF4, MDF_REPLACE, mixf(region)%funit, status, &
  871. mpi_comm=localComm, mpi_info=MPI_INFO_NULL )
  872. if (status/=0) then
  873. write (gol,'("from creating NetCDF4 file for writing in parallel;")'); call goErr
  874. write (gol,'("MDF module not compiled with netcdf4_par support ?")'); call goErr
  875. TRACEBACK; status=1; return
  876. end if
  877. #else
  878. ! overwrite existing files (clobber)
  879. call MDF_Create( mixf(region)%fname, MDF_NETCDF4, MDF_REPLACE, mixf(region)%funit, status )
  880. IF_NOTOK_RETURN(status=1)
  881. #endif
  882. if(okdebug) then
  883. write(gol,*) 'output_general_init: File ', trim(mixf(region)%fname), ' opened ' ; call goPr
  884. endif
  885. ! global attributes
  886. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'title', 'Model output for General', status )
  887. IF_NOTOK_MDF(fid=mixf(region)%funit)
  888. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'source', 'TM5-mp', status )
  889. IF_NOTOK_MDF(fid=mixf(region)%funit)
  890. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'institution', 'Royal Netherlands Meteorological Institute (KNMI), De Bilt, The Netherlands)', status )
  891. IF_NOTOK_MDF(fid=mixf(region)%funit)
  892. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'contact' , 'Tommi Bergman: tommi.bergman@knmi.nl ; Twan van Noije; noije@knmi.nl', status )
  893. IF_NOTOK_MDF(fid=mixf(region)%funit)
  894. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'project_id', 'General Phase 3', status )
  895. IF_NOTOK_MDF(fid=mixf(region)%funit)
  896. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'conventions', 'CF-1.0 - HTAP', status )
  897. IF_NOTOK_MDF(fid=mixf(region)%funit)
  898. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'date', lidates, status )
  899. IF_NOTOK_MDF(fid=mixf(region)%funit)
  900. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'time_units', time_units, status )
  901. IF_NOTOK_MDF(fid=mixf(region)%funit)
  902. call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'references', 'http://tm5.sourceforge.net/', status )
  903. IF_NOTOK_MDF(fid=mixf(region)%funit)
  904. ! define dimensions
  905. call MDF_Def_Dim( mixf(region)%funit, 'lon', imr, lon_dimid, status )
  906. IF_NOTOK_MDF(fid=mixf(region)%funit)
  907. call MDF_Def_Dim( mixf(region)%funit, 'lat', jmr, lat_dimid, status )
  908. IF_NOTOK_MDF(fid=mixf(region)%funit)
  909. !write(3000,*)lmr
  910. call MDF_Def_Dim( mixf(region)%funit, 'lev', 34, lev_dimid, status )
  911. IF_NOTOK_MDF(fid=mixf(region)%funit)
  912. !Unlimited time causes a crash in the parallel NETCDF, when unlimited dimension is increased in the file
  913. !4.4.0 may correct this, but for now netcdf v4.4.0 on cca is not working
  914. call MDF_Def_Dim( mixf(region)%funit, 'time', 1, mixf(region)%timeid, status )
  915. IF_NOTOK_MDF(fid=mixf(region)%funit)
  916. ! define dimension variables
  917. ! longitude
  918. call MDF_Def_Var( mixf(region)%funit, 'lon', MDF_DOUBLE, &
  919. (/lon_dimid/), mixf(region)%lonid, status )
  920. IF_NOTOK_MDF(fid=mixf(region)%funit)
  921. call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'units', 'degrees_east', status)
  922. IF_NOTOK_MDF(fid=mixf(region)%funit)
  923. call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'axis', 'X', status)
  924. IF_NOTOK_MDF(fid=mixf(region)%funit)
  925. call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'long_name', 'longitude', status)
  926. IF_NOTOK_MDF(fid=mixf(region)%funit)
  927. call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'standard_name', 'longitude', status)
  928. IF_NOTOK_MDF(fid=mixf(region)%funit)
  929. ! Write out the longitudes
  930. call MDF_Put_Var( mixf(region)%funit, mixf(region)%lonid, mixf(region)%lon, status)
  931. IF_NOTOK_MDF(fid=mixf(region)%funit)
  932. ! define latitude variable
  933. call MDF_Def_Var( mixf(region)%funit, 'lat', MDF_DOUBLE, &
  934. (/lat_dimid/), mixf(region)%latid, status )
  935. IF_NOTOK_MDF(fid=mixf(region)%funit)
  936. !write out the latitude to variable
  937. call MDF_Put_Var( mixf(region)%funit, mixf(region)%latid, mixf(region)%lat, status)
  938. IF_NOTOK_MDF(fid=mixf(region)%funit)
  939. call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'units', 'degrees_north', status)
  940. IF_NOTOK_MDF(fid=mixf(region)%funit)
  941. call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'axis', 'Y', status)
  942. IF_NOTOK_MDF(fid=mixf(region)%funit)
  943. call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'long_name', 'latitude', status)
  944. IF_NOTOK_MDF(fid=mixf(region)%funit)
  945. call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'standard_name', 'latitude', status)
  946. IF_NOTOK_MDF(fid=mixf(region)%funit)
  947. ! lev
  948. call MDF_Def_Var( mixf(region)%funit, 'lev' , MDF_DOUBLE, &
  949. (/lev_dimid/), mixf(region)%levid, status )
  950. IF_NOTOK_MDF(fid=mixf(region)%funit)
  951. !call MDF_Put_Var( mixf(region)%funit, mixf(region)%levid, (/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34/), status)
  952. call MDF_Put_Var( mixf(region)%funit, mixf(region)%levid, mixf(region)%lev, status)
  953. IF_NOTOK_MDF(fid=mixf(region)%funit)
  954. ! time
  955. call MDF_Def_Var( mixf(region)%funit, 'time', MDF_DOUBLE, &
  956. (/mixf(region)%timeid/), mixf(region)%time_varid, status )
  957. IF_NOTOK_MDF(fid=mixf(region)%funit)
  958. call MDF_Put_Att( mixf(region)%funit,mixf(region)%time_varid , 'units', str_reftime, status)
  959. IF_NOTOK_MDF(fid=mixf(region)%funit)
  960. !call MDF_Put_Att( mixf(region)%funit,mixf(region)%timeid , 'long_name', 'time', status)
  961. !IF_NOTOK_MDF(fid=mixf(region)%funit)
  962. call MDF_Put_Att( mixf(region)%funit,mixf(region)%time_varid , 'standard_name', 'time', status)
  963. IF_NOTOK_MDF(fid=mixf(region)%funit)
  964. ! define variables
  965. !do i = 1, ntrace!r_3d
  966. do i = 1, n_3d_vars!ntracer_3d
  967. !write(1234,*)i,trim(mixf(region)%f3d(i)%mf%vname)
  968. call MDF_Def_Var( mixf(region)%funit, trim(mixf(region)%f3d(i)%mf%vname), MDF_FLOAT, &
  969. (/mixf(region)%lonid, mixf(region)%latid, mixf(region)%levid, mixf(region)%timeid/), varid, status )
  970. IF_NOTOK_MDF(fid=mixf(region)%funit)
  971. call MDF_Var_Par_Access( mixf(region)%funit, varid, access_mode, status )
  972. IF_NOTOK_MDF(fid=mixf(region)%funit)
  973. call MDF_Put_Att( mixf(region)%funit, varid, 'long_name', trim(mixf(region)%f3d(i)%mf%lname), status )
  974. IF_NOTOK_MDF(fid=mixf(region)%funit)
  975. call MDF_Put_Att( mixf(region)%funit, varid, 'standard_name', trim(mixf(region)%f3d(i)%mf%standard_name), status )
  976. IF_NOTOK_MDF(fid=mixf(region)%funit)
  977. call MDF_Put_Att( mixf(region)%funit, varid, 'units', trim(mixf(region)%f3d(i)%mf%unit), status )
  978. IF_NOTOK_MDF(fid=mixf(region)%funit)
  979. ! call MDF_Put_Att( mixf(region)%funit, varid, 'time', reftime, status )
  980. ! IF_NOTOK_MDF(fid=mixf(region)%funit)
  981. call MDF_Put_Att( mixf(region)%funit, varid, 'cell_methods', 'time: mean', status )
  982. IF_NOTOK_MDF(fid=mixf(region)%funit)
  983. if( mixf(region)%f3d(i)%mf%positive /= '' ) then
  984. call MDF_Put_Att( mixf(region)%funit, varid, 'positive', trim(mixf(region)%f3d(i)%mf%positive), status )
  985. IF_NOTOK_MDF(fid=mixf(region)%funit)
  986. end if
  987. mixf(region)%f3d(i)%varid = varid
  988. end do
  989. do i = 1, ntracer_2d
  990. ! write(1234,*)i,trim(mixf(region)%f2d(i)%mf%vname)
  991. call MDF_Def_Var( mixf(region)%funit, trim(mixf(region)%f2d(i)%mf%vname), MDF_FLOAT, &
  992. (/mixf(region)%lonid, mixf(region)%latid, mixf(region)%timeid/), varid, status )
  993. IF_NOTOK_MDF(fid=mixf(region)%funit)
  994. call MDF_Var_Par_Access( mixf(region)%funit, varid, access_mode, status )
  995. IF_NOTOK_MDF(fid=mixf(region)%funit)
  996. call MDF_Put_Att( mixf(region)%funit, varid, 'long_name', trim(mixf(region)%f2d(i)%mf%lname), status )
  997. IF_NOTOK_MDF(fid=mixf(region)%funit)
  998. call MDF_Put_Att( mixf(region)%funit, varid, 'standard_name', trim(mixf(region)%f2d(i)%mf%standard_name), status )
  999. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1000. call MDF_Put_Att( mixf(region)%funit, varid, 'units', trim(mixf(region)%f2d(i)%mf%unit), status )
  1001. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1002. ! call MDF_Put_Att( mixf(region)%funit, varid, 'time', reftime, status )
  1003. ! IF_NOTOK_MDF(fid=mixf(region)%funit)
  1004. call MDF_Put_Att( mixf(region)%funit, varid, 'cell_methods', 'time: mean', status )
  1005. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1006. if( mixf(region)%f2d(i)%mf%positive /= '' ) then
  1007. call MDF_Put_Att( mixf(region)%funit, varid, 'positive', trim(mixf(region)%f2d(i)%mf%positive), status )
  1008. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1009. end if
  1010. mixf(region)%f2d(i)%varid = varid
  1011. end do
  1012. call MDF_EndDef( mixf(region)%funit, status )
  1013. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1014. end do regionloop ! nregions
  1015. call goLabel() ; status = 0
  1016. end subroutine output_general_init
  1017. !EOC
  1018. !--------------------------------------------------------------------------
  1019. ! TM5 !
  1020. !--------------------------------------------------------------------------
  1021. !BOP
  1022. !
  1023. ! !IROUTINE: OUTPUT_GENERAL_DONE
  1024. !
  1025. ! !DESCRIPTION: Free parameters.
  1026. !\\
  1027. !\\
  1028. ! !INTERFACE:
  1029. !
  1030. subroutine output_general_done(status, iregion)
  1031. !
  1032. ! !USES:
  1033. use chem_param, only : ntracet,ntrace
  1034. !
  1035. ! !INPUT PARAMETERS:
  1036. !
  1037. !logical, intent(in) :: stat_output ! true if stations output is requested
  1038. integer, intent(in), optional :: iregion
  1039. !
  1040. ! !OUTPUT PARAMETERS:
  1041. !
  1042. integer, intent(out) :: status
  1043. !
  1044. ! !REVISION HISTORY:
  1045. ! 29 Nov 2010 - Achim Strunk -
  1046. !
  1047. ! !REMARKS:
  1048. !
  1049. !EOP
  1050. !------------------------------------------------------------------------
  1051. !BOC
  1052. character(len=*), parameter :: rname = mname//'/output_general_done'
  1053. integer :: i, region
  1054. ! --- begin -------------------------------------
  1055. call goLabel(rname)
  1056. deallocate( wdep_out )
  1057. regionloop: do region = 1, nregions
  1058. ! if region given, cycle if other region!
  1059. if (present(iregion)) then
  1060. if(iregion /= region) cycle regionloop
  1061. endif
  1062. do i=1,ntracer_3d
  1063. deallocate( mixf(region)%f3d(i)%field )
  1064. end do
  1065. do i=1,ntracer_2d
  1066. deallocate( mixf(region)%f2d(i)%field )
  1067. end do
  1068. deallocate( gas_output)
  1069. deallocate( mixf (region)%f3d )
  1070. deallocate( mixf (region)%f2d )
  1071. deallocate( drydepos(region)%f2dslast )
  1072. deallocate( wetdepos(region)%f2dslast )
  1073. deallocate( emission(region)%f2dslast )
  1074. end do regionloop
  1075. if (nCCNdiag) deallocate(ind_CCN)
  1076. call goLabel() ; status = 0
  1077. end subroutine output_general_done
  1078. !EOC
  1079. !--------------------------------------------------------------------------
  1080. ! TM5 !
  1081. !--------------------------------------------------------------------------
  1082. !BOP
  1083. !
  1084. ! !IROUTINE: output_general_write
  1085. !
  1086. ! !DESCRIPTION: This routines builds the average by dividing accumulated
  1087. ! data by stack counter. The results are written to file.
  1088. !\\
  1089. !\\
  1090. ! !INTERFACE:
  1091. !
  1092. subroutine output_general_write(region, status)
  1093. !
  1094. ! !USES:
  1095. !
  1096. use chem_param, only : ntracet,ntrace
  1097. use dims,only:itau
  1098. use datetime, only : tau2date, date2tau
  1099. ! !INPUT PARAMETERS:
  1100. !
  1101. integer, intent(in) :: region
  1102. !logical, intent(in) :: stat_output ! true if stations output is requested
  1103. !
  1104. ! !OUTPUT PARAMETERS:
  1105. !
  1106. integer, intent(out) :: status
  1107. !
  1108. ! !REVISION HISTORY:
  1109. ! 29 Nov 2010 - Achim Strunk -
  1110. !
  1111. ! !REMARKS:
  1112. !
  1113. !EOP
  1114. !------------------------------------------------------------------------
  1115. !BOC
  1116. character(len=*), parameter :: rname = mname//'/output_general_write'
  1117. integer :: i, imr, jmr, lmr
  1118. integer :: i1, i2, j1, j2, ilev
  1119. integer :: istat
  1120. ! Time definitions for General
  1121. real :: reftime
  1122. integer(kind=8) :: itauref
  1123. integer :: time_shift
  1124. ! --- begin -------------------------------------
  1125. call goLabel(rname)
  1126. ! grid size
  1127. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  1128. imr = i2-i1+1
  1129. jmr = j2-j1+1
  1130. lmr = levi%nlev
  1131. ! this here is already accumulated over the time period (day)
  1132. call collect_budgets( region, status )
  1133. IF_NOTOK_RETURN(status=1)
  1134. ! ---------------------
  1135. ! divide by accumulator
  1136. ! ---------------------
  1137. do i = 1, n_3d_vars!ntracer_3d
  1138. mixf(region)%f3d(i)%field = mixf(region)%f3d(i)%field / real( mixf(region)%acct )
  1139. end do
  1140. do i = 1, ntracer_2d
  1141. mixf(region)%f2d(i)%field = mixf(region)%f2d(i)%field / real( mixf(region)%acct )
  1142. end do
  1143. select case (trim(gen_freq))
  1144. case ('hourly')
  1145. write(gol,'("---> GENERAL diagnostics: write file for previous hour")'); call goPr
  1146. case ('daily')
  1147. write(gol,'("---> GENERAL diagnostics: write file for previous day")'); call goPr
  1148. case ('monthly')
  1149. write(gol,'("---> GENERAL diagnostics: write file for previous month")'); call goPr
  1150. end select
  1151. ! -------------
  1152. ! write to file
  1153. ! -------------
  1154. ! Ncfile needs a timestep
  1155. ! define the reference time
  1156. ! time (for now in days since 2001-01-01 00:00)
  1157. call date2tau( time_reftime6, itauref )
  1158. ! calculate reftime as fractional days from itauref, hence division by 86400
  1159. !call date2tau( idater, itaucur )
  1160. if (trim(gen_freq)=='hourly') then
  1161. ! if average period is hour move the timestamp 30 min back
  1162. time_shift=30*60
  1163. else if (trim(gen_freq)=='daily') then
  1164. ! if average period is hour move the timestamp 30 min back
  1165. time_shift = 12*60*60
  1166. else if (trim(gen_freq)=='monthly') then
  1167. ! assume 30 day months
  1168. time_shift=15*60*60*24
  1169. end if
  1170. reftime = (itau - itauref-time_shift) / 86400.
  1171. !reftime = (itau - itauref) / 86400.
  1172. !Add time stamp to current
  1173. !Currently only allows 1 step per file, needs to be extended
  1174. do i=1,ntracer_2d
  1175. call MDF_Put_Var( mixf(region)%funit, mixf(region)%f2d(i)%varid, mixf(region)%f2d(i)%field(i1:i2,j1:j2), status, start=(/i1,j1,1/), count=(/imr,jmr,1/) )
  1176. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1177. end do
  1178. do i=1,n_3d_vars!ntracer_3d
  1179. !write(1111,*) mixf(region)%f3d(i)%mf%vname,imr,jmr,lmr, mixf(region)%nlev,mixf(region)%nlat,mixf(region)%nlon
  1180. call MDF_Put_Var( mixf(region)%funit, mixf(region)%f3d(i)%varid, mixf(region)%f3d(i)%field(i1:i2,j1:j2,1:lmr), status, start=(/i1,j1,1,1/), count=(/imr,jmr,lmr,1/) )
  1181. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1182. end do
  1183. call MDF_Var_Par_Access( mixf(region)%funit, mixf(region)%time_varid, MDF_INDEPENDENT, status )
  1184. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1185. ! Write current reftime
  1186. call MDF_Put_Var( mixf(region)%funit, mixf(region)%time_varid,(/reftime/), status, start=(/1/),count=(/1/))
  1187. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1188. call MDF_Close( mixf(region)%funit, status )
  1189. IF_NOTOK_MDF(fid=mixf(region)%funit)
  1190. call goLabel() ; status = 0
  1191. end subroutine output_general_write
  1192. !EOC
  1193. !--------------------------------------------------------------------------
  1194. ! TM5 !
  1195. !--------------------------------------------------------------------------
  1196. !BOP
  1197. !
  1198. ! !IROUTINE: OUTPUT_GENERAL_STEP
  1199. !
  1200. ! !DESCRIPTION: This is the accumulation routine. It is called following
  1201. ! the user specification general.dhour in rc-file. It
  1202. ! evaluates the various diagnostics and does summing.
  1203. !\\
  1204. !\\
  1205. ! !INTERFACE:
  1206. !
  1207. subroutine output_general_step( region, dhour, status )
  1208. !
  1209. ! !USES:
  1210. !
  1211. use GO , only : TDate, NewDate, rTotal, operator(-), GO_Timer_Def, GO_Timer_End, GO_Timer_Start
  1212. use Grid , only : FPressure
  1213. use binas, only : rgas, rol,pi
  1214. use datetime, only : tau2date
  1215. use MeteoData, only : sp_dat, lsp_dat, cp_dat, m_dat
  1216. use MeteoData, only : temper_dat, humid_dat, gph_dat
  1217. use global_data, only : mass_dat, region_dat
  1218. use tracer_data, only : chem_dat
  1219. use dims, only : itaur
  1220. use chemistry, only : d_nucle, m_nucle_su, m_nucle_soa, growth1_2, coag_sink_nuc, cond1_soa, cond1_su
  1221. use chemistry, only : cond2_soa, cond3_soa, cond4_soa, cond5_soa
  1222. use chem_param, only : iso4acs, iso4cos, iduacs, iso4ais, ibccos, ibcaii, xmair
  1223. use chem_param, only : iso4nus, isscos, ino3_a, issacs, iducos, iduaci, nmod
  1224. use chem_param, only : iducoi, ibcacs, ipomcos, ipomaii, ibcais, ipomacs, ipomais,isoanus
  1225. use chem_param, only : isoaais, isoaacs, isoacos, isoaaii
  1226. use chem_param, only : imsa, inh4
  1227. use chem_param, only : inus_n,iacs_n,icos_n,iais_n,iaii_n,iaci_n,icoi_n
  1228. use chem_param, only : ntracet,ntrace
  1229. use chem_param, only : mode_end_pom,mode_end_so4,mode_end_ss,mode_end_bc,mode_end_dust,mode_end_soa
  1230. use mo_aero_m7, only : nsol,nmod,dnacl,doc,dh2so4,dbc,ddust
  1231. use optics, only : optics_aop_get
  1232. use m7_data, only : h2o_mode, rw_mode, rwd_mode
  1233. use ebischeme, only : diag_prod
  1234. !
  1235. ! !INPUT PARAMETERS:
  1236. !
  1237. integer, intent(in) :: region
  1238. integer, intent(in) :: dhour ! this is general.dhour [hours]
  1239. !logical, intent(in) :: stat_output ! true if stations output is requested
  1240. !
  1241. ! !OUTPUT PARAMETERS:
  1242. !
  1243. integer, intent(out) :: status
  1244. !
  1245. ! !REVISION HISTORY:
  1246. ! 29 Nov 2010 - Achim Strunk - Creation
  1247. !
  1248. ! !REMARKS:
  1249. !
  1250. !EOP
  1251. !------------------------------------------------------------------------
  1252. !BOC
  1253. character(len=*), parameter :: rname = mname//'/output_general_step'
  1254. ! MPI arrays to gather fields.
  1255. real, dimension(:,:,:,:), pointer :: rm, rmc
  1256. real, dimension(:,:,:), allocatable, target :: mg
  1257. real, dimension(:), pointer :: dxyp
  1258. real, dimension(:,:,:), allocatable :: pres3d
  1259. integer :: i, j, k, imr, jmr, lmr, lwl, dtime, iSat
  1260. integer :: i1, i2, j1, j2
  1261. integer :: ie, je ! indices for subdomain extended with halo cells
  1262. integer, parameter :: l_halo=1
  1263. logical :: polar
  1264. integer :: istat, imode
  1265. real :: dens, load_tmp
  1266. integer :: rwetcounter,h2ocounter,rdrycounter
  1267. Real, Dimension(:,:,:), Allocatable :: aop_output_ext ! extinctions
  1268. Real, Dimension(:,:), Allocatable :: aop_output_a ! single scattering albedo
  1269. Real, Dimension(:,:), Allocatable :: aop_output_g ! assymetry factor
  1270. Real, Dimension(:,:,:), Allocatable :: aop_output_add ! additional parameters
  1271. real, dimension(:,:,:,:,:), allocatable :: opt_ext
  1272. real, dimension(:,:,:,:), allocatable :: opt_a
  1273. real, dimension(:,:,:,:), allocatable :: opt_g
  1274. real, dimension(:,:,:,:,:), allocatable :: opt_add
  1275. real, dimension(:,:,:), allocatable :: volume
  1276. real, dimension(:,:), allocatable :: temp2d
  1277. real, dimension(:,:,:,:), allocatable :: CCN
  1278. real, dimension(:,:,:,:), allocatable :: dry_rad
  1279. integer :: ncontr, lvec, lct, l, indoffset, nwl,nn,irw,irwd
  1280. integer :: nadd, nadd_max, indoffset_stat, indabs
  1281. integer :: iadd
  1282. real :: no3fac, wght, dwght, tabs
  1283. integer,dimension(6) :: idate_f
  1284. type(TDate) :: t, t0
  1285. real :: time
  1286. ! --- begin -------------------------------
  1287. call goLabel(rname)
  1288. ! grid size
  1289. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2, hasNorthPole=polar )
  1290. imr = i2-i1+1
  1291. jmr = j2-j1+1
  1292. lmr = levi%nlev
  1293. ! link the datastructures for transported and non transported variables and
  1294. ! Gridbox area
  1295. nullify(rmc)
  1296. rmc => chem_dat(region)%rm
  1297. dxyp => region_dat(region)%dxyp
  1298. rm => mass_dat(region)%rm
  1299. ! get helping pressure field in 3d
  1300. ie=i2; je=j2
  1301. allocate( pres3d(i1:ie,j1:je,lmr) )
  1302. ! fill mid level pressure
  1303. call FPressure( levi, sp_dat(region)%data(i1:ie,j1:je,1), pres3d, status )
  1304. IF_NOTOK_RETURN(status=1)
  1305. allocate( CCN(nSat,i1:ie,j1:je,lmr))
  1306. allocate( dry_rad(nsol,i1:ie,j1:je,lmr))
  1307. call CCN_Diag(CCN, rm(i1:ie,j1:je,1:lmr,1:ntracet), dry_rad, temper_dat(region)%data(i1:i2,j1:j2,1:lmr))
  1308. ! dtime is seconds per step
  1309. ! dtime will be taken as weight for summing up
  1310. ! (makes it fit for varying step lengths)
  1311. dtime = dhour * 3600.
  1312. ! sum up for later averaging
  1313. mixf (region)%acct = mixf (region)%acct + dtime
  1314. ! ----------------------
  1315. ! 3D meteo fields
  1316. ! ----------------------
  1317. temp=1
  1318. hus=2
  1319. airmass=3
  1320. pressure=4
  1321. ! temperature
  1322. mixf(region)%f3d(temp)%field = mixf(region)%f3d(temp)%field + dtime * temper_dat(region)%data(i1:i2,j1:j2,:)
  1323. ! specific humidity
  1324. mixf(region)%f3d(hus)%field = mixf(region)%f3d(hus)%field + dtime * humid_dat(region)%data(i1:i2,j1:j2,:)
  1325. ! air mass (kg -> kg/m2)
  1326. do j = j1, j2
  1327. mixf(region)%f3d(airmass)%field(:,j,:) = mixf(region)%f3d(airmass)%field(:,j,:) + &
  1328. dtime * m_dat(region)%data(i1:i2,j,:) / dxyp(j)
  1329. end do
  1330. ! pressure (already filled above)
  1331. mixf(region)%f3d(pressure)%field = mixf(region)%f3d(pressure)%field + dtime * pres3d
  1332. do k=1,lmr
  1333. do j=j1,j2
  1334. do i=i1,i2
  1335. dens = pres3d(i,j,k) / temper_dat(region)%data(i,j,k) * xmair * 1.E-3 / (m_dat(region)%data(i,j,k) * Rgas)
  1336. mixf(region)%f3d(p_gas_so4)%field(i,j,k)= mixf(region)%f3d(p_gas_so4)%field(i,j,k)+diag_prod(region)%prod(i,j,k,1) / dxyp(j)
  1337. mixf(region)%f3d(p_liq_so4)%field(i,j,k)= mixf(region)%f3d(p_liq_so4)%field(i,j,k)+diag_prod(region)%prod(i,j,k,2) / dxyp(j)
  1338. mixf(region)%f2d(p_gas_so42d)%field(i,j)= mixf(region)%f2d(p_gas_so42d)%field(i,j)+diag_prod(region)%prod(i,j,k,1) / dxyp(j)
  1339. mixf(region)%f2d(p_liq_so42d)%field(i,j)= mixf(region)%f2d(p_liq_so42d)%field(i,j)+diag_prod(region)%prod(i,j,k,2) / dxyp(j)
  1340. mixf(region)%f3d(p_elvoc)%field(i,j,k)= mixf(region)%f3d(p_elvoc)%field(i,j,k)+diag_prod(region)%prod(i,j,k,3) / dxyp(j)! divide by 2 to calculate mean over 2 chemistry timesteps in one model timestep
  1341. mixf(region)%f3d(p_svoc)%field(i,j,k)= mixf(region)%f3d(p_svoc)%field(i,j,k)+diag_prod(region)%prod(i,j,k,4) / dxyp(j)
  1342. mixf(region)%f3d(p_elohterp)%field(i,j,k)= mixf(region)%f3d(p_elohterp)%field(i,j,k)+diag_prod(region)%prod(i,j,k,5) / dxyp(j)
  1343. mixf(region)%f3d(p_elo3terp)%field(i,j,k)= mixf(region)%f3d(p_elo3terp)%field(i,j,k)+diag_prod(region)%prod(i,j,k,6) / dxyp(j)
  1344. mixf(region)%f3d(p_elohisop)%field(i,j,k)= mixf(region)%f3d(p_elohisop)%field(i,j,k)+diag_prod(region)%prod(i,j,k,7) / dxyp(j)
  1345. mixf(region)%f3d(p_elo3isop)%field(i,j,k)= mixf(region)%f3d(p_elo3isop)%field(i,j,k)+diag_prod(region)%prod(i,j,k,8) / dxyp(j)
  1346. mixf(region)%f3d(p_svohterp)%field(i,j,k)= mixf(region)%f3d(p_svohterp)%field(i,j,k)+diag_prod(region)%prod(i,j,k,9) / dxyp(j)
  1347. mixf(region)%f3d(p_svo3terp)%field(i,j,k)= mixf(region)%f3d(p_svo3terp)%field(i,j,k)+diag_prod(region)%prod(i,j,k,10) / dxyp(j)
  1348. mixf(region)%f3d(p_svohisop)%field(i,j,k)= mixf(region)%f3d(p_svohisop)%field(i,j,k)+diag_prod(region)%prod(i,j,k,11) / dxyp(j)
  1349. mixf(region)%f3d(p_svo3isop)%field(i,j,k)= mixf(region)%f3d(p_svo3isop)%field(i,j,k)+diag_prod(region)%prod(i,j,k,12) / dxyp(j)
  1350. mixf(region)%f2d(p_elvoc2d)%field(i,j)= mixf(region)%f2d(p_elvoc2d)%field(i,j)+diag_prod(region)%prod(i,j,k,3) / dxyp(j)
  1351. mixf(region)%f2d(p_svoc2d)%field(i,j)= mixf(region)%f2d(p_svoc2d)%field(i,j)+diag_prod(region)%prod(i,j,k,4) / dxyp(j)
  1352. mixf(region)%f3d(d_nuc)%field(i,j,k)= mixf(region)%f3d(d_nuc)%field(i,j,k)+d_nucle(i,j,k) !value is saved #cm-3s-1
  1353. mixf(region)%f3d(m_nuc_su)%field(i,j,k)= mixf(region)%f3d(m_nuc_su)%field(i,j,k)+m_nucle_su(i,j,k) !value is saved #molec cm-3
  1354. mixf(region)%f3d(m_nuc_soa)%field(i,j,k)= mixf(region)%f3d(m_nuc_soa)%field(i,j,k)+m_nucle_soa(i,j,k) !value is saved #µg m-
  1355. mixf(region)%f3d(gr1_2)%field(i,j,k)= mixf(region)%f3d(gr1_2)%field(i,j,k)+growth1_2(i,j,k) !value is saved #cm-3
  1356. mixf(region)%f3d(coag1)%field(i,j,k)= mixf(region)%f3d(coag1)%field(i,j,k)+coag_sink_nuc(i,j,k) !value is saved #cm-3
  1357. mixf(region)%f3d(co1_soa)%field(i,j,k)= mixf(region)%f3d(co1_soa)%field(i,j,k)+cond1_soa(i,j,k) !value is saved # unit?
  1358. mixf(region)%f3d(co2_soa)%field(i,j,k)= mixf(region)%f3d(co2_soa)%field(i,j,k)+cond2_soa(i,j,k) !value is saved # unit?
  1359. mixf(region)%f3d(co3_soa)%field(i,j,k)= mixf(region)%f3d(co3_soa)%field(i,j,k)+cond3_soa(i,j,k) !value is saved # unit?
  1360. mixf(region)%f3d(co4_soa)%field(i,j,k)= mixf(region)%f3d(co4_soa)%field(i,j,k)+cond4_soa(i,j,k) !value is saved # unit?
  1361. mixf(region)%f3d(co5_soa)%field(i,j,k)= mixf(region)%f3d(co5_soa)%field(i,j,k)+cond5_soa(i,j,k)*dtime !value is saved # unit?
  1362. mixf(region)%f3d(co1_su)%field(i,j,k)= mixf(region)%f3d(co1_su)%field(i,j,k)+cond1_su(i,j,k)*dtime !value is saved # unit?
  1363. ! CCN under given supersaturation
  1364. IF (nCCNdiag) THEN
  1365. DO iSat=1,nSat
  1366. mixf(region)%f3d(ind_CCN(iSat))%field(i,j,k)= mixf(region)%f3d(ind_CCN(iSat))%field(i,j,k) + dtime * &
  1367. dens * 1.e-06 * CCN(iSat,i,j,k) ! cm-3
  1368. ENDDO
  1369. ENDIF
  1370. mixf(region)%f3d(gph)%field(i,j,k) = mixf(region)%f3d(gph)%field(i,j,k) + gph_dat(region)%data(i,j,k)*dtime
  1371. ! rwet, rdry, h2o data holder indices go from 1-4/7
  1372. ! so use counters, could also add modeindex in mixf
  1373. rwetcounter=1
  1374. rdrycounter=1
  1375. h2ocounter=1
  1376. do nn=1,n_3d_vars
  1377. if (mixf(region)%f3d(nn)%mf%itm5>0)then
  1378. ! transported variables in rm
  1379. if (mixf(region)%f3d(nn)%mf%itm5<=ntracet) then
  1380. mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
  1381. dens * rm(i,j,k,mixf(region)%f3d(nn)%mf%itm5)
  1382. else !non transported variables in rmc
  1383. mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
  1384. dens * rmc(i,j,k,mixf(region)%f3d(nn)%mf%itm5)
  1385. end if
  1386. else ! not a tracer variable
  1387. ! counter to go through 7 modes when outputing rwet
  1388. ! requires that rwet variables are in right order
  1389. ! Wet radius of particles
  1390. if ( mixf(region)%f3d(nn)%mf%vname(1:4)=='RWET')then
  1391. mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
  1392. rw_mode(region,rwetcounter)%d3(i,j,k)
  1393. rwetcounter=rwetcounter+1
  1394. end if
  1395. ! aerosol water
  1396. if ( mixf(region)%f3d(nn)%mf%vname(1:6)=='aerh2o')then
  1397. mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
  1398. dens*h2o_mode(region,h2ocounter)%d3(i,j,k)
  1399. h2ocounter=h2ocounter+1
  1400. end if
  1401. !dry radius of soluble modes
  1402. if ( mixf(region)%f3d(nn)%mf%vname(1:4)=='RDRY')then
  1403. mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
  1404. rwd_mode(region,rdrycounter)%d3(i,j,k)
  1405. rdrycounter=rdrycounter+1
  1406. end if
  1407. end if
  1408. end do
  1409. end do
  1410. end do
  1411. end do
  1412. ! set fields summed in chemistry to 0 after writing
  1413. d_nucle = 0.
  1414. m_nucle_su = 0.
  1415. m_nucle_soa = 0.
  1416. diag_prod(region)%prod(i1:i2,j1:j2,:,1)=0.0
  1417. diag_prod(region)%prod(i1:i2,j1:j2,:,2)=0.0
  1418. diag_prod(region)%prod(i1:i2,j1:j2,:,3)=0.0
  1419. diag_prod(region)%prod(i1:i2,j1:j2,:,4)=0.0
  1420. diag_prod(region)%prod(i1:i2,j1:j2,:,5)=0.0
  1421. diag_prod(region)%prod(i1:i2,j1:j2,:,6)=0.0
  1422. diag_prod(region)%prod(i1:i2,j1:j2,:,7)=0.0
  1423. diag_prod(region)%prod(i1:i2,j1:j2,:,8)=0.0
  1424. diag_prod(region)%prod(i1:i2,j1:j2,:,9)=0.0
  1425. diag_prod(region)%prod(i1:i2,j1:j2,:,10)=0.0
  1426. diag_prod(region)%prod(i1:i2,j1:j2,:,11)=0.0
  1427. diag_prod(region)%prod(i1:i2,j1:j2,:,12)=0.0
  1428. coag_sink_nuc = 0.
  1429. growth1_2 = 0.
  1430. cond1_soa = 0.
  1431. cond2_soa = 0.
  1432. cond3_soa = 0.
  1433. cond4_soa = 0.
  1434. cond5_soa = 0.
  1435. cond1_su = 0.
  1436. ! ----------------------
  1437. ! cycle over horizontal domain
  1438. ! ----------------------
  1439. do j = j1, j2
  1440. do i = i1, i2
  1441. ! -----------------------
  1442. ! SURFACE FIELDS
  1443. ! -----------------------
  1444. k = 1
  1445. ! ----------------------
  1446. ! Physical Parameters
  1447. ! ----------------------
  1448. ! surface pressure [Pa]
  1449. mixf(region)%f2d(ps)%field(i,j) = mixf(region)%f2d(ps)%field(i,j) + dtime * sp_dat(region)%data(i,j,k)
  1450. ! precipitation ([m s-1] --> [kg m-2 s-1] with density of water `rol`)
  1451. mixf(region)%f2d(precip)%field(i,j) = mixf(region)%f2d(precip)%field(i,j) + dtime * (cp_dat(region)%data(i,j,k) + lsp_dat(region)%data(i,j,k)) * rol
  1452. ! density for conversion of aerosol mass densities ( ---> 1/m3 )
  1453. ! (conversion factor 1.E-03 is for g --> kg)
  1454. dens = pres3d(i,j,k) / temper_dat(region)%data(i,j,k) * xmair * 1.E-3 / (m_dat(region)%data(i,j,k) * Rgas)
  1455. ! ----------------------
  1456. ! Surface Concentrations in [kg m-3]
  1457. ! ----------------------
  1458. !TB added nucleation mode oc
  1459. ! POM: (AIS + ACS + COS + AII)
  1460. mixf(region)%f2d(sconcoa)%field(i,j) = mixf(region)%f2d(sconcoa)%field(i,j) + dtime * &
  1461. dens * (rm(i,j,k,iPOMais) + rm(i,j,k,iPOMacs) + rm(i,j,k,iPOMcos) + rm(i,j,k,iPOMaii))
  1462. ! SOA: (NUS + AIS + ACS + COS + AII)
  1463. mixf(region)%f2d(sconcsoa)%field(i,j) = mixf(region)%f2d(sconcsoa)%field(i,j) + dtime * &
  1464. dens * (rm(i,j,k,iSOAnus) + rm(i,j,k,iSOAais) + rm(i,j,k,iSOAacs) + rm(i,j,k,iSOAcos) + rm(i,j,k,iSOAaii))
  1465. ! BC: (AIS + ACS + COS + AII)
  1466. mixf(region)%f2d(sconcbc)%field(i,j) = mixf(region)%f2d(sconcbc)%field(i,j) + dtime * &
  1467. dens * (rm(i,j,k,iBCais) + rm(i,j,k,iBCacs) + rm(i,j,k,iBCcos) + rm(i,j,k,iBCaii))
  1468. ! SO4: (NUS + AIS + ACS + COS)
  1469. mixf(region)%f2d(sconcso4)%field(i,j) = mixf(region)%f2d(sconcso4)%field(i,j) + dtime * &
  1470. dens * (rm(i,j,k,iSO4nus) + rm(i,j,k,iSO4ais) + rm(i,j,k,iSO4acs) + rm(i,j,k,iSO4cos))
  1471. ! Dust:
  1472. mixf(region)%f2d(sconcdust)%field(i,j) = mixf(region)%f2d(sconcdust)%field(i,j) + dtime * &
  1473. dens * (rm(i,j,k,iDUacs) + rm(i,j,k,iDUcos) + rm(i,j,k,iDUaci) + rm(i,j,k,iDUcoi))
  1474. ! Seasalt:
  1475. mixf(region)%f2d(sconcss)%field(i,j) = mixf(region)%f2d(sconcss)%field(i,j) + dtime * &
  1476. dens * (rm(i,j,k,iSSacs) + rm(i,j,k,iSScos))
  1477. ! NO3:
  1478. mixf(region)%f2d(sconcno3)%field(i,j) = mixf(region)%f2d(sconcno3)%field(i,j) + dtime * &
  1479. dens * rm(i,j,k,iNO3_a)
  1480. ! NH4:
  1481. mixf(region)%f2d(sconcnh4)%field(i,j) = mixf(region)%f2d(sconcnh4)%field(i,j) + dtime * &
  1482. dens * rm(i,j,k,iNH4)
  1483. ! MSA:
  1484. mixf(region)%f2d(sconcmsa)%field(i,j) = mixf(region)%f2d(sconcmsa)%field(i,j) + dtime * &
  1485. dens * rm(i,j,k,iMSA)
  1486. ! Mass concentrations
  1487. do nn=68,90
  1488. mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) + dtime * &
  1489. dens * rm(i,j,k,mixf(region)%f2d(nn)%mf%itm5)
  1490. end do
  1491. !number concentrations
  1492. do nn=91,97
  1493. mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) + dtime * &
  1494. dens * rm(i,j,k,mixf(region)%f2d(nn)%mf%itm5)
  1495. end do
  1496. !h2o
  1497. h2ocounter=0
  1498. do nn=98,101
  1499. h2ocounter=h2ocounter+1
  1500. mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) + dtime * &
  1501. dens * h2o_mode(region,h2ocounter)%d3(i,j,k)!rm(i,j,k,mixf(region)%f2d(nn)%mf%itm5)
  1502. end do
  1503. ! RWET for all modes (RDRY=RWET for non-soluble)
  1504. !
  1505. irw=0
  1506. do nn=102,108
  1507. !
  1508. irw=irw+1
  1509. mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) +dtime *rw_mode(region,irw)%d3(i,j,k)
  1510. end do
  1511. ! RDRY for soluble modes
  1512. irwd=0
  1513. do nn=109,112
  1514. irwd=irwd+1
  1515. mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) +dtime *rwd_mode(region,irwd)%d3(i,j,k)
  1516. end do
  1517. ! ----------------------
  1518. ! Load in [kg m-2]
  1519. ! ----------------------
  1520. do k = 1, lmr
  1521. !do ll=1,len(load)
  1522. ! POM: (AIS + ACS + COS + AII)
  1523. load_tmp=0.0
  1524. do nn=1,7
  1525. if (mode_end_pom(nn)>0) then
  1526. load_tmp = load_tmp+ rm(i,j,k,mode_end_pom(nn))
  1527. !(rm(i,j,k,iPOMnus) + rm(i,j,k,iPOMais) + rm(i,j,k,iPOMacs) + rm(i,j,k,iPOMcos) + rm(i,j,k,iPOMaii))
  1528. end if
  1529. end do
  1530. mixf(region)%f2d(loadoa)%field(i,j) = mixf(region)%f2d(loadoa)%field(i,j) + load_tmp * dtime / dxyp(j)
  1531. ! SOA: (NUS + AIS + ACS + COS + AII)
  1532. load_tmp=0.0
  1533. do nn=1,7
  1534. if (mode_end_soa(nn)>0) then
  1535. load_tmp = load_tmp+ rm(i,j,k,mode_end_soa(nn))
  1536. ENDIF
  1537. end do
  1538. mixf(region)%f2d(loadsoa)%field(i,j) = mixf(region)%f2d(loadsoa)%field(i,j) + load_tmp * dtime / dxyp(j)
  1539. ! BC: (AIS + ACS + COS + AII)
  1540. load_tmp=0.0
  1541. do nn=1,7
  1542. if (mode_end_bc(nn)>0) then
  1543. load_tmp = load_tmp+ rm(i,j,k,mode_end_bc(nn))
  1544. !load_tmp = (rm(i,j,k,iBCais) + rm(i,j,k,iBCacs) + rm(i,j,k,iBCcos) + rm(i,j,k,iBCaii))
  1545. end if
  1546. end do
  1547. mixf(region)%f2d(loadbc)%field(i,j) = mixf(region)%f2d(loadbc)%field(i,j) + load_tmp * dtime / dxyp(j)
  1548. ! SO4: (NUS + AIS + ACS + COS)
  1549. load_tmp=0.0
  1550. do nn=1,7
  1551. if (mode_end_so4(nn)>0) then
  1552. load_tmp = load_tmp+ rm(i,j,k,mode_end_so4(nn))
  1553. !load_tmp = (rm(i,j,k,iSO4nus) + rm(i,j,k,iSO4ais) + rm(i,j,k,iSO4acs) + rm(i,j,k,iSO4cos))
  1554. end if
  1555. end do
  1556. mixf(region)%f2d(loadso4)%field(i,j) = mixf(region)%f2d(loadso4)%field(i,j) + load_tmp * dtime / dxyp(j)
  1557. ! Dust: (ACS + COS + ACI + COI)
  1558. load_tmp=0.0
  1559. do nn=1,7
  1560. if (mode_end_dust(nn)>0) then
  1561. load_tmp = load_tmp+ rm(i,j,k,mode_end_dust(nn))
  1562. !load_tmp = (rm(i,j,k,iDUacs) + rm(i,j,k,iDUcos) + rm(i,j,k,iDUaci) + rm(i,j,k,iDUcoi))
  1563. end if
  1564. end do
  1565. mixf(region)%f2d(loaddust)%field(i,j) = mixf(region)%f2d(loaddust)%field(i,j) + load_tmp * dtime / dxyp(j)
  1566. ! Seasalt: (ACS + COS)
  1567. load_tmp=0.0
  1568. do nn=1,7
  1569. if (mode_end_ss(nn)>0) then
  1570. load_tmp = load_tmp+ rm(i,j,k,mode_end_ss(nn))
  1571. !load_tmp = (rm(i,j,k,iSSacs) + rm(i,j,k,iSScos))
  1572. end if
  1573. end do
  1574. mixf(region)%f2d(loadss)%field(i,j) = mixf(region)%f2d(loadss)%field(i,j) + load_tmp * dtime / dxyp(j)
  1575. !!$
  1576. ! NO3:
  1577. load_tmp = rm(i,j,k,iNO3_a)
  1578. mixf(region)%f2d(loadno3)%field(i,j) = mixf(region)%f2d(loadno3)%field(i,j) + load_tmp * dtime / dxyp(j)
  1579. !!$
  1580. end do ! k
  1581. end do ! i
  1582. end do ! j
  1583. !!$
  1584. call GO_Timer_Start( itim_opt_out, status )
  1585. IF_NOTOK_RETURN(status=1)
  1586. ! ---------------------
  1587. ! DO OPTICS IN PARALLEL
  1588. ! ---------------------
  1589. ! steps needed for that:
  1590. ! 1) according to the parallelisation there is different container sizes for
  1591. ! the results of the optics; these have to be allocated correctly
  1592. ! (aop_output_ext/a/g/add)
  1593. ! 2) the optics code is called (init/calculate_aop/done), see documentation
  1594. ! in the optics module
  1595. ! 3) the distributed fields (levels/tracers) are reshaped to global fields
  1596. ! (opt_ext/a/g/add), according to parallelisation
  1597. ! 4) fields are communicated such that the result contains the right
  1598. ! total extinctions, albedos, asymmetry factors etc.
  1599. ! 5) post-calculations (AOD etc.) are done and results are written
  1600. ! to mixf%../statf% containers as well as to the AOD dump files
  1601. ! 6) done...
  1602. ! ------------ REMARKS
  1603. ! IMPOSSIBLE / TOO EXPENSIVE (from the GENERAL list of parameters for QUICKLOOK)
  1604. ! - gf @ 90% RH
  1605. ! - "AOD@550nm SOA", "AOD@550nm BB"
  1606. ! ---------------------------------
  1607. ! fill current M7 state into an appropriate container
  1608. ! and allocate output fields (ext,a,g)
  1609. ! ---------------------------------
  1610. ! ----- A T T E N T I O N ---------
  1611. ! in case for a 'split', we need a field big enough to contain
  1612. ! various contributions
  1613. ! (to be synchronously changed with optics_aop_calculate!!)
  1614. ! ncontr is here number of contributors
  1615. ! Total, SO4, BC, OC, SS, DU, NO3, Water, Fine, Fine Dust, Fine SS
  1616. !ncontr = 10
  1617. !ncontr = 11
  1618. ncontr = 12
  1619. ! Additional fields for surface dry aerosol
  1620. ! to be used for validation against in-situ data:
  1621. ! extinction, absorption, asymmetry factor
  1622. ! fine-mode contribution to extinction, absorption
  1623. nadd = 5
  1624. lvec = imr*jmr*lmr
  1625. ! allocate output fields for optics_calculate_aop
  1626. Allocate( aop_output_ext(lvec, size(wdep_out), ncontr ) ) ! extinction
  1627. Allocate( aop_output_a (lvec, size(wdep_out) ) ) ! single scattering albedo
  1628. Allocate( aop_output_g (lvec, size(wdep_out) ) ) ! asymmetry factor
  1629. Allocate( aop_output_add(lvec, size(wdep_out), nadd ) ) ! extinction/absorption due to dry aerosol at surface
  1630. call optics_aop_get(lvec, region, size(wdep_out), wdep_out, ncontr, .false., &
  1631. aop_output_ext, aop_output_a, aop_output_g, status, aop_output_add )
  1632. IF_NOTOK_RETURN(status=1)
  1633. ! allocate here result arrays for ext, abs, ssa, asymmetry parameter, additional parameters (PM10)
  1634. ! ncontr is number of contributors for 'split'
  1635. allocate( opt_ext( i1:i2, j1:j2, lmr, size(wdep_out), ncontr ) ) ; opt_ext = 0.0
  1636. allocate( opt_a ( i1:i2, j1:j2, lmr, size(wdep_out) ) ) ; opt_a = 0.0
  1637. allocate( opt_g ( i1:i2, j1:j2, lmr, size(wdep_out) ) ) ; opt_g = 0.0
  1638. allocate( opt_add( i1:i2, j1:j2, lmr, size(wdep_out), nadd ) ) ; opt_add = 0.0
  1639. ! ---------------------------------
  1640. ! unpack results from calculate_aop
  1641. ! ---------------------------------
  1642. do lwl = 1, size(wdep_out)
  1643. if( wdep_out(lwl)%split ) then
  1644. ! fill the array for the extinction coefficients of contributors
  1645. do lct = 1, ncontr
  1646. opt_ext(:,:,:,lwl,lct) = reshape( aop_output_ext(:,lwl,lct), (/imr,jmr,lmr/) )
  1647. end do
  1648. else
  1649. ! fill only total extinction coefficients
  1650. opt_ext(:,:,:,lwl,1) = reshape( aop_output_ext(:,lwl,1), (/imr,jmr,lmr/) )
  1651. endif
  1652. opt_a(:,:,:,lwl) = reshape( aop_output_a(:,lwl),(/imr,jmr,lmr/) )
  1653. opt_g(:,:,:,lwl) = reshape( aop_output_g(:,lwl),(/imr,jmr,lmr/) )
  1654. if ( wdep_out(lwl)%insitu ) then
  1655. ! additional fields for split
  1656. do lct = 1, nadd
  1657. opt_add(i1:i2,j1:j2,:,lwl,lct) = reshape( aop_output_add(:,lwl,lct),(/imr,jmr,lmr/) )
  1658. end do
  1659. endif
  1660. end do ! lwl
  1661. ! free temporary arrays for results from calculate_aop
  1662. deallocate( aop_output_ext )
  1663. deallocate( aop_output_a )
  1664. deallocate( aop_output_g )
  1665. deallocate( aop_output_add )
  1666. ! the following sections assume that for 550nm there is splitted information
  1667. ! available and that there is *NO* split for other wavelengths!
  1668. if( count( (wdep_out(:)%wl == 0.550) .and. wdep_out(:)%split ) /= 1 ) then
  1669. write(gol,*) 'user_output_general: wrong setup with splitted AOD information.'; call goErr
  1670. TRACEBACK
  1671. status=1; return
  1672. end if
  1673. ! -------------------------------------
  1674. ! here additional calculations and
  1675. ! file writing begin
  1676. ! -------------------------------------
  1677. ! cycle over wavelengths
  1678. do lwl = 1, size(wdep_out)
  1679. if( wdep_out(lwl)%split ) then
  1680. ! for 550nm:
  1681. ! 1) AODs (35 - 44)
  1682. ! fill for contributors (total, SO4, BC, POM, SS, DU, NO3, H2O, fine, fine dust, fine SS)
  1683. ! 2) Absorption for 550nm (45)
  1684. ! Extinction is here the sum of scattering and absorption and
  1685. ! the scattering part is given by the albedo (SSA). Thus the
  1686. ! remainder is absorption: Abs = Ext * (1 - SSA)
  1687. indoffset = od550aer
  1688. allocate(temp2d(i1:i2,j1:j2))
  1689. do lct = 1, ncontr
  1690. temp2d = 0.0
  1691. do j = j1, j2
  1692. do i = i1, i2
  1693. ! multiply with height elements and sum up
  1694. tabs = 0.0
  1695. do l = 1, lmr
  1696. temp2d(i,j) = temp2d(i,j) + opt_ext(i,j,l,lwl,lct) * &
  1697. (gph_dat(region)%data(i,j,l+1) - &
  1698. gph_dat(region)%data(i,j,l ))
  1699. if( lct == 1 ) then
  1700. ! Absorption: do this only once for the totals
  1701. tabs = tabs + opt_ext(i,j,l,lwl,lct) * (1.0 - opt_a(i,j,l,lwl)) * &
  1702. (gph_dat(region)%data(i,j,l+1) - gph_dat(region)%data(i,j,l))
  1703. end if
  1704. end do
  1705. ! Absorption: do this only once for the totals
  1706. if( lct == 1 ) then
  1707. mixf(region)%f2d(abs550aer)%field(i,j) = &
  1708. mixf(region)%f2d(abs550aer)%field(i,j) + tabs * dtime
  1709. end if
  1710. end do
  1711. end do
  1712. ! this here is AODs for different contributors, splitted by volumes
  1713. mixf(region)%f2d(indoffset+lct-1)%field = &
  1714. mixf(region)%f2d(indoffset+lct-1)%field + temp2d * dtime
  1715. end do
  1716. deallocate( temp2d )
  1717. ! Asymmetry Parameter, weighted by AOD and single scattering albedo at each layer
  1718. allocate(temp2d(i1:i2,j1:j2)) ; temp2d = 0.0
  1719. do j = j1, j2
  1720. do i = i1, i2
  1721. wght = 0.0
  1722. do l = 1, lmr
  1723. dwght = opt_ext(i,j,l,lwl,1) * (gph_dat(region)%data(i,j,l+1) - gph_dat(region)%data(i,j,l )) * opt_a(i,j,l,lwl)
  1724. temp2d(i,j) = temp2d(i,j) + opt_g(i,j,l,lwl) * dwght
  1725. wght = wght + dwght
  1726. end do
  1727. temp2d(i,j) = temp2d(i,j) / wght
  1728. end do
  1729. end do
  1730. mixf(region)%f2d(asyaer)%field = mixf(region)%f2d(asyaer)%field + temp2d * dtime
  1731. deallocate(temp2d)
  1732. ! Surface Ambient Aerosol Extinction
  1733. mixf(region)%f2d(ec550aer)%field = &
  1734. mixf(region)%f2d(ec550aer)%field + opt_ext(:,:,1,lwl,1) * dtime
  1735. else
  1736. ! for 440/870/350 nm:
  1737. ! 1) fill total AOD and AAOD and write to containers
  1738. ! 2) dump AOD fields
  1739. if ( wdep_out(lwl)%wl == 0.440 ) then
  1740. indoffset = od440aer
  1741. indabs = abs440aer
  1742. elseif ( wdep_out(lwl)%wl == 0.550 ) then
  1743. indoffset = od550aer
  1744. indabs = abs550aer
  1745. elseif ( wdep_out(lwl)%wl == 0.870 ) then
  1746. indoffset = od870aer
  1747. indabs = abs870aer
  1748. elseif ( wdep_out(lwl)%wl == 0.350 ) then
  1749. indoffset = od350aer
  1750. indabs = abs350aer
  1751. else
  1752. write(gol,*) 'user_output_general: wrong wavelength given for general diagnostics' ; call goErr
  1753. TRACEBACK
  1754. status=1; return
  1755. end if
  1756. ! fill AODs
  1757. allocate(temp2d(i1:i2,j1:j2))
  1758. temp2d = 0.0
  1759. do j = j1, j2
  1760. do i = i1, i2
  1761. ! multiply with height elements and sum up
  1762. tabs = 0.0
  1763. do l = 1, lmr
  1764. temp2d(i,j) = temp2d(i,j) + opt_ext(i,j,l,lwl,1) * &
  1765. (gph_dat(region)%data(i,j,l+1) - &
  1766. gph_dat(region)%data(i,j,l ))
  1767. tabs = tabs + opt_ext(i,j,l,lwl,1) * (1.0 - opt_a(i,j,l,lwl)) * &
  1768. (gph_dat(region)%data(i,j,l+1) - gph_dat(region)%data(i,j,l))
  1769. end do
  1770. mixf(region)%f2d(indabs)%field(i,j) = &
  1771. mixf(region)%f2d(indabs)%field(i,j) + tabs * dtime
  1772. end do
  1773. end do
  1774. ! write to container
  1775. mixf(region)%f2d(indoffset)%field = &
  1776. mixf(region)%f2d(indoffset)%field + temp2d * dtime
  1777. deallocate(temp2d)
  1778. endif
  1779. ! 3-D extinction and absorption (m-1)
  1780. if ( aai_output ) then
  1781. if ( wdep_out(lwl)%wl == 0.550 .or. wdep_out(lwl)%wl == 0.350 ) then
  1782. if ( wdep_out(lwl)%wl == 0.550 ) then
  1783. indoffset = ec5503Daer
  1784. elseif ( wdep_out(lwl)%wl == 0.350 ) then
  1785. indoffset = ec3503Daer
  1786. endif
  1787. mixf(region)%f3d(indoffset)%field = &
  1788. mixf(region)%f3d(indoffset)%field + opt_ext(:,:,:,lwl,1) * dtime
  1789. mixf(region)%f3d(indoffset+1)%field = &
  1790. mixf(region)%f3d(indoffset+1)%field + opt_ext(:,:,:,lwl,1) * (1.0 - opt_a(:,:,:,lwl)) * dtime
  1791. endif
  1792. endif
  1793. end do
  1794. ! done
  1795. deallocate( opt_ext, opt_a, opt_g, opt_add )
  1796. nullify(rm)
  1797. nullify(dxyp)
  1798. deallocate( pres3d )
  1799. deallocate( CCN )
  1800. call GO_Timer_End( itim_opt_out, status )
  1801. IF_NOTOK_RETURN(status=1)
  1802. call goLabel() ; status = 0
  1803. end subroutine output_general_step
  1804. !EOC
  1805. !--------------------------------------------------------------------------
  1806. ! TM5 !
  1807. !--------------------------------------------------------------------------
  1808. !BOP
  1809. !
  1810. ! !IROUTINE: COLLECT_BUDGETS
  1811. !
  1812. ! !DESCRIPTION: This routine does book keeping of the budget values in
  1813. ! order to extract daily contributions to
  1814. ! emissions / dry deposition / wet deposition.
  1815. !\\
  1816. !\\
  1817. ! !INTERFACE:
  1818. !
  1819. subroutine collect_budgets(region, status)
  1820. !
  1821. ! !USES:
  1822. !
  1823. #ifndef without_chemistry
  1824. use ebischeme, only : buddry_dat => buddep_dat
  1825. #endif
  1826. use wet_deposition, only : buddep_dat
  1827. use emission_data, only : budemi_dat
  1828. use budget_global, only : nbud_vg
  1829. use global_data, only : region_dat
  1830. use chem_param, only : iducoi, iduacs, iducos, iduaci, isscos, issacs
  1831. use chem_param, only : ibccos, ibcaii, ibcacs, ibcais, ino3_a, xmair
  1832. use chem_param, only : iso4nus, iso4acs, iso4cos, iso4ais
  1833. use chem_param, only : ipomcos, ipomaii, ipomacs, ipomais
  1834. use chem_param, only : isoacos, isoaaii, isoaacs, isoaais, isoanus
  1835. use chem_param, only : idms, iso2, ntracet, ntrace,iterp,iisop
  1836. use chem_param, only : xmso2, xmso4, xmdms, xmpom, xmbc, xmdust, xmnacl,xmterp,xmisop
  1837. #ifndef without_sedimentation
  1838. use sedimentation, only : buddep_m7_dat
  1839. use sedimentation, only : nsed, ised
  1840. #endif
  1841. !
  1842. ! !INPUT PARAMETERS:
  1843. !
  1844. integer, intent(in) :: region
  1845. !
  1846. ! !OUTPUT PARAMETERS:
  1847. !
  1848. integer, intent(out) :: status
  1849. !
  1850. ! !REVISION HISTORY:
  1851. ! 29 Nov 2010 - Achim Strunk -
  1852. !
  1853. ! !REMARKS:
  1854. !
  1855. !EOP
  1856. !------------------------------------------------------------------------
  1857. !BOC
  1858. character(len=*), parameter :: rname = mname//'/collect_budgets'
  1859. real, dimension(:,:,:,:), allocatable :: collect4d
  1860. real, dimension(:,:,:), allocatable :: collect3d
  1861. real, dimension(:,:), allocatable :: tmpbud2d
  1862. real, dimension(:), pointer :: dxyp
  1863. integer :: imr, jmr, lmr, j
  1864. integer :: i1, i2, j1, j2
  1865. integer :: l, n
  1866. ! --- begin -------------------------------
  1867. call goLabel(rname)
  1868. ! grid size
  1869. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  1870. imr=i2-i1+1
  1871. jmr=j2-j1+1
  1872. lmr = levi%nlev
  1873. ! this is area element
  1874. dxyp => region_dat(region)%dxyp
  1875. ! --------------
  1876. ! EMISSIONS
  1877. ! --------------
  1878. ! collect emission budget
  1879. allocate( collect4d(i1:i2,j1:j2,nbud_vg,ntracet) ); collect4d = 0.0
  1880. ! emissions are in [mole]
  1881. ! convert first to kilomole per area [k-mole/m2]
  1882. #ifndef without_emission
  1883. do j = j1, j2
  1884. collect4d(:,j,:,:) = budemi_dat(region)%emi(i1:i2,j,:,:) / dxyp(j) * 1.E-03
  1885. end do
  1886. #endif
  1887. allocate( tmpbud2d(i1:i2,j1:j2) )
  1888. ! on the way: convert from kilomole/m2 to kg/m2 via molar mass [g/mole]
  1889. ! POM (AIS + ACS + COS + AII)
  1890. tmpbud2d = ( sum(collect4d(:,:,:,iPOMais),3) + sum(collect4d(:,:,:,iPOMacs),3) + &
  1891. sum(collect4d(:,:,:,iPOMcos),3) + sum(collect4d(:,:,:,iPOMaii),3) ) * xmpom
  1892. mixf(region)%f2d(emioa)%field = tmpbud2d - emission(region)%f2dslast(:,:,1)
  1893. emission(region)%f2dslast(:,:,1) = tmpbud2d
  1894. ! SOA (NUS + AIS + ACS + COS + AII)
  1895. tmpbud2d = ( sum(collect4d(:,:,:,iSOAnus),3) + sum(collect4d(:,:,:,iSOAais),3) + sum(collect4d(:,:,:,iSOAacs),3) + &
  1896. sum(collect4d(:,:,:,iSOAcos),3) + sum(collect4d(:,:,:,iSOAaii),3) ) * xmpom
  1897. mixf(region)%f2d(emisoa)%field = tmpbud2d - emission(region)%f2dslast(:,:,1)
  1898. emission(region)%f2dslast(:,:,10) = tmpbud2d
  1899. ! BC (AIS + ACS + COS + AII)
  1900. tmpbud2d = ( sum(collect4d(:,:,:,iBCais ),3) + sum(collect4d(:,:,:,iBCacs ),3) + &
  1901. sum(collect4d(:,:,:,iBCcos ),3) + sum(collect4d(:,:,:,iBCaii ),3) ) * xmbc
  1902. mixf(region)%f2d(emibc)%field = tmpbud2d - emission(region)%f2dslast(:,:,2)
  1903. emission(region)%f2dslast(:,:,2) = tmpbud2d
  1904. ! SO2
  1905. tmpbud2d = sum(collect4d(:,:,:,iSO2 ),3) * xmso2
  1906. mixf(region)%f2d(emiso2)%field = tmpbud2d - emission(region)%f2dslast(:,:,3)
  1907. emission(region)%f2dslast(:,:,3) = tmpbud2d
  1908. ! SO4 (NUS + AIS + ACS + COS)
  1909. tmpbud2d = ( sum(collect4d(:,:,:,iSO4nus),3) + sum(collect4d(:,:,:,iSO4ais),3) + &
  1910. sum(collect4d(:,:,:,iSO4acs),3) + sum(collect4d(:,:,:,iSO4cos),3) ) * xmso4
  1911. mixf(region)%f2d(emiso4)%field = tmpbud2d - emission(region)%f2dslast(:,:,4)
  1912. emission(region)%f2dslast(:,:,4) = tmpbud2d
  1913. ! Dust (ACS + COS + ACI + COI)
  1914. tmpbud2d = ( sum(collect4d(:,:,:,iDUacs ),3) + sum(collect4d(:,:,:,iDUcos ),3) + &
  1915. sum(collect4d(:,:,:,iDUaci ),3) + sum(collect4d(:,:,:,iDUcoi ),3) ) * xmdust
  1916. mixf(region)%f2d(emidust)%field = tmpbud2d - emission(region)%f2dslast(:,:,5)
  1917. emission(region)%f2dslast(:,:,5) = tmpbud2d
  1918. ! DMS
  1919. tmpbud2d = sum(collect4d(:,:,:,iDMS ),3) * xmdms
  1920. mixf(region)%f2d(emidms)%field = tmpbud2d - emission(region)%f2dslast(:,:,6)
  1921. emission(region)%f2dslast(:,:,6) = tmpbud2d
  1922. ! Seasalt: (ACS + COS)
  1923. tmpbud2d = ( sum(collect4d(:,:,:,iSSacs ),3) + sum(collect4d(:,:,:,iSScos ),3) ) * xmnacl
  1924. mixf(region)%f2d(emiss)%field = tmpbud2d - emission(region)%f2dslast(:,:,7)
  1925. emission(region)%f2dslast(:,:,7) = tmpbud2d
  1926. ! terpene:
  1927. tmpbud2d = sum(collect4d(:,:,:,iterp ),3) * xmterp
  1928. mixf(region)%f2d(emiterp)%field = tmpbud2d - emission(region)%f2dslast(:,:,8)
  1929. emission(region)%f2dslast(:,:,8) = tmpbud2d
  1930. ! isoprene:
  1931. tmpbud2d = sum(collect4d(:,:,:,iisop ),3) * xmisop
  1932. mixf(region)%f2d(emiisop)%field = tmpbud2d - emission(region)%f2dslast(:,:,9)
  1933. emission(region)%f2dslast(:,:,9) = tmpbud2d
  1934. deallocate( tmpbud2d )
  1935. deallocate( collect4d )
  1936. ! --------------
  1937. ! DRY DEPOSITION
  1938. ! --------------
  1939. allocate( collect3d(i1:i2,j1:j2,ntrace) ); collect3d = 0.0
  1940. ! deposition is in [mole]
  1941. ! convert first to kilomole per area [k-mole/m2]
  1942. do j = j1, j2
  1943. #ifndef without_chemistry
  1944. collect3d(:,j,:) = buddry_dat(region)%dry(i1:i2,j,:) / dxyp(j) * 1.E-3
  1945. #endif
  1946. ! Add sedimentation at the surface to dry depostion
  1947. ! Sedimentation budgets have to be summed in the vertical
  1948. ! to get the surface contribution.
  1949. #ifndef without_sedimentation
  1950. do l = 1, nbud_vg
  1951. do n = 1, nsed
  1952. collect3d(:,j,ised(n)) = collect3d(:,j,ised(n)) + &
  1953. buddep_m7_dat(region)%sed(i1:i2,j,l,n) / dxyp(j) * 1.E-3
  1954. end do
  1955. end do
  1956. #endif
  1957. end do
  1958. allocate( tmpbud2d(i1:i2,j1:j2) )
  1959. ! on the way: convert from kilomole/m2 to kg/m2 via molar mass [g/mole]
  1960. ! SO2
  1961. tmpbud2d = collect3d(:,:,iSO2) * xmso2
  1962. mixf(region)%f2d(dryso2)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,1)
  1963. drydepos(region)%f2dslast(:,:,1) = tmpbud2d
  1964. ! POM (AIS + ACS + COS + AII)
  1965. tmpbud2d = ( collect3d(:,:,iPOMais ) + collect3d(:,:,iPOMacs ) + &
  1966. collect3d(:,:,iPOMcos ) + collect3d(:,:,iPOMaii )) * xmpom
  1967. mixf(region)%f2d(dryoa)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,2)
  1968. drydepos(region)%f2dslast(:,:,2) = tmpbud2d
  1969. ! SOA (NUS + AIS + ACS + COS + AII)
  1970. tmpbud2d = ( collect3d(:,:,iSOAais ) + collect3d(:,:,iSOAacs ) + &
  1971. collect3d(:,:,iSOAcos ) + collect3d(:,:,iSOAaii ) + &
  1972. collect3d(:,:,iSOAnus )) * xmpom
  1973. mixf(region)%f2d(drysoa)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,8)
  1974. drydepos(region)%f2dslast(:,:,8) = tmpbud2d
  1975. ! BC (AIS + ACS + COS + AII)
  1976. tmpbud2d = ( collect3d(:,:,iBCais ) + collect3d(:,:,iBCacs ) + &
  1977. collect3d(:,:,iBCcos ) + collect3d(:,:,iBCaii ) ) * xmbc
  1978. mixf(region)%f2d(drybc)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,3)
  1979. drydepos(region)%f2dslast(:,:,3) = tmpbud2d
  1980. ! SO4 (NUS + AIS + ACS + COS)
  1981. tmpbud2d = ( collect3d(:,:,iSO4nus) + collect3d(:,:,iSO4ais) + &
  1982. collect3d(:,:,iSO4acs) + collect3d(:,:,iSO4cos) ) * xmso4
  1983. mixf(region)%f2d(dryso4)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,4)
  1984. drydepos(region)%f2dslast(:,:,4) = tmpbud2d
  1985. ! Dust (ACS + COS + ACI + COI)
  1986. tmpbud2d = ( collect3d(:,:,iDUacs) + collect3d(:,:,iDUcos) + &
  1987. collect3d(:,:,iDUaci) + collect3d(:,:,iDUcoi) ) * xmdust
  1988. mixf(region)%f2d(drydust)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,5)
  1989. drydepos(region)%f2dslast(:,:,5) = tmpbud2d
  1990. ! DMS
  1991. ! DMS is NOT deposited in TM5 --> the fields will contain zeros
  1992. tmpbud2d = collect3d(:,:,iDMS) * xmdms
  1993. mixf(region)%f2d(drydms)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,6)
  1994. drydepos(region)%f2dslast(:,:,6) = tmpbud2d
  1995. ! Seasalt: (ACS + COS)
  1996. tmpbud2d = ( collect3d(:,:,iSSacs) + collect3d(:,:,iSScos) ) * xmnacl
  1997. mixf(region)%f2d(dryss)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,7)
  1998. drydepos(region)%f2dslast(:,:,7) = tmpbud2d
  1999. deallocate( tmpbud2d )
  2000. deallocate( collect3d )
  2001. ! --------------
  2002. ! WET DEPOSITION
  2003. ! --------------
  2004. allocate( collect4d (i1:i2,j1:j2,nbud_vg,ntracet) ); collect4d = 0.0
  2005. ! deposition is in [mole]
  2006. ! convert first to kilomole per area [k-mole/m2]
  2007. do j = j1, j2
  2008. collect4d(:,j,:,:) = ( buddep_dat(region)%lsp(i1:i2,j,:,:) + buddep_dat(region)%cp(i1:i2,j,:,:) ) / dxyp(j) * 1.E-3
  2009. end do
  2010. allocate( tmpbud2d(i1:i2,j1:j2) )
  2011. ! on the way: convert from kilomole/m2 to kg/m2 via molar mass [g/mole]
  2012. ! POM (AIS + ACS + COS + AII)
  2013. tmpbud2d = ( sum(collect4d(:,:,:,iPOMais),3) + sum(collect4d(:,:,:,iPOMacs),3) + &
  2014. sum(collect4d(:,:,:,iPOMcos),3) + sum(collect4d(:,:,:,iPOMaii),3)) * xmpom
  2015. mixf(region)%f2d(wetoa)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,1)
  2016. wetdepos(region)%f2dslast(:,:,1) = tmpbud2d
  2017. ! SOA (NUS + AIS + ACS + COS + AII)
  2018. tmpbud2d = ( sum(collect4d(:,:,:,iSOAais),3) + sum(collect4d(:,:,:,iSOAacs),3) + &
  2019. sum(collect4d(:,:,:,iSOAcos),3) + sum(collect4d(:,:,:,iSOAaii),3) + &
  2020. sum(collect4d(:,:,:,iSOAnus),3)) * xmpom
  2021. mixf(region)%f2d(wetsoa)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,8)
  2022. wetdepos(region)%f2dslast(:,:,8) = tmpbud2d
  2023. ! BC (AIS + ACS + COS + AII)
  2024. tmpbud2d = ( sum(collect4d(:,:,:,iBCais ),3) + sum(collect4d(:,:,:,iBCacs ),3) + &
  2025. sum(collect4d(:,:,:,iBCcos ),3) + sum(collect4d(:,:,:,iBCaii ),3) ) * xmbc
  2026. mixf(region)%f2d(wetbc)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,2)
  2027. wetdepos(region)%f2dslast(:,:,2) = tmpbud2d
  2028. ! SO2
  2029. tmpbud2d = sum(collect4d(:,:,:,iSO2 ),3) * xmso2
  2030. mixf(region)%f2d(wetso2)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,3)
  2031. wetdepos(region)%f2dslast(:,:,3) = tmpbud2d
  2032. ! SO4 (NUS + AIS + ACS + COS)
  2033. tmpbud2d = ( sum(collect4d(:,:,:,iSO4nus),3) + sum(collect4d(:,:,:,iSO4ais),3) + &
  2034. sum(collect4d(:,:,:,iSO4acs),3) + sum(collect4d(:,:,:,iSO4cos),3) ) * xmso4
  2035. mixf(region)%f2d(wetso4)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,4)
  2036. wetdepos(region)%f2dslast(:,:,4) = tmpbud2d
  2037. ! Dust (ACS + COS + ACI + COI)
  2038. tmpbud2d = ( sum(collect4d(:,:,:,iDUacs ),3) + sum(collect4d(:,:,:,iDUcos ),3) + &
  2039. sum(collect4d(:,:,:,iDUaci ),3) + sum(collect4d(:,:,:,iDUcoi ),3) ) * xmdust
  2040. mixf(region)%f2d(wetdust)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,5)
  2041. wetdepos(region)%f2dslast(:,:,5) = tmpbud2d
  2042. ! DMS
  2043. ! DMS is NOT deposited in TM5 --> the fields will contain zeros
  2044. tmpbud2d = sum(collect4d(:,:,:,iDMS ),3) * xmdms
  2045. mixf(region)%f2d(wetdms)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,6)
  2046. wetdepos(region)%f2dslast(:,:,6) = tmpbud2d
  2047. ! Seasalt: (ACS + COS)
  2048. tmpbud2d = ( sum(collect4d(:,:,:,iSSacs ),3) + sum(collect4d(:,:,:,iSScos ),3) ) * xmnacl
  2049. mixf(region)%f2d(wetss)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,7)
  2050. wetdepos(region)%f2dslast(:,:,7) = tmpbud2d
  2051. deallocate( tmpbud2d )
  2052. deallocate( collect4d )
  2053. nullify(dxyp)
  2054. call goLabel() ; status = 0
  2055. end subroutine collect_budgets
  2056. !EOC
  2057. subroutine add_variable(region,itm5,varname,longname,unit,dims,n_out,status)
  2058. use chem_param, only: mode_end_so4,mode_end_pom,mode_end_bc,mode_end_ss,mode_end_dust
  2059. implicit none
  2060. integer:: itm5
  2061. integer:: fileunit
  2062. integer:: varid
  2063. character(len=*)::varname
  2064. character(len=*)::longname
  2065. character(len=*)::unit
  2066. integer:: dims
  2067. integer:: region
  2068. integer,intent(out)::n_out
  2069. integer,intent(out)::status
  2070. logical :: writeout=.true.
  2071. character(len=*), parameter :: rname = mname//'/output_aerchemmip_add_variable'
  2072. integer ::i1,i2,j1,j2,jmr,imr,lmr
  2073. call goLabel(rname)
  2074. !call GO_Timer_Start( itim_addvar, status )
  2075. !IF_NOTOK_RETURN(status=1)
  2076. !write(gol,'("add_variable1")')
  2077. !call goErr
  2078. if( (n_2d_vars+1>ntracer_2d) .or.(n_3d_vars+1>ntracer_3d) ) then
  2079. status=1
  2080. IF_ERROR_RETURN(status=1)
  2081. end if
  2082. call Get_DistGrid( dgrid(1), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  2083. ! define sizes for arrays
  2084. imr=i2-i1+1
  2085. jmr=j2-j1+1
  2086. lmr = levi%nlev
  2087. ! 2D variables
  2088. if (dims==2) then
  2089. !init variable
  2090. n_2d_vars=n_2d_vars+1
  2091. mixf(region)%f2d(n_2d_vars)%mf = metafields( itm5 , varname,longname,unit,'','')
  2092. mixf(region)%f2d(n_2d_vars)%writeout=writeout
  2093. !Later make the allocation here
  2094. !allocate( mixf(region)%f2d(n_2d_vars)%field(i1:i2,j1:j2) )
  2095. mixf(region)%f2d(n_2d_vars)%field(i1:i2,j1:j2)=0.0
  2096. n_out=n_2d_vars
  2097. else if (dims==3) then
  2098. !init variable
  2099. n_3d_vars=n_3d_vars+1
  2100. mixf(region)%f3d(n_3d_vars)%mf = metafields( itm5 , varname,longname,unit,'','')
  2101. mixf(region)%f3d(n_3d_vars)%writeout=writeout
  2102. !Later make the allocation here
  2103. !allocate( mixf(region)%f3d(n_3d_vars)%field(i1:i2,j1:j2,lmr) )
  2104. mixf(region)%f3d(n_3d_vars)%field(i1:i2,j1:j2,lmr)=0.0
  2105. n_out=n_3d_vars
  2106. end if
  2107. call goLabel()
  2108. status = 0
  2109. !call GO_Timer_End( itim_addvar, status )
  2110. !IF_NOTOK_RETURN(status=1)
  2111. end subroutine add_variable
  2112. subroutine CCN_Diag(CCN,mass_num,cmr,temper)
  2113. use chem_param, only : iso4ais, iso4acs, iso4cos, ibcais, ibcacs, ibccos, ipomais, ipomacs
  2114. use chem_param, only : ipomcos, issacs, isscos, iduacs, iducos, isoaais, isoaacs, isoacos
  2115. use chem_param, only : iais_n, iacs_n, icos_n, sigma_lognormal
  2116. use chem_param, only : ino3_a, imsa, nh4no3_factor, nh4no3_density, msa_density
  2117. use chem_param, only : SurfTen, mode_tracers
  2118. use chem_param, only : Kap_su, Kap_pom, Kap_soa, Kap_bc, Kap_du, Kap_ss, Kap_na2so4, Kap_no3, Kap_msa
  2119. use chem_param, only : so4_density, pom_density, soa_density, carbon_density, ss_density, dust_density
  2120. use mo_aero_m7, only : cmr2ram, nsol, ram2cmr
  2121. use mo_aero_m7, only : dNaCl, dH2SO4, dNa2SO4, wNaCl, wH2SO4, wNa2SO4, wSO4
  2122. use binas, only : pi, Rgas, xm_h2o, rol
  2123. implicit none
  2124. integer :: iSat, iMode
  2125. real :: CCN(:,:,:,:), mass_num(:,:,:,:), cmr(:,:,:,:), temper(:,:,:)
  2126. real, allocatable :: Vol(:,:,:), Kappa(:,:,:), A_Koehler(:,:,:)
  2127. real, allocatable :: N_act(:,:,:), rc(:,:,:)
  2128. real, allocatable :: nNa(:,:,:), nCl(:,:,:), nNaCl(:,:,:), nH2SO4(:,:,:), nNa2SO4(:,:,:), nSO4(:,:,:)
  2129. CCN(:,:,:,:) = 0.e0
  2130. cmr(:,:,:,:) = 0.e0
  2131. allocate(Vol(size(CCN,2),size(CCN,3),size(CCN,4)))
  2132. allocate(Kappa(size(CCN,2),size(CCN,3),size(CCN,4)))
  2133. allocate(A_Koehler(size(CCN,2),size(CCN,3),size(CCN,4)))
  2134. allocate(N_act(size(CCN,2),size(CCN,3),size(CCN,4)))
  2135. allocate(rc(size(CCN,2),size(CCN,3),size(CCN,4)))
  2136. allocate(nNa(size(CCN,2),size(CCN,3),size(CCN,4)))
  2137. allocate(nCl(size(CCN,2),size(CCN,3),size(CCN,4)))
  2138. allocate(nSO4(size(CCN,2),size(CCN,3),size(CCN,4)))
  2139. allocate(nNaCl(size(CCN,2),size(CCN,3),size(CCN,4)))
  2140. allocate(nNa2SO4(size(CCN,2),size(CCN,3),size(CCN,4)))
  2141. allocate(nH2SO4(size(CCN,2),size(CCN,3),size(CCN,4)))
  2142. do iMode = 2,nsol
  2143. ! Kappa
  2144. SELECT CASE (iMode)
  2145. CASE(2) ! no sea salt and dust in soluble aitken mode
  2146. nSO4= mass_num(:,:,:,iso4ais)/(1.e-3*wSO4)
  2147. nH2SO4 = nSO4
  2148. Vol = ( nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) & !mass_num(:,:,:,iso4ais)/so4_density &
  2149. + mass_num(:,:,:,ipomais)/pom_density &
  2150. + mass_num(:,:,:,isoaais)/soa_density &
  2151. + mass_num(:,:,:,ibcais)/carbon_density) ! m3/gridbox
  2152. Kappa= ( Kap_su*nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &!mass_num(:,:,:,iso4ais)/so4_density &
  2153. + Kap_pom*mass_num(:,:,:,ipomais)/pom_density &
  2154. + Kap_soa*mass_num(:,:,:,isoaais)/soa_density &
  2155. + Kap_bc*mass_num(:,:,:,ibcais)/carbon_density) / Vol
  2156. cmr(iMode,:,:,:) = ram2cmr(iMode)*(Vol/mass_num(:,:,:,iais_n)*0.75/pi)**(1./3.) ! m
  2157. CASE(3)
  2158. nNa = mass_num(:,:,:,issacs)/(1.e-3*wNaCl) ! mol/gridbox
  2159. nCl = nNa
  2160. nSO4= mass_num(:,:,:,iso4acs)/(1.e-3*wSO4)
  2161. nNa2SO4 = MIN(nNa/2.e0, nSO4)
  2162. nNa = nNa - 2.e0*nNa2SO4 ! remaining nNa
  2163. nNaCl = MIN(nCl, nNa)
  2164. nCl = nNaCl ! overshoot nCl is supposed to evaporate
  2165. nH2SO4 = nSO4 - nNa2SO4
  2166. Vol = ( nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
  2167. + nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
  2168. + nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
  2169. + mass_num(:,:,:,ipomacs)/pom_density &
  2170. + mass_num(:,:,:,isoaacs)/soa_density &
  2171. + mass_num(:,:,:,ibcacs)/carbon_density &
  2172. + mass_num(:,:,:,iduacs)/dust_density &
  2173. + mass_num(:,:,:,ino3_a)*nh4no3_factor/nh4no3_density &
  2174. + mass_num(:,:,:,imsa)/msa_density) ! m3/gridbox
  2175. Kappa= ( Kap_su*nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
  2176. + Kap_na2so4*nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
  2177. + Kap_pom*mass_num(:,:,:,ipomacs)/pom_density &
  2178. + Kap_soa*mass_num(:,:,:,isoaacs)/soa_density &
  2179. + Kap_bc*mass_num(:,:,:,ibcacs)/carbon_density &
  2180. + Kap_ss*nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
  2181. + Kap_du*mass_num(:,:,:,iduacs)/dust_density &
  2182. + Kap_no3*mass_num(:,:,:,ino3_a)*nh4no3_factor/nh4no3_density &
  2183. + Kap_msa*mass_num(:,:,:,imsa)/msa_density) / Vol
  2184. cmr(iMode,:,:,:) = ( Vol/mass_num(:,:,:,iacs_n)*0.75/pi)**(1./3.)*ram2cmr(iMode) ! m
  2185. CASE(4)
  2186. nNa = mass_num(:,:,:,isscos)/(1.e-3*wNaCl) ! mol/gridbox
  2187. nCl = nNa
  2188. nSO4= mass_num(:,:,:,iso4cos)/(1.e-3*wSO4)
  2189. nNa2SO4 = MIN(nNa/2.e0, nSO4)
  2190. nNa = nNa - 2.e0*nNa2SO4 ! remaining nNa
  2191. nNaCl = MIN(nCl, nNa)
  2192. nCl = nNaCl ! overshoot nCl is supposed to evaporate
  2193. nH2SO4 = nSO4 - nNa2SO4
  2194. Vol = ( nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
  2195. + nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
  2196. + nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
  2197. + mass_num(:,:,:,ipomcos)/pom_density &
  2198. + mass_num(:,:,:,isoacos)/soa_density &
  2199. + mass_num(:,:,:,ibccos)/carbon_density &
  2200. + mass_num(:,:,:,iducos)/dust_density) ! m3/gridbox
  2201. Kappa= ( Kap_su*nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
  2202. + Kap_na2so4*nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
  2203. + Kap_pom*mass_num(:,:,:,ipomcos)/pom_density &
  2204. + Kap_soa*mass_num(:,:,:,isoacos)/soa_density &
  2205. + Kap_bc*mass_num(:,:,:,ibccos)/carbon_density &
  2206. + Kap_ss*nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
  2207. + Kap_du*mass_num(:,:,:,iducos)/dust_density) / Vol
  2208. cmr(iMode,:,:,:) = ( Vol/mass_num(:,:,:,icos_n)*0.75/pi)**(1./3.)*ram2cmr(iMode) ! m
  2209. END SELECT
  2210. where(Kappa < 0.04) Kappa = 0.04
  2211. A_Koehler = 2.0 * xm_h2o * SurfTen / Rgas / rol / temper
  2212. do iSat=1,nSat
  2213. ! critical radius per mode
  2214. rc = A_Koehler/3.0 * (2.0/SuperSat(iSat)/sqrt(Kappa))**(2.0/3.0)
  2215. ! number of activated particles
  2216. N_act = mass_num(:,:,:,mode_tracers(0,iMode)) * 0.5*erfc( log(rc/cmr(iMode,:,:,:)) / &
  2217. sqrt(2.e0)/log(sigma_lognormal(iMode)) )
  2218. CCN(iSat,:,:,:) = CCN(iSat,:,:,:) + N_act ! #/gridbox
  2219. enddo
  2220. enddo
  2221. deallocate(Vol)
  2222. deallocate(Kappa)
  2223. deallocate(A_Koehler)
  2224. deallocate(rc)
  2225. deallocate(N_act)
  2226. end subroutine CCN_Diag
  2227. end module user_output_general