void addDryWeatherInflows(DateTime currentDate) // // Input: currentDate = current date/time // Output: none // Purpose: adds dry weather inflows to nodes at current date. // { int j, p; int month, day, hour; double q, w; TDwfInflow* inflow; // --- get month (zero-based), day-of-week (zero-based), // & hour-of-day for routing date/time month = datetime_monthOfYear(currentDate) - 1; day = datetime_dayOfWeek(currentDate) - 1; hour = datetime_hourOfDay(currentDate); // --- for each node with a defined dry weather inflow for (j = 0; j < Nobjects[NODE]; j++) { inflow = Node[j].dwfInflow; if ( !inflow ) continue; // --- get flow inflow (i.e., the inflow whose param code is -1) q = 0.0; while ( inflow ) { if ( inflow->param < 0 ) { q = inflow_getDwfInflow(inflow, month, day, hour); break; } inflow = inflow->next; } if ( fabs(q) < FLOW_TOL ) q = 0.0; // --- add flow inflow to node's lateral inflow Node[j].newLatFlow += q; massbal_addInflowFlow(DRY_WEATHER_INFLOW, q); // --- get pollutant mass inflows inflow = Node[j].dwfInflow; while ( inflow ) { if ( inflow->param >= 0 ) { p = inflow->param; w = q * inflow_getDwfInflow(inflow, month, day, hour); Node[j].newQual[p] += w; massbal_addInflowQual(DRY_WEATHER_INFLOW, p, w); } inflow = inflow->next; } } }
int evaluatePremise(struct TPremise* p, DateTime theDate, DateTime theTime, DateTime elapsedTime, double tStep) // // Input: p = a control rule premise condition // theDate = the current simulation date // theTime = the current simulation time of day // elpasedTime = decimal days since the start of the simulation // tStep = current time step (days) //(5.0.013 - LR) // Output: returns TRUE if the condition is true or FALSE otherwise // Purpose: evaluates the truth of a control rule premise condition. // { int i = p->node; int j = p->link; double head; switch ( p->attribute ) { case r_TIME: return checkTimeValue(p, elapsedTime, elapsedTime + tStep); case r_DATE: return checkValue(p, theDate); case r_CLOCKTIME: return checkTimeValue(p, theTime, theTime + tStep); case r_DAY: //(5.0.014 - LR) return checkValue(p, datetime_dayOfWeek(theDate)); //(5.0.014 - LR) case r_MONTH: //(5.0.014 - LR) return checkValue(p, datetime_monthOfYear(theDate)); //(5.0.014 - LR) case r_STATUS: if ( j < 0 || Link[j].type != PUMP ) return FALSE; else return checkValue(p, Link[j].setting); case r_SETTING: if ( j < 0 || (Link[j].type != ORIFICE && Link[j].type != WEIR) ) return FALSE; else return checkValue(p, Link[j].setting); case r_FLOW: if ( j < 0 ) return FALSE; else return checkValue(p, Link[j].direction*Link[j].newFlow*UCF(FLOW));//(5.0.019 - LR) case r_DEPTH: if ( j >= 0 ) return checkValue(p, Link[j].newDepth*UCF(LENGTH)); else if ( i >= 0 ) return checkValue(p, Node[i].newDepth*UCF(LENGTH)); else return FALSE; case r_HEAD: if ( i < 0 ) return FALSE; head = (Node[i].newDepth + Node[i].invertElev) * UCF(LENGTH); return checkValue(p, head); case r_INFLOW: if ( i < 0 ) return FALSE; else return checkValue(p, Node[i].newLatFlow*UCF(FLOW)); default: return FALSE; } }