-
Notifications
You must be signed in to change notification settings - Fork 2
Surface Groundwater Coupling Q&A
Question 1: Does return flow from non-irrigation get calculated outside of the return flow internal loop?
A: Answering this question requires identifying the components of “Topnet Return Flows” (see the Lower Nooksack Water Budget Report Figure 23 components).
A loop over all users between lines 1183 and 1189 in calcts() calv46sn.cpp aggregates return flow in daily, monthly, and annual return flow arrays. Each array element is for a specific drainage which may include several users and all types of return flow.
The subroutine call sequence for return flows is calcts() -> Watermgmt() -> AllocateWaterToUsers() -> PropagateWaterViaUser(). Writing return flow output in calcts() is done just after a call to Watermgmt().
During the zeroth timestep, code on lines 479 through 488 identify return flows to groundwater. That information is saved in a static variable and used on line 566 to modify elements of the groundwater_to_take array. With two exceptions, all flows in the 1931 to 2016 Bertrand Creek test run are identified as returns to groundwater. The two flow exceptions are empty (zero volume).
Within PropagateWaterViaUser(), user return flow in fractional units (0 to 1) is calculated in the loop starting on line 61 in and set on either line 89 or line 121. In the next loop starting on line 127, return flow volumes are found on line 129 and set to the appropriate element in a user link structure on line 140. Also in that loop, reservoirs and users are linked in a separate ReturnFlow table.
The relative fractions of sprinkler and drip irrigation corresponding to the diagram in Figure 23 are used to determine the fraction that bypasses the vegetation canopy for evapotranspiration calculation. The variable fsprinkler (=Sp[20,:]), set on line 181 in topmod() (topmoddgt_v7.cpp), is the sprinkler fraction. See lines 335 through 338 for the use of fsprinkler.
Figure 23 is an abstract representation of what TopNet does, not of how the code accomplishes it.
Question 2: How do user withdrawals get aggregated? for parameters such as recharge (R1), upwelling (R3), return flow, and commercial/municipal/industrial water users?
A:
- Each user has a volume of withdrawal per day, or flow rate = Q1
- Q1 is summed per year to get a total flow in each year of the model time series = Q2
- Q2 is divided by 365 to get the average daily flow rate = Q3
Example: the Fazon watershed is POU_ID = DrainageID = 200 which is the equivalent TopnetID = 125 (see DrainageID.txt file in the modelrun folder for this ID map). This corresponds to “Drainage 125” in “annual_mean_recharge_mm” (and similar text files), so the annual mean recharge for Fazon is X mm. Recharge in the Nooksack watershed sub-basins range from 20-60 inches/year as simulated by the Topnet-WM model with distributed gridded hydrometeorology (6 sq km grid cells). Bertrand Creek climate data is interpolated from local observations and ranges from 30-40 inches/year. [NEED TO UPDATE THESE NUMBERS]
Question 3: How does the surface model get recharge depth from irrigated area and depth from non-irrigated area?
A: Recharge to the saturated zone (rd) and upwelling (r3) are calculated in soil topmoddgt_v7.cpp, called at line 358 in topmod(). In soil(), the relevant lines are 792,785 or 799, and 829 for recharge, and lines 807 or 811 for upwelling. Calls to topmod() are for each timestep, for each subbasin, for the irrigated fraction and for the non-irrigated fraction, and for natural, tile, and ditch drainage.
Although it is possible to separate recharge and upwelling into irrigation and drainage-type subcategories, currently those subcategories are aggregated for each subbasin.
Question 4: How do you aggregate the recharge for all users per drainage? What corresponding areas are used for recharge from different water uses?
A:
Question 5: How is volume calculated? Which lines of code and which files?
A:
Question 6: How is depth calculated? Which fractional areas are used?
A:
Question 7: Where are the shapefiles used for each type of water users? How do I access and update that data?
A:
Question 8: How do you know the code is correct?
A: [compare Fortran and C code; compare daily average ouputs to the the annual sum or recharge]
Question 8: Does annual average recharge output from Topnet model represent the recharge after artificial drainage flows have been removed in each timestep?
A: YES. Recharge + artificial drainage outputs would be an estimate of the basin recharge without tiles and ditch drains. Recharge output does not include artificial drainage.
Details: "r1" is updated on line 338 in topmod() in the topmoddgt_v7.cpp file. It is added to "sumr1" on line 340 and returned from topmod() but not used. Instead, on line 351 it is adjusted, i.e. line 351: r2 = r1 - ud; // Net forcing on the soil zone.
Actual recharge is calculated and returned as rd in a subsequent call to soil() using r2. A code comment there identifies rd as "recharge to saturated zone". A comment in soil() on line 793 clarifies the role of artificial drainage: "/ 12-jan-2005 DGT 6/28/05 Drainage does not go to sat store".
After rd is returned from soil(), "recharge", the variable that is ultimately printed is multiplied by a unit conversion factor on line 360. Printing happens back in calcts() on line 1202 near the end of the timestep loop.
**Question 9: Does annual average recharge output from Topnet model represent the recharge after return flows have been removed in each timestep?
A: YES. Return flows are calculated as a fraction of the user withdrawals in each timestep. The return flow gets added to the groundwater saturated zone.