78
78
// do we have a separate litter water layer, used for evaporation?
79
79
// if complex water is off, then litter water is off: litter water layer wouldn't do anything
80
80
81
+ #if LITTER_WATER & EVENT_HANDLER
82
+ #error EVENT_HANDLER and LITTER_WATER may not both be activated
83
+ #endif
84
+ // We do not handle having both LITTER_WATER and EVENT_HANDLING on; this may
85
+ // be implemented in a later phase
86
+
81
87
#define LITTER_WATER_DRAINAGE 1 && (LITTER_WATER)
82
88
// does water from the top layer drain down into bottom layer even if top layer not overflowing?
83
89
// if litter water is off, then litter water drainage is off: litter water drainage wouldn't do anything
@@ -2271,7 +2277,7 @@ void updateTrackers(double oldSoilWater) {
2271
2277
trackers .LAI = envi .plantLeafC /params .leafCSpWt ;
2272
2278
trackers .yearlyLitter += fluxes .leafLitter ;
2273
2279
trackers .plantWoodC = envi .plantWoodC ;
2274
- //note this variable is added for Howland forest multi-model comparison includes ONLY leaf litter
2280
+ //note this variable is added for Howland forest multi-model comparison includes ONLY leaf litter
2275
2281
2276
2282
2277
2283
// mean of soil wetness at start of time step at soil wetness at end of time step - assume linear
@@ -2298,9 +2304,28 @@ void processEvents() {
2298
2304
switch (locEvent -> type ) {
2299
2305
// Implementation TBD, as we enable the various event types
2300
2306
case IRRIGATION :
2301
- // TBD
2302
- printf ("Irrigation events not yet implemented\n" );
2303
- break ;
2307
+ {
2308
+ const IrrigationParams * irrParams = locEvent -> eventParams ;
2309
+ const double amount = irrParams -> amountAdded ;
2310
+ if (irrParams -> method == CANOPY ) {
2311
+ // Part of the irrigation evaporates, and the rest makes it to the soil
2312
+ // Evaporated fraction
2313
+ const double evapAmount = params .immedEvapFrac * amount ;
2314
+ fluxes .immedEvap += evapAmount ;
2315
+ // Remainder goes to the soil
2316
+ const double soilAmount = amount - evapAmount ;
2317
+ envi .soilWater += soilAmount ;
2318
+ }
2319
+ else if (irrParams -> method == SOIL ) {
2320
+ // All goes to the soil
2321
+ envi .soilWater += amount ;
2322
+ }
2323
+ else {
2324
+ printf ("Unknown irrigation method type: %d\n" , irrParams -> method );
2325
+ exit (EXIT_CODE_UNKNOWN_EVENT_TYPE_OR_PARAM );
2326
+ }
2327
+ }
2328
+ break ;
2304
2329
case PLANTING :
2305
2330
// TBD
2306
2331
printf ("Planting events not yet implemented\n" );
@@ -2319,7 +2344,7 @@ void processEvents() {
2319
2344
break ;
2320
2345
default :
2321
2346
printf ("Unknown event type (%d) in processEvents()\n" , locEvent -> type );
2322
- exit (EXIT_CODE_UNKNOWN_EVENT );
2347
+ exit (EXIT_CODE_UNKNOWN_EVENT_TYPE_OR_PARAM );
2323
2348
}
2324
2349
2325
2350
locEvent = locEvent -> nextEvent ;
@@ -2348,13 +2373,11 @@ void updateState() {
2348
2373
soilDegradation (); // This updates all the soil functions
2349
2374
2350
2375
#if MODEL_WATER // water pool updating happens here:
2351
-
2352
2376
#if LITTER_WATER // (2 soil water layers; litter water will only be on if complex water is also on)
2353
2377
envi .litterWater += (fluxes .rain + fluxes .snowMelt - fluxes .immedEvap - fluxes .fastFlow
2354
2378
- fluxes .evaporation - fluxes .topDrainage ) * climate -> length ;
2355
2379
envi .soilWater += (fluxes .topDrainage - fluxes .transpiration - fluxes .bottomDrainage )
2356
2380
* climate -> length ;
2357
-
2358
2381
#else // LITTER_WATER = 0 (only one soil water layer)
2359
2382
// note: some of these fluxes will always be 0 if complex water is off
2360
2383
envi .soilWater += (fluxes .rain + fluxes .snowMelt - fluxes .immedEvap - fluxes .fastFlow
0 commit comments