void exfil_initState(int k) // // Input: k = storage unit index // Output: none // Purpose: initializes the state of a storage unit's exfiltration object. // { int i; double a, alast, d; TTable* aCurve; TExfil* exfil = Storage[k].exfil; // --- initialize exfiltration object if ( exfil != NULL ) { // --- initialize the Green-Ampt infil. parameters grnampt_initState(exfil->btmExfil); grnampt_initState(exfil->bankExfil); // --- shape given by a Storage Curve i = Storage[k].aCurve; if ( i >= 0 ) { // --- get bottom area aCurve = &Curve[i]; Storage[k].exfil->btmArea = table_lookupEx(aCurve, 0.0); // --- find min/max bank depths and max. bank area table_getFirstEntry(aCurve, &d, &a); exfil->bankMinDepth = 0.0; exfil->bankMaxDepth = 0.0; exfil->bankMaxArea = 0.0; alast = a; while ( table_getNextEntry(aCurve, &d, &a) ) { if ( a < alast ) break; else if ( a > alast ) { exfil->bankMaxArea = a; exfil->bankMaxDepth = d; } else if ( exfil->bankMaxArea == 0.0 ) exfil->bankMinDepth = d; else break; alast = a; } } // --- functional storage shape curve else { exfil->btmArea = Storage[k].aConst; if ( Storage[k].aExpon == 0.0 ) exfil->btmArea +=Storage[k].aCoeff; exfil->bankMinDepth = 0.0; exfil->bankMaxDepth = BIG; exfil->bankMaxArea = BIG; } } }
double storage_getSurfArea(int j, double d) // // Input: j = node index // d = depth (ft) // Output: returns surface area (ft2) // Purpose: computes a storage node's surface area from its water depth. // { double area; int k = Node[j].subIndex; int i = Storage[k].aCurve; if ( i >= 0 ) area = table_lookupEx(&Curve[i], d*UCF(LENGTH)); else { if ( Storage[k].aExpon == 0.0 ) area = Storage[k].aConst + Storage[k].aCoeff; else area = Storage[k].aConst + Storage[k].aCoeff * pow(Node[j].newDepth*UCF(LENGTH), Storage[k].aExpon); } return area / UCF(LENGTH) / UCF(LENGTH); }