Reservoirs

Reservoirs with storage levels below the top of conservation pool are treated like demand sites so that WEAP will not drain them unless to meet downstream demands, and to try to fill them up when there is surplus surface water. Where multiple reservoirs with the same demand priority exist, WEAP will try to fill them up to same level (as a % of the top of conservation pool), just as it will try to satisfy demand sites to the same percentage of their demand. Optionally, you can set a separate (higher) priority for filling the buffer pool storage.

Example 1

In the first example, the river headflow is insufficient to meet the two demands. Therefore, the reservoirs will need to release water to satisfy the demands. Both reservoirs have a top of conservation pool (TOC) of 200, although their initial storages are different: 50 and 100, as shown. Both reservoirs have the same demand priority (99). Therefore, after allocating water, the goal will be to have both reservoirs finish with the same fraction of the top of conservation pool filled.

Since the demand is 130, and the available water is 160, there will be 30 remaining, after allocating to the demand sites. This 30 is split evenly between the two reservoirs-each will have 15. WEAP will solve first for the allocations to the demand sites, and second to fill up the reservoirs. Here is the LP formulation for the first:

Q1 = Add1 + Q2

Q2 = Add2 + Q3

Q3 = Q4 + Q5

Q5 = Q6 + Q7

Q4 = 80 C1

Q6 = 50 C2

S1 = 200 C3

S2 = 200 C4

S1 = 50 + Add1

S2 = 100 + Add2

C1 + E1 >= FC

C2 + E2 >= FC

 Obj fn: FC - 0.2 E1 - 0.2 E2 - 0.2 E3 - 0.2 E4

Upper and lower bounds:

Q1 = 10

Q2 >= 0

C3 >= 0

Q4 >= 0

Q5 >= 0

Q6 >= 0

Q7 >= 0

Add1 >= -50

Add2 >= -100

0 <= S1 <= 200

0 <= S2 <= 200

0 <= C1 <= 1

0 <= C2 <= 1

0 <= C3 <= 1

0 <= C4 <= 1

0 <= E1 <= 0.0001

0 <= E2 <= 0.0001

0 <= E3 <= 0.0001

0 <= E4 <= 0.0001

0 <= FC <= 1

 Where:

Add1 = addition to reservoir 1 storage (negative "additions" represent releases, which cannot exceed the initial storage)

Add2 = addition to reservoir 2 storage

S1 = final storage in reservoir 1

S2 = final storage in reservoir 1

C1 = D1 coverage

C2 = D2 coverage

C3 = Coverage for "demand" to fill reservoir 1 to top of conservation (TOC) pool

C4 = Coverage for "demand" to fill reservoir 2 to top of conservation (TOC) pool

E1 = D1 epsilon

E2 = D2 epsilon

E3 = Res 1 TOC epsilon

E4 = Res 2 TOC epsilon

FC = Final Coverage

Here is the solution:

Q1 = 10

Q2 = 30

Q3 = 130

Q4 = 80

Q5 = 50

Q6 = 50

Q7 = 0

Add1 = -20

Add2 = -100

S1 = 30

S2 = 0

C1 = C2 = FC = 1

C3 = C4 = 0

E1 = E2 = E3 = E4 = 0

Note that Reservoir 1 has storage of 30 while reservoir 2 has 0. This inequity will be rectified next. For the second LP iteration, to solve for equalizing the reservoir releases, here is the LP formulation:

Q1 = Add1 + Q2

Q2 = Add2 + Q3

Q3 = Q4 + Q5

Q5 = Q6 + Q7

Q4 = 80 C1

Q6 = 50 C2

S1 = 200 C3

S2 = 200 C4

S1 = 50 + Add1

S2 = 100 + Add2

C3 + E3 >= FC

C4 + E4 >= FC

 Obj fn: FC - 0.2 E1 - 0.2 E2 - 0.2 E3 - 0.2 E4

Upper and lower bounds:

Q1 = 10

Q2 >= 0

C3 >= 0

Q4 = 80

Q5 >= 0

Q6 = 50

Q7 >= 0

Add1 >= -50

Add2 >= -100

0 <= S1 <= 200

0 <= S2 <= 200

C1 = 1

