emission_data.F90 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  1. !
  2. #define TRACEBACK write (gol,'("in ",a," (",a,", line",i5,")")') rname, __FILE__, __LINE__; call goErr
  3. #define IF_NOTOK_RETURN(action) if (status/=0) then; TRACEBACK; action; return; end if
  4. #define IF_ERROR_RETURN(action) if (status> 0) then; TRACEBACK; action; return; end if
  5. !
  6. #include "tm5.inc"
  7. !
  8. !-----------------------------------------------------------------------------
  9. ! TM5 !
  10. !-----------------------------------------------------------------------------
  11. !BOP
  12. !
  13. ! !MODULE: EMISSION_DATA
  14. !
  15. ! !DESCRIPTION: Provides general methods and fields needed for the emission
  16. ! routines.
  17. !
  18. ! emission_vdist_by_sector : distribute vertically emissions according to source sector
  19. ! msg_emis : print formated emission total
  20. ! do_add_2d : add 2D emission to tracer mass array
  21. ! do_add_3d : add 3D emission to tracer mass array
  22. ! do_add_3d_cycle : add 3D emission to tracer mass array with a daily cycle
  23. ! scale_cycle : evaluate a daily cycle
  24. ! distribute_l44 : scale input field with NH (SH) fires distributed over JAS (JFM)
  25. !\\
  26. !\\
  27. ! !INTERFACE:
  28. !
  29. MODULE EMISSION_DATA
  30. !
  31. ! !USES:
  32. !
  33. use GO, only : gol, goPr, goErr
  34. use Dims, only : nregions, lm
  35. use global_types, only : emis_data, d2_data, d23_data, d3_data
  36. #ifdef with_m7
  37. use mo_aero_m7, only : nmod
  38. !use mo_aero, only : zom2oc
  39. use global_types, only : modal_emissions
  40. #endif
  41. #ifdef with_budgets
  42. use budget_global,only : budg_dat, nzon_vg
  43. #endif
  44. IMPLICIT NONE
  45. !
  46. ! !PUBLIC DATA MEMBERS & TYPES:
  47. !
  48. public :: emis_data, d2_data, d23_data
  49. !
  50. type(emis_data), target :: plandr(nregions) ! Land fraction
  51. type(emis_data), target :: emis2D(nregions) ! 2D emiss prior vertical redistribution
  52. type(emis_data), target :: emis_temp(nregions) ! temp array to store emission
  53. #ifdef with_m7
  54. type(modal_emissions), dimension(nregions,nmod), target :: emis_mass
  55. type(modal_emissions), dimension(nregions,nmod), target :: emis_number
  56. ! The value of 1.4 for the POM to OC mass ratio is an outdated estimate,
  57. ! see e.g. Turpin and Lim (Aerosol Sci. Technol., 2001) and
  58. ! Aiken et al. (Environ. Sci. Technol., 2008).
  59. ! Turpin and Lim estimate a ratio of 1.6 +- 0.2 for urban aerosol,
  60. ! and 2.1 +- 0.2 for aged (nonurban) aerosol;
  61. ! They also note that aerosols heavily impacted by woodsmoke can
  62. ! have an even higher ratio (2.2 to 2.6).
  63. ! According to Reid et al. (ACP, 2005),
  64. ! the POM to OC ratio in fresh biomass burning smoke is very uncertain,
  65. ! somewhere in between 1.4 and ~2.
  66. ! Aiken et al. measure ambient aerosol values
  67. ! between 1.25 for O/C = 0 to 2.44 for O/C = 1.0.
  68. ! For OA from biomass burning, they measure 1.56-1.70,
  69. ! lower than the estimates from Turpin and Lim (~2.0).
  70. ! They find the highest ratios for
  71. ! aged and freshly formed SOA (~2.4 and ~1.9, respectively)
  72. ! and lowest values for primary OA from urban combustion.
  73. ! Based on these studies, we apply different values
  74. ! for emissions from biomass burning versus other emissions,
  75. ! as is also done in some other models
  76. ! (see Table 1 in Tsigaridis et al., ACP, 2014),
  77. ! For SOA (seem emission_pom.F90)
  78. ! we apply a relatively high value valid for aged SOA.
  79. ! This compensates for the lack of SOA formation from isoprene,
  80. ! and improves the agreement with aerosol optical depth (AOD)
  81. ! derived from satellite observations (MODIS).
  82. !
  83. ! We could go even further and apply different values for the
  84. ! water soluble and insoluble fractions (Turpin and Lim).
  85. !
  86. ! It should be acknowledged that the representation of OA
  87. ! with a single tracer is very simplistic.
  88. ! In particular, increase in OA mass due to ageing
  89. ! is not properly accounted for.
  90. !
  91. !real, parameter :: oc2pom = zom2oc !factor for conversion of OC mass to POM
  92. real, parameter :: oc2pom_ff = 1.6
  93. real, parameter :: oc2pom_vg = 1.6
  94. real, parameter :: oc2pom_soa = 2.4
  95. #endif
  96. ! AR5 - EDGAR4 - RETRO - GFED3 - MACC - LPJ - HYMN - MEGAN
  97. logical :: LAR5, LAR5BMB, LEDGAR4, LRETROF, LGFED3, LMACC, LLPJ, LHYMN, LMACCITY, LMEGAN
  98. character(len=256) :: emis_input_dir
  99. character(len=256) :: emis_input_dir_ar5
  100. character(len=256) :: emis_input_dir_megan
  101. character(len=256) :: emis_input_dir_ed4
  102. character(len=256) :: emis_input_dir_mac
  103. integer :: emis_input_year
  104. character(len=256) :: emis_input_dir_gfed
  105. character(len=256) :: emis_input_dir_retro
  106. character(len=256) :: emis_input_dir_aerocom
  107. character(len=256) :: emis_input_dir_dms
  108. character(len=256) :: emis_input_dir_rn222
  109. character(len=256) :: emis_input_dir_dust, emis_input_dust
  110. #ifdef with_ch4_emis
  111. character(len=256) :: emis_input_dir_natch4
  112. #endif
  113. logical :: emis_ch4_single
  114. logical :: emis_ch4_fix3d
  115. real :: emis_ch4_fixed_ppb
  116. character(len=256) :: emis_zch4_fname
  117. ! biomass burning levels:
  118. integer, parameter :: bb_nlev = 5
  119. integer, parameter :: bb_lm = lm(1) ! to be reduced to strip stratosphere!
  120. integer, parameter :: bl_lm = lm(1) ! to be reduced to the BL (around 8)
  121. real, parameter :: bb_hlow (0:bb_nlev) = (/ 0., 100., 500., 1000., 2000., 3000./)
  122. real, parameter :: bb_hhigh(0:bb_nlev) = (/ 100., 500., 1000., 2000., 3000., 6000./)
  123. ! biomass burning levels in tropics (-20 - 20)::
  124. integer, parameter :: bb_nlev_trop = 3
  125. real, parameter :: bb_hlow_trop (0:bb_nlev_trop) = (/ 0., 100., 500., 1000./)
  126. real, parameter :: bb_hhigh_trop(0:bb_nlev_trop) = (/ 100., 500., 1000., 2000./)
  127. ! -----------------------------------------------------------------------------------
  128. ! Biomassburning time splitting factors (now globally, instead of by constituent)
  129. logical :: emis_bb_trop_cycle
  130. type bb_cycle_data
  131. real, pointer :: scalef(:)
  132. end type bb_cycle_data
  133. type(bb_cycle_data), dimension(nregions), target :: bb_cycle
  134. ! -----------------------------------------------------------------------------------
  135. ! Budgets
  136. #ifdef with_budgets
  137. real, dimension(nregions) :: sum_emission
  138. type budemi_data
  139. real,dimension(:,:,:,:),pointer :: emi ! [i, j, nbud_vg, ntracet]
  140. end type budemi_data
  141. type(budemi_data),dimension(nregions),target :: budemi_dat
  142. #endif
  143. logical :: use_tiedkte ! read from rc file, used to scale LiNOx
  144. ! ----------------------------------------------------
  145. ! Vertical splitting : used now for all sectors, for biomassburning and other categories
  146. ! (tables in Dentener, 2006, ACP)
  147. !
  148. ! ATTENTION: changes here have impact on the routine emission_vdist_by_sector (contained)
  149. ! Note: vdist_* variable could be hold private
  150. !
  151. integer, parameter :: vd_class_name_len = 12
  152. ! biomassburning
  153. integer, parameter :: vdist_bb_nlev = 6
  154. real,dimension(vdist_bb_nlev),parameter :: vdist_bb_hlow = (/ 0., 100., 500., 1000., 2000., 3000./)
  155. real,dimension(vdist_bb_nlev),parameter :: vdist_bb_hhigh = (/ 100., 500., 1000., 2000., 3000., 6000./)
  156. ! other sources (related to surface)
  157. integer, parameter :: vdist_nn_nlev = 6
  158. real,dimension(vdist_nn_nlev),parameter :: vdist_nn_hlow = (/ 0., 30. , 100., 300., 600., 1000. /)
  159. real,dimension(vdist_nn_nlev),parameter :: vdist_nn_hhigh = (/ 30., 100., 300., 600., 1000., 2000. /)
  160. !
  161. ! !PRIVATE TYPES:
  162. !
  163. character(len=*), parameter, private :: mname = 'emission_data'
  164. !
  165. ! !REVISION HISTORY:
  166. ! 1 Oct 2010 - Achim Strunk - adapted for AR5
  167. ! 28 Jun 2012 - Ph. Le Sager - made everything public by default
  168. ! - adapted for lon-lat MPI domain decomposition
  169. ! !REMARKS:
  170. !
  171. !EOP
  172. !------------------------------------------------------------------------
  173. CONTAINS
  174. !--------------------------------------------------------------------------
  175. ! TM5 !
  176. !--------------------------------------------------------------------------
  177. !BOP
  178. !
  179. ! !IROUTINE: EMISSION_VDIST_BY_SECTOR
  180. !
  181. ! !DESCRIPTION: Return vertically distributed emissions depending on given
  182. ! sector and constituent.
  183. ! Distribution is done as 'compromise' between
  184. ! 1) Dentener et al., 2006, ACP, slightly modified for
  185. ! emissions supposed to enter the surface layer.
  186. ! 2) De Meij et al., ACP, 2006
  187. ! 3) EMEP model (docu, model code, publications)
  188. ! 4) Bieser et al., GMDD, 2010
  189. ! 5) Small updates to biomassburning following
  190. ! Huijnen et al., GMDD, 2010
  191. !\\
  192. !\\
  193. ! !INTERFACE:
  194. !
  195. SUBROUTINE EMISSION_VDIST_BY_SECTOR( splitname, constituent, region, emis2D, emis3D, status )
  196. !
  197. ! !USES:
  198. !
  199. use toolbox, only : distribute_emis2D
  200. !
  201. ! !INPUT PARAMETERS:
  202. !
  203. character(len=vd_class_name_len), intent(in) :: splitname
  204. character(len=*), intent(in) :: constituent
  205. integer, intent(in) :: region
  206. type(emis_data), intent(in) :: emis2D
  207. !
  208. ! !INPUT/OUTPUT PARAMETERS:
  209. !
  210. type(d3_data), intent(out) :: emis3D
  211. !
  212. ! !OUTPUT PARAMETERS:
  213. !
  214. integer, intent(out) :: status
  215. !
  216. ! !REVISION HISTORY:
  217. ! 1 Oct 2010 - Achim Strunk - v0
  218. !
  219. ! !REMARKS: Splitting depending on constituent is still to code.
  220. !
  221. !EOP
  222. !------------------------------------------------------------------------
  223. !BOC
  224. character(len=*), parameter :: rname = mname//'/emission_vdist_by_sector'
  225. integer :: ilev
  226. character(len=2) :: splittype
  227. integer, parameter :: maxvdist_nlev = max(vdist_bb_nlev,vdist_nn_nlev)
  228. real, dimension(maxvdist_nlev) :: sfglobal, sfintrop, sfintemp
  229. ! --- begin --------------------------------------
  230. ! control implicit settings here in this routine
  231. if( vdist_bb_nlev /= 6 .or. vdist_nn_nlev /= 6 ) then
  232. write(gol, '("ERROR: wrong number of layers: bb_nlev /= 6 or nn_lev /= 6")'); call goErr
  233. status=1; return
  234. end if
  235. ! initialise
  236. sfglobal = 0.0
  237. sfintrop = 0.0
  238. sfintemp = 0.0
  239. emis3d%d3= 0.0
  240. ! -------------------------------------------------
  241. ! This here is selection by emission source sectors
  242. ! -------------------------------------------------
  243. select case( trim(splitname) )
  244. case( 'combenergy' )
  245. ! Combustion from energy production and transformation, power-plants
  246. ! no zonal differences, no dependency on species
  247. ! --
  248. ! assumed to be related to EMEP SNAP category [1]
  249. ! AEROCOM equivalent: power-plants
  250. ! --
  251. splittype = 'nn'
  252. sfglobal = (/ 0.0, 0.1, 0.7, 0.2, 0.0, 0.0 /)
  253. case( 'combrescom' )
  254. ! Residential and commercial combustion
  255. ! no zonal differences, no dependency on species
  256. ! --
  257. ! assumed to be related to EMEP SNAP category [2]
  258. ! AEROCOM equivalent: domestic/industry
  259. ! --
  260. splittype = 'nn'
  261. sfglobal = (/ 0.4, 0.4, 0.2, 0.0, 0.0, 0.0 /)
  262. case( 'industry' )
  263. ! Industrial processes and combustion
  264. ! no zonal differences, no dependency on species
  265. ! --
  266. ! assumed to be an aggregate of EMEP SNAP categories [3,4,5]
  267. ! AEROCOM equivalent: industry
  268. ! --
  269. splittype = 'nn'
  270. sfglobal = (/ 0.1, 0.2, 0.6, 0.1, 0.0, 0.0 /)
  271. case( 'waste' )
  272. ! Waste treatment and disposal
  273. ! no zonal differences, no dependency on species
  274. ! --
  275. ! assumed to be related to EMEP SNAP category [9]
  276. ! AEROCOM equivalent: -
  277. ! --
  278. splittype = 'nn'
  279. sfglobal = (/ 0.1, 0.2, 0.4, 0.3, 0.0, 0.0 /)
  280. case( 'nearsurface' )
  281. ! Near surface emissions
  282. ! no zonal differences, no dependency on species
  283. ! --
  284. ! AR5: solvent production and use, agricultural waste burning, &
  285. ! ships, grassland fire, mineral dust (AEROCOM or Tegen-Vignati)
  286. ! EMEP equivalents: SNAP categories [6,8]
  287. ! AEROCOM equivalents: ships, agricultural waste
  288. ! --
  289. splittype = 'nn'
  290. sfglobal = (/ 0.8, 0.2, 0.0, 0.0, 0.0, 0.0 /)
  291. case( 'surface' )
  292. ! Surface emissions
  293. ! no zonal differences, no dependency on species
  294. ! --
  295. ! AR5: agriculture, transport, soil, oceanic, biogenic
  296. ! EMEP equivalents: SNAP categories [7,8,10]
  297. ! AEROCOM equivalents: surface emissions from road/off-road, ships, agricultural waste
  298. ! --
  299. splittype = 'nn'
  300. sfglobal = (/ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 /)
  301. !!$ case ( 'mindust' )
  302. !!$ ! Mineral dust emissions
  303. !!$ ! no zonal differences
  304. !!$ ! --
  305. !!$ ! AR5: surface dust emissions from either from AEROCOM or Tegen-Vignati
  306. !!$ ! assumed to be slightly higher than near-surface
  307. !!$ splittype = 'nn'
  308. !!$ sfglobal = (/ 0.8, 0.2, 0.0, 0.0, 0.0, 0.0 /)
  309. case( 'volcanic' )
  310. ! Volcanic emissions
  311. ! --
  312. ! AR5: natural SOx emissions (from MACC repository)
  313. ! EMEP equivalents: SNAP categories [11]
  314. ! AEROCOM equivalents: continuous: 2/3 to 1 of height of volcano top
  315. ! explosive: 0.5 to 1.5 km above volcano top
  316. ! Since no data is available about volcano top levels, we assume here, that
  317. ! a volcano top is usually 200-1000 m higher than the grid's surrounding terrain
  318. ! height, thus emissions are distributed from 100 - 2000 m almost homogeneously
  319. ! --
  320. splittype = 'nn'
  321. sfglobal = (/ 0.0, 0.0, 0.1, 0.3, 0.4, 0.2 /)
  322. case( 'forestfire' )
  323. ! forest fires: 6 layer model, different splitting for different regions
  324. ! dont distinguish between boreal Europe and boreal Canada, use Europe globally
  325. ! Dentener et al., modified in tropics (up to 2 km) with respect to Huijnen et al., GMD 2010, \
  326. ! who are citing Labonne et al., 2007 ofr new information based on satellite data.
  327. splittype = 'bb'
  328. sfglobal = (/ 0.1, 0.1, 0.2, 0.2, 0.4, 0.0 /)
  329. sfintemp = (/ 0.2, 0.2, 0.2, 0.4, 0.0, 0.0 /)
  330. sfintrop = (/ 0.2, 0.2, 0.2, 0.4, 0.0, 0.0 /)
  331. case default
  332. write(gol, '("ERROR: wrong specification of emission sector ",a,"in vdist_by_sector called for constituent ",a)') &
  333. trim(splitname), trim(constituent); call goErr
  334. status=1; return
  335. end select
  336. ! --------------------
  337. ! Do the splitting -
  338. ! no need to skip cases of fraction (sfglobal, sfintemp, ..) being zero:
  339. ! distribute_emis2D is optimized for those and will return right away
  340. ! --------------------
  341. select case( splittype )
  342. case( 'nn' )
  343. do ilev = 1, vdist_nn_nlev
  344. call distribute_emis2D( region, emis2D, emis3D, vdist_nn_hlow(ilev), vdist_nn_hhigh(ilev), status, sfglobal(ilev) )
  345. IF_NOTOK_RETURN(status=1)
  346. end do
  347. case( 'bb' )
  348. do ilev = 1, vdist_bb_nlev
  349. ! boreal
  350. call distribute_emis2D( region, emis2D, emis3D, vdist_bb_hlow(ilev), vdist_bb_hhigh(ilev), status, &
  351. sfglobal(ilev), -90.,-61.)
  352. IF_NOTOK_RETURN(status=1)
  353. call distribute_emis2D( region, emis2D, emis3D, vdist_bb_hlow(ilev), vdist_bb_hhigh(ilev), status, &
  354. sfglobal(ilev), 60., 90.)
  355. IF_NOTOK_RETURN(status=1)
  356. ! temperate
  357. call distribute_emis2D( region, emis2D, emis3D, vdist_bb_hlow(ilev), vdist_bb_hhigh(ilev), status, &
  358. sfintemp(ilev), -60.,-31.)
  359. IF_NOTOK_RETURN(status=1)
  360. call distribute_emis2D( region, emis2D, emis3D, vdist_bb_hlow(ilev), vdist_bb_hhigh(ilev), status, &
  361. sfintemp(ilev), 30., 59.)
  362. IF_NOTOK_RETURN(status=1)
  363. ! tropics
  364. call distribute_emis2D( region, emis2D, emis3D, vdist_bb_hlow(ilev), vdist_bb_hhigh(ilev), status, &
  365. sfintrop(ilev), -30., 29.)
  366. IF_NOTOK_RETURN(status=1)
  367. end do
  368. case default
  369. write(gol, '("ERROR: wrong specification of splitting type in vdist_by_sector.")'); call goErr
  370. status=1; return
  371. end select
  372. ! OK
  373. status=0
  374. END SUBROUTINE EMISSION_VDIST_BY_SECTOR
  375. !EOC
  376. !--------------------------------------------------------------------------
  377. ! TM5 !
  378. !--------------------------------------------------------------------------
  379. !BOP
  380. !
  381. ! !IROUTINE: MSG_EMIS
  382. !
  383. ! !DESCRIPTION: Provide output to verify the amount of emissions
  384. ! entering the calculations
  385. !\\
  386. !\\
  387. ! !INTERFACE:
  388. !
  389. SUBROUTINE MSG_EMIS(year_month, provider, sector, msg_comp, msg_mass, summed_emissions)
  390. !
  391. ! !USES:
  392. !
  393. use dims, only: idate
  394. !
  395. ! !INPUT PARAMETERS:
  396. !
  397. integer, intent(in) :: year_month ! 1: year, 2: monthly amount
  398. character(len=*), intent(in) :: provider, sector, msg_comp
  399. real, intent(in) :: msg_mass, summed_emissions
  400. !
  401. ! !REVISION HISTORY:
  402. ! 1 Oct 2010 - Achim Strunk - protex; increase space for output
  403. !
  404. !EOP
  405. !------------------------------------------------------------------------
  406. !BOC
  407. character(len=7),dimension(2), parameter:: ym=(/'Yearly ','Monthly'/)
  408. 1111 format(' EMISS-INFO - ',a7,' Emission from ',a8,' -> ',a18,1x,a6,' : mw=',f5.1,', month=',i2.2,', Sum [kg]=',1x,1pe11.4)
  409. 1112 format(' EMISS-INFO - ',a7,' Emission from ',a8,' -> ',a18,1x,a6,' : mw=',f5.1,', --------, Sum [kg]=',1x,1pe11.4)
  410. if (year_month==1) then
  411. write (gol,1112) ym(year_month), provider, sector, msg_comp, msg_mass, summed_emissions; call goPr
  412. else
  413. write (gol,1111) ym(year_month), provider, sector, msg_comp, msg_mass, idate(2), summed_emissions; call goPr
  414. endif
  415. END SUBROUTINE MSG_EMIS
  416. !EOC
  417. !--------------------------------------------------------------------------
  418. ! TM5 !
  419. !--------------------------------------------------------------------------
  420. !BOP
  421. !
  422. ! !IROUTINE: SCALE_CYCLE
  423. !
  424. ! !DESCRIPTION: Evaluates a daily cycle to be used for the biomass
  425. ! burning emissions. It is based on the isoprene daily
  426. ! cycle, except that the max peak is at 14:00h LT.
  427. ! Calculates factors to be multiplied with an
  428. ! emission field (e.g. co) in order to simulate a
  429. ! diurnal cycle in emissions (caused by solar dependency/
  430. ! human activity), e.g.
  431. ! rm(i,j,1,isop) = rm(i,j,1,isop) + e_isop(i,j)*scalef(ipos,j)*dt
  432. ! with ipos depending on time and longitude.
  433. ! The scalefactor is calculated for -180 longitude and
  434. ! the mean value for ntim timesteps during a day is scaled
  435. ! to 1.
  436. ! The routine should be called only once, since
  437. ! the position relative to the sun is not relevant here.
  438. !\\
  439. !\\
  440. ! !INTERFACE:
  441. !
  442. SUBROUTINE SCALE_CYCLE(ntim, scalef)
  443. !
  444. ! !INPUT PARAMETERS:
  445. !
  446. integer, intent(in) :: ntim
  447. !
  448. ! !OUTPUT PARAMETERS:
  449. !
  450. real, dimension(ntim), intent(out) :: scalef
  451. !
  452. ! !REVISION HISTORY:
  453. ! 1 Oct 2010 - Achim Strunk - added without_diurnal_emission_cycle
  454. ! (to be removed again :-( )
  455. ! 19 Oct 2010 - Narcisa Banda - changed without_diurnal_emission_cycle to with_....
  456. ! 31 Jan 2013 - Ph. Le Sager - get rid of with_diurnal_emission_cycle!
  457. !
  458. ! !REMARKS:
  459. ! - This routine is called only once (see emission.F90), and only if
  460. ! emis_bb_trop_cycle is .true.. The later is set with the
  461. ! input.emis.bb.dailycycle in the rc file (chem.input.rc)
  462. !
  463. !EOP
  464. !------------------------------------------------------------------------
  465. !BOC
  466. real :: pi, piby, obliq, deday, delta, dt, lon, hr, lat, houra, smm, w, sig
  467. integer :: i
  468. ! The calling routine (emission_declare) defines NTIM as follows:
  469. ! dtime=float(ndyn_max)/(2*tref(region)) ! timestep emissions
  470. ! ntim=86400/nint(dtime) ! number of timesteps in 24 hours.
  471. pi = acos(-1.0)
  472. piby = pi/180.0
  473. ! obliq = 23.45 * piby
  474. w = 0.2
  475. sig = 2.0
  476. dt = 24./ntim !timestep in hours
  477. lon = -180.0*piby !calculate for dateline
  478. hr = - 0.5*dt !shift half an interval back
  479. if (hr .gt. 12) hr = hr - 24
  480. ! hr = hr - 2 !shift two hours. This means that Local-day-time maximum will be at 14:00 h LT.
  481. smm = 0.0
  482. do i=1,ntim
  483. hr = hr + dt
  484. houra = lon - pi + hr * (2.*pi/24.)
  485. scalef(i) = w + (1-w)*24.0/(sig*sqrt(2*pi))*exp(-0.5*(((hr-1.5)/sig)**2))
  486. ! scalef(i) = max(1+(cos(houra)),0.0)
  487. smm = smm+scalef(i)/ntim
  488. end do
  489. if ( smm > 1e-5 ) then
  490. scalef(1:ntim) = scalef(1:ntim)/smm
  491. else
  492. scalef(1:ntim) = 1.0
  493. end if
  494. END SUBROUTINE SCALE_CYCLE
  495. !EOC
  496. !--------------------------------------------------------------------------
  497. ! TM5 !
  498. !--------------------------------------------------------------------------
  499. !BOP
  500. !
  501. ! !IROUTINE: DO_ADD_2D
  502. !
  503. ! !DESCRIPTION: General routine to add a 2D emission field (given in kg
  504. ! /month) into tracer mass array. The mass increase is done
  505. ! at level L_LEVEL, and for tracer I_TRACER.
  506. !
  507. ! Update accordingly the budget.
  508. !\\
  509. !\\
  510. ! !INTERFACE:
  511. !
  512. SUBROUTINE DO_ADD_2D( region, i_tracer, l_level, is, js, emis_field, &
  513. mol_mass, mol_mass_e, status, xfrac )
  514. !
  515. ! !USES:
  516. !
  517. use dims, only : CheckShape, tref, nsrce
  518. use dims, only : sec_month, im, jm, okdebug
  519. use global_data, only : mass_dat, region_dat
  520. use chem_param, only : ntracet, names
  521. use tm5_distgrid, only : get_distgrid, dgrid
  522. #ifdef with_budgets
  523. use budget_global, only : budg_dat, nzon_vg
  524. #endif
  525. !
  526. ! !INPUT PARAMETERS:
  527. !
  528. integer, intent(in) :: region
  529. integer, intent(in) :: i_tracer
  530. integer, intent(in) :: l_level
  531. integer, intent(in) :: is, js
  532. real, intent(in) :: emis_field(is:,js:)
  533. real, intent(in) :: mol_mass ! mol mass of tracer field
  534. real, intent(in) :: mol_mass_e ! mol mass of emission field (e.g. NOx emission ar in kgN/month)
  535. real, intent(in), optional :: xfrac ! partial addition
  536. !
  537. ! !OUTPUT PARAMETERS:
  538. !
  539. integer, intent(out) :: status
  540. !
  541. ! !REVISION HISTORY:
  542. ! 27 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  543. !
  544. !EOP
  545. !------------------------------------------------------------------------
  546. !BOC
  547. character(len=*), parameter :: rname = mname//'/do_add_2d'
  548. integer :: i, j, nzone, nzone_v, i1, i2, j1, j2
  549. real :: x, efrac, dtime, month2dt
  550. real :: mbef, maft, sume ! mass BEFore, AFTer, SUM Emiss (debug)
  551. real, dimension(:,:,:,:), pointer :: rm, rzm
  552. ! --- begin --------------------------------------
  553. call GET_DISTGRID( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  554. call CheckShape( (/i2-i1+1,j2-j1+1/), shape(emis_field), status )
  555. IF_NOTOK_RETURN(status=1)
  556. dtime=float(nsrce)/(2*tref(region)) ! timestep emissions
  557. month2dt=dtime/sec_month ! conversion to emission per timestep
  558. rm => mass_dat(region)%rm
  559. rzm => mass_dat(region)%rzm
  560. if(present(xfrac)) then
  561. efrac = xfrac
  562. else
  563. efrac = 1.0
  564. endif
  565. if (okdebug) then
  566. write (gol, '("--------------------------------------------------------------")') ; call goPr
  567. write (gol, '(" DO ADD 2D debug in region:",i3) ' ) region ; call goPr
  568. write (gol, '(" itracer :",i3,a8)' ) i_tracer, ' :'//names(i_tracer) ; call goPr
  569. write (gol, '(" xfrac :",f6.1)' ) efrac ; call goPr
  570. write (gol, '(" mol_mass :",f6.1 ) ' ) mol_mass ; call goPr
  571. write (gol, '(" mol_mass_e :",f6.1 )' ) mol_mass_e ; call goPr
  572. write (gol, '(" emisfield :",2e12.4 )') minval(emis_field),maxval(emis_field) ; call goPr
  573. sume = sum(emis_field)*month2dt*(mol_mass/mol_mass_e)*efrac
  574. write (gol, '(" sum emmis :",e12.4 )' ) sume ; call goPr
  575. mbef = sum(rm(i1:i2,j1:j2,:,i_tracer))
  576. endif
  577. do j=j1,j2
  578. do i=i1,i2
  579. x = emis_field(i,j)*month2dt*(mol_mass/mol_mass_e)*efrac
  580. rm(i,j,l_level,i_tracer) = rm(i,j,l_level,i_tracer) + x
  581. #ifdef slopes
  582. ! injection of emissions at surface, thus vertical slope more negative
  583. ! (keep concentration at top of layer the same as before emission)
  584. if ( i_tracer <= ntracet ) then
  585. rzm(i,j,l_level,i_tracer) = rzm(i,j,l_level,i_tracer) - x
  586. end if
  587. #endif
  588. #ifdef with_budgets
  589. nzone = budg_dat(region)%nzong(i,j) !global budget
  590. nzone_v = nzon_vg(l_level)
  591. budemi_dat(region)%emi(i,j,nzone_v,i_tracer) = &
  592. budemi_dat(region)%emi(i,j,nzone_v,i_tracer) + x/mol_mass*1e3
  593. if(i_tracer == 1) sum_emission(region) = sum_emission(region) + x !in kg
  594. #endif
  595. enddo
  596. enddo
  597. if (okdebug) then
  598. maft = sum(rm(i1:i2,j1:j2,:,i_tracer))
  599. write (gol, '(" Added amount :",e12.4 )' ) maft-mbef ; call goPr
  600. write (gol, '(" Added amount can be different when inner zoom is present!" )' ) ; call goPr
  601. if (maft-mbef-sume > 1e-8*sume) then
  602. write (gol, '(" Warning: error in emission ")' ) ; call goErr
  603. endif
  604. endif
  605. nullify(rm)
  606. nullify(rzm)
  607. status=0
  608. END SUBROUTINE DO_ADD_2D
  609. !EOC
  610. !--------------------------------------------------------------------------
  611. ! TM5 !
  612. !--------------------------------------------------------------------------
  613. !BOP
  614. !
  615. ! !IROUTINE: DO_ADD_3D
  616. !
  617. ! !DESCRIPTION: General routine to add a 3D emission field (given in kg
  618. ! /month) into tracer mass array. The mass increase is done
  619. ! for tracer I_TRACER.
  620. !
  621. ! Update accordingly the budget.
  622. !\\
  623. !\\
  624. ! !INTERFACE:
  625. !
  626. SUBROUTINE DO_ADD_3D( region, i_tracer, is, js, emis_field, mol_mass, mol_mass_e, status, xfrac)
  627. !
  628. ! !USES:
  629. !
  630. use dims, only : CheckShape, nsrce, tref
  631. use dims, only : sec_month, im, jm, lm, okdebug
  632. use global_data, only : mass_dat, region_dat
  633. use chem_param, only : ntracet, names
  634. use tm5_distgrid, only : get_distgrid, dgrid
  635. #ifdef with_budgets
  636. use budget_global, only : budg_dat, nzon_vg
  637. #endif
  638. !
  639. ! !INPUT PARAMETERS:
  640. !
  641. integer, intent(in) :: region ! region #
  642. integer, intent(in) :: i_tracer ! id of tracer to increase
  643. integer, intent(in) :: is, js
  644. real, intent(in) :: emis_field(is:,js:,:)
  645. real, intent(in) :: mol_mass, mol_mass_e
  646. real, intent(in), optional :: xfrac !partial addition
  647. !
  648. ! !OUTPUT PARAMETERS:
  649. !
  650. integer, intent(out) :: status
  651. !
  652. ! !REVISION HISTORY:
  653. ! 27 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  654. !
  655. !EOP
  656. !------------------------------------------------------------------------
  657. !BOC
  658. character(len=*), parameter :: rname = mname//'/do_add_3d'
  659. integer :: i, j, l, nzone, nzone_v, i1,j1,i2,j2
  660. integer, dimension(3) :: ubound_e
  661. real :: x, efrac, dtime, month2dt
  662. real, dimension(:,:,:,:), pointer :: rm
  663. real :: mbef, maft, sume ! debug
  664. ! --- begin --------------------------------------
  665. call GET_DISTGRID( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  666. status = 0
  667. ! check arguments
  668. ubound_e = ubound(emis_field)
  669. if(ubound_e(1) /= i2) then
  670. write(gol,'(A)') 'do_add_3d: im emission not consistent' ; call goPr
  671. status = 1
  672. endif
  673. if(ubound_e(2) /= j2) then
  674. write(gol,'(A)') 'do_add_3d: jm emission not consistent' ; call goPr
  675. status = 1
  676. endif
  677. if(ubound_e(3) > lm(region)) then
  678. write(gol,'(A)') 'do_add_3d: lm emission not consistent' ; call goPr
  679. status = 1
  680. endif
  681. IF_NOTOK_RETURN(status=1)
  682. rm => mass_dat(region)%rm
  683. dtime=float(nsrce)/(2*tref(region)) ! timestep emissions
  684. month2dt=dtime/sec_month ! conversion to emission per timestep
  685. if(present(xfrac)) then
  686. efrac = xfrac
  687. else
  688. efrac = 1.0
  689. endif
  690. ! if (okdebug) then
  691. ! write (gol, '("--------------------------------------------------------------")') ; call goPr
  692. ! write (gol, '(" DO ADD 3D debug in region:",i3) ' ) region ; call goPr
  693. ! write (gol, '(" itracer :",i3,a8)' ) i_tracer, ' :'//names(i_tracer) ; call goPr
  694. ! write (gol, '(" xfrac :",f6.1)' ) efrac ; call goPr
  695. ! write (gol, '(" mol_mass :",f6.1 ) ' ) mol_mass ; call goPr
  696. ! write (gol, '(" mol_mass_e :",f6.1 )' ) mol_mass_e ; call goPr
  697. ! write (gol, '(" emisfield :",2e12.4 )') minval(emis_field), maxval(emis_field) ; call goPr
  698. ! write (gol, '(" ubound(3) :",i3 )' ) ubound_e(3) ; call goPr
  699. ! sume = sum(emis_field)*month2dt*(mol_mass/mol_mass_e)*efrac
  700. ! write (gol, '(" sume :", e12.4 )') sume ; call goPr
  701. ! mbef = sum(rm(i1:i2,j1:j2,:,i_tracer))
  702. ! endif
  703. do l=1,ubound_e(3)
  704. do j=j1,j2
  705. do i=i1,i2
  706. x = emis_field(i,j,l)*month2dt*(mol_mass/mol_mass_e)*efrac
  707. rm(i,j,l,i_tracer) = rm(i,j,l,i_tracer) + x
  708. #ifdef with_budgets
  709. ! budget___
  710. nzone=budg_dat(region)%nzong(i,j) !global budget
  711. nzone_v=nzon_vg(l)
  712. budemi_dat(region)%emi(i,j,nzone_v,i_tracer) = &
  713. budemi_dat(region)%emi(i,j,nzone_v,i_tracer) + x/mol_mass*1e3
  714. if(i_tracer ==1) sum_emission(region) = sum_emission(region) + x !in kg
  715. #endif
  716. enddo
  717. enddo
  718. enddo !levels
  719. ! if (okdebug) then
  720. ! maft = sum(rm(i1:i2,j1:j2,:,i_tracer))
  721. ! write (gol, '(" after-before :", e12.4 )' ) maft-mbef ; call goPr
  722. ! write (gol, '(" END debug output ")' ) ; call goPr
  723. ! endif
  724. nullify(rm)
  725. END SUBROUTINE DO_ADD_3D
  726. !EOC
  727. !--------------------------------------------------------------------------
  728. ! TM5 !
  729. !--------------------------------------------------------------------------
  730. !BOP
  731. !
  732. ! !IROUTINE: DO_ADD_3D_CYCLE
  733. !
  734. ! !DESCRIPTION: Routine to add a 3D emission field (given in kg/month),
  735. ! scaled with a daily cycle. To be used for biomass burning
  736. ! emissions.
  737. !\\
  738. !\\
  739. ! !INTERFACE:
  740. !
  741. SUBROUTINE DO_ADD_3D_CYCLE( region, i_tracer, is, js, emis_field, curr_cycle, mol_mass, mol_mass_e, status, xfrac)
  742. !
  743. ! !USES:
  744. !
  745. use dims, only : CheckShape, tref, nsrce, itaur
  746. use dims, only : sec_month, im,jm,lm, okdebug
  747. use dims, only : ndyn_max,dx, xref, xbeg,dy,yref,ybeg
  748. use global_data, only : mass_dat, region_dat
  749. use chem_param, only : ntracet, names
  750. use tm5_distgrid, only : get_distgrid, dgrid
  751. #ifdef with_budgets
  752. use budget_global, only : budg_dat, nzon_vg
  753. #endif
  754. use datetime, only : tau2date
  755. use toolbox, only : dumpfield
  756. !
  757. ! !INPUT PARAMETERS:
  758. !
  759. integer, intent(in) :: region
  760. integer, intent(in) :: i_tracer
  761. integer, intent(in) :: is, js
  762. real, intent(in) :: emis_field(is:,js:,:)
  763. real, dimension(:), intent(in) :: curr_cycle
  764. real, intent(in) :: mol_mass ! first is the mass of tracer field
  765. real, intent(in) :: mol_mass_e ! mass of emission field (e.g. NOx emission ar in kgN/month)
  766. real, intent(in), optional :: xfrac ! partial addition
  767. !
  768. ! !OUTPUT PARAMETERS:
  769. !
  770. integer, intent(out) :: status
  771. !
  772. ! !REVISION HISTORY:
  773. ! 1 Oct 2010 - Achim Strunk - v0 based on do_add_3d
  774. ! 20 Jun 2012 - Ph. Le Sager - adapted for lon-lat MPI domain decomposition
  775. !
  776. ! !REMARKS:
  777. !
  778. !EOP
  779. !------------------------------------------------------------------------
  780. !BOC
  781. character(len=*), parameter :: rname = mname//'/do_add_3d_cycle'
  782. integer :: i, j, l, ipos, nzone, nzone_v
  783. integer,dimension(6) :: idater
  784. integer :: sec_in_day, ntim, itim, i1, j1, i2, j2
  785. integer, dimension(3) :: ubound_e
  786. real :: x, xlon, xlat, efrac, dtime, month2dt, dtime2
  787. real,dimension(:,:,:,:),pointer :: rm
  788. real :: mbef, maft, sume
  789. ! --- begin --------------------------------------
  790. call GET_DISTGRID( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  791. status = 0
  792. ! check arguments
  793. ubound_e = ubound(emis_field)
  794. if(ubound_e(1) /= i2) then
  795. write(gol,'(A)') 'do_add_3d: im emission not consistent' ; call goPr
  796. status = 1
  797. endif
  798. if(ubound_e(2) /= j2) then
  799. write(gol,'(A)') 'do_add_3d: jm emission not consistent' ; call goPr
  800. status = 1
  801. endif
  802. if(ubound_e(3) > lm(region)) then
  803. write(gol,'(A)') 'do_add_3d: lm emission not consistent' ; call goPr
  804. status = 1
  805. endif
  806. IF_NOTOK_RETURN(status=1)
  807. rm => mass_dat(region)%rm
  808. dtime = float(nsrce)/(2*tref(region)) !timestep emissions
  809. month2dt = dtime/sec_month ! conversion to emission per timestep
  810. dtime2 = float(ndyn_max)/(2*tref(region)) !timestep emissions based on non-CFL interference (CMK 05/2006)
  811. ntim = 86400/nint(dtime2) !number of timesteps in 24 hours based on non-CFL interference (CMK 05/2006)
  812. call tau2date(itaur(region),idater)
  813. sec_in_day = idater(4)*3600 + idater(5)*60 + idater(6) !elapsed seconds this day
  814. itim = sec_in_day/nint(dtime2)+1 !time interval
  815. if(present(xfrac)) then
  816. efrac = xfrac
  817. else
  818. efrac = 1.0
  819. endif
  820. ! if (okdebug) then
  821. ! write (gol, '("--------------------------------------------------------------")') ; call goPr
  822. ! write (gol, '(" DO ADD 3D CYCLE debug in region:",i3) ' ) region ; call goPr
  823. ! write (gol, '(" itracer :",i3,a8)' ) i_tracer, ' :'//names(i_tracer) ; call goPr
  824. ! write (gol, '(" xfrac :",f6.1)' ) efrac ; call goPr
  825. ! write (gol, '(" mol_mass :",f6.1 ) ' ) mol_mass ; call goPr
  826. ! write (gol, '(" mol_mass_e :", f6.1 )' ) mol_mass_e ; call goPr
  827. ! write (gol, '(" emisfield :", 2e12.4 )') minval(emis_field),maxval(emis_field) ; call goPr
  828. ! write (gol, '(" ubound(3) :", i3 )' ) ubound_e(3) ; call goPr
  829. ! sume = sum(emis_field)*month2dt*(mol_mass/mol_mass_e)*efrac
  830. ! write (gol, '(" sume :", e12.4 )' ) sume ; call goPr
  831. ! mbef = sum(rm(i1:i2,j1:j2,:,i_tracer))
  832. ! write (gol,*) 'lbounds:', is,i1,js,j1 ; call goPr
  833. ! endif
  834. do l=1,ubound_e(3)
  835. do j=j1,j2
  836. do i=i1,i2
  837. xlat = ybeg(region) + (j-0.5)*dy/yref(region)
  838. if (xlat .gt. -20 .and. xlat .lt. 20) then
  839. ! apply emission cycle in tropics only
  840. ! itim = 1 and lon = -180 --->position 1
  841. ! itim = ntim ant lon = -180 --->position ntim, etc.
  842. ! itim = 1 and lon = 0 ---->position ntim/2
  843. xlon = xbeg(region) + (i-0.5)*dx/xref(region)
  844. ipos = 1 + mod(int((xlon+180.)*ntim/360.) + (itim-1),ntim) !position in array depending on time and lon.
  845. x = emis_field(i,j,l)*month2dt*(mol_mass/mol_mass_e)*efrac*curr_cycle(ipos)
  846. else
  847. x = emis_field(i,j,l)*month2dt*(mol_mass/mol_mass_e)*efrac
  848. endif
  849. rm(i,j,l,i_tracer) = rm(i,j,l,i_tracer) + x
  850. #ifdef with_budgets
  851. ! budget___
  852. ! if(region==nregions) then !sub budget finest region
  853. ! nzone=nzon(i,j)
  854. ! nzone_v=nzon_v(l)
  855. ! budemi(nzone,nzone_v,i_tracer)=budemi(nzone,nzone_v,i_tracer)+x/mol_mass*1e3 !mole
  856. ! endif
  857. nzone=budg_dat(region)%nzong(i,j) !global budget
  858. nzone_v=nzon_vg(l)
  859. budemi_dat(region)%emi(i,j,nzone_v,i_tracer) = &
  860. budemi_dat(region)%emi(i,j,nzone_v,i_tracer) + x/mol_mass*1e3
  861. if(i_tracer ==1) sum_emission(region) = sum_emission(region) + x !in kg
  862. #endif
  863. enddo
  864. enddo
  865. enddo !levels
  866. ! if (okdebug) then
  867. ! maft = sum(rm(i1:i2,j1:j2,:,i_tracer))
  868. ! write (gol, '(" after-before :", e12.4 )' ) maft-mbef ; call goPr
  869. ! !if ( sume > tiny(sume) ) then
  870. ! ! This is wrong...
  871. ! ! if ( (maft-mbef)/sume < 0.5) then
  872. ! ! write (gol, '(" spurious do_add_3d_cycle.... ")' ) ; call goPr
  873. ! ! call dumpfield(1, 'spurious.hdf', im(region), jm(region), ubound_e(3), 1, emis_field, names(i_tracer))
  874. ! ! endif
  875. ! !endif
  876. ! write (gol, '(" END debug output ")' ) ; call goPr
  877. ! endif
  878. nullify(rm)
  879. end subroutine do_add_3d_cycle
  880. !EOC
  881. !--------------------------------------------------------------------------
  882. ! TM5 !
  883. !--------------------------------------------------------------------------
  884. !BOP
  885. !
  886. ! !IROUTINE: DISTRIBUTE_L44
  887. !
  888. ! !DESCRIPTION: Scales input field (field2d) such that
  889. ! 1) NH temperate vegetation fires are distributed over the
  890. ! months: july-august-september
  891. ! 2) SH temperate vegetation fires are distributed over the
  892. ! months: January-February-March
  893. !\\
  894. !\\
  895. ! !INTERFACE:
  896. !
  897. SUBROUTINE DISTRIBUTE_L44(month, imdim, jmdim, field2d)
  898. !
  899. ! !USES:
  900. !
  901. use dims, only : okdebug
  902. !
  903. ! !INPUT PARAMETERS:
  904. !
  905. integer, intent(in) :: month ! month
  906. integer, intent(in) :: jmdim, imdim ! dimension of grid
  907. !
  908. ! !REVISION HISTORY:
  909. ! 1 Oct 2010 - Achim Strunk - protex
  910. !
  911. !EOP
  912. !------------------------------------------------------------------------
  913. !BOC
  914. real,dimension(imdim,jmdim) :: field2d
  915. real :: bb_nh,bb_sh ! multiplication factor for yearly temperate fires
  916. integer :: j,i
  917. bb_nh=0.
  918. bb_sh=0.
  919. if (month==7.or.month==8.or.month==9) bb_nh=3./12.
  920. if (month==1.or.month==2.or.month==3) bb_sh=3./12.
  921. do i=1, imdim
  922. do j=1, jmdim/2
  923. field2d(i,j)=field2d(i,j)*bb_sh
  924. enddo
  925. do j=jmdim/2+1,jmdim
  926. field2d(i,j)=field2d(i,j)*bb_nh
  927. enddo
  928. enddo
  929. if(okdebug) then
  930. write(gol,*) 'l44 is distributed' ; call goPr
  931. endif
  932. END SUBROUTINE DISTRIBUTE_L44
  933. !EOC
  934. END MODULE EMISSION_DATA