1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572 |
- #define TRACEBACK write (gol,'("in ",a," (",a,i6,")")') rname, __FILE__, __LINE__ ; call goErr
- #define IF_NOTOK_RETURN(action) if (status/=0) then; TRACEBACK; action; return; end if
- #define IF_ERROR_RETURN(action) if (status> 0) then; TRACEBACK; action; return; end if
- #define IF_NOTOK_MDF(action) if (status/=0) then; TRACEBACK; action; call MDF_CLose(fid,status); status=1; return; end if
- !
- #include "tm5.inc"
- !
- !-----------------------------------------------------------------------------
- ! TM5 !
- !-----------------------------------------------------------------------------
- !BOP
- !
- ! !MODULE: USER_OUTPUT_GENERAL
- !
- ! !DESCRIPTION:
- !
- ! This module provides objects and methods for the AEROCOM-2 related
- ! diagnostics package. It is strongly related to the setup of the
- ! optics module.
- ! A list of parameters are defined for which daily averages are output
- ! (so far), result is one file per day containing 50 2d-fields and
- ! 4 3d-fields.
- !
- ! Life cycle(s):
- ! 1) output_aerocom_init:
- ! - if( newsrun ): - allocation and initialisation of output container
- ! (mixf%..., drydepos/wetdepos/emission, wdep_out)
- ! - initialisation of optics module
- ! - lookuptable
- ! - wavelengths
- ! - open output file (for today), initialise it and write attributes
- ! 2) output_aerocom_step:
- ! - gather tracer
- ! - add current state of model to containers
- ! (weighted by time since last call, --> period of validity)
- ! - do fluxes, surface concentrations and loads
- ! - do optics
- ! - aerocom_aopio_init: initialise and fill input parameters
- ! - optics::optics_calculate_aop:
- ! calculate optical properties (per wavelength)
- ! (take into account additional splitting, facilitated in
- ! optics::optics_calculate_aop)
- ! - fill containers for optical properties
- ! - free optics input parameters
- ! - fill aerocom output containers
- ! 3) output_aerocom_write:
- ! - collect_budgets:
- ! - use current budget containers (budemi, buddep, buddry)
- ! - compare with saved values and infer by that the increment
- ! - add to temporary output containers (wetdepos,drydepos,emission)
- ! - write output containers to file
- ! - close file
- ! 4) output_aerocom_done:
- ! - free allocated containers
- ! (mixf%..., drydepos/wetdepos/emission, wdep_out)
- !
- !\\
- !\\
- ! !INTERFACE:
- !
- MODULE USER_OUTPUT_GENERAL
- !
- ! !USES:
- !
- use go, only : gol, goErr, goPr, goLabel
- use dims, only : nregions
- use optics, only : wavelendep
- use meteodata, only : global_lli, levi
- use MDF
- use TM5_DISTGRID, only : dgrid, Get_DistGrid, update_halo, update_halo_iband
- use mo_aero_m7 , only: ncomp,nmod,naermod
- implicit none
- private
- !
- ! !PUBLIC MEMBER FUNCTIONS:
- !
- public :: output_general_init
- public :: output_general_step
- public :: output_general_write
- public :: output_general_done
- public :: wdep_out
- ! Control variables
- character(len=20), public :: gen_exper ! general experiment name
- character(len=20), public :: gen_freq ! general output frequency
- logical,public :: all_chemistry=.false.
- logical, parameter :: aai_output=.false.
- !
- ! diagnostic CCN
- logical, public :: nCCNdiag = .false. ! diagnostic CCN under given supersaturations for comparison to CCNC measurements
- ! nCCNdiag = .false. no diagnostic CCN
- ! nCCNdiag = .true. with diagnostic CCN
- integer,public :: nSat = 0 ! Number of supersaturations for which number of CCN will be calculated
- real, public, allocatable :: SuperSat(:)
- ! !PRIVATE DATA MEMBERS:
- !
- character(len=*), parameter :: mname = 'user_output_general'
- ! Changed naming convections to
- character(len=20), parameter :: f_dataid='general', f_model='TM5'
- character(len=20), parameter :: f_dimmix='global', f_dimstat='stations'
- !
- ! !PRIVATE TYPES:
- !
- type metafields
- integer :: itm5
- character(len=20) :: vname
- character(len=64) :: lname
- character(len=10) :: unit
- character(len=10) :: positive
- character(len=130) :: standard_name
- end type metafields
- type metafields2
- integer :: itm5
- character(len=17) :: vname
- character(len=64) :: lname
- character(len=10) :: unit
- character(len=130) :: standard_name
- end type metafields2
- type field3d
- type( metafields ) :: mf
- real, dimension(:,:,:), pointer :: field
- integer :: varid
- logical :: writeout
- end type field3d
- type field2d
- type( metafields ) :: mf
- real, dimension(:,:), pointer :: field
- integer :: varid
- logical :: writeout
- end type field2d
- type field1d
- type( metafields2 ) :: mf
- real, dimension(:,:), pointer :: field
- integer :: varid
- end type field1d
- type field0d
- type( metafields2 ) :: mf
- real, dimension(:), pointer :: field
- integer :: varid
- end type field0d
- type mixfile
- type( field3d ), dimension(:), pointer :: f3d
- type( field2d ), dimension(:), pointer :: f2d
- character(len=200) :: fname
- integer :: acct ! accumulation time
- integer :: funit ! unit number
- integer :: nlon ! x dimension of requested field
- integer :: nlat ! y dimension of requested field
- integer :: nlev ! z dimension of requested field
- real,dimension(:),pointer :: lon ! x dimension of requested field
- real,dimension(:),pointer :: lat ! y dimension of requested field
- real,dimension(:),pointer :: lev ! z dimension of requested field
- integer :: lonid ! x dimension id in nc
- integer :: latid ! y dimension id in nc
- integer :: levid ! z dimension id in nc
- integer :: timeid ! time dimension id in nc
- integer :: time_varid
- end type mixfile
- type(mixfile), dimension(nregions), save :: mixf
-
- integer::lon_varid
- integer::lat_varid
- integer::lev_varid
- ! diagnostic CCN
- integer, allocatable :: ind_CCN(:)
- type budgetstore
- real, dimension(:,:,:), allocatable :: f2dslast
- integer :: lasttime
- end type budgetstore
- type(budgetstore), dimension(nregions), save :: drydepos, wetdepos, emission
- ! wavelength information
- type(wavelendep), dimension(:), allocatable :: wdep_out
- integer :: fid ! file id for IF_NOTOK_MDF macro
- integer :: access_mode ! netcdf-4 parallel access mode for distributed data
- ! generate output if true:
- logical :: okdebug = .true.
- ! reference time:
- integer :: time_reftime6(6) = (/2001,01,01,00,00,00/)
- character(len=*), parameter :: time_units = 'days since 2001-01-01 00:00'
- ! sizes of arrays
- integer, save :: ntracer_3d, ntracer_2d
- integer, save :: ntracer_1dstat, ntracer_0dstat, nstations
- integer, save :: nextra_1dstat
- integer, save :: n_2d_vars=0
- integer, save :: n_3d_vars=0
- ! index pointers for 1d/2d/3d fields in mixf
- integer, save :: temp, hus, airmass, pressure
- 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
- integer, save :: p_elohterp,p_elo3terp,p_elohisop,p_elo3isop,p_svohterp,p_svo3terp,p_svohisop,p_svo3isop
- integer, save :: coag1, gr1_2, co1_soa, co1_su, co2_soa, co3_soa, co4_soa, co5_soa,gph
- integer, save :: ec5503Daer, abs5503Daer, ec3503Daer, abs3503Daer
- integer, save :: ps , precip , sconcoa , sconcsoa , sconcbc , sconcso4 , sconcdust
- integer, save :: sconcss , sconcno3 , loadoa , loadsoa , loadbc , loadso4 , loaddust
- integer, save :: loadss , loadno3 , emioa , emibc , emiso2 , emiso4,emisoa
- integer, save :: emidust , emidms , emiss , dryso2 , drybc , dryso4
- integer, save :: drydust , drydms , dryss , wetoa , wetsoa , wetbc , wetso2
- integer, save :: emiterp , emiisop
- integer, save :: wetso4 , wetdust , wetdms , wetss , od550aer , od550so4, od550soa
- integer, save :: od550bc , od550oa , od550ss , od550dust , od550no3 , od550aerh2o
- integer, save :: od550lt1aer , od550lt1dust, od550lt1ss , abs550aer , ec550aer , asyaer
- integer, save :: ec550dryaer , abs550dryaer, asydryaer , ec550drylt1aer, abs550drylt1aer
- integer, save :: od440aer , od870aer , sconcmsa , dryoa , drysoa , sconcnh4
- integer, save :: abs440aer , ec440dryaer , abs440dryaer
- integer, save :: abs870aer , ec870dryaer , abs870dryaer
- integer, save :: od350aer , abs350aer
- integer, save :: bso4nus, bso4ais, bso4acs, bso4cos, bbcais , bbcacs
- integer, save :: bbccos , bbcaii , bpomais, bpomacs, bpomcos, bpomaii
- integer, save :: bssacs , bsscos , bduacs , bducos , bduaci , bducoi, bno3_a
- integer, save :: bnus_n , bais_n , bacs_n , bcos_n , baii_n , baci_n
- integer, save :: bcoi_n , bh2onus, bh2oais, bh2oacs, bh2ocos
- integer, save :: tr2d_1, tr2d_2, tr2d_3, tr2d_4, tr2d_5, tr2d_6, tr2d_7, tr2d_8, tr2d_9, tr2d_10
- integer, save :: tr2d_11, tr2d_12, tr2d_13, tr2d_14, tr2d_15, tr2d_16, tr2d_17, tr2d_18, tr2d_19
- integer, save :: tr2d_20, tr2d_21, tr2d_22, tr2d_23
- integer, save :: cc01, cc02, cc03, cc04, cc05, cc06, cc07
- integer, save :: cc3d01, cc3d02, cc3d03, cc3d04, cc3d05, cc3d06, cc3d07
- integer, save :: rw01, rw02, rw03, rw04, rw05, rw06, rw07
- integer, save :: rd01, rd02, rd03, rd04, rd05, rd06, rd07
- integer, save :: h2o1, h2o2, h2o3, h2o4
- integer, save :: tr3d_1, tr3d_2, tr3d_3, tr3d_4, tr3d_5, tr3d_6, tr3d_7, tr3d_8, tr3d_9, tr3d_10
- integer, save :: tr3d_11, tr3d_12, tr3d_13, tr3d_14, tr3d_15, tr3d_16, tr3d_17, tr3d_18, tr3d_19
- integer, save :: rw3d01, rw3d02, rw3d03, rw3d04, rw3d05, rw3d06, rw3d07
- integer, save :: rd3d01, rd3d02, rd3d03, rd3d04, rd3d05, rd3d06, rd3d07
- integer, save :: h2o3d1, h2o3d2, h2o3d3, h2o3d4
- integer, save ,dimension(2*nmod) :: radius
- integer, save ,dimension(ncomp) :: load
- integer, save ,dimension(ncomp) :: drydep
- integer, save ,dimension(ncomp) :: emi
- integer, save ,dimension(ncomp) :: wetdep
- integer, save ,dimension(ncomp) :: sed
- integer, save ,dimension(nmod) :: number
- integer, save ,dimension(naermod) :: masses
- integer, save :: ngas_output=10
- integer, save, dimension(:),allocatable :: gas_output
- integer::itim_opt_out
- !
- ! !REVISION HISTORY:
- ! 16 Nov 2010 - Achim Strunk
- ! 8 Dec 2016 - Tommi Bergman - Modified from AEROCOM-output
- !
- ! !REMARKS:
- ! (1) compiled only if with_m7 is used.
- !
- !EOP
- !------------------------------------------------------------------------
- contains
- !--------------------------------------------------------------------------
- ! TM5 !
- !--------------------------------------------------------------------------
- !BOP
- !
- ! !IROUTINE: OUTPUT_GENERAL_INIT
- !
- ! !DESCRIPTION: Initialise various parameters, eg.,
- ! wavelengths for optics and output containers.
- ! This routine should be called once per day, since fields
- ! are daily averages and one file per day is written.
- ! Additional tasks are done for newsrun==.true. .
- !\\
- !\\
- ! !INTERFACE:
- !
- subroutine output_general_init(status, iregion)
- !
- ! !USES:
- !
- !use MeteoData, only : sp_dat, set
- use GO, only: GO_Timer_Def, GO_Timer_End, GO_Timer_Start
- use chem_param, only : ntracet,ntrace,names,mode_tracers,mode_start,mode_nm
- use chem_param, only : inus_n, iso4nus, isoanus,nmod
- use chem_param, only : iais_n, iso4ais, ibcais, ipomais, isoaais
- use chem_param, only : iacs_n, iso4acs, ibcacs, ipomacs, isoaacs, issacs, iduacs
- use chem_param, only : icos_n, iso4cos, ibccos, ipomcos, isoacos, isscos, iducos
- use chem_param, only : iaii_n, ibcaii, ipomaii, isoaaii
- use chem_param, only : iaci_n, icoi_n, iduaci, iducoi
- use chem_param, only : ino3_a, inh4, imsa
- !use chem_param, only : io3, idms, imsa, inh4, iterp, ioh, ino3, ielvoc, isvoc, iisop,iso2,iso4
- use chem_param, only : io3, ih2o2, ieth, irooh, idms, imsa, imgly, inox, ico, ipar, ipan
- use chem_param, only : ich2o, iald2, iisop, iso4, irn222, ino3_a, ich4, ich3o2h, iole, iorgntr, inh3
- use chem_param, only : ic2h6, iethoh, ic3h8, iterp, iacet, iispd, ihono, ich3o2no2, ino, iho2, ich3o2
- use chem_param, only : in2o5, ihno4, ic2o3, iror, irxpar, ixo2, ixo2n, inh2, ih2opart,ic3h7o2, ihypro2
- use chem_param, only : isvoc, iso2, inh4, ipb210,io3s, ich3oh, ihcooh , ioh, ino2, ino3, iaco2, inh2o2, ielvoc
- USE mo_aero_m7, ONLY : nmod, nsol
- use dims, only : nregions, newsrun, idatee, idatei
- use dims, only : region_name, parent, itau
- use dims, only : xbeg, xend, ybeg, yend, dx, dy, xref, yref
- use dims, only : zbeg, zend, dz, zref
- use global_data, only : region_dat, outdir
- use datetime, only : tau2date, date2tau
- use budget_global, only : nbud_vg
- use partools, only : MPI_INFO_NULL, localComm,isroot
- use optics, only : Optics_Init
- use datetime, only : date2tau
- use dims, only : mlen, idatei
- !
- ! !OUTPUT PARAMETERS:
- !
- integer, intent(out) :: status
- !
- ! !INPUT PARAMETERS:
- !
- integer, intent(in), optional :: iregion
- !
- ! !REVISION HISTORY:
- ! Nov 2010 - Achim Strunk
- ! 16 Dec 2016 - Tommi Bergman KNMI
- ! - Modified from AEROCOM output
- !
- ! !REMARKS:
- !
- !EOP
- !------------------------------------------------------------------------
- !BOC
- character(len=*), parameter :: rname = mname//'/output_general_init'
- ! --- local ------------------------------
- integer :: imr, jmr, lmr, access_mode_sta
- integer :: lat_dimid,lon_dimid,lev_dimid
- integer :: region, varid
- integer :: io, istat, i, j, n, sc, iSat
- integer :: i1, i2, j1, j2
- integer, dimension(6) :: idater
- character(len=10) :: idates
- character(len=16) :: lidates
- character(len=3) :: cwavel
- real :: reftime
- integer(kind=8) :: itaucur, itauref
- integer :: time_shift
- real :: dlat, dlon
- integer :: mlength
- integer :: itracer,index_aer,imass,iout
- character(len=14) :: str, str2
- character(len=27) :: str_reftime
- ! --- begin -------------------------------
- call goLabel(rname)
- ! access mode for distributed data (2d and 3d)
- !!$#ifdef MPI
- !!$#ifdef with_netcdf4_par
- !!$ access_mode = MDF_COLLECTIVE
- !!$#else
- !!$ write(gol,'("General aerosol output requires netcdf4 with parallel access enabled")') ; call goErr
- !!$ TRACEBACK
- !!$ status=1; return
- !!$#endif
- !!$#else
- !!$ access_mode = MDF_INDEPENDENT
- !!$#endif
- ! for station
- access_mode_sta = MDF_INDEPENDENT
- ! initialize (only once)
- if( newsrun ) then
- call GO_Timer_Def( itim_opt_out, 'optics-output', status )
- IF_NOTOK_RETURN(status=1)
- ! ensure that required meteo is loaded:
- ! call Set( sp_dat(region), status, used=.true. )
- ! set wavelength information
- ! wl: wavelength in microns
- ! split: whether to split into contributions from
- ! M7 constituents (incl. water)
- allocate( wdep_out( 4 ) )
- wdep_out(1)%wl = 0.550 ; wdep_out(1)%split = .true. ; wdep_out(1)%insitu = .true.
- wdep_out(2)%wl = 0.440 ; wdep_out(2)%split = .false. ; wdep_out(2)%insitu = .true.
- wdep_out(3)%wl = 0.870 ; wdep_out(3)%split = .false. ; wdep_out(3)%insitu = .true.
- wdep_out(4)%wl = 0.350 ; wdep_out(4)%split = .false. ; wdep_out(4)%insitu = .false.
- ! get the optics code prepared
- call Optics_Init(size(wdep_out), wdep_out, status )
- IF_NOTOK_RETURN(status=1)
- ! -----------------------
- ! parameters needed to reference the different 1d/2d/3d-fields
- ! (in order to avoid errors in referencing)
- ! finally, this list here simply determines the order in the output files
- ntracer_3d = 160+nSat
- ! list removed, not needed anymore.
- ! 2d-output list needed for the moment
- ! optics needs to be changed first, since it relies on having optical variables
- ! using indices 38->
- ntracer_2d = 123
- ps = 1 ! 2d
- precip = 2 ! 2d
- sconcoa = 3 ! 2d
- sconcbc = 4 ! 2d
- sconcso4 = 5 ! 2d
- sconcdust = 6 ! 2d
- sconcss = 7 ! 2d
- sconcno3 = 8 ! 2d
- sconcnh4 = 9 ! 2d
- sconcmsa = 10 ! 2d
- loadoa = 11 ! 2d
- loadbc = 12 ! 2d
- loadso4 = 13 ! 2d
- loaddust = 14 ! 2d
- loadss = 15 ! 2d
- loadno3 = 16 ! 2d
- emioa = 17 ! 2d
- emibc = 18 ! 2d
- emiso2 = 19 ! 2d
- emiso4 = 20 ! 2d
- emidust = 21 ! 2d
- emidms = 22 ! 2d
- emiss = 23 ! 2d
- dryso2 = 24 ! 2d
- dryoa = 25 ! 2d
- drybc = 26 ! 2d
- dryso4 = 27 ! 2d
- drydust = 28 ! 2d
- drydms = 29 ! 2d
- dryss = 30 ! 2d
- wetoa = 31 ! 2d
- wetbc = 32 ! 2d
- wetso2 = 33 ! 2d
- wetso4 = 34 ! 2d
- wetdust = 35 ! 2d
- wetdms = 36 ! 2d
- wetss = 37 ! 2d
- ! --- from here onwards keep consistent with order in optics (optics.F90)
- ! --- begin split order
- od550aer = 38 ! 2d
- od550so4 = 39 ! 2d
- od550bc = 40 ! 2d
- od550oa = 41 ! 2d
- od550soa = 42 ! 2d
- od550ss = 43 ! 2d
- od550dust = 44 ! 2d
- od550no3 = 45 ! 2d
- od550aerh2o = 46 ! 2d
- od550lt1aer = 47 ! 2d
- od550lt1dust = 48 ! 2d
- od550lt1ss = 49 ! 2d
- ! --- end split order
- abs550aer = 50 ! 2d
- asyaer = 51 ! 2d
- ec550aer = 52 ! 2d
- ! --- begin in-situ data order
- ec550dryaer = 53 ! 2d
- abs550dryaer = 54 ! 2d
- asydryaer = 55 ! 2d
- ec550drylt1aer = 56 ! 2d
- abs550drylt1aer = 57 ! 2d
- ! --- end in-situ data order
- !
- od440aer = 58 ! 2d
- abs440aer = 59 ! 2d
- ec440dryaer = 60 ! 2d
- abs440dryaer = 61 ! 2d
- !
- od870aer = 62 ! 2d
- abs870aer = 63 ! 2d
- ec870dryaer = 64 ! 2d
- abs870dryaer = 65 ! 2d
- !
- od350aer = 66 ! 2d
- abs350aer = 67 ! 2d
- !
- tr2d_1=68
- tr2d_2=69
- tr2d_3=70
- tr2d_4=71
- tr2d_5=72
- tr2d_6=73
- tr2d_7=74
- tr2d_8=75
- tr2d_9=76
- tr2d_10=77
- tr2d_11=78
- tr2d_12=79
- tr2d_13=80
- tr2d_14=81
- tr2d_15=82
- tr2d_16=83
- tr2d_17=84
- tr2d_18=85
- tr2d_19=86
- tr2d_20=87
- tr2d_21=88
- tr2d_22=89
- tr2d_23=90
- cc01=91
- cc02=92
- cc03=93
- cc04=94
- cc05=95
- cc06=96
- cc07=97
- h2o1=98
- h2o2=99
- h2o3=100
- h2o4=101
- rw01=102
- rw02=103
- rw03=104
- rw04=105
- rw05=106
- rw06=107
- rw07=108
- rd01=109
- rd02=110
- rd03=111
- rd04=112
- sconcsoa=113
- loadsoa=114
- drysoa=115
- wetsoa=116
- emiterp=117
- emiisop=118
- p_svoc2d=119
- p_elvoc2d=120
- p_liq_so42d=121
- p_gas_so42d=122
- emisoa=123
- end if
- regionloop: do region = 1, nregions
- ! if region given, cycle if other region!
- if (present(iregion)) then
- if(iregion /= region) cycle regionloop
- endif
- imr = global_lli(region)%nlon
- jmr = global_lli(region)%nlat
- lmr = levi%nlev
- if( nbud_vg /= lmr ) then
- write(gol,*)'output_general_init: nbud_vg /= lmr'; call goErr
- write(gol,*)'output_general_init: YOU MUST ADD THE PROJ/BUDGET10 TO SRC CODE !!!!!'; call goErr
- TRACEBACK
- status=1; return
- end if
- ! initialize the output:
- if( newsrun ) then
- if (all_chemistry) then
- ngas_output=57
- allocate(gas_output(ngas_output))
- gas_output=(/&
- io3, ih2o2, ieth, irooh, idms, imsa, imgly, inox, ico, ipar, ipan, iso2, inh4, ipb210, &
- ich2o, iald2, iisop, iso4, irn222, ino3_a, ich4, ich3o2h, iole, iorgntr, inh3, io3s, ich3oh, ihcooh, &
- ic2h6, iethoh, ic3h8, iterp, iacet, iispd, ihono, ich3o2no2, ino, iho2, ich3o2, ioh, ino2, ino3, &
- in2o5, ihno4, ic2o3, iror, irxpar, ixo2, ixo2n, inh2, ih2opart,ic3h7o2, ihypro2, iaco2, inh2o2, ielvoc, &
- isvoc/)
- else
- allocate(gas_output(ngas_output))
- gas_output=(/io3,idms,iso4,iso2,iterp,ioh,ino3,ielvoc,isvoc,iisop /)
- end if
- call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
- ! target structures for output
- allocate(mixf (region)%f3d(ntracer_3d))
- allocate(mixf (region)%f2d(ntracer_2d))
- ! allocate data holder for maximum amount of tracers
- do i=1,ntracer_3d
- allocate( mixf(region)%f3d(i)%field(i1:i2,j1:j2,lmr) )
- end do
-
- do i=1,ntracer_2d
- allocate( mixf(region)%f2d(i)%field(i1:i2,j1:j2))
- end do
- ! METEO variables
- call add_Variable(region,-1 , 'temp ', 'Temperature ' , 'K ',3,temp,status )
- call add_Variable(region,-1 , 'hus ', 'Specific Humidity ' , '1 ',3,hus,status )
- call add_Variable(region,-1 , 'airmass ', 'Air Mass ' , 'kg m-2 ',3,airmass,status )
- call add_Variable(region,-1 ,'pressure ', 'Pressure ' , 'Pa ',3,pressure,status )
- call add_Variable(region,-1 ,'prod_gas_so4 ', 'production of so4 ' , 'kg m-2s-1',3,p_gas_so4,status )
- call add_Variable(region,-1 ,'prod_liq_so4 ', 'production of so4 ' , 'kg m-2s-1',3,p_liq_so4,status )
- call add_Variable(region,-1 ,'prod_elvoc ', 'production of elvoc ' , 'kg m-2s-1',3,p_elvoc,status )
- call add_Variable(region,-1 ,'prod_svoc ', 'production of svoc ' , 'kg m-2s-1',3,p_svoc,status )
-
- call add_Variable(region,-1 ,'p_el_ohterp ', 'production of elvoc, ohterp ' , 'kg m-2s-1',3,p_elohterp,status )
- call add_Variable(region,-1 ,'p_el_o3terp ', 'production of elvoc, o3terp ' , 'kg m-2s-1',3,p_elo3terp,status )
- call add_Variable(region,-1 ,'p_el_ohisop ', 'production of elvoc, ohisop ' , 'kg m-2s-1',3,p_elohisop,status )
- call add_Variable(region,-1 ,'p_el_o3isop ', 'production of elvoc, o3isop ' , 'kg m-2s-1',3,p_elo3isop,status )
- call add_Variable(region,-1 ,'p_sv_ohterp ', 'production of svoc, ohterp ' , 'kg m-2s-1',3,p_svohterp,status )
- call add_Variable(region,-1 ,'p_sv_o3terp ', 'production of svoc, o3terp ' , 'kg m-2s-1',3,p_svo3terp,status )
- call add_Variable(region,-1 ,'p_sv_ohisop ', 'production of svoc, ohisop ' , 'kg m-2s-1',3,p_svohisop,status )
- call add_Variable(region,-1 ,'p_sv_o3isop ', 'production of svoc, o3isop ' , 'kg m-2s-1',3,p_svo3isop,status )
- call add_Variable(region,-1 ,'d_nuc ', 'production of particles ' , ' cm-3s-1',3,d_nuc,status )
- call add_Variable(region,-1 ,'m_nuc_su ', 'nucleation sulfate ' , ' molec cm-3s-1',3,m_nuc_su,status )
- call add_Variable(region,-1 ,'m_nuc_soa ', 'nucleation ELVOC ' , ' µg m-3s-1',3,m_nuc_soa,status )
- call add_Variable(region,-1 ,'gr1_2 ', 'growth of mode 1 into 2 ' , ' cm-3s-1',3,gr1_2,status )
- call add_Variable(region,-1 ,'coag1 ', 'coagulation sink of mode 1 ' , ' cm-3s-1',3,coag1,status )
- call add_Variable(region,-1 ,'co1_soa ', 'condensation of ELVOC to mode 1 ' , ' µg m-3s-1',3,co1_soa,status )
- call add_Variable(region,-1 ,'co2_soa ', 'condensation of ELVOC to mode 2 ' , ' µg m-3s-1',3,co2_soa,status )
- call add_Variable(region,-1 ,'co3_soa ', 'condensation of ELVOC to mode 3 ' , ' µg m-3s-1',3,co3_soa,status )
- call add_Variable(region,-1 ,'co4_soa ', 'condensation of ELVOC to mode 4 ' , ' µg m-3s-1',3,co4_soa,status )
- call add_Variable(region,-1 ,'co5_soa ', 'condensation of ELVOC to mode 5 ' , ' µg m-3s-1',3,co5_soa,status )
- call add_Variable(region,-1 ,'co1_su ', 'condensation of sulfate to mode 1 ' , ' molec cm-3s-1',3,co1_su,status )
- IF (nCCNdiag) THEN
- ALLOCATE(ind_CCN(nSat))
- DO iSat=1,nSat
- WRITE(str,'("CCN",F4.2)') SuperSat(iSat)*100.e0
- WRITE(str2,'("CCN at ",F4.2,"%")') SuperSat(iSat)*100.e0
- call add_Variable(region,-1 ,str, str2, ' cm-3',3,ind_CCN(iSat),status )
- ENDDO
- ENDIF
- call add_Variable(region,-1 ,'gph3D', '3D Geopotential height', 'm',3,gph,status )
- ! mass concentrations of different modes
- imass=0
- do i=1,nmod
- do j=1,mode_nm(i)!ncomp
- !get tracer id from mode_tracers array
- itracer=mode_tracers(j,i)
- ! if there is a tracer, add variable to output array
- !if (itracer>0)then
- imass=imass+1
- call add_Variable(region,itracer ,'M_'//names(itracer), 'mass concentration of '//names(itracer), 'kg m-3',3,index_aer,status )
- !end if
- ! save output array id for masses
- masses(imass)=index_aer
- end do
- end do
- call add_Variable(region,imsa ,'M_MSA', 'mass concentration of MSA (ACS)', 'kg m-3',3,index_aer,status )
- call add_Variable(region,ino3_a ,'M_NO3', 'mass concentration of NO3 (ACS)', 'kg m-3',3,index_aer,status )
-
- ! Mode number concentrations
- do i=1,nmod
- !get tracer id from mode_tracers array
- ! 0-index of mode_tracers has the number for each mode
- itracer=mode_tracers(0,i)
- ! if there is a tracer, add variable to output array
- if (itracer>0)then
- !
- call add_Variable(region,itracer ,'N_'//names(itracer)(1:3), 'number concentration of '//names(itracer), '1 m-3',3,index_aer,status )
-
- end if
- ! save output array id for number
- number(i)=index_aer
- end do
-
- ! gas-phase output
- do i=1,ngas_output
- itracer=gas_output(i)
- call add_Variable(region,itracer ,'GAS_'//names(itracer), 'gas phase concentration of '//names(itracer), 'kg m-3',3,index_aer,status )
- end do
- ! particle water
- do i=1,nsol
- !write(iout,'(I2.2)') i
- itracer=mode_start(i)
- 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 )
- end do
- ! Radius of the particles
- ! wet radius for all
- do i=1,nmod
- itracer=mode_start(i)
- call add_Variable(region,-1 ,'RWET_'//names(itracer)(1:3), 'wet radius of '//names(itracer)(1:3), 'm',3,index_aer,status )
- end do
- ! dry radius only for soluble, as rwet=rdry for insoluble
- do i=1,nsol
- itracer=mode_start(i)
- call add_Variable(region,-1 ,'RDRY_'//names(itracer)(1:3), 'dry radius of '//names(itracer)(1:3), 'm',3,index_aer,status )
-
- end do
- ! 2d data
- ! For now it is exactly the same as in AEROCOM-output, mostly due to optics depending on
- ! output indices now in place
- mixf(region)%f2d(ps )%mf = metafields( -1 , 'ps ', 'Surface Air Pressure ' , 'Pa ', '', 'surface_air_pressure' )
- mixf(region)%f2d(precip )%mf = metafields( -1 , 'precip ', 'Precipitation ' , 'kg m-2 s-1', '', 'precipitation_flux' )
- mixf(region)%f2d(sconcoa )%mf = metafields( -1 , 'sconcoa ', 'Surface Concentration POM ' , 'kg m-3 ', '', 'mass_concentration_of_particulate_organic_matter_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcbc )%mf = metafields( -1 , 'sconcbc ', 'Surface Concentration BC ' , 'kg m-3 ', '', 'mass_concentration_of_black_carbon_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcso4 )%mf = metafields( -1 , 'sconcso4 ', 'Surface Concentration SO4 ' , 'kg m-3 ', '', 'mass_concentration_of_sulfate_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcdust )%mf = metafields( -1 , 'sconcdust ', 'Surface Concentration Dust ' , 'kg m-3 ', '', 'mass_concentration_of_dust_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcss )%mf = metafields( -1 , 'sconcss ', 'Surface Concentration SS ' , 'kg m-3 ', '', 'mass_concentration_of_seasalt_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcno3 )%mf = metafields( -1 , 'sconcno3 ', 'Surface Concentration NO3 ' , 'kg m-3 ', '', 'mass_concentration_of_nitrate_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcnh4 )%mf = metafields( -1 , 'sconcnh4 ', 'Surface Concentration NH4 ' , 'kg m-3 ', '', 'mass_concentration_of_ammonium_dry_aerosol_in_air' )
- mixf(region)%f2d(sconcmsa )%mf = metafields( -1 , 'sconcmsa ', 'Surface Concentration MSA ' , 'kg m-3 ', '', 'mass_concentration_of_methane_sulfonic_acid_in_air' )
- mixf(region)%f2d(loadoa )%mf = metafields( -1 , 'loadoa ', 'Load of POM ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol' )
- mixf(region)%f2d(loadbc )%mf = metafields( -1 , 'loadbc ', 'Load of BC ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_black_carbon_dry_aerosol' )
- mixf(region)%f2d(loadso4 )%mf = metafields( -1 , 'loadso4 ', 'Load of SO4 ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_sulfate_dry_aerosol' )
- mixf(region)%f2d(loaddust )%mf = metafields( -1 , 'loaddust ', 'Load of Dust ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_dust_dry_aerosol' )
- mixf(region)%f2d(loadss )%mf = metafields( -1 , 'loadss ', 'Load of SS ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_seasalt_dry_aerosol' )
- mixf(region)%f2d(loadno3 )%mf = metafields( -1 , 'loadno3 ', 'Load of NO3 ' , 'kg m-2 ', '', 'atmosphere_mass_content_of_nitrate_dry_aerosol' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- mixf(region)%f2d(dryoa )%mf = metafields( -1 , 'dryoa ', 'Dry Deposition of POM ' , 'kg m-2 s-1', 'down', &
- 'tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_due_to_dry_deposition' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- 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' )
- mixf(region)%f2d(od550aer )%mf = metafields( -1 , 'od550aer ', 'AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(od550so4 )%mf = metafields( -1 , 'od550so4 ', 'SO4 AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_sulfate_ambient_aerosol' )
- mixf(region)%f2d(od550bc )%mf = metafields( -1 , 'od550bc ', 'Black Carbon AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_black_carbon_ambient_aerosol' )
- mixf(region)%f2d(od550oa )%mf = metafields( -1 , 'od550oa ', 'POM AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol' )
- mixf(region)%f2d(od550soa )%mf = metafields( -1 , 'od550soa ', 'SOA AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_particulate_secondary_organic_aerosol_ambient_aerosol' )
- mixf(region)%f2d(od550ss )%mf = metafields( -1 , 'od550ss ', 'SeaSalt AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_seasalt_ambient_aerosol' )
- mixf(region)%f2d(od550dust )%mf = metafields( -1 , 'od550dust ', 'Dust AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_dust_ambient_aerosol' )
- mixf(region)%f2d(od550no3 )%mf = metafields( -1 , 'od550no3 ', 'Nitrate AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_nitrate_ambient_aerosol' )
- mixf(region)%f2d(od550aerh2o )%mf = metafields( -1 , 'od550aerh2o ', 'Aerosol Water AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_water_in_ambient_aerosol' )
- mixf(region)%f2d(od550lt1aer )%mf = metafields( -1 , 'od550lt1aer ', 'Fine Mode AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_pm1_ambient_aerosol' )
- mixf(region)%f2d(od550lt1dust)%mf = metafields( -1 , 'od550lt1dust', 'Fine Mode Dust AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_dust_pm1_ambient_aerosol' )
- mixf(region)%f2d(od550lt1ss)%mf = metafields( -1 , 'od550lt1ss ', 'Fine Mode SeaSalt AOD@550nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_seasalt_pm1_ambient_aerosol' )
- mixf(region)%f2d(abs550aer )%mf = metafields( -1 , 'abs550aer ', 'Absorption AOD@550nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(asyaer )%mf = metafields( -1 , 'asyaer ', 'Asymmetry Parameter ' , '1 ', '', 'atmosphere_asymmetry_parameter_ambient_aerosol' )
- mixf(region)%f2d(ec550aer )%mf = metafields( -1 , 'ec550aer ', 'Surface Ambient Aerosol Extinction@550nm' , 'm-1 ', '', 'surface_extinction_due_to_ambient_aerosol' )
- mixf(region)%f2d(ec550dryaer )%mf = metafields( -1 , 'ec550dryaer ', 'Surface Dry Aerosol Extinction@550 nm','m-1 ', '', 'surface_extinction_due_to_dry_aerosol' )
- mixf(region)%f2d(abs550dryaer)%mf = metafields( -1 , 'abs550dryaer', 'Surface Dry Aerosol Absorption@550 nm','m-1 ', '', 'surface_absorption_due_to_dry_aerosol' )
- mixf(region)%f2d(asydryaer )%mf = metafields( -1 , 'asydryaer ', 'Surface Dry Aersol Asymmetry Parameter' , '1 ', '', 'surface_asymmetry_parameter_dry_aerosol' )
- 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' )
- 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' )
- mixf(region)%f2d(od440aer )%mf = metafields( -1 , 'od440aer ', 'AOD@440nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(abs440aer )%mf = metafields( -1 , 'abs440aer ', 'Absorption AOD@440nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(ec440dryaer )%mf = metafields( -1 , 'ec440dryaer ', 'Surface Dry Aerosol Extinction@440nm' , 'm-1 ', '', 'surface_extinction_due_to_dry_aerosol' )
- mixf(region)%f2d(abs440dryaer)%mf = metafields( -1 , 'abs440dryaer', 'Surface Dry Aerosol Absorption@440nm' , 'm-1 ', '', 'surface_absorption_due_to_dry_aerosol' )
- mixf(region)%f2d(od870aer )%mf = metafields( -1 , 'od870aer ', 'AOD@870nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(abs870aer )%mf = metafields( -1 , 'abs870aer ', 'Absorption AOD@870nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(ec870dryaer )%mf = metafields( -1 , 'ec870dryaer ', 'Surface Dry Aerosol Extinction@870nm' , 'm-1 ', '', 'surface_extinction_due_to_dry_aerosol' )
- mixf(region)%f2d(abs870dryaer)%mf = metafields( -1 , 'abs870dryaer', 'Surface Dry Aerosol Absorption@870nm' , 'm-1 ', '', 'surface_absorption_due_to_dry_aerosol' )
- mixf(region)%f2d(od350aer )%mf = metafields( -1 , 'od350aer ', 'AOD@350nm ' , '1 ', '', 'atmosphere_optical_thickness_due_to_ambient_aerosol' )
- mixf(region)%f2d(abs350aer )%mf = metafields( -1 , 'abs350aer ', 'Absorption AOD@350nm ' , '1 ', '', 'atmosphere_absorption_optical_thickness_due_to_ambient_aerosol' )
- !!$
- !!$
- !!$ mixf(region)%f2d(52)%mf = metafields( 'od550soa ', 'AOD@550nm SOA ' , '1 ' )
- !!$ mixf(region)%f2d(53)%mf = metafields( 'od550bb ', 'AOD@550nm BB ' , '1 ' )
- !!$ mixf(region)%f2d(54)%mf = metafields( 'gf90aer ', 'GF @ 90 % RH ' , '1 ' )
- mixf(region)%f2d( tr2d_1)%mf = metafields( iso4nus, 'SO4NUS ', 'concentration of tracer 01' , 'kg m-3', '', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_2)%mf = metafields( iso4ais, 'SO4AIS ', 'concentration of tracer 02' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_3)%mf = metafields( iso4acs, 'SO4ACS ', 'concentration of tracer 03' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_4)%mf = metafields( iso4cos, 'SO4COS ', 'concentration of tracer 04' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_5)%mf = metafields( ibcais , 'BCAIS ', 'concentration of tracer 05' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_6)%mf = metafields( ibcacs , 'BCACS ', 'concentration of tracer 06' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_7)%mf = metafields( ibccos , 'BCCOS ', 'concentration of tracer 07' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_8)%mf = metafields( ibcaii , 'BCAII ', 'concentration of tracer 08' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d( tr2d_9)%mf = metafields( ipomais, 'POMAIS ', 'concentration of tracer 09' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_10)%mf = metafields( ipomacs, 'POMACS ', 'concentration of tracer 10' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_11)%mf = metafields( ipomcos, 'POMCOS ', 'concentration of tracer 11' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_12)%mf = metafields( ipomaii, 'POMAII ', 'concentration of tracer 12' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_13)%mf = metafields( issacs , 'SSACS ', 'concentration of tracer 13' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_14)%mf = metafields( isscos , 'SSCOS ', 'concentration of tracer 14' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_15)%mf = metafields( iduacs , 'DUACS ', 'concentration of tracer 15' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_16)%mf = metafields( iducos , 'DUCOS ', 'concentration of tracer 16' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_17)%mf = metafields( iduaci , 'DUACI ', 'concentration of tracer 17' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_18)%mf = metafields( iducoi , 'DUCOI ', 'concentration of tracer 18' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_19)%mf = metafields( isoanus, 'SOANUS ', 'concentration of tracer 19' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_20)%mf = metafields( isoaais, 'SOAAIS ', 'concentration of tracer 20' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_21)%mf = metafields( isoaacs, 'SOAACS ', 'concentration of tracer 21' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_22)%mf = metafields( isoacos, 'SOACOS ', 'concentration of tracer 22' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- mixf(region)%f2d(tr2d_23)%mf = metafields( isoaaii, 'SOAAII ', 'concentration of tracer 23' , 'kg m-3','', 'concentration_of_tracer_dry_aerosol_in_air' )
- !!$
- mixf(region)%f2d(cc01)%mf = metafields( inus_n , 'conc_NUS', 'number concentration of mode 01' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- mixf(region)%f2d(cc02)%mf = metafields( iais_n , 'conc_AIS', 'number concentration of mode 02' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- mixf(region)%f2d(cc03)%mf = metafields( iacs_n , 'conc_ACS', 'number concentration of mode 03' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- mixf(region)%f2d(cc04)%mf = metafields( icos_n , 'conc_COS', 'number concentration of mode 04' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- mixf(region)%f2d(cc05)%mf = metafields( iaii_n , 'conc_AII', 'number concentration of mode 05' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- mixf(region)%f2d(cc06)%mf = metafields( iaci_n , 'conc_ACI', 'number concentration of mode 06' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- mixf(region)%f2d(cc07)%mf = metafields( icoi_n , 'conc_COI', 'number concentration of mode 07' , 'm-3' ,'', 'number_concentration_of_ambient_aerosol_in_air' )
- 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' )
- 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' )
- 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' )
- 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' )
- mixf(region)%f2d(rw01)%mf = metafields( -1 , 'RWETnus ', 'rwet nus ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rw02)%mf = metafields( -1 , 'RWETais ', 'rwet ais ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rw03)%mf = metafields( -1 , 'RWETacs ', 'rwet acs ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rw04)%mf = metafields( -1 , 'RWETcos ', 'rwet cos ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rw05)%mf = metafields( -1 , 'RWETaii ', 'rwet aii ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rw06)%mf = metafields( -1 , 'RWETaci ', 'rwet aci ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rw07)%mf = metafields( -1 , 'RWETcoi ', 'rwet coi ' , 'm','', 'wet_radius' )
- mixf(region)%f2d(rd01)%mf = metafields( -1 , 'RDRYnus ', 'rdry nus ' , 'm','', 'dry radius' )
- mixf(region)%f2d(rd02)%mf = metafields( -1 , 'RDRYais ', 'rdry ais ' , 'm','', 'dry radius' )
- mixf(region)%f2d(rd03)%mf = metafields( -1 , 'RDRYacs ', 'rdry acs ' , 'm','', 'dry radius' )
- mixf(region)%f2d(rd04)%mf = metafields( -1 , 'RDRYcos ', 'rdry cos ' , 'm','', 'dry radius' )
- mixf(region)%f2d(emiterp)%mf = metafields( -1 , 'emiterp ', 'emiterp ' , 'kgm-2s-1','', 'emission_of_terpene' )
- mixf(region)%f2d(emiisop)%mf = metafields( -1 , 'emiisop ', 'emiisop ' , 'kgm-2s-1','', 'emission_of_isoprene' )
- !!$ mixf(region)%f2d(rd05)%mf = metafields( -1 , 'RDRYaii ', 'rdry ' , 'm','', 'precipitation_flux' )
- !!$ mixf(region)%f2d(rd06)%mf = metafields( -1 , 'RDRYaci ', 'rdry ' , 'm','', 'precipitation_flux' )
- !!$ mixf(region)%f2d(rd07)%mf = metafields( -1 , 'RDRYcoi ', 'rdry ' , 'm','', 'precipitation_flux' )
- !!$ !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' )
- !!$ !mixf(region)%f2d(32)%mf = metafields( inh4 , 'mmrnh4 ', 'mmr of ammonium' , 'kg m-3', 'mass_fraction_of_ammonium_dry_aerosol_in_air' )
- !!$ !mixf(region)%f2d(33)%mf = metafields( imsa , 'mmrmsa ', 'mmr of methane sulfonic acid' , 'kg m-3', 'mass_fraction_of_methane_sulfonic_acid_in_air' )
- mixf(region)%f2d(sconcsoa )%mf = metafields( -1 , 'sconcsoa ', 'Surface Concentration SOA ' , 'kg m-3 ', &
- '', 'mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_in_air' )
- mixf(region)%f2d(loadsoa )%mf = metafields( -1 , 'loadsoa ', 'Load of SOA ' , 'kg m-2 ', &
- '', 'atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol' )
- mixf(region)%f2d(drysoa )%mf = metafields( -1 , 'drysoa ', 'Dry Deposition of SOA ' , 'kg m-2 s-1', 'down', &
- 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_dry_deposition' )
- mixf(region)%f2d(wetsoa )%mf = metafields( -1 , 'wetsoa ', 'Wet Deposition of SOA ' , &
- 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
- mixf(region)%f2d(p_svoc2d )%mf = metafields( -1 , 'p_svoc2D ', 'Column integral of SVOC production' , &
- 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
- mixf(region)%f2d(p_elvoc2d )%mf = metafields( -1 , 'p_elvoc2D ', 'Column integral of ELVOC production ' , &
- 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_due_to_wet_deposition' )
- mixf(region)%f2d(p_gas_so42d )%mf = metafields( -1 , 'prod_gas_so42D ', 'Column integral of gas SO4 production' , &
- 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_gas_phase_sulfate' )
- mixf(region)%f2d(p_liq_so42d )%mf = metafields( -1 , 'prod_liq_so42D ', 'Column integral of liq SO4 production ' , &
- 'kg m-2 s-1', 'down', 'tendency_of_atmosphere_mass_content_of_liquid_phase_sulfate' )
-
- 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' )
- ! set global dimensions of fields for netcdf definitions
- mixf (region)%nlon = imr
- mixf (region)%nlat = jmr
- mixf (region)%nlev = lmr
- !allocate space for lon, lat, lev information
- allocate(mixf (region)%lon(imr))
- allocate(mixf (region)%lat(jmr))
- allocate(mixf (region)%lev(lmr))
- ! save the lat and lon data for use in output
- mixf (region)%lat=global_lli(region)%lat_deg
- mixf (region)%lon=global_lli(region)%lon_deg
- 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/)
- ! intermediate structures for budgets
- allocate(drydepos(region)%f2dslast(i1:i2,j1:j2,8))
- allocate(wetdepos(region)%f2dslast(i1:i2,j1:j2,8))
- allocate(emission(region)%f2dslast(i1:i2,j1:j2,10))! pom, bc, su, so2, dms, ss, dust, terp, isop, soa(for oldsoa)
- ! these here are the initial budgets (monthly): 0.0
- drydepos(region)%f2dslast = 0.0
- wetdepos(region)%f2dslast = 0.0
- emission(region)%f2dslast = 0.0
- endif ! newsrun
- ! reset counters and accumulators
- mixf (region)%acct = 0
- do i = 1, ntracer_3d
- mixf(region)%f3d(i)%field = 0.0
- end do
- do i = 1, ntracer_2d
- mixf(region)%f2d(i)%field = 0.0
- end do
- ! ----------------
- ! open NetCDF file (mixf)
- ! ----------------
- call tau2date(itau,idater)
- ! time (in days since 2001-01-01 00:00)
- !Change to from beginning of a run (idatei)
- ! Does not work with monthly restarts date is set for
- ! each month...
- !time_reftime6=idatei
- call date2tau( time_reftime6, itauref )
-
- select case (trim(gen_freq))
- case ('hourly')
-
- write(idates, '(i4,3i2.2)') idater(1), idater(2), idater(3), idater(4)
- write(lidates, '(i4,"-",i2.2,"-",i2.2," ",i2.2,":30")') idater(1), idater(2), idater(3), idater(4)
- idater(5:6) = (/30,0/)
- case ('daily')
- write(idates, '(i4,2i2.2)') idater(1), idater(2), idater(3)
- write(lidates, '(i4,"-",i2.2,"-",i2.2," 12:00")') idater(1), idater(2), idater(3)
- ! set noon (recommendations)
- idater(4:6) = (/12,0,0/)
- case ('monthly')
- ! for monthly files, set time to middle of the month
- write(idates, '(i4,i2.2)') idater(1), idater(2)
- mlength=mlen(idater(2))
- if ( mod(mlength,2) == 0 ) then
- idater(3:6) = (/mlength/2 + 1,0,0,0/)
- write(lidates, '(i4,"-",i2.2,"-",i2.2," 00:00")') idater(1), idater(2), idater(3)
- else
- idater(3:6) = (/(mlength+1)/2,12,0,0/)
- write(lidates, '(i4,"-",i2.2,"-",i2.2," 12:00")') idater(1), idater(2), idater(3)
- endif
- case default
- write (gol,'("Unknown General output frequency;")'); call goErr
- end select
- call date2tau( idater, itaucur )
- !move the timestamp in middle of the average period
- if (trim(gen_freq)=='hourly') then
- ! if average period is hour move the timestamp 30 min back
- time_shift=30*60
- else if (trim(gen_freq)=='daily') then
- ! if average period is hour move the timestamp 30 min back
- time_shift = 12*60*60
- else if (trim(gen_freq)=='monthly') then
- ! assume 30 day months
- time_shift=15*60*60*24
- end if
- reftime = (itaucur - itauref - time_shift) / 86400.
- !call date2tau(
- 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)
- ! Changed file name convention to General Control 2015
- mixf(region)%fname = trim(outdir)//'/'//&
- trim(f_dataid)//'_'//&
- trim(f_model) //'_'//&
- trim(gen_exper)//'_'//&
- trim(idates) //'_'//&
- trim(gen_freq) //'.nc'
- ! overwrite existing files (clobber), provide MPI stuff:
- if (isroot) call MDF_Create( mixf(region)%fname, MDF_NETCDF4, MDF_REPLACE, mixf(region)%funit, status )
- if (status/=0) then
- write (gol,'("from creating NetCDF4 file for writing in parallel;")'); call goErr
- write (gol,'("MDF module not compiled with netcdf4_par support ?")'); call goErr
- TRACEBACK; status=1; return
- end if
- if(okdebug) then
- write(gol,*) 'output_general_init: File ', trim(mixf(region)%fname), ' opened ' ; call goPr
- endif
- if (isroot) then
- ! global attributes
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'title', 'Model output for General', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'source', 'TM5-mp', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'institution', 'Royal Netherlands Meteorological Institute (KNMI), De Bilt, The Netherlands)', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'contact' , 'Tommi Bergman: tommi.bergman@knmi.nl ; Twan van Noije; noije@knmi.nl', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'project_id', 'General Phase 3', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'conventions', 'CF-1.0 - HTAP', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'date', lidates, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'time_units', time_units, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, MDF_GLOBAL, 'references', 'http://tm5.sourceforge.net/', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- ! define dimensions
- call MDF_Def_Dim( mixf(region)%funit, 'lon', imr, lon_dimid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Def_Dim( mixf(region)%funit, 'lat', jmr, lat_dimid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- !write(3000,*)lmr
- call MDF_Def_Dim( mixf(region)%funit, 'lev', 34, lev_dimid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- !Unlimited time causes a crash in the parallel NETCDF, when unlimited dimension is increased in the file
- !4.4.0 may correct this, but for now netcdf v4.4.0 on cca is not working
- call MDF_Def_Dim( mixf(region)%funit, 'time', 1, mixf(region)%timeid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- ! define dimension variables
- ! longitude
- call MDF_Def_Var( mixf(region)%funit, 'lon', MDF_DOUBLE, &
- (/lon_dimid/), mixf(region)%lonid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'units', 'degrees_east', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'axis', 'X', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'long_name', 'longitude', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%lonid , 'standard_name', 'longitude', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- ! Write out the longitudes
- call MDF_Put_Var( mixf(region)%funit, mixf(region)%lonid, mixf(region)%lon, status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- ! define latitude variable
- call MDF_Def_Var( mixf(region)%funit, 'lat', MDF_DOUBLE, &
- (/lat_dimid/), mixf(region)%latid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- !write out the latitude to variable
- call MDF_Put_Var( mixf(region)%funit, mixf(region)%latid, mixf(region)%lat, status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'units', 'degrees_north', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'axis', 'Y', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'long_name', 'latitude', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%latid , 'standard_name', 'latitude', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- ! lev
- call MDF_Def_Var( mixf(region)%funit, 'lev' , MDF_DOUBLE, &
- (/lev_dimid/), mixf(region)%levid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- !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)
- call MDF_Put_Var( mixf(region)%funit, mixf(region)%levid, mixf(region)%lev, status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- ! time
- call MDF_Def_Var( mixf(region)%funit, 'time', MDF_DOUBLE, &
- (/mixf(region)%timeid/), mixf(region)%time_varid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%time_varid , 'units', str_reftime, status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- !call MDF_Put_Att( mixf(region)%funit,mixf(region)%timeid , 'long_name', 'time', status)
- !IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit,mixf(region)%time_varid , 'standard_name', 'time', status)
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
-
- ! define variables
- !do i = 1, ntrace!r_3d
- do i = 1, n_3d_vars!ntracer_3d
- !write(1234,*)i,trim(mixf(region)%f3d(i)%mf%vname)
- call MDF_Def_Var( mixf(region)%funit, trim(mixf(region)%f3d(i)%mf%vname), MDF_FLOAT, &
- (/mixf(region)%lonid, mixf(region)%latid, mixf(region)%levid, mixf(region)%timeid/), varid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- !call MDF_Var_Par_Access( mixf(region)%funit, varid, access_mode, status )
- !IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'long_name', trim(mixf(region)%f3d(i)%mf%lname), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'standard_name', trim(mixf(region)%f3d(i)%mf%standard_name), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'units', trim(mixf(region)%f3d(i)%mf%unit), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- ! call MDF_Put_Att( mixf(region)%funit, varid, 'time', reftime, status )
- ! IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'cell_methods', 'time: mean', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- if( mixf(region)%f3d(i)%mf%positive /= '' ) then
- call MDF_Put_Att( mixf(region)%funit, varid, 'positive', trim(mixf(region)%f3d(i)%mf%positive), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- end if
- mixf(region)%f3d(i)%varid = varid
- end do
- do i = 1, ntracer_2d
- ! write(1234,*)i,trim(mixf(region)%f2d(i)%mf%vname)
- call MDF_Def_Var( mixf(region)%funit, trim(mixf(region)%f2d(i)%mf%vname), MDF_FLOAT, &
- (/mixf(region)%lonid, mixf(region)%latid, mixf(region)%timeid/), varid, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- !call MDF_Var_Par_Access( mixf(region)%funit, varid, access_mode, status )
- !IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'long_name', trim(mixf(region)%f2d(i)%mf%lname), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'standard_name', trim(mixf(region)%f2d(i)%mf%standard_name), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'units', trim(mixf(region)%f2d(i)%mf%unit), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- ! call MDF_Put_Att( mixf(region)%funit, varid, 'time', reftime, status )
- ! IF_NOTOK_MDF(fid=mixf(region)%funit)
- call MDF_Put_Att( mixf(region)%funit, varid, 'cell_methods', 'time: mean', status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- if( mixf(region)%f2d(i)%mf%positive /= '' ) then
- call MDF_Put_Att( mixf(region)%funit, varid, 'positive', trim(mixf(region)%f2d(i)%mf%positive), status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- end if
- mixf(region)%f2d(i)%varid = varid
- end do
- call MDF_EndDef( mixf(region)%funit, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- end if
- end do regionloop ! nregions
- call goLabel() ; status = 0
- end subroutine output_general_init
- !EOC
- !--------------------------------------------------------------------------
- ! TM5 !
- !--------------------------------------------------------------------------
- !BOP
- !
- ! !IROUTINE: OUTPUT_GENERAL_DONE
- !
- ! !DESCRIPTION: Free parameters.
- !\\
- !\\
- ! !INTERFACE:
- !
- subroutine output_general_done(status, iregion)
- !
- ! !USES:
- use chem_param, only : ntracet,ntrace
- !
- ! !INPUT PARAMETERS:
- !
- !logical, intent(in) :: stat_output ! true if stations output is requested
- integer, intent(in), optional :: iregion
- !
- ! !OUTPUT PARAMETERS:
- !
- integer, intent(out) :: status
- !
- ! !REVISION HISTORY:
- ! 29 Nov 2010 - Achim Strunk -
- !
- ! !REMARKS:
- !
- !EOP
- !------------------------------------------------------------------------
- !BOC
- character(len=*), parameter :: rname = mname//'/output_general_done'
-
- integer :: i, region
-
- ! --- begin -------------------------------------
- call goLabel(rname)
- deallocate( wdep_out )
- regionloop: do region = 1, nregions
- ! if region given, cycle if other region!
- if (present(iregion)) then
- if(iregion /= region) cycle regionloop
- endif
- do i=1,ntracer_3d
- deallocate( mixf(region)%f3d(i)%field )
- end do
- do i=1,ntracer_2d
- deallocate( mixf(region)%f2d(i)%field )
- end do
- deallocate( gas_output)
- deallocate( mixf (region)%f3d )
- deallocate( mixf (region)%f2d )
- deallocate( drydepos(region)%f2dslast )
- deallocate( wetdepos(region)%f2dslast )
- deallocate( emission(region)%f2dslast )
-
- end do regionloop
- if (nCCNdiag) deallocate(ind_CCN)
-
- call goLabel() ; status = 0
- end subroutine output_general_done
- !EOC
- !--------------------------------------------------------------------------
- ! TM5 !
- !--------------------------------------------------------------------------
- !BOP
- !
- ! !IROUTINE: output_general_write
- !
- ! !DESCRIPTION: This routines builds the average by dividing accumulated
- ! data by stack counter. The results are written to file.
- !\\
- !\\
- ! !INTERFACE:
- !
- subroutine output_general_write(region, status)
- !
- ! !USES:
- !
- use chem_param, only : ntracet,ntrace
- use dims,only:itau
- use datetime, only : tau2date, date2tau
- use partools , only : isRoot,myid
- use tm5_distgrid, only : dgrid, Get_DistGrid ,gather
- ! !INPUT PARAMETERS:
- !
- integer, intent(in) :: region
- !logical, intent(in) :: stat_output ! true if stations output is requested
- !
- ! !OUTPUT PARAMETERS:
- !
- integer, intent(out) :: status
- !
- ! !REVISION HISTORY:
- ! 29 Nov 2010 - Achim Strunk -
- !
- ! !REMARKS:
- !
- !EOP
- !------------------------------------------------------------------------
- !BOC
- character(len=*), parameter :: rname = mname//'/output_general_write'
- integer :: i, imr, jmr, lmr
- integer :: i1, i2, j1, j2, ilev
- integer :: istat
- !collection output data holders
- real, allocatable :: arr3d(:,:,:) , arr2d(:,:)
- ! Time definitions for General
- real :: reftime
- integer(kind=8) :: itauref
- integer :: time_shift
- ! --- begin -------------------------------------
- call goLabel(rname)
- ! grid size
- call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
- imr = i2-i1+1
- jmr = j2-j1+1
- lmr = levi%nlev
- ! entire region grid size
- imr = global_lli(1)%nlon
- jmr = global_lli(1)%nlat
- lmr = levi%nlev
- ! this here is already accumulated over the time period (day)
- call collect_budgets( region, status )
- IF_NOTOK_RETURN(status=1)
- ! ---------------------
- ! divide by accumulator
- ! ---------------------
- ! WRITE(*,*) 'ACCUMULATOR = ', mixf(region)%acct
- do i = 1, n_3d_vars!ntracer_3d
- mixf(region)%f3d(i)%field = mixf(region)%f3d(i)%field / real( mixf(region)%acct )
- end do
- do i = 1, ntracer_2d
- mixf(region)%f2d(i)%field = mixf(region)%f2d(i)%field / real( mixf(region)%acct )
- end do
- select case (trim(gen_freq))
- case ('hourly')
- write(gol,'("---> GENERAL diagnostics: write file for previous hour")'); call goPr
- case ('daily')
- write(gol,'("---> GENERAL diagnostics: write file for previous day")'); call goPr
- case ('monthly')
- write(gol,'("---> GENERAL diagnostics: write file for previous month")'); call goPr
- end select
- ! -------------
- ! write to file
- ! -------------
- ! Ncfile needs a timestep
-
- ! define the reference time
- ! time (for now in days since 2001-01-01 00:00)
- call date2tau( time_reftime6, itauref )
- ! calculate reftime as fractional days from itauref, hence division by 86400
- !call date2tau( idater, itaucur )
- if (trim(gen_freq)=='hourly') then
- ! if average period is hour move the timestamp 30 min back
- time_shift=30*60
- else if (trim(gen_freq)=='daily') then
- ! if average period is hour move the timestamp 30 min back
- time_shift = 12*60*60
- else if (trim(gen_freq)=='monthly') then
- ! assume 30 day months
- time_shift=15*60*60*24
- end if
- reftime = (itau - itauref-time_shift) / 86400.
- !reftime = (itau - itauref) / 86400.
- !Add time stamp to current
- !Currently only allows 1 step per file, needs to be extended
- ! allocate 3D and 4D global arrays for gathering data
- if (isRoot) then
- allocate( arr3d(imr,jmr,lmr) )
- allocate( arr2d(imr,jmr) )
- else
- ! other than root need the variable, but no space
- allocate( arr3d(1,1,1) )
- allocate( arr2d(1,1) )
- endif
- arr2d(:,:)=0.0
- arr3d(:,:,:)=0.0
- !if (isroot) write(1000,*)shape(arr2d),shape(mixf(region)%f2d(1)%field)
- do i=1,ntracer_2d
- !if (isroot) write(1001,*)i,shape(mixf(region)%f2d(i)%field)
- call gather( dgrid(1), mixf(region)%f2d(i)%field , arr2d(:,:), 0, status)
- IF_NOTOK_RETURN(status=1)
- if (isroot)call MDF_Put_Var( mixf(region)%funit, mixf(region)%f2d(i)%varid, arr2d(:,:), status, start=(/1,1,1/), count=(/imr,jmr,1/) )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- arr2d(:,:)=0.0
- end do
- do i=1,n_3d_vars!ntracer_3d
- call gather( dgrid(1), mixf(region)%f3d(i)%field , arr3d(:,:,:), 0, status)
- !write(1111,*) mixf(region)%f3d(i)%mf%vname,imr,jmr,lmr, mixf(region)%nlev,mixf(region)%nlat,mixf(region)%nlon
- if (isroot)call MDF_Put_Var( mixf(region)%funit, mixf(region)%f3d(i)%varid,arr3d(:,:,:) , status, start=(/1,1,1,1/), count=(/imr,jmr,lmr,1/) )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- arr3d(:,:,:)=0.0
- end do
- !call MDF_Var_Par_Access( mixf(region)%funit, mixf(region)%time_varid, MDF_INDEPENDENT, status )
- !IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- ! Write current reftime
- if (isroot) then
- call MDF_Put_Var( mixf(region)%funit, mixf(region)%time_varid,(/reftime/), status, start=(/1/),count=(/1/))
- IF_NOTOK_MDF(fid=mixf(region)%funit)
-
- call MDF_Close( mixf(region)%funit, status )
- IF_NOTOK_MDF(fid=mixf(region)%funit)
- end if
- call goLabel() ; status = 0
- end subroutine output_general_write
- !EOC
- !--------------------------------------------------------------------------
- ! TM5 !
- !--------------------------------------------------------------------------
- !BOP
- !
- ! !IROUTINE: OUTPUT_GENERAL_STEP
- !
- ! !DESCRIPTION: This is the accumulation routine. It is called following
- ! the user specification general.dhour in rc-file. It
- ! evaluates the various diagnostics and does summing.
- !\\
- !\\
- ! !INTERFACE:
- !
- subroutine output_general_step( region, dhour, status )
- !
- ! !USES:
- !
- use GO , only : TDate, NewDate, rTotal, operator(-), GO_Timer_Def, GO_Timer_End, GO_Timer_Start
- use Grid , only : FPressure
- use binas, only : rgas, rol,pi
- use datetime, only : tau2date
- use MeteoData, only : sp_dat, lsp_dat, cp_dat, m_dat
- use MeteoData, only : temper_dat, humid_dat, gph_dat
- use global_data, only : mass_dat, region_dat
- use tracer_data, only : chem_dat
- use dims, only : itaur
- use chemistry, only : d_nucle, m_nucle_su, m_nucle_soa, growth1_2, coag_sink_nuc, cond1_soa, cond1_su
- use chemistry, only : cond2_soa, cond3_soa, cond4_soa, cond5_soa
- use chem_param, only : iso4acs, iso4cos, iduacs, iso4ais, ibccos, ibcaii, xmair
- use chem_param, only : iso4nus, isscos, ino3_a, issacs, iducos, iduaci, nmod
- use chem_param, only : iducoi, ibcacs, ipomcos, ipomaii, ibcais, ipomacs, ipomais,isoanus
- use chem_param, only : isoaais, isoaacs, isoacos, isoaaii
- use chem_param, only : imsa, inh4
- use chem_param, only : inus_n,iacs_n,icos_n,iais_n,iaii_n,iaci_n,icoi_n
- use chem_param, only : ntracet,ntrace
- use chem_param, only : mode_end_pom,mode_end_so4,mode_end_ss,mode_end_bc,mode_end_dust,mode_end_soa
- use mo_aero_m7, only : nsol,nmod,dnacl,doc,dh2so4,dbc,ddust
- use optics, only : optics_aop_get
- use m7_data, only : h2o_mode, rw_mode, rwd_mode
- use ebischeme, only : diag_prod
- !
- ! !INPUT PARAMETERS:
- !
- integer, intent(in) :: region
- integer, intent(in) :: dhour ! this is general.dhour [hours]
- !logical, intent(in) :: stat_output ! true if stations output is requested
- !
- ! !OUTPUT PARAMETERS:
- !
- integer, intent(out) :: status
- !
- ! !REVISION HISTORY:
- ! 29 Nov 2010 - Achim Strunk - Creation
- !
- ! !REMARKS:
- !
- !EOP
- !------------------------------------------------------------------------
- !BOC
- character(len=*), parameter :: rname = mname//'/output_general_step'
- ! MPI arrays to gather fields.
- real, dimension(:,:,:,:), pointer :: rm, rmc
- real, dimension(:,:,:), allocatable, target :: mg
- real, dimension(:), pointer :: dxyp
- real, dimension(:,:,:), allocatable :: pres3d
- integer :: i, j, k, imr, jmr, lmr, lwl, dtime, iSat
- integer :: i1, i2, j1, j2
- integer :: ie, je ! indices for subdomain extended with halo cells
- integer, parameter :: l_halo=1
- logical :: polar
- integer :: istat, imode
- real :: dens, load_tmp
- integer :: rwetcounter,h2ocounter,rdrycounter
- Real, Dimension(:,:,:), Allocatable :: aop_output_ext ! extinctions
- Real, Dimension(:,:), Allocatable :: aop_output_a ! single scattering albedo
- Real, Dimension(:,:), Allocatable :: aop_output_g ! assymetry factor
- Real, Dimension(:,:,:), Allocatable :: aop_output_add ! additional parameters
- real, dimension(:,:,:,:,:), allocatable :: opt_ext
- real, dimension(:,:,:,:), allocatable :: opt_a
- real, dimension(:,:,:,:), allocatable :: opt_g
- real, dimension(:,:,:,:,:), allocatable :: opt_add
- real, dimension(:,:,:), allocatable :: volume
- real, dimension(:,:), allocatable :: temp2d
- real, dimension(:,:,:,:), allocatable :: CCN
- real, dimension(:,:,:,:), allocatable :: dry_rad
- integer :: ncontr, lvec, lct, l, indoffset, nwl,nn,irw,irwd
- integer :: nadd, nadd_max, indoffset_stat, indabs
- integer :: iadd
- real :: no3fac, wght, dwght, tabs
- integer,dimension(6) :: idate_f
- type(TDate) :: t, t0
- real :: time
- ! --- begin -------------------------------
- call goLabel(rname)
- ! grid size
- call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2, hasNorthPole=polar )
- imr = i2-i1+1
- jmr = j2-j1+1
- lmr = levi%nlev
- ! link the datastructures for transported and non transported variables and
- ! Gridbox area
- nullify(rmc)
- rmc => chem_dat(region)%rm
- dxyp => region_dat(region)%dxyp
- rm => mass_dat(region)%rm
- ! get helping pressure field in 3d
- ie=i2; je=j2
-
- allocate( pres3d(i1:ie,j1:je,lmr) )
- ! fill mid level pressure
- call FPressure( levi, sp_dat(region)%data(i1:ie,j1:je,1), pres3d, status )
- IF_NOTOK_RETURN(status=1)
- allocate( CCN(nSat,i1:ie,j1:je,lmr))
- allocate( dry_rad(nsol,i1:ie,j1:je,lmr))
- 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))
- ! dtime is seconds per step
- ! dtime will be taken as weight for summing up
- ! (makes it fit for varying step lengths)
- dtime = dhour * 3600.
- !WRITE(*,*) 'DTIME = ', dtime
- ! sum up for later averaging
- mixf (region)%acct = mixf (region)%acct + dtime
-
- ! ----------------------
- ! 3D meteo fields
- ! ----------------------
- temp=1
- hus=2
- airmass=3
- pressure=4
- ! temperature
- mixf(region)%f3d(temp)%field = mixf(region)%f3d(temp)%field + dtime * temper_dat(region)%data(i1:i2,j1:j2,:)
- ! specific humidity
- mixf(region)%f3d(hus)%field = mixf(region)%f3d(hus)%field + dtime * humid_dat(region)%data(i1:i2,j1:j2,:)
- ! air mass (kg -> kg/m2)
- do j = j1, j2
- mixf(region)%f3d(airmass)%field(:,j,:) = mixf(region)%f3d(airmass)%field(:,j,:) + &
- dtime * m_dat(region)%data(i1:i2,j,:) / dxyp(j)
- end do
- ! pressure (already filled above)
- mixf(region)%f3d(pressure)%field = mixf(region)%f3d(pressure)%field + dtime * pres3d
-
- do k=1,lmr
- do j=j1,j2
- do i=i1,i2
- dens = pres3d(i,j,k) / temper_dat(region)%data(i,j,k) * xmair * 1.E-3 / (m_dat(region)%data(i,j,k) * Rgas)
- 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)
- 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)
- 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)
- 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)
-
- 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
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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
- 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
- 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-
- 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
- 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
- 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?
- 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?
- 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?
- 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?
- 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?
- 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?
- ! CCN under given supersaturation
- IF (nCCNdiag) THEN
- DO iSat=1,nSat
- mixf(region)%f3d(ind_CCN(iSat))%field(i,j,k)= mixf(region)%f3d(ind_CCN(iSat))%field(i,j,k) + dtime * &
- dens * 1.e-06 * CCN(iSat,i,j,k) ! cm-3
- ENDDO
- ENDIF
- mixf(region)%f3d(gph)%field(i,j,k) = mixf(region)%f3d(gph)%field(i,j,k) + gph_dat(region)%data(i,j,k)*dtime
- ! rwet, rdry, h2o data holder indices go from 1-4/7
- ! so use counters, could also add modeindex in mixf
- rwetcounter=1
- rdrycounter=1
- h2ocounter=1
-
- do nn=1,n_3d_vars
-
- if (mixf(region)%f3d(nn)%mf%itm5>0)then
- ! transported variables in rm
- if (mixf(region)%f3d(nn)%mf%itm5<=ntracet) then
- mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
- dens * rm(i,j,k,mixf(region)%f3d(nn)%mf%itm5)
- else !non transported variables in rmc
- mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
- dens * rmc(i,j,k,mixf(region)%f3d(nn)%mf%itm5)
- end if
-
- else ! not a tracer variable
- ! counter to go through 7 modes when outputing rwet
- ! requires that rwet variables are in right order
- ! Wet radius of particles
- if ( mixf(region)%f3d(nn)%mf%vname(1:4)=='RWET')then
- mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
- rw_mode(region,rwetcounter)%d3(i,j,k)
- rwetcounter=rwetcounter+1
- end if
- ! aerosol water
- if ( mixf(region)%f3d(nn)%mf%vname(1:6)=='aerh2o')then
- mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
- dens*h2o_mode(region,h2ocounter)%d3(i,j,k)
-
- h2ocounter=h2ocounter+1
- end if
-
- !dry radius of soluble modes
- if ( mixf(region)%f3d(nn)%mf%vname(1:4)=='RDRY')then
- mixf(region)%f3d(nn)%field(i,j,k) = mixf(region)%f3d(nn)%field(i,j,k) + dtime * &
- rwd_mode(region,rdrycounter)%d3(i,j,k)
- rdrycounter=rdrycounter+1
- end if
- end if
- end do
- end do
- end do
- end do
- ! set fields summed in chemistry to 0 after writing
- d_nucle = 0.
- m_nucle_su = 0.
- m_nucle_soa = 0.
- diag_prod(region)%prod(i1:i2,j1:j2,:,1)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,2)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,3)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,4)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,5)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,6)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,7)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,8)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,9)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,10)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,11)=0.0
- diag_prod(region)%prod(i1:i2,j1:j2,:,12)=0.0
- coag_sink_nuc = 0.
- growth1_2 = 0.
- cond1_soa = 0.
- cond2_soa = 0.
- cond3_soa = 0.
- cond4_soa = 0.
- cond5_soa = 0.
- cond1_su = 0.
- ! ----------------------
- ! cycle over horizontal domain
- ! ----------------------
- do j = j1, j2
- do i = i1, i2
- ! -----------------------
- ! SURFACE FIELDS
- ! -----------------------
- k = 1
- ! ----------------------
- ! Physical Parameters
- ! ----------------------
- ! surface pressure [Pa]
- mixf(region)%f2d(ps)%field(i,j) = mixf(region)%f2d(ps)%field(i,j) + dtime * sp_dat(region)%data(i,j,k)
- ! precipitation ([m s-1] --> [kg m-2 s-1] with density of water `rol`)
- 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
- ! density for conversion of aerosol mass densities ( ---> 1/m3 )
- ! (conversion factor 1.E-03 is for g --> kg)
- dens = pres3d(i,j,k) / temper_dat(region)%data(i,j,k) * xmair * 1.E-3 / (m_dat(region)%data(i,j,k) * Rgas)
- ! ----------------------
- ! Surface Concentrations in [kg m-3]
- ! ----------------------
- !TB added nucleation mode oc
- ! POM: (AIS + ACS + COS + AII)
- mixf(region)%f2d(sconcoa)%field(i,j) = mixf(region)%f2d(sconcoa)%field(i,j) + dtime * &
- dens * (rm(i,j,k,iPOMais) + rm(i,j,k,iPOMacs) + rm(i,j,k,iPOMcos) + rm(i,j,k,iPOMaii))
- ! SOA: (NUS + AIS + ACS + COS + AII)
- mixf(region)%f2d(sconcsoa)%field(i,j) = mixf(region)%f2d(sconcsoa)%field(i,j) + dtime * &
- 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))
- ! BC: (AIS + ACS + COS + AII)
- mixf(region)%f2d(sconcbc)%field(i,j) = mixf(region)%f2d(sconcbc)%field(i,j) + dtime * &
- dens * (rm(i,j,k,iBCais) + rm(i,j,k,iBCacs) + rm(i,j,k,iBCcos) + rm(i,j,k,iBCaii))
- ! SO4: (NUS + AIS + ACS + COS)
- mixf(region)%f2d(sconcso4)%field(i,j) = mixf(region)%f2d(sconcso4)%field(i,j) + dtime * &
- dens * (rm(i,j,k,iSO4nus) + rm(i,j,k,iSO4ais) + rm(i,j,k,iSO4acs) + rm(i,j,k,iSO4cos))
- ! Dust:
- mixf(region)%f2d(sconcdust)%field(i,j) = mixf(region)%f2d(sconcdust)%field(i,j) + dtime * &
- dens * (rm(i,j,k,iDUacs) + rm(i,j,k,iDUcos) + rm(i,j,k,iDUaci) + rm(i,j,k,iDUcoi))
- ! Seasalt:
- mixf(region)%f2d(sconcss)%field(i,j) = mixf(region)%f2d(sconcss)%field(i,j) + dtime * &
- dens * (rm(i,j,k,iSSacs) + rm(i,j,k,iSScos))
- ! NO3:
- mixf(region)%f2d(sconcno3)%field(i,j) = mixf(region)%f2d(sconcno3)%field(i,j) + dtime * &
- dens * rm(i,j,k,iNO3_a)
- ! NH4:
- mixf(region)%f2d(sconcnh4)%field(i,j) = mixf(region)%f2d(sconcnh4)%field(i,j) + dtime * &
- dens * rm(i,j,k,iNH4)
- ! MSA:
- mixf(region)%f2d(sconcmsa)%field(i,j) = mixf(region)%f2d(sconcmsa)%field(i,j) + dtime * &
- dens * rm(i,j,k,iMSA)
- ! Mass concentrations
- do nn=68,90
- mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) + dtime * &
- dens * rm(i,j,k,mixf(region)%f2d(nn)%mf%itm5)
- end do
- !number concentrations
- do nn=91,97
- mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) + dtime * &
- dens * rm(i,j,k,mixf(region)%f2d(nn)%mf%itm5)
- end do
- !h2o
- h2ocounter=0
- do nn=98,101
- h2ocounter=h2ocounter+1
- mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) + dtime * &
- dens * h2o_mode(region,h2ocounter)%d3(i,j,k)!rm(i,j,k,mixf(region)%f2d(nn)%mf%itm5)
- end do
- ! RWET for all modes (RDRY=RWET for non-soluble)
- !
- irw=0
- do nn=102,108
- !
- irw=irw+1
- mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) +dtime *rw_mode(region,irw)%d3(i,j,k)
- end do
- ! RDRY for soluble modes
- irwd=0
- do nn=109,112
- irwd=irwd+1
- mixf(region)%f2d(nn)%field(i,j) = mixf(region)%f2d(nn)%field(i,j) +dtime *rwd_mode(region,irwd)%d3(i,j,k)
- end do
- ! ----------------------
- ! Load in [kg m-2]
- ! ----------------------
- do k = 1, lmr
- !do ll=1,len(load)
- ! POM: (AIS + ACS + COS + AII)
- load_tmp=0.0
- do nn=1,7
-
- if (mode_end_pom(nn)>0) then
- load_tmp = load_tmp+ rm(i,j,k,mode_end_pom(nn))
- !(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))
- end if
- end do
- mixf(region)%f2d(loadoa)%field(i,j) = mixf(region)%f2d(loadoa)%field(i,j) + load_tmp * dtime / dxyp(j)
- ! SOA: (NUS + AIS + ACS + COS + AII)
- load_tmp=0.0
- do nn=1,7
-
- if (mode_end_soa(nn)>0) then
- load_tmp = load_tmp+ rm(i,j,k,mode_end_soa(nn))
- ENDIF
- end do
- mixf(region)%f2d(loadsoa)%field(i,j) = mixf(region)%f2d(loadsoa)%field(i,j) + load_tmp * dtime / dxyp(j)
- ! BC: (AIS + ACS + COS + AII)
- load_tmp=0.0
- do nn=1,7
-
- if (mode_end_bc(nn)>0) then
- load_tmp = load_tmp+ rm(i,j,k,mode_end_bc(nn))
- !load_tmp = (rm(i,j,k,iBCais) + rm(i,j,k,iBCacs) + rm(i,j,k,iBCcos) + rm(i,j,k,iBCaii))
- end if
- end do
- mixf(region)%f2d(loadbc)%field(i,j) = mixf(region)%f2d(loadbc)%field(i,j) + load_tmp * dtime / dxyp(j)
- ! SO4: (NUS + AIS + ACS + COS)
- load_tmp=0.0
- do nn=1,7
-
- if (mode_end_so4(nn)>0) then
- load_tmp = load_tmp+ rm(i,j,k,mode_end_so4(nn))
- !load_tmp = (rm(i,j,k,iSO4nus) + rm(i,j,k,iSO4ais) + rm(i,j,k,iSO4acs) + rm(i,j,k,iSO4cos))
- end if
- end do
- mixf(region)%f2d(loadso4)%field(i,j) = mixf(region)%f2d(loadso4)%field(i,j) + load_tmp * dtime / dxyp(j)
- ! Dust: (ACS + COS + ACI + COI)
- load_tmp=0.0
- do nn=1,7
-
- if (mode_end_dust(nn)>0) then
- load_tmp = load_tmp+ rm(i,j,k,mode_end_dust(nn))
- !load_tmp = (rm(i,j,k,iDUacs) + rm(i,j,k,iDUcos) + rm(i,j,k,iDUaci) + rm(i,j,k,iDUcoi))
- end if
- end do
- mixf(region)%f2d(loaddust)%field(i,j) = mixf(region)%f2d(loaddust)%field(i,j) + load_tmp * dtime / dxyp(j)
- ! Seasalt: (ACS + COS)
- load_tmp=0.0
- do nn=1,7
-
- if (mode_end_ss(nn)>0) then
- load_tmp = load_tmp+ rm(i,j,k,mode_end_ss(nn))
- !load_tmp = (rm(i,j,k,iSSacs) + rm(i,j,k,iSScos))
- end if
- end do
- mixf(region)%f2d(loadss)%field(i,j) = mixf(region)%f2d(loadss)%field(i,j) + load_tmp * dtime / dxyp(j)
- !!$
- ! NO3:
- load_tmp = rm(i,j,k,iNO3_a)
- mixf(region)%f2d(loadno3)%field(i,j) = mixf(region)%f2d(loadno3)%field(i,j) + load_tmp * dtime / dxyp(j)
- !!$
- end do ! k
- end do ! i
- end do ! j
- !!$
-
-
- call GO_Timer_Start( itim_opt_out, status )
- IF_NOTOK_RETURN(status=1)
- ! ---------------------
- ! DO OPTICS IN PARALLEL
- ! ---------------------
- ! steps needed for that:
- ! 1) according to the parallelisation there is different container sizes for
- ! the results of the optics; these have to be allocated correctly
- ! (aop_output_ext/a/g/add)
- ! 2) the optics code is called (init/calculate_aop/done), see documentation
- ! in the optics module
- ! 3) the distributed fields (levels/tracers) are reshaped to global fields
- ! (opt_ext/a/g/add), according to parallelisation
- ! 4) fields are communicated such that the result contains the right
- ! total extinctions, albedos, asymmetry factors etc.
- ! 5) post-calculations (AOD etc.) are done and results are written
- ! to mixf%../statf% containers as well as to the AOD dump files
- ! 6) done...
- ! ------------ REMARKS
- ! IMPOSSIBLE / TOO EXPENSIVE (from the GENERAL list of parameters for QUICKLOOK)
- ! - gf @ 90% RH
- ! - "AOD@550nm SOA", "AOD@550nm BB"
- ! ---------------------------------
- ! fill current M7 state into an appropriate container
- ! and allocate output fields (ext,a,g)
- ! ---------------------------------
- ! ----- A T T E N T I O N ---------
- ! in case for a 'split', we need a field big enough to contain
- ! various contributions
- ! (to be synchronously changed with optics_aop_calculate!!)
- ! ncontr is here number of contributors
- ! Total, SO4, BC, OC, SS, DU, NO3, Water, Fine, Fine Dust, Fine SS
- !ncontr = 10
- !ncontr = 11
- ncontr = 12
- ! Additional fields for surface dry aerosol
- ! to be used for validation against in-situ data:
- ! extinction, absorption, asymmetry factor
- ! fine-mode contribution to extinction, absorption
- nadd = 5
- lvec = imr*jmr*lmr
- ! allocate output fields for optics_calculate_aop
- Allocate( aop_output_ext(lvec, size(wdep_out), ncontr ) ) ! extinction
- Allocate( aop_output_a (lvec, size(wdep_out) ) ) ! single scattering albedo
- Allocate( aop_output_g (lvec, size(wdep_out) ) ) ! asymmetry factor
- Allocate( aop_output_add(lvec, size(wdep_out), nadd ) ) ! extinction/absorption due to dry aerosol at surface
- call optics_aop_get(lvec, region, size(wdep_out), wdep_out, ncontr, .false., &
- aop_output_ext, aop_output_a, aop_output_g, status, aop_output_add )
- IF_NOTOK_RETURN(status=1)
- ! allocate here result arrays for ext, abs, ssa, asymmetry parameter, additional parameters (PM10)
- ! ncontr is number of contributors for 'split'
- allocate( opt_ext( i1:i2, j1:j2, lmr, size(wdep_out), ncontr ) ) ; opt_ext = 0.0
- allocate( opt_a ( i1:i2, j1:j2, lmr, size(wdep_out) ) ) ; opt_a = 0.0
- allocate( opt_g ( i1:i2, j1:j2, lmr, size(wdep_out) ) ) ; opt_g = 0.0
- allocate( opt_add( i1:i2, j1:j2, lmr, size(wdep_out), nadd ) ) ; opt_add = 0.0
- ! ---------------------------------
- ! unpack results from calculate_aop
- ! ---------------------------------
- do lwl = 1, size(wdep_out)
- if( wdep_out(lwl)%split ) then
- ! fill the array for the extinction coefficients of contributors
- do lct = 1, ncontr
- opt_ext(:,:,:,lwl,lct) = reshape( aop_output_ext(:,lwl,lct), (/imr,jmr,lmr/) )
- end do
- else
- ! fill only total extinction coefficients
- opt_ext(:,:,:,lwl,1) = reshape( aop_output_ext(:,lwl,1), (/imr,jmr,lmr/) )
- endif
- opt_a(:,:,:,lwl) = reshape( aop_output_a(:,lwl),(/imr,jmr,lmr/) )
- opt_g(:,:,:,lwl) = reshape( aop_output_g(:,lwl),(/imr,jmr,lmr/) )
- if ( wdep_out(lwl)%insitu ) then
- ! additional fields for split
- do lct = 1, nadd
- opt_add(i1:i2,j1:j2,:,lwl,lct) = reshape( aop_output_add(:,lwl,lct),(/imr,jmr,lmr/) )
- end do
- endif
- end do ! lwl
- ! free temporary arrays for results from calculate_aop
- deallocate( aop_output_ext )
- deallocate( aop_output_a )
- deallocate( aop_output_g )
- deallocate( aop_output_add )
- ! the following sections assume that for 550nm there is splitted information
- ! available and that there is *NO* split for other wavelengths!
- if( count( (wdep_out(:)%wl == 0.550) .and. wdep_out(:)%split ) /= 1 ) then
- write(gol,*) 'user_output_general: wrong setup with splitted AOD information.'; call goErr
- TRACEBACK
- status=1; return
- end if
- ! -------------------------------------
- ! here additional calculations and
- ! file writing begin
- ! -------------------------------------
- ! cycle over wavelengths
- do lwl = 1, size(wdep_out)
- if( wdep_out(lwl)%split ) then
- ! for 550nm:
- ! 1) AODs (35 - 44)
- ! fill for contributors (total, SO4, BC, POM, SS, DU, NO3, H2O, fine, fine dust, fine SS)
- ! 2) Absorption for 550nm (45)
- ! Extinction is here the sum of scattering and absorption and
- ! the scattering part is given by the albedo (SSA). Thus the
- ! remainder is absorption: Abs = Ext * (1 - SSA)
- indoffset = od550aer
- allocate(temp2d(i1:i2,j1:j2))
- do lct = 1, ncontr
- temp2d = 0.0
- do j = j1, j2
- do i = i1, i2
- ! multiply with height elements and sum up
- tabs = 0.0
- do l = 1, lmr
- temp2d(i,j) = temp2d(i,j) + opt_ext(i,j,l,lwl,lct) * &
- (gph_dat(region)%data(i,j,l+1) - &
- gph_dat(region)%data(i,j,l ))
- if( lct == 1 ) then
- ! Absorption: do this only once for the totals
- tabs = tabs + opt_ext(i,j,l,lwl,lct) * (1.0 - opt_a(i,j,l,lwl)) * &
- (gph_dat(region)%data(i,j,l+1) - gph_dat(region)%data(i,j,l))
- end if
- end do
- ! Absorption: do this only once for the totals
- if( lct == 1 ) then
- mixf(region)%f2d(abs550aer)%field(i,j) = &
- mixf(region)%f2d(abs550aer)%field(i,j) + tabs * dtime
- end if
- end do
- end do
- ! this here is AODs for different contributors, splitted by volumes
- mixf(region)%f2d(indoffset+lct-1)%field = &
- mixf(region)%f2d(indoffset+lct-1)%field + temp2d * dtime
- end do
- deallocate( temp2d )
- ! Asymmetry Parameter, weighted by AOD and single scattering albedo at each layer
- allocate(temp2d(i1:i2,j1:j2)) ; temp2d = 0.0
- do j = j1, j2
- do i = i1, i2
- wght = 0.0
- do l = 1, lmr
- 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)
- temp2d(i,j) = temp2d(i,j) + opt_g(i,j,l,lwl) * dwght
- wght = wght + dwght
- end do
- temp2d(i,j) = temp2d(i,j) / wght
- end do
- end do
- mixf(region)%f2d(asyaer)%field = mixf(region)%f2d(asyaer)%field + temp2d * dtime
- deallocate(temp2d)
-
- ! Surface Ambient Aerosol Extinction
- mixf(region)%f2d(ec550aer)%field = &
- mixf(region)%f2d(ec550aer)%field + opt_ext(:,:,1,lwl,1) * dtime
- else
- ! for 440/870/350 nm:
- ! 1) fill total AOD and AAOD and write to containers
- ! 2) dump AOD fields
- if ( wdep_out(lwl)%wl == 0.440 ) then
- indoffset = od440aer
- indabs = abs440aer
- elseif ( wdep_out(lwl)%wl == 0.550 ) then
- indoffset = od550aer
- indabs = abs550aer
- elseif ( wdep_out(lwl)%wl == 0.870 ) then
- indoffset = od870aer
- indabs = abs870aer
- elseif ( wdep_out(lwl)%wl == 0.350 ) then
- indoffset = od350aer
- indabs = abs350aer
- else
- write(gol,*) 'user_output_general: wrong wavelength given for general diagnostics' ; call goErr
- TRACEBACK
- status=1; return
- end if
- ! fill AODs
- allocate(temp2d(i1:i2,j1:j2))
- temp2d = 0.0
- do j = j1, j2
- do i = i1, i2
- ! multiply with height elements and sum up
- tabs = 0.0
- do l = 1, lmr
- temp2d(i,j) = temp2d(i,j) + opt_ext(i,j,l,lwl,1) * &
- (gph_dat(region)%data(i,j,l+1) - &
- gph_dat(region)%data(i,j,l ))
- tabs = tabs + opt_ext(i,j,l,lwl,1) * (1.0 - opt_a(i,j,l,lwl)) * &
- (gph_dat(region)%data(i,j,l+1) - gph_dat(region)%data(i,j,l))
- end do
- mixf(region)%f2d(indabs)%field(i,j) = &
- mixf(region)%f2d(indabs)%field(i,j) + tabs * dtime
- end do
- end do
- ! write to container
- mixf(region)%f2d(indoffset)%field = &
- mixf(region)%f2d(indoffset)%field + temp2d * dtime
- deallocate(temp2d)
- endif
- ! 3-D extinction and absorption (m-1)
- if ( aai_output ) then
- if ( wdep_out(lwl)%wl == 0.550 .or. wdep_out(lwl)%wl == 0.350 ) then
- if ( wdep_out(lwl)%wl == 0.550 ) then
- indoffset = ec5503Daer
- elseif ( wdep_out(lwl)%wl == 0.350 ) then
- indoffset = ec3503Daer
- endif
- mixf(region)%f3d(indoffset)%field = &
- mixf(region)%f3d(indoffset)%field + opt_ext(:,:,:,lwl,1) * dtime
- mixf(region)%f3d(indoffset+1)%field = &
- mixf(region)%f3d(indoffset+1)%field + opt_ext(:,:,:,lwl,1) * (1.0 - opt_a(:,:,:,lwl)) * dtime
- endif
- endif
- end do
- ! done
- deallocate( opt_ext, opt_a, opt_g, opt_add )
- nullify(rm)
- nullify(dxyp)
- deallocate( pres3d )
- deallocate( CCN )
- call GO_Timer_End( itim_opt_out, status )
- IF_NOTOK_RETURN(status=1)
- call goLabel() ; status = 0
- end subroutine output_general_step
- !EOC
- !--------------------------------------------------------------------------
- ! TM5 !
- !--------------------------------------------------------------------------
- !BOP
- !
- ! !IROUTINE: COLLECT_BUDGETS
- !
- ! !DESCRIPTION: This routine does book keeping of the budget values in
- ! order to extract daily contributions to
- ! emissions / dry deposition / wet deposition.
- !\\
- !\\
- ! !INTERFACE:
- !
- subroutine collect_budgets(region, status)
- !
- ! !USES:
- !
- #ifndef without_chemistry
- use ebischeme, only : buddry_dat => buddep_dat
- #endif
- use wet_deposition, only : buddep_dat
- use emission_data, only : budemi_dat
- use budget_global, only : nbud_vg
- use global_data, only : region_dat
- use chem_param, only : iducoi, iduacs, iducos, iduaci, isscos, issacs
- use chem_param, only : ibccos, ibcaii, ibcacs, ibcais, ino3_a, xmair
- use chem_param, only : iso4nus, iso4acs, iso4cos, iso4ais
- use chem_param, only : ipomcos, ipomaii, ipomacs, ipomais
- use chem_param, only : isoacos, isoaaii, isoaacs, isoaais, isoanus
- use chem_param, only : idms, iso2, ntracet, ntrace,iterp,iisop
- use chem_param, only : xmso2, xmso4, xmdms, xmpom, xmbc, xmdust, xmnacl,xmterp,xmisop
- #ifndef without_sedimentation
- use sedimentation, only : buddep_m7_dat
- use sedimentation, only : nsed, ised
- #endif
- !
- ! !INPUT PARAMETERS:
- !
- integer, intent(in) :: region
- !
- ! !OUTPUT PARAMETERS:
- !
- integer, intent(out) :: status
- !
- ! !REVISION HISTORY:
- ! 29 Nov 2010 - Achim Strunk -
- !
- ! !REMARKS:
- !
- !EOP
- !------------------------------------------------------------------------
- !BOC
- character(len=*), parameter :: rname = mname//'/collect_budgets'
- real, dimension(:,:,:,:), allocatable :: collect4d
- real, dimension(:,:,:), allocatable :: collect3d
- real, dimension(:,:), allocatable :: tmpbud2d
- real, dimension(:), pointer :: dxyp
- integer :: imr, jmr, lmr, j
- integer :: i1, i2, j1, j2
- integer :: l, n
- ! --- begin -------------------------------
- call goLabel(rname)
-
- ! grid size
- call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
- imr=i2-i1+1
- jmr=j2-j1+1
- lmr = levi%nlev
- ! this is area element
- dxyp => region_dat(region)%dxyp
- ! --------------
- ! EMISSIONS
- ! --------------
- ! collect emission budget
- allocate( collect4d(i1:i2,j1:j2,nbud_vg,ntracet) ); collect4d = 0.0
- ! emissions are in [mole]
- ! convert first to kilomole per area [k-mole/m2]
- #ifndef without_emission
- do j = j1, j2
- collect4d(:,j,:,:) = budemi_dat(region)%emi(i1:i2,j,:,:) / dxyp(j) * 1.E-03
- end do
- #endif
- allocate( tmpbud2d(i1:i2,j1:j2) )
- ! on the way: convert from kilomole/m2 to kg/m2 via molar mass [g/mole]
- ! POM (AIS + ACS + COS + AII)
- tmpbud2d = ( sum(collect4d(:,:,:,iPOMais),3) + sum(collect4d(:,:,:,iPOMacs),3) + &
- sum(collect4d(:,:,:,iPOMcos),3) + sum(collect4d(:,:,:,iPOMaii),3) ) * xmpom
- mixf(region)%f2d(emioa)%field = tmpbud2d - emission(region)%f2dslast(:,:,1)
- emission(region)%f2dslast(:,:,1) = tmpbud2d
- ! SOA (NUS + AIS + ACS + COS + AII)
- tmpbud2d = ( sum(collect4d(:,:,:,iSOAnus),3) + sum(collect4d(:,:,:,iSOAais),3) + sum(collect4d(:,:,:,iSOAacs),3) + &
- sum(collect4d(:,:,:,iSOAcos),3) + sum(collect4d(:,:,:,iSOAaii),3) ) * xmpom
- mixf(region)%f2d(emisoa)%field = tmpbud2d - emission(region)%f2dslast(:,:,10)
- emission(region)%f2dslast(:,:,10) = tmpbud2d
- ! BC (AIS + ACS + COS + AII)
- tmpbud2d = ( sum(collect4d(:,:,:,iBCais ),3) + sum(collect4d(:,:,:,iBCacs ),3) + &
- sum(collect4d(:,:,:,iBCcos ),3) + sum(collect4d(:,:,:,iBCaii ),3) ) * xmbc
- mixf(region)%f2d(emibc)%field = tmpbud2d - emission(region)%f2dslast(:,:,2)
- emission(region)%f2dslast(:,:,2) = tmpbud2d
- ! SO2
- tmpbud2d = sum(collect4d(:,:,:,iSO2 ),3) * xmso2
- mixf(region)%f2d(emiso2)%field = tmpbud2d - emission(region)%f2dslast(:,:,3)
- emission(region)%f2dslast(:,:,3) = tmpbud2d
- ! SO4 (NUS + AIS + ACS + COS)
- tmpbud2d = ( sum(collect4d(:,:,:,iSO4nus),3) + sum(collect4d(:,:,:,iSO4ais),3) + &
- sum(collect4d(:,:,:,iSO4acs),3) + sum(collect4d(:,:,:,iSO4cos),3) ) * xmso4
- mixf(region)%f2d(emiso4)%field = tmpbud2d - emission(region)%f2dslast(:,:,4)
- emission(region)%f2dslast(:,:,4) = tmpbud2d
- ! Dust (ACS + COS + ACI + COI)
- tmpbud2d = ( sum(collect4d(:,:,:,iDUacs ),3) + sum(collect4d(:,:,:,iDUcos ),3) + &
- sum(collect4d(:,:,:,iDUaci ),3) + sum(collect4d(:,:,:,iDUcoi ),3) ) * xmdust
- mixf(region)%f2d(emidust)%field = tmpbud2d - emission(region)%f2dslast(:,:,5)
- emission(region)%f2dslast(:,:,5) = tmpbud2d
- ! DMS
- tmpbud2d = sum(collect4d(:,:,:,iDMS ),3) * xmdms
- mixf(region)%f2d(emidms)%field = tmpbud2d - emission(region)%f2dslast(:,:,6)
- emission(region)%f2dslast(:,:,6) = tmpbud2d
- ! Seasalt: (ACS + COS)
- tmpbud2d = ( sum(collect4d(:,:,:,iSSacs ),3) + sum(collect4d(:,:,:,iSScos ),3) ) * xmnacl
- mixf(region)%f2d(emiss)%field = tmpbud2d - emission(region)%f2dslast(:,:,7)
- emission(region)%f2dslast(:,:,7) = tmpbud2d
- ! terpene:
- tmpbud2d = sum(collect4d(:,:,:,iterp ),3) * xmterp
- mixf(region)%f2d(emiterp)%field = tmpbud2d - emission(region)%f2dslast(:,:,8)
- emission(region)%f2dslast(:,:,8) = tmpbud2d
- ! isoprene:
- tmpbud2d = sum(collect4d(:,:,:,iisop ),3) * xmisop
- mixf(region)%f2d(emiisop)%field = tmpbud2d - emission(region)%f2dslast(:,:,9)
- emission(region)%f2dslast(:,:,9) = tmpbud2d
- deallocate( tmpbud2d )
- deallocate( collect4d )
- ! --------------
- ! DRY DEPOSITION
- ! --------------
- allocate( collect3d(i1:i2,j1:j2,ntrace) ); collect3d = 0.0
- ! deposition is in [mole]
- ! convert first to kilomole per area [k-mole/m2]
- do j = j1, j2
- #ifndef without_chemistry
- collect3d(:,j,:) = buddry_dat(region)%dry(i1:i2,j,:) / dxyp(j) * 1.E-3
- #endif
- ! Add sedimentation at the surface to dry depostion
- ! Sedimentation budgets have to be summed in the vertical
- ! to get the surface contribution.
- #ifndef without_sedimentation
- do l = 1, nbud_vg
- do n = 1, nsed
- collect3d(:,j,ised(n)) = collect3d(:,j,ised(n)) + &
- buddep_m7_dat(region)%sed(i1:i2,j,l,n) / dxyp(j) * 1.E-3
- end do
- end do
- #endif
- end do
- allocate( tmpbud2d(i1:i2,j1:j2) )
- ! on the way: convert from kilomole/m2 to kg/m2 via molar mass [g/mole]
- ! SO2
- tmpbud2d = collect3d(:,:,iSO2) * xmso2
- mixf(region)%f2d(dryso2)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,1)
- drydepos(region)%f2dslast(:,:,1) = tmpbud2d
- ! POM (AIS + ACS + COS + AII)
- tmpbud2d = ( collect3d(:,:,iPOMais ) + collect3d(:,:,iPOMacs ) + &
- collect3d(:,:,iPOMcos ) + collect3d(:,:,iPOMaii )) * xmpom
- mixf(region)%f2d(dryoa)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,2)
- drydepos(region)%f2dslast(:,:,2) = tmpbud2d
- ! SOA (NUS + AIS + ACS + COS + AII)
- tmpbud2d = ( collect3d(:,:,iSOAais ) + collect3d(:,:,iSOAacs ) + &
- collect3d(:,:,iSOAcos ) + collect3d(:,:,iSOAaii ) + &
- collect3d(:,:,iSOAnus )) * xmpom
- mixf(region)%f2d(drysoa)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,8)
- drydepos(region)%f2dslast(:,:,8) = tmpbud2d
- ! BC (AIS + ACS + COS + AII)
- tmpbud2d = ( collect3d(:,:,iBCais ) + collect3d(:,:,iBCacs ) + &
- collect3d(:,:,iBCcos ) + collect3d(:,:,iBCaii ) ) * xmbc
- mixf(region)%f2d(drybc)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,3)
- drydepos(region)%f2dslast(:,:,3) = tmpbud2d
- ! SO4 (NUS + AIS + ACS + COS)
- tmpbud2d = ( collect3d(:,:,iSO4nus) + collect3d(:,:,iSO4ais) + &
- collect3d(:,:,iSO4acs) + collect3d(:,:,iSO4cos) ) * xmso4
- mixf(region)%f2d(dryso4)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,4)
- drydepos(region)%f2dslast(:,:,4) = tmpbud2d
- ! Dust (ACS + COS + ACI + COI)
- tmpbud2d = ( collect3d(:,:,iDUacs) + collect3d(:,:,iDUcos) + &
- collect3d(:,:,iDUaci) + collect3d(:,:,iDUcoi) ) * xmdust
- mixf(region)%f2d(drydust)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,5)
- drydepos(region)%f2dslast(:,:,5) = tmpbud2d
- ! DMS
- ! DMS is NOT deposited in TM5 --> the fields will contain zeros
- tmpbud2d = collect3d(:,:,iDMS) * xmdms
- mixf(region)%f2d(drydms)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,6)
- drydepos(region)%f2dslast(:,:,6) = tmpbud2d
- ! Seasalt: (ACS + COS)
- tmpbud2d = ( collect3d(:,:,iSSacs) + collect3d(:,:,iSScos) ) * xmnacl
- mixf(region)%f2d(dryss)%field = tmpbud2d - drydepos(region)%f2dslast(:,:,7)
- drydepos(region)%f2dslast(:,:,7) = tmpbud2d
- deallocate( tmpbud2d )
- deallocate( collect3d )
- ! --------------
- ! WET DEPOSITION
- ! --------------
- allocate( collect4d (i1:i2,j1:j2,nbud_vg,ntracet) ); collect4d = 0.0
- ! deposition is in [mole]
- ! convert first to kilomole per area [k-mole/m2]
- do j = j1, j2
- collect4d(:,j,:,:) = ( buddep_dat(region)%lsp(i1:i2,j,:,:) + buddep_dat(region)%cp(i1:i2,j,:,:) ) / dxyp(j) * 1.E-3
- end do
- allocate( tmpbud2d(i1:i2,j1:j2) )
- ! on the way: convert from kilomole/m2 to kg/m2 via molar mass [g/mole]
- ! POM (AIS + ACS + COS + AII)
- tmpbud2d = ( sum(collect4d(:,:,:,iPOMais),3) + sum(collect4d(:,:,:,iPOMacs),3) + &
- sum(collect4d(:,:,:,iPOMcos),3) + sum(collect4d(:,:,:,iPOMaii),3)) * xmpom
- mixf(region)%f2d(wetoa)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,1)
- wetdepos(region)%f2dslast(:,:,1) = tmpbud2d
- ! SOA (NUS + AIS + ACS + COS + AII)
- tmpbud2d = ( sum(collect4d(:,:,:,iSOAais),3) + sum(collect4d(:,:,:,iSOAacs),3) + &
- sum(collect4d(:,:,:,iSOAcos),3) + sum(collect4d(:,:,:,iSOAaii),3) + &
- sum(collect4d(:,:,:,iSOAnus),3)) * xmpom
- mixf(region)%f2d(wetsoa)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,8)
- wetdepos(region)%f2dslast(:,:,8) = tmpbud2d
- ! BC (AIS + ACS + COS + AII)
- tmpbud2d = ( sum(collect4d(:,:,:,iBCais ),3) + sum(collect4d(:,:,:,iBCacs ),3) + &
- sum(collect4d(:,:,:,iBCcos ),3) + sum(collect4d(:,:,:,iBCaii ),3) ) * xmbc
- mixf(region)%f2d(wetbc)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,2)
- wetdepos(region)%f2dslast(:,:,2) = tmpbud2d
- ! SO2
- tmpbud2d = sum(collect4d(:,:,:,iSO2 ),3) * xmso2
- mixf(region)%f2d(wetso2)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,3)
- wetdepos(region)%f2dslast(:,:,3) = tmpbud2d
- ! SO4 (NUS + AIS + ACS + COS)
- tmpbud2d = ( sum(collect4d(:,:,:,iSO4nus),3) + sum(collect4d(:,:,:,iSO4ais),3) + &
- sum(collect4d(:,:,:,iSO4acs),3) + sum(collect4d(:,:,:,iSO4cos),3) ) * xmso4
- mixf(region)%f2d(wetso4)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,4)
- wetdepos(region)%f2dslast(:,:,4) = tmpbud2d
- ! Dust (ACS + COS + ACI + COI)
- tmpbud2d = ( sum(collect4d(:,:,:,iDUacs ),3) + sum(collect4d(:,:,:,iDUcos ),3) + &
- sum(collect4d(:,:,:,iDUaci ),3) + sum(collect4d(:,:,:,iDUcoi ),3) ) * xmdust
- mixf(region)%f2d(wetdust)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,5)
- wetdepos(region)%f2dslast(:,:,5) = tmpbud2d
- ! DMS
- ! DMS is NOT deposited in TM5 --> the fields will contain zeros
- tmpbud2d = sum(collect4d(:,:,:,iDMS ),3) * xmdms
- mixf(region)%f2d(wetdms)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,6)
- wetdepos(region)%f2dslast(:,:,6) = tmpbud2d
- ! Seasalt: (ACS + COS)
- tmpbud2d = ( sum(collect4d(:,:,:,iSSacs ),3) + sum(collect4d(:,:,:,iSScos ),3) ) * xmnacl
- mixf(region)%f2d(wetss)%field = tmpbud2d - wetdepos(region)%f2dslast(:,:,7)
- wetdepos(region)%f2dslast(:,:,7) = tmpbud2d
- deallocate( tmpbud2d )
- deallocate( collect4d )
- nullify(dxyp)
- call goLabel() ; status = 0
- end subroutine collect_budgets
- !EOC
-
- subroutine add_variable(region,itm5,varname,longname,unit,dims,n_out,status)
- use chem_param, only: mode_end_so4,mode_end_pom,mode_end_bc,mode_end_ss,mode_end_dust
- implicit none
- integer:: itm5
- integer:: fileunit
- integer:: varid
- character(len=*)::varname
- character(len=*)::longname
- character(len=*)::unit
- integer:: dims
- integer:: region
- integer,intent(out)::n_out
- integer,intent(out)::status
- logical :: writeout=.true.
- character(len=*), parameter :: rname = mname//'/output_aerchemmip_add_variable'
- integer ::i1,i2,j1,j2,jmr,imr,lmr
- call goLabel(rname)
- !call GO_Timer_Start( itim_addvar, status )
- !IF_NOTOK_RETURN(status=1)
- !write(gol,'("add_variable1")')
- !call goErr
- if( (n_2d_vars+1>ntracer_2d) .or.(n_3d_vars+1>ntracer_3d) ) then
- status=1
- IF_ERROR_RETURN(status=1)
- end if
- call Get_DistGrid( dgrid(1), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
- ! define sizes for arrays
- imr=i2-i1+1
- jmr=j2-j1+1
- lmr = levi%nlev
- ! 2D variables
- if (dims==2) then
- !init variable
- n_2d_vars=n_2d_vars+1
- mixf(region)%f2d(n_2d_vars)%mf = metafields( itm5 , varname,longname,unit,'','')
- mixf(region)%f2d(n_2d_vars)%writeout=writeout
- !Later make the allocation here
- !allocate( mixf(region)%f2d(n_2d_vars)%field(i1:i2,j1:j2) )
- mixf(region)%f2d(n_2d_vars)%field(i1:i2,j1:j2)=0.0
- n_out=n_2d_vars
- else if (dims==3) then
- !init variable
- n_3d_vars=n_3d_vars+1
- mixf(region)%f3d(n_3d_vars)%mf = metafields( itm5 , varname,longname,unit,'','')
- mixf(region)%f3d(n_3d_vars)%writeout=writeout
- !Later make the allocation here
- !allocate( mixf(region)%f3d(n_3d_vars)%field(i1:i2,j1:j2,lmr) )
- mixf(region)%f3d(n_3d_vars)%field(i1:i2,j1:j2,lmr)=0.0
- n_out=n_3d_vars
- end if
- call goLabel()
- status = 0
- !call GO_Timer_End( itim_addvar, status )
- !IF_NOTOK_RETURN(status=1)
- end subroutine add_variable
- subroutine CCN_Diag(CCN,mass_num,cmr,temper)
- use chem_param, only : iso4ais, iso4acs, iso4cos, ibcais, ibcacs, ibccos, ipomais, ipomacs
- use chem_param, only : ipomcos, issacs, isscos, iduacs, iducos, isoaais, isoaacs, isoacos
- use chem_param, only : iais_n, iacs_n, icos_n, sigma_lognormal
- use chem_param, only : ino3_a, imsa, nh4no3_factor, nh4no3_density, msa_density
- use chem_param, only : SurfTen, mode_tracers
- use chem_param, only : Kap_su, Kap_pom, Kap_soa, Kap_bc, Kap_du, Kap_ss, Kap_na2so4, Kap_no3, Kap_msa
- use chem_param, only : so4_density, pom_density, soa_density, carbon_density, ss_density, dust_density
- use mo_aero_m7, only : cmr2ram, nsol, ram2cmr
- use mo_aero_m7, only : dNaCl, dH2SO4, dNa2SO4, wNaCl, wH2SO4, wNa2SO4, wSO4
- use binas, only : pi, Rgas, xm_h2o, rol
- implicit none
- integer :: iSat, iMode
- real :: CCN(:,:,:,:), mass_num(:,:,:,:), cmr(:,:,:,:), temper(:,:,:)
- real, allocatable :: Vol(:,:,:), Kappa(:,:,:), A_Koehler(:,:,:)
- real, allocatable :: N_act(:,:,:), rc(:,:,:)
- real, allocatable :: nNa(:,:,:), nCl(:,:,:), nNaCl(:,:,:), nH2SO4(:,:,:), nNa2SO4(:,:,:), nSO4(:,:,:)
- CCN(:,:,:,:) = 0.e0
- cmr(:,:,:,:) = 0.e0
- allocate(Vol(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(Kappa(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(A_Koehler(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(N_act(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(rc(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(nNa(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(nCl(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(nSO4(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(nNaCl(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(nNa2SO4(size(CCN,2),size(CCN,3),size(CCN,4)))
- allocate(nH2SO4(size(CCN,2),size(CCN,3),size(CCN,4)))
- do iMode = 2,nsol
- ! Kappa
- SELECT CASE (iMode)
- CASE(2) ! no sea salt and dust in soluble aitken mode
- nSO4= mass_num(:,:,:,iso4ais)/(1.e-3*wSO4)
- nH2SO4 = nSO4
- Vol = ( nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) & !mass_num(:,:,:,iso4ais)/so4_density &
- + mass_num(:,:,:,ipomais)/pom_density &
- + mass_num(:,:,:,isoaais)/soa_density &
- + mass_num(:,:,:,ibcais)/carbon_density) ! m3/gridbox
- Kappa= ( Kap_su*nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &!mass_num(:,:,:,iso4ais)/so4_density &
- + Kap_pom*mass_num(:,:,:,ipomais)/pom_density &
- + Kap_soa*mass_num(:,:,:,isoaais)/soa_density &
- + Kap_bc*mass_num(:,:,:,ibcais)/carbon_density) / Vol
- cmr(iMode,:,:,:) = ram2cmr(iMode)*(Vol/mass_num(:,:,:,iais_n)*0.75/pi)**(1./3.) ! m
- CASE(3)
- nNa = mass_num(:,:,:,issacs)/(1.e-3*wNaCl) ! mol/gridbox
- nCl = nNa
- nSO4= mass_num(:,:,:,iso4acs)/(1.e-3*wSO4)
- nNa2SO4 = MIN(nNa/2.e0, nSO4)
- nNa = nNa - 2.e0*nNa2SO4 ! remaining nNa
- nNaCl = MIN(nCl, nNa)
- nCl = nNaCl ! overshoot nCl is supposed to evaporate
- nH2SO4 = nSO4 - nNa2SO4
- Vol = ( nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
- + nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
- + nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
- + mass_num(:,:,:,ipomacs)/pom_density &
- + mass_num(:,:,:,isoaacs)/soa_density &
- + mass_num(:,:,:,ibcacs)/carbon_density &
- + mass_num(:,:,:,iduacs)/dust_density &
- + mass_num(:,:,:,ino3_a)*nh4no3_factor/nh4no3_density &
- + mass_num(:,:,:,imsa)/msa_density) ! m3/gridbox
- Kappa= ( Kap_su*nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
- + Kap_na2so4*nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
- + Kap_pom*mass_num(:,:,:,ipomacs)/pom_density &
- + Kap_soa*mass_num(:,:,:,isoaacs)/soa_density &
- + Kap_bc*mass_num(:,:,:,ibcacs)/carbon_density &
- + Kap_ss*nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
- + Kap_du*mass_num(:,:,:,iduacs)/dust_density &
- + Kap_no3*mass_num(:,:,:,ino3_a)*nh4no3_factor/nh4no3_density &
- + Kap_msa*mass_num(:,:,:,imsa)/msa_density) / Vol
- cmr(iMode,:,:,:) = ( Vol/mass_num(:,:,:,iacs_n)*0.75/pi)**(1./3.)*ram2cmr(iMode) ! m
- CASE(4)
- nNa = mass_num(:,:,:,isscos)/(1.e-3*wNaCl) ! mol/gridbox
- nCl = nNa
- nSO4= mass_num(:,:,:,iso4cos)/(1.e-3*wSO4)
- nNa2SO4 = MIN(nNa/2.e0, nSO4)
- nNa = nNa - 2.e0*nNa2SO4 ! remaining nNa
- nNaCl = MIN(nCl, nNa)
- nCl = nNaCl ! overshoot nCl is supposed to evaporate
- nH2SO4 = nSO4 - nNa2SO4
- Vol = ( nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
- + nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
- + nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
- + mass_num(:,:,:,ipomcos)/pom_density &
- + mass_num(:,:,:,isoacos)/soa_density &
- + mass_num(:,:,:,ibccos)/carbon_density &
- + mass_num(:,:,:,iducos)/dust_density) ! m3/gridbox
- Kappa= ( Kap_su*nH2SO4*1.e-3*wH2SO4/(dH2SO4*1.e3) &
- + Kap_na2so4*nNa2SO4*1.e-3*wNa2SO4/(dNa2SO4*1.e3) &
- + Kap_pom*mass_num(:,:,:,ipomcos)/pom_density &
- + Kap_soa*mass_num(:,:,:,isoacos)/soa_density &
- + Kap_bc*mass_num(:,:,:,ibccos)/carbon_density &
- + Kap_ss*nNaCl*1.e-3*wNaCl/(dNaCl*1.e3) &
- + Kap_du*mass_num(:,:,:,iducos)/dust_density) / Vol
- cmr(iMode,:,:,:) = ( Vol/mass_num(:,:,:,icos_n)*0.75/pi)**(1./3.)*ram2cmr(iMode) ! m
- END SELECT
- where(Kappa < 0.04) Kappa = 0.04
- A_Koehler = 2.0 * xm_h2o * SurfTen / Rgas / rol / temper
- do iSat=1,nSat
- ! critical radius per mode
- rc = A_Koehler/3.0 * (2.0/SuperSat(iSat)/sqrt(Kappa))**(2.0/3.0)
- ! number of activated particles
- N_act = mass_num(:,:,:,mode_tracers(0,iMode)) * 0.5*erfc( log(rc/cmr(iMode,:,:,:)) / &
- sqrt(2.e0)/log(sigma_lognormal(iMode)) )
- CCN(iSat,:,:,:) = CCN(iSat,:,:,:) + N_act ! #/gridbox
- enddo
- enddo
- deallocate(Vol)
- deallocate(Kappa)
- deallocate(A_Koehler)
- deallocate(rc)
- deallocate(N_act)
- end subroutine CCN_Diag
-
- end module user_output_general
|