C2 = 1

0 <= C3 <= 1

0 <= C4 <= 1

0 <= E1 <= 0.0001

0 <= E2 <= 0.0001

0 <= E3 <= 0.0001

0 <= E4 <= 0.0001

0 <= FC <= 1

Here is the solution:

Q1 = 10

Q2 = 45

Q3 = 130

Q4 = 80

Q5 = 50

Q6 = 50

Q7 = 0

Add1 = -35

Add2 = -85

S1 = 15

S2 = 15

C1 = C2 = 1

C3 = C4 = 0.075

FC = 0.0751

E1 = E2 = 0

E3 = E4 = 0.0001

Example 2

The second example is identical to the first, except that the two reservoirs are on different rivers. The river headflow is insufficient to meet the two demands. Therefore, the reservoirs will need to release water to satisfy the demands. Both reservoirs have a top of conservation pool (TOC) of 200, although their initial storages are different: 50 and 100, as shown. Both reservoirs have the same demand priority (99). Therefore, after allocating water, the goal will be to have both reservoirs finish with the same fraction of the top of conservation pool filled.

Since the demand is 130, and the available water is 160, there will be 30 remaining, after allocating to the demand sites. This 30 is split evenly between the two reservoirs-each will have 15. WEAP will solve first for the allocations to the demand sites, and second to fill up the reservoirs. Here is the LP formulation for the first:

Q1 = Add1 + Q8

Q2 = Add2 + Q9

Q3 = Q8 + Q9

Q3 = Q4 + Q5

Q5 = Q6 + Q7

Q6 = 50 C2

S1 = 200 C3

S2 = 200 C4

S1 = 50 + Add1

S2 = 100 + Add2

C1 + E1 >= FC

C2 + E2 >= FC

 Obj fn: FC - 0.2 E1 - 0.2 E2 - 0.2 E3 - 0.2 E4

Upper and lower bounds:

Q1 = 5

Q2 = 5

C3 >= 0

Q4 >= 0

Q5 >= 0

Q6 >= 0

Q7 >= 0

Q8 >= 0

Q9 >= 0

Add1 >= -50

Add2 >= -100

0 <= S1 <= 200

0 <= S2 <= 200

0 <= C1 <= 1

0 <= C2 <= 1

0 <= C3 <= 1

0 <= C4 <= 1

0 <= E1 <= 0.0001

0 <= E2 <= 0.0001

0 <= E3 <= 0.0001

0 <= E4 <= 0.0001

0 <= FC <= 1

 Where:

Add1 = addition to reservoir 1 storage (negative "additions" represent releases, which cannot exceed the initial storage)

Add2 = addition to reservoir 2 storage

S1 = final storage in reservoir 1

S2 = final storage in reservoir 1

C1 = D1 coverage

C2 = D2 coverage

C3 = Coverage for "demand" to fill reservoir 1 to top of conservation (TOC) pool

C4 = Coverage for "demand" to fill reservoir 2 to top of conservation (TOC) pool

E1 = D1 epsilon

E2 = D2 epsilon

E3 = Res 1 TOC epsilon

E4 = Res 2 TOC epsilon

FC = Final Coverage

Here is the solution:

Q1 = 5

Q2 = 5

Q3 = 130

Q4 = 80

Q5 = 50

Q6 = 50

Q7 = 0

Q8 = 25

Q9 = 105

Add1 = -20

Add2 = -100

S1 = 30

S2 = 0

C1 = C2 = FC = 1

C3 = C4 = 0

E1 = E2 = E3 = E4 = 0

Note that Reservoir 1 has storage of 30 while reservoir 2 has 0. This inequity will be rectified next. For the second LP iteration, to solve for equalizing the reservoir releases, here is the LP formulation:

Q1 = Add1 + Q8

Q2 = Add2 + Q9

Q3 = Q8 + Q9

Q3 = Q4 + Q5

Q4 = 80

Q5 = Q6 + Q7

Q6 = 50

S1 = 200 C3

S2 = 200 C4

S1 = 50 + Add1

S2 = 100 + Add2

C3 + E3 >= FC

C4 + E4 >= FC

Obj fn: FC - 0.2 E1 - 0.2 E2 - 0.2 E3 - 0.2 E4

