Prioritising Shortfalls
Introduction
This specification has been created to try and develop a simple and effective system that allows users in Source to specify how shortfalls are prioritised between different demands in Source. Currently Source tries to shortfall all demands equally within the model, this specification will hopefully provide a solution to address the following situations encountered in water resource models:
...
- n number of priorities specified
- pNode Node priority applies to things which can place orders
- dsOrder(min) ds order at a node at min flow time
- order(min) order propagated upstream at min flow time
- nPriority (n) output array of n priorities for the node
- dsPriority array (n) array of n priorities being passed into the node
- sumDSPriorityG sum of dsPriority (n) where n < pNode
- sumDSPriorityGE sum of dsPriority where (n) where n <= pNode
- sumDSPriorityL sum of dsPriority where (n) where n > pNode
- sumDSPriorityLE sum of dsPriority where (n) where n >= pNode
- sumnPriorityG sum of nPriority where (n) where n < p
- MinFlowReq minimum flow requirement
- SupplyPointOrderOrder generated by water user and passed to supply point
- dsMainPriority(p) Priorities arriving at a splitter from the main branch
- dsMainOrder Order arriving at a splitter from the main branch
- dsEffPriority(p) Priorities arriving at a splitter from the effluent branch
- dsEffOrder Order arriving at a splitter from the effluent branch
...
- Loop on priorities p = 0 to n
- If the MinFlowReq >= dsOrder Then
- If p < pNode then nPriority(p) = dsPriority(p)*dsOrder/MinFlowReq
- If p = pNode then
- sumDSPriorityLE = sum of dsPriority (n) where n >= p
- nPriority(p) = ((MinFlowReq – dsOrder) + sumDSPriorityLE* dsOrder)/MinFlowReq
- If p > pNode then nPriority(p) = 0
- If the MinFlowReq < dsOrder Then
- sumDSPriorityGE = sum of dsPriority (n) where n <= p
- If p <= pNode then
- sumDSPriorityG = sum of dsPriority (n) where n < p
- nPriority(p) = sumDSPriorityGE*dsOrder >= MinFlowReq ? dsPriority(p)*dsOrder/usOrder : (MinFowReq- sumDSPriorityG *dsOrder)/usOrder
- If p > Node(p) then
- sumDSPriorityL = sum of dsPriority where n > p
- nPriority(p) = nPrioirity(p)/ sumDSPriorityL*(1- sumDSPriorityGE)
Supply Point
There are essentially four scenarios in how a supply point node can be configured for the rules based-ordering, shown in Table 1. Note that if a Supply Point is selected as groundwater then it should not be part of the ordering network i.e. it should not be allowed to generate orders (this does not appear to happen in the model, maybe more validation for that setting?)
As the Supply Point can extract water from the system we need to consider how the priorities affect both the order phase and the flow phase.
Anchor | ||||
---|---|---|---|---|
|
Scenario | Allow Order | Extract Water | Notes |
1 | True | True | Standard case |
2 | True | False | Just restrict the extraction in the flow phase – should not be an issue |
3 | False | True | Water will be extracted independently of the priorities |
4 | False | False | Nothing occurs |
Order Phase
Adjustment of orders will only occur when "Allow Order" has been selected. If
...
- If "Extract Water " = True Then
- Loop on priorities p = 0 to n
- sumnPriorityG = sum of nPriority (n) where p < pNode
- Max(0,Min(SupplyPointOrder, (UpstreamFlow- (sumnPriorityGOrder))(SupplyPointOrder/(nPriority(p)*Order))))
- If "Extract Water" = False Then Continue
...
- Pass Orders Through – simply sum the volumes at each priority level across all outlets and divide by total volume being passed up all outlets to get proportions, assume evap/seepage does not effect storage ratios
- Re-regulating the orders – Far more complex as we have a number of issues
- Downstream orders
- Storage losses
- Different upstream min order time
- Operational targets being met
...
- If "PassThroughOrder" = true Then
- sumOutletOrder = Sum the total order from all outlets
- Loop on priorities p = 0 to n
- Loop on outlets
- OutletOrders(p) += dsOrder(p) * OutletOrder
- nPriority(p) = OutletOrders(p)/ sumOutletOrder
- If "PassThroughOrder" = false Then
...
- If MaxOrder < dsOrder Then
- Loop on priorities p = 0 to n
- sumDSPriorityG = sum of dsPriority (n) where n < p
- If(sumDSPriorityG*dsOrder>MaxOrder,0,Min(MaxOrder - sumDSPriorityG*dsOrder, dsPriority(p)*dsOrder/MaxOrder))
- If MaxOrder > dsOrder Then…. For all p nPriority(p) = dsPriority(p)
...