bvoc.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. ///////////////////////////////////////////////////////////////////////////////////////
  2. /// \file bvoc.cpp
  3. /// \brief The BVOC module
  4. ///
  5. /// Calculation of VOC production and emission by vegetation.
  6. ///
  7. /// \author Guy Schurgers (using Almut's previous attempts)
  8. /// $Date: 2013-04-30 11:05:01 +0200 (Tue, 30 Apr 2013) $
  9. ///
  10. ///////////////////////////////////////////////////////////////////////////////////////
  11. // WHAT SHOULD THIS FILE CONTAIN?
  12. // Module source code files should contain, in this order:
  13. // (1) a "#include" directive naming the framework header file. The framework
  14. // header file should define all classes used as arguments to functions in
  15. // the present module. It may also include declarations of global functions,
  16. // constants and types, accessible throughout the model code;
  17. // (2) other #includes, including header files for other modules accessed by
  18. // the present one;
  19. // (3) type definitions, constants and file scope global variables for use
  20. // within the present module only;
  21. // (4) declarations of functions defined in this file, if needed;
  22. // (5) definitions of all functions. Functions that are to be accessible to
  23. // other modules or to the calling framework should be declared in the module
  24. // header file.
  25. //
  26. // PORTING MODULES BETWEEN FRAMEWORKS:
  27. // Modules should be structured so as to be fully portable between models
  28. // (frameworks). When porting between frameworks, the only change required
  29. // should normally be in the "#include" directive referring to the framework
  30. // header file.
  31. #include "config.h"
  32. #include "bvoc.h"
  33. #include "canexch.h"
  34. const double CO2 = 370; // standard CO2 concentration
  35. const double Tstand = 30; // standard temperature, oC
  36. void initbvoc(){
  37. // initialising the VOC calculations: calculating the fraction of electrones
  38. // available for isoprene production from the isoprene and monoterpene
  39. // emission capacities (at T = 30oC and Q = 1000 umol m-2 s-1) as given by e.g.
  40. // Guenther et al. (1997) for all PFTs
  41. const double Qstand = 1e-3; // radiation, mol m-2 s-1
  42. const double Cfrac = 0.5; // mass fraction of C in leaves
  43. const double frabs_Q = 0.35; // fraction of light absorbed in the first
  44. // canopy layer (for standard measurements),
  45. // 25% to 35% (Almut)
  46. const double daylength = 12;
  47. PhotosynthesisResult phot;
  48. pftlist.firstobj();
  49. while (pftlist.isobj) {
  50. Pft& pft = pftlist.getobj();
  51. double par = frabs_Q * Qstand * 3600 * daylength / alphaa(pft) / CQ;
  52. // par for the standard condition, J m-2 d-1
  53. photosynthesis(CO2, Tstand, par, daylength, 1.0, pft.lambda_max, pft, 1.0, false, phot, -1);
  54. double coeff = 1e-3 / (phot.je + phot.rd_g/24) / pft.sla / Cfrac;
  55. // electron fraction assigned to isoprene and monoterpenes for the
  56. // standard case
  57. pft.eps_iso *= coeff;
  58. for(int im=0;im<NMTCOMPOUNDS;im++){
  59. pft.eps_mon[im] *= coeff;
  60. }
  61. pftlist.nextobj();
  62. }
  63. }
  64. double daytime_temp(double temp, double daylength, double dtr) {
  65. // Convert daily temperature to daytime temperature (deg C) using the actual
  66. // amplitude the conversion assumes a perfect sine function for
  67. // temperature, with the maximum temperature reached at noon (derivation by
  68. // Colin Prentice, checked)
  69. double hdl = daylength * PI / 24;
  70. return temp + dtr / 2 * sin(hdl) / hdl;
  71. }
  72. void iso_mono(double co2, double temp, double daylength, const Pft& pft, double temprel,
  73. const PhotosynthesisResult& phot, Individual& indiv, double adtmm) {
  74. // Calculation of isoprene and monoterpene emissions coupled to
  75. // photosynthesis as described in Arneth et al. (2007) for isoprene and
  76. // Schurgers et al. (2009) for monoterpenes.
  77. // (selected) INPUT PARAMETERS
  78. // temp = water-stressed leaf temperature for the day-light part of the
  79. // period, same as temprel in diurnal mode (deg C)
  80. // daylength = duration of the period (h)
  81. // temprel = water-stressed leaf temperature for the whole period (deg C)
  82. // phot = non-water-stressed photosynthesis
  83. int im;
  84. const double tcstor_s = 80; // time constant for monoterpene storage under standard temp
  85. const double tcstor_max = 365; // maximum time constant for monoterpene storage (d)
  86. const double tcstor_min = 2; // minimum time constant for monoterpene storage (d)
  87. const double q10_mstor = 1.9; // Q10 value for monoterpene storage
  88. const double f_tempmax = 2.3; // maximum temperature scaling factor
  89. const double epsT = 0.1; // temperature sensitivity
  90. double rmonstor[NMTCOMPOUNDS]; // rate of monoterpene storage
  91. if(adtmm>0){
  92. double f_co2 = CO2/co2; // CO2 scaling factor
  93. double f_temp = min(f_tempmax, exp(epsT*(temp-Tstand))); // temp scaling factor
  94. double coeff = phot.je * daylength + phot.rd_g;
  95. // isoprene production, g C m-2 d-1
  96. indiv.iso = pft.eps_iso * f_co2 * f_temp * indiv.fvocseas * coeff;
  97. // monoterpene production, g C m-2 d-1
  98. // (only the production part is given here)
  99. for(im=0;im<NMTCOMPOUNDS;im++){
  100. indiv.mon[im] = pft.eps_mon[im] * f_co2 * f_temp * coeff;
  101. }
  102. }
  103. else {
  104. indiv.iso=0.;
  105. for(im=0;im<NMTCOMPOUNDS;im++){
  106. indiv.mon[im]=0.;
  107. }
  108. }
  109. // release from monoterpene storage, g C m-2 d-1
  110. double dmonstor = tcstor_s / pow(q10_mstor, (temprel-Tstand)/10.);
  111. dmonstor = 1. / max(min(dmonstor, tcstor_max), tcstor_min) / date.subdaily;
  112. // convert from g C m-2 d-1 to mg C m-2 d-1
  113. indiv.iso *= 1e3 / date.subdaily;
  114. for(im=0;im<NMTCOMPOUNDS;im++){
  115. indiv.mon[im] *= 1e3 / date.subdaily;
  116. rmonstor[im] = -indiv.monstor[im] * dmonstor + pft.storfrac_mon[im] * indiv.mon[im];
  117. indiv.monstor[im] += rmonstor[im];
  118. indiv.mon[im] -= rmonstor[im];
  119. }
  120. }
  121. double leafT(double temp, double daylength, double ga, double rs_day, double aet,
  122. double lai_today, double fpar, double fpc, double fpc_today) {
  123. // Canopy temperature is calculated from the air temperature and the energy balance (longwave
  124. // radiation, shortwave radiation and sensible and latent heat loss).
  125. // Revised version compared to Arneth et al. (2007) and Schurgers et al. (2011).
  126. if(lai_today <= 1.e-2) {
  127. return temp;
  128. }
  129. const double lam = 2.45e6; // latent heat loss of vapourisation (J g-1 at 20 deg C)
  130. const double sigma = 5.67e-8; // Stefan-Boltzmann constant, W m-2 K-4
  131. const double emiss_leaf = .97; // average emissivity for leaves, Campbell and Norman, (1998)
  132. const double rhoair = 1.204; // air density, kg m-3
  133. const double cp = 1010; // specific heat capacity of air, J kg-1 K-1
  134. // leaf temperature is calculated by balancing four fluxes:
  135. // 1. net SW radiation, computed from the incoming radiation
  136. // S_net = -rs_day*fpar/(daylength*3600.)
  137. // 2. net LW radiation, computed as a first-order Taylor expansion of Stefan-Boltzman law,
  138. // which makes it a linear function of the temperature difference deltaT
  139. // L_net = 4*emiss_leaf*sigma*(T**3.)*deltaT*phen*lai
  140. // 3. latent heat, computed from actual evapotranspiration AET
  141. // LH = aet*lam/(daylength*3600.)
  142. // 4. sensible heat, computed as a linear function of the temperat
  143. // H = deltaT*rhoair*cp*ga*phen*lai
  144. //
  145. return temp+(rs_day*fpar-aet*lam)/(3600.*daylength)/
  146. (4.*emiss_leaf*sigma*pow(temp+K2degC,3.)*fpc_today+rhoair*cp*ga*lai_today);
  147. }
  148. void seasonality(Climate& climate, const Pft& pft, double& f_season) {
  149. // Calculating the seasonality for VOCs (isoprene and monoterpene) for PFTs
  150. // Revised version compared to Arneth et al. (2007).
  151. // Seasonality switch pft.seas_iso read in from .ins file
  152. const double rdr = .05; // relative decay rate (d-1)
  153. const double tmin = 5; // minimum temperature for end of growing season (oC)
  154. const double dmin = 11; // minimum daylength for end of growing season (h)
  155. const double mulgdd = 2; // required GDD sum for VOCs is assumed to be twice
  156. // as large as for phenology
  157. if (pft.seas_iso == 0) {
  158. f_season = 1;
  159. }
  160. else {
  161. double vocgdd5ramp = mulgdd * pft.phengdd5ramp;
  162. // GDD sum required for full expression of isoprene
  163. // synthase/isoprene production
  164. if (climate.agdd5 <= vocgdd5ramp) {
  165. f_season = vocgdd5ramp != 0 ? climate.agdd5/vocgdd5ramp : 1;
  166. }
  167. else if (climate.temp < tmin || climate.daylength < dmin) {
  168. f_season *= 1-rdr;
  169. }
  170. else {
  171. f_season = 1;
  172. }
  173. }
  174. }
  175. void bvoc(double temp, double hours, double rad, Climate& climate, Patch& patch,
  176. Individual& indiv, const Pft& pft, const PhotosynthesisResult& phot,
  177. double adtmm, const Day& day) {
  178. // Calculation of isoprene and monoterpene production in leaves as a function
  179. // of photosynthesis. Isoprene and monoterpenes are calculated from a
  180. // standardized fraction of the total photosynthesis, which is adjusted as
  181. // a function of temperature, CO2 concentration and (for isoprene)
  182. // seasonality.
  183. // Isoprene calculations following Arneth et al. (2007), monoterpene
  184. // calculations following Schurgers et al. (2009). Compared to the original
  185. // publications, adjustments were made in the calculation of leaf
  186. // temperatures (which account now for longwave radiation as well, and
  187. // perform a weighted averaging over the whole canopy), and in the calculation
  188. // of isoprene seasonality (which requires a GDD sum twice as large as
  189. // required for phenology, and decreases with a relative rate at the end of
  190. // the growing season).
  191. // Changes made to accommodate diurnal mode, include re-calculating seasonality
  192. // irrespective of the possibility of BVOC emissions, and switching to
  193. // photosynthesis pre-calculated with air temperature (instead of leaf
  194. // temperature previously).
  195. // (selected) INPUT PARAMETERS
  196. // temp = temperature for this calculation period (deg C)
  197. // hours = in diurnal mode should equal 24 (to convert to daily units),
  198. // in daily/monthly mode should equal to "climate.daylength" parameter (h)
  199. // climate:
  200. // daylength = actual daylength of the day the calculation period belongs to (h)
  201. // dtr = diurnal temperature range (not used in diurnal mode) (deg C)
  202. // phot = non-water stressed photosynthesis
  203. // adtmm = actual (water-stressed) photosynthesis production for the period (mm/m2/day)
  204. if (day.isstart) {
  205. // calculate seasonality for VOC emissions
  206. seasonality(climate, pft, indiv.fvocseas);
  207. }
  208. if (adtmm <= 0) {
  209. return;
  210. }
  211. double temp_leaf_daytime;
  212. double temp_leaf = leafT(temp, hours, pft.ga, rad, indiv.aet,
  213. indiv.lai_today(),indiv.fpar,indiv.fpc,indiv.fpc_today());
  214. if (date.diurnal()) {
  215. temp_leaf_daytime = temp_leaf;
  216. }
  217. else {
  218. // perform daily to daytime correction
  219. double temp_corrected = daytime_temp(climate.temp, climate.daylength, climate.dtr);
  220. // perform air temperature to leaf temperature correction
  221. temp_leaf_daytime = leafT(temp_corrected, climate.daylength, pft.ga, rad, indiv.aet,
  222. indiv.lai_today(),indiv.fpar,indiv.fpc, indiv.fpc_today());
  223. }
  224. // calculate isoprene and monoterpene emissions, g C m-2 d-1
  225. iso_mono(climate.co2, temp_leaf_daytime, hours, pft, temp_leaf, phot, indiv, adtmm);
  226. indiv.report_flux(Fluxes::ISO, indiv.iso);
  227. // Note that for european pfts only 2 groups (endocyclic (MT1) and rest (MT2) group are considered,
  228. // occupying the space of APIN & BPIN respectively).
  229. // See scientific description for more infor.
  230. indiv.report_flux(Fluxes::MT1, indiv.mon[0] + indiv.mon[2] + indiv.mon[6]);
  231. indiv.report_flux(Fluxes::MT2, indiv.mon[1] + indiv.mon[3] + indiv.mon[4] + indiv.mon[5] + indiv.mon[7] + indiv.mon[8]);
  232. }
  233. // REFERENCES
  234. //
  235. // Arneth, A., Niinemets, Ü, Pressley, S., Bäck, J., Hari, P., Karl, T., Noe,
  236. // S., Prentice, I.C., Serca, D., Hickler, T., Wolf, A., Smith, B., 2007.
  237. // Process-based estimates of terrestrial ecosystem isoprene emissions:
  238. // incorporating the effects of a direct CO2-isoprene interaction.
  239. // Atmospheric Chemistry and Physics, 7, 31-53.
  240. // Campbell, G.S., Norman, J.M., 1998. An introduction to environmental
  241. // biophysics, 2nd edition. Springer, New York.
  242. // Guenther, A., 1997. Seasonal and spatial variations in natural volatile
  243. // organic compound emissions. Ecological Applications, 7, 34-45.
  244. // Niinemets, Ü, Tenhunen, J.D., Harley, P.C., Steinbrecher, R., 1999. A model
  245. // of isoprene emission based on energetic requirements for isoprene
  246. // synthesisand leaf photosynthetic properties for Liquidambar and Quercus.
  247. // Plant, Cell and Environment, 22, 1319-1335.
  248. // Schurgers, G., Arneth, A., Holzinger, R., Goldstein, A., 2009. Process-
  249. // based modelling of biogenic monoterpene emissions combining production
  250. // and release from storage. Atmospheric Chemistry and Physics, 9, 3409-3423.
  251. // Schurgers, G., Arneth, A., Hickler, T., 2011. Effect of climate-driven changes
  252. // in species composition on regional emission capacities of biogenic
  253. // compounds. Journal of Geophysical Research, 116, D22304.