Upper and lower bounds:

Q1 = 5

Q2 = 5

C3 >= 0

Q4 = 80

Q5 >= 0

Q6 = 50

Q7 >= 0

Q8 >= 0

Q9 >= 0

Add1 >= -50

Add2 >= -100

0 <= S1 <= 200

0 <= S2 <= 200

C1 = 1

C2 = 1

0 <= C3 <= 1

0 <= C4 <= 1

0 <= E1 <= 0.0001

0 <= E2 <= 0.0001

0 <= E3 <= 0.0001

0 <= E4 <= 0.0001

0 <= FC <= 1

Here is the solution:

Q1 = 5

Q2 = 5

Q3 = 130

Q4 = 80

Q5 = 50

Q6 = 50

Q7 = 0

Q8 = 40

Q9 = 90

Add1 = -35

Add2 = -85

S1 = 15

S2 = 15

C1 = C2 = 1

C3 = C4 = 0.075

FC = 0.0751

E1 = E2 = 0

E3 = E4 = 0.0001

Note that now both Reservoir 1 and Reservoir 2 have the same storage (15).

Maximum Hydraulic Outflow

If the optional maximum hydraulic outflow (MHO) data value is set, WEAP will create extra constraints to handle it.  When there is no maximum hydraulic outflow constraint, WEAP will never allow reservoir storage to exceed the top of conservation.  However, if there is a maximum hydraulic outflow constraint, it is possible for the reservoir storage to exceed the top of conservation in timesteps where releases from the reservoir equal the maximum hydraulic outflow.  

There are three cases that must be handled:

  1. The outflow is less than MHO (MHO constraint is in place, but is not binding),

  2. The outflow is equal to MHO but the reservoir is not completely full  (MHO constraint is in place and is binding), or

  3. The reservoir is completely full (storage = total storage) and could be overtopping with no maximum flow constraint (MHO constraint is not in place, but the outflow is not necessary greater than MHO).

To handle these non-linear constraints requires the use of two binary integer LP variables, Z1 and Z2.  (A binary integer variable must either be 0 or 1.)  

Z1

{

= 0 if the MHO constraint is not binding (outflow < MHO or Storage = Total Storage)

= 1 if the MHO constraint is binding (outflow = MHO and Storage < Total Storage)

Z2

{

= 0 if Storage < Total Storage

= 1 if Storage = Total Storage

Because the MHO constraint is not binding if Storage = Total Storage, Z1 and Z2 cannot both be 1 at the same time, although they can both be 0 at the same time.  For the three cases above, the values of Z1 and Z2 are as follows:  

  1. Z1 = 0, Z2 = 0

  2. Z1 = 1, Z2 = 0

  3. Z1 = 0, Z2 = 1

Here are the LP constraints to implement the MHO constraint:

Q <= MHO * Z1  +  0.999 * MHO * (1-Z1)  +  TS * Z2

Q >= MHO * Z1  

S <= 0.999 * TS * Z1  +  TOC * (1-Z1)  +  (TS - TOC) * Z2

S >= TS * Z2

Z1 + Z2 <= 1

Where:

Q = reservoir outflow

MHO = maximum hydraulic outflow

TOC = top of conservation

TS = total storage (maximum possible storage in reservoir)

Here are how the constraints look for the three cases (substituting the appropriate values for Z1 and Z2):

Case 1 (Z1 = 0, Z2 = 0)  The outflow is less than MHO:

Q <= 0.999 * MHO

Q >= 0

S <= TOC

S >= 0

0 + 0 <= 1

Case 2 (Z1 = 1, Z2 = 0)  The outflow is equal to MHO but the reservoir is not completely full:

Q <= MHO

Q >= MHO

S <= 0.999 * TS

S >= 0

1 + 0 <= 1

Case 3 (Z1 = 0, Z2 = 1)  The reservoir is completely full (storage = total storage), so there is maximum flow constraint (but the outflow is not necessary greater than MHO):

Q <= 0.999 * MHO  +  TS

Q >= 0

S <= TOC  +  (TS - TOC), which simplifies to  S <= TS

S >= TS

0 + 1 <= 1