double massbal_getLoadingError() // // Input: none // Output: none // Purpose: computes runoff load mass balance error. // { int j; double loadIn; double loadOut; double maxError = 0.0; for (j = 0; j < Nobjects[POLLUT]; j++) { // --- get final pollutant loading remaining on land surface LoadingTotals[j].finalLoad += massbal_getBuildup(j); // --- compute total load added to study area loadIn = LoadingTotals[j].initLoad + LoadingTotals[j].buildup + LoadingTotals[j].deposition; // --- compute total load removed from study area loadOut = LoadingTotals[j].sweeping + LoadingTotals[j].infil + LoadingTotals[j].bmpRemoval + LoadingTotals[j].runoff + LoadingTotals[j].finalLoad; // --- compute mass balance error LoadingTotals[j].pctError = 0.0; if ( fabs(loadIn - loadOut) < 0.001 ) { LoadingTotals[j].pctError = TINY; } else if ( loadIn > 0.0 ) { LoadingTotals[j].pctError = 100.0 * (1.0 - loadOut / loadIn); } else if ( loadOut > 0.0 ) { LoadingTotals[j].pctError = 100.0 * (loadIn / loadOut - 1.0); } maxError = MAX(maxError, LoadingTotals[j].pctError); // --- report total counts as log10 if ( Pollut[j].units == COUNT ) { LoadingTotals[j].initLoad = LOG10(LoadingTotals[j].initLoad); LoadingTotals[j].buildup = LOG10(LoadingTotals[j].buildup); LoadingTotals[j].deposition = LOG10(LoadingTotals[j].deposition); LoadingTotals[j].sweeping = LOG10(LoadingTotals[j].sweeping); LoadingTotals[j].infil = LOG10(LoadingTotals[j].infil); LoadingTotals[j].bmpRemoval = LOG10(LoadingTotals[j].bmpRemoval); LoadingTotals[j].runoff = LOG10(LoadingTotals[j].runoff); LoadingTotals[j].finalLoad = LOG10(LoadingTotals[j].finalLoad); } } return maxError; }
int massbal_open() // // Input: none // Output: returns error code // Purpose: opens and initializes mass balance continuity checking. // { int j, n; // --- initialize global continuity errors RunoffError = 0.0; GwaterError = 0.0; FlowError = 0.0; QualError = 0.0; // --- initialize runoff totals RunoffTotals.rainfall = 0.0; RunoffTotals.evap = 0.0; RunoffTotals.infil = 0.0; RunoffTotals.runoff = 0.0; RunoffTotals.runon = 0.0; //(5.1.008) RunoffTotals.drains = 0.0; //(5.1.008) RunoffTotals.snowRemoved = 0.0; RunoffTotals.initStorage = 0.0; RunoffTotals.initSnowCover = 0.0; TotalArea = 0.0; for (j = 0; j < Nobjects[SUBCATCH]; j++) { RunoffTotals.initStorage += subcatch_getStorage(j); RunoffTotals.initSnowCover += snow_getSnowCover(j); TotalArea += Subcatch[j].area; } // --- initialize groundwater totals GwaterTotals.infil = 0.0; GwaterTotals.upperEvap = 0.0; GwaterTotals.lowerEvap = 0.0; GwaterTotals.lowerPerc = 0.0; GwaterTotals.gwater = 0.0; GwaterTotals.initStorage = 0.0; GwaterTotals.finalStorage = 0.0; for ( j = 0; j < Nobjects[SUBCATCH]; j++ ) { GwaterTotals.initStorage += gwater_getVolume(j) * Subcatch[j].area; } // --- initialize node flow & storage totals FlowTotals.dwInflow = 0.0; FlowTotals.wwInflow = 0.0; FlowTotals.gwInflow = 0.0; FlowTotals.iiInflow = 0.0; FlowTotals.exInflow = 0.0; FlowTotals.flooding = 0.0; FlowTotals.outflow = 0.0; FlowTotals.evapLoss = 0.0; FlowTotals.seepLoss = 0.0; FlowTotals.reacted = 0.0; FlowTotals.initStorage = 0.0; for (j = 0; j < Nobjects[NODE]; j++) FlowTotals.initStorage += Node[j].newVolume; for (j = 0; j < Nobjects[LINK]; j++) FlowTotals.initStorage += Link[j].newVolume; StepFlowTotals = FlowTotals; // --- add contribution of minimum surface area (i.e., manhole area) // to initial storage under dynamic wave routing if ( RouteModel == DW ) { for (j = 0; j < Nobjects[NODE]; j++) { if ( Node[j].type != STORAGE && Node[j].initDepth <= Node[j].crownElev - Node[j].invertElev ) //(5.1.007) FlowTotals.initStorage += Node[j].initDepth * MinSurfArea; } } // --- initialize arrays to null LoadingTotals = NULL; QualTotals = NULL; StepQualTotals = NULL; NodeInflow = NULL; NodeOutflow = NULL; // --- allocate memory for WQ washoff continuity totals n = Nobjects[POLLUT]; if ( n > 0 ) { LoadingTotals = (TLoadingTotals *) calloc(n, sizeof(TLoadingTotals)); if ( LoadingTotals == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } for (j = 0; j < n; j++) { LoadingTotals[j].initLoad = massbal_getBuildup(j); LoadingTotals[j].buildup = 0.0; LoadingTotals[j].deposition = 0.0; LoadingTotals[j].sweeping = 0.0; LoadingTotals[j].infil = 0.0; LoadingTotals[j].bmpRemoval = 0.0; LoadingTotals[j].runoff = 0.0; LoadingTotals[j].finalLoad = 0.0; } } // --- allocate memory for nodal WQ continuity totals if ( n > 0 ) { QualTotals = (TRoutingTotals *) calloc(n, sizeof(TRoutingTotals)); StepQualTotals = (TRoutingTotals *) calloc(n, sizeof(TRoutingTotals)); if ( QualTotals == NULL || StepQualTotals == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } } // --- initialize WQ totals for (j = 0; j < n; j++) { QualTotals[j].dwInflow = 0.0; QualTotals[j].wwInflow = 0.0; QualTotals[j].gwInflow = 0.0; QualTotals[j].exInflow = 0.0; QualTotals[j].flooding = 0.0; QualTotals[j].outflow = 0.0; QualTotals[j].evapLoss = 0.0; QualTotals[j].seepLoss = 0.0; QualTotals[j].reacted = 0.0; QualTotals[j].initStorage = massbal_getStoredMass(j); } // --- initialize totals used over a single time step massbal_initTimeStepTotals(); // --- allocate memory for nodal flow continuity if ( Nobjects[NODE] > 0 ) { NodeInflow = (double *) calloc(Nobjects[NODE], sizeof(double)); if ( NodeInflow == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } NodeOutflow = (double *) calloc(Nobjects[NODE], sizeof(double)); if ( NodeOutflow == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } for (j = 0; j < Nobjects[NODE]; j++) NodeInflow[j] = Node[j].newVolume; } return ErrorCode; }
int massbal_open() // // Input: none // Output: returns error code // Purpose: opens and initializes mass balance continuity checking. // { int j, n; // --- initialize global continuity errors RunoffError = 0.0; GwaterError = 0.0; FlowError = 0.0; QualError = 0.0; // --- initialize runoff totals RunoffTotals.rainfall = 0.0; RunoffTotals.evap = 0.0; RunoffTotals.infil = 0.0; RunoffTotals.runoff = 0.0; RunoffTotals.snowRemoved = 0.0; RunoffTotals.initStorage = 0.0; RunoffTotals.initSnowCover = 0.0; TotalArea = 0.0; for (j = 0; j < Nobjects[SUBCATCH]; j++) { RunoffTotals.initSnowCover += snow_getSnowCover(j); TotalArea += Subcatch[j].area; } // --- initialize groundwater totals GwaterTotals.infil = 0.0; GwaterTotals.upperEvap = 0.0; GwaterTotals.lowerEvap = 0.0; GwaterTotals.lowerPerc = 0.0; GwaterTotals.gwater = 0.0; GwaterTotals.initStorage = 0.0; GwaterTotals.finalStorage = 0.0; for ( j = 0; j < Nobjects[SUBCATCH]; j++ ) { GwaterTotals.initStorage += gwater_getVolume(j) * Subcatch[j].area; } // --- initialize node flow & storage totals FlowTotals.dwInflow = 0.0; FlowTotals.wwInflow = 0.0; FlowTotals.gwInflow = 0.0; FlowTotals.iiInflow = 0.0; FlowTotals.exInflow = 0.0; FlowTotals.floodingNumNodes = 0.0; FlowTotals.outflow = 0.0; FlowTotals.pumpedVol = 0.0; FlowTotals.initStorage = 0.0; for (j = 0; j < Nobjects[NODE]; j++) FlowTotals.initStorage += Node[j].newVolume; for (j = 0; j < Nobjects[LINK]; j++) FlowTotals.initStorage += Link[j].newVolume; StepFlowTotals = FlowTotals; // --- initialize arrays to null LoadingTotals = NULL; QualTotals = NULL; StepQualTotals = NULL; NodeInflow = NULL; NodeOutflow = NULL; // --- allocate memory for WQ washoff continuity totals n = Nobjects[POLLUT]; if ( n > 0 ) { LoadingTotals = (TLoadingTotals *) calloc(n, sizeof(TLoadingTotals)); if ( LoadingTotals == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } for (j = 0; j < n; j++) { LoadingTotals[j].initLoad = massbal_getBuildup(j); LoadingTotals[j].buildup = 0.0; LoadingTotals[j].deposition = 0.0; LoadingTotals[j].sweeping = 0.0; LoadingTotals[j].infil = 0.0; LoadingTotals[j].bmpRemoval = 0.0; LoadingTotals[j].runoff = 0.0; LoadingTotals[j].finalLoad = 0.0; } } // --- allocate memory for nodal WQ continuity totals if ( n > 0 ) { QualTotals = (TRoutingTotals *) calloc(n, sizeof(TRoutingTotals)); StepQualTotals = (TRoutingTotals *) calloc(n, sizeof(TRoutingTotals)); if ( QualTotals == NULL || StepQualTotals == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } } // --- initialize WQ totals for (j = 0; j < n; j++) { QualTotals[j].dwInflow = 0.0; QualTotals[j].wwInflow = 0.0; QualTotals[j].gwInflow = 0.0; QualTotals[j].exInflow = 0.0; QualTotals[j].floodingNumNodes = 0.0; QualTotals[j].outflow = 0.0; QualTotals[j].pumpedVol = 0.0; QualTotals[j].initStorage = 0.0; } // --- initialize totals used over a single time step massbal_initTimeStepTotals(); // --- allocate memory for nodal flow continuity if ( Nobjects[NODE] > 0 ) { NodeInflow = (double *) calloc(Nobjects[NODE], sizeof(double)); if ( NodeInflow == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } NodeOutflow = (double *) calloc(Nobjects[NODE], sizeof(double)); if ( NodeOutflow == NULL ) { report_writeErrorMsg(ERR_MEMORY, ""); return ErrorCode; } for (j = 0; j < Nobjects[NODE]; j++) NodeInflow[j] = Node[j].newVolume; } return ErrorCode; }