From OutputReportTabular.cc
, totalWater = totalOnsiteWater + gatherMains + StorageChange;
where gatherMains = Water Supplied by Utility
&
totalWater = Total On Site, Change in Storage, and Utility Water Sources
Meters Water:Facility
and MainsWater:Facility
can be used to understand above results. Report variables on these meters can be found in meter details file (*.mtd) and can be included in idf. Running the annual simulation gave the following Water Source Summary
summary
Reporting output variables from .mtd files for eters Water:Facility
and MainsWater:Facility
for runperiod gives the following results
So the difference between end use and mains water is entirely due to Rainwater and Graywater tanks. Both these tanks use Mains
to respond to fill requests made by float valve. If Type of Supply Controlled by Float Valve
is set to None
, then Total Water End Uses
will be identical to Water Supplied by Utility
.
Irrigation Water
, though supplied by Rainwater Tank
is showing identical Water Use Equipment Total Volume
and Water Use Equipment Mains Water Volume
. From WaterUse.cc
SetupOutputVariable( "Water Use Equipment Total Volume [m3]", WaterEquipment( WaterEquipNum ).TotalVolume, "System", "Sum", WaterEquipment( WaterEquipNum ).Name, _, "Water", "WATERSYSTEMS", WaterEquipment( WaterEquipNum ).EndUseSubcatName, "Plant" );
SetupOutputVariable( "Water Use Equipment Mains Water Volume [m3]", WaterEquipment( WaterEquipNum ).TotalVolume, "System", "Sum", WaterEquipment( WaterEquipNum ).Name, _, "MainsWater", "WATERSYSTEMS", WaterEquipment( WaterEquipNum ).EndUseSubcatName, "Plant" );
As can be seen from above, same output variable WaterEquipment( WaterEquipNum ).TotalVolume
is used for both the meters.
Looking further into WaterUse.cc
, the current code is
if ( WaterConnections( WaterConnNum ).SupplyTankNum > 0 ) {
// Set the demand request for supply water from water storage tank
WaterConnections( WaterConnNum ).ColdVolFlowRate = WaterConnections( WaterConnNum ).ColdMassFlowRate / RhoH2O( DataGlobals::InitConvTemp );
WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotRequestDemand( WaterConnections( WaterConnNum ).TankDemandID ) = WaterConnections( WaterConnNum ).ColdVolFlowRate;
// Check if cold flow rate should be starved by restricted flow from tank
// Currently, the tank flow is not really starved--water continues to flow at the tank water temperature
// But the user can see the error by comparing report variables for TankVolFlowRate < ColdVolFlowRate
WaterConnections( WaterConnNum ).TankVolFlowRate = WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotAvailDemand( WaterConnections( WaterConnNum ).TankDemandID );
WaterConnections( WaterConnNum ).TankMassFlowRate = WaterConnections( WaterConnNum ).TankVolFlowRate * RhoH2O( DataGlobals::InitConvTemp );
}
Perhaps a proposed solution could be to calculate starved flow rate and use that for mains water flow rate as shown below.
RequestDemandVdot = 0.0;
StarvedVdot = 0.0;
TankSupplyVdot = 0.0;
AvailTankVdot = 0.0;
if ( WaterConnections( WaterConnNum ).SupplyTankNum > 0 ) {
// Set the demand request for supply water from water storage tank
WaterConnections( WaterConnNum ).ColdVolFlowRate = WaterConnections( WaterConnNum ).ColdMassFlowRate / RhoH2O( DataGlobals::InitConvTemp );
WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotRequestDemand( WaterConnections( WaterConnNum ).TankDemandID ) = WaterConnections( WaterConnNum ).ColdVolFlowRate;
RequestDemandVdot = WaterConnections( WaterConnNum ).ColdVolFlowRate;
// Check if cold flow rate should be starved by restricted flow from tank
AvailTankVdot = WaterStorage( WaterConnections( WaterConnNum ).SupplyTankNum ).VdotAvailDemand( WaterConnections( WaterConnNum ).TankDemandID );
TankSupplyVdot = RequestDemandVdot; // init
if ( AvailTankVdot < RequestDemandVdot ) { // calculate starved flow
StarvedVdot = RequestDemandVdot - AvailTankVdot;
TankSupplyVdot = AvailTankVdot;
}
}
WaterConnections( WaterConnNum ).TankVolFlowRate = TankSupplyVdot;
WaterConnections( WaterConnNum ).TankMassFlowRate = TankSupplyVdot * RhoH2O( DataGlobals::InitConvTemp );
And then StarvedVdot
should be reported for MainsWater
meter.
If someone could direct me to the code lines where it is calculated (I suppose it is E+ code) it would be a great help.