double getVariableValue(int varCode) // // Input: varCode = code number of process variable or pollutant // Output: returns current value of variable // Purpose: finds current value of a process variable or pollutant concen., // making reference to the node being evaluated which is stored in // shared variable J. // { int p; double a1, a2, y; // --- variable is a process variable if ( varCode < PVMAX ) { switch ( varCode ) { case pvHRT: // HRT in hours if ( Node[J].type == STORAGE ) { return Storage[Node[J].subIndex].hrt / 3600.0; } else return 0.0; case pvDT: return Dt; // time step in seconds case pvFLOW: return Q * UCF(FLOW); // flow in user's units case pvDEPTH: y = (Node[J].oldDepth + Node[J].newDepth) / 2.0; return y * UCF(LENGTH); // depth in ft or m case pvAREA: a1 = node_getSurfArea(J, Node[J].oldDepth); a2 = node_getSurfArea(J, Node[J].newDepth); return (a1 + a2) / 2.0 * UCF(LENGTH) * UCF(LENGTH); default: return 0.0; } } // --- variable is a pollutant concentration else if ( varCode < PVMAX + Nobjects[POLLUT] ) { p = varCode - PVMAX; if ( Treatment->treatType == REMOVAL ) return Cin[p]; return Node[J].newQual[p]; } // --- variable is a pollutant removal else { p = varCode - PVMAX - Nobjects[POLLUT]; if ( p >= Nobjects[POLLUT] ) return 0.0; return getRemoval(p); } }
double node_getPondedArea(int j, double d) // // Input: j = node index // d = water depth (ft) // Output: returns surface area of water at a node (ft2) // Purpose: computes surface area of water at a node based on depth. // { double a; // --- use regular getSurfArea function if node not flooded if ( d <= Node[j].fullDepth || Node[j].pondedArea == 0.0 ) { return node_getSurfArea(j, d); } // --- compute ponded depth d = d - Node[j].fullDepth; // --- use ponded area for flooded node a = Node[j].pondedArea; if ( a <= 0.0 ) a = node_getSurfArea(j, Node[j].fullDepth); return a; }
void initNodeStates() // // Input: none // Output: none // Purpose: initializes node's surface area, inflow & outflow // { int i; for (i = 0; i < Nobjects[NODE]; i++) { // --- initialize nodal surface area if ( AllowPonding ) { Xnode[i].newSurfArea = node_getPondedArea(i, Node[i].newDepth); } else { Xnode[i].newSurfArea = node_getSurfArea(i, Node[i].newDepth); } if ( Xnode[i].newSurfArea < MinSurfArea ) { Xnode[i].newSurfArea = MinSurfArea; } //// Following code section modified for release 5.1.007 //// //(5.1.007) // --- initialize nodal inflow & outflow Node[i].inflow = 0.0; Node[i].outflow = Node[i].losses; if ( Node[i].newLatFlow >= 0.0 ) { Node[i].inflow += Node[i].newLatFlow; } else { Node[i].outflow -= Node[i].newLatFlow; } Xnode[i].sumdqdh = 0.0; } }