BioCro  0.92
 All Data Structures Files Functions Variables Typedefs Macros
methane.c File Reference
#include <R.h>
#include <math.h>
#include <Rmath.h>
#include <Rinternals.h>
#include "soilwater.h"
#include "n2o_model.h"
+ Include dependency graph for methane.c:

Go to the source code of this file.

Macros

#define CH4DEPTH   15.0
 

Functions

void methane_oxidation (double *CH4, int *isdecid, int *isagri, LAYERPAR_SPT layers, SOIL_SPT soil)
 

Macro Definition Documentation

#define CH4DEPTH   15.0

Function Documentation

void methane_oxidation ( double *  CH4,
int *  isdecid,
int *  isagri,
LAYERPAR_SPT  layers,
SOIL_SPT  soil 
)
98  {
99  int ilyr;
100  double bulkdensity;
101  double fieldcapacity;
102  double soiltemp;
103  double soilwater;
104  double wfps;
105  double CH4max;
106  double Dopt;
107  double Wmin;
108  double Wmax;
109  double Wopt;
110  double agri_adjust;
111  double temp_adjust;
112  double watr_adjust;
113  double wfps_adjust;
114  double percentlayer;
115  double temp;
116 
117 /*
118  extern LAYERPAR_SPT layers;
119  extern SOIL_SPT soil;
120 */
121  /* Compute a weighted average for soil temperature, field capacity, */
122  /* bulk density, water filled pore space, and volumetric soil water */
123  /* content in top 15 cm of soil profile */
124  ilyr = 0;
125  bulkdensity = 0.0;
126  fieldcapacity = 0.0;
127  soiltemp = 0.0;
128  soilwater = 0.0;
129  wfps = 0.0;
130  for (ilyr = 0; ilyr < layers->numlyrs; ilyr++) {
131  if (layers->dpthmn[ilyr] < CH4DEPTH) {
132  if (layers->dpthmx[ilyr] <= CH4DEPTH) {
133  bulkdensity += layers->bulkd[ilyr] * layers->width[ilyr] /
134  CH4DEPTH;
135  fieldcapacity += layers->fieldc[ilyr] * layers->width[ilyr] /
136  CH4DEPTH;
137  soiltemp += soil->soiltavg[ilyr] * layers->width[ilyr] / CH4DEPTH;
138  soilwater += layers->wfps[ilyr] * layers->width[ilyr] / CH4DEPTH;
139  wfps += layers->wfps[ilyr] * layers->width[ilyr] / CH4DEPTH;
140  } else if ((layers->dpthmx[ilyr] - layers->dpthmn[ilyr]) > 0.0) {
141  percentlayer = (CH4DEPTH - layers->dpthmn[ilyr]) /
142  (layers->dpthmx[ilyr] - layers->dpthmn[ilyr]);
143  bulkdensity += layers->bulkd[ilyr] * layers->width[ilyr] /
144  CH4DEPTH * percentlayer;
145  fieldcapacity += layers->fieldc[ilyr] * layers->width[ilyr] /
146  CH4DEPTH * percentlayer;
147  soiltemp += soil->soiltavg[ilyr] * layers->width[ilyr] /
148  CH4DEPTH * percentlayer;
149  soilwater += layers->wfps[ilyr] * layers->width[ilyr] / CH4DEPTH *
150  percentlayer;
151  wfps += layers->wfps[ilyr] * layers->width[ilyr] / CH4DEPTH *
152  percentlayer;
153  }
154  }
155  }
156  /* Convert from water filled pore space to volumetric water */
157  soilwater = soilwater * (1.0 - (bulkdensity / PARTDENS));
158  soilwater *= 100.0;
159 
160  /* CH4 oxidation for a deciduous system */
161  if (*isdecid) {
162  CH4max = 40.0 - 18.3 * bulkdensity;
163  temp_adjust = 0.0209 * soiltemp + 0.845;
164  /* Use bounded value for wfps_adjust if wfps falls below a critical */
165  /* value, cak - 11/12/02 */
166  if (wfps <= 0.05) {
167  wfps_adjust = 0.1;
168  } else {
169  wfps_adjust = pow((10.0 * wfps - 0.5) / (1.84 - 0.5), 0.13);
170  wfps_adjust *= pow((10.0 * wfps - 55) / (1.84 - 55),
171  (0.13 * (55 - 1.84)) / (1.84 - 0.5));
172  wfps_adjust = max(0.1, wfps_adjust);
173  }
174  *CH4 = CH4max * wfps_adjust * temp_adjust;
175 
176  } else {
177  /* CH4 oxidation for a grassland/coniferous/tropical system */
178  Wmin = 3.0 * fieldcapacity - 0.28;
179  Wopt = 6.3 * fieldcapacity - 0.58;
180  Wmax = 10.6 * fieldcapacity + 1.9;
181  temp = Wopt * 0.1 / (1.0 - (bulkdensity / PARTDENS));
182  Dopt = diffusiv(&fieldcapacity, &bulkdensity, &temp);
183  CH4max = 53.8 * Dopt + 0.58;
184  if ((0.1*soilwater < Wmin) || 0.1*soilwater > Wmax) {
185  watr_adjust = 0.1;
186  } else {
187  watr_adjust = pow(((0.1 * soilwater - Wmin) / (Wopt - Wmin)), 0.4) *
188  pow(((0.1 * soilwater - Wmax) / (Wopt - Wmax)),
189  ((0.4 * (Wmax - Wopt)) / (Wopt - Wmin)));
190  watr_adjust = max(0.1, watr_adjust);
191  }
192  if (*isagri) {
193  if (Dopt < 0.15) {
194  agri_adjust = 0.9;
195  } else if (Dopt > 0.28) {
196  agri_adjust = 0.28;
197  } else {
198  agri_adjust = -4.6 * Dopt + 1.6;
199  }
200  } else {
201  agri_adjust = 1.0;
202  }
203  temp_adjust = (soiltemp * max(0.11, Dopt) * 0.095) + 0.9;
204  *CH4 = CH4max * watr_adjust * temp_adjust * agri_adjust;
205  }
206 
207  return;
208  }
double soiltavg[MAXLYR]
Definition: soilwater.h:142
#define CH4DEPTH
Definition: methane.c:95
double fieldc[MAXLYR]
Definition: soilwater.h:76
double dpthmx[MAXLYR]
Definition: soilwater.h:74
int numlyrs
Definition: soilwater.h:86
double bulkd[MAXLYR]
Definition: soilwater.h:75
void wfps(LAYERPAR_SPT layers)
Definition: wfps.c:50
double width[MAXLYR]
Definition: soilwater.h:71
#define max(a, b)
Definition: diffusiv.c:67
double diffusiv(double *A, double *bulkden, double *wfps)
Definition: diffusiv.c:69
double wfps[MAXLYR]
Definition: soilwater.h:92
#define PARTDENS
Definition: diffusiv.c:65
double dpthmn[MAXLYR]
Definition: soilwater.h:73