From e40800009966c1561d2d0b18b4fc8777977ffe32 Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Mon, 25 Aug 2025 12:24:36 -0400 Subject: [PATCH 01/17] Switches events to flux model, ensures smoke test output has not changed --- src/common/context.c | 7 +- src/sipnet/cli.c | 1 + src/sipnet/sipnet.c | 109 ++++++++++------ src/sipnet/state.h | 19 +++ tests/smoke/russell_1/events.out | 216 +++++++++++++++---------------- tests/smoke/russell_3/events.out | 216 +++++++++++++++---------------- tests/smoke/russell_4/events.out | 216 +++++++++++++++---------------- tools/smoke_check.py | 2 + 8 files changed, 418 insertions(+), 368 deletions(-) diff --git a/src/common/context.c b/src/common/context.c index 1ec4d337..c3cf5607 100644 --- a/src/common/context.c +++ b/src/common/context.c @@ -184,10 +184,15 @@ void validateContext(void) { int hasError = 0; if (ctx.soilPhenol && ctx.gdd) { - logError("soil-phenol and gdd may not both be turned on"); + logError("soil-phenol and gdd may not both be turned on\n"); hasError = 1; } + // if (ctx.events && ctx.microbes) { + // logError("events and microbes may not both be turned on\n"); + // hasError = 1; + // } + if (hasError) { exit(EXIT_CODE_BAD_PARAMETER_VALUE); } diff --git a/src/sipnet/cli.c b/src/sipnet/cli.c index afd679b6..2fe89298 100644 --- a/src/sipnet/cli.c +++ b/src/sipnet/cli.c @@ -101,6 +101,7 @@ void usage(char *progName) { printf("\n"); printf("Note the following restrictions on these options:\n"); printf(" --soil-phenol and --gdd may not both be turned on\n"); + printf(" --events and --microbes may not both be turned on\n"); // clang-format on } diff --git a/src/sipnet/sipnet.c b/src/sipnet/sipnet.c index 68b420f9..512a3a33 100644 --- a/src/sipnet/sipnet.c +++ b/src/sipnet/sipnet.c @@ -1513,6 +1513,28 @@ void updateTrackers(double oldSoilWater) { trackers.yearlyLitter += fluxes.leafLitter; } +void resetEventFluxes(void) { + fluxes.eventLeafC = 0.0; + fluxes.eventWoodC = 0.0; + fluxes.eventFineRootC = 0.0; + fluxes.eventCoarseRootC = 0.0; + fluxes.eventEvap = 0.0; + fluxes.eventSoilWater = 0.0; + fluxes.eventLitterC = 0.0; +} + +void convertEventsToFluxes(void) { + // Events are specified as amounts; after all events are processed, convert to + // fluxes + fluxes.eventLeafC /= climate->length; + fluxes.eventWoodC /= climate->length; + fluxes.eventFineRootC /= climate->length; + fluxes.eventCoarseRootC /= climate->length; + fluxes.eventEvap /= climate->length; + fluxes.eventSoilWater /= climate->length; + fluxes.eventLitterC /= climate->length; +} + /*! * \brief Process events for current location/year/day * @@ -1528,6 +1550,10 @@ void processEvents(void) { // This should be in events.h/c, but with all the global state defined in this // file, let's leave it here for now. Maybe someday we will factor that out. + // Set all event fluxes to zero, as these have no memory from one step to + // the next + resetEventFluxes(); + // If event starts off NULL, this function will just fall through, as it // should. const int climYear = climate->year; @@ -1564,10 +1590,10 @@ void processEvents(void) { printf("Unknown irrigation method type: %d\n", irrParams->method); exit(EXIT_CODE_UNKNOWN_EVENT_TYPE_OR_PARAM); } - fluxes.immedEvap += evapAmount; - envi.soilWater += soilAmount; - writeEventOut(eventOutFile, event, 2, "envi.soilWater", soilAmount, - "fluxes.immedEvap", evapAmount); + fluxes.eventEvap += evapAmount; + fluxes.eventSoilWater += soilAmount; + writeEventOut(eventOutFile, event, 2, "fluxes.eventSoilWater", + soilAmount, "fluxes.eventEvap", evapAmount); } break; case PLANTING: { const PlantingParams *plantParams = event->eventParams; @@ -1577,16 +1603,16 @@ void processEvents(void) { const double coarseRootC = plantParams->coarseRootC; // Update the pools - envi.plantLeafC += leafC; - envi.plantWoodC += woodC; - envi.fineRootC += fineRootC; - envi.coarseRootC += coarseRootC; + fluxes.eventLeafC += leafC; + fluxes.eventWoodC += woodC; + fluxes.eventFineRootC += fineRootC; + fluxes.eventCoarseRootC += coarseRootC; // FUTURE: allocate to N pools - writeEventOut(eventOutFile, event, 4, "envi.plantLeafC", leafC, - "envi.plantWoodC", woodC, "envi.fineRootC", fineRootC, - "envi.coarseRootC", coarseRootC); + writeEventOut(eventOutFile, event, 4, "fluxes.eventLeafC", leafC, + "fluxes.eventWoodC", woodC, "fluxes.eventFineRootC", + fineRootC, "fluxes.eventCoarseRootC", coarseRootC); } break; case HARVEST: { // Harvest can both remove biomass and move biomass to the litter pool @@ -1595,7 +1621,6 @@ void processEvents(void) { const double fracTA = harvParams->fractionTransferredAbove; const double fracRB = harvParams->fractionRemovedBelow; const double fracTB = harvParams->fractionTransferredBelow; - char carbonPool[20] = ""; // Litter increase const double litterAdd = fracTA * (envi.plantLeafC + envi.plantWoodC) + @@ -1609,25 +1634,18 @@ void processEvents(void) { const double coarseDelta = -envi.coarseRootC * (fracRB + fracTB); // Pool updates: - if (ctx.litterPool) { - envi.litter += litterAdd; - strcpy(carbonPool, "env.litter"); - } else { - // If the litter pool is not turned on, add it to the soil pool - envi.soil += litterAdd; - strcpy(carbonPool, "env.soil"); - } - envi.plantLeafC += leafDelta; - envi.plantWoodC += woodDelta; - envi.fineRootC += fineDelta; - envi.coarseRootC += coarseDelta; + fluxes.eventLitterC += litterAdd; + fluxes.eventLeafC += leafDelta; + fluxes.eventWoodC += woodDelta; + fluxes.eventFineRootC += fineDelta; + fluxes.eventCoarseRootC += coarseDelta; // FUTURE: move/remove biomass in N pools - writeEventOut(eventOutFile, event, 5, carbonPool, litterAdd, - "envi.plantLeafC", leafDelta, "envi.plantWoodC", - woodDelta, "envi.fineRootC", fineDelta, - "envi.coarseRootC", coarseDelta); + writeEventOut(eventOutFile, event, 5, "fluxes.eventLitterC", litterAdd, + "fluxes.eventLeafC", leafDelta, "fluxes.eventWoodC", + woodDelta, "fluxes.eventFineRootC", fineDelta, + "fluxes.eventCoarseRootC", coarseDelta); } break; case TILLAGE: // TBD @@ -1638,26 +1656,13 @@ void processEvents(void) { // const double orgN = fertParams->orgN; const double orgC = fertParams->orgC; // const double minN = fertParams->minN; - char carbonPool[20] = ""; - // Pool updates: - if (ctx.litterPool) { - envi.litter += orgC; - strcpy(carbonPool, "env.litter"); - // orgN - // minN - } else { - // If the litter pool is not turned on, add it to the soil pool - envi.soil += orgC; - strcpy(carbonPool, "env.soil"); - // orgN - // minN - } + fluxes.eventLitterC += orgC; // FUTURE: allocate to N pools // This will (likely) be 3 params eventually - writeEventOut(eventOutFile, event, 1, carbonPool, orgC); + writeEventOut(eventOutFile, event, 1, "fluxes.eventLitterC", orgC); } break; default: printf("Unknown event type (%d) in processEvents()\n", event->type); @@ -1666,6 +1671,11 @@ void processEvents(void) { event = event->nextEvent; } + + // Last, convert the event calculations - specified as amounts - to fluxes. + // It's true that this conversion will immediately be undone when updating + // pools, but let's keep fluxes as fluxes. + convertEventsToFluxes(); } // !!! main runner function !!! @@ -1734,6 +1744,19 @@ void updateState(void) { // handled as instantaneous deltas to relevant state (envi and fluxes fields), processEvents(); + // This should keep output unchanged, even though this needs to be moved. + // One step at a time. + envi.plantWoodC += fluxes.eventWoodC * climate->length; + envi.plantLeafC += fluxes.eventLeafC * climate->length; + envi.soilWater += fluxes.eventSoilWater * climate->length; + if (ctx.litterPool) { + envi.litter += fluxes.eventLitterC * climate->length; + } else { + envi.soil += fluxes.eventLitterC * climate->length; + } + envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; + envi.fineRootC += fluxes.eventFineRootC * climate->length; + // 4. Update trackers npp = fluxes.photosynthesis - fluxes.rVeg - fluxes.rCoarseRoot - fluxes.rFineRoot; diff --git a/src/sipnet/state.h b/src/sipnet/state.h index d6feaff3..7a70c348 100644 --- a/src/sipnet/state.h +++ b/src/sipnet/state.h @@ -525,6 +525,25 @@ typedef struct FluxVars { // provenance TBD (g C * m^-2 ground area * day^-1) double woodCreation; + // **************************************** + // Fluxes for event handling + // Note: this has no published reference source + // + + // plantLeafC addition + double eventLeafC; + // plantWoodC addition + double eventWoodC; + // plantFineRootC addition + double eventFineRootC; + // plantCoarseRootC addition + double eventCoarseRootC; + // irrigation water that is immediately evaporated + double eventEvap; + // irrigation water that goes to the soil + double eventSoilWater; + // carbon added to litter pool (if used) or soil pool (if not) + double eventLitterC; } Fluxes; typedef struct TrackerVars { // variables to track various things diff --git a/tests/smoke/russell_1/events.out b/tests/smoke/russell_1/events.out index cc63af60..87191f3e 100644 --- a/tests/smoke/russell_1/events.out +++ b/tests/smoke/russell_1/events.out @@ -1,109 +1,109 @@ year day type param_name=delta[,param_name=delta,...] -2016 92 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 96 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 100 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 104 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 108 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 112 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 116 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 120 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 124 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 128 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 132 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 136 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 140 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 144 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 148 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 152 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 156 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 160 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 164 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 168 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 172 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 176 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 180 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 184 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 188 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 192 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 196 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 200 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 204 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 208 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 212 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 216 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 220 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 224 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 228 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 232 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 236 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 240 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 244 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 248 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 252 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 256 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 260 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 264 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 268 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 272 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 276 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 280 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 284 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 288 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 292 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 296 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 300 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 304 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 92 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 96 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 100 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 104 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 108 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 112 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 116 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 120 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 124 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 128 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 132 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 136 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 140 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 144 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 148 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 152 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 156 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 160 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 164 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 168 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 172 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 176 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 180 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 184 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 188 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 192 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 196 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 200 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 204 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 208 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 212 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 216 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 220 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 224 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 228 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 232 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 236 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 240 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 244 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 248 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 252 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 256 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 260 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 264 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 268 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 272 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 276 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 280 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 284 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 288 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 292 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 296 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 300 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 304 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 +2016 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 diff --git a/tests/smoke/russell_3/events.out b/tests/smoke/russell_3/events.out index cc63af60..87191f3e 100644 --- a/tests/smoke/russell_3/events.out +++ b/tests/smoke/russell_3/events.out @@ -1,109 +1,109 @@ year day type param_name=delta[,param_name=delta,...] -2016 92 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 96 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 100 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 104 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 108 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 112 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 116 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 120 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 124 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 128 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 132 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 136 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 140 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 144 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 148 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 152 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 156 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 160 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 164 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 168 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 172 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 176 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 180 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 184 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 188 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 192 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 196 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 200 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 204 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 208 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 212 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 216 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 220 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 224 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 228 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 232 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 236 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 240 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 244 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 248 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 252 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 256 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 260 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 264 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 268 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 272 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 276 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 280 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 284 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 288 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 292 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 296 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 300 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 304 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 92 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 96 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 100 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 104 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 108 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 112 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 116 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 120 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 124 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 128 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 132 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 136 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 140 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 144 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 148 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 152 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 156 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 160 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 164 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 168 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 172 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 176 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 180 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 184 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 188 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 192 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 196 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 200 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 204 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 208 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 212 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 216 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 220 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 224 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 228 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 232 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 236 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 240 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 244 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 248 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 252 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 256 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 260 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 264 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 268 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 272 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 276 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 280 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 284 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 288 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 292 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 296 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 300 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 304 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 +2016 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 diff --git a/tests/smoke/russell_4/events.out b/tests/smoke/russell_4/events.out index cc63af60..87191f3e 100644 --- a/tests/smoke/russell_4/events.out +++ b/tests/smoke/russell_4/events.out @@ -1,109 +1,109 @@ year day type param_name=delta[,param_name=delta,...] -2016 92 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 96 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 100 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 104 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 108 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 112 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 116 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 120 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 124 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 128 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 132 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 136 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 140 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 144 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 148 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 152 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 156 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 160 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 164 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 168 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 172 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 176 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 180 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 184 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 188 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 192 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 196 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 200 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 204 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 208 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 212 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 216 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 220 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 224 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 228 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 232 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 236 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 240 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 244 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 248 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 252 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 256 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 260 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 264 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 268 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 272 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 276 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 280 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 284 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 288 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 292 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 296 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 300 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2016 304 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 92 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 96 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 100 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 104 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 108 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 112 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 116 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 120 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 124 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 128 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 132 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 136 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 140 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 144 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 148 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 152 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 156 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 160 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 164 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 168 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 172 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 176 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 180 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 184 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 188 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 192 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 196 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 200 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 204 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 208 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 212 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 216 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 220 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 224 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 228 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 232 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 236 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 240 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 244 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 248 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 252 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 256 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 260 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 264 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 268 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 272 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 276 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 280 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 284 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 288 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 292 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 296 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 300 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 -2017 304 irrig envi.soilWater=2.80,fluxes.immedEvap=0.00 +2016 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2017 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 diff --git a/tools/smoke_check.py b/tools/smoke_check.py index 1459bb42..8dd4cfe2 100644 --- a/tools/smoke_check.py +++ b/tools/smoke_check.py @@ -41,6 +41,8 @@ def print_usage(): print(f"'smoke_check' with no arguments is equivalent to 'smoke_check run'") print(f"") print(f"Note: smoke_check assumes tests/smoke/run_smoke.sh has already been run") + print(f"Also, if a smoke test errored and failed to produce output, this tool") + print(f"will report a false positive for that test.") def main(): commands: list[str] = ['run', 'list', 'help', '-h', '--help'] From 3ef5df405bc51991f7254b78f53b3e4699f97252 Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Mon, 25 Aug 2025 17:23:10 -0400 Subject: [PATCH 02/17] Updates to keep output unchanged --- src/sipnet/sipnet.c | 31 +++++++++-------- .../events_output_header.out | 12 +++---- .../events_output_no_header.out | 12 +++---- .../testEventOutputFile.c | 6 ++++ .../test_events_types/testEventHarvest.c | 33 +++++++++---------- .../test_events_types/testEventIrrigation.c | 3 +- tests/sipnet/test_events_types/typesUtils.h | 1 + tools/smoke_check.py | 2 +- 8 files changed, 54 insertions(+), 46 deletions(-) diff --git a/src/sipnet/sipnet.c b/src/sipnet/sipnet.c index 512a3a33..99238c40 100644 --- a/src/sipnet/sipnet.c +++ b/src/sipnet/sipnet.c @@ -1641,7 +1641,6 @@ void processEvents(void) { fluxes.eventCoarseRootC += coarseDelta; // FUTURE: move/remove biomass in N pools - writeEventOut(eventOutFile, event, 5, "fluxes.eventLitterC", litterAdd, "fluxes.eventLeafC", leafDelta, "fluxes.eventWoodC", woodDelta, "fluxes.eventFineRootC", fineDelta, @@ -1676,6 +1675,23 @@ void processEvents(void) { // It's true that this conversion will immediately be undone when updating // pools, but let's keep fluxes as fluxes. convertEventsToFluxes(); + + // BEGIN COMPATIBILITY CODE + // This should keep output unchanged, even though this needs to be moved. + // One step at a time. + envi.plantWoodC += fluxes.eventWoodC * climate->length; + envi.plantLeafC += fluxes.eventLeafC * climate->length; + envi.soilWater += fluxes.eventSoilWater * climate->length; + if (ctx.litterPool) { + envi.litter += fluxes.eventLitterC * climate->length; + } else { + envi.soil += fluxes.eventLitterC * climate->length; + } + envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; + envi.fineRootC += fluxes.eventFineRootC * climate->length; + // Last, don't forget we put the evap flux into immedEvap + fluxes.immedEvap += fluxes.eventEvap; + // END COMPATIBILITY CODE } // !!! main runner function !!! @@ -1744,19 +1760,6 @@ void updateState(void) { // handled as instantaneous deltas to relevant state (envi and fluxes fields), processEvents(); - // This should keep output unchanged, even though this needs to be moved. - // One step at a time. - envi.plantWoodC += fluxes.eventWoodC * climate->length; - envi.plantLeafC += fluxes.eventLeafC * climate->length; - envi.soilWater += fluxes.eventSoilWater * climate->length; - if (ctx.litterPool) { - envi.litter += fluxes.eventLitterC * climate->length; - } else { - envi.soil += fluxes.eventLitterC * climate->length; - } - envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; - envi.fineRootC += fluxes.eventFineRootC * climate->length; - // 4. Update trackers npp = fluxes.photosynthesis - fluxes.rVeg - fluxes.rCoarseRoot - fluxes.rFineRoot; diff --git a/tests/sipnet/test_events_infrastructure/events_output_header.out b/tests/sipnet/test_events_infrastructure/events_output_header.out index 5cb0f93d..f316f595 100644 --- a/tests/sipnet/test_events_infrastructure/events_output_header.out +++ b/tests/sipnet/test_events_infrastructure/events_output_header.out @@ -1,7 +1,7 @@ year day type param_name=delta[,param_name=delta,...] -2023 65 plant envi.plantLeafC=3.00,envi.plantWoodC=4.00,envi.fineRootC=5.00,envi.coarseRootC=6.00 -2023 70 irrig envi.soilWater=5.00,fluxes.immedEvap=0.00 -2023 200 harv env.litter=5.46,envi.plantLeafC=-5.93,envi.plantWoodC=-4.75,envi.fineRootC=-3.73,envi.coarseRootC=-3.89 -2024 65 plant envi.plantLeafC=3.00,envi.plantWoodC=5.00,envi.fineRootC=7.00,envi.coarseRootC=9.00 -2024 70 irrig envi.soilWater=2.50,fluxes.immedEvap=2.50 -2024 200 harv env.litter=4.25,envi.plantLeafC=-1.39,envi.plantWoodC=-1.63,envi.fineRootC=-2.52,envi.coarseRootC=-2.97 +2023 65 plant fluxes.eventLeafC=3.00,fluxes.eventWoodC=4.00,fluxes.eventFineRootC=5.00,fluxes.eventCoarseRootC=6.00 +2023 70 irrig fluxes.eventSoilWater=5.00,fluxes.eventEvap=0.00 +2023 200 harv fluxes.eventLitterC=5.46,fluxes.eventLeafC=-5.93,fluxes.eventWoodC=-4.75,fluxes.eventFineRootC=-3.73,fluxes.eventCoarseRootC=-3.89 +2024 65 plant fluxes.eventLeafC=3.00,fluxes.eventWoodC=5.00,fluxes.eventFineRootC=7.00,fluxes.eventCoarseRootC=9.00 +2024 70 irrig fluxes.eventSoilWater=2.50,fluxes.eventEvap=2.50 +2024 200 harv fluxes.eventLitterC=4.25,fluxes.eventLeafC=-1.39,fluxes.eventWoodC=-1.63,fluxes.eventFineRootC=-2.52,fluxes.eventCoarseRootC=-2.97 diff --git a/tests/sipnet/test_events_infrastructure/events_output_no_header.out b/tests/sipnet/test_events_infrastructure/events_output_no_header.out index 3c01c18d..5f1b380e 100644 --- a/tests/sipnet/test_events_infrastructure/events_output_no_header.out +++ b/tests/sipnet/test_events_infrastructure/events_output_no_header.out @@ -1,6 +1,6 @@ -2023 65 plant envi.plantLeafC=10.00,envi.plantWoodC=5.00,envi.fineRootC=4.00,envi.coarseRootC=3.00 -2023 70 irrig envi.soilWater=5.00,fluxes.immedEvap=0.00 -2023 200 harv env.soil=12.40,envi.plantLeafC=-4.80,envi.plantWoodC=-3.20,envi.fineRootC=-4.80,envi.coarseRootC=-4.80 -2024 65 plant envi.plantLeafC=10.00,envi.plantWoodC=5.00,envi.fineRootC=4.00,envi.coarseRootC=3.00 -2024 70 irrig envi.soilWater=2.50,fluxes.immedEvap=2.50 -2024 200 harv env.soil=12.14,envi.plantLeafC=-10.32,envi.plantWoodC=-5.88,envi.fineRootC=-2.88,envi.coarseRootC=-2.48 +2023 65 plant fluxes.eventLeafC=10.00,fluxes.eventWoodC=5.00,fluxes.eventFineRootC=4.00,fluxes.eventCoarseRootC=3.00 +2023 70 irrig fluxes.eventSoilWater=5.00,fluxes.eventEvap=0.00 +2023 200 harv fluxes.eventLitterC=12.40,fluxes.eventLeafC=-4.80,fluxes.eventWoodC=-3.20,fluxes.eventFineRootC=-4.80,fluxes.eventCoarseRootC=-4.80 +2024 65 plant fluxes.eventLeafC=10.00,fluxes.eventWoodC=5.00,fluxes.eventFineRootC=4.00,fluxes.eventCoarseRootC=3.00 +2024 70 irrig fluxes.eventSoilWater=2.50,fluxes.eventEvap=2.50 +2024 200 harv fluxes.eventLitterC=12.14,fluxes.eventLeafC=-10.32,fluxes.eventWoodC=-5.88,fluxes.eventFineRootC=-2.88,fluxes.eventCoarseRootC=-2.48 diff --git a/tests/sipnet/test_events_infrastructure/testEventOutputFile.c b/tests/sipnet/test_events_infrastructure/testEventOutputFile.c index 46793867..873de125 100644 --- a/tests/sipnet/test_events_infrastructure/testEventOutputFile.c +++ b/tests/sipnet/test_events_infrastructure/testEventOutputFile.c @@ -25,19 +25,25 @@ void init(void) { ClimateNode *climate3 = (ClimateNode *)malloc(sizeof(ClimateNode)); climate1->year = 2023; climate1->day = 65; + climate1->length = 0.5; climate2->year = 2023; climate2->day = 70; + climate2->length = 0.5; climate3->year = 2023; climate3->day = 200; + climate3->length = 0.5; ClimateNode *climate4 = (ClimateNode *)malloc(sizeof(ClimateNode)); ClimateNode *climate5 = (ClimateNode *)malloc(sizeof(ClimateNode)); ClimateNode *climate6 = (ClimateNode *)malloc(sizeof(ClimateNode)); climate4->year = 2024; climate4->day = 65; + climate4->length = 0.5; climate5->year = 2024; climate5->day = 70; + climate5->length = 0.5; climate6->year = 2024; climate6->day = 200; + climate6->length = 0.5; climate5->nextClim = climate6; climate4->nextClim = climate5; diff --git a/tests/sipnet/test_events_types/testEventHarvest.c b/tests/sipnet/test_events_types/testEventHarvest.c index aeec15c3..7dfc8100 100644 --- a/tests/sipnet/test_events_types/testEventHarvest.c +++ b/tests/sipnet/test_events_types/testEventHarvest.c @@ -67,32 +67,29 @@ int run(void) { processEvents(); // fracRA = 0.1, fracRB = 0.2, frac TA = 0.3, fracTB = 0.4 - expLitter = 1 + 0.3 * (2 + 3) + 0.4 * (4 + 5); - expLeafC = 2 * (1 - 0.1 - 0.3); - expWoodC = 3 * (1 - 0.1 - 0.3); - expFineC = 4 * (1 - 0.2 - 0.4); - expCoarseC = 5 * (1 - 0.2 - 0.4); + expLitter = 1 + 0.3 * (2 + 3) + 0.4 * (4 + 5); // 1 + 1.5 + 3.6 = 6.1 + expLeafC = 2 * (1 - 0.1 - 0.3); // 1.2 + expWoodC = 3 * (1 - 0.1 - 0.3); // 1.8 + expFineC = 4 * (1 - 0.2 - 0.4); // 1.6 + expCoarseC = 5 * (1 - 0.2 - 0.4); // 2.0 status |= checkOutput(expLitter, expLeafC, expWoodC, expFineC, expCoarseC); - //// TWO HARVEST EVENTS + //// TWO HARVEST + // Ok, so, two harvest events on the same day shouldn't happen (seriously, + // model it as one harvest) - but we can test the arithmetic here updateIntContext("litterPool", 1, CTX_TEST); logTest("Litter pool is %s\n", ctx.litterPool ? "on" : "off"); initEnv(); initEvents("events_two_harvest.in", 1); setupEvents(); processEvents(); - // First event same as above - expLitter = 1 + 0.3 * (2 + 3) + 0.4 * (4 + 5); - expLeafC = 2 * (1 - 0.1 - 0.3); - expWoodC = 3 * (1 - 0.1 - 0.3); - expFineC = 4 * (1 - 0.2 - 0.4); - expCoarseC = 5 * (1 - 0.2 - 0.4); - // Second is all params = 0.25 - expLitter += 0.25 * (expLeafC + expWoodC + expFineC + expCoarseC); - expLeafC *= 0.5; - expWoodC *= 0.5; - expFineC *= 0.5; - expCoarseC *= 0.5; + // Two events are additive + expLitter = 1 + (0.3 + 0.25) * (2 + 3) + (0.4 + 0.25) * (4 + 5); // 9.6 + expLeafC = 2 * (1 - 0.1 - 0.3 - 0.25 - 0.25); // 0.2 + expWoodC = 3 * (1 - 0.1 - 0.3 - 0.25 - 0.25); // 0.3 + expFineC = 4 * (1 - 0.2 - 0.4 - 0.25 - 0.25); // -0.4 + expCoarseC = 5 * (1 - 0.2 - 0.4 - 0.25 - 0.25); // -0.5 + status |= checkOutput(expLitter, expLeafC, expWoodC, expFineC, expCoarseC); return status; diff --git a/tests/sipnet/test_events_types/testEventIrrigation.c b/tests/sipnet/test_events_types/testEventIrrigation.c index a6f9c74e..f0657c88 100644 --- a/tests/sipnet/test_events_types/testEventIrrigation.c +++ b/tests/sipnet/test_events_types/testEventIrrigation.c @@ -12,7 +12,8 @@ int checkOutput(double soilWater, double immedEvap) { logTest("Soil water is %f, expected %f\n", envi.soilWater, soilWater); status = 1; } - if (!compareDoubles(immedEvap, fluxes.immedEvap)) { + // This is a proper flux - need to multiply flux by climate length to compare + if (!compareDoubles(immedEvap, fluxes.immedEvap * climate->length)) { logTest("Immed evap is %f, expected %f\n", fluxes.immedEvap, immedEvap); status = 1; } diff --git a/tests/sipnet/test_events_types/typesUtils.h b/tests/sipnet/test_events_types/typesUtils.h index 757ac089..e35d1e8a 100644 --- a/tests/sipnet/test_events_types/typesUtils.h +++ b/tests/sipnet/test_events_types/typesUtils.h @@ -13,6 +13,7 @@ void prepTypesTest() { climate = (ClimateNode *)malloc(sizeof(ClimateNode)); climate->year = 2024; climate->day = 70; + climate->length = 0.125; } #endif // SIPNET_TYPESUTILS_H diff --git a/tools/smoke_check.py b/tools/smoke_check.py index 8dd4cfe2..e04d8cb2 100644 --- a/tools/smoke_check.py +++ b/tools/smoke_check.py @@ -151,7 +151,7 @@ def check_results(smoke_dir: str, verbose: bool): data.loc['new mean', col] = means.loc['new'] print('Difference Summary:') - print(data) + print(data.transpose()) if __name__ == "__main__": main() From 3b3f85e74007a08e81ed464e23cc07ed154d1ef6 Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Tue, 26 Aug 2025 14:17:34 -0400 Subject: [PATCH 03/17] Updates event handler for proper flux handling --- src/sipnet/sipnet.c | 141 +++++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 62 deletions(-) diff --git a/src/sipnet/sipnet.c b/src/sipnet/sipnet.c index 99238c40..ab6fd586 100644 --- a/src/sipnet/sipnet.c +++ b/src/sipnet/sipnet.c @@ -1188,6 +1188,11 @@ void soilDegradation(void) { envi.soil += (fluxes.coarseRootLoss + fluxes.fineRootLoss + fluxes.litterToSoil - fluxes.rSoil) * climate->length; + + // Event additions. To be moved into updatePoolsForEvents after this + // function is split + envi.litter += fluxes.eventLitterC * climate->length; + } else { // Normal pool (single pool, no microbes) // :: from [1] (and others, TBD), eq (A3), where: @@ -1198,6 +1203,10 @@ void soilDegradation(void) { envi.soil += (fluxes.coarseRootLoss + fluxes.fineRootLoss + fluxes.woodLitter + fluxes.leafLitter - fluxes.rSoil) * climate->length; + + // Event additions. To be moved into updatePoolsForEvents after this + // function is split + envi.soil += fluxes.eventLitterC * climate->length; } } // :: from [3], root model description @@ -1207,6 +1216,11 @@ void soilDegradation(void) { envi.fineRootC += (fluxes.fineRootCreation - fluxes.fineRootLoss - fluxes.rFineRoot) * climate->length; + + // Event additions. To be moved into updatePoolsForEvents after this + // function is split + envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; + envi.fineRootC += fluxes.eventFineRootC * climate->length; } //// @@ -1503,9 +1517,11 @@ void updateTrackers(double oldSoilWater) { trackers.totNpp += trackers.npp; trackers.totNee += trackers.nee; + // evapotranspiration includes water lost to evaporation from canopy + // irrigation (fluxes.eventEvap) trackers.evapotranspiration = (fluxes.transpiration + fluxes.immedEvap + - fluxes.evaporation + fluxes.sublimation) * - climate->length; + fluxes.evaporation + fluxes.sublimation + + fluxes.eventEvap) * climate->length; trackers.soilWetnessFrac = (oldSoilWater + envi.soilWater) / (2.0 * params.soilWHC); @@ -1523,18 +1539,6 @@ void resetEventFluxes(void) { fluxes.eventLitterC = 0.0; } -void convertEventsToFluxes(void) { - // Events are specified as amounts; after all events are processed, convert to - // fluxes - fluxes.eventLeafC /= climate->length; - fluxes.eventWoodC /= climate->length; - fluxes.eventFineRootC /= climate->length; - fluxes.eventCoarseRootC /= climate->length; - fluxes.eventEvap /= climate->length; - fluxes.eventSoilWater /= climate->length; - fluxes.eventLitterC /= climate->length; -} - /*! * \brief Process events for current location/year/day * @@ -1558,6 +1562,7 @@ void processEvents(void) { // should. const int climYear = climate->year; const int climDay = climate->day; + const double climLen = climate->length; // The events file has been tested on read, so we know this event list should // be in chrono order. However, we need to check to make sure the current @@ -1571,7 +1576,6 @@ void processEvents(void) { exit(EXIT_CODE_INPUT_FILE_ERROR); } switch (event->type) { - // Implementation TBD, as we enable the various event types case IRRIGATION: { const IrrigationParams *irrParams = event->eventParams; const double amount = irrParams->amountAdded; @@ -1590,10 +1594,11 @@ void processEvents(void) { printf("Unknown irrigation method type: %d\n", irrParams->method); exit(EXIT_CODE_UNKNOWN_EVENT_TYPE_OR_PARAM); } - fluxes.eventEvap += evapAmount; - fluxes.eventSoilWater += soilAmount; + fluxes.eventEvap += evapAmount / climLen; + fluxes.eventSoilWater += soilAmount / climLen; writeEventOut(eventOutFile, event, 2, "fluxes.eventSoilWater", - soilAmount, "fluxes.eventEvap", evapAmount); + soilAmount/climLen, "fluxes.eventEvap", + evapAmount/climLen); } break; case PLANTING: { const PlantingParams *plantParams = event->eventParams; @@ -1603,16 +1608,17 @@ void processEvents(void) { const double coarseRootC = plantParams->coarseRootC; // Update the pools - fluxes.eventLeafC += leafC; - fluxes.eventWoodC += woodC; - fluxes.eventFineRootC += fineRootC; - fluxes.eventCoarseRootC += coarseRootC; + fluxes.eventLeafC += leafC / climLen; + fluxes.eventWoodC += woodC / climLen; + fluxes.eventFineRootC += fineRootC / climLen; + fluxes.eventCoarseRootC += coarseRootC / climLen; // FUTURE: allocate to N pools - writeEventOut(eventOutFile, event, 4, "fluxes.eventLeafC", leafC, - "fluxes.eventWoodC", woodC, "fluxes.eventFineRootC", - fineRootC, "fluxes.eventCoarseRootC", coarseRootC); + writeEventOut(eventOutFile, event, 4, "fluxes.eventLeafC", leafC/climLen, + "fluxes.eventWoodC", woodC/climLen, "fluxes.eventFineRootC", + fineRootC/climLen, "fluxes.eventCoarseRootC", + coarseRootC/climLen); } break; case HARVEST: { // Harvest can both remove biomass and move biomass to the litter pool @@ -1634,17 +1640,19 @@ void processEvents(void) { const double coarseDelta = -envi.coarseRootC * (fracRB + fracTB); // Pool updates: - fluxes.eventLitterC += litterAdd; - fluxes.eventLeafC += leafDelta; - fluxes.eventWoodC += woodDelta; - fluxes.eventFineRootC += fineDelta; - fluxes.eventCoarseRootC += coarseDelta; - - // FUTURE: move/remove biomass in N pools - writeEventOut(eventOutFile, event, 5, "fluxes.eventLitterC", litterAdd, - "fluxes.eventLeafC", leafDelta, "fluxes.eventWoodC", - woodDelta, "fluxes.eventFineRootC", fineDelta, - "fluxes.eventCoarseRootC", coarseDelta); + fluxes.eventLitterC += litterAdd / climLen; + fluxes.eventLeafC += leafDelta / climLen; + fluxes.eventWoodC += woodDelta / climLen; + fluxes.eventFineRootC += fineDelta / climLen; + fluxes.eventCoarseRootC += coarseDelta / climLen; + + // FUTURE: move/remove biomass in N pools + writeEventOut(eventOutFile, event, 5, "fluxes.eventLitterC", + litterAdd/climLen, "fluxes.eventLeafC", + leafDelta/climLen, "fluxes.eventWoodC", + woodDelta/climLen, "fluxes.eventFineRootC", + fineDelta/climLen, "fluxes.eventCoarseRootC", + coarseDelta/climLen); } break; case TILLAGE: // TBD @@ -1656,12 +1664,12 @@ void processEvents(void) { const double orgC = fertParams->orgC; // const double minN = fertParams->minN; - fluxes.eventLitterC += orgC; + fluxes.eventLitterC += orgC / climLen; // FUTURE: allocate to N pools // This will (likely) be 3 params eventually - writeEventOut(eventOutFile, event, 1, "fluxes.eventLitterC", orgC); + writeEventOut(eventOutFile, event, 1, "fluxes.eventLitterC", orgC/climLen); } break; default: printf("Unknown event type (%d) in processEvents()\n", event->type); @@ -1670,28 +1678,22 @@ void processEvents(void) { event = event->nextEvent; } +} - // Last, convert the event calculations - specified as amounts - to fluxes. - // It's true that this conversion will immediately be undone when updating - // pools, but let's keep fluxes as fluxes. - convertEventsToFluxes(); - - // BEGIN COMPATIBILITY CODE - // This should keep output unchanged, even though this needs to be moved. - // One step at a time. +void updatePoolsForEvents(void) { envi.plantWoodC += fluxes.eventWoodC * climate->length; envi.plantLeafC += fluxes.eventLeafC * climate->length; envi.soilWater += fluxes.eventSoilWater * climate->length; - if (ctx.litterPool) { - envi.litter += fluxes.eventLitterC * climate->length; - } else { - envi.soil += fluxes.eventLitterC * climate->length; - } - envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; - envi.fineRootC += fluxes.eventFineRootC * climate->length; - // Last, don't forget we put the evap flux into immedEvap - fluxes.immedEvap += fluxes.eventEvap; - // END COMPATIBILITY CODE + // envi.litter, envi.soil, envi.fineRootC and envi.CoarseRootC are all in + // soilDegradation, but should be moved here when that function is split + // into fluxes and pool updates + // if (ctx.litterPool) { + // envi.litter += fluxes.eventLitterC * climate->length; + // } else { + // envi.soil += fluxes.eventLitterC * climate->length; + // } + // envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; + // envi.fineRootC += fluxes.eventFineRootC * climate->length; } // !!! main runner function !!! @@ -1706,13 +1708,25 @@ void updateState(void) { int err; oldSoilWater = envi.soilWater; + /////////////////////// // 1. Calculate Fluxes + // The main source of flux calculations handling, most of the biogeochem modeled + // fluxes are here. ("most" due to soilDegradation below) calculateFluxes(); - soilDegradation(); // This updates all the soil functions + // All event handling, which is modeled as fluxes + processEvents(); + + // This updates all the soil functions; it also updates some pools, which + // muddies the sipnet flow. + soilDegradation(); + + /////////////////////// // 2. Update Pools + // TODO: move this into an `updatePools()` function + // Update the stocks, with fluxes adjusted for length of time step. // Note: the soil C pool(s) (envi.soil, envi.fineRootC, envi.CoarseRootC) // were updated in soilDegradation(); also, envi.litter when that is in use. @@ -1753,14 +1767,17 @@ void updateState(void) { envi.snow += (fluxes.snowFall - fluxes.snowMelt - fluxes.sublimation) * climate->length; + // Update pools for fluxes from events + updatePoolsForEvents(); + + // Verify none of our stocks have gone negative (and set to zero if so) ensureNonNegativeStocks(); - // 3. Process events for this location/year/day, AFTER updates are made to - // fluxes and state variables above. Events are (currently, Jan 25, 2025) - // handled as instantaneous deltas to relevant state (envi and fluxes fields), - processEvents(); + /////////////////////// + // 3. Update trackers + + // TODO: move this into its own function, perhaps updateMeanTrackers() - // 4. Update trackers npp = fluxes.photosynthesis - fluxes.rVeg - fluxes.rCoarseRoot - fluxes.rFineRoot; From 340e870cd16ad9a74edf0e4a67199011ba2b6119 Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Tue, 26 Aug 2025 14:18:41 -0400 Subject: [PATCH 04/17] Updates event handler for proper flux handling --- src/sipnet/sipnet.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/sipnet/sipnet.c b/src/sipnet/sipnet.c index ab6fd586..ab5d38e7 100644 --- a/src/sipnet/sipnet.c +++ b/src/sipnet/sipnet.c @@ -1519,9 +1519,10 @@ void updateTrackers(double oldSoilWater) { // evapotranspiration includes water lost to evaporation from canopy // irrigation (fluxes.eventEvap) - trackers.evapotranspiration = (fluxes.transpiration + fluxes.immedEvap + - fluxes.evaporation + fluxes.sublimation + - fluxes.eventEvap) * climate->length; + trackers.evapotranspiration = + (fluxes.transpiration + fluxes.immedEvap + fluxes.evaporation + + fluxes.sublimation + fluxes.eventEvap) * + climate->length; trackers.soilWetnessFrac = (oldSoilWater + envi.soilWater) / (2.0 * params.soilWHC); @@ -1597,8 +1598,8 @@ void processEvents(void) { fluxes.eventEvap += evapAmount / climLen; fluxes.eventSoilWater += soilAmount / climLen; writeEventOut(eventOutFile, event, 2, "fluxes.eventSoilWater", - soilAmount/climLen, "fluxes.eventEvap", - evapAmount/climLen); + soilAmount / climLen, "fluxes.eventEvap", + evapAmount / climLen); } break; case PLANTING: { const PlantingParams *plantParams = event->eventParams; @@ -1615,10 +1616,10 @@ void processEvents(void) { // FUTURE: allocate to N pools - writeEventOut(eventOutFile, event, 4, "fluxes.eventLeafC", leafC/climLen, - "fluxes.eventWoodC", woodC/climLen, "fluxes.eventFineRootC", - fineRootC/climLen, "fluxes.eventCoarseRootC", - coarseRootC/climLen); + writeEventOut(eventOutFile, event, 4, "fluxes.eventLeafC", + leafC / climLen, "fluxes.eventWoodC", woodC / climLen, + "fluxes.eventFineRootC", fineRootC / climLen, + "fluxes.eventCoarseRootC", coarseRootC / climLen); } break; case HARVEST: { // Harvest can both remove biomass and move biomass to the litter pool @@ -1646,13 +1647,12 @@ void processEvents(void) { fluxes.eventFineRootC += fineDelta / climLen; fluxes.eventCoarseRootC += coarseDelta / climLen; - // FUTURE: move/remove biomass in N pools - writeEventOut(eventOutFile, event, 5, "fluxes.eventLitterC", - litterAdd/climLen, "fluxes.eventLeafC", - leafDelta/climLen, "fluxes.eventWoodC", - woodDelta/climLen, "fluxes.eventFineRootC", - fineDelta/climLen, "fluxes.eventCoarseRootC", - coarseDelta/climLen); + // FUTURE: move/remove biomass in N pools + writeEventOut( + eventOutFile, event, 5, "fluxes.eventLitterC", litterAdd / climLen, + "fluxes.eventLeafC", leafDelta / climLen, "fluxes.eventWoodC", + woodDelta / climLen, "fluxes.eventFineRootC", fineDelta / climLen, + "fluxes.eventCoarseRootC", coarseDelta / climLen); } break; case TILLAGE: // TBD @@ -1669,7 +1669,8 @@ void processEvents(void) { // FUTURE: allocate to N pools // This will (likely) be 3 params eventually - writeEventOut(eventOutFile, event, 1, "fluxes.eventLitterC", orgC/climLen); + writeEventOut(eventOutFile, event, 1, "fluxes.eventLitterC", + orgC / climLen); } break; default: printf("Unknown event type (%d) in processEvents()\n", event->type); @@ -1711,8 +1712,8 @@ void updateState(void) { /////////////////////// // 1. Calculate Fluxes - // The main source of flux calculations handling, most of the biogeochem modeled - // fluxes are here. ("most" due to soilDegradation below) + // The main source of flux calculations handling, most of the biogeochem + // modeled fluxes are here. ("most" due to soilDegradation below) calculateFluxes(); // All event handling, which is modeled as fluxes From d5d16a56b82131dcb1818b1be69d8eacdbaa5b11 Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Tue, 26 Aug 2025 14:19:22 -0400 Subject: [PATCH 05/17] Updates for tests for retool-events-as-fluxes --- .../events_output_header.out | 12 +- .../events_output_no_header.out | 12 +- .../testEventOutputFile.c | 8 +- .../testEventFertilization.c | 10 +- .../test_events_types/testEventHarvest.c | 10 +- .../test_events_types/testEventIrrigation.c | 18 +- .../test_events_types/testEventPlanting.c | 10 +- tests/smoke/russell_1/events.out | 216 +++++++++--------- tests/smoke/russell_3/events.out | 216 +++++++++--------- tests/smoke/russell_4/events.out | 216 +++++++++--------- 10 files changed, 379 insertions(+), 349 deletions(-) diff --git a/tests/sipnet/test_events_infrastructure/events_output_header.out b/tests/sipnet/test_events_infrastructure/events_output_header.out index f316f595..fc86e06d 100644 --- a/tests/sipnet/test_events_infrastructure/events_output_header.out +++ b/tests/sipnet/test_events_infrastructure/events_output_header.out @@ -1,7 +1,7 @@ year day type param_name=delta[,param_name=delta,...] -2023 65 plant fluxes.eventLeafC=3.00,fluxes.eventWoodC=4.00,fluxes.eventFineRootC=5.00,fluxes.eventCoarseRootC=6.00 -2023 70 irrig fluxes.eventSoilWater=5.00,fluxes.eventEvap=0.00 -2023 200 harv fluxes.eventLitterC=5.46,fluxes.eventLeafC=-5.93,fluxes.eventWoodC=-4.75,fluxes.eventFineRootC=-3.73,fluxes.eventCoarseRootC=-3.89 -2024 65 plant fluxes.eventLeafC=3.00,fluxes.eventWoodC=5.00,fluxes.eventFineRootC=7.00,fluxes.eventCoarseRootC=9.00 -2024 70 irrig fluxes.eventSoilWater=2.50,fluxes.eventEvap=2.50 -2024 200 harv fluxes.eventLitterC=4.25,fluxes.eventLeafC=-1.39,fluxes.eventWoodC=-1.63,fluxes.eventFineRootC=-2.52,fluxes.eventCoarseRootC=-2.97 +2023 65 plant fluxes.eventLeafC=6.00,fluxes.eventWoodC=8.00,fluxes.eventFineRootC=10.00,fluxes.eventCoarseRootC=12.00 +2023 70 irrig fluxes.eventSoilWater=10.00,fluxes.eventEvap=0.00 +2023 200 harv fluxes.eventLitterC=10.93,fluxes.eventLeafC=-11.86,fluxes.eventWoodC=-9.50,fluxes.eventFineRootC=-7.46,fluxes.eventCoarseRootC=-7.78 +2024 65 plant fluxes.eventLeafC=6.00,fluxes.eventWoodC=10.00,fluxes.eventFineRootC=14.00,fluxes.eventCoarseRootC=18.00 +2024 70 irrig fluxes.eventSoilWater=5.00,fluxes.eventEvap=5.00 +2024 200 harv fluxes.eventLitterC=8.51,fluxes.eventLeafC=-2.78,fluxes.eventWoodC=-3.27,fluxes.eventFineRootC=-5.04,fluxes.eventCoarseRootC=-5.93 diff --git a/tests/sipnet/test_events_infrastructure/events_output_no_header.out b/tests/sipnet/test_events_infrastructure/events_output_no_header.out index 5f1b380e..b6244a46 100644 --- a/tests/sipnet/test_events_infrastructure/events_output_no_header.out +++ b/tests/sipnet/test_events_infrastructure/events_output_no_header.out @@ -1,6 +1,6 @@ -2023 65 plant fluxes.eventLeafC=10.00,fluxes.eventWoodC=5.00,fluxes.eventFineRootC=4.00,fluxes.eventCoarseRootC=3.00 -2023 70 irrig fluxes.eventSoilWater=5.00,fluxes.eventEvap=0.00 -2023 200 harv fluxes.eventLitterC=12.40,fluxes.eventLeafC=-4.80,fluxes.eventWoodC=-3.20,fluxes.eventFineRootC=-4.80,fluxes.eventCoarseRootC=-4.80 -2024 65 plant fluxes.eventLeafC=10.00,fluxes.eventWoodC=5.00,fluxes.eventFineRootC=4.00,fluxes.eventCoarseRootC=3.00 -2024 70 irrig fluxes.eventSoilWater=2.50,fluxes.eventEvap=2.50 -2024 200 harv fluxes.eventLitterC=12.14,fluxes.eventLeafC=-10.32,fluxes.eventWoodC=-5.88,fluxes.eventFineRootC=-2.88,fluxes.eventCoarseRootC=-2.48 +2023 65 plant fluxes.eventLeafC=20.00,fluxes.eventWoodC=10.00,fluxes.eventFineRootC=8.00,fluxes.eventCoarseRootC=6.00 +2023 70 irrig fluxes.eventSoilWater=10.00,fluxes.eventEvap=0.00 +2023 200 harv fluxes.eventLitterC=24.80,fluxes.eventLeafC=-9.60,fluxes.eventWoodC=-6.40,fluxes.eventFineRootC=-9.60,fluxes.eventCoarseRootC=-9.60 +2024 65 plant fluxes.eventLeafC=20.00,fluxes.eventWoodC=10.00,fluxes.eventFineRootC=8.00,fluxes.eventCoarseRootC=6.00 +2024 70 irrig fluxes.eventSoilWater=5.00,fluxes.eventEvap=5.00 +2024 200 harv fluxes.eventLitterC=24.28,fluxes.eventLeafC=-20.64,fluxes.eventWoodC=-11.76,fluxes.eventFineRootC=-5.76,fluxes.eventCoarseRootC=-4.96 diff --git a/tests/sipnet/test_events_infrastructure/testEventOutputFile.c b/tests/sipnet/test_events_infrastructure/testEventOutputFile.c index 873de125..8c23868e 100644 --- a/tests/sipnet/test_events_infrastructure/testEventOutputFile.c +++ b/tests/sipnet/test_events_infrastructure/testEventOutputFile.c @@ -53,11 +53,17 @@ void init(void) { climate = climate1; } +void procEvents() { + processEvents(); + soilDegradation(); + updatePoolsForEvents(); +} + void runLoc(void) { ClimateNode *climStart = climate; setupEvents(); while (climate != NULL) { - processEvents(); + procEvents(); climate = climate->nextClim; } climate = climStart; diff --git a/tests/sipnet/test_events_types/testEventFertilization.c b/tests/sipnet/test_events_types/testEventFertilization.c index e79d14f5..55812b54 100644 --- a/tests/sipnet/test_events_types/testEventFertilization.c +++ b/tests/sipnet/test_events_types/testEventFertilization.c @@ -29,6 +29,12 @@ void initEnv(void) { // Others to be added for N } +void procEvents() { + processEvents(); + soilDegradation(); + updatePoolsForEvents(); +} + int run(void) { int status = 0; double expLitterC; @@ -44,7 +50,7 @@ int run(void) { logTest("Litter pool is %s\n", ctx.litterPool ? "on" : "off"); initEvents("events_one_fert.in", 0); setupEvents(); - processEvents(); + procEvents(); // First fert: (15-5-10) expLitterC = 1 + 5; @@ -58,7 +64,7 @@ int run(void) { initEnv(); initEvents("events_two_fert.in", 1); setupEvents(); - processEvents(); + procEvents(); // First event same as above (15-5-10) expLitterC = 1 + 5; // litterN diff --git a/tests/sipnet/test_events_types/testEventHarvest.c b/tests/sipnet/test_events_types/testEventHarvest.c index 7dfc8100..63057308 100644 --- a/tests/sipnet/test_events_types/testEventHarvest.c +++ b/tests/sipnet/test_events_types/testEventHarvest.c @@ -49,6 +49,12 @@ void initEnv(void) { envi.coarseRootC = 5; } +void procEvents() { + processEvents(); + soilDegradation(); + updatePoolsForEvents(); +} + int run(void) { int status = 0; double expLitter, expLeafC, expWoodC, expFineC, expCoarseC; @@ -64,7 +70,7 @@ int run(void) { logTest("Litter pool is %s\n", ctx.litterPool ? "on" : "off"); initEvents("events_one_harvest.in", 0); setupEvents(); - processEvents(); + procEvents(); // fracRA = 0.1, fracRB = 0.2, frac TA = 0.3, fracTB = 0.4 expLitter = 1 + 0.3 * (2 + 3) + 0.4 * (4 + 5); // 1 + 1.5 + 3.6 = 6.1 @@ -82,7 +88,7 @@ int run(void) { initEnv(); initEvents("events_two_harvest.in", 1); setupEvents(); - processEvents(); + procEvents(); // Two events are additive expLitter = 1 + (0.3 + 0.25) * (2 + 3) + (0.4 + 0.25) * (4 + 5); // 9.6 expLeafC = 2 * (1 - 0.1 - 0.3 - 0.25 - 0.25); // 0.2 diff --git a/tests/sipnet/test_events_types/testEventIrrigation.c b/tests/sipnet/test_events_types/testEventIrrigation.c index f0657c88..432e87be 100644 --- a/tests/sipnet/test_events_types/testEventIrrigation.c +++ b/tests/sipnet/test_events_types/testEventIrrigation.c @@ -6,20 +6,26 @@ #include "typesUtils.h" -int checkOutput(double soilWater, double immedEvap) { +int checkOutput(double soilWater, double eventEvap) { int status = 0; if (!compareDoubles(soilWater, envi.soilWater)) { logTest("Soil water is %f, expected %f\n", envi.soilWater, soilWater); status = 1; } // This is a proper flux - need to multiply flux by climate length to compare - if (!compareDoubles(immedEvap, fluxes.immedEvap * climate->length)) { - logTest("Immed evap is %f, expected %f\n", fluxes.immedEvap, immedEvap); + if (!compareDoubles(eventEvap, fluxes.eventEvap * climate->length)) { + logTest("Event evap is %f, expected %f\n", fluxes.immedEvap, eventEvap); status = 1; } return status; } +void procEvents() { + processEvents(); + soilDegradation(); + updatePoolsForEvents(); +} + int run(void) { int status = 0; @@ -27,14 +33,14 @@ int run(void) { // set up dummy envi/fluxes/params envi.soilWater = 0; - fluxes.immedEvap = 0; + fluxes.eventEvap = 0; params.immedEvapFrac = 0.5; //// ONE IRRIGATION EVENT // amount 5, method 1 (soil) initEvents("events_one_irrig.in", 0); setupEvents(); - processEvents(); + procEvents(); // should have 5 going to the soil status |= checkOutput(5, 0); @@ -43,7 +49,7 @@ int run(void) { // amount 4, method 0 (canopy) initEvents("events_two_irrig.in", 1); setupEvents(); - processEvents(); + procEvents(); // event 1: 3 to soil // event 2: 2=4*0.5 to evap, the rest (2) to soil // (plus the five from the test above) diff --git a/tests/sipnet/test_events_types/testEventPlanting.c b/tests/sipnet/test_events_types/testEventPlanting.c index 0b55e650..2b84def2 100644 --- a/tests/sipnet/test_events_types/testEventPlanting.c +++ b/tests/sipnet/test_events_types/testEventPlanting.c @@ -33,6 +33,12 @@ void initEnv(void) { envi.coarseRootC = 4; } +void procEvents() { + processEvents(); + soilDegradation(); + updatePoolsForEvents(); +} + int run(void) { int status = 0; @@ -44,7 +50,7 @@ int run(void) { //// ONE PLANTING EVENT initEvents("events_one_planting.in", 0); setupEvents(); - processEvents(); + procEvents(); // added: leaf 10, wood 5, fine root 4, coarse root 3 status |= checkOutput(1 + 10, 2 + 5, 3 + 4, 4 + 3); @@ -52,7 +58,7 @@ int run(void) { initEnv(); initEvents("events_two_planting.in", 1); setupEvents(); - processEvents(); + procEvents(); // leaf 10+9, wood 5+6, fine root 4+8, coarse root 3+4 status |= checkOutput(1 + 19, 2 + 11, 3 + 12, 4 + 7); diff --git a/tests/smoke/russell_1/events.out b/tests/smoke/russell_1/events.out index 87191f3e..9a3b0cea 100644 --- a/tests/smoke/russell_1/events.out +++ b/tests/smoke/russell_1/events.out @@ -1,109 +1,109 @@ year day type param_name=delta[,param_name=delta,...] -2016 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 92 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 96 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 100 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 104 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 108 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 112 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 116 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 120 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 124 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 128 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 132 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 136 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 140 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 144 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 148 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 152 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 156 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 160 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 164 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 168 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 172 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 176 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 180 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 184 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 188 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 192 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 196 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 200 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 204 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 208 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 212 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 216 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 220 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 224 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 228 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 232 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 236 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 240 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 244 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 248 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 252 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 256 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 260 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 264 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 268 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 272 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 276 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 280 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 284 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 288 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 292 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 296 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 300 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 304 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 92 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 96 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 100 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 104 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 108 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 112 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 116 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 120 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 124 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 128 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 132 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 136 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 140 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 144 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 148 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 152 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 156 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 160 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 164 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 168 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 172 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 176 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 180 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 184 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 188 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 192 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 196 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 200 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 204 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 208 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 212 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 216 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 220 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 224 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 228 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 232 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 236 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 240 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 244 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 248 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 252 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 256 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 260 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 264 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 268 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 272 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 276 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 280 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 284 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 288 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 292 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 296 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 300 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 304 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 diff --git a/tests/smoke/russell_3/events.out b/tests/smoke/russell_3/events.out index 87191f3e..9a3b0cea 100644 --- a/tests/smoke/russell_3/events.out +++ b/tests/smoke/russell_3/events.out @@ -1,109 +1,109 @@ year day type param_name=delta[,param_name=delta,...] -2016 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 92 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 96 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 100 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 104 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 108 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 112 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 116 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 120 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 124 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 128 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 132 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 136 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 140 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 144 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 148 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 152 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 156 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 160 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 164 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 168 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 172 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 176 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 180 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 184 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 188 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 192 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 196 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 200 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 204 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 208 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 212 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 216 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 220 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 224 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 228 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 232 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 236 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 240 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 244 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 248 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 252 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 256 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 260 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 264 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 268 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 272 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 276 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 280 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 284 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 288 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 292 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 296 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 300 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 304 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 92 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 96 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 100 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 104 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 108 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 112 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 116 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 120 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 124 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 128 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 132 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 136 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 140 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 144 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 148 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 152 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 156 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 160 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 164 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 168 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 172 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 176 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 180 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 184 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 188 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 192 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 196 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 200 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 204 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 208 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 212 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 216 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 220 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 224 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 228 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 232 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 236 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 240 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 244 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 248 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 252 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 256 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 260 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 264 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 268 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 272 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 276 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 280 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 284 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 288 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 292 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 296 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 300 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 304 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 diff --git a/tests/smoke/russell_4/events.out b/tests/smoke/russell_4/events.out index 87191f3e..9a3b0cea 100644 --- a/tests/smoke/russell_4/events.out +++ b/tests/smoke/russell_4/events.out @@ -1,109 +1,109 @@ year day type param_name=delta[,param_name=delta,...] -2016 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2016 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 92 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 96 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 100 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 104 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 108 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 112 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 116 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 120 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 124 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 128 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 132 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 136 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 140 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 144 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 148 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 152 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 156 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 160 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 164 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 168 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 172 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 176 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 180 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 184 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 188 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 192 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 196 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 200 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 204 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 208 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 212 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 216 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 220 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 224 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 228 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 232 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 236 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 240 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 244 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 248 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 252 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 256 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 260 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 264 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 268 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 272 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 276 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 280 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 284 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 288 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 292 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 296 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 300 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 -2017 304 irrig fluxes.eventSoilWater=2.80,fluxes.eventEvap=0.00 +2016 92 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 96 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 100 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 104 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 108 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 112 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 116 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 120 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 124 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 128 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 132 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 136 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 140 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 144 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 148 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 152 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 156 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 160 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 164 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 168 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 172 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 176 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 180 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 184 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 188 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 192 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 196 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 200 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 204 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 208 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 212 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 216 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 220 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 224 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 228 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 232 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 236 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 240 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 244 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 248 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 252 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 256 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 260 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 264 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 268 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 272 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 276 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 280 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 284 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 288 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 292 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 296 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 300 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2016 304 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 92 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 96 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 100 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 104 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 108 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 112 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 116 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 120 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 124 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 128 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 132 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 136 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 140 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 144 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 148 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 152 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 156 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 160 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 164 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 168 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 172 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 176 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 180 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 184 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 188 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 192 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 196 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 200 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 204 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 208 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 212 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 216 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 220 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 224 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 228 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 232 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 236 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 240 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 244 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 248 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 252 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 256 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 260 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 264 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 268 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 272 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 276 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 280 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 284 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 288 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 292 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 296 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 300 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 +2017 304 irrig fluxes.eventSoilWater=22.40,fluxes.eventEvap=0.00 From 8c716726f0ca955cc8c5fad18947e3af13846994 Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Tue, 26 Aug 2025 14:24:46 -0400 Subject: [PATCH 06/17] Enables exclusion check for events/microbes --- src/common/context.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/context.c b/src/common/context.c index c3cf5607..2f614331 100644 --- a/src/common/context.c +++ b/src/common/context.c @@ -188,10 +188,10 @@ void validateContext(void) { hasError = 1; } - // if (ctx.events && ctx.microbes) { - // logError("events and microbes may not both be turned on\n"); - // hasError = 1; - // } + if (ctx.events && ctx.microbes) { + logError("events and microbes may not both be turned on\n"); + hasError = 1; + } if (hasError) { exit(EXIT_CODE_BAD_PARAMETER_VALUE); From 4f101d537a71596260a4df4dab0a67b1e3a4671d Mon Sep 17 00:00:00 2001 From: Mike Longfritz Date: Wed, 27 Aug 2025 16:25:01 -0400 Subject: [PATCH 07/17] Minor comment updates --- src/sipnet/sipnet.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/sipnet/sipnet.c b/src/sipnet/sipnet.c index ab5d38e7..fd25352b 100644 --- a/src/sipnet/sipnet.c +++ b/src/sipnet/sipnet.c @@ -899,6 +899,10 @@ void snowPack(double *snowMelt, double *sublimation, double snowFall) { /*! * Calculate fastFlow, evaporation, and drainage from soil * + * Note: irrigation moisture additions are calculated after this function is + * called, so any such additions will affect the NEXT climate step + * calculations. + * * @param[out] fastFlow water that immediately goes to drainage (cm/day) * @param[out] evaporation water that evaporates fro msoil layer (cm/day) * @param[out] drainage water that drains from the soil (cm/day) @@ -1682,17 +1686,24 @@ void processEvents(void) { } void updatePoolsForEvents(void) { + // Harvest and planting events effect these carbon pools envi.plantWoodC += fluxes.eventWoodC * climate->length; envi.plantLeafC += fluxes.eventLeafC * climate->length; + + // Irrigation events envi.soilWater += fluxes.eventSoilWater * climate->length; + // envi.litter, envi.soil, envi.fineRootC and envi.CoarseRootC are all in // soilDegradation, but should be moved here when that function is split // into fluxes and pool updates + // + // Harvest and fertilization // if (ctx.litterPool) { // envi.litter += fluxes.eventLitterC * climate->length; // } else { // envi.soil += fluxes.eventLitterC * climate->length; // } + // Harvest and planting // envi.coarseRootC += fluxes.eventCoarseRootC * climate->length; // envi.fineRootC += fluxes.eventFineRootC * climate->length; } From dc358d8fd36f96653d82cb01e4e5bbda7379bc4f Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Thu, 28 Aug 2025 11:16:37 -0700 Subject: [PATCH 08/17] Expand irrigation and water dynamics documentation; clarify event processing and parameter definitions --- docs/.alternate-model-structure-ideas.md | 47 ++++---- docs/model-structure.md | 114 +++++++++++++++---- docs/parameters.md | 138 +++++++++++------------ 3 files changed, 191 insertions(+), 108 deletions(-) diff --git a/docs/.alternate-model-structure-ideas.md b/docs/.alternate-model-structure-ideas.md index f165f43b..f25b4607 100644 --- a/docs/.alternate-model-structure-ideas.md +++ b/docs/.alternate-model-structure-ideas.md @@ -17,7 +17,16 @@ $$ Heterotrophic respiration ($R_h$) is a function of soil carbon content ($C_S$), a scaling factor ($K_h$), the $Q_{10}$ factor, and the ratio of soil moisture ($W$) to water holding capacity ($W_e$). -## Flooding +## Irrigation + +### Moisture based irrigation + +Currently, irrigation is specified as an amount. + +Alternative: +To represent an irrigation program that sets a moisture range and turns irrigation on at a lower moisture threshold and of at an upper threshold. This could be done internally by directly changing the soil moisture content - while keeping track of the amount of water added to report in events.out. + +### Flooding There are multiple options for representing flooding. @@ -42,17 +51,17 @@ K could be a fixed value like 2 or 10. Or a site level parameter if warranted (e ### Variables (Pools, Fluxes, and Parameters) -| Symbol | Description | -|----------------|-----------------------------------------------------------------------------| -| $$ R_{\text{leach,NO3}} $$ | Rate of nitrate leaching | -| $$ R_{\text{NH4,fert}} $$ | Rate of ammonium fertilization input | -| $$ R_{\text{NO3,fert}} $$ | Rate of nitrate fertilization input +| Symbol | Description | +| -------------------------- | ------------------------------------ | +| $$ R_{\text{leach,NO3}} $$ | Rate of nitrate leaching | +| $$ R_{\text{NH4,fert}} $$ | Rate of ammonium fertilization input | +| $$ R_{\text{NO3,fert}} $$ | Rate of nitrate fertilization input | ### Subscripts (Temporal, Spatial, or Contextual Identifiers) -| Subscript | Description | -|--------------- |----------------------------------------------------------------------------- | -| $$ _\text{nitr} $$ | nitrification | -| $$ _\text{denitr} $$ | denitrification +| Subscript | Description | +| -------------------- | --------------- | +| $$ _\text{nitr} $$ | nitrification | +| $$ _\text{denitr} $$ | denitrification | ### Soil Ammonium @@ -363,15 +372,15 @@ Some options considered: - Adapt the parabolic $D_\text{temp, A}$ from SIPNET (Braswell et al 2005) -| Function | Formula | Parameters | Notes | -|-------------------------------------|-----------------------------------------------------------------------------------------|-------------------------------------|------------------------------------------------------------------------------------------------| -| **Beta Function** | $\left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)^\beta \cdot \left( 1 - \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)^\gamma$ | 4 ($\beta, \gamma, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Scaled to [0, 1] within $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. Peak shape controlled by $\beta$ and $\gamma$. | -| **Gaussian Function** | $e^{-\frac{\left( \frac{f_{\text{WHC}} - \mu}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)^2}{2\sigma^2}}$ | 3 ($\mu, \sigma, f_{\text{WHC,max}}, f_{\text{WHC,min}}$) | Fixed maximum of 1. Centered at $\mu$, scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. Symmetric around $\mu$. | -| **Piecewise Linear Function** | $\begin{cases} m_1 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right) + c_1, & f_{\text{WHC}} \leq f_{\text{WHC,mid}} \\ m_2 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right) + c_2, & f_{\text{WHC}} > f_{\text{WHC,mid}} \end{cases}$ | 6 ($m_1, c_1, m_2, c_2, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Two linear segments split at $f_{\text{WHC,mid}}$. Scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. | -| **Double Exponential Function** | $a_1 e^{b_1 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)} + a_2 e^{b_2 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)}$ | 4 ($a_1, b_1, a_2, b_2$) | Scaled exponential components to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. | -| **Piecewise Double Exponential** | $\begin{cases} (1 - e^{-k_1(f_{\text{WHC}} - f_{\text{WHC,min}})}), & f_{\text{WHC}} \leq f_{\text{WHC,opt}} \\ e^{-k_2(f_{\text{WHC}} - f_{\text{WHC,opt}})}, & f_{\text{WHC}} > f_{\text{WHC,opt}} \end{cases}$ | 4 ($k_1, k_2, f_{\text{WHC,opt}}, f_{\text{WHC,min}}$) | Piecewise rise (left of $f_{\text{WHC,opt}}$) and asymmetric exponential decay (right). Scaled to range. | -| **Double Logistic Function** | $\frac{1}{1 + e^{-k_1 \left( \frac{f_{\text{WHC}} - x_1}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)}} + \frac{1}{1 + e^{-k_2 \left( \frac{f_{\text{WHC}} - x_2}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)}}$ | 6 ($k_1, x_1, k_2, x_2, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Scaled logistic transitions split at $x_1$ and $x_2$. Scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. | -| **Parabolic (SIPNET)** | $a \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} - b \right)^2 + c$ | 5 ($a, b, c, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. Derived from SIPNET temperature-response function. | +| Function | Formula | Parameters | Notes | +| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| **Beta Function** | $\left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)^\beta \cdot \left( 1 - \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)^\gamma$ | 4 ($\beta, \gamma, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Scaled to [0, 1] within $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. Peak shape controlled by $\beta$ and $\gamma$. | +| **Gaussian Function** | $e^{-\frac{\left( \frac{f_{\text{WHC}} - \mu}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)^2}{2\sigma^2}}$ | 3 ($\mu, \sigma, f_{\text{WHC,max}}, f_{\text{WHC,min}}$) | Fixed maximum of 1. Centered at $\mu$, scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. Symmetric around $\mu$. | +| **Piecewise Linear Function** | $\begin{cases} m_1 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right) + c_1, & f_{\text{WHC}} \leq f_{\text{WHC,mid}} \\ m_2 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right) + c_2, & f_{\text{WHC}} > f_{\text{WHC,mid}} \end{cases}$ | 6 ($m_1, c_1, m_2, c_2, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Two linear segments split at $f_{\text{WHC,mid}}$. Scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. | +| **Double Exponential Function** | $a_1 e^{b_1 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)} + a_2 e^{b_2 \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)}$ | 4 ($a_1, b_1, a_2, b_2$) | Scaled exponential components to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. | +| **Piecewise Double Exponential** | $\begin{cases} (1 - e^{-k_1(f_{\text{WHC}} - f_{\text{WHC,min}})}), & f_{\text{WHC}} \leq f_{\text{WHC,opt}} \\ e^{-k_2(f_{\text{WHC}} - f_{\text{WHC,opt}})}, & f_{\text{WHC}} > f_{\text{WHC,opt}} \end{cases}$ | 4 ($k_1, k_2, f_{\text{WHC,opt}}, f_{\text{WHC,min}}$) | Piecewise rise (left of $f_{\text{WHC,opt}}$) and asymmetric exponential decay (right). Scaled to range. | +| **Double Logistic Function** | $\frac{1}{1 + e^{-k_1 \left( \frac{f_{\text{WHC}} - x_1}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)}} + \frac{1}{1 + e^{-k_2 \left( \frac{f_{\text{WHC}} - x_2}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} \right)}}$ | 6 ($k_1, x_1, k_2, x_2, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Scaled logistic transitions split at $x_1$ and $x_2$. Scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. | +| **Parabolic (SIPNET)** | $a \left( \frac{f_{\text{WHC}} - f_{\text{WHC,min}}}{f_{\text{WHC,max}} - f_{\text{WHC,min}}} - b \right)^2 + c$ | 5 ($a, b, c, f_{\text{WHC,min}}, f_{\text{WHC,max}}$) | Scaled to $f_{\text{WHC,min}}$ and $f_{\text{WHC,max}}$. Derived from SIPNET temperature-response function. | ## Effect of SOM on Soil Water Dynamics diff --git a/docs/model-structure.md b/docs/model-structure.md index b5d89ec5..ce1c42d8 100644 --- a/docs/model-structure.md +++ b/docs/model-structure.md @@ -27,6 +27,12 @@ Goal: simplified biogeochemical model that is capable of simulating GHG balance, Start as simple as possible, add complexity as needed. When new features are considered, they should be evaluated alongside other possible model improvements that have been considered, and the overall list of project needs. +Model state is updated in the following order: + +1. Calculate fluxes — compute the model's native fluxes +2. Process events — convert events to per‑day fluxes and accumulate into fluxes. +3. Update pools — pools are updated from the accumulated fluxes and pool‑specific updates. + ### Notes on notation: Fluxes are denoted by $F$, except that respiration is denoted by $R$ following convention and previous descriptions of SIPNET. @@ -448,26 +454,24 @@ If this scheme is too simple, we can adjust either the conditions under which N ## Water Dynamics - ### Soil Water Storage $$ \begin{aligned} -\frac{dW_{\text{soil}}}{dt} &= f_{\text{intercept}} \cdot \Bigl( F^W_{\text{precip}} + F^W_{\text{canopy irrigation}} \Bigr)\\[1mm] -&\quad + \mathfrak{F^W_{\text{soil irrigation}}} - F^W_{\text{drainage}} - F^W_{\text{transpiration}} +\frac{dW_{\text{soil}}}{dt} &= + (1 - f_{\text{intercept}})\,F^W_{\text{precip}} + + F^W_{\text{irrig,soil}} + - F^W_{\text{drainage}} + - F^W_{\text{trans}} \end{aligned} \tag{Braswell A4}\label{eq:A4} $$ -The change in soil water content $(W_{\text{soil}})$ is determined by precipitation $F^W_{\text{precip}}$ and losses due to drainage $F^W_{\text{drainage}}$ and transpiration $F^W_{\text{transpiration}}$. - -$F^W_{\text{precip}}$ is the precipitation rate prescribed at each time step in the `.clim` file and fraction of precipitation intercepted by the canopy $f_{\text{intercept}}$. - - +The term $(1-f_{\text{intercept}})F^W_{\text{precip}}$ is the portion of gross precipitation that reaches the soil (i.e. infiltration from precipitation). Intercepted water (fraction $f_{\text{intercept}}$ of precipitation or canopy‑applied irrigation) is assumed to evaporate the same day and therefore never enters $W_{\text{soil}}$ and does not appear in \eqref{eq:A4}. $F^W_{\text{trans}}$ here is identical to $F^W_{\text{transpiration}}$ used elsewhere. ### $\frak{Drainage}$ -Under well-drained conditions, drainage occurs when soil water content $(W_{\text{soil}})$ exceeds the soil water holding capacity $(W_{\text{WHC}})$. Beyond this point, additional water drains off at a rate controlled by the drainage parameter $f_{\text{drain}}$. For well drained soils, this $f_{\text{drain}}=1$. Setting $f_{\text{drain}}<1$ reduced the rate of drainage, and flooding will will require a combination of a low $f_{\text{drain}}$ and sufficient size and / or frequency of $F^W_\text{irrigation}$ to maintain flooded conditions. +Under well-drained conditions, drainage occurs when soil water content $(W_{\text{soil}})$ exceeds the soil water holding capacity $(W_{\text{WHC}})`. Beyond this point, additional water drains off at a rate controlled by the drainage parameter $f_{\text{drain}}$. For well drained soils, this $f_{\text{drain}}=1$. Setting $f_{\text{drain}}<1$ reduced the rate of drainage, and flooding will will require a combination of a low $f_{\text{drain}}$ and sufficient size and / or frequency of $F^W_\text{irrigation}$ to maintain flooded conditions. $$ F^W_{\text{drainage}} = f_\text{drain} \cdot \max(W_{\text{soil}} - W_{\text{WHC}}, 0) \tag{23}\label{eq:drainage} @@ -475,6 +479,59 @@ $$ This is adapted from the original SIPNET formulation (Braswell et al 2005), adding a new parameter that controls the drainage rate. +### Precipitation + +We define $F^W_{\text{precip}} = P$ as gross (measured) precipitation depth. The fraction reaching the soil is: +$$ +F^W_{\text{precip,soil}} = (1 - f_{\text{intercept}})\,F^W_{\text{precip}} +$$ + +$F^W_{\text{precip,soil}}$ is added to soil water in equation \eqref{eq:A4}. + +### Evapotranspiration + +$$ +ET = E + T +$$ + +Evapotranspiration ($ET$) is calculated as the sum of evaporation ($E$) and transpiration ($T$), which are defined below: + +### Evaporation + +There are two components of evaporation: (1) immediate evaporation from intercepted precipitation or canopy irrigation and (2) soil surface evaporation. + +**Interception (Immediate Evaporation)** + +$$ +F^W_{\text{intercept,evap}} = f_{\text{intercept}}\,(F^W_{\text{precip}} + F^W_{\text{irrig,canopy}}) +$$ + +**Soil Evaporation** + +Soil evaporation is computed as: + +$$ +F^W_{\text{soil,evap}} = +\frac{\rho C_p}{\gamma}\frac{1}{\lambda} +\frac{\text{VPD}_\text{soil}}{r_d + r_{\text{soil}}} +$$ + +where: +$$ +r_d = \frac{\text{rdConst}}{u}, \qquad +r_{\text{soil}} = \exp\!\left(r_{\text{soil},1} - r_{\text{soil},2}\frac{W_{\text{soil}}}{W_{\text{WHC}}}\right) +$$ + +Negative (condensation) values are clipped to zero. If snow > 0 then $F^W_{\text{soil,evap}}=0$. + +#### Evaporation + +Total evaporation is calculated as the sum of intercepted water, soil evaporation, and sublimation: + +$$ +E = F^W_{\text{trans}} + F^W_{\text{intercept,evap}} + F^W_{\text{soil,evap}} + F^W_{\text{sublim}} +$$ + ### Transpiration #### Water Use Efficiency (WUE) @@ -588,12 +645,12 @@ Where $\beta$ and $\gamma$ are parameters that control the shape of the curve, a For the relationship between $N_2O$ flux and soil moisture, Wang et al (2023) suggest a Gaussian function. -## $\frak{Agronomic \ Management \ Events}$ +## Agronomic Management Events All management events are specified in the `events.in`. Each event is a separate record that includes the date of the event, the type of event, and associated parameters. -### $\frak{Fertilizer}$ and Organic Matter Additions +### Fertilizer and Organic Matter Additions Additions of Mineral N, Organic N, and Organic C are added directly to their respective pools via the fluxes $F^N_{\text{fert,min}}$, $F^N_{\text{fert,org}},$ and $F^C_{\text{fert,org}}$ that are specified @@ -659,28 +716,45 @@ $$ This amount is then added to the litter flux in equation \eqref{eq:litter_flux}. -### $\frak{Irrigation}$ +### Irrigation Event parameters: * Irrigation rate $(F^W_{\text{irrigation}})$, cm/day -* Irrigation type indicator $(I_{\text{irrigation}})$: - * Canopy irrigation (0): Water applied to the canopy, simulating rainfall. +* Irrigation type indicator $(I_{\text{irrigation}}\in {0,1})$: + * Canopy irrigation (0): Water applied to the canopy. * Soil irrigation (1): Water directly added to the soil. - +The irrigation that that reaches the soil water pool is: +$$ +F^W_{\text{irrig,soil}} = +\begin{cases} +(1 - f_{\text{intercept}}) \, F^W_{\text{irrig}}, & I_{\text{irrigation}} = 0 \\ +F^W_{\text{irrig}}, & I_{\text{irrigation}} = 1 +\end{cases} +\tag{30}\label{eq:irrig_soil} +$$ + +Irrigation that is immediately evaporated: +$$ +F^W_{\text{irrig,evap}} = +\begin{cases} +f_{\text{intercept}} \, F^W_{\text{irrig}}, & I_{\text{irrigation}} = 0 \\ +0, & I_{\text{irrigation}} = 1 +\end{cases} +\tag{29}\label{eq:irrig_evap} +$$ -**Canopy irrigation** is simulated in the same way as precipitation, where a fraction of irrigation is intercepted and evaporated, and the remainder is added to the soil water pool. -**Soil irrigation** adds water directly to the soil pool without interception. Flooded furrow irrigation' is a special case of soil irrigation, with a high rate of irrigation. | -| | +| parameter | col | req? | description | +| --------- | :---: | :---: | ----------- | +| org-N | 5 | Y | g N / m2 | +| org-C | 6 | Y | g C / m2 | +| min-N | 7 | Y | g N / m2 | + - Model representation: increases size of mineral N and litter C and N. Urea-N is assumed to be mineral N. - - notes: PEcAn will handle conversion from fertilizer amount and type to mass of N and C allocated to different pools + - The code that generates `events.in` will handle conversion from fertilizer amount and type to mass of N and C allocated to different pools. In PEcAn this is done by the `PEcAn.SIPNET::write.configs.SIPNET()` function. -#### Tillage Events +#### Tillage -| parameter | col | req? | description | -| ---------------------------------- | :---: | :---: | ------------------- | -| tillageEff (\(f_{\textrm{till}}\)) | 5 | Y | Adjustment to $R_H$ | +| parameter | col | req? | description | +| -------------------------------- | :---: | :---: | ------------------- | +| tillageEff $(f_{\textrm{till}})$ | 5 | Y | Adjustment to $R_H$ | - Model representation: - Transient increase in decomposition rate by $f_{\text{,tillage}}$ that exponentially decays over time. - Multiple tillage events are additive. -#### Planting Events +#### Planting | parameter | col | req? | description | | ------------- | :---: | :---: | -------------------------------------------- | @@ -564,7 +561,7 @@ Notes: - $N$ pools are calculated from $CN$ stoichiometric ratios. - notes: PFT (crop type) is not an input parameter for a planting event because SIPNET only represents a single PFT. -#### Harvest Events +#### Harvest | parameter | col | req? | description | | ---------------------------------------------------------- | :---: | :---: | --------------------- | @@ -596,44 +593,47 @@ Notes: The `sipnet.out` file contains a time series of state variables and fluxes from the simulation. -| | Symbol | Parameter Name | Definition | Units | -| --- | -------------------- | ------------------- | ------------------------------ | -------------------- | -| 1 | | year | year of start of this timestep | | -| 2 | | day | day of start of this timestep | | -| 3 | | time | time of start of this timestep | | -| 4 | | plantWoodC | carbon in wood | g C/m$^2$ | -| 5 | | plantLeafC | carbon in leaves | g C/m$^2$ | -| 6 | | soil | carbon in mineral soil | g C/m$^2$ | -| 7 | | microbeC | carbon in soil microbes | g C/m$^2$ | -| 8 | | coarseRootC | carbon in coarse roots | g C/m$^2$ | -| 9 | | fineRootC | carbon in fine roots | g C/m$^2$ | -| 10 | | litter | carbon in litter | g C/m$^2$ | -| 11 | | litterWater | moisture in litter layer | cm | -| 12 | | soilWater | moisture in soil | cm | -| 13 | $f_\text{WHC}$ | soilWetnessFrac | moisture in soil as fraction | | -| 14 | | snow | snow water | cm | -| 15 | | npp | net primary production | g C/m$^2$ | -| 16 | | nee | net ecosystem production | g C/m$^2$ | -| 17 | | cumNEE | cumulative nee | g C/m$^2$ | -| 18 | $GPP$ | gpp | gross ecosystem production | g C/m$^2$ | -| 19 | $R_{A,\text{above}}$ | rAboveground | plant respiration above ground | g C/m$^2$ | -| 20 | $R_H$ | rSoil | soil respiration | g C/m$^2$ | -| 21 | $R_{A\text{, root}}$ | rRoot | root respiration | g C/m$^2$ | -| 22 | $R$ | rtot | total respiration | g C/m$^2$ | -| 23 | | fluxestranspiration | transpiration | cm | +| # | Symbol | Output Name | Definition / Notes | Units | +| --- | ---------------- | ------------------- | ------------------------------------------------------------------------- | ------------ | +| 1 | | year | Year of start of timestep | (integer) | +| 2 | | day | Day-of-year of start of timestep | (integer) | +| 3 | | time | Hour-of-day (fractional) at start of timestep | hours | +| 4 | | plantWoodC | Woody plant carbon | g C m$^{-2}$ | +| 5 | | plantLeafC | Leaf carbon | g C m$^{-2}$ | +| 6 | | soil | (Single) soil organic carbon (or mineral soil C pool) | g C m$^{-2}$ | +| 7 | | microbeC | Microbial carbon (0 if microbes flag off) | g C m$^{-2}$ | +| 8 | | coarseRootC | Coarse root carbon | g C m$^{-2}$ | +| 9 | | fineRootC | Fine root carbon | g C m$^{-2}$ | +| 10 | | litter | Litter carbon (0 if litter pool disabled) | g C m$^{-2}$ | +| 11 | | soilWater | Soil water content | cm | +| 12 | $f_{\text{WHC}}$ | soilWetnessFrac | Soil water as fraction of holding capacity | unitless | +| 13 | | snow | Snow water equivalent | cm | +| 14 | | npp | Net primary production for timestep | g C m$^{-2}$ | +| 15 | | nee | Net ecosystem exchange (sign convention per code: - (NPP - RH)) | g C m$^{-2}$ | +| 16 | | cumNEE | Cumulative NEE since simulation start | g C m$^{-2}$ | +| 17 | $GPP$ | gpp | Gross primary production | g C m$^{-2}$ | +| 18 | | rAboveground | Aboveground autotrophic respiration (leaves + wood) | g C m$^{-2}$ | +| 19 | $R_H$ | rSoil | Heterotrophic respiration (maintenance + microbe terms per configuration) | g C m$^{-2}$ | +| 20 | | rRoot | Root (autotrophic) respiration | g C m$^{-2}$ | +| 21 | | ra | Total autotrophic respiration (rAboveground + rRoot) | g C m$^{-2}$ | +| 22 | | rh | Total heterotrophic respiration (litter + soil components) | g C m$^{-2}$ | +| 23 | $R$ | rtot | Total ecosystem respiration (ra + rh) | g C m$^{-2}$ | +| 24 | | evapotranspiration | ET (transpiration + immedEvap + evaporation + sublimation) for timestep | cm | +| 25 | | fluxestranspiration | Transpiration component only | cm | + An example output file can be found in [tests/smoke/sipnet.out](https://github.com/PecanProject/sipnet/blob/master/tests/smoke/niwot/sipnet.out). ``` Notes: PlantWoodC, PlantLeafC, Soil and Litter in g C/m^2; Water and Snow in cm; SoilWetness is fraction of WHC; -year day time plantWoodC plantLeafC soil microbeC coarseRootC fineRootC litter litterWater soilWater soilWetnessFrac snow npp nee cumNEE gpp rAboveground rSoil rRoot ra rh rtot evapotranspiration fluxestranspiration fPAR -1998 305 0.00 5759.77 1133.88 16000.06 8.00 1919.90 1919.64 400.00 0.500 6.00 0.500 0.00 -0.32 0.74 0.74 0.00 0.164 0.578 0.159 0.324 0.419 0.742 0.00302126 0.0000 0.0000 -1998 305 7.00 5759.63 1133.71 16000.08 8.00 1919.77 1919.10 400.00 0.500 5.99 0.500 0.00 -0.30 0.97 1.71 0.22 0.271 0.917 0.251 0.522 0.666 1.188 0.00240544 0.0022 0.5821 -1998 305 17.00 5759.16 1133.48 16000.15 8.00 1919.57 1918.37 400.00 0.500 5.99 0.499 0.00 -0.67 1.56 3.27 0.00 0.338 1.219 0.335 0.673 0.884 1.557 0.00662149 0.0000 0.5821 +year day time plantWoodC plantLeafC soil microbeC coarseRootC fineRootC litter litterWater soilWater soilWetnessFrac snow npp nee cumNEE gpp rAboveground rSoil rRoot ra rh rtot evapotranspiration fluxestranspiration +1998 305 0.00 5759.77 1133.88 16000.06 8.00 1919.90 1919.64 0.500 6.00 0.500 0.00 -0.32 0.74 0.74 0.00 0.164 0.578 0.159 0.324 0.419 0.742 0.00302126 0.0000 +1998 305 7.00 5759.63 1133.71 16000.08 8.00 1919.77 1919.10 0.500 5.99 0.500 0.00 -0.30 0.97 1.71 0.22 0.271 0.917 0.251 0.522 0.666 1.188 0.00240544 0.0022 +1998 305 17.00 5759.16 1133.48 16000.15 8.00 1919.57 1918.37 0.500 5.99 0.499 0.00 -0.67 1.56 3.27 0.00 0.338 1.219 0.335 0.673 0.884 1.557 0.00662149 0.0000 ``` ### Events output From ac331b74cc8f31e71bc0c78ad25b673ef6b653ff Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Thu, 28 Aug 2025 11:38:32 -0700 Subject: [PATCH 09/17] formatting --- docs/model-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/model-structure.md b/docs/model-structure.md index ce1c42d8..42256273 100644 --- a/docs/model-structure.md +++ b/docs/model-structure.md @@ -469,7 +469,7 @@ $$ The term $(1-f_{\text{intercept}})F^W_{\text{precip}}$ is the portion of gross precipitation that reaches the soil (i.e. infiltration from precipitation). Intercepted water (fraction $f_{\text{intercept}}$ of precipitation or canopy‑applied irrigation) is assumed to evaporate the same day and therefore never enters $W_{\text{soil}}$ and does not appear in \eqref{eq:A4}. $F^W_{\text{trans}}$ here is identical to $F^W_{\text{transpiration}}$ used elsewhere. -### $\frak{Drainage}$ +### $Drainage$ Under well-drained conditions, drainage occurs when soil water content $(W_{\text{soil}})$ exceeds the soil water holding capacity $(W_{\text{WHC}})`. Beyond this point, additional water drains off at a rate controlled by the drainage parameter $f_{\text{drain}}$. For well drained soils, this $f_{\text{drain}}=1$. Setting $f_{\text{drain}}<1$ reduced the rate of drainage, and flooding will will require a combination of a low $f_{\text{drain}}$ and sufficient size and / or frequency of $F^W_\text{irrigation}$ to maintain flooded conditions. From 30061dde8b0b1dab6825f178135005610bf4e8df Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Thu, 28 Aug 2025 12:10:13 -0700 Subject: [PATCH 10/17] more formatting --- docs/parameters.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/parameters.md b/docs/parameters.md index 6db4d2f3..7420f5cc 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -498,6 +498,7 @@ Agronomic (management) events are read from an `events.in` file. This file speci | 4…n | event_param | Type‑specific parameters (see below) | varies | Order depends on event type | Rules: + - File must be in chronological order. Ties (same day multiple events) are allowed and processed in file order. - Events are specified at day resolution (no sub‑daily timestamp). - Every (year, day) appearing in `events.in` must have at least one corresponding climate record; otherwise SIPNET errors. @@ -579,8 +580,8 @@ Specifically: #### Example of `events.in` file: ``` -2022 35 till 0.2 # tilled on day 35, f_till = 0.2 (20% boost to rate term) -2022 40 till 0.1 # tilled on day 40, adds 0.1 to f_till +2022 35 till 0.2 # tilled on day 35, f_till = 0.2 (20% boost to rate term) +2022 40 till 0.1 # tilled on day 40, adds 0.1 to f_till 2022 40 irrig 5 1 # 5cm canopy irrigation on day 40 applied to soil 2022 40 fert 0 0 10 # fertilized with 10 g / m2 N_min on day 40 of 2022 2022 50 plant 10 3 2 5 # plant emergence on day 50 with 10/3/2/4 g C / m2, respectively, added to the leaf/wood/fine root/coarse root pools From 8e0ccb802b64a7d7dccb38b199ec5413fd4efab1 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Thu, 28 Aug 2025 15:12:43 -0700 Subject: [PATCH 11/17] Update docs/.alternate-model-structure-ideas.md --- docs/.alternate-model-structure-ideas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.alternate-model-structure-ideas.md b/docs/.alternate-model-structure-ideas.md index f25b4607..68c01c8f 100644 --- a/docs/.alternate-model-structure-ideas.md +++ b/docs/.alternate-model-structure-ideas.md @@ -23,7 +23,7 @@ Heterotrophic respiration ($R_h$) is a function of soil carbon content ($C_S$), Currently, irrigation is specified as an amount. -Alternative: +Additional approach based on farmer behavior: To represent an irrigation program that sets a moisture range and turns irrigation on at a lower moisture threshold and of at an upper threshold. This could be done internally by directly changing the soil moisture content - while keeping track of the amount of water added to report in events.out. ### Flooding From d227753a4771b6b85ac8a1bbcd76b675deee247a Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Thu, 28 Aug 2025 15:19:55 -0700 Subject: [PATCH 12/17] fixed typos and updated doc of drainage --- docs/model-structure.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/model-structure.md b/docs/model-structure.md index 42256273..2dda186e 100644 --- a/docs/model-structure.md +++ b/docs/model-structure.md @@ -469,9 +469,9 @@ $$ The term $(1-f_{\text{intercept}})F^W_{\text{precip}}$ is the portion of gross precipitation that reaches the soil (i.e. infiltration from precipitation). Intercepted water (fraction $f_{\text{intercept}}$ of precipitation or canopy‑applied irrigation) is assumed to evaporate the same day and therefore never enters $W_{\text{soil}}$ and does not appear in \eqref{eq:A4}. $F^W_{\text{trans}}$ here is identical to $F^W_{\text{transpiration}}$ used elsewhere. -### $Drainage$ +### Drainage -Under well-drained conditions, drainage occurs when soil water content $(W_{\text{soil}})$ exceeds the soil water holding capacity $(W_{\text{WHC}})`. Beyond this point, additional water drains off at a rate controlled by the drainage parameter $f_{\text{drain}}$. For well drained soils, this $f_{\text{drain}}=1$. Setting $f_{\text{drain}}<1$ reduced the rate of drainage, and flooding will will require a combination of a low $f_{\text{drain}}$ and sufficient size and / or frequency of $F^W_\text{irrigation}$ to maintain flooded conditions. +Under well-drained conditions, drainage occurs when soil water content $(W_{\text{soil}})$ exceeds the soil water holding capacity $(W_{\text{WHC}})$. Beyond this point, additional water drains off at a rate controlled by the drainage parameter $f_{\text{drain}}$ defined as the fraction of soil water that can be removed in one day. For well drained soils, this $f_{\text{drain}}=1$. Setting $f_{\text{drain}}<1$ reduces the rate of drainage. Flooding can be simulated by requiring a combination of a low $f_{\text{drain}}$ and sufficient $F^W_\text{irrig|precip,soil}$ to maintain flooded conditions. $$ F^W_{\text{drainage}} = f_\text{drain} \cdot \max(W_{\text{soil}} - W_{\text{WHC}}, 0) \tag{23}\label{eq:drainage} From f68674f10e8bc1dfcb6e5d46cda8f246a495c0a7 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Thu, 28 Aug 2025 15:23:13 -0700 Subject: [PATCH 13/17] update typo F_vol --- docs/model-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/model-structure.md b/docs/model-structure.md index 2dda186e..75a44ab1 100644 --- a/docs/model-structure.md +++ b/docs/model-structure.md @@ -390,7 +390,7 @@ Because we expect $N_2O$ emissions will be dominated by fertilizer N inputs, we A new fixed parameter $K_\text{vol}$ will represent the proportion of $N_\text{min}$ that is volatilized as $N_2O$. $$ -F^N_\mathrm{N_2O vol} = K_\text{vol} \cdot N_\text{min} \cdot D_{\text{temp}} \cdot D_{\text{water}R_H} \tag{17}\label{eq:n2o_vol} +F^N_\mathrm{vol} = K_\text{vol} \cdot N_\text{min} \cdot D_{\text{temp}} \cdot D_{\text{water}R_H} \tag{17}\label{eq:n_vol} $$ ### $\frak{Nitrogen \ Leaching \ F^N_\text{leach}}$ From fae1509e2d7a7fe01e9f552998b110bd264d09be Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Mon, 15 Sep 2025 13:11:39 -0700 Subject: [PATCH 14/17] typos --- docs/parameters.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/parameters.md b/docs/parameters.md index 7420f5cc..86f7b30a 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -76,7 +76,7 @@ Subscripts may be used in combination, e.g. $X_{\text{soil,mineral},0}$. ## Run-time Parameters -Run-time parameters can change from one run to the next, or when the model is stopped and restarted. These include initial state values and parameters related to plant physiology, soil physiology, and biogeochemical cycling. +Run-time parameters can change from one run to the next, or when the model is stopped and restarted. These include initial state values and parameters related to plant physiology, soil physics, and biogeochemical cycling. ### Initial state values @@ -189,8 +189,6 @@ Run-time parameters can change from one run to the next, or when the model is st | 34 | $Q_{10s}$ | soilRespQ10 | Soil respiration Q10 | | scalar determining effect of temp on soil respiration | | 39 | | soilRespMoistEffect | scalar determining effect of moisture on soil resp. | | | | | | baseMicrobeResp | | | | -| | | | | | | - | new | $f_{\textrm{till}}$ | tillageEff | Effect of tillage on decomposition that exponentially decays over time | fraction | Per‑event in `events.in`; 0 = no effect | - $R_{dec}$: Rate of decomposition $(\text{day}^{-1})$ From 4e698762e7510ebf28498124be018605c25548a8 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Wed, 17 Sep 2025 16:29:58 -0700 Subject: [PATCH 15/17] Add DOI badge to README --- docs/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/README.md b/docs/README.md index ef4b39b3..5e05c7ab 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,6 +4,9 @@ SIPNET (Simplified Photosynthesis and Evapotranspiration Model) is an ecosystem carbon and water dynamics. Originally developed for assimilation of eddy covariance flux data in forest ecosystems, current development is focused on representing carbon balance and GHG fluxes and agricultural management practices. +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.17148669.svg)](https://doi.org/10.5281/zenodo.17148669) + + ## Quick Start 1. Clone the repository: From dcb76363956d708cc6bb46a824866bca18bd6e24 Mon Sep 17 00:00:00 2001 From: David LeBauer Date: Mon, 22 Sep 2025 12:35:44 -0700 Subject: [PATCH 16/17] Add documentation for model outputs, parameters, logging; update navigation --- docs/developer-guide/code-structure.md | 87 ++++++ docs/developer-guide/logging.md | 54 ++-- docs/model-inputs.md | 289 +++++++++++++++++++ docs/model-outputs.md | 79 ++++++ docs/parameters.md | 379 +------------------------ mkdocs.yml | 3 + 6 files changed, 503 insertions(+), 388 deletions(-) create mode 100644 docs/model-inputs.md create mode 100644 docs/model-outputs.md diff --git a/docs/developer-guide/code-structure.md b/docs/developer-guide/code-structure.md index e69de29b..183a7280 100644 --- a/docs/developer-guide/code-structure.md +++ b/docs/developer-guide/code-structure.md @@ -0,0 +1,87 @@ +# Code Structure + +This guide documents how state is advanced each timestep and the conventions that keep flux calculations pure and pool updates centralized. + +## Timestep Phases (in `updateState()`) + +1) Initialize fluxes +- Zero all `fluxes.*` and `fluxes.event*`. + +2) Compute fluxes (pure calculations) +- `calculateFluxes()` computes photosynthesis, respiration, water/snow, etc. +- `processEvents()` converts scheduled/instant events to `fluxes.event*` deltas (no pool mutation). +- `soilDegradation()` and other biogeochemical modules compute additional flux rates only (no pool mutation). +- No function in this phase mutates `envi.*` or `trackers.*`. + +3) Apply pool updates (single place) +- `applyPoolUpdates()` is the only code that changes `envi.*`. +- For each pool P: ΔP = (sum of rate fluxes to P) * climate.length + (sum of `fluxes.event*` deltas to P). +- Apply bounds, conservation, and cross-pool constraints here. + +4) Trackers and running means +- `updateTrackers()` uses timestep-integrated values (rate * climate.length) plus event deltas. + +5) Output +- `outputState()` and any optional diagnostics/logging. + +### Pseudocode outline + +- updateState(): + - zeroFluxes() + - calculateFluxes() // pure rates + - processEvents() // sets fluxes.event* deltas only + - soilDegradation() // pure rates + - applyPoolUpdates() // the only place that mutates envi.* + - updateTrackers() + - outputState() + +## Mutability Rules (must-follow) + +- Only `applyPoolUpdates()` may change `envi.*`. +- Flux calculators: + - May read `envi.*`, `params.*`, `ctx.*`, `climate.*`. + - May write `fluxes.*` (rates) and `fluxes.event*` (event deltas). + - Must not mutate `envi.*`, `trackers.*`, or perform I/O as logic side-effects. +- Events never change pools directly; they only add to `fluxes.event*`. + +## Units and Integration + +- Rate fluxes in `fluxes.*` are per-day rates (pool units per day). +- Event deltas in `fluxes.event*` are direct pool deltas (same units as pools), not rates. +- Integration per pool each timestep: + - Δpool_from_rates = (sum of relevant `fluxes.*`) * climate.length + - Δpool_from_events = (sum of relevant `fluxes.event*`) + - pool += Δpool_from_rates + Δpool_from_events + +## Naming Conventions + +- envi.* State variables (pools, water, snow, canopy, soil layers). +- fluxes.* Per-day flux rates computed in the flux phase. +- fluxes.event* Instantaneous/event deltas to be applied during pool update. +- trackers.* Integrated timestep values, cumulative sums, yearly aggregates. +- params.* Fixed run parameters (immutable during a run). +- ctx.* Feature flags / configuration switches. +- climate.* Forcing for the current timestep (e.g., length, met drivers). +- diag.* Optional transient diagnostics (no side effects on state). + +Name fluxes by direction and target, e.g., `fluxes.NPP`, `fluxes.soilRespiration`, `fluxes.leafLitterToSoil`, `fluxes.eventHarvestC`. Prefer “to/from” clarity for transfers. + +## Pool Update Responsibilities + +- Apply all additions/removals in a consistent order if constraints require it (e.g., water first if it bounds biochemical rates next step). +- Enforce invariants: + - No negative pools; clamp with tracked deficits and warnings if needed. + - Mass conservation across linked pools (e.g., C/N stoichiometry) with balanced cross-pool transfers. +- Centralize any event-specific application here (e.g., harvest removing biomass, adding residues). + +## Adding a New Flux or Event + +- Rates: add a `fluxes.*` variable, compute it in a flux function, and integrate it in `applyPoolUpdates()`. +- Events: add a `fluxes.event*` delta, accumulate in `processEvents()`, apply it in `applyPoolUpdates()`. +- Do not mutate `envi.*` in calculators or event processors. + +## Logging & Errors + +- Use `logError()` and `logWarning()` (not printf) so tests can capture output. +- Messages should include timestep context: year, day, event type (if relevant), and the offending value(s). +- Emit warnings on clamping, conservation corrections, or unexpected negative fluxes. \ No newline at end of file diff --git a/docs/developer-guide/logging.md b/docs/developer-guide/logging.md index 7dbf94f5..4be19fbf 100644 --- a/docs/developer-guide/logging.md +++ b/docs/developer-guide/logging.md @@ -1,32 +1,46 @@ # Logging -SIPNET's logger is defined in `common/logger.h` and implemented in `common/logger.c`. +SIPNET's logger is a small wrapper around `printf` that adds standard prefixes and, for internal errors, the source file and line number. It is defined in `common/logging.h` and implemented in `common/logging.c`. -It provides a simple interface for logging messages at different levels (e.g., debug, info, warning, error). +## Levels -The use of logger functions is preferred over `printf` because ... -It is appropriate to use printf when ... - -## Logging Levels - -- **logDebug**: Information useful during development or debugging. -- **logInfo**: General information about the program's execution, such as successful initialization or key milestones. -- **logWarning**: Non-critical issues that might require attention but do not stop execution. Example: deprecated parameters or ignored input. -- **logError**: Critical issues that prevent the program from continuing correctly. Example: missing required parameters or internal errors. +- 0: Quiet-able (suppressed by `--quiet`). +- 1: Always on (not suppressed). +- 2: Always on and includes `file:line`. ## Usage -1. Include the logger header in your source file: +- logInfo: Level 0; routine progress, configuration summaries, expected state changes. +- logWarning: Level 0; Recoverable issues or surprises; fallbacks, deprecated/ignored inputs. +- logTest: Level 1; Deterøinistic messages for tests/CI; not user-facing. +- logError: Level 1; Non-recoverable problems preventing correct operation; abort/exit or skip major task. +- logInternalError: Level 2; Errors that should never happen; include details and ask to report. + +1. Include the header: ```c - #include "common/logger.h" + #include "common/logging.h" ``` - -2. Use the logging functions to log messages at different levels: +2. Log messages: ```c - // Log messages at different levels - logDebug("This is a debug message"); - logInfo("This is an info message"); - logWarning("This is a warning message"); - logError("This is an error message"); + logInfo("Initialized OK\n"); + logWarning("Deprecated parameter: %s\n", name); + logTest("Iteration %d\n", i); + logError("Missing required parameter: %s\n", key); + logInternalError("Unexpected state: %d\n", code); ``` +3. Example outputs: + ``` + [INFO ] Initialized OK + [WARNING] Deprecated parameter: foo + [TEST ] Iteration 12 + [ERROR ] Missing required parameter: bar + [ERROR (INTERNAL)] (myfile.c:123) Unexpected state: 5 + ``` + + +## Notes: + +- Each log prints a fixed prefix (e.g., `[INFO ]`, `[WARNING]`, `[ERROR ]`). +- Messages use `printf`-style formatting. Include `\n` yourself if you want a newline. +- Level 2 (`logInternalError`) prints file:line; levels 0–1 print just the prefix. diff --git a/docs/model-inputs.md b/docs/model-inputs.md new file mode 100644 index 00000000..b80c3708 --- /dev/null +++ b/docs/model-inputs.md @@ -0,0 +1,289 @@ +# Model Inputs + +There are three main types of input files needed to run SIPNET: +1. `sipnet.param`: Model parameter file. +2. `.clim`: Climate file, provides weather data for each time step of the simulation period. +3. `events.in`: (Optional) Agronomic events. +4. Run time options (command line arguments or config file `sipnet.in`) + +## Parameters and Initial Conditions + +Both initial conditions and parameters are specified in a file named `sipnet.param`. + +The SIPNET parameter file (`sipnet.param`) specifies model parameters and their properties for each simulation. +Each line in the file corresponds to a single parameter and contains five or six space-separated values. + +| Column | Description | +| -------------- | ------------------------------------------ | +| Parameter Name | Name of the parameter | +| Value | Value of the parameter to use in the model | + +### Example `sipnet.param` file + +Column names are not used, but are: + +``` +param_name value +``` + +The first lines in `sipnet.param` could be: + +``` +plantWoodInit 110 +laiInit 0 +litterInit 200 +soilInit 7000 +litterWFracInit 0.5 +soilWFracInit 0.6 +snowInit 1 +microbeInit 0.5 +fineRootFrac 0.2 +coarseRootFrac 0.2 +aMax 95 +aMaxFrac 0.85 +... +``` + +## Climate + +For each step of the model, the following inputs are needed. These are provided in a file named `.clim` with the following columns: + +| col | parameter | description | units | notes | +| --- | --------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- | +| 1 | year | year of start of this timestep | | integer, e.g. 2010 | +| 2 | day | day of start of this timestep | Day of year | 1 = Jan 1 | +| 3 | time | time of start of this timestep | hours after midnight | e.g. noon = 12.0, midnight = 0.0, can be a fraction | +| 4 | length | length of this timestep | days | variable-length timesteps allowed, typically not used | +| 5 | tair | avg. air temp for this time step | degrees Celsius | | +| 6 | tsoil | average soil temperature for this time step | degrees Celsius | can be estimated from Tair | +| 7 | par | average photosynthetically active radiation (PAR) for this time step | $\text{Einsteins} \cdot m^{-2} \text{ground area} \cdot \text{time step}^{-1}$ | input is in Einsteins \* m^-2 ground area, summed over entire time step | +| 8 | precip | total precip. for this time step | cm | input is in mm; water equivilant - either rain or snow | +| 9 | vpd | average vapor pressure deficit | kPa | input is in Pa, can be calculated from air temperature and relative humidity. | +| 10 | vpdSoil | average vapor pressure deficit between soil and air | kPa | input is in Pa ; differs from vpd in that saturation vapor pressure is calculated using Tsoil rather than Tair | +| 11 | vPress | average vapor pressure in canopy airspace | kPa | input is in Pa | +| 12 | wspd | avg. wind speed | m/s | | + +Note: An older format for this file included location as the first column and soilWetness as the last column. Files with this older format can still be read by sipnet: +* SIPNET will print a warning indicating that it is ignoring the obsolete columns +* If there is more than one location specified in the file, SIPNET will error and halt + +### Example `sipnet.clim` file: + +Column names are not used, but are: + +``` +loc year day time length tair tsoil par precip vpd vpdSoil vPress wspd +``` + +**Half-hour time step** + +``` +0 1998 305 0.00 -1800 1.9000 1.2719 0.0000 0.0000 109.5364 77.5454 726.6196 1.6300 +0 1998 305 0.50 -1800 1.9000 1.1832 0.0000 0.0000 109.5364 73.1254 726.6196 1.6300 +0 1998 305 1.00 -1800 2.0300 1.1171 0.0000 0.0000 110.4243 63.9567 732.5092 0.6800 +0 1998 305 1.50 -1800 2.0300 1.0439 0.0000 0.0000 110.4243 60.3450 732.5092 0.6800 +``` + +**Variable time step** + +``` +0 1998 305 0.00 0.292 1.5 0.8 0.0000 0.0000 105.8 70.1 711.6 0.9200 +0 1998 305 7.00 0.417 3.6 1.8 5.6016 0.0000 125.7 23.5 809.4 1.1270 +0 1998 305 17.00 0.583 1.9 1.3 0.0000 0.0000 108.1 75.9 732.7 1.1350 +0 1998 306 7.00 0.417 2.2 1.4 2.7104 1.0000 114.1 71.6 741.8 0.9690 +``` + +## Agronomic Events + +Agronomic (management) events are read from an `events.in` file. This file specifies one event per line: + +| col | parameter | description | units | notes | +| --- | ----------- | ------------------------------------ | ------ | ------------------------------------------------ | +| 1 | year | Year of the event | | e.g. 2025 | +| 2 | day | Day of year of the event | DOY | 1 = Jan 1 | +| 3 | event_type | Event type code | | one of: `plant`, `harv`, `till`, `fert`, `irrig` | +| 4…n | event_param | Type‑specific parameters (see below) | varies | Order depends on event type | + +Rules: + +- File must be in chronological order. Ties (same day multiple events) are allowed and processed in file order. +- Events are specified at day resolution (no sub‑daily timestamp). +- Every (year, day) appearing in `events.in` must have at least one corresponding climate record; otherwise SIPNET errors. +- Values in `events.in` are instantaneous amounts (cm or mass/area) applied on the date and time of the first climate record matching that event's year and day. + +See subsections below for details and parameter definitions for each event type. + +### Irrigation + +| parameter | col | req? | description | +| --------- | :---: | :---: | ------------------------------------------- | +| amount | 5 | Y | Amount added (cm) | +| method | 6 | Y | 0=canopy
1=soil
2=flood (placeholder) | + +Model representation: An irrigation event increases soil moisture. A fraction of canopy irrigation is immediately evaporated. + +Specifically: + +- For `method=soil`, this amount of water is added directly to the `soilWater` state variable +- For `method=canopy`, a fraction of the irrigation water (determined by input param `immedEvapFrac`) is added to the flux state variable `immedEvap`, with the remainder going to `soilWater`. +- Initial implementation assumes that LITTER_WATER is not on. This might be revisited at a later date. + + +### Fertilization + +| parameter | col | req? | description | +| --------- | :---: | :---: | ----------- | +| org-N | 5 | Y | g N / m2 | +| org-C | 6 | Y | g C / m2 | +| min-N | 7 | Y | g N / m2 | + + + - Model representation: increases size of mineral N and litter C and N. Urea-N is assumed to be mineral N. + + - The code that generates `events.in` will handle conversion from fertilizer amount and type to mass of N and C allocated to different pools. In PEcAn this is done by the `PEcAn.SIPNET::write.configs.SIPNET()` function. + +### Tillage + +| parameter | col | req? | description | +| -------------------------------- | :---: | :---: | ------------------- | +| tillageEff $(f_{\textrm{till}})$ | 5 | Y | Adjustment to $R_H$ | + +- Model representation: + - Transient increase in decomposition rate by $f_{\text{,tillage}}$ that exponentially decays over time. + - Multiple tillage events are additive. + +### Planting + +| parameter | col | req? | description | +| ------------- | :---: | :---: | -------------------------------------------- | +| leaf-C | 5 | Y | C added to leaf pool (g C / m2) | +| wood-C | 6 | Y | C added to above-ground wood pool (g C / m2) | +| fine-root-C | 7 | Y | C added to fine root pool (g C / m2) | +| coarse-root-C | 8 | Y | C added to coarse root pool (g C / m2) | + +- Model representation: + - Date of event is the date of emergence, not the date of actual planting + - Increases size of carbon pools by the amount of each respective parameter + - $N$ pools are calculated from $CN$ stoichiometric ratios. +- notes: PFT (crop type) is not an input parameter for a planting event because SIPNET only represents a single PFT. + +### Harvest + +| parameter | col | req? | description | +| ---------------------------------------------------------- | :---: | :---: | --------------------- | +| fraction of aboveground biomass removed | 5 | Y | | +| fraction of belowground biomass removed | 6 | N | default = 0 | +| fraction of aboveground biomass transferred to litter pool | 7 | N | default = 1 - removed | +| fraction of belowground biomass transferred to litter pool | 8 | N | default = 1 - removed | + +- model representation: + - biomass C and N pools are either removed or added to litter + - for annuals or plants terminated, no biomass remains (col 5 + col 7 = 1 and col 6 + col 8 = 1). + - for perennials, some biomass may remain (col 5 + col 7 <= 1 and col 6 + col 8 <= 1; remainder is living). + - root biomass is only removed for root crops + +### Example of `events.in` file: + +``` +2022 35 till 0.2 # tilled on day 35, f_till = 0.2 (20% boost to rate term) +2022 40 till 0.1 # tilled on day 40, adds 0.1 to f_till +2022 40 irrig 5 1 # 5cm canopy irrigation on day 40 applied to soil +2022 40 fert 0 0 10 # fertilized with 10 g / m2 N_min on day 40 of 2022 +2022 50 plant 10 3 2 5 # plant emergence on day 50 with 10/3/2/4 g C / m2, respectively, added to the leaf/wood/fine root/coarse root pools +2022 250 harv 0.1 # harvest 10% of aboveground plant biomass on day 250 +``` + +## Run-time Options + +Configuration settings are applied in the following order of precedence: + +1. Default values built into SIPNET +2. Values from the configuration file +3. Command-line arguments + +Thus, command-line arguments override settings in the configuration file, and configuration file settings override default values. + +### Input / Output Options + +| Option | Default | Description | +| ------------ | --------- | ------------------------------------- | +| `input-file` | sipnet.in | Name of input config file | +| `file-name` | sipnet | Prefix of climate and parameter files | + +### Output Flags + +| Option | Default | Description | +| ------------------- | ------- | -------------------------------------------------------------- | +| `do-main-output` | on | Print time series of all output variables to `.out` | +| `do-single-outputs` | off | Print outputs one variable per file (e.g. `.NEE`) | +| `dump-config` | on | Print final config to `.config` | +| `print-header` | on | Whether to print header row in output files | +| `quiet` | off | Suppress info and warning message | + +### Model Flags + +| Option | Default | Description | +| ------------- | ------- | ---------------------------------------------------------------------------------------- | +| `events` | on | Enable event handling. | +| `gdd` | on | Use growing degree days to determine leaf growth. | +| `growth-resp` | off | Explicitly model growth respiration, rather than including with maintenance respiration. | +| `leaf-water` | off | Calculate leaf pool and evaporate from that pool. | +| `litter-pool` | off | Enable litter pool in addition to single soil carbon pool. | +| `microbes` | off | Enable microbe modeling. | +| `snow` | on | Keep track of snowpack, rather than assuming all precipitation is liquid. | +| `soil-phenol` | off | Use soil temperature to determine leaf growth. | +| `water-hresp` | on | Whether soil moisture affects heterotrophic respiration. | + +Note the following restrictions on these options: + - `soil-phenol` and `gdd` may not both be turned on + +### Command Line Arguments + +Command-line arguments can be used to specify run-time options when starting SIPNET. The syntax is as follows: + +``` +sipnet [options] +``` + +Where `[options]` can include any of the run-time options listed above. +Flags use the syntax `--flag` to turn them on, or `--no-flag` to turn them off. Other options are specified by `--option value`. + +See `sipnet --help` for a full list of available command-line options. + +### Configuration File Format + +SIPNET reads a configuration file that specifies run-time options without using command-line arguments. By default, SIPNET looks for a file named `sipnet.in` in the current directory. These will be overwritten by command-line arguments if specified. + +The configuration file uses a simple key-value format, `option = value`, +with one option per line; comments follow `#`. Flags are specified as 0 for off and 1 for on. + +#### Example Configuration File + +Note that case is ignored for parameter names, as well as dashes and underscores. + +``` +# Base filename (used for derived filenames) +FILE_NAME = mysite + +# Output options +DO_MAIN_OUTPUT = 1 +DO_SINGLE_OUTPUTS = 0 +DUMP_CONFIG = 1 +PRINT_HEADER = 1 +QUIET = 0 + +# Model options +EVENTS = 1 +GDD = 1 +GROWTH_RESP = 0 +LEAF_WATER = 0 +LITTER_POOL = 0 +MICROBES = 0 +SNOW = 1 +SOIL_PHENOL = 0 +WATER_HRESP = 1 +``` + +When `DUMP_CONFIG` is on, SIPNET will output the final configuration (after applying all settings from defaults, configuration file, and command line) to a file named `.config`. \ No newline at end of file diff --git a/docs/model-outputs.md b/docs/model-outputs.md new file mode 100644 index 00000000..bfc2bb90 --- /dev/null +++ b/docs/model-outputs.md @@ -0,0 +1,79 @@ + +# Outputs + +There are two main output files generated by SIPNET: +1. `sipnet.out`: Model state variables and fluxes at each timestep. +2. `events.out`: Contains a record of agronomic events processed during the simulation (if event handling is enabled). + +## Model Outputs + +The `sipnet.out` file contains a time series of state variables and fluxes from the simulation. + +| # | Symbol | Output Name | Definition / Notes | Units | +| --- | ---------------- | ------------------- | ------------------------------------------------------------------------- | ------------ | +| 1 | | year | Year of start of timestep | (integer) | +| 2 | | day | Day-of-year of start of timestep | (integer) | +| 3 | | time | Hour-of-day (fractional) at start of timestep | hours | +| 4 | | plantWoodC | Woody plant carbon | g C m$^{-2}$ | +| 5 | | plantLeafC | Leaf carbon | g C m$^{-2}$ | +| 6 | | soil | (Single) soil organic carbon (or mineral soil C pool) | g C m$^{-2}$ | +| 7 | | microbeC | Microbial carbon (0 if microbes flag off) | g C m$^{-2}$ | +| 8 | | coarseRootC | Coarse root carbon | g C m$^{-2}$ | +| 9 | | fineRootC | Fine root carbon | g C m$^{-2}$ | +| 10 | | litter | Litter carbon (0 if litter pool disabled) | g C m$^{-2}$ | +| 11 | | soilWater | Soil water content | cm | +| 12 | $f_{\text{WHC}}$ | soilWetnessFrac | Soil water as fraction of holding capacity | unitless | +| 13 | | snow | Snow water equivalent | cm | +| 14 | | npp | Net primary production for timestep | g C m$^{-2}$ | +| 15 | | nee | Net ecosystem exchange (sign convention per code: - (NPP - RH)) | g C m$^{-2}$ | +| 16 | | cumNEE | Cumulative NEE since simulation start | g C m$^{-2}$ | +| 17 | $GPP$ | gpp | Gross primary production | g C m$^{-2}$ | +| 18 | | rAboveground | Aboveground autotrophic respiration (leaves + wood) | g C m$^{-2}$ | +| 19 | $R_H$ | rSoil | Heterotrophic respiration (maintenance + microbe terms per configuration) | g C m$^{-2}$ | +| 20 | | rRoot | Root (autotrophic) respiration | g C m$^{-2}$ | +| 21 | | ra | Total autotrophic respiration (rAboveground + rRoot) | g C m$^{-2}$ | +| 22 | | rh | Total heterotrophic respiration (litter + soil components) | g C m$^{-2}$ | +| 23 | $R$ | rtot | Total ecosystem respiration (ra + rh) | g C m$^{-2}$ | +| 24 | | evapotranspiration | ET (transpiration + immedEvap + evaporation + sublimation) for timestep | cm | +| 25 | | fluxestranspiration | Transpiration component only | cm | + +An example output file can be found in [tests/smoke/sipnet.out](https://github.com/PecanProject/sipnet/blob/master/tests/smoke/niwot/sipnet.out). + +``` +Notes: PlantWoodC, PlantLeafC, Soil and Litter in g C/m^2; Water and Snow in cm; SoilWetness is fraction of WHC; +year day time plantWoodC plantLeafC soil microbeC coarseRootC fineRootC litter litterWater soilWater soilWetnessFrac snow npp nee cumNEE gpp rAboveground rSoil rRoot ra rh rtot evapotranspiration fluxestranspiration +1998 305 0.00 5759.77 1133.88 16000.06 8.00 1919.90 1919.64 0.500 6.00 0.500 0.00 -0.32 0.74 0.74 0.00 0.164 0.578 0.159 0.324 0.419 0.742 0.00302126 0.0000 +1998 305 7.00 5759.63 1133.71 16000.08 8.00 1919.77 1919.10 0.500 5.99 0.500 0.00 -0.30 0.97 1.71 0.22 0.271 0.917 0.251 0.522 0.666 1.188 0.00240544 0.0022 +1998 305 17.00 5759.16 1133.48 16000.15 8.00 1919.57 1918.37 0.500 5.99 0.499 0.00 -0.67 1.56 3.27 0.00 0.338 1.219 0.335 0.673 0.884 1.557 0.00662149 0.0000 +``` + +## Events output + +When event handling is enabled, SIPNET will create a file named `events.out`. + +This file is designed primarily for _testing and debugging_. +It contains one row for each agronomic event that is processed. +Each row lists the year, day, event type, and parameter name/value pairs. +The name/value pairs represent the state variables that are directly changed by an event, recording the change (delta) applied to each. + +Information in `events.out` can, in principle, be reconstructed or inferred from `events.in` and `sipnet.out` though this may be confounded if simultaneous events affect the same variable. + +Still, _`sipnet.out` is the authoritative source_ for information about system state and evolution in time, including responses to events. + +Below is an example `events.out`, with header enabled for clarity. +Note the delimiters: spaces separate columns, commas separate name/value pairs, and `=` map names with their values (deltas). + +``` +year day type param_name=delta[,param_name=delta,...] +2023 65 plant envi.plantLeafC=3.00,envi.plantWoodC=4.00,envi.fineRootC=5.00,envi.coarseRootC=6.00 +2023 70 irrig envi.soilWater=5.00 +2023 200 harv env.litter=5.46,envi.plantLeafC=-5.93,envi.plantWoodC=-4.75,envi.fineRootC=-3.73,envi.coarseRootC=-3.89 +2024 65 plant envi.plantLeafC=3.00,envi.plantWoodC=5.00,envi.fineRootC=7.00,envi.coarseRootC=9.00 +2024 70 irrig fluxes.immedEvap=2.50,envi.soilWater=2.50 +2024 200 harv env.litter=4.25,envi.plantLeafC=-1.39,envi.plantWoodC=-1.63,envi.fineRootC=-2.52,envi.coarseRootC=-2.97 +``` diff --git a/docs/parameters.md b/docs/parameters.md index 7420f5cc..492cd42e 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -9,7 +9,7 @@ format: - \usepackage{amsmath} --- -# Input and Output Parameters (DRAFT) +# SIPNET Model States and Parameters Note: this is a work in progress draft. Not all parameters listed will be used in the CCMMF formulation of the model. The "Notation" section should be consistent with model equations, some of the mathematical symbols in the tables may not be. @@ -165,6 +165,16 @@ Run-time parameters can change from one run to the next, or when the model is st | +| | Symbol | Parameter Name | Definition | Units | notes | +| --- | ------------------------- | ------------------- | ---------------------------------------------- | -------- | ------------------ | +| 64 | | fineRootFrac | fraction of wood carbon allocated to fine root | | | +| 65 | | coarseRootFrac | fraction of wood carbon that is coarse root | | | +| 66 | $\alpha_\text{fine root}$ | fineRootAllocation | fraction of NPP allocated to fine roots | | | +| 67 | $\alpha_\text{wood}$ | woodAllocation | fraction of NPP allocated to wood | | | +| | 68 | fineRootExudation | fraction of GPP exuded to the soil[^exudates] | fraction | Pulsing parameters | +| 68 | | coarseRootExudation | fraction of GPP exuded to the soil[^exudates] | fraction | Pulsing parameters | + +[^exudates]: Fine and coarse root exudation are calculated as a fraction of GPP, but the exudates are subtracted from the fine and coarse root pools, respectively. ### Autotrophic respiration parameters @@ -280,99 +290,6 @@ Run-time parameters can change from one run to the next, or when the model is st --> -## Run-time Options - -Configuration settings are applied in the following order of precedence: - -1. Default values built into SIPNET -2. Values from the configuration file -3. Command-line arguments - -Thus, command-line arguments override settings in the configuration file, and configuration file settings override default values. - -### Input / Output Options - -| Option | Default | Description | -| ------------ | --------- | ------------------------------------- | -| `input-file` | sipnet.in | Name of input config file | -| `file-name` | sipnet | Prefix of climate and parameter files | - -### Output Flags - -| Option | Default | Description | -| ------------------- | ------- | -------------------------------------------------------------- | -| `do-main-output` | on | Print time series of all output variables to `.out` | -| `do-single-outputs` | off | Print outputs one variable per file (e.g. `.NEE`) | -| `dump-config` | on | Print final config to `.config` | -| `print-header` | on | Whether to print header row in output files | -| `quiet` | off | Suppress info and warning message | - -### Model Flags - -| Option | Default | Description | -| ------------- | ------- | ---------------------------------------------------------------------------------------- | -| `events` | on | Enable event handling. | -| `gdd` | on | Use growing degree days to determine leaf growth. | -| `growth-resp` | off | Explicitly model growth respiration, rather than including with maintenance respiration. | -| `leaf-water` | off | Calculate leaf pool and evaporate from that pool. | -| `litter-pool` | off | Enable litter pool in addition to single soil carbon pool. | -| `microbes` | off | Enable microbe modeling. | -| `snow` | on | Keep track of snowpack, rather than assuming all precipitation is liquid. | -| `soil-phenol` | off | Use soil temperature to determine leaf growth. | -| `water-hresp` | on | Whether soil moisture affects heterotrophic respiration. | - -Note the following restrictions on these options: - - `soil-phenol` and `gdd` may not both be turned on - -### Command Line Arguments - -Command-line arguments can be used to specify run-time options when starting SIPNET. The syntax is as follows: - -``` -sipnet [options] -``` - -Where `[options]` can include any of the run-time options listed above. -Flags use the syntax `--flag` to turn them on, or `--no-flag` to turn them off. Other options are specified by `--option value`. - -See `sipnet --help` for a full list of available command-line options. - -### Configuration File Format - -SIPNET reads a configuration file that specifies run-time options without using command-line arguments. By default, SIPNET looks for a file named `sipnet.in` in the current directory. These will be overwritten by command-line arguments if specified. - -The configuration file uses a simple key-value format, `option = value`, -with one option per line; comments follow `#`. Flags are specified as 0 for off and 1 for on. - -#### Example Configuration File - -Note that case is ignored for parameter names, as well as dashes and underscores. - -``` -# Base filename (used for derived filenames) -FILE_NAME = mysite - -# Output options -DO_MAIN_OUTPUT = 1 -DO_SINGLE_OUTPUTS = 0 -DUMP_CONFIG = 1 -PRINT_HEADER = 1 -QUIET = 0 - -# Model options -EVENTS = 1 -GDD = 1 -GROWTH_RESP = 0 -LEAF_WATER = 0 -LITTER_POOL = 0 -MICROBES = 0 -SNOW = 1 -SOIL_PHENOL = 0 -WATER_HRESP = 1 -``` - -When `DUMP_CONFIG` is on, SIPNET will output the final configuration (after applying all settings from defaults, configuration file, and command line) to a file named `.config`. - ## Hard-coded Values | Parameter | Value | Description | @@ -389,280 +306,6 @@ When `DUMP_CONFIG` is on, SIPNET will output the final configuration (after appl | `GAMMA` | 66 | psychometric constant (Pa/K) | | `E_STAR_SNOW` | 0.6 | approximate saturation vapor pressure at 0°C (kPa) | -## Input Files - -### Run Settings - -See [Run-time Options](#run-time-options) above. - -Multi-site runs, sensitivity tests, and Monte Carlo runs are no longer supported. Typically these analyses are handled -using the [PEcAn Framework](https://pecanproject.org/). - -### Parameters and Initial Conditions - -Both initial conditions and parameters are specified in a file named `sipnet.param`. - -The SIPNET parameter file (`sipnet.param`) specifies model parameters and their properties for each simulation. -Each line in the file corresponds to a single parameter and contains five or six space-separated values. - -| Column | Description | -| -------------- | ------------------------------------------ | -| Parameter Name | Name of the parameter | -| Value | Value of the parameter to use in the model | - -#### Example `sipnet.param` file - -Column names are not used, but are: - -``` -param_name value -``` - -The first lines in `sipnet.param` could be: - -``` -plantWoodInit 110 -laiInit 0 -litterInit 200 -soilInit 7000 -litterWFracInit 0.5 -soilWFracInit 0.6 -snowInit 1 -microbeInit 0.5 -fineRootFrac 0.2 -coarseRootFrac 0.2 -aMax 95 -aMaxFrac 0.85 -... -``` - - -### Climate - -For each step of the model, the following inputs are needed. These are provided in a file named `.clim` with the following columns: - -| col | parameter | description | units | notes | -| --- | --------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- | -| 1 | year | year of start of this timestep | | integer, e.g. 2010 | -| 2 | day | day of start of this timestep | Day of year | 1 = Jan 1 | -| 3 | time | time of start of this timestep | hours after midnight | e.g. noon = 12.0, midnight = 0.0, can be a fraction | -| 4 | length | length of this timestep | days | variable-length timesteps allowed, typically not used | -| 5 | tair | avg. air temp for this time step | degrees Celsius | | -| 6 | tsoil | average soil temperature for this time step | degrees Celsius | can be estimated from Tair | -| 7 | par | average photosynthetically active radiation (PAR) for this time step | $\text{Einsteins} \cdot m^{-2} \text{ground area} \cdot \text{time step}^{-1}$ | input is in Einsteins \* m^-2 ground area, summed over entire time step | -| 8 | precip | total precip. for this time step | cm | input is in mm; water equivilant - either rain or snow | -| 9 | vpd | average vapor pressure deficit | kPa | input is in Pa, can be calculated from air temperature and relative humidity. | -| 10 | vpdSoil | average vapor pressure deficit between soil and air | kPa | input is in Pa ; differs from vpd in that saturation vapor pressure is calculated using Tsoil rather than Tair | -| 11 | vPress | average vapor pressure in canopy airspace | kPa | input is in Pa | -| 12 | wspd | avg. wind speed | m/s | | - -Note: An older format for this file included location as the first column and soilWetness as the last column. Files with this older format can still be read by sipnet: -* SIPNET will print a warning indicating that it is ignoring the obsolete columns -* If there is more than one location specified in the file, SIPNET will error and halt - -#### Example `sipnet.clim` file: - -Column names are not used, but are: - -``` -loc year day time length tair tsoil par precip vpd vpdSoil vPress wspd -``` - -**Half-hour time step** - -``` -0 1998 305 0.00 -1800 1.9000 1.2719 0.0000 0.0000 109.5364 77.5454 726.6196 1.6300 -0 1998 305 0.50 -1800 1.9000 1.1832 0.0000 0.0000 109.5364 73.1254 726.6196 1.6300 -0 1998 305 1.00 -1800 2.0300 1.1171 0.0000 0.0000 110.4243 63.9567 732.5092 0.6800 -0 1998 305 1.50 -1800 2.0300 1.0439 0.0000 0.0000 110.4243 60.3450 732.5092 0.6800 -``` - -**Variable time step** - -``` -0 1998 305 0.00 0.292 1.5 0.8 0.0000 0.0000 105.8 70.1 711.6 0.9200 -0 1998 305 7.00 0.417 3.6 1.8 5.6016 0.0000 125.7 23.5 809.4 1.1270 -0 1998 305 17.00 0.583 1.9 1.3 0.0000 0.0000 108.1 75.9 732.7 1.1350 -0 1998 306 7.00 0.417 2.2 1.4 2.7104 1.0000 114.1 71.6 741.8 0.9690 -``` - -### Agronomic Events - -Agronomic (management) events are read from an `events.in` file. This file specifies one event per line: - -| col | parameter | description | units | notes | -| --- | ----------- | ------------------------------------ | ------ | ------------------------------------------------ | -| 1 | year | Year of the event | | e.g. 2025 | -| 2 | day | Day of year of the event | DOY | 1 = Jan 1 | -| 3 | event_type | Event type code | | one of: `plant`, `harv`, `till`, `fert`, `irrig` | -| 4…n | event_param | Type‑specific parameters (see below) | varies | Order depends on event type | - -Rules: - -- File must be in chronological order. Ties (same day multiple events) are allowed and processed in file order. -- Events are specified at day resolution (no sub‑daily timestamp). -- Every (year, day) appearing in `events.in` must have at least one corresponding climate record; otherwise SIPNET errors. -- Values in `events.in` are instantaneous amounts (cm or mass/area) applied on the date and time of the first climate record matching that event's year and day. - -See subsections below for details and parameter definitions for each event type. - -#### Irrigation - -| parameter | col | req? | description | -| --------- | :---: | :---: | ------------------------------------------- | -| amount | 5 | Y | Amount added (cm) | -| method | 6 | Y | 0=canopy
1=soil
2=flood (placeholder) | - -Model representation: An irrigation event increases soil moisture. A fraction of canopy irrigation is immediately evaporated. - -Specifically: - -- For `method=soil`, this amount of water is added directly to the `soilWater` state variable -- For `method=canopy`, a fraction of the irrigation water (determined by input param `immedEvapFrac`) is added to the flux state variable `immedEvap`, with the remainder going to `soilWater`. -- Initial implementation assumes that LITTER_WATER is not on. This might be revisited at a later date. - - -#### Fertilization - -| parameter | col | req? | description | -| --------- | :---: | :---: | ----------- | -| org-N | 5 | Y | g N / m2 | -| org-C | 6 | Y | g C / m2 | -| min-N | 7 | Y | g N / m2 | - - - - Model representation: increases size of mineral N and litter C and N. Urea-N is assumed to be mineral N. - - - The code that generates `events.in` will handle conversion from fertilizer amount and type to mass of N and C allocated to different pools. In PEcAn this is done by the `PEcAn.SIPNET::write.configs.SIPNET()` function. - -#### Tillage - -| parameter | col | req? | description | -| -------------------------------- | :---: | :---: | ------------------- | -| tillageEff $(f_{\textrm{till}})$ | 5 | Y | Adjustment to $R_H$ | - -- Model representation: - - Transient increase in decomposition rate by $f_{\text{,tillage}}$ that exponentially decays over time. - - Multiple tillage events are additive. - -#### Planting - -| parameter | col | req? | description | -| ------------- | :---: | :---: | -------------------------------------------- | -| leaf-C | 5 | Y | C added to leaf pool (g C / m2) | -| wood-C | 6 | Y | C added to above-ground wood pool (g C / m2) | -| fine-root-C | 7 | Y | C added to fine root pool (g C / m2) | -| coarse-root-C | 8 | Y | C added to coarse root pool (g C / m2) | - -- Model representation: - - Date of event is the date of emergence, not the date of actual planting - - Increases size of carbon pools by the amount of each respective parameter - - $N$ pools are calculated from $CN$ stoichiometric ratios. -- notes: PFT (crop type) is not an input parameter for a planting event because SIPNET only represents a single PFT. - -#### Harvest - -| parameter | col | req? | description | -| ---------------------------------------------------------- | :---: | :---: | --------------------- | -| fraction of aboveground biomass removed | 5 | Y | | -| fraction of belowground biomass removed | 6 | N | default = 0 | -| fraction of aboveground biomass transferred to litter pool | 7 | N | default = 1 - removed | -| fraction of belowground biomass transferred to litter pool | 8 | N | default = 1 - removed | - -- model representation: - - biomass C and N pools are either removed or added to litter - - for annuals or plants terminated, no biomass remains (col 5 + col 7 = 1 and col 6 + col 8 = 1). - - for perennials, some biomass may remain (col 5 + col 7 <= 1 and col 6 + col 8 <= 1; remainder is living). - - root biomass is only removed for root crops - -#### Example of `events.in` file: - -``` -2022 35 till 0.2 # tilled on day 35, f_till = 0.2 (20% boost to rate term) -2022 40 till 0.1 # tilled on day 40, adds 0.1 to f_till -2022 40 irrig 5 1 # 5cm canopy irrigation on day 40 applied to soil -2022 40 fert 0 0 10 # fertilized with 10 g / m2 N_min on day 40 of 2022 -2022 50 plant 10 3 2 5 # plant emergence on day 50 with 10/3/2/4 g C / m2, respectively, added to the leaf/wood/fine root/coarse root pools -2022 250 harv 0.1 # harvest 10% of aboveground plant biomass on day 250 -``` - -## Outputs - -### Model Outputs - -The `sipnet.out` file contains a time series of state variables and fluxes from the simulation. - -| # | Symbol | Output Name | Definition / Notes | Units | -| --- | ---------------- | ------------------- | ------------------------------------------------------------------------- | ------------ | -| 1 | | year | Year of start of timestep | (integer) | -| 2 | | day | Day-of-year of start of timestep | (integer) | -| 3 | | time | Hour-of-day (fractional) at start of timestep | hours | -| 4 | | plantWoodC | Woody plant carbon | g C m$^{-2}$ | -| 5 | | plantLeafC | Leaf carbon | g C m$^{-2}$ | -| 6 | | soil | (Single) soil organic carbon (or mineral soil C pool) | g C m$^{-2}$ | -| 7 | | microbeC | Microbial carbon (0 if microbes flag off) | g C m$^{-2}$ | -| 8 | | coarseRootC | Coarse root carbon | g C m$^{-2}$ | -| 9 | | fineRootC | Fine root carbon | g C m$^{-2}$ | -| 10 | | litter | Litter carbon (0 if litter pool disabled) | g C m$^{-2}$ | -| 11 | | soilWater | Soil water content | cm | -| 12 | $f_{\text{WHC}}$ | soilWetnessFrac | Soil water as fraction of holding capacity | unitless | -| 13 | | snow | Snow water equivalent | cm | -| 14 | | npp | Net primary production for timestep | g C m$^{-2}$ | -| 15 | | nee | Net ecosystem exchange (sign convention per code: - (NPP - RH)) | g C m$^{-2}$ | -| 16 | | cumNEE | Cumulative NEE since simulation start | g C m$^{-2}$ | -| 17 | $GPP$ | gpp | Gross primary production | g C m$^{-2}$ | -| 18 | | rAboveground | Aboveground autotrophic respiration (leaves + wood) | g C m$^{-2}$ | -| 19 | $R_H$ | rSoil | Heterotrophic respiration (maintenance + microbe terms per configuration) | g C m$^{-2}$ | -| 20 | | rRoot | Root (autotrophic) respiration | g C m$^{-2}$ | -| 21 | | ra | Total autotrophic respiration (rAboveground + rRoot) | g C m$^{-2}$ | -| 22 | | rh | Total heterotrophic respiration (litter + soil components) | g C m$^{-2}$ | -| 23 | $R$ | rtot | Total ecosystem respiration (ra + rh) | g C m$^{-2}$ | -| 24 | | evapotranspiration | ET (transpiration + immedEvap + evaporation + sublimation) for timestep | cm | -| 25 | | fluxestranspiration | Transpiration component only | cm | - -An example output file can be found in [tests/smoke/sipnet.out](https://github.com/PecanProject/sipnet/blob/master/tests/smoke/niwot/sipnet.out). - -``` -Notes: PlantWoodC, PlantLeafC, Soil and Litter in g C/m^2; Water and Snow in cm; SoilWetness is fraction of WHC; -year day time plantWoodC plantLeafC soil microbeC coarseRootC fineRootC litter litterWater soilWater soilWetnessFrac snow npp nee cumNEE gpp rAboveground rSoil rRoot ra rh rtot evapotranspiration fluxestranspiration -1998 305 0.00 5759.77 1133.88 16000.06 8.00 1919.90 1919.64 0.500 6.00 0.500 0.00 -0.32 0.74 0.74 0.00 0.164 0.578 0.159 0.324 0.419 0.742 0.00302126 0.0000 -1998 305 7.00 5759.63 1133.71 16000.08 8.00 1919.77 1919.10 0.500 5.99 0.500 0.00 -0.30 0.97 1.71 0.22 0.271 0.917 0.251 0.522 0.666 1.188 0.00240544 0.0022 -1998 305 17.00 5759.16 1133.48 16000.15 8.00 1919.57 1918.37 0.500 5.99 0.499 0.00 -0.67 1.56 3.27 0.00 0.338 1.219 0.335 0.673 0.884 1.557 0.00662149 0.0000 -``` - -### Events output - -When event handling is enabled, SIPNET will create a file named `events.out`. - -This file is designed primarily for _testing and debugging_. -It contains one row for each agronomic event that is processed. -Each row lists the year, day, event type, and parameter name/value pairs. -The name/value pairs represent the state variables that are directly changed by an event, recording the change (delta) applied to each. - -Information in `events.out` can, in principle, be reconstructed or inferred from `events.in` and `sipnet.out` though this may be confounded if simultaneous events affect the same variable. - -Still, _`sipnet.out` is the authoritative source_ for information about system state and evolution in time, including responses to events. - -Below is an example `events.out`, with header enabled for clarity. -Note the delimiters: spaces separate columns, commas separate name/value pairs, and `=` map names with their values (deltas). - -``` -year day type param_name=delta[,param_name=delta,...] -2023 65 plant envi.plantLeafC=3.00,envi.plantWoodC=4.00,envi.fineRootC=5.00,envi.coarseRootC=6.00 -2023 70 irrig envi.soilWater=5.00 -2023 200 harv env.litter=5.46,envi.plantLeafC=-5.93,envi.plantWoodC=-4.75,envi.fineRootC=-3.73,envi.coarseRootC=-3.89 -2024 65 plant envi.plantLeafC=3.00,envi.plantWoodC=5.00,envi.fineRootC=7.00,envi.coarseRootC=9.00 -2024 70 irrig fluxes.immedEvap=2.50,envi.soilWater=2.50 -2024 200 harv env.litter=4.25,envi.plantLeafC=-1.39,envi.plantWoodC=-1.63,envi.fineRootC=-2.52,envi.coarseRootC=-2.97 -``` - @@ -182,15 +182,15 @@ Run-time parameters can change from one run to the next, or when the model is st ### Soil respiration parameters -| | Symbol | Parameter Name | Definition | Units | notes | -| --- | ----------------- | ------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------- | ----------------------------------------------------- | -| 30 | $K_\text{litter}$ | litterBreakdownRate | rate at which litter is converted to soil / respired at 0°C and max soil moisture | g C broken down \* g^-1 litter C \* day^-1 | read in as per-year rate | -| 31 | | fracLitterRespired | of the litter broken down, fraction respired (the rest is transferred to soil pool) | | | -| 32 | $K_{dec}$ | baseSoilResp | Soil respiration rate at $0 ^{\circ}\text{C}$ and moisture saturated soil | g C respired \* g$^{-1}$ soil C \* day$^{-1}$ | read in as per-year rate | -| 34 | $Q_{10s}$ | soilRespQ10 | Soil respiration Q10 | | scalar determining effect of temp on soil respiration | -| 39 | | soilRespMoistEffect | scalar determining effect of moisture on soil resp. | | | -| | | baseMicrobeResp | | | | -| new | $f_{\textrm{till}}$ | tillageEff | Effect of tillage on decomposition that exponentially decays over time | fraction | Per‑event in `events.in`; 0 = no effect | +| | Symbol | Parameter Name | Definition | Units | notes | +| --- | ------------------- | ------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------- | ----------------------------------------------------- | +| 30 | $K_\text{litter}$ | litterBreakdownRate | rate at which litter is converted to soil / respired at 0°C and max soil moisture | g C broken down \* g^-1 litter C \* day^-1 | read in as per-year rate | +| 31 | | fracLitterRespired | of the litter broken down, fraction respired (the rest is transferred to soil pool) | | | +| 32 | $K_{dec}$ | baseSoilResp | Soil respiration rate at $0 ^{\circ}\text{C}$ and moisture saturated soil | g C respired \* g$^{-1}$ soil C \* day$^{-1}$ | read in as per-year rate | +| 34 | $Q_{10s}$ | soilRespQ10 | Soil respiration Q10 | | scalar determining effect of temp on soil respiration | +| 39 | | soilRespMoistEffect | scalar determining effect of moisture on soil resp. | | | +| | | baseMicrobeResp | | | | +| new | $f_{\textrm{till}}$ | tillageEff | Effect of tillage on decomposition that exponentially decays over time | fraction | Per‑event in `events.in`; 0 = no effect | - $R_{dec}$: Rate of decomposition $(\text{day}^{-1})$ - $Q_{10dec}$: Temperature coefficient for $R_{dec}$ (unitless) @@ -299,7 +299,7 @@ Run-time parameters can change from one run to the next, or when the model is st ### Run Settings -See [Run-time Options](#run-time-options) above. +See [Run-time Parameters](#run-time-parameters) above. Multi-site runs, sensitivity tests, and Monte Carlo runs are no longer supported. Typically these analyses are handled using the [PEcAn Framework](https://pecanproject.org/). diff --git a/docs/model-inputs.md b/docs/user-guide/model-inputs.md similarity index 100% rename from docs/model-inputs.md rename to docs/user-guide/model-inputs.md diff --git a/docs/model-outputs.md b/docs/user-guide/model-outputs.md similarity index 100% rename from docs/model-outputs.md rename to docs/user-guide/model-outputs.md diff --git a/mkdocs.yml b/mkdocs.yml index 09962018..d9355d3a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -13,6 +13,7 @@ nav: - Code Structure: developer-guide/code-structure.md - Adding New Command Line Options: developer-guide/cli-options.md - Logging: developer-guide/logging.md + - Testing: developer-guide/testing.md - Contributing: CONTRIBUTING.md - API Reference: api/index.html - Changelog: CHANGELOG.md @@ -50,3 +51,8 @@ extra: repo_url: https://github.com/PecanProject/sipnet edit_uri: edit/master/docs/ + +# Use relative URLs so previews under subpaths work +use_directory_urls: true +# Avoid absolute site_url; let MkDocs generate relative asset paths +site_url: "" diff --git a/tools/run_unit_tests.sh b/tools/run_unit_tests.sh index 39341b8e..6af3ec60 100755 --- a/tools/run_unit_tests.sh +++ b/tools/run_unit_tests.sh @@ -15,8 +15,8 @@ YELLOW="\033[1;33m" RESET="\033[0m" # Step 1: Build everything first -echo "Running make test..." -if ! make test; then +echo "Running make testbuild..." +if ! make testbuild; then echo -e "${RED}Build failed, exiting.${RESET}" exit 1 fi