Base para Refactorizar TSNET a codigo fuente

This commit is contained in:
Miguel 2025-09-12 10:22:15 +02:00
parent c5b980b134
commit 8072f29e12
128 changed files with 14571 additions and 10 deletions

View File

@ -11,9 +11,6 @@
},
{
"path": "C:/Users/migue/AppData/Local/Temp/TSNet"
},
{
"path": "../../Github/TSNet"
}
],
"settings": {

View File

@ -126,26 +126,58 @@ namespace CtrEditor.HydraulicSimulator.TSNet
var elevation = GetNodeElevation(node);
var sanitizedName = SanitizeNodeName(node.Name);
// Buscar el adapter correspondiente en el simulation manager
// Buscar el adapter correspondiente en el simulation manager usando el nombre original (sin sanitizar)
LogToMCP($"INPGenerator: Buscando adaptador para nodo '{node.Name}'");
var tankAdapter = _simulationManager?.GetTankAdapterByNodeName(node.Name);
// Debug logging para diagnóstico
if (_simulationManager != null)
{
LogToMCP($"INPGenerator: SimulationManager disponible, buscando adaptador...");
if (tankAdapter == null)
{
LogToMCP($"INPGenerator: No se encontró adaptador para '{node.Name}'");
// Listar adaptadores disponibles para diagnóstico
LogToMCP($"INPGenerator: Adaptadores disponibles:");
var availableAdapters = _simulationManager.GetType().GetField("_tankAdapters",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (availableAdapters?.GetValue(_simulationManager) is System.Collections.IDictionary adapters)
{
foreach (System.Collections.DictionaryEntry entry in adapters)
{
var adapter = entry.Value;
var tankName = adapter?.GetType().GetProperty("Tank")?.GetValue(adapter)?.GetType().GetProperty("Nombre")?.GetValue(adapter?.GetType().GetProperty("Tank")?.GetValue(adapter));
LogToMCP($" - '{tankName}' (ID: {entry.Key})");
}
}
}
else
{
LogToMCP($"INPGenerator: ✅ Adaptador encontrado para '{node.Name}'");
}
}
else
{
LogToMCP($"INPGenerator: ❌ SimulationManager es null");
}
if (tankAdapter?.Configuration != null)
{
// Usar configuración real del tanque
var config = tankAdapter.Configuration;
// Debug: Log de generación INP
System.Diagnostics.Debug.WriteLine($"INPGenerator: Generando tanque {node.Name}");
System.Diagnostics.Debug.WriteLine($" config.InitialLevelM: {config.InitialLevelM}");
System.Diagnostics.Debug.WriteLine($" config.MaxLevelM: {config.MaxLevelM}");
System.Diagnostics.Debug.WriteLine($" config.DiameterM: {config.DiameterM}");
LogToMCP($"INPGenerator: Generando tanque {node.Name}");
LogToMCP($" config.InitialLevelM: {config.InitialLevelM}");
LogToMCP($" config.MaxLevelM: {config.MaxLevelM}");
LogToMCP($" config.DiameterM: {config.DiameterM}");
content.AppendLine($" {sanitizedName,-15}\t{elevation.ToString("F2", CultureInfo.InvariantCulture)} \t{config.InitialLevelM.ToString("F2", CultureInfo.InvariantCulture)} \t{config.MinLevelM.ToString("F2", CultureInfo.InvariantCulture)} \t{config.MaxLevelM.ToString("F2", CultureInfo.InvariantCulture)} \t{config.DiameterM.ToString("F2", CultureInfo.InvariantCulture)} \t0 \t");
}
else
{
// Fallback a valores por defecto si no hay configuración
System.Diagnostics.Debug.WriteLine($"INPGenerator: WARNING - No se encontró configuración para tanque {node.Name}, usando valores por defecto");
LogToMCP($"INPGenerator: WARNING - No se encontró configuración para tanque {node.Name}, usando valores por defecto");
content.AppendLine($" {sanitizedName,-15}\t{elevation.ToString("F2", CultureInfo.InvariantCulture)} \t1.0 \t0.0 \t2.0 \t1.0 \t0 \t");
}
}
@ -415,6 +447,15 @@ namespace CtrEditor.HydraulicSimulator.TSNet
return string.IsNullOrEmpty(result) ? "UnknownNode" : result;
}
/// <summary>
/// Método de logging simple para debug - usa Console.WriteLine por ahora
/// </summary>
private static void LogToMCP(string message)
{
// Usar Console.WriteLine para debug que es capturado por el sistema de logging
Console.WriteLine($"[DEBUG TSNetINPGenerator] {message}");
}
#endregion
}
}

12
Python/tsnet/__init__.py Normal file
View File

@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
"""Top-level package for tsnet."""
from tsnet import network
from tsnet import simulation
from tsnet import postprocessing
from tsnet import utils
__author__ = """Lu Xing"""
__email__ = 'xinglu@utexas.edu'
__version__ = '0.2.2'

BIN
Python/tsnet/docs/.DS_Store vendored Normal file

Binary file not shown.

163
Python/tsnet/docs/Makefile Normal file
View File

@ -0,0 +1,163 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = python -msphinx
SPHINXPROJ = tsnet
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/WNTR.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/WNTR.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/WNTR"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/WNTR"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

View File

@ -0,0 +1,10 @@
{% extends "!layout.html" %}
{% block footer %} {{ super() }}
<style>
/* Sidebar header (and topbar for mobile) */
.wy-side-nav-search, .wy-nav-top {
background: #cc6600;
}
</style>
{% endblock %}

View File

@ -0,0 +1,18 @@
====================
Abbreviations
====================
**API**: Application programming interface
**EPA**: Environmental Protection Agency
**IDE**: Integrated development environment
**SI**: International System of Units
**US**: United States
**MOC**: Method of Characteristics
**TSNET**: Transient Simulation in water Networks

View File

@ -0,0 +1,7 @@
tsnet
=====
.. toctree::
:maxdepth: 4
tsnet

View File

@ -0,0 +1,46 @@
tsnet.network package
=====================
Submodules
----------
tsnet.network.control module
----------------------------
.. automodule:: tsnet.network.control
:members:
:undoc-members:
:show-inheritance:
tsnet.network.discretize module
-------------------------------
.. automodule:: tsnet.network.discretize
:members:
:undoc-members:
:show-inheritance:
tsnet.network.model module
--------------------------
.. automodule:: tsnet.network.model
:members:
:undoc-members:
:show-inheritance:
tsnet.network.topology module
-----------------------------
.. automodule:: tsnet.network.topology
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: tsnet.network
:members:
:undoc-members:
:show-inheritance:

View File

@ -0,0 +1,22 @@
tsnet.postprocessing package
============================
Submodules
----------
tsnet.postprocessing.time\_history module
-----------------------------------------
.. automodule:: tsnet.postprocessing.time_history
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: tsnet.postprocessing
:members:
:undoc-members:
:show-inheritance:

View File

@ -0,0 +1,20 @@
tsnet package
=============
Subpackages
-----------
.. toctree::
tsnet.network
tsnet.postprocessing
tsnet.simulation
tsnet.utils
Module contents
---------------
.. automodule:: tsnet
:members:
:undoc-members:
:show-inheritance:

View File

@ -0,0 +1,46 @@
tsnet.simulation package
========================
Submodules
----------
tsnet.simulation.initialize module
----------------------------------
.. automodule:: tsnet.simulation.initialize
:members:
:undoc-members:
:show-inheritance:
tsnet.simulation.main module
----------------------------
.. automodule:: tsnet.simulation.main
:members:
:undoc-members:
:show-inheritance:
tsnet.simulation.single module
------------------------------
.. automodule:: tsnet.simulation.single
:members:
:undoc-members:
:show-inheritance:
tsnet.simulation.solver module
------------------------------
.. automodule:: tsnet.simulation.solver
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: tsnet.simulation
:members:
:undoc-members:
:show-inheritance:

View File

@ -0,0 +1,46 @@
tsnet.utils package
===================
Submodules
----------
tsnet.utils.calc\_parabola\_vertex module
-----------------------------------------
.. automodule:: tsnet.utils.calc_parabola_vertex
:members:
:undoc-members:
:show-inheritance:
tsnet.utils.memo module
-----------------------
.. automodule:: tsnet.utils.memo
:members:
:undoc-members:
:show-inheritance:
tsnet.utils.print\_time\_delta module
-------------------------------------
.. automodule:: tsnet.utils.print_time_delta
:members:
:undoc-members:
:show-inheritance:
tsnet.utils.valve\_curve module
-------------------------------
.. automodule:: tsnet.utils.valve_curve
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: tsnet.utils
:members:
:undoc-members:
:show-inheritance:

View File

@ -0,0 +1 @@
.. include:: ../AUTHORS.rst

209
Python/tsnet/docs/conf.py Normal file
View File

@ -0,0 +1,209 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# tsnet documentation build configuration file, created by
# sphinx-quickstart on Fri Jun 9 13:47:02 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another
# directory, add these directories to sys.path here. If the directory is
# relative to the documentation root, use os.path.abspath to make it
# absolute, like shown here.
#
import os
import sys
sys.path.insert(0, os.path.abspath('../'))
import tsnet
import shlex
import sphinx_rtd_theme
# -- General configuration ---------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.viewcode',
'sphinx.ext.napoleon',
'sphinx.ext.autosummary',
'sphinx.ext.mathjax',
'sphinx.ext.githubpages',
"sphinx_rtd_theme",
'sphinx.ext.intersphinx'
]
# Napoleon settings
napoleon_google_docstring = True
napoleon_numpy_docstring = True
napoleon_include_init_with_doc = False
napoleon_include_private_with_doc = False
napoleon_include_special_with_doc = True
napoleon_use_admonition_for_examples = False
napoleon_use_admonition_for_notes = False
napoleon_use_admonition_for_references = False
napoleon_use_ivar = False
napoleon_use_param = True
napoleon_use_rtype = True
viewcode_import = True
autodoc_member_order = 'bysource'
autoclass_content = 'both'
numfig=True
numfig_format = {'figure': 'Figure %s', 'table': 'Table %s', 'code-block': 'Listing %s'}
math_numfig = True
math_eqref_format = "Eq.{number}"
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# autosummary
import glob
autosummary_generate = glob.glob("apidocs/*.rst")
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'content'
# General information about the project.
project = u'TSNet'
copyright = u"2019, Lu Xing"
author = u"Lu Xing, Lina Sela"
# The version info for the project you're documenting, acts as replacement
# for |version| and |release|, also used in various other places throughout
# the built documents.
#
# The short X.Y version.
version = tsnet.__version__
# The full version, including alpha/beta/rc tags.
release = tsnet.__version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
# -- Options for HTML output -------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
# html_theme = 'classic'
html_theme = "sphinx_rtd_theme"
# html_theme = 'bootstrap'
# html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
# Theme options are theme-specific and customize the look and feel of a
# theme further. For a list of options available for each theme, see the
# documentation.
#
html_theme_options = {'body_max_width':'100%' }
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_show_sphinx = False
# -- Options for HTMLHelp output ---------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'tsnetdoc'
# -- Options for LaTeX output ------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
# [howto, manual, or own class]).
latex_documents = [
(master_doc, 'TSNet.tex',
u'TSNet Documentation',
u"Lu Xing, Lina Sela", 'manual'),
]
# latex_logo = 'logo.png'
# -- Options for manual page output ------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'TSNet',
u'TSNet Documentation',
[author], 1)
]
# -- Options for Texinfo output ----------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'TSNet',
u'TSNet Documentation',
author,
'TSNet',
'One line description of project.',
'Miscellaneous'),
]

View File

@ -0,0 +1,27 @@
Welcome to TSNet's documentation!
======================================
.. toctree::
:maxdepth: 2
:caption: Contents:
readme
installation
limitations
usage
transient
results
examples
validation
contributing
authors
history
API documentation <apidocs/tsnet>
abbrev
reference
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@ -0,0 +1 @@
.. include:: ../CONTRIBUTING.rst

View File

@ -0,0 +1,16 @@
name: tsnet
channels:
- defaults
- conda-forge
dependencies:
- python=3.6
- numpy
- scipy
- networkx
- pandas
- matplotlib
- plotly
- folium
- utm
- sphinx

View File

@ -0,0 +1,317 @@
====================
Example Applications
====================
Example 1 - End-valve closure
-----------------------------
This example shows how to simulate the closure of a
valve located at the boundary of a network. The first example
network is shown below in :numref:`tnet1`, adopted from [[STWY67],WOLB05]_.
It comprises 9 pipes, 8 junctions, one reservoir, 3 closed loops,
and one valve located at the downstream end of the system.
There are five steps that the user needs to take to run the
transient simulation using the TSNet package:
.. _tnet1:
.. figure:: figures/Tnet1.PNG
:scale: 100 %
:alt: tnet1
Tnet1 network graphics
1. Import TSNet package, read the EPANET INP file,
and create transient model object.
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 1-4
2. Set the wave speed for all pipes to :math:`1200m/s`,
time step to :math:`0.1s`, and simulation period
to :math:`60s`.
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 6-11
3. Set valve operating rules, including how long it takes
to close the valve (:math:`tc`), when to start close the
valve (:math:`ts`), the opening percentage when the closure
is completed (:math:`se`), and the shape of the closure
operating curve (:math:`m`, :math:`1` stands for linear closure,
:math:`2` stands for quadratic closure).
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 13-19
4. Compute steady state results to establish the initial
condition for transient simulation.
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 21-24
5. Run transient simulation and specify the name of the results file.
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 26-28
After the transient simulation, the results at nodes and links
will be returned and stored in the transient model (tm) instance.
The time history of flow rate on the start node of pipe P2
throughout the simulation can be retrieved by:
>>> print(tm.links['P2'].start_node_flowrate)
To plot the head results at N3:
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 31-42
yields :numref:`tnet1_node`:
.. _tnet1_node:
.. figure:: figures/tnet1_node.png
:width: 600
:alt: tnet1_node
Tnet1 - Head at node N3.
Similarly, to plot the flow rate results in pipe P2:
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 45-58
yields :numref:`tnet1_pipe`:
.. _tnet1_pipe:
.. figure:: figures/tnet1_pipe.png
:width: 600
:alt: tnet1_pipe
Tnet1 - Flow rate at the start and end node of pipe P2.
Example 2 - Pump operations
---------------------------
This example illustrates how the package models
a transient event resulting from a controlled pump shut-off
, i.e., the pump speed is ramped down. This example
network, Tnet2, is shown below in :numref:`tnet2`. Tnet2 comprises 113 pipes,
91 junctions, 2 pumps, 2 reservoir, 3 tanks, and one valve located in the
middle of the network.
A transient simulation of 50 seconds is generated by shutting off PUMP2.
There are five steps user needs to take:
.. _tnet2:
.. figure:: figures/Tnet2.PNG
:width: 600
:alt: tnet2
Tnet2 network graphics
1. Import TSNet package, read the EPANET INP file,
and create transient model object.
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 1-4
2. Set the wave speed for all pipes to be :math:`1200m/s` and
simulation period to be :math:`50s`. Use suggested time
step.
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 6-10
3. Set pump operating rules, including how long it takes
to shutdown the pump (:math:`tc`), when to the shut-off starts
(:math:`ts`), the pump speed multiplier value when the shut-off
is completed (:math:`se`), and the shape of the shut-off
operation curve (:math:`m`, :math:`1` stands for linear closure,
:math:`2` stands for quadratic closure).
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 12-18
4. Compute steady state results to establish the initial
condition for transient simulation.
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 20-23
5. Run transient simulation and specify the name of the results file.
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 25-27
After the transient simulation, the results at nodes and links
will be returned to the transient model (tm) instance, which is then
stored in **Tnet2.obj**.
The actual demand discharge at JUNCTION-105 throughout the simulation
can be retrieved by:
>>> print(tm.nodes['JUNCTION-105'].demand_discharge)
To plot the head results at JUNCTION-105:
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 30-41
yields :numref:`tnet2_node`:
.. _tnet2_node:
.. figure:: figures/tnet2_node.png
:width: 600
:alt: tnet2_node
Tnet2 - Head at node JUNCTION-105.
Similarly, to plot the velocity results in PIPE-109:
.. literalinclude:: ../examples/Tnet2_pump_shutdown.py
:lines: 44-55
yields :numref:`tnet2_pipe`:
.. _tnet2_pipe:
.. figure:: figures/tnet2_pipe.png
:width: 600
:alt: tnet2_pipe
Tnet2 - Velocity at the start and end node of PIPE-109.
Example 3 - Burst and leak
---------------------------
This example reveals how TSNet simulates pipe bursts and leaks.
This example network, adapted from [OSBH08]_, is shown below in :numref:`tnet3`.
Tnet3 comprises 168 pipes, 126 junctions, 8 valve, 2 pumps,
one reservoir, and two tanks.
The transient event is generated by a burst and a background leak.
There are five steps that the user would need to take:
.. _tnet3:
.. figure:: figures/Tnet3.PNG
:width: 600
:alt: tnet3
Tnet3 network graphics
1. Import TSNet package, read the EPANET INP file,
and create transient model object.
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 1-4
2. The user can import custom wave speeds for each pipe.
To demonstrate how to assign different wave speed,
we assume that the wave speed for the pipes is normally distributed
with mean of :math:`1200 m/s` and standard deviation of
:math: `100m/s`. Then, assign the randomly generated wave speed
to each pipe in the network according to the order the pipes
defined in the INP file. Subsequently, set the simulation period
as :math:`20s`, and use suggested time step.
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 6-12
3. Define background leak location, JUNCTION-22,
and specify the emitter coefficient.
The leak will be included in the initial condition calculation.
See WNTR documentation [WNTRSi]_ for more info about leak simulation.
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 14-16
4. Compute steady state results to establish the initial
condition for transient simulation.
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 24-27
5. Set up burst event, including burst location, JUNCTION-20,
burst start time (:math:`ts`),
time for burst to fully develop (:math:`tc`), and the final emitter
coefficient (final_burst_coeff).
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 18-22
6. Run transient simulation and specify the name of the results file.
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 29-31
After the transient simulation, the results at nodes and links
will be returned to the transient model (tm) instance,
which is subsequently stored in **Tnet3.obj**.
To understand how much water has been lost through the leakage
at JUNCTION-22, we can plot the leak discharge results at JUNCTION-22:
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 34-45
yields :numref:`tnet3_leak`:
.. _tnet3_leak:
.. figure:: figures/tnet3_leak.png
:width: 600
:alt: tnet3_leak
Tnet3 - Leak discharge at node JUNCTION-22.
Similarly, to reveal how much water has been wasted through the burst event
at JUNCTION-20, we can plot the burst discharge results at JUNCTION-20:
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 48-58
yields :numref:`tnet3_burst`:
.. _tnet3_burst:
.. figure:: figures/tnet3_burst.png
:width: 600
:alt: tnet3_burst
Tnet3 - Burst discharge at node JUNCTION-20.
Additionally, to plot the velocity results in LINK-40:
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 61-72
yields :numref:`tnet3_pipe`:
.. _tnet3_pipe:
.. figure:: figures/tnet3_pipe.png
:width: 600
:alt: tnet3_pipe
Tnet3 - Velocity at the start and end node of LINK-40.
Moreover, we can plot head results at some further nodes, such as
JUNCTION-8, JUNCTION-16, JUNCTION-45, JUNCTION-90, by:
.. literalinclude:: ../examples/Tnet3_burst_leak.py
:lines: 75-90
The results are demonstrated in :numref:`tnet3_multi`. It can be noticed that
the amplitude of the pressure transient at JUNCTION-8 and JUNCTION-16
is greater than that at other two junctions which are further away from
JUNCTION-20, where the burst occurred.
.. _tnet3_multi:
.. figure:: figures/tnet3_multi.png
:width: 600
:alt: tnet3_multi
Tnet3 - Head at multiple junctions.
More examples are includeded in https://github.com/glorialulu/TSNet/tree/master/examples.

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 KiB

View File

@ -0,0 +1,139 @@
import numpy as np
import matplotlib.pyplot as plt
def valveclosing(dt, tf, valve_op):
"""Define valve operation curve (percentage open v.s. time)
Parameters
----------
dt : float
Time step
tf : float
Simulation Time
valve_op : list
Contains parameters to define valve operation rule
valve_op = [tc,ts,se,m]
tc : the duration takes to close the valve [s]
ts : closure start time [s]
se : final open percentage [s]
m : closure constant [unitless]
Returns
-------
s : list
valve operation curve
"""
[tc,ts,se,m] = valve_op
tn = int(tf/dt)
# abrupt closure
if tc ==0:
s = np.array([(1- (i*dt- ts))**1 for i in range(tn)])
s[s>1] = 1
s[s<1] = se
# gradual closure
else:
t = np.array([(i*dt- ts)/tc for i in range(tn)])
t[t>1] = 1
t[t<0] = 0
s = np.array([1 - (1-se)*t[i]**m for i in range(tn)])
s[s>1] = 1
s[s<se] = se
return s
def valveopening(dt, tf, valve_op):
"""Define valve operation curve (percentage open v.s. time)
Parameters
----------
dt : float
Time step
tf : float
Simulation Time
valve_op : list
Contains parameters to define valve operation rule
valve_op = [tc,ts,se,m]
tc : the duration takes to close the valve [s]
ts : closure start time [s]
se : final open percentage [s]
m : closure constant [unitless]
Returns
-------
s : list
valve operation curve
"""
[tc,ts,se,m] = valve_op
tn = int(tf/dt)
# abrupt opening
if tc ==0:
s = np.array([((i*dt- ts))**1 for i in range(tn)])
s[s>0] = se
s[s<0] = 0
# gradual opening
else:
t = np.array([(i*dt- ts)/tc for i in range(tn)])
t[t>1] = 1
t[t<0] = 0
s = np.array([se* (t[i])**m for i in range(tn)])
s[s<0] = 0
s[s>se] = se
return s
dt = 0.1
tf = 2
t = np.arange(0, tf, dt)
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
valve_op = [tc,ts,se,m]
s1 = valveclosing(dt, tf, valve_op)
m = 2 # closure constant
valve_op = [tc,ts,se,m]
s2 = valveclosing(dt, tf, valve_op)
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 1 # end open percentage
m = 1 # closure constant
valve_op = [tc,ts,se,m]
s3 = valveopening(dt, tf, valve_op)
m = 2 # closure constant
valve_op = [tc,ts,se,m]
s4 = valveopening(dt, tf, valve_op)
import matplotlib
matplotlib.rcParams['pdf.fonttype'] = 42
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='k')
plt.subplot(1, 2, 1)
plt.plot(t,s1,'k-', label='m=1')
plt.plot(t,s2,'r-', label='m=2')
plt.xlim([t[0],t[-1]])
plt.title('(a)')
plt.xticks([0,1,t[-1]],['ts','ts + tc','tf'])
plt.yticks([0,0.2,0.4,0.6,0.8,1.0],['se','0.2','0.4','0.6','0.8','1.0'])
plt.xlabel("Time [s]")
plt.ylabel("Valve opening ratio")
plt.legend(loc='best')
plt.grid(True)
plt.subplot(1, 2, 2)
plt.plot(t,s3,'k-', label='m=1')
plt.plot(t,s4,'r-', label='m=2')
plt.xlim([t[0],t[-1]])
plt.title('(b)')
plt.xticks([0,1,t[-1]],['ts','ts + tc','tf'])
plt.yticks([0,0.2,0.4,0.6,0.8,1.0],['0','0.2','0.4','0.6','0.8','se'])
plt.xlabel("Time [s]")
plt.legend(loc='best')
plt.grid(True)
fig.savefig('./docs/figures/valve_operating.pdf', format='pdf',dpi=500)

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View File

@ -0,0 +1 @@
.. include:: ../HISTORY.rst

View File

@ -0,0 +1,24 @@
Transient Simulation in water Networks (TSNet)
==============================================
.. figure:: figures/highlight.png
:width: 600
:alt: highlight
TSNet is a Python package designed to perform transient simulation in water
distribution networks. The software includes capability to:
* Create transient models based on EPANET INP files
* Operate valves and pumps
* Add disruptive events including pipe bursts and leaks
* Model open and closed surge tanks
* Choose between steady,quasi-steady, and unsteady friction models
* Perform transient simulation using Method of characteristics (MOC) techniques
* Visualize results
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@ -0,0 +1,92 @@
.. highlight:: shell
============
Installation
============
Setup Python Environment
------------------------------
TSNet is tested against Python versions 3.5, 3.6, and 3.7.
It can be installed on Windows, Linux, and Mac OS X operating systems.
Python distributions, such as Anaconda, are recommended to manage the Python
environment as they already contain (or easily support installation of) many
Python packages (e.g. SciPy, NumPy, pandas, pip, matplotlib, etc.) that are
used in the TSNet package. For more information on Python package
dependencies, see :ref:`Dependencies`.
Stable Release (for users)
--------------------------
To install TSNet, run this command in your terminal:
.. code-block:: console
$ pip install tsnet
This is the preferred method to install tsnet, as it will always install the
most recent stable release.
If you don't have `pip`_ installed, this `Python installation guide`_ can guide
you through the process.
.. _pip: https://pip.pypa.io
.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/
From Sources (for developers)
-----------------------------
The sources for TSNet can be downloaded from the `Github repo`_.
You can either clone the public repository:
.. code-block:: console
$ git clone git://github.com/glorialulu/tsnet
Or download the `tarball`_:
.. code-block:: console
$ curl -OL https://github.com/glorialulu/tsnet/tarball/master
Once you have a copy of the source, you can install it with:
.. code-block:: console
$ python setup.py install
.. _Github repo: https://github.com/glorialulu/tsnet
.. _tarball: https://github.com/glorialulu/tsnet/tarball/master
.. _Dependencies:
Dependencies
------------
Requirements for TSNet include Python (3.5, 3.6, or 3.7) along with
several Python packages.
The following Python packages are required::
1. Numpy [VaCV11]_: the fundamental package needed for scientific computing with Python
included in Anaconda distribution
http://www.numpy.org/
2. Matplotlib [Hunt07]_: Python 2D plotting library
included in Anaconda distribution
http://matplotlib.org/
3. NetworkX [HaSS08]_: Network creation and manipulation engine,
install on a python-enabled command line with `pip install wntr`
https://networkx.github.io/
4. WNTR [WNTRSi]_: Water Network Tool for Resilience
install on a python-enabled command line with `pip install wntr`
http://wntr.readthedocs.io
5. pytest: Unit Tests engine
install on a python-enabled command line with `pip install -U pytest`
https://docs.pytest.org/en/latest/

View File

@ -0,0 +1,61 @@
=====================================
Software Conventions and Limitations
=====================================
Units
------
All data in TSNet is stored in the following International System (SI) units:
* Length = :math:`m`
* Diameter = :math:`m`
* Water pressure = :math:`m`
(this assumes a fluid density of 1000 :math:`kg/m^3`)
* Elevation = :math:`m`
* Mass = :math:`kg`
* Time = :math:`s`
* Demand = :math:`m^3/s`
* Velocity = :math:`m/s`
* Acceleration = :math:`g` (1 :math:`g` = 9.8 :math:`m/s^2`)
* Volume = :math:`m^3`
If the unit system specified in .inp file is US units,
it will be converted to SI unit in the simulation process.
When setting up analysis in TSNet, all input values
should be specified in SI units.
All simulation results are also stored in SI units.
Modelling Assumptions and Limitations
-------------------------------------
TSNet is constantly under development. Current software limitations are
as follows:
* Demands on the start and end nodes of pumps and valves are not supported.
If demands are defined on these nodes in the .inp file, they will be
ignored in transient simulation, and the simulation results may
not be accurate due to discrepancies between the initial conditions
and the first step in transient simulation. Warnings will be printed.
* Multi-branch junctions on the start and end nodes of pumps and valves
are not supported. It is assumed that valves and pumps are connected
by pipes in series.
* During transient simulation, demands are pressure dependent .
* Pipe Friction coefficients are converted to Darcy-Weisbach coefficients
based on initial conditions.
* Pipe bursts and leaks occur only on the nodes.
* Transient simulation relies on a feasible steady state solution;
hence, it is essential to verify that the steady state simulation
succeeds without errors.

BIN
Python/tsnet/docs/logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
Python/tsnet/docs/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@ -0,0 +1,106 @@
Introduction to TSNet
=======================
TSNet performs transient simulation in water networks using Method of Characteristics (MOC).
* Free software: MIT license
* Github: https://github.com/glorialulu/TSNet.git
* Documentation: https://tsnet.readthedocs.io.
Overview
---------
Hydraulic transients in water distribution networks (WDNs),
typically induced by pipe bursts, valve operations, and pump operations,
can disturb the steady-state flow conditions by introducing extreme pressure
variability and imposing abrupt internal pressure force
onto the pipeline systems [WOLB05]_.
These disturbances have been identified as one of the major contributing factors
in the many pipe deterioration and catastrophic failure in WDNs [RERS15]_,
thereby wasting a significant amount of treated water and creating unexpected
possibilities of contamination intrusion [ASCE17]_.
Consequently, transient simulation, as a prominent approach to
understand and predict the behavior of hydraulic transients,
has become an essential requirement for ensuring the distribution safety and
improving the efficiency in the process of design and operation of WDNs.
In addition to improving design and operation of WDNs,
various other transient-based applications, such as network calibration,
leak detection, sensor placement, and condition assessment,
has also enhanced the popularity and necessity of transient simulation
Acknowledgedly, a number of commercial software for transient simulation
in water distribution systems is available in the market;
however, the use of these software for research purposes is limited.
The major restriction is due to the fact that the programs are packed
as black boxes, and the source codes are not visible,
thus prohibiting any changes, including modification of
existing and implementation of new elements, in the source codes.
Additionally, the commercial software is designed to perform only
single transient simulations and do not have the capabilities to automate or
run multiple transient simulations.
Users are required to modify the boundary conditions using the GUI,
perform the simulation, and manually record the hydraulic responses
in the various conditions,
which significantly complicated the research process.
There is a clear gap that currently available simulation software
are not suitable for many research applications beyond the
conventional design purposes.
Hence, the motivation of this work is two-fold:
1. Provide users with open source and freely available python code
and package for simulating transients in water distribution systems
that can be integrated with other case specific applications,
e.g. sensor placement and event detection; and
2. Encourage users and developers to further develop and
extend the transient model.
Features
--------
TSNet is a Python package designed to perform transient simulation in water
distribution networks. The software includes capability to:
* Create transient models based on EPANET INP files
* Operating valves and pumps
* Add disruptive events including pipe bursts and leakages
* Choose between steady,quasi-steady, and unsteady friction models
* Perform transient simulation using Method of characteristics (MOC) techniques
* Visualize results
For more information, go to https://tsnet.readthedocs.io.
Version
-------
TSNet is a ongoing research project in the University of Texas at Austin.
The current version is 0.2.2, which is still a pre-release.
Contact
-------
* Lu Xing, the University of Texas at Austin, xinglu@utexas.edu
* Lina Sela, the University of Texas at Austin, linasela@utexas.edu
Disclaimer
----------
No warranty, expressed or implied, is made as to the correctness of the
results or the suitability of the application.
Cite TSNet
-----------
To cite TSNet, use one of the following references:
Xing, Lu, and Lina Sela. "Transient simulations in water distribution networks:
TSNet python package." Advances in Engineering Software 149 (2020): 102884.
License
-------
TSNet is released under the MIT license. See the LICENSE.txt file.

View File

@ -0,0 +1,35 @@
=========
Reference
=========
.. [WYSS93] Wylie, E. B., Streeter, V. L., & Suo, L. (1993). Fluid transients in systems (Vol. 1, p. 464). Englewood Cliffs, NJ: Prentice Hall.
.. [WNTRSi] Klise, K. A., Hart, D., Moriarty, D., Bynum, M. L., Murray, R., Burkhardt, J., & Haxton, T. (2017). Water network tool for resilience (WNTR) user manual. US Environmental Protection Agency, EPA/600/R-17/264, Cincinnati, OH.
.. [LAJW99] Larock, B. E., Jeppson, R. W., & Watters, G. Z. (1999). Hydraulics of pipeline systems. CRC press.
.. [STWV96] Street, R. L., Watters, G. Z., & Vennard, J. K. (1996). Elementary fluid mechanics. J. Wiley.
.. [WOLB05] Wood, D. J., Lingireddy, S., Boulos, P. F., Karney, B. W., & McPherson, D. L. (2005). Numerical methods for modeling transient flow in distribution systems. JournalAmerican Water Works Association, 97(7), 104-115.
.. [RERS15] Rezaei, H., Ryan, B., & Stoianov, I. (2015). Pipe failure analysis and impact of dynamic hydraulic conditions in water supply networks. Procedia Engineering, 119, 253-262.
.. [ASCE17] ASCE. (2017). 2017 infrastructure report card. Reston, VA: ASCE.
.. [VaCV11] van der Walt, S., Colbert, S.C., and Varoquaux, G. (2011). The NumPy array: A structure for efficient numerical computation. Computing in Science and Engineering, 13, 22-30.
.. [HaSS08] Hagberg, A.A., Schult, D.A., and Swart P.J. (2008). Exploring network structure, dynamics, and function using NetworkX. In Proceedings of the 7th Python in Science Conference (SciPy2008), August 19-24, Pasadena, CA, USA.
.. [Hunt07] Hunter, J.D. (2007). Matplotlib: A 2D graphics environment. Computing in Science and Engineering, 9(3), 90-95.
.. [MISI08] Misiūnas, D. (2008). Failure monitoring and asset condition assessment in water supply systems. Vilnius Gediminas Technical University.
.. [STWY67] Streeter, V. L., & Wylie, E. B. (1967). Hydraulic transients (No. BOOK). mcgraw-hill.
.. [OSBH08] Ostfeld, A., Uber, J. G., Salomons, E., Berry, J. W., Hart, W. E., Phillips, C. A., ... & di Pierro, F. (2008). The battle of the water sensor networks (BWSN): A design challenge for engineers and algorithms. Journal of Water Resources Planning and Management, 134(6), 556-568.
.. [VIBS06] Vítkovský, J. P., Bergant, A., Simpson, A. R., & Lambert, M. F. (2006). Systematic evaluation of one-dimensional unsteady friction models in simple pipelines. Journal of Hydraulic Engineering, 132(7), 696-708.
.. [VABR95] Vardy, A. E., & Brown, J. M. (1995). Transient, turbulent, smooth pipe friction. Journal of hydraulic research, 33(4), 435-456.
.. [HAMMER] Bentley, W. H. Transient Analysis Software.

View File

@ -0,0 +1,121 @@
====================
Simulation Results
====================
Results Structure
-----------------
Simulation results are returned and saved in the
:class:`tsnet.network.model.TransientModel` object
for each node and link in the networks.
Node results include the following attributes:
- Head [m]
- Emitter discharge (including leaks and bursts) [:math:`m^3/s`]
- Actual demand discharge [:math:`m^3/s`]
Link results include the following attributes:
- Head at start node [m]
- Flow velocity at start node [:math:`m^3/s`]
- Flow rate at start node [:math:`m^3/s`]
- Head at end node [m]
- Flow velocity at end node [:math:`m^3/s`]
- Flow rate at end node [:math:`m^3/s`]
The result for each attribute is a Numpy array, representing the time
history of the simulation results, the length of
which equals the total number of simulation time steps (:math:`tn`).
For example, the results of head, emitter discharge and demand discharge
at node 'JUNCTION-105' can be accessed by:
.. code:: python
node = tm.get_node['JUNCTION-105']
head = node.head
emitter_discharge = node.emitter_discharge
demand_discharge = node.demand_discharge
To obtain the results on pipe 'LINK-40':
.. code:: python
pipe = tm.get_link('LINK-40')
start_head = pipe.start_node_head
end_head = pipe.end_node_head
start_velocity = pipe.start_node_velocity
end_velocity = pipe.end_node_velocity
start_flowrate = pipe.start_node_flowrate
end_flowrate = pipe.end_node_flowrate
Time Step and Time Stamps
-------------------------
Additionally, the time step (in seconds) and the time stamps (in seconds
from the start of the simulation) are also stored in the
:class:`tsnet.network.model.TransientModel` object. They can be retrieved
by:
.. code:: python
dt = tm.time_step
tt = tm.simulation_timestamps
The results can then be plotted with respect to the time stamps using
**matplotlib** or any other preferred package, as shown in :numref:`tnet2_node`:
.. code:: python
import matplotlib.pyplot as plt
plt.plot(tt ,head)
.. _tnet2_node:
.. figure:: figures/tnet2_node.png
:width: 600
:alt: tnet2_node
Head results at JUNCTION-105
Results Retrieval
------------------
The :class:`tsnet.network.model.TransientModel` object, including
the information of the network, operation rules, and the simulated results,
is saved in the file **results_obj.obj**, located in the current folder.
The name of the results file is defined by the input parameter `result_obj`.
If `result_obj` is not given, the default results file is `results.obj`.
To retrieve the results from a previously completed simulation,
one can read the :class:`tsnet.network.model.TransientModel` object
from the **results_obj.obj** file and access results from the objet by:
.. code:: python
import pickle
file = open('results.obj', 'rb')
tm = pickle.load(file)
Runtime and Progress
---------------------
At the beginning of transient simulation,
TSNet will report the approximation simulation time
based on the calculation time of first few time
steps and the total number of time steps.
Additionally, the computation progress will also printed on the screen
as the simulation proceeds, as shown in :numref:`time`.
.. _time:
.. figure:: figures/time.PNG
:width: 200
:alt: time
Runtime output about calculation time and process.

View File

@ -0,0 +1,915 @@
==================================
Transient Modeling Framework
==================================
The framework of performing transient simulation using TSNet is shown in :numref:`flowchart`
The main steps of transient modelling and simulation in TSNet
are described in subsequent sections.
.. _flowchart:
.. figure:: figures/chart.png
:width: 400
:alt: flowchart
Flowchart of transient simulation in TSNet
Transient Model
---------------
The transient model inherits the
WNTR water network model [WNTRSi]_,
which includes
junctions, tanks, reservoirs, pipes, pumps, valves,
patterns,
curves,
controls,
sources,
simulation options,
and node coordinates.
It can be built directly from an EPANet INP file.
Sections of EPANet INP file that are not compatible with WNTR are
described in [WNTRSi]_.
Compared with WNTR water network model,
TSNet transient model adds the features
designed specifically for transient simulation, such as
spatial discretization,
temporal discretization,
valve operation rules,
pump operation rules,
burst opening rules,
surge tanks, and
storage of time history results.
For more information on the water network model, see
:class:`~tsnet.network.model.TransientModel` in the API documentation.
A transient model can be created directly from an EPANET INP file.
The following example build a transient model.
.. code:: python
inp_file = 'examples/networks/Tnet1.inp'
tm = tsnet.network.TransientModel(inp_file)
Initial Conditions
------------------
TSNet employed WNTR [WNTRSi]_ for simulating the steady state
in the network to establish the initial conditions for
the upcoming transient simulations.
**WNTRSimulators** can be used to run demand-driven (DD) or
pressure-dependent demand (PDD) hydraulics simulations, with the
capacity of simulating leaks. The default simulation engine is DD.
An initial condition simulation can be run using the following code:
.. code:: python
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
:math:`t_0` stands for the time when the initial condition will be
calculated. More information on the initializer can be found in
the API documentation, under
:class:`~tsnet.simulation.initialize.Initializer`.
Transient Simulation
---------------------------------
After the initial conditions are obtained, TSNet adopts
the Method of Characteristics (MOC)
for solving governing transient flow equations.
A transient simulation can be run using the following code:
.. code:: python
results_obj = 'Tnet1' # name of the object for saving simulation results
tm = tsnet.simulation.MOCSimulator(tm, results_obj)
The results will be returned to the transient model (tm) object,
and then stored in the 'Tnet1.obj' file for the easiness of retrieval.
In the following sections, an overview of the solution approaches
and boundary conditions is presented,
based on the following literature [LAJW99]_ , [MISI08]_, [WYSS93]_.
Governing Equations
""""""""""""""""""""""""""""""""""""""""""
Mass and Momentum Conservation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The transient flow is governed by the mass and momentum conservation
equation [WYSS93]_:
.. math::
\frac{\partial H}{\partial t} + \frac{a^2}{g} \frac{\partial V}{\partial x} - gV\sin \alpha = 0
\frac{1}{g}\frac{\partial V}{\partial t} + \frac{\partial H}{\partial x} + h_f = 0
where
:math:`H` is the head,
:math:`V` is the flow velocity in the pipe,
:math:`t` is time,
:math:`a` is the wave speed,
:math:`g` is the gravity acceleration,
:math:`\alpha` is the pipe slope,
and :math:`h_f` represents the head loss per unit length due to friction.
Method of Characteristics (MOC)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The Method of Characteristics (MOC) method is used to solve the system of
governing equations above. The essence of MOC is to transform the set of
partial differential equations to an equivalent set of ordinary differential
equations that apply along specific lines, i.e., characteristics lines
(C+ and C-), as shown below [LAJW99]_:
.. math::
C+: \ \ \ \frac{dV}{dt} + \frac{g}{a} \frac{dH}{dt} + g h_f - \frac{g}{a}V\sin\alpha = 0
\ \ \ \text{ along } \frac{dx}{dt} = a
C-: \ \ \ \frac{dV}{dt} - \frac{g}{a} \frac{dH}{dt} + g h_f - \frac{g}{a}V\sin\alpha = 0
\ \ \ \text{ along } \frac{dx}{dt} = -a
Headloss in Pipes
^^^^^^^^^^^^^^^^^
Steady/ quasi-steady friction model
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TSNet adopts Darcy-Weisbach equation to compute head loss, regardless of the
friction method defined in the EPANET .inp file. This package computes
Darcy-Weisbach coefficients (:math:`f`) based on the head loss per unit length
(:math:`{h_f}_0`) and flow velocity (:math:`V_0`) in initial condition,
using the following equation:
.. math::
f = \frac{{h_f}_0}{V_0^2/2gD}
where
:math:`D` is the pipe diameter,
and :math:`g` is gravity acceleration.
Subsequently, in transient simulation the headloss (:math:`h_f`) is calculated
based on the following equation:
.. math::
h_f = f\frac{V^2}{2gD}
Unsteady friction model
~~~~~~~~~~~~~~~~~~~~~~~
In addition to the steady friction model, TSNet includes the quasi-steady and
the unsteady friction models.
The head loss term (:math:`h_f`) can be expressed as a sum of steady/quasi-steady part
(:math:`{h_f}_s`) and unsteady part (:math:`{h_f}_u`), i.e., :math:`h_f={h_f}_s+ {h_f}_u`.
TSNet incorporates the instantaneous acceleration-based model [VIBS06]_ to calcualte the
unsteady friction:
.. math::
{h_f}_u = \frac{k_u}{2g} \left( \frac{\partial V}{\partial t} + a \cdot \mbox{sign}(V) \left| \frac{\partial V}{\partial x}\right| \right)
where
:math:`{h_f}_u` is the head loss per unit length due to unsteady friction,
:math:`\frac{\partial V}{\partial t}` is the local instantaneous acceleration,
:math:`\frac{\partial V}{\partial x}` is the convective instantaneous acceleration, and
:math:`k_u` is Brunone's friction coefficient, which can be analytically determined using
Vardy's sheer decay coefficient (:math:`C^*`) [VABR95]_:
.. math::
k_u = \frac{C^*}{2}
.. math::
C^* = \left\{ \begin{array}{rl}
0.00476 & \mbox{laminar flow } (Re \leq 2000)\\
\frac{7.41}{Re^{\log{(14.3/Re^{0.05})}}} & \mbox{turbulent flow } (Re > 2000)
\end{array} \right.
TSNet allows the user to choose the friction model using TSNet API simply by specifying
the friction model to be used in :class:`~tsnet.simulation.MOCSimulator`.
The friction argument can take three values: 'steady', 'quasi-steady', and 'unsteady':
.. code:: python
results_obj = 'Tnet3' # name of the object for saving simulation results
friction = 'unsteady' # or "steady" or "quasi-steady", by default "steady"
tm = tsnet.simulation.MOCSimulator(tm, results_obj, friction)
Pressure-driven Demand
^^^^^^^^^^^^^^^^^^^^^^^
During the transient simulation in TSNet, the demands are treated as
pressure-dependent discharge; thus, the actual demands will vary from
the demands defined in the INP file.
The actual demands (:math:`d_{actual}`) are modeled based on the
instantaneous pressure head at the node and the demand discharge coefficients,
using the following equation:
.. math::
d_{actual} = k \sqrt{H_p}
where :math:`H_p` is the pressure head
and :math:`k` is the demand discharge coefficient,
which is calculated from the initial demand (:math:`d_0`)
and pressure head (:math:`{H_p}_0`):
.. math::
k = \frac{d_0}{\sqrt{{H_p}_0}}
It should be noted that if the pressure head is negative,
the demand flow will be treated zero,
assuming that a backflow preventer is installed on each node.
Choice of Time Step
"""""""""""""""""""
The determination of time step in MOC is not a trivial task. There are two
constraints that have to be satisfied simultaneously:
1. The Courant's criterion has to be satisfied for each pipe,
indicating the maximum time step allowed in the network transient analysis
will be:
.. math::
\Delta t \leqslant \min{\left(\frac{L_i}{N_i a_i}\right)} \text{, }
i = 1 \text{, } 2 \text{, ..., } n_p
2. The time step has to be the same for all the pipes in the network, therefore
restricting the wave travel time :math:`\frac{L_i}{N_ia_i}` to be the same
for any computational unit in the network. Nevertheless, this is not
realistic in a real network, because different pipe lengths
and wave speeds usually cause different wave travel times. Moreover,
the number of sections in the :math:`i^{th}` pipe (:math:`N_i`) has to
be an integer due to the grid configuration in MOC; however, the
combination of time step and pipe length is likely to produce
non-integer value of :math:`N_i`, which then requires further adjustment.
This package adopted the wave speed adjustment scheme [WYSS93]_ to make
sure the two criterion stated above are satisfied.
To begin with, the maximum allowed time step (:math:`{\Delta t}_{max}`) is
calculated, assuming that there are two computational units
on the critical pipe (i.e., the pipe that results in the smallest travel time,
which depends on the length and the wave speed for that pipe):
.. math::
\Delta t_{max} = \min{\left(\frac{L_i}{2a_i}\right)} \text{, }
i = 1 \text{, } 2 \text{, ..., } n_p
After setting the initial time step, the following adjustments will be performed.
Firstly,
the :math:`i^{th}` pipes (:math:`p_i`) with length (:math:`L_i`) and wave
speed (:math:`a_i`) will be discretized into (:math:`N_i`) segments:
.. math::
N_i = \text{round}\left(\frac{L_i}{a_i \Delta t_{max}}\right) \text{, }
i = 1, 2, \dots, n_p
Furthermore, the discrepancies introduced by the rounding of :math:`N_i`
can be compensated by correcting the wave speed (:math:`a_i`).
.. math::
\Delta t = \mbox{argmin}_{\phi,\Delta t}{\left \{\sum_{i=1}^{n_p}{{\phi_i}^2} \ \ \big | \ \ \Delta t = \frac{L_i}{a_i(1 \pm \phi_i)N_i} \ \ i = 1, 2, \dots, n_p \right\} }
Least squares approximation is then used to determine :math:`\Delta t`
such that the sum of squares of the wave speed adjustments
(:math:`\sum{{\phi_i}^2}`) is minimized [MISI08]_.
Ultimately, an adjusted
:math:`\Delta t` can be determined and then used in the transient simulation.
It should be noted that even if the user defined time step satisfied the
Courant's criterion, it will still be adjusted.
If the user defined time step is greater than :math:`{\Delta t}_{max}`, a
fatal error will be raised and the program will be killed; if not, the
user defined value will be used as the initial guess for the upcoming
adjustment.
.. code:: python
dt = 0.1 # time step [s], if not given, use the maximum allowed dt
tf = 60 # simulation period [s]
tm.set_time(tf,dt)
The determination of time step is not
straightforward, especially in large networks.
Thus, we allow the user
to ignore the time step setting, in which case
:math:`{\Delta t}_{max}` will be used as the initial guess for the upcoming adjustment.
Alternatively, the user can also specify the number of segments on the critical pipe:
.. code:: python
N = 3 # number of computational units on the critical pipe, default 2.
tf = 60 # simulation period [s]
tm.set_time_N(tf,N)
Example
^^^^^^^
We use a small network, shown in :numref:`MOC_time`,
to illustrate how time step is determined
as well as the benefits and drawbacks of combining or removing small pipes.
:numref:`MOC_time` (a) shows a network of three pipes with length of 940m, 60m, and 2000m, respectively.
The wave speed for all the pipes is equal to 1000m/s.
The procedure for determine the time step is as follows:
* Calculate the maximum time step (:math:`\Delta t_{max}`)
allowed by Courant's criterion, assuming that there are two computational units
on the critical pipe (i.e., the pipe that results in the smallest travel time,
which depends on the length and the wave speed for that pipe), i.e., for pipe 2 :math:`N_2 = 2`.}
.. math::
\Delta t_{max} = \min{\left(\frac{L_i}{2a_i}\right)} = \left(\frac{L_2}{N_2a_2}\right) = \frac{60}{2\times 1000} = 0.03s
* Compute the required number of computational units for all other
pipes, i.e, :math:`N_1` for pipe 1 and :math:`N_3` for pipe 3, using :math:`\Delta t_{max}` as the time step.
Since the number of computational units on each pipe has to be integer,
the numbers are rounded to the closest integer, thus introducing discrepancies in the time step of different pipes.
.. math::
N_1 &= \text{round}\left(\frac{L_1}{a_1 \Delta t_{max}}\right) = \frac{940}{1000\times0.03} = 31
N_3 &= \text{round}\left(\frac{L_3}{a_3 \Delta t_{max}}\right) = \frac{2000}{1000\times0.03} = 67
With these number of computational units, the time steps for each pipe become:
.. math::
\Delta t_1 = \frac{L_1}{N_1a_1}=0.03032s
\Delta t_3 = \frac{L_3}{N_3a_3}=0.02985s
However, all the pipes have to have the same time step for marching forward;
hence, we need to adjust the wave speed to match the time step for all pipes.
.. math::
\Delta t =\frac{L_i}{a_i^{adj}N_i}
* Compensate the discrepancies introduced by rounding number of
computation units through adjusting wave speed from :math:`a_i` to :math:`a_i^{adj}=a_i(1+\phi_i)`.
The sum of squared adjustments (:math:`\sum{{\phi_i}^2}`) is minimized to obtain the minimal overall
adjustment. In this example, the wave speeds of the three pipes are adjusted by
:math:`\phi_1 = 0.877\, \phi_2 = -0.196\%, \phi_3 =0.693\%`, respectively.
* Finally, the time step can be calculated based on the number of
computational units and the adjusted wave speed of each one of three pipes that now share
the same time step:
.. math::
\Delta t = \frac{L_i}{a_i(1 \pm \phi_i)N_i}=0.03006s
.. _MOC_time:
.. figure:: figures/MOC_time_example.png
:width: 600
:alt: MOC_time
Example network for determining the time step: (a) before combing pipes; (b): after combing pipes.
Noticeably, the maximum allowed time step for this network is fairly small.
Meanwhile, the total number of segments (:math:`31+2+67=100`) is relatively large;
thus, in order to conduct a transient simulation of :math:`10s`,
the overall number of computation nodes in x-t plane will be :math:`10/0.03006\times100=33267`.
The computation efforts can be significantly reduced by, for example, combing/removing the shorted pipe, i.e., pipe 2.
:numref:`MOC_time` (b) illustrates the network after combing pipe 1 and pipe 2.
Following the same steps shown above, it can be determined that the maximum time step is :math:`0.5s`, and
the number of computation units for pipes 1 and 2 are :math:`2` and :math:`4`, respectively,
thus significantly reducing the total number of computation nodes in x-t plane required
for :math:`10s` simulation to :math:`10/0.5\times(2+4)=26`.
In this example, we implicitly assumed that pipe properties were the same (e.g., diameter, material),
however these properties affect wave propagation, reflection, and damping.
Hence, despite the benefits in reducing computation costs,
merging or removing pipes to improve computational efficiency
is not straightforward and requires careful considerations of how these changes will affect modeling accuracy.
In other words, any discontinuity or change in pipe properties will create changes in wave propagation, and hence,
if removed will change the model.
For example, suppose pipe 1 and 3 in :numref:`MOC_time` have the same diameter,
while pipe 2 has smaller diameter,
then a certain portion of wave speed will be reflected at junctions connecting the pipes.
However, if pipe 2 is to be removed, and pipe 1 is then connected to pipe 3, which exhibit the same diameter,
there will be no reflection observed in the new junction, thus altering the wave propagation in the network.
Therefore, precautions are required before removing or combing the short pipes,
or modifying network topology in general.
Moreover, the simulation time step can be controlled by specifying
large number of segments in the critical pipe, which will also control the
wave speed adjustments (:math:`\phi`), as shown in :numref:`wavev`
calculated for network Tnet1.
The black curve shows the reduction in the simulation time step as the number of segments
in the critical pipe increases.
Subsequently, the decreased time step results in a reduction in wave speed adjustment
(:math:`a^{adj} = a\times(1+\phi)`), as illustrated by the red curve.
The red line represents the average wave speed adjustment and the shaded area
represents the maximum and minimum wave speed adjustments for all pipes in the network.
For example, when the critical pipe is divided into 40 segments, the time step is reduced
to less than 0.001s, and
the adjustment of wave speed is reduced to about 0.005, which is negligibly small.
However, there is obviously a computational trade-off between numerical accuracy and
computational efficiency.
.. _wavev:
.. figure:: figures/wavespeed.png
:width: 400
:alt: wavev
Time step (black, left y-axis) versus the number of computational
units on the critical pipe and the wave speed adjustments (red, right y-axis)
showing the mean (red line) and the max-min range (shaded area).
Numerical Scheme
"""""""""""""""""""
The explicit MOC technique adopted to solve the compatibility equations
is explained in a simple network.
:numref:`MOC_grid_net` illustrates a simple piped network
and the corresponding MOC characteristic grid on the x-t plane.
Boundary nodes (represented by the void circles),
are defined by the physical elements in the network (or any discontinuity),
such as tanks, junctions, valves, pumps, leaks and bursts.
Inner nodes (represented by solid circles) are numerically specified to divide a single
pipe into several segments, i.e., *computational units*, so that the propagation of pressure waves
can be properly modeled.
The heads, :math:`H`, and flow velocities, :math:`V`, are computed for each computational node,
either boundary or inner node, and at each time based on the information at a previous time.
Depending on the type of the computational node (i.e. inner or boundary)
and the specific boundary condition,
the flows and heads may be allocated and computed differently.
:numref:`MOC_grid` shows a general example of two computational units for computing flow velocities and heads.
Note that for inner nodes, where there is no change in pipe or flow conditions,
:math:`H_2^t = H_3^t` and :math:`V_2^t = V_3^t`.
Otherwise, additional head/flow boundary conditions will be introduced between points 2 and 3
in addition to the two compatibility equations.
Detailed descriptions about different boundary conditions are discussed in the next section.
.. _MOC_grid_net:
.. figure:: figures/MOC_grid_net.png
:width: 600
:alt: MOC_grid_net
Topology of a simple network
.. _MOC_grid:
.. figure:: figures/MOC_grid.png
:width: 400
:alt: MOC_grid
MOC characteristic grids in x-t plane for two adjacent computational units
Steady/quasi-steady Friction Model
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The solution of the compatibility equations is achieved by integrating
the above equations along specific characteristic lines of the numerical grid,
which are solved to compute the head and flow velocity, :math:`H_i^t,V_i^t`,
at new point in time and space given that the conditions at the previous time step are known.
The two characteristic equations describing the hydraulic transients with steady friction model
(:math:`h_f = {h_f}_s = f\frac{V^2}{2gD}`) are discretized and formulated as:
.. math::
:label: com_steady
C+: &\qquad {} (V_i^t - V_{i-1}^{t-1}) + \frac{g}{a} (H_i^{t} - H_{i-1}^{t-1} )
+ \frac{f\Delta t}{2D}V_{i-1}^{t-1} |V_{i-1}^{t-1}|
+ \frac{g\Delta t}{a} V_{i-1}^{t-1}\sin\alpha= 0\\
C-: &\qquad {} (V_i^t - V_{i+1}^{t-1}) - \frac{g}{a} (H_i^{t} - H_{i+1}^{t-1} )
- \frac{f\Delta t}{2D}V_{i+1}^{t-1} |V_{i+1}^{t-1}|
- \frac{g\Delta t}{a} V_{i+1}^{t-1}\sin\alpha= 0
Once the MOC characteristic grid and numerical scheme are established,
the explicit time marching MOC scheme can be conducted in the computational units shown
in :numref:`MOC_grid` as follows:
* First, given initial conditions, the heads and flow velocities
at all computational nodes are known, and are updated for the next time step,
i.e. :math:`H_2^{t}, V_2^{t}, H_3^{t}`,
and :math:`V_3^{t}` will be updated based on
:math:`H_1^{t-1}, V_1^{t-1}, H_4^{t-1},` and :math:`V_4^{t-1}`.
* Then, the relation between :math:`H_2^t` and :math:`V_2^t` with known
:math:`H_1^{t-1}, V_1^{t-1}`, and properties of the computation unit 1,
such as wave speed (:math:`a_1`) and friction factor(:math:`f_1`) are established
along the positive characteristic line (:math:`C^+`):
.. math::
V_2^t + \frac{g}{a_1} H_2^t = V_1^{t-1} + \frac{g}{a_1} H_1^{t-1}
-\frac{f_1\Delta t}{2D_1}V_1^{t-1} |V_1^{t-1}| + \frac{g\Delta t}{a_1} V_1^{t-1}\sin\alpha_1
* Similarly, :math:`H_3^t` and :math:`V_3^t` is updated using the compatibility equations
along the negative characteristic line (:math:`C^-`) and
conditions at previous time step, :math:`H_4^{t-1}, V_4^{t-1}` :
.. math::
V_3^t - \frac{g}{a_2} H_3^t = -V_4^{t-1} + \frac{g}{a_2} H_4^{t-1}
+ \frac{f_2\Delta t}{2D_2}V_4^{t-1} |V_4^{t-1}| - \frac{g \Delta t}{a_2} V4^{t-1}\sin\alpha_2
* Subsequently, the system of equations is supplemented using
the boundary conditions at the node connecting the two computation units,
such as energy equations that specify the relation between :math:`H_2^t` and :math:`H_3^t`
and continuity equations for :math:`V_2^t` and :math:`V_3^t`.
Different boundary conditions can be defined to characterize different connections,
including valves, pumps, surge tanks, and pipe-to-pipe junctions with/or without
leak, burst, and demand.
For example, if the connection is a pipe-to-pipe junction with a leak, the boundary conditions
can be defined as:
.. math::
H_2^t = H_3^t; V_2^t A_1 = V_3^t A_2 + k_l \sqrt{H_2^t}
where, :math:`k_l` is the leakage coefficient and
:math:`A_1, A_2` are the cross-sectional area of computation units 1 and 2, respectively.
More boundary conditions are discussed in the next section.
* Ultimately, the system of equations containing compatibility equations,
and the two boundary conditions
can be solved for the four unknowns, i.e.,:math:`H_2^t, V_2^t, H_3^t`, and :math:`V_3^t`,
thus completing the time marching from :math:`t-1` to :math:`t`.
Unsteady Friction Model
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The local (:math:`\frac{\partial{V}}{\partial{x}}`)
and convective instantaneous (:math:`\frac{\partial{V}}{\partial{t}}`)acceleration terms
are approximated using finite-difference schemes
on the characteristic grid, as shown in :numref:`MOC_grid_unsteady`.
The explicit fist-order finite difference scheme is implemented such that the computation
of the acceleration terms does not interact with adjacent computational sections,
thus preserving the original structure of the MOC scheme.
Mathematically, the acceleration terms along positive and negative characteristic lines can
be represented as:
.. math::
C^+: & \frac{\partial{V}}{\partial{t}}^+ = \frac{V_1^{t-1}-V_1^{t-2}}{\Delta t}
& \frac{\partial{V}}{\partial{x}}^+ = \frac{V_2^{t-1}-V_1^{t-1}}{\Delta x} \\
C^-: & \frac{\partial{V}}{\partial{t}}^- = \frac{V_4^{t-1}-V_4^{t-2}}{\Delta t}
& \frac{\partial{V}}{\partial{x}}^- = \frac{V_4^{t-1}-V_3^{t-1}}{\Delta x}
.. _MOC_grid_unsteady:
.. figure:: figures/MOC_grid_unsteady.png
:width: 400
:alt: MOC_grid_unsteady
MOC characteristic grid with finite difference unsteady friction
Subsequently, the formulation of unsteady friction can be incorporated into
the compatibility equations with
additional terms describing the instantaneous acceleration-based unsteady friction model,
as below:
.. math::
:label: com_unsteady
C+: \qquad {}(V_i^t - V_{i-1}^{t-1}) + \frac{g}{a} (H_i^{t} - H_{i-1}^{t-1} )
+ \frac{g}{a} \Delta t V_{i-1}^{t-1}\sin\alpha
+ \frac{f\Delta x}{2D}V_{i-1}^{t-1} |V_{i-1}^{t-1}|\\
+ \frac{k_u}{2g} \left[ (V_{i-1}^{t-1} - V_{i-1}^{t-2}) +
\mbox{sign}(V_{i-1}^{t-1}) \left|V_i^{t-1} - V_{i-1}^{t-1} \right| \right] = 0\\
C-: \qquad {} (V_i^t - V_{i+1}^{t-1}) - \frac{g}{a} (H_i^{t} - H_{i+1}^{t-1} )
+ \frac{g}{a} \Delta t V_{i+1}^{t-1}\sin\alpha
- \frac{f\Delta x}{2D}V_{i+1}^{t-1} |V_{i+1}^{t-1}|\\
- \frac{k_u}{2g} \left[ (V_{i+1}^{t-1} - V_{i+1}^{t-2}) +
\mbox{sign}(V_{i+1}^{t-1}) \left|V_{i+1}^{t-1} - V_{i}^{t-1} \right| \right] = 0
Boundary Conditions
"""""""""""""""""""
Boundary conditions are required to characterize the devices or discontinuities,
such as such as tanks, junctions, valves, pumps, leaks and bursts, between two computational units.
Supplemented by the boundary conditions specifying the relations between :math:`H_2 ^t, H_3^t, V_2^t, V_3^t` as
in :numref:`MOC_grid` or :numref:`MOC_grid_unsteady`,
the compatibility equations (:eq:`com_steady` or :eq:`com_unsteady`)
can then be solved to obtain :math:`H_2 ^t, H_3^t, V_2^t`, and :math:`V_3^t`.
The following sections discuss the boundary conditions for devices and discontinuities in detail.
Surge tanks
^^^^^^^^^^^^
The modeling of water hammer protection devices, including the open and closed surge tanks,
are also incorporated in TSNet.
An open surge tank is modeled as an open chamber connected directly to a pipeline
and is open to the atmosphere [WYSS93]_.
Initially, the water head (:math:`z`) in the tank equals to the hydraulic head in the upstream pipeline.
During transient simulation, the open surge tank moderates pressure transients by
storing the excess water when a pressure jump occurs in the pipeline connection, or supplying water
in the event of a pressure drop.
Then, the boundary conditions at the open surge tank can be formulated as:
.. math::
:label: open_surge
&V_2^t A_1 - V_3^t A_2 = Q_T^t &\mbox{continuity}
&H_2^t = H_3^t &\mbox{energy conservation}
&H_2^t = z^t &\mbox{energy conservation}
&z^t = z^{t-1} + \frac{\Delta t }{a A_T}\left(Q_T^t + Q_T^{t-1}\right) &\mbox{tank water level}
where :math:`Q_T` is the flow rate into the surge tank,
:math:`z` is the water level in the surge tank, and
:math:`A_T` is the cross-sectional area of the surge tank.
With six equations (two compatity equations and four boundary conditions)
and six unknowns (:math:`V_2^t, V_3^t, H_2^t, H_3^t, z^t, Q_T^t`),
the above system of equations can be solved at each time step.
Other devices can be modeled as well by defining the corresponding boundary conditions to
replace :eq:`open_surge`.
In TSNet, an open surge tank is assumed to exhibit infinite height so that the tank never overflows.
The user can add an open surge tank to an existing network in the TSNet model by defining the desired
location and the cross-sectional area of the surge tank, as shown:
.. code:: python
tank_node = 'JUNCTION-90'
tank_area = 10 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area], 'open')
Although the infinite height assumption is not realistic, due to the modeling simplicity,
open surge tanks can serve an good initial approach for investigating the placement of surge protection devices.
In fact, the major disadvantages of open surge tanks is that it typically cannot accommodate
large pressure transients unless the tank is excessively tall and large, which limits its usefulness.
Hence, we also included closed surge tank, i.e., air chamber,
in TSNet as more realistic water hammer protection devices.
An air chamber is a relatively small sealed vessel with compressed air at its top and
water in the bottom [WYSS93]_.
During transient simulation, the closed surge tank also moderates pressure transients
by slowing down the deceleration or the acceleration of water flow. For example, when pressure
in the upstream connection increases, water flows into the tank, water level in the tank increases,
air volume compresses, and air pressure increases,
thus slowing down the acceleration of the water inflow into the tank and the increase in pressure.
Similarly, when pressure in the upstream connection drops, water flows from the tank,
then water level in the chamber decreases, air volume increases, and air pressure decreases,
thus slowing the deceleration of the water flow and the decrease of pressure head.
The boundary conditions characterizing close surge tank in the computational units
shown in :numref:`MOC_grid` are formulated as:
.. math::
& V_2^t A_1 - V_3^t A_2 = Q_T^t &\mbox{continuity}
& H_2^t = H^3_t &\mbox{energy conservation}
& H_A^t = H2^t + H_b - z_t &\mbox{energy conservation}
& z^t = z^{t-1} + \frac{\Delta t }{a A_T}\left(Q_T^t + Q_T^{t-1}\right) &\mbox{tank water level}
& H_A^t \mathcal{V}_A^t = \mbox{constant} &\mbox{perfect gas law}
& \mathcal{V}_A^t = \mathcal{V}_A^{t-1} - A_T \left(z^t-z^{t-1}\right) &\mbox{tank air volume}
where :math:`Q_T` is the flow rate into the surge tank,
:math:`z` is the water level in the surge tank,
:math:`H_A, \mathcal{V}_A` are the total head, and the volume of the air in the surge tank,
:math:`H_b` is the barometric pressure, and
:math:`A_T` is the cross-sectional area of the surge tank.
The user can add a closed surge tank by specifying the location, cross-sectional area,
total height of the surge tank, and initial water height in the tank:
.. code::
tank_node = 'JUNCTION-90'
tank_area = 10 # tank cross sectional area [m^2]
tank_height = 10 # tank height [m]
water_height = 5 # initial water level [m]
tm.add_surge_tank(tank_node, [tank_area,tank_height,water_height], 'closed')
Valve Operations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. Two types of valve are included in TSNet: end valve, located on the boundary
of a network, and inline valve, located in the middle of the network and
connected by one pipe on each end.
Valve operations, including closure and opening, are supported in TSNet.
The default valve shape is gate valve, the valve characteristics curve
of which is defined according to [STWV96]_.
The following examples illustrate how to perform valve operations.
Valve closure can be simulated by defining
the valve closure start time (:math:`ts`),
the operating duration (:math:`t_c`),
the valve open percentage when the closure is completed (:math:`se`),
and the closure constant (:math:`m`), which characterizes
the shape of the closure curve.
These parameters essentially define the valve closure curve.
For example, the code below will yield the blue curve
shown in :numref:`valve_closure`.
If the closure constant (:math:`m`) is
instead set to :math:`2`, the valve curve will then correspond to the
orange curve in :numref:`valve_closure`.
.. code:: python
tc = 1 # valve closure period [s]
ts = 0 # valve closure start time [s]
se = 0.5 # end open ratio
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
tm.valve_closure('VALVE',valve_op)
.. _valve_closure:
.. figure:: figures/valve_closure.png
:width: 500
:alt: valve_closure
Valve closure operating rule
Furthermore, valve opening can be simulated by defining a similar set of
parameters related to the valve opening curve. The valve opening curves
with :math:`m=1` and :math:`m=2` are illustrated in :numref:`valve_opening`.
.. code:: python
tc = 1 # valve opening period [s]
ts = 0 # valve opening start time [s]
se = 0.5 # end open ratio
m = 1 # opening constant [dimensionless]
valve_op = [tc,ts,se,m]
tm.valve_opening('VALVE',valve_op)
.. _valve_opening:
.. figure:: figures/valve_opening.png
:width: 500
:alt: valve_opening
Valve opening operating rule
Pump Operations
^^^^^^^^^^^^^^^^
The TSNet also includes the capability to perform controlled pump operations
by specifying how the pump rotation speed changes over time.
Explicitly, during pump start-up, the rotational speed of the pump
is increased based on the user defined operating rule.
The pump is then modeled using the two compatibility equations,
a continuity equation, the pump characteristic curve at given rotation speed,
and the affinity laws [LAJW99]_, thus resulting in
the rise of pump flowrate and the addition of mechanical energy.
Conversely, during pump shut-off, as the rotational speed of the pump
decreased according to the user defined operating rule,
the pump flowrate and the addition of mechanical energy decline.
However, pump shut-off due to power failure,
when the reduction of pump rotation speed
depends on the characteristics of the pump (such as the rotate moment of inertia),
has not been included yet.
The following example shows how to add pump shut-off event to the network,
where the parameters are defined in the same manner as in valve closure:
.. code:: python
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
Correspondingly, the controlled pump opening can be simulated using:
.. code:: python
tc = 1 # pump opening period [s]
ts = 0 # pump opening start time [s]
se = 1 # end open percentage [s]
m = 1 # opening constant [dimensionless]
pump_op = [tc,ts,se,m]
tm.pump_start_up('PUMP2',pump_op)
It should be noted that a check valve is assumed in each pump, indicating
that the reverse flow will be prevented immediately.
Leaks
^^^^^^^
In TSNet, leaks and bursts are assigned to the network nodes.
A leak is defined by specifying the leaking node name and the
emitter coefficient (:math:`k_l`):
.. code:: python
emitter_coeff = 0.01 # [ m^3/s/(m H20)^(1/2)]
tm.add_leak('JUNCTION-22', emitter_coeff)
Existing leaks should be included in the initial condition solver
(WNTR simulator);
thus, it is necessary to define the leaks before calculating
the initial conditions.
For more information about the inclusion of leaks in steady state
calculation, please refer to WNTR documentation [WNTRSi]_.
During the transient simulation, the leaking node is modeled
using the two compatibility equations, a continuity equation, and an orifice
equation which quantifies the leak discharge (:math:`Q_l`):
.. math::
Q_l = k_l \sqrt{{H_p}_l}
where :math:`{H_p}_l` is the pressure head at the leaking node.
Moreover, if the pressure head is negative, the leak discharge
will be set to zero, assuming a backflow preventer is installed
on the leaking node.
Bursts
^^^^^^
The simulation of burst and leaks is very similar. They share similar
set of governing equations. The only difference is that the burst opening
is simulated only during the transient calculation and not included in the
initial condition calculation.
In other words, using burst, the user can model new and evolving condition,
while the leak model simulates an existing leak in the system.
In TSNet, the burst is assumed to be developed
linearly, indicating that the burst area increases linearly from zero to
a size specified by the user during the specified time period.
Thus, a burst event can be modeled by defining the start and end time of the
burst, and the final emitter coefficient when the burst
is fully developed:
.. code:: python
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-20', ts, tc, final_burst_coeff)
Demand Pulse
^^^^^^^^^^^^
TSNet simulates transients generated by instantaneous demand pulse by allowing the demand
coefficient to change with time
We assume that the amplitude of a demand pulse (:math:`pa(t)`) follows a symmetrical trapezoidal
time-domain function, as illustrated in :numref:`demandpulse`; thus,
the demand pulse can be modeled by defining the start time (:math:`ts`),
the total duration (:math:`tc`), the transmission time (:math:`tp`),
and the peak of the amplitude (:math:`dp`).
Moreover, it should be noted that the assumed trapezoidal pulse shape is defined by method
*demandpulse()* in :class:`~tsnet.network.model` module.
It can be easily modified to take any shape with moderate coding efforts.
Subsequently, the time-varying demand coefficient is defined as
:math:`k(t) = k_0 + k_0\times pa(t)`.
.. _demandpulse:
.. figure:: figures/DemandMultiplier.png
:width: 300
:alt: demandpulse
Demand pulse curve
A demand pulse shape is defined and assigned to a specified junction:
.. code:: python
tc = 1 # total demand period [s]
ts = 1 # demand pulse start time [s]
tp = 0.2 # demand pulse transmission time [s]
dp = 1 # demand peak amplitude [unitless]
demand_pulse = [tc,ts,tp,dpa]
tm.add_demand_pulse('N2',demand_pulse)

View File

@ -0,0 +1,37 @@
===============
Getting Started
===============
To use tsnet in a project, open a Python console and import the package::
import tsnet
Simple example
---------------
A simple example, Tnet1_valve_closure.py is included in the examples folder.
This example demonstrates how to:
* Import tsnet
* Generate a transient model
* Set wave speed
* Set time step and simulation period
* Perform initial condition calculation
* Define valve closure rule
* Run transient simulation and save results to .obj file
* Plot simulation results
.. literalinclude:: ../examples/Tnet1_valve_closure.py
:lines: 2-42
Three additional EPANET INP files and example files are also included
in the TSNet examples repository in the examples folder.
Example networks range from a simple 8-node network to a 126-node network.

View File

@ -0,0 +1,163 @@
======================
Comparison with Hammer
======================
During the development process, we have consistently compared TSNet results with
Bentley Hammer [HAMMER]_ using different networks and many different transient events.
In this section, we present the comparison between TSNet and Hammer results.
The Hammer models used to generate the events is also included
in the GitHub example directory (https://github.com/glorialulu/TSNet/tree/master/examples/networks)
for the user's reference.
Tnet 0
^^^^^^^^^
We first show the comparison for a simple network,
consisting of one reservoir, two pipes, and one valve, as illustrated in :numref:`tnet0_network`.
The wave speed for both pipes is :math:`1200m/s`, and lengths and diameters are given in the figure.
The transient event is generated by closing the end-valve at the beginning of the simulation
during 2s; thus, the flow rate at the end valve decreases linearly from :math:`0.05m^3/s` at :math:`t=0s` to
:math:`0m^3/s` at :math:`t=2s` and remains zero thereafter.
:numref:`tnet0_hammer` (a) shows the flow rate through the valve, and
:numref:`tnet0_hammer` (b) presents the pressure transients generated at node N-1 during 60s simulation period.
The solid line represents TSNet results and the dashed-dotted line shows Hammer results.
These results indicate a perfect match between TSNet and Hammer simulation results for this simple network.
.. _tnet0_network:
.. figure:: figures/tnet0_network.png
:width: 500
:alt: tnet0_network
Topology of a simple network.
.. _tnet0_hammer:
.. figure:: figures/tnet0_calibration.png
:width: 500
:alt: tnet0_hammer
Comparison of TSNet and Hammer results: (a) flow at the valve; (b) pressure head at N-1.
Tnet 3
^^^^^^^
We then show the comparison between TSNet and Hammer results for
a more complicated network, Tnet3,
for three different transient events:
1. Shut down of PUMP-1,
2. Burst at JUNCTION-73, and
3. Closure of VALVE-1.
The results for the three transient-generating events are shown in
:numref:`pump_hammer`, :numref:`burst_hammer`, and :numref:`valve_hammer`, respectively.
.. The Hammer model that was used to generate the events is also included
in the GitHub example directory for the user's reference.
* We would like to note beforehand that we do not expect to
obtain the exact same results from TSNet
as Hammer since different numerical schemes were implemented,
such as wave speed adjustment, pressure dependent demand, and boundary conditions.
.. In fact, due to the fact that Hammer is a closed-source software,
we do not know precisely what numerical schemes are implemented in Hammer,
which directly motivated us to develop TSNet in the first place.
Pump shut-down
~~~~~~~~~~~~~~~~~
Both TSNet and Hammer are utilized to simulate
the shut down of PUMP-1.
The time step is specified as 0.002s in both software.
:numref:`pump_hammer` reports the pressure change with respect to the nominal pressure
at multiple junctions, where the solid lines represent TSNet results
and the dashed lines show Hammer results.
TSNet and Hammer results are very similar to each other
in terms of attenuation and phase shift throughout the 20s simulation period,
despite slight discrepancies, which can be explained by
the different wave speed adjustment schemes and boundary condition configurations adopted
by the two software.
.. _pump_hammer:
.. figure:: figures/tnet3_pump_hammer_002.png
:width: 500
:alt: pump_hammer
Comparison of pressure transients at multiple junctions generated by shutting down PUMP-1 in TNet3:
TSNet (solid lines) Hammer (dashed lines) results.
.. Moreover, we tested the consistency of the solution when altering
the time step of the simulation in TSNet and Hammer.
We simulated the pump shut-down event with different time steps, i.e., :math:`dt = \{0.002s, 0.0055, 0.0115s\}`
and plot the results in :numref:`convergence`.
The green and purple lines represent the pressure at JUNCTION-30, and JUNCTION-90, respectively,
and the different line types (solid, dashed, dotted) represent different time steps (see legend).
:numref:`convergence` (a) represents the results from TSNet, and
:numref:`convergence` (b) shows the results from Hammer.
We observe that the pressure transients simulated by TSNet with different time steps, resemble closely
with each other, and all of pressure traces disclose anticipated level of details about the reflection,
transmission, propagation, and attenuation of the pressure waves.
However, the Hammer predicts significantly different and uncharacteristic results with time steps larger than
0.002s (i.e., :math:`dt =\{0.0055s, 0.0115s\}`), with small transient amplitude, delayed pressure peaks,
and high attenuation.
The pressure transients exhibit consistency only when the time step is smaller than 0.002s,
which is the reason why we chose time step as 0.002s to compare the results from Hammer and TSNet.
Burst event
~~~~~~~~~~~
Aburst event was simulated at Junction-73 using both TSNet and Hammer.
:numref:`burst_hammer` reports the pressure change with respect to the nominal pressure
at multiple junctions, where the solid lines represent TSNet results,
and the dashed lines show Hammer results.
It can be observed that during the first transient cycle, i.e., around 0-8s,
TSNet and Hammer results exhibit very good agreement with each other.
Although the discrepancies increase a bit in terms of attenuation and phase shift during the latter period,
the overall match is satisfactory considering that different time step and wave speed adjustment schemes
are adopted in the two software.
.. _burst_hammer:
.. figure:: figures/tnet3_burst_hammer.png
:width: 500
:alt: burst_hammer
Comparison of pressure transients at multiple junctions generated by the burst at JUNCTION-73 in Tnet3:
TSNet (solid lines) Hammer (dashed lines) results.
Valve closure
~~~~~~~~~~~~~
Both TSNet and Hammer are utilized to simulate
the closure of VALVE-1.
The comparison of the results is presented in :numref:`valve_hammer`.
Again, adequate resemblance can be observed between the TSNet (a) and
Hammer results (b). Considering that pressure transients are of smaller amplitude and
more chaotic, the results are presented in two separate plots with same scale for clarity.
.. _valve_hammer:
.. figure:: figures/tnet3_valve_hammer.png
:width: 500
:alt: valve_hammer
Comparison of pressure transients at multiple junctions generated by closing VALVE-1 in Tnet3:
(a): TSNet results, (b): Hammer results.
.. In summary, we are able to show adequate consistency between TSNet and Hammer
results in two networks undergoing different transient events.
In the Reservoir-Pipe-Valve network, shown in :numref:`tnet0_network`, TSNet and Hammer predict exact same
pressure and flow results when a transient event is generated by gradually closing the end-valve.
In the larger network, TSNet and Hammer results are remarkably similar with each other despite minor discrepancies
due to the differences in modeling and numerical schemes.
Moreover, as presented in :numref:`convergence`,
TSNet performs better with relatively large time step than Hammer.

View File

@ -0,0 +1,2 @@
tsnet
moc

BIN
Python/tsnet/examples/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,28 @@
import tsnet
# Open an example network and create a transient model
inp_file = 'networks/Tnet00.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.1
tf = 60 # simulation period [s]
tm.set_time(tf,dt)
# Set valve closure
tc = 0 # valve closure period [s]
ts = 2 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet0' # name of the object for saving simulation results
tm1 = tsnet.simulation.MOCSimulator(tm, results_obj)

View File

@ -0,0 +1,85 @@
import tsnet
# Open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet0.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.01
tf = 25 # simulation period [s]
tm.set_time(tf,dt)
# Set valve closure
tc = 0 # valve closure period [s]
ts = 0 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc, ts, se, m]
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'PDD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet0' # name of the object for saving simulation results
friction = 'steady'
tm1 = tsnet.simulation.MOCSimulator(tm, results_obj, friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time(tf,dt)
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
friction = 'quasi-steady'
tm2 = tsnet.simulation.MOCSimulator(tm, results_obj, friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time(tf,dt)
# Set valve closure
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
friction = 'unsteady'
tm3 = tsnet.simulation.MOCSimulator(tm, results_obj, friction)
#%%
# report results
import matplotlib.pyplot as plt
node = '2'
head1 = tm1.get_node(node).head
t1 = tm1.simulation_timestamps
head2 = tm2.get_node(node).head
t2 = tm2.simulation_timestamps
head3 = tm3.get_node(node).head
t3 = tm3.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, head1, 'k',label='steady', linewidth=2.5)
plt.plot(t2, head2, 'b', label='quasi-steady', linewidth=2.5)
plt.plot(t3, head3, 'r',label='unsteady', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head [m]")
plt.legend(loc='best')
plt.show()
fig.savefig('tnet0_unsteady_friction.pdf', format='pdf',dpi=500)

View File

@ -0,0 +1,120 @@
import tsnet
# Open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet0.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.1
tf = 60 # simulation period [s]
tm.set_time(tf,dt)
# Set valve closure
tc = 0 # valve closure period [s]
ts = 2 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
tank_height = 100 # tank height [m]
water_height = 50 # initial water level [m]
tank_node = '2'
tank_area = 100 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area], 'open')
# Transient simulation
results_obj = 'Tnet0' # name of the object for saving simulation results
tm1 = tsnet.simulation.MOCSimulator(tm, results_obj)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time(tf,dt)
# Set valve closure
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
tank_height = 100 # tank height [m]
water_height =40 # initial water level [m]
tank_node = '2'
tank_area = 10 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area,tank_height,water_height], 'closed')
# Transient simulation
results_obj = 'Tnet0' # name of the object for saving simulation results
tm2 = tsnet.simulation.MOCSimulator(tm, results_obj)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time(tf,dt)
# Set valve closure
tm.valve_closure('3',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet0' # name of the object for saving simulation results
tm3 = tsnet.simulation.MOCSimulator(tm, results_obj)
#%%
# report results
import matplotlib.pyplot as plt
node = '3'
norm_head_nl1 = tm1.get_node(node).head - tm1.get_node(node).head[0]
norm_head_nl2 = tm2.get_node(node).head - tm2.get_node(node).head[0]
norm_head_nl3 = tm3.get_node(node).head - tm3.get_node(node).head[0]
fig1 = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm.simulation_timestamps,norm_head_nl1,'r-',label='w surge tank $A_s=10m^2$', linewidth=2.5)
plt.plot(tm.simulation_timestamps,norm_head_nl2,'g-',label='w surge tank $A_s=100m^2$', linewidth=2.5)
plt.plot(tm.simulation_timestamps,norm_head_nl3,'k-',label='wo surge tank', linewidth=2.5)
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.title('Node %s' %node)
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head Change [m]")
plt.legend(loc='best')
plt.grid(False)
plt.show()
# fig1.savefig('./docs/figures/tnet1_node.png', format='png',dpi=100)
#%%
# report results
import matplotlib.pyplot as plt
node1 = tm1.get_node(tank_node)
t1 = tm1.simulation_timestamps
node2 = tm2.get_node(tank_node)
t2 = tm1.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, node1.tank_flow_timeseries, 'r',label='w surge tank $A_s=10m^2$', linewidth=2.5)
plt.plot(t2, node2.tank_flow_timeseries, 'g',label='w surge tank $A_s=100m^2$', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Flow into tank [m^3s]")
plt.legend(loc='best')
plt.grid(True)
plt.show()

View File

@ -0,0 +1,84 @@
import tsnet
#%%
# Open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet1.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.1 # time step [s], if not given, use the maximum allowed dt
tf = 20 # simulation period [s]
tm.set_time(tf,dt)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Add demand pulse
tc = 1 # total demand period [s]
ts = 1 # demand pulse start time [s]
tp = 0.2 # demand pulse increase time [s]
dp = 1 # demand pulse increase multiples [s]
demand_pulse = [tc,ts,tp,dp]
tm.add_demand_pulse('N2',demand_pulse)
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
tm = tsnet.simulation.MOCSimulator(tm, results_obj)
node = 'N2'
node = tm.get_node(node)
head1 = node.head
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.1 # time step [s], if not given, use the maximum allowed dt
tf = 20 # simulation period [s]
tm.set_time(tf,dt)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Add demand pulse
tc = 1 # total demand period [s]
ts = 1 # demand pulse start time [s]
tp = 0.2 # demand pulse increase time [s]
dp = 1 # demand pulse increase multiples [s]
demand_pulse = [tc,ts,tp,dp]
tm.add_demand_pulse('N2',demand_pulse)
tc = 1 # total demand period [s]
ts = 2 # demand pulse start time [s]
tp = 0.2 # demand pulse increase time [s]
dp = 1 # demand pulse increase multiples [s]
demand_pulse = [tc,ts,tp,dp]
tm.add_demand_pulse('N4',demand_pulse)
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
tm = tsnet.simulation.MOCSimulator(tm, results_obj)
node = 'N2'
node = tm.get_node(node)
head2 = node.head
# report results
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm.simulation_timestamps,head1, 'k', label ='dpa =1', linewidth=2.5)
plt.plot(tm.simulation_timestamps,head2, 'r', label ='dpa =2', linewidth=2.5)
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head [m]")
plt.legend(loc='best')
plt.show()
fig.savefig('demand_pulse_N2.pdf', format='pdf',dpi=500)

View File

@ -0,0 +1,28 @@
import tsnet
# Open an example network and create a transient model
tm = tsnet.network.TransientModel('/Users/luxing/Code/TSNet/examples/networks/Tnet1.inp')
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tf = 20 # simulation period [s]
tm.set_time(tf)
# Set valve closure
ts = 5 # valve closure start time [s]
tc = 1 # valve closure period [s]
se = 0 # end open percentage [s]
m = 2 # closure constant [dimensionless]
tm.valve_closure('VALVE',[tc,ts,se,m])
# Initialize steady state simulation
t0=0
tm = tsnet.simulation.Initializer(tm,t0)
# Transient simulation
tm = tsnet.simulation.MOCSimulator(tm)
# report results
node = ['N2','N3']
tm.plot_node_head(node)

View File

@ -0,0 +1,125 @@
import tsnet
import numpy as np
# Open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet1.inp'
# Set valve closure
tc = 0.6 # valve closure period [s]
ts = 0 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.1 # time step [s], if not given, use the maximum allowed dt
tf = 60 # simulation period [s]
n = 6
tm.set_time_N(tf,n)
# Set valve closure
tm.valve_closure('VALVE', valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
tank_height = 10 # tank height [m]
water_height = 5 # initial water level [m]
tank_node = 'N5'
tank_area = 10 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area,tank_height,water_height], 'closed')
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
friction = 'steady'
tm1 = tsnet.simulation.MOCSimulator(tm, results_obj,friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time_N(tf,n)
tm.valve_closure('VALVE', valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
tank_height = 10 # tank height [m]
water_height = 5 # initial water level [m]
tank_node = 'N5'
tank_area = 100 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area,tank_height,water_height], 'closed')
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
friction = 'steady'
tm2= tsnet.simulation.MOCSimulator(tm, results_obj,friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time_N(tf,n)
tm.valve_closure('VALVE', valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
friction = 'steady'
tm3= tsnet.simulation.MOCSimulator(tm, results_obj,friction)
#%%
# report results
import matplotlib.pyplot as plt
node = 'N2'
head1 = tm1.get_node(node).head
t1 = tm1.simulation_timestamps
head2 = tm2.get_node(node).head
t2 = tm2.simulation_timestamps
head3 = tm3.get_node(node).head
t3 = tm3.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, head1, 'r',label='w surge tank $A_s=10m^2$', linewidth=2.5)
plt.plot(t2, head2, 'g', label='wo surge tank $A_s=100m^2$', linewidth=2.5)
plt.plot(t3, head3, 'k', label='wo surge tank', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.title(node)
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head [m] ")
plt.legend(loc='best')
plt.show()
# %%
# report results
import matplotlib.pyplot as plt
node1 = tm1.get_node(tank_node)
t1 = tm1.simulation_timestamps
node2 = tm2.get_node(tank_node)
t2 = tm1.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, node1.tank_flow_timeseries, 'r',label='w surge tank $A_s=10m^2$', linewidth=2.5)
#plt.plot(t2, node2.tank_flow_timeseries, 'g',label='w surge tank $A_s=100m^2$', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Flow into tank [m^3/s]")
plt.legend(loc='best')
plt.grid(True)
plt.show()
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, node1.water_level_timeseries, 'r',label='w surge tank $A_s=10m^2$', linewidth=2.5)
#plt.plot(t2, node2.water_level_timeseries, 'g',label='w surge tank $A_s=100m^2$', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Water level in tank [m]")
plt.legend(loc='best')
plt.show()

View File

@ -0,0 +1,111 @@
import tsnet
import numpy as np
# Open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet1.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
dt = 0.1 # time step [s], if not given, use the maximum allowed dt
tf = 60 # simulation period [s]
n = 100
tm.set_time_N(tf,n)
# Set valve closure
tc = 0.6 # valve closure period [s]
ts = 0 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
percent_open = np.linspace(100,0,11)
kl = [1/0.2, 2.50, 1.25, 0.625, 0.333, 0.17,
0.100, 0.0556, 0.0313, 0.0167, 0.0]
curve = [(percent_open[i], kl[i]) for i in range(len(kl))]
tm.valve_closure('VALVE', valve_op,curve)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
friction = 'steady'
tm1 = tsnet.simulation.MOCSimulator(tm, results_obj,friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time_N(tf,n)
# Set valve closure
tc = 0.6 # valve closure period [s]
ts = 0 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
tm.valve_closure('VALVE',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
friction = 'quasi-steady'
tm2 = tsnet.simulation.MOCSimulator(tm, results_obj,friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.) # m/s
# Set time options
tm.set_time_N(tf,n)
# Set valve closure
tc = 0.6 # valve closure period [s]
ts = 0 # valve closure start time [s]
se = 0 # end open percentage [s]
m = 1 # closure constant [dimensionless]
valve_op = [tc,ts,se,m]
tm.valve_closure('VALVE',valve_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0 [s]
engine = 'DD' # demand driven simulator
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet1' # name of the object for saving simulation results
friction = 'unsteady'
tm3 = tsnet.simulation.MOCSimulator(tm, results_obj,friction)
#%%
# report results
import matplotlib.pyplot as plt
node = 'N2'
head1 = tm1.get_node(node).head
t1 = tm1.simulation_timestamps
head2 = tm2.get_node(node).head
t2 = tm2.simulation_timestamps
head3 = tm3.get_node(node).head
t3 = tm3.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, head1, 'k',label='steady', linewidth=2.5)
plt.plot(t2, head2, 'b', label='quasi-steady', linewidth=2.5)
plt.plot(t3, head3, 'r',label='unsteady', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head [m]")
plt.legend(loc='best')
plt.show()
fig.savefig('tnet1_unsteady_friction.pdf', format='pdf',dpi=500)
# %%

View File

@ -0,0 +1,59 @@
import tsnet
# open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet2.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Set pump shut off
tc = 1 # pump closure period
ts = 1 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or PPD
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet2' # name of the object for saving simulation results.head
tm = tsnet.simulation.MOCSimulator(tm,results_obj)
#%%
# report results
import matplotlib.pyplot as plt
node = 'JUNCTION-105'
node = tm.get_node(node)
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='w')
plt.plot(tm.simulation_timestamps, node._head, 'k', lw=3)
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
# plt.title('Pressure Head at Node %s '%node)
plt.xlabel("Time [s]", fontsize=14)
plt.ylabel("Pressure Head [m]", fontsize=14)
# plt.legend(loc='best')
# plt.grid(True)
plt.show()
# fig.savefig('./docs/figures/tnet2_node.png', format='png',dpi=100)
pipe = 'PIPE-109'
pipe = tm.get_link(pipe)
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='w')
plt.plot(tm.simulation_timestamps,pipe.start_node_velocity,label='Start Node')
plt.plot(tm.simulation_timestamps,pipe.end_node_velocity,label='End Node')
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.title('Velocity of Pipe %s '%pipe)
plt.xlabel("Time [s]")
plt.ylabel("Velocity [m/s]")
plt.legend(loc='best')
plt.grid(True)
plt.show()
# fig.savefig('./docs/figures/tnet2_pipe.png', format='png',dpi=100)

View File

@ -0,0 +1,83 @@
import tsnet
# open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet2.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Set pump shut off
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or PPD
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet2' # name of the object for saving simulation results.head
tm1 = tsnet.simulation.MOCSimulator(tm,results_obj)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Set pump shut off
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or PPD
tm = tsnet.simulation.Initializer(tm, t0, engine)
tank_node = 'JUNCTION-105'
tank_height = 10 # tank height [m]
water_height = 5 # initial water level [m]
tank_area = 10 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area,tank_height,water_height], 'closed')
# Transient simulation
results_obj = 'Tnet2' # name of the object for saving simulation results.head
tm2 = tsnet.simulation.MOCSimulator(tm,results_obj)
#%%
# report results
import matplotlib.pyplot as plt
node = '169'
head1 = tm1.get_node(node).head
t1 = tm1.simulation_timestamps
head2 = tm2.get_node(node).head
t2 = tm2.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, head1, 'k',label='wo surge tank', linewidth=2.5)
plt.plot(t2, head2, 'r', label='w surge tank', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head [m]")
plt.legend(loc='best')
plt.show()
fig.savefig('tnet2_surge_tank.pdf', format='pdf',dpi=500)
# fig.savefig('./docs/figures/tnet2_node.png', format='png',dpi=100)

View File

@ -0,0 +1,107 @@
import tsnet
# open an example network and create a transient model
inp_file = 'networks/Tnet2.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.)
# Set time step
tf = 10 # simulation period [s]
tm.set_time(tf)
# Set pump shut off
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or PPD
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet2' # name of the object for saving simulation results.head
friction ='steady'
tm1 = tsnet.simulation.MOCSimulator(tm,results_obj,friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.)
# Set time step
tf = 10 # simulation period [s]
tm.set_time(tf)
# Set pump shut off
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or PPD
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet2' # name of the object for saving simulation results.head
friction ='quasi-steady'
tm2 = tsnet.simulation.MOCSimulator(tm,results_obj,friction)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm.set_wavespeed(1200.)
# Set time step
tf = 10 # simulation period [s]
tm.set_time(tf)
# Set pump shut off
tc = 1 # pump closure period
ts = 0 # pump closure start time
se = 0 # end open percentage
m = 1 # closure constant
pump_op = [tc,ts,se,m]
tm.pump_shut_off('PUMP2', pump_op)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or PPD
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
results_obj = 'Tnet2' # name of the object for saving simulation results.head
friction ='unsteady'
tm3 = tsnet.simulation.MOCSimulator(tm,results_obj,friction)
#%%
# report results
import matplotlib.pyplot as plt
node = 'JUNCTION-105'
head1 = tm1.get_node(node).head
t1 = tm1.simulation_timestamps
head2 = tm2.get_node(node).head
t2 = tm2.simulation_timestamps
head3 = tm3.get_node(node).head
t3 = tm3.simulation_timestamps
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(t1, head1, 'k',label='steady', linewidth=2.5)
plt.plot(t2, head2, 'b', label='quasi-steady', linewidth=2.5)
plt.plot(t3, head3, 'r',label='unsteady', linewidth=2.5)
plt.xlim([t1[0],t1[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Pressure Head [m]")
plt.legend(loc='best')
plt.show()
fig.savefig('tnet2_unsteady_friction.pdf', format='pdf',dpi=500)
# fig.savefig('./docs/figures/tnet2_node.png', format='png',dpi=100)

View File

@ -0,0 +1,91 @@
import tsnet
# open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet3.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
import numpy as np
wavespeed = np.random.normal(1200., 100., size=tm.num_pipes)
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add leak
# emitter_coeff = 0.01 # [ m^3/s/(m H20)^(1/2)]
# tm.add_leak('JUNCTION-22', emitter_coeff)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-20', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'PDD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
tm = tsnet.simulation.MOCSimulator(tm,result_obj)
# report results
import matplotlib.pyplot as plt
node = 'JUNCTION-22'
node = tm.get_node(node)
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm.simulation_timestamps,node.emitter_discharge)
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.title('Leak discharge at Node %s '%node)
plt.xlabel("Time [s]")
plt.ylabel("Leak discharge [m^3/s]")
plt.legend(loc='best')
plt.grid(True)
plt.show()
# fig.savefig('./docs/figures/tnet3_leak.png', format='png',dpi=100)
node = 'JUNCTION-20'
node = tm.get_node(node)
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm.simulation_timestamps,node.emitter_discharge)
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.title('Burst discharge at Node %s '%node)
plt.xlabel("Time [s]")
plt.ylabel("Burst discharge [m^3/s]")
plt.legend(loc='best')
plt.grid(True)
plt.show()
# fig.savefig('./docs/figures/tnet3_burst.png', format='png',dpi=100)
pipe = 'LINK-40'
pipe = tm.get_link(pipe)
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm.simulation_timestamps,pipe.start_node_velocity,label='Start Node')
plt.plot(tm.simulation_timestamps,pipe.end_node_velocity,label='End Node')
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.title('Velocity of Pipe %s '%pipe)
plt.xlabel("Time [s]")
plt.ylabel("Velocity [m/s]")
plt.legend(loc='best')
plt.grid(True)
plt.show()
# fig.savefig('./docs/figures/tnet3_pipe.png', format='png',dpi=100)
node1 = tm.get_node('JUNCTION-8')
node2 = tm.get_node('JUNCTION-16')
node3 = tm.get_node('JUNCTION-45')
node4 = tm.get_node('JUNCTION-90')
fig = plt.figure(figsize=(10,4), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm.simulation_timestamps, node1._head, label='JUNCTION-8')
plt.plot(tm.simulation_timestamps, node2._head, label='JUNCTION-16')
plt.plot(tm.simulation_timestamps, node3._head, label='JUNCTION-45')
plt.plot(tm.simulation_timestamps, node4._head, label='JUNCTION-90')
plt.xlim([tm.simulation_timestamps[0],tm.simulation_timestamps[-1]])
plt.title('Head on Junctions')
plt.xlabel("Time [s]")
plt.ylabel("Head [m]")
plt.legend(loc='best')
plt.grid(True)
plt.show()
# fig.savefig('./docs/figures/tnet3_multi.png', format='png',dpi=100)

View File

@ -0,0 +1,140 @@
import tsnet
# open an example network and create a transient model
inp_file = 'networks/Tnet3.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
import numpy as np
wavespeed = 1200
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-73', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
tm1 = tsnet.simulation.MOCSimulator(tm,result_obj)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
import numpy as np
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-73', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# add air chamber
tank_node = 'JUNCTION-89'
tank_area = 10 # tank cross sectional area [m^2]
tank_height = 10 # tank height [m]
water_height = 5 # initial water level [m]
tm.add_surge_tank(tank_node, [tank_area,tank_height,water_height], 'closed')
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
tm2 = tsnet.simulation.MOCSimulator(tm,result_obj)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
import numpy as np
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-73', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# add air chamber
tank_node = 'JUNCTION-89'
tank_area = 10 # tank cross sectional area [m^2]
tm.add_surge_tank(tank_node, [tank_area], 'open')
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
tm3 = tsnet.simulation.MOCSimulator(tm,result_obj)
#%%
# report results
import matplotlib.pyplot as plt
node1 = 'JUNCTION-16'
node2 = 'JUNCTION-20'
node3 = 'JUNCTION-30'
node4 = 'JUNCTION-45'
node5 = 'JUNCTION-90'
fig, axs = plt.subplots(1,3,figsize=(15,5), dpi=80, facecolor='w', edgecolor='k')
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node1).head-tm1.get_node(node1).head[0],'C0-',label='JUNCTION-16', linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node2).head-tm1.get_node(node2).head[0],'C1-',label='JUNCTION-20', linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node3).head-tm1.get_node(node3).head[0],'C2-', label='JUNCTION-30',linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node4).head-tm1.get_node(node4).head[0],'C3-', label='JUNCTION-45',linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node5).head-tm1.get_node(node5).head[0],'C4-',label='JUNCTION-90', linewidth=2.5)
axs[0].set_xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
axs[0].set_ylim([-45,15])
axs[0].set_xlabel("Time [s]")
axs[0].set_ylabel("Head change [m]")
axs[0].legend(loc='best')
axs[0].set_title('(a)')
#axs[0].show()
#fig.savefig('tnet3_wo_surge_tank.pdf', format='pdf',dpi=100)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node1).head-tm2.get_node(node1).head[0],'C0',label='JUNCTION-16', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node2).head-tm2.get_node(node2).head[0],'C1',label='JUNCTION-20', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node3).head-tm2.get_node(node3).head[0],'C2',label='JUNCTION-30', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node4).head-tm2.get_node(node4).head[0],'C3',label='JUNCTION-45', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node5).head-tm2.get_node(node5).head[0],'C4',label='JUNCTION-90', linewidth=2.5)
axs[1].set_xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
axs[1].set_ylim([-45,15])
axs[1].set_xlabel("Time [s]")
#axs[1].set_ylabel("Head [m]")
axs[1].legend(loc='lower right')
axs[1].set_title('(b)')
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node1).head-tm3.get_node(node1).head[0],'C0',label='JUNCTION-16', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node2).head-tm3.get_node(node2).head[0],'C1',label='JUNCTION-20', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node3).head-tm3.get_node(node3).head[0],'C2',label='JUNCTION-30', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node4).head-tm3.get_node(node4).head[0],'C3',label='JUNCTION-45', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node5).head-tm3.get_node(node5).head[0],'C4',label='JUNCTION-90', linewidth=2.5)
axs[2].set_xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
axs[2].set_xlabel("Time [s]")
axs[2].set_ylim([-45,15])
#axs[1].set_ylabel("Head [m]")
axs[2].legend(loc='lower right')
axs[2].set_title('(c)')
plt.show()
plt.tight_layout()
fig.savefig('tnet3_compare_surge_tank.pdf', format='pdf', bbox_inches = 'tight',dpi=100)

View File

@ -0,0 +1,161 @@
import tsnet
# open an example network and create a transient model
inp_file = '/Users/luxing/Code/TSNet/examples/networks/Tnet3.inp'
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
import numpy as np
wavespeed = np.random.normal(1200., 100., size=tm.num_pipes)
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-73', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
tm1 = tsnet.simulation.MOCSimulator(tm,result_obj)
#%%
tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
import numpy as np
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-73', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
friction ='quasi-steady'
tm2 = tsnet.simulation.MOCSimulator(tm,result_obj,friction)
#%% tm = tsnet.network.TransientModel(inp_file)
# Set wavespeed
tm = tsnet.network.TransientModel(inp_file)
tm.set_wavespeed(wavespeed)
# Set time step
tf = 20 # simulation period [s]
tm.set_time(tf)
# Add burst
ts = 1 # burst start time
tc = 1 # time for burst to fully develop
final_burst_coeff = 0.01 # final burst coeff [ m^3/s/(m H20)^(1/2)]
tm.add_burst('JUNCTION-73', ts, tc, final_burst_coeff)
# Initialize steady state simulation
t0 = 0. # initialize the simulation at 0s
engine = 'DD' # or Epanet
tm = tsnet.simulation.Initializer(tm, t0, engine)
# Transient simulation
result_obj = 'Tnet3' # name of the object for saving simulation results
friction ='unsteady'
tm3 = tsnet.simulation.MOCSimulator(tm,result_obj,friction)
#%%
# report results
import matplotlib.pyplot as plt
node1 = 'JUNCTION-16'
node2 = 'JUNCTION-20'
node3 = 'JUNCTION-30'
node4 = 'JUNCTION-45'
node5 = 'JUNCTION-90'
fig = plt.figure(figsize=(8,5), dpi=80, facecolor='w', edgecolor='k')
plt.plot(tm1.simulation_timestamps,tm1.get_node(node1).head-tm1.get_node(node1).head[0],'C0--', linewidth=2.5)
plt.plot(tm1.simulation_timestamps,tm1.get_node(node2).head-tm1.get_node(node2).head[0],'C1--', linewidth=2.5)
plt.plot(tm1.simulation_timestamps,tm1.get_node(node3).head-tm1.get_node(node3).head[0],'C2--', linewidth=2.5)
plt.plot(tm1.simulation_timestamps,tm1.get_node(node4).head-tm1.get_node(node4).head[0],'C3--', linewidth=2.5)
plt.plot(tm1.simulation_timestamps,tm1.get_node(node5).head-tm1.get_node(node5).head[0],'C4--', linewidth=2.5)
#plt.plot(tm2.simulation_timestamps,tm2.get_node(node1).head-tm2.get_node(node1).head[0],'C0', ls='dotted', linewidth=2.5)
#plt.plot(tm2.simulation_timestamps,tm2.get_node(node2).head-tm2.get_node(node2).head[0],'C1', ls='dotted', linewidth=2.5)
#plt.plot(tm2.simulation_timestamps,tm2.get_node(node3).head-tm2.get_node(node3).head[0],'C2', ls='dotted', linewidth=2.5)
#plt.plot(tm2.simulation_timestamps,tm2.get_node(node4).head-tm2.get_node(node4).head[0],'C3', ls='dotted', linewidth=2.5)
#plt.plot(tm2.simulation_timestamps,tm2.get_node(node5).head-tm2.get_node(node5).head[0],'C4', ls='dotted', linewidth=2.5)
plt.plot(tm3.simulation_timestamps,tm3.get_node(node1).head-tm3.get_node(node1).head[0],'C0', label='JUNCTION-16', linewidth=2.5)
plt.plot(tm3.simulation_timestamps,tm3.get_node(node2).head-tm3.get_node(node2).head[0],'C1', label='JUNCTION-20', linewidth=2.5)
plt.plot(tm3.simulation_timestamps,tm3.get_node(node3).head-tm3.get_node(node3).head[0],'C2', label='JUNCTION-30', linewidth=2.5)
plt.plot(tm3.simulation_timestamps,tm3.get_node(node4).head-tm3.get_node(node4).head[0],'C3', label='JUNCTION-45', linewidth=2.5)
plt.plot(tm3.simulation_timestamps,tm3.get_node(node5).head-tm3.get_node(node5).head[0],'C4', label='JUNCTION-90', linewidth=2.5)
plt.xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
plt.xlabel("Time [s]")
plt.ylabel("Head [m]")
plt.legend(loc='lower right')
plt.show()
fig.savefig('tnet3_unsteady_friction.pdf', format='pdf',dpi=100)
#%%
# report results
import matplotlib.pyplot as plt
node1 = 'JUNCTION-16'
node2 = 'JUNCTION-20'
node3 = 'JUNCTION-30'
node4 = 'JUNCTION-45'
node5 = 'JUNCTION-90'
fig, axs = plt.subplots(1,3,figsize=(15,5), dpi=80, facecolor='w', edgecolor='k')
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node1).head-tm1.get_node(node1).head[0],'C0-',label='JUNCTION-16', linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node2).head-tm1.get_node(node2).head[0],'C1-',label='JUNCTION-20', linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node3).head-tm1.get_node(node3).head[0],'C2-', label='JUNCTION-30',linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node4).head-tm1.get_node(node4).head[0],'C3-', label='JUNCTION-45',linewidth=2.5)
axs[0].plot(tm1.simulation_timestamps,tm1.get_node(node5).head-tm1.get_node(node5).head[0],'C4-',label='JUNCTION-90', linewidth=2.5)
axs[0].set_xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
axs[0].set_ylim([-45,20])
axs[0].set_xlabel("Time [s]")
axs[0].set_ylabel("Head change [m]")
axs[0].legend(loc='lower right')
axs[0].set_title('(a)')
#axs[0].show()
#fig.savefig('tnet3_wo_surge_tank.pdf', format='pdf',dpi=100)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node1).head-tm2.get_node(node1).head[0],'C0-',label='JUNCTION-16', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node2).head-tm2.get_node(node2).head[0],'C1-',label='JUNCTION-20', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node3).head-tm2.get_node(node3).head[0],'C2-',label='JUNCTION-30', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node4).head-tm2.get_node(node4).head[0],'C3-',label='JUNCTION-45', linewidth=2.5)
axs[1].plot(tm2.simulation_timestamps,tm2.get_node(node5).head-tm2.get_node(node5).head[0],'C4-',label='JUNCTION-90', linewidth=2.5)
axs[1].set_xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
axs[1].set_ylim([-45,20])
axs[1].set_xlabel("Time [s]")
#axs[1].set_ylabel("Head [m]")
axs[1].legend(loc='lower right')
axs[1].set_title('(b)')
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node1).head-tm3.get_node(node1).head[0],'C0',label='JUNCTION-16', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node2).head-tm3.get_node(node2).head[0],'C1',label='JUNCTION-20', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node3).head-tm3.get_node(node3).head[0],'C2',label='JUNCTION-30', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node4).head-tm3.get_node(node4).head[0],'C3',label='JUNCTION-45', linewidth=2.5)
axs[2].plot(tm3.simulation_timestamps,tm3.get_node(node5).head-tm3.get_node(node5).head[0],'C4',label='JUNCTION-90', linewidth=2.5)
axs[2].set_xlim([tm1.simulation_timestamps[0],tm1.simulation_timestamps[-1]])
axs[2].set_xlabel("Time [s]")
axs[2].set_ylim([-45,20])
#axs[1].set_ylabel("Head [m]")
axs[2].legend(loc='lower right')
axs[2].set_title('(c)')
plt.show()
plt.tight_layout()
fig.savefig('tnet3_compare_unsteady_friction.pdf', format='pdf', bbox_inches = 'tight',dpi=100)

View File

@ -0,0 +1,141 @@
[TITLE]
[JUNCTIONS]
;ID Elev Demand Pattern
2 0 0 ;
3 0 0 ;
4 0 50 ;
[RESERVOIRS]
;ID Head Pattern
1 750 ;
[TANKS]
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
[PIPES]
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
1 1 2 1200 600 0.02 0 Open ;
2 2 3 2400 1200 0.02 0 Open ;
[PUMPS]
;ID Node1 Node2 Parameters
[VALVES]
;ID Node1 Node2 Diameter Type Setting MinorLoss
3 3 4 158 PRV 100000 0 ;
[TAGS]
[DEMANDS]
;Junction Demand Pattern Category
[STATUS]
;ID Status/Setting
3 Open
[PATTERNS]
;ID Multipliers
[CURVES]
;ID X-Value Y-Value
[CONTROLS]
[RULES]
[ENERGY]
Global Efficiency 75
Global Price 0
Demand Charge 0
[EMITTERS]
;Junction Coefficient
[QUALITY]
;Node InitQual
[SOURCES]
;Node Type Quality Pattern
[REACTIONS]
;Type Pipe/Tank Coefficient
[REACTIONS]
Order Bulk 1
Order Tank 1
Order Wall 1
Global Bulk 0
Global Wall 0
Limiting Potential 0
Roughness Correlation 0
[MIXING]
;Tank Model
[TIMES]
Duration 0:00
Hydraulic Timestep 1:00
Quality Timestep 0:05
Pattern Timestep 1:00
Pattern Start 0:00
Report Timestep 1:00
Report Start 0:00
Start ClockTime 12 am
Statistic NONE
[REPORT]
Status No
Summary No
Page 0
[OPTIONS]
Units LPS
Headloss D-W
Specific Gravity 1
Viscosity 1
Trials 40
Accuracy 0.001
CHECKFREQ 2
MAXCHECK 10
DAMPLIMIT 0
Unbalanced Continue 10
Pattern 1
Demand Multiplier 1.0
Emitter Exponent 0.5
Quality None mg/L
Diffusivity 1
Tolerance 0.01
[COORDINATES]
;Node X-Coord Y-Coord
2 -1167.70 8919.75
3 293.21 8919.75
4 704.78 8886.13
1 -2319.96 8909.47
[VERTICES]
;Link X-Coord Y-Coord
[LABELS]
;X-Coord Y-Coord Label & Anchor Node
-2423.20 9069.59 "Reservoir"
-1705.20 8870.76 "Pipe1"
-468.04 8881.81 "Pipe2"
-1208.13 9043.82 "Junc2"
231.48 9053.50 "Junc3"
612.95 9040.58 "Junc4"
[BACKDROP]
DIMENSIONS 0.00 0.00 10000.00 10000.00
UNITS None
FILE
OFFSET 0.00 0.00
[END]

View File

@ -0,0 +1,138 @@
[TITLE]
[JUNCTIONS]
;ID Elev Demand Pattern
3 0 0 ;
4 0 50 ;
[RESERVOIRS]
;ID Head Pattern
1 750 ;
[TANKS]
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
[PIPES]
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
1 1 3 1200 1200 0.02 0 Open ;
[PUMPS]
;ID Node1 Node2 Parameters
[VALVES]
;ID Node1 Node2 Diameter Type Setting MinorLoss
3 3 4 158 PRV 100000 0 ;
[TAGS]
[DEMANDS]
;Junction Demand Pattern Category
[STATUS]
;ID Status/Setting
3 Open
[PATTERNS]
;ID Multipliers
[CURVES]
;ID X-Value Y-Value
[CONTROLS]
[RULES]
[ENERGY]
Global Efficiency 75
Global Price 0
Demand Charge 0
[EMITTERS]
;Junction Coefficient
[QUALITY]
;Node InitQual
[SOURCES]
;Node Type Quality Pattern
[REACTIONS]
;Type Pipe/Tank Coefficient
[REACTIONS]
Order Bulk 1
Order Tank 1
Order Wall 1
Global Bulk 0
Global Wall 0
Limiting Potential 0
Roughness Correlation 0
[MIXING]
;Tank Model
[TIMES]
Duration 0:00
Hydraulic Timestep 1:00
Quality Timestep 0:05
Pattern Timestep 1:00
Pattern Start 0:00
Report Timestep 1:00
Report Start 0:00
Start ClockTime 12 am
Statistic NONE
[REPORT]
Status No
Summary No
Page 0
[OPTIONS]
Units LPS
Headloss D-W
Specific Gravity 1
Viscosity 1
Trials 40
Accuracy 0.001
CHECKFREQ 2
MAXCHECK 10
DAMPLIMIT 0
Unbalanced Continue 10
Pattern 1
Demand Multiplier 1.0
Emitter Exponent 0.5
Quality None mg/L
Diffusivity 1
Tolerance 0.01
[COORDINATES]
;Node X-Coord Y-Coord
3 293.21 8919.75
4 704.78 8886.13
1 -2319.96 8909.47
[VERTICES]
;Link X-Coord Y-Coord
[LABELS]
;X-Coord Y-Coord Label & Anchor Node
-2423.20 9069.59 "Reservoir"
-1208.85 8765.43 "Pipe1"
231.48 9053.50 "Junc3"
612.95 9040.58 "Junc4"
[BACKDROP]
DIMENSIONS 0.00 0.00 10000.00 10000.00
UNITS None
FILE
OFFSET 0.00 0.00
[END]

View File

@ -0,0 +1,166 @@
[TITLE]
[JUNCTIONS]
;ID Elev Demand Pattern
N3 0 0 ;
N2 0 25 ;
N5 0 0 ;
N4 0 25 ;
N6 0 0 ;
N7 0 0 ;
N8 0 100 ;
[RESERVOIRS]
;ID Head Pattern
R1 191 ;
[TANKS]
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
[PIPES]
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
P1 R1 N3 610 900 92 0 Open ;
P2 N3 N4 914 750 107 0 Open ;
P3 N3 N2 610 600 98 0 Open ;
P4 N4 N6 457 450 105 0 Open ;
P5 N4 N2 549 450 100 0 Open ;
P6 N5 N2 671 750 93 0 Open ;
P7 N5 N7 1000 900 105 0 Open ;
P8 N6 N5 457 600 105 0 Open ;
P9 N2 N6 488 450 140 0 Open ;
[PUMPS]
;ID Node1 Node2 Parameters
[VALVES]
;ID Node1 Node2 Diameter Type Setting MinorLoss
VALVE N7 N8 184 FCV 10000 0 ;
[TAGS]
[DEMANDS]
;Junction Demand Pattern Category
[STATUS]
;ID Status/Setting
VALVE Open
[PATTERNS]
;ID Multipliers
[CURVES]
;ID X-Value Y-Value
[CONTROLS]
[RULES]
[ENERGY]
Global Efficiency 75
Global Price 0
Demand Charge 0
[EMITTERS]
;Junction Coefficient
[QUALITY]
;Node InitQual
[SOURCES]
;Node Type Quality Pattern
[REACTIONS]
;Type Pipe/Tank Coefficient
[REACTIONS]
Order Bulk 1
Order Tank 1
Order Wall 1
Global Bulk 0
Global Wall 0
Limiting Potential 0
Roughness Correlation 0
[MIXING]
;Tank Model
[TIMES]
Duration 0:00
Hydraulic Timestep 1:00
Quality Timestep 0:05
Pattern Timestep 1:00
Pattern Start 0:00
Report Timestep 1:00
Report Start 0:00
Start ClockTime 12 am
Statistic NONE
[REPORT]
Status No
Summary No
Page 0
[OPTIONS]
Units LPS
Headloss H-W
Specific Gravity 1
Viscosity 1
Trials 40
Accuracy 0.001
CHECKFREQ 2
MAXCHECK 10
DAMPLIMIT 0
Unbalanced Continue 10
Pattern 1
Demand Multiplier 1.0
Emitter Exponent 0.5
Quality None mg/L
Diffusivity 1
Tolerance 0.01
[COORDINATES]
;Node X-Coord Y-Coord
N3 87.45 6543.21
N2 961.93 5658.44
N5 2649.18 5658.44
N4 1414.36 6965.59
N6 2361.11 6965.02
N7 3750.55 5656.40
N8 4091.79 5653.12
R1 -529.84 7427.98
[VERTICES]
;Link X-Coord Y-Coord
[LABELS]
;X-Coord Y-Coord Label & Anchor Node
-149.18 7047.33 "P1"
601.85 6944.44 "P2"
478.40 6296.30 "P3"
1887.86 7170.78 "P4"
992.80 6522.63 "P5"
1774.69 5617.28 "P6"
3184.16 5607.00 "P7"
2582.45 6306.08 "P8"
1620.37 6584.36 "P9"
-632.72 7366.26 "R1"
-77.16 6481.48 "N3"
1404.32 7201.65 "N4"
2350.82 7160.49 "N6"
859.05 5576.13 "N2"
2677.61 5561.25 "N5"
3636.83 5596.71 "VALVE"
3667.70 5864.20 "N7"
4048.35 5853.91 "N8"
[BACKDROP]
DIMENSIONS 0.00 0.00 10000.00 10000.00
UNITS None
FILE
OFFSET 0.00 0.00
[END]

View File

@ -0,0 +1,484 @@
[TITLE]
Scenario: Base
Date: 6/26/2019 2:45:30 PM
[JUNCTIONS]
;ID Elev Demand Pattern
275 10 0 ;
273 8 0 ;
271 6 0 ;
269 0 0 ;
267 21 0 ;
265 0 0 ;
263 0 0 ;
261 0 0 ;
259 25 0 ;
257 17 0 ;
255 27 40.39 1 ;
253 36 54.52 1 ;
251 30 24.16 1 ;
249 18 0 ;
247 18 70.38 1 ;
243 14 4.34 1 ;
241 13 0 ;
239 13 44.61 1 ;
237 14 15.61 1 ;
231 5 16.48 1 ;
229 10.5 64.18 1 ;
225 8 22.8 1 ;
219 4 41.32 1 ;
217 6 24.22 1 ;
215 7 92.19 1 ;
213 7 13.94 1 ;
211 7 8.67 1 ;
209 -2 0.87 1 ;
208 16 0 ;
207 9 69.39 1 ;
206 1 0 ;
205 21 65.36 1 ;
204 21 0 ;
203 2 1 5 ;
201 0.1 44.61 1 ;
199 -2 119.32 1 ;
197 23 17.04 1 ;
195 15.5 0 ;
193 18 71.31 1 ;
191 25 81.9 1 ;
189 4 107.92 1 ;
187 12.5 0 ;
185 16 25.65 1 ;
184 16 0 ;
183 11 0 ;
181 8 0 ;
179 8 0 ;
173 -4 0 ;
171 -4 39.34 1 ;
169 -5 0 ;
167 -5 14.56 1 ;
166 -2 2.6 1 ;
164 5 0 ;
163 5 9.42 1 ;
161 4 15.8 1 ;
159 6 41.32 1 ;
157 13.1 51.79 1 ;
153 66.2 44.17 1 ;
151 33.5 144.48 1 ;
149 16 27.07 1 ;
147 18.5 8.55 1 ;
145 1 27.63 1 ;
143 -4.5 6.2 1 ;
141 4 9.85 1 ;
139 31 5.89 1 ;
131 6 42.75 1 ;
129 51 0 ;
127 56 17.66 1 ;
125 11 45.6 1 ;
123 11 1 2 ;
121 -2 41.63 1 ;
120 0 0 ;
119 2 176.13 1 ;
117 13.6 117.71 1 ;
115 14 52.1 1 ;
113 2 20.01 1 ;
111 10 141.94 1 ;
109 20.3 231.4 1 ;
107 22 54.64 1 ;
JUNCTION-105 28.5 135.37 1 ;
103 43 133.2 1 ;
101 42 189.95 1 ;
61 0 0 ;
60 0 0 ;
50 116.5 0 ;
40 131.9 0 ;
20 129 0 ;
15 32 1 3 ;
10 147 0 ;
305-A 16.9067526676344 0 ;
305-B 16.9067526676344 0 ;
[RESERVOIRS]
;ID Head Pattern
River 220 ;
Lake 167 ;
[TANKS]
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
3 129 29 4 35.5 164 84496.2760109511 ;
2 116.5 23.5 6.5 40.3 50 12762.7201552085 ;
1 131.9 13.1 0.0999999999999943 32.1 85 567.450173054656 ;
[PIPES]
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
204 184 205 4530 12 130 0 Open ;
203 183 185 510 8 130 0 Open ;
202 185 184 99.9 8 130 0 Open ;
201 40 179 1190 12 130 0 Open ;
199 179 183 210 12 130 0 Open ;
191 271 171 760 24 130 0 Open ;
189 171 173 500 30 141 0 Open ;
187 169 171 1270 30 141 0 Open ;
186 187 204 99.9 8 130 0 Open ;
185 167 169 300 8 130 0 Open ;
183 265 169 590 30 141 0 Open ;
181 164 166 490 14 130 0 Open ;
180 163 164 150 14 130 0 Open ;
179 161 163 430 30 141 0 Open ;
177 159 161 2000 30 141 0 Open ;
175 157 159 2910 30 141 0 Open ;
173 119 157 2080 30 141 0 Open ;
169 125 153 4560 8 130 0 Open ;
163 151 153 1170 12 130 0 Open ;
161 149 151 1020 8 130 0 Open ;
159 147 149 880 12 130 0 Open ;
155 147 145 2200 12 130 0 Open ;
153 145 141 3510 12 130 0 Open ;
151 15 143 1650 8 130 0 Open ;
149 143 141 1400 8 130 0 Open ;
147 139 141 2050 8 130 0 Open ;
145 129 139 2750 8 130 0 Open ;
137 129 131 6480 16 130 0 Open ;
135 127 129 900 24 130 0 Open ;
133 20 127 785 20 130 0 Open ;
131 125 127 3240 24 130 0 Open ;
129 121 125 930 24 130 0 Open ;
125 123 121 1500 30 141 0 Open ;
123 121 119 2000 30 141 0 Open ;
122 121 120 2050 8 130 0 Open ;
121 120 117 1870 12 130 0 Open ;
120 119 120 730 12 130 0 Open ;
119 115 117 2180 12 130 0 Open ;
117 263 JUNCTION-105 2725 12 130 0 Open ;
116 113 193 1660 12 130 0 Open ;
115 107 115 1950 8 130 0 Open ;
114 115 113 2000 8 130 0 Open ;
113 111 113 1680 12 130 0 Open ;
112 115 111 1160 12 130 0 Open ;
111 109 111 2000 12 130 0 Open ;
PIPE-109 103 109 3940 16 130 0 Open ;
107 JUNCTION-105 107 1470 12 130 0 Open ;
105 101 JUNCTION-105 2540 12 130 0 Open ;
103 101 103 1350 16 130 0 Open ;
101 10 101 14200 18 110 0 Open ;
60 River 60 1231 24 140 0 Open ;
50 2 50 99 99 199 0 Open ;
40 1 40 99 99 199 0 Open ;
20 3 20 99 99 199 0 Open ;
329 61 123 45500 30 140 0 Open ;
325 269 271 1290 8 130 0 Open ;
323 201 275 300 12 130 0 Open ;
321 163 265 1200 30 141 0 Open ;
319 273 205 645 12 130 0 Open ;
317 273 275 2230 8 130 0 Open ;
315 181 271 290 24 130 0 Open ;
313 269 189 646 12 130 0 Open ;
311 193 267 1170 12 130 0 Open ;
309 265 267 1580 8 130 0 Open ;
307 261 263 350 12 130 0 Open ;
305 117 261 645 12 130 0 Open ;
303 257 261 1400 8 130 0 Open ;
301 259 263 1400 8 130 0 Open ;
299 257 259 350 8 130 0 Open ;
297 120 257 645 8 130 0 Open ;
295 249 251 1450 12 130 0 Open ;
293 255 251 1100 8 130 0 Open ;
291 255 253 1100 10 130 0 Open ;
289 50 255 925 10 130 0 Open ;
287 247 255 1390 10 130 0 Open ;
285 247 249 100 12 130 0 Open ;
283 239 249 430 12 130 0 Open ;
281 241 247 445 10 130 0 Open ;
277 241 243 2200 12 130 0 Open ;
275 239 241 350 12 130 0 Open ;
273 237 239 510 12 130 0 Open ;
271 237 229 790 8 130 0 Open ;
269 211 237 2080 12 130 0 Open ;
263 229 231 1960 12 130 0 Open ;
261 213 229 2200 8 130 0 Open ;
257 217 225 1560 12 130 0 Open ;
251 217 219 2050 14 130 0 Open ;
249 215 217 1660 16 130 0 Open ;
247 213 215 4285 16 130 0 Open ;
245 211 213 990 16 130 0 Open ;
243 209 211 1210 16 130 0 Open ;
241 208 209 885 12 130 0 Open ;
240 206 208 510 12 130 0 Open ;
239 275 207 1430 12 130 0 Open ;
238 207 206 450 12 130 0 Open ;
237 205 207 1200 12 130 0 Open ;
235 199 273 725 12 130 0 Open ;
233 201 203 120 24 130 0 Open ;
231 199 201 630 24 141 0 Open ;
229 173 199 4000 24 141 0 Open ;
225 111 197 2790 12 130 0 Open ;
223 197 191 1150 12 130 0 Open ;
221 161 195 2300 8 130 0 Open ;
219 193 195 360 12 130 0 Open ;
217 191 193 520 12 130 0 Open ;
215 267 189 1230 12 130 0 Open ;
213 191 187 2560 12 130 0 Open ;
211 169 269 646 12 130 0 Open ;
209 189 187 500 8 130 0 Open ;
207 189 183 1350 12 130 0 Open ;
205 204 185 1325 12 130 0 Open ;
P-1 119 305-A 1640 12 130 0 Open ;
P-2 305-B 151 1820 12 130 0 Open ;
[PUMPS]
;ID Node1 Node2 Parameters
PUMP1 60 61 HEAD 335 ;
PUMP2 Lake 10 HEAD 10 ;
[VALVES]
;ID Node1 Node2 Diameter Type Setting MinorLoss
TCV-1 305-A 305-B 6 TCV 0.2 0 ;
[TAGS]
[DEMANDS]
;Junction Demand Pattern Category
[STATUS]
;ID Status/Setting
TCV-1 Open
[PATTERNS]
;ID Multipliers
;
1 1.34 1.94 1.46 1.44 0.76 0.92
1 0.85 1.07 0.96 1.1 1.08 1.19
1 1.16 1.08 0.96 0.83 0.79 0.74
1 0.64 0.64 0.85 0.96 1.24 1.67
;
2 0 0 0 0 0 1219
2 0 0 0 1866 1836 1818
2 1818 1822 1822 1817 1824 1816
2 1833 1817 1830 1814 1840 1859
;
3 620 620 620 620 620 360
3 360 0 0 0 0 360
3 360 360 360 360 0 0
3 0 0 0 0 360 360
;
4 1637 1706 1719 1719 1791 1819
4 1777 1842 1815 1825 1856 1801
4 1819 1733 1664 1620 1613 1620
4 1616 1647 1627 1627 1671 1668
;
5 4439 4531 4511 4582 4531 4582
5 4572 4613 4643 4643 4592 4613
5 4531 4521 4449 4439 4449 4460
5 4439 4419 4368 4399 4470 4480
;
ValveClosure 1
[CURVES]
;ID X-Value Y-Value
;PUMP: PUMP: PUMP: PUMP: PUMP:
335 0 200
335 8000 138
335 14000 86
;PUMP: PUMP: PUMP: PUMP: EFFICIENCY:
335E 0 75
335E 8000 75
335E 14000 75
;PUMP: PUMP: PUMP: PUMP: PUMP:
10 0 104
10 2000 92
10 4000 63
;PUMP: PUMP: PUMP: PUMP: EFFICIENCY:
10E 0 75
10E 2000 75
10E 4000 75
[CONTROLS]
[RULES]
[ENERGY]
Global Efficiency 75
Global Price 0
Demand Charge 0
[EMITTERS]
;Junction Coefficient
[QUALITY]
;Node InitQual
[SOURCES]
;Node Type Quality Pattern
[REACTIONS]
;Type Pipe/Tank Coefficient
[REACTIONS]
Order Bulk 1
Order Tank 1
Order Wall 1
Global Bulk 0
Global Wall 0
Limiting Potential 0
Roughness Correlation 0
[MIXING]
;Tank Model
[TIMES]
Duration 24:00
Hydraulic Timestep 1:00
Quality Timestep 0:05
Pattern Timestep 1:00
Pattern Start 0:00
Report Timestep 1:00
Report Start 0:00
Start ClockTime 12 am
Statistic NONE
[REPORT]
Status No
Summary No
Page 0
[OPTIONS]
Units GPM
Headloss H-W
Specific Gravity 1
Viscosity 0.985218181818182
Trials 40
Accuracy 0.001
CHECKFREQ 2
MAXCHECK 10
DAMPLIMIT 0
Unbalanced Continue 10
Pattern 1
Demand Multiplier 1
Emitter Exponent 0.5
Quality Trace Lake
Diffusivity 1
Tolerance 0.01
[COORDINATES]
;Node X-Coord Y-Coord
275 31.07 8.29
273 29.16 7.38
271 26.14 11.17
269 25.03 12.14
267 23.38 12.95
265 25.39 13.60
263 20.32 21.57
261 20.79 21.45
259 20.80 23.40
257 21.17 23.32
255 33.51 2.45
253 32.17 1.88
251 34.15 1.10
249 35.02 1.81
247 35.02 2.05
243 37.04 0.00
241 35.87 2.11
239 35.76 2.31
237 35.37 3.08
231 38.38 2.54
229 36.16 3.49
225 43.53 7.38
219 44.86 9.32
217 42.11 8.67
215 39.95 8.73
213 35.26 6.16
211 34.20 5.54
209 33.76 6.59
208 32.54 6.81
207 31.00 6.61
206 31.66 6.64
205 29.20 6.46
204 23.81 10.69
203 31.14 8.89
201 30.89 8.57
199 29.42 8.44
197 20.97 15.18
195 23.18 14.72
193 22.88 14.35
191 22.10 14.07
189 24.15 11.37
187 23.64 11.04
185 24.79 9.80
184 25.15 9.52
183 25.29 10.04
181 25.72 10.83
179 25.86 10.38
173 26.87 11.59
171 26.65 11.80
169 25.68 12.74
167 25.88 12.98
166 26.48 15.13
164 25.98 15.14
163 25.39 14.98
161 25.10 15.28
159 23.12 17.50
157 24.85 20.16
153 28.13 22.63
151 28.29 21.39
149 29.62 20.74
147 30.24 20.38
145 33.02 19.29
143 37.47 21.97
141 35.68 23.08
139 33.28 24.54
131 37.89 29.55
129 30.32 26.39
127 29.29 26.40
125 24.59 25.64
123 23.37 27.31
121 23.54 25.50
120 22.08 23.10
119 23.70 22.76
117 21.67 21.29
115 20.98 19.18
113 22.04 16.61
111 20.21 17.53
109 17.64 18.92
107 18.45 20.46
JUNCTION-105 16.97 21.28
103 12.96 21.31
101 13.81 22.94
61 23.70 29.03
60 23.90 29.94
50 33.01 3.01
40 27.02 9.81
20 29.44 26.91
15 38.68 23.76
10 9.00 27.85
305-A 25.08 22.31
305-B 25.82 22.10
River 24.15 31.06
Lake 8.00 27.53
3 29.41 27.27
2 32.99 3.45
1 27.46 9.84
[VERTICES]
;Link X-Coord Y-Coord
PUMP1 23.81 29.49
PUMP2 8.50 27.69
[LABELS]
;X-Coord Y-Coord Label & Anchor Node
21.91 30.01 "PUMP1"
7.86 28.64 "PUMP2"
15.90 22.66 "JUNCTION-105"
13.69 19.85 "PIPE-109"
[BACKDROP]
DIMENSIONS 6.16 -1.55 46.70 32.61
UNITS None
FILE
OFFSET 0.00 0.00
[END]

View File

@ -0,0 +1,649 @@
[TITLE]
[JUNCTIONS]
;ID Elev Demand Pattern
JUNCTION-0 376.06999999999999 0.763534 PATTERN-0 ;
JUNCTION-1 192.0 0 ;
JUNCTION-2 363.13999999999999 0.830000 PATTERN-0 ;
JUNCTION-3 428.06999999999999 4.400000 PATTERN-0 ;
JUNCTION-4 477.81 3.836466 PATTERN-0 ;
JUNCTION-5 494.23000000000002 3.529833 PATTERN-0 ;
JUNCTION-6 505.0 1.850000 PATTERN-0 ;
JUNCTION-7 535.23000000000002 0 ;
JUNCTION-8 493.42000000000002 1.540000 PATTERN-0 ;
JUNCTION-9 488.29000000000002 0 ;
JUNCTION-10 333.62 0.341497 PATTERN-0 ;
JUNCTION-11 344.10000000000002 1.049859 PATTERN-0 ;
JUNCTION-12 379.5 0.025149 PATTERN-0 ;
JUNCTION-13 325.94999999999999 0 ;
JUNCTION-14 416.85000000000002 0 ;
JUNCTION-15 423.49000000000001 1.320167 PATTERN-0 ;
JUNCTION-16 383.0 0 ;
JUNCTION-17 385.06 25.715680 PATTERN-0 ;
JUNCTION-18 478.14999999999998 6.182285 PATTERN-0 ;
JUNCTION-19 558.92999999999995 4.603554 PATTERN-0 ;
JUNCTION-20 617.73000000000002 2.580000 PATTERN-0 ;
JUNCTION-21 652.41999999999996 0 ;
JUNCTION-22 625.96000000000004 4.290000 PATTERN-0 ;
JUNCTION-23 604.34000000000003 3.194580 PATTERN-0 ;
JUNCTION-24 636.61000000000001 0 ;
JUNCTION-25 653.92999999999995 5.970000 PATTERN-0 ;
JUNCTION-26 683.42999999999995 0 ;
JUNCTION-27 690.64999999999998 12.442156 PATTERN-0 ;
JUNCTION-28 701.69000000000005 2.092553 PATTERN-0 ;
JUNCTION-29 846.27999999999997 0 ;
JUNCTION-30 636.0 116.764931 PATTERN-0 ;
JUNCTION-31 600.42999999999995 2.370000 PATTERN-0 ;
JUNCTION-32 625.85000000000002 6.160000 PATTERN-0 ;
JUNCTION-33 622.77999999999997 0.958345 PATTERN-0 ;
JUNCTION-34 200.0 0 ;
JUNCTION-35 651.97000000000003 9.239535 PATTERN-0 ;
JUNCTION-36 634.11000000000001 0 ;
JUNCTION-37 677.04999999999995 3.286911 PATTERN-0 ;
JUNCTION-38 646.50999999999999 0 ;
JUNCTION-39 703.19000000000005 4.907129 PATTERN-0 ;
JUNCTION-40 741.63 3.393717 PATTERN-0 ;
JUNCTION-41 700.22000000000003 3.052871 PATTERN-0 ;
JUNCTION-42 728.04999999999995 11.414126 PATTERN-0 ;
JUNCTION-43 653.09000000000003 3.310000 PATTERN-0 ;
JUNCTION-44 678.5 5.167447 PATTERN-0 ;
JUNCTION-45 747.32000000000005 9.354966 PATTERN-0 ;
JUNCTION-46 820.24000000000001 4.365034 PATTERN-0 ;
JUNCTION-47 640.47000000000003 0 ;
JUNCTION-48 637.45000000000005 0 ;
JUNCTION-49 623.89999999999998 1.140000 PATTERN-0 ;
JUNCTION-50 611.08000000000004 3.811622 PATTERN-0 ;
JUNCTION-51 623.67999999999995 3.010000 PATTERN-0 ;
JUNCTION-52 613.26999999999998 4.918378 PATTERN-0 ;
JUNCTION-53 607.63 3.030000 PATTERN-0 ;
JUNCTION-54 602.11000000000001 4.190000 PATTERN-0 ;
JUNCTION-55 603.34000000000003 3.080000 PATTERN-0 ;
JUNCTION-56 606.94000000000005 0 ;
JUNCTION-57 617.97000000000003 0.431655 PATTERN-0 ;
JUNCTION-58 610.21000000000004 22.020000 PATTERN-0 ;
JUNCTION-59 620.95000000000005 0 ;
JUNCTION-60 623.99000000000001 0 ;
JUNCTION-61 625.38 0 ;
JUNCTION-62 625.39999999999998 0 ;
JUNCTION-63 623.95000000000005 0 ;
JUNCTION-64 623.13 0 ;
JUNCTION-65 619.37 0 ;
JUNCTION-66 619.72000000000003 0 ;
JUNCTION-67 624.5 0 ;
JUNCTION-68 617.08000000000004 20.900000 PATTERN-0 ;
JUNCTION-69 626.0 2.460000 PATTERN-0 ;
JUNCTION-70 619.11000000000001 6.250000 PATTERN-0 ;
JUNCTION-71 632.17999999999995 2.030000 PATTERN-0 ;
JUNCTION-72 622.35000000000002 2.793147 PATTERN-0 ;
JUNCTION-73 620.37 2.630000 PATTERN-0 ;
JUNCTION-74 622.34000000000003 1.070000 PATTERN-0 ;
JUNCTION-75 629.15999999999997 2.546853 PATTERN-0 ;
JUNCTION-76 622.54999999999995 2.670000 PATTERN-0 ;
JUNCTION-77 624.63999999999999 1.820000 PATTERN-0 ;
JUNCTION-78 618.01999999999998 0 ;
JUNCTION-79 617.88999999999999 0 ;
JUNCTION-80 616.88999999999999 0 ;
JUNCTION-81 623.58000000000004 3.460000 PATTERN-0 ;
JUNCTION-82 618.75999999999999 10.220000 PATTERN-0 ;
JUNCTION-83 617.71000000000004 7.541160 PATTERN-0 ;
JUNCTION-84 619.92999999999995 2.878840 PATTERN-0 ;
JUNCTION-85 620.25 0 ;
JUNCTION-86 623.48000000000002 0 ;
JUNCTION-87 622.25999999999999 0 ;
JUNCTION-88 621.69000000000005 0 ;
JUNCTION-89 626.80999999999995 7.340000 PATTERN-0 ;
JUNCTION-90 644.09000000000003 0 ;
JUNCTION-91 637.44000000000005 0 ;
JUNCTION-92 628.24000000000001 0 ;
JUNCTION-93 643.74000000000001 13.990000 PATTERN-0 ;
JUNCTION-94 633.48000000000002 2.130000 PATTERN-0 ;
JUNCTION-95 630.86000000000001 2.969609 PATTERN-0 ;
JUNCTION-96 629.13999999999999 6.100391 PATTERN-0 ;
JUNCTION-97 628.99000000000001 4.450000 PATTERN-0 ;
JUNCTION-98 643.04999999999995 5.966633 PATTERN-0 ;
JUNCTION-99 641.88999999999999 7.173367 PATTERN-0 ;
JUNCTION-100 637.89999999999998 5.888099 PATTERN-0 ;
JUNCTION-101 645.09000000000003 0.661901 PATTERN-0 ;
JUNCTION-102 1094.0699999999999 102.100000 PATTERN-0 ;
JUNCTION-103 1031.73 0.755915 PATTERN-1 ;
JUNCTION-104 860.63999999999999 0.044085 PATTERN-1 ;
JUNCTION-105 0.0 0 ;
JUNCTION-106 0.0 0 ;
JUNCTION-109 0.0 0 ;
JUNCTION-110 0.0 0 ;
JUNCTION-111 418.0 0 ;
JUNCTION-112 418.0 0 ;
JUNCTION-113 359.0 0 ;
JUNCTION-114 359.0 0 ;
JUNCTION-115 533.0 0 ;
JUNCTION-116 533.0 0 ;
JUNCTION-117 404.0 0 ;
JUNCTION-118 404.0 0 ;
JUNCTION-119 849.0 0 ;
JUNCTION-120 849.0 0 ;
JUNCTION-121 957.0 0 ;
JUNCTION-122 957.0 0 ;
JUNCTION-123 758.0 0 ;
JUNCTION-124 758.0 0 ;
JUNCTION-125 434.0 0 ;
JUNCTION-126 434.0 0 ;
JUNCTION-128 0.0 0 ;
[RESERVOIRS]
;ID Head Pattern
RESERVOIR-129 425.0 ;
[TANKS]
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
TANK-130 843.89999999999998 15.159000 0.000000 32.100000 186.000000 0.000000 ;
TANK-131 1137.0999999999999 17.945000 0.000000 41.900000 106.000000 0.000000 ;
[PIPES]
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
LINK-0 JUNCTION-126 JUNCTION-118 7401.000000 20.453411 138.000000 0.000000 Open ;
LINK-1 JUNCTION-17 JUNCTION-0 359.000000 7.999894 139.000000 0.000000 Open ;
LINK-2 JUNCTION-0 JUNCTION-2 324.000000 7.999894 139.000000 0.000000 Open ;
LINK-3 JUNCTION-3 JUNCTION-4 697.000000 7.999810 139.000000 0.000000 Open ;
LINK-6 JUNCTION-5 JUNCTION-4 574.000000 7.999807 139.000000 0.000000 Open ;
LINK-7 JUNCTION-5 JUNCTION-6 238.000000 7.999912 139.000000 0.000000 Open ;
LINK-8 JUNCTION-6 JUNCTION-7 502.000000 8.000000 139.000000 0.000000 Open ;
LINK-9 JUNCTION-8 JUNCTION-6 396.000000 7.999894 139.000000 0.000000 Open ;
LINK-10 JUNCTION-9 JUNCTION-8 377.000000 7.999894 139.000000 0.000000 Open ;
LINK-11 JUNCTION-18 JUNCTION-9 308.000000 7.999947 139.000000 0.000000 Open ;
LINK-12 JUNCTION-9 JUNCTION-8 837.000000 7.999841 139.000000 0.000000 Open ;
LINK-13 JUNCTION-2 JUNCTION-113 180 8.000000 138.000000 0.000000 Open ;
LINK-14 JUNCTION-114 JUNCTION-10 599.000000 7.999901 138.000000 0.000000 Open ;
LINK-15 JUNCTION-1 JUNCTION-109 125.000000 16.000000 138.000000 0.000000 Open ;
LINK-16 JUNCTION-10 JUNCTION-11 409.000000 7.999841 138.000000 0.000000 Open ;
LINK-17 JUNCTION-110 JUNCTION-34 124.000000 12.000000 138.000000 0.000000 Open ;
LINK-18 JUNCTION-128 JUNCTION-1 320.000000 30.000000 138.000000 0.000000 Open ;
LINK-19 RESERVOIR-129 JUNCTION-128 153 30.000000 138.000000 0.000000 Open ;
LINK-20 JUNCTION-12 JUNCTION-13 597.000000 8.000000 140.000000 0.000000 Open ;
LINK-21 JUNCTION-12 JUNCTION-11 671.000000 7.999810 138.000000 0.000000 Open ;
LINK-22 JUNCTION-14 JUNCTION-12 332.000000 7.999863 139.000000 0.000000 Open ;
LINK-23 JUNCTION-5 JUNCTION-15 2089.000000 7.999852 139.000000 0.000000 Open ;
LINK-24 JUNCTION-15 JUNCTION-3 150 8.000000 139.000000 0.000000 Open ;
LINK-25 JUNCTION-15 JUNCTION-111 190 8.000000 140.000000 0.000000 Open ;
LINK-26 JUNCTION-112 JUNCTION-14 196 8.000000 140.000000 0.000000 Open ;
LINK-27 JUNCTION-14 JUNCTION-16 928.000000 8.000000 140.000000 0.000000 Open ;
LINK-28 JUNCTION-17 JUNCTION-18 1382.000000 16.000290 138.000000 0.000000 Open ;
LINK-29 JUNCTION-18 JUNCTION-116 731.000000 16.000150 138.000000 0.000000 Open ;
LINK-30 JUNCTION-0 JUNCTION-4 1570.000000 7.999764 139.000000 0.000000 Open ;
LINK-31 JUNCTION-29 JUNCTION-28 1402.000000 24.000489 138.000000 0.000000 Open ;
LINK-32 JUNCTION-45 JUNCTION-46 1811.000000 7.999830 140.000000 0.000000 Open ;
LINK-33 JUNCTION-23 JUNCTION-124 1845.000000 12.000000 140.000000 0.000000 Open ;
LINK-34 JUNCTION-122 JUNCTION-123 2433.000000 12.000000 140.000000 0.000000 Open ;
LINK-35 JUNCTION-34 JUNCTION-30 10260.284142 24.000979 138.000000 0.000000 Open ;
LINK-36 JUNCTION-41 JUNCTION-39 1066.000000 7.999947 138.000000 0.000000 Open ;
LINK-37 JUNCTION-2 JUNCTION-3 1066.000000 7.999796 139.000000 0.000000 Open ;
LINK-38 JUNCTION-11 JUNCTION-10 1000.000000 7.999805 138.000000 0.000000 Open ;
LINK-39 JUNCTION-117 JUNCTION-17 1537.000000 16.000075 138.000000 0.000000 Open ;
LINK-40 JUNCTION-20 JUNCTION-21 2125.000000 20.000594 138.000000 0.000000 Open ;
LINK-41 JUNCTION-20 JUNCTION-115 3227.000000 16.000327 138.000000 0.000000 Open ;
LINK-42 JUNCTION-19 JUNCTION-125 2125.000000 20.000167 138.000000 0.000000 Open ;
LINK-43 JUNCTION-19 JUNCTION-20 942.000000 20.000000 138.000000 0.000000 Open ;
LINK-44 JUNCTION-21 JUNCTION-22 1257.000000 20.000439 138.000000 0.000000 Open ;
LINK-45 JUNCTION-22 JUNCTION-23 1101.000000 24.000739 138.000000 0.000000 Open ;
LINK-46 JUNCTION-23 JUNCTION-30 1175.000000 24.000727 138.000000 0.000000 Open ;
LINK-47 JUNCTION-22 JUNCTION-24 292.000000 24.000000 138.000000 0.000000 Open ;
LINK-48 JUNCTION-24 JUNCTION-25 178.000000 24.000000 138.000000 0.000000 Open ;
LINK-49 JUNCTION-25 JUNCTION-26 336.000000 24.000000 138.000000 0.000000 Open ;
LINK-50 JUNCTION-26 JUNCTION-27 196.00 24.000000 138.000000 0.000000 Open ;
LINK-51 JUNCTION-27 JUNCTION-28 144.000000 24.000000 138.000000 0.000000 Open ;
LINK-52 JUNCTION-30 JUNCTION-31 1146.000000 12.000000 138.000000 0.000000 Open ;
LINK-53 JUNCTION-31 JUNCTION-32 1699.000000 12.000000 138.000000 0.000000 Open ;
LINK-54 JUNCTION-32 JUNCTION-33 645.000000 12.000000 138.000000 0.000000 Open ;
LINK-55 JUNCTION-33 JUNCTION-57 754.000000 8.413870 138.000000 0.000000 Open ;
LINK-56 JUNCTION-19 JUNCTION-35 1113.000000 7.999903 140.000000 0.000000 Open ;
LINK-57 JUNCTION-35 JUNCTION-36 507.000000 8.000000 140.000000 0.000000 Open ;
LINK-58 JUNCTION-35 JUNCTION-37 246.000000 7.999947 140.000000 0.000000 Open ;
LINK-59 JUNCTION-37 JUNCTION-20 739.000000 7.999947 138.000000 0.000000 Open ;
LINK-60 JUNCTION-35 JUNCTION-38 552.000000 8.000000 140.000000 0.000000 Open ;
LINK-61 JUNCTION-37 JUNCTION-39 348.000000 8.000000 138.000000 0.000000 Open ;
LINK-62 JUNCTION-39 JUNCTION-40 998.000000 8.296935 139.000000 0.000000 Open ;
LINK-63 JUNCTION-40 JUNCTION-41 619.000000 8.000000 138.000000 0.000000 Open ;
LINK-64 JUNCTION-40 JUNCTION-42 538.000000 7.999947 138.000000 0.000000 Open ;
LINK-65 JUNCTION-42 JUNCTION-41 668.000000 8.000000 138.000000 0.000000 Open ;
LINK-66 JUNCTION-42 JUNCTION-27 2581.000000 8.019783 138.000000 0.000000 Open ;
LINK-67 JUNCTION-24 JUNCTION-43 544.000000 8.000000 140.000000 0.000000 Open ;
LINK-68 JUNCTION-43 JUNCTION-25 420.000000 8.000000 140.000000 0.000000 Open ;
LINK-69 JUNCTION-43 JUNCTION-44 373.000000 7.999947 140.000000 0.000000 Open ;
LINK-70 JUNCTION-44 JUNCTION-26 556.000000 8.000000 140.000000 0.000000 Open ;
LINK-71 JUNCTION-44 JUNCTION-28 752.000000 7.999947 140.000000 0.000000 Open ;
LINK-72 JUNCTION-29 TANK-130 242.000000 24.000000 138.000000 0.000000 Open ;
LINK-73 JUNCTION-21 JUNCTION-47 91.000000 8.000000 139.000000 0.000000 Open ;
LINK-74 JUNCTION-47 JUNCTION-48 805.000000 8.000000 139.000000 0.000000 Open ;
LINK-75 JUNCTION-48 JUNCTION-49 574.000000 8.000000 139.000000 0.000000 Open ;
LINK-76 JUNCTION-49 JUNCTION-22 158.000000 8.000000 139.000000 0.000000 Open ;
LINK-77 JUNCTION-49 JUNCTION-50 577.000000 7.999947 139.000000 0.000000 Open ;
LINK-78 JUNCTION-50 JUNCTION-51 388.000000 8.000000 139.000000 0.000000 Open ;
LINK-79 JUNCTION-51 JUNCTION-48 236.000000 8.000000 139.000000 0.000000 Open ;
LINK-80 JUNCTION-51 JUNCTION-52 393.000000 8.000000 139.000000 0.000000 Open ;
LINK-81 JUNCTION-52 JUNCTION-47 549.000000 7.999947 139.000000 0.000000 Open ;
LINK-82 JUNCTION-52 JUNCTION-50 1381.000000 7.999947 139.000000 0.000000 Open ;
LINK-83 JUNCTION-23 JUNCTION-53 919.000000 9.999941 139.000000 0.000000 Open ;
LINK-84 JUNCTION-53 JUNCTION-54 386.000000 9.999970 139.000000 0.000000 Open ;
LINK-85 JUNCTION-54 JUNCTION-31 229.000000 10.000000 139.000000 0.000000 Open ;
LINK-86 JUNCTION-53 JUNCTION-56 232.000000 8.000000 140.000000 0.000000 Open ;
LINK-87 JUNCTION-56 JUNCTION-55 390.000000 8.000000 140.000000 0.000000 Open ;
LINK-88 JUNCTION-55 JUNCTION-54 254.000000 8.000000 140.000000 0.000000 Open ;
LINK-89 JUNCTION-55 JUNCTION-56 873.000000 7.999947 140.000000 0.000000 Open ;
LINK-90 JUNCTION-32 JUNCTION-57 945.000000 7.999947 140.000000 0.000000 Open ;
LINK-91 JUNCTION-57 JUNCTION-33 230.000000 8.000000 140.000000 0.000000 Open ;
LINK-92 JUNCTION-31 JUNCTION-58 1155.000000 10.000000 139.000000 0.000000 Open ;
LINK-93 JUNCTION-58 JUNCTION-59 413.000000 8.000000 140.000000 0.000000 Open ;
LINK-94 JUNCTION-59 JUNCTION-60 943.000000 7.999947 140.000000 0.000000 Open ;
LINK-95 JUNCTION-60 JUNCTION-59 196.000000 8.000000 140.000000 0.000000 Open ;
LINK-96 JUNCTION-60 JUNCTION-61 133.000000 8.000000 140.000000 0.000000 Open ;
LINK-97 JUNCTION-61 JUNCTION-62 138.000000 8.000000 140.000000 0.000000 Open ;
LINK-98 JUNCTION-62 JUNCTION-63 187.000000 8.000000 140.000000 0.000000 Open ;
LINK-99 JUNCTION-63 JUNCTION-64 134.000000 8.000000 139.000000 0.000000 Open ;
LINK-100 JUNCTION-64 JUNCTION-65 300.000000 8.000000 139.000000 0.000000 Open ;
LINK-101 JUNCTION-65 JUNCTION-66 108 8.000000 139.000000 0.000000 Open ;
LINK-102 JUNCTION-66 JUNCTION-67 420.000000 7.999947 139.000000 0.000000 Open ;
LINK-103 JUNCTION-67 JUNCTION-61 209.000000 8.000000 139.000000 0.000000 Open ;
LINK-104 JUNCTION-66 JUNCTION-67 398.000000 7.999947 139.000000 0.000000 Open ;
LINK-105 JUNCTION-68 JUNCTION-58 381.000000 10.000000 139.000000 0.000000 Open ;
LINK-106 JUNCTION-64 JUNCTION-65 872.000000 7.999947 140.000000 0.000000 Open ;
LINK-107 JUNCTION-65 JUNCTION-68 199.000000 8.000000 140.000000 0.000000 Open ;
LINK-108 JUNCTION-63 JUNCTION-62 713.000000 7.999947 140.000000 0.000000 Open ;
LINK-109 JUNCTION-68 JUNCTION-69 1095.000000 10.000000 139.000000 0.000000 Open ;
LINK-110 JUNCTION-69 JUNCTION-70 231.000000 8.000000 140.000000 0.000000 Open ;
LINK-111 JUNCTION-70 JUNCTION-71 695.000000 8.000000 140.000000 0.000000 Open ;
LINK-112 JUNCTION-70 JUNCTION-72 528.000000 8.000000 140.000000 0.000000 Open ;
LINK-113 JUNCTION-73 JUNCTION-69 938.000000 10.000000 139.000000 0.000000 Open ;
LINK-114 JUNCTION-72 JUNCTION-74 169.000000 8.000000 140.000000 0.000000 Open ;
LINK-115 JUNCTION-74 JUNCTION-73 127.000000 8.000000 140.000000 0.000000 Open ;
LINK-116 JUNCTION-72 JUNCTION-75 928.000000 7.999947 139.000000 0.000000 Open ;
LINK-117 JUNCTION-75 JUNCTION-74 336.000000 8.000000 139.000000 0.000000 Open ;
LINK-118 JUNCTION-75 JUNCTION-76 772.000000 8.000000 139.000000 0.000000 Open ;
LINK-119 JUNCTION-76 JUNCTION-77 417.000000 8.000000 139.000000 0.000000 Open ;
LINK-120 JUNCTION-77 JUNCTION-73 655.000000 10.000000 139.000000 0.000000 Open ;
LINK-121 JUNCTION-76 JUNCTION-78 167.000000 8.000000 139.000000 0.000000 Open ;
LINK-122 JUNCTION-78 JUNCTION-79 169.000000 8.000000 139.000000 0.000000 Open ;
LINK-123 JUNCTION-79 JUNCTION-80 195.000000 10.000000 139.000000 0.000000 Open ;
LINK-124 JUNCTION-80 JUNCTION-81 333.000000 10.000000 139.000000 0.000000 Open ;
LINK-125 JUNCTION-81 JUNCTION-77 186 10.000000 139.000000 0.000000 Open ;
LINK-126 JUNCTION-78 JUNCTION-71 895.000000 8.000000 139.000000 0.000000 Open ;
LINK-127 JUNCTION-80 JUNCTION-82 372.000000 8.000000 139.000000 0.000000 Open ;
LINK-128 JUNCTION-82 JUNCTION-83 205.000000 8.000000 139.000000 0.000000 Open ;
LINK-129 JUNCTION-83 JUNCTION-84 430.000000 8.000000 139.000000 0.000000 Open ;
LINK-130 JUNCTION-84 JUNCTION-81 152.000000 8.000000 139.000000 0.000000 Open ;
LINK-131 JUNCTION-84 JUNCTION-83 1586.000000 7.999947 139.000000 0.000000 Open ;
LINK-132 JUNCTION-82 JUNCTION-85 174.000000 8.000000 139.000000 0.000000 Open ;
LINK-133 JUNCTION-85 JUNCTION-86 456.000000 8.000000 139.000000 0.000000 Open ;
LINK-134 JUNCTION-86 JUNCTION-87 341.000000 8.000000 139.000000 0.000000 Open ;
LINK-135 JUNCTION-87 JUNCTION-85 507.000000 8.000000 139.000000 0.000000 Open ;
LINK-136 JUNCTION-87 JUNCTION-88 195.000000 8.000000 139.000000 0.000000 Open ;
LINK-137 JUNCTION-88 JUNCTION-79 250.000000 10.000000 139.000000 0.000000 Open ;
LINK-138 JUNCTION-88 JUNCTION-89 191.000000 10.000000 139.000000 0.000000 Open ;
LINK-139 JUNCTION-89 JUNCTION-86 926.000000 7.999947 140.000000 0.000000 Open ;
LINK-140 JUNCTION-89 JUNCTION-90 464.000000 10.000000 139.000000 0.000000 Open ;
LINK-141 JUNCTION-90 JUNCTION-91 178.000000 10.000000 139.000000 0.000000 Open ;
LINK-142 JUNCTION-91 JUNCTION-92 167.000000 10.000000 139.000000 0.000000 Open ;
LINK-143 JUNCTION-92 JUNCTION-33 403.000000 10.000000 139.000000 0.000000 Open ;
LINK-144 JUNCTION-90 JUNCTION-93 143.000000 8.000000 139.000000 0.000000 Open ;
LINK-145 JUNCTION-93 JUNCTION-94 331.000000 8.000000 139.000000 0.000000 Open ;
LINK-146 JUNCTION-94 JUNCTION-92 157.000000 8.000000 139.000000 0.000000 Open ;
LINK-147 JUNCTION-93 JUNCTION-94 1805.000000 7.999947 139.000000 0.000000 Open ;
LINK-148 JUNCTION-92 JUNCTION-95 177.000000 8.000000 139.000000 0.000000 Open ;
LINK-149 JUNCTION-95 JUNCTION-96 332.000000 8.000000 139.000000 0.000000 Open ;
LINK-150 JUNCTION-96 JUNCTION-95 1432.000000 7.999947 139.000000 0.000000 Open ;
LINK-151 JUNCTION-91 JUNCTION-97 489.000000 8.000000 139.000000 0.000000 Open ;
LINK-152 JUNCTION-97 JUNCTION-96 122.000000 8.000000 139.000000 0.000000 Open ;
LINK-153 JUNCTION-97 JUNCTION-98 285.000000 8.000000 139.000000 0.000000 Open ;
LINK-154 JUNCTION-98 JUNCTION-99 597.000000 8.000000 139.000000 0.000000 Open ;
LINK-155 JUNCTION-99 JUNCTION-100 148.000000 8.000000 139.000000 0.000000 Open ;
LINK-156 JUNCTION-100 JUNCTION-101 812.000000 7.999900 139.000000 0.000000 Open ;
LINK-157 JUNCTION-101 JUNCTION-98 152.000000 8.000000 139.000000 0.000000 Open ;
LINK-158 JUNCTION-100 JUNCTION-101 620.000000 8.000000 139.000000 0.000000 Open ;
LINK-159 JUNCTION-98 JUNCTION-99 784.000000 7.999947 139.000000 0.000000 Open ;
LINK-160 JUNCTION-97 JUNCTION-71 1214.000000 8.000000 139.000000 0.000000 Open ;
LINK-161 JUNCTION-45 JUNCTION-46 718.000000 10.000000 138.000000 0.000000 Open ;
LINK-162 JUNCTION-46 JUNCTION-120 315.000000 10.000000 138.000000 0.000000 Open ;
LINK-163 JUNCTION-119 JUNCTION-104 201 10.000000 138.000000 0.000000 Open ;
LINK-164 JUNCTION-103 JUNCTION-102 930.000000 12.000000 140.000000 0.000000 Open ;
LINK-165 JUNCTION-102 TANK-131 559.000000 16.000000 140.000000 0.000000 Open ;
LINK-166 JUNCTION-29 JUNCTION-105 169.000000 11.974181 140.000000 0.000000 Open ;
LINK-167 JUNCTION-106 JUNCTION-104 84.000000 8.000000 138.000000 0.000000 Open ;
LINK-168 JUNCTION-103 JUNCTION-121 291.000000 12.000000 140.000000 0.000000 Open ;
LINK-169 JUNCTION-103 JUNCTION-104 4700.000000 10.121698 138.000000 0.000000 Open ;
[PUMPS]
;ID Node1 Node2 Parameters
PUMP-170 JUNCTION-105 JUNCTION-106 HEAD CURVE-1 ;
PUMP-172 JUNCTION-109 JUNCTION-110 HEAD CURVE-1 ;
[VALVES]
;ID Node1 Node2 Diameter Type Setting MinorLoss
VALVE-173 JUNCTION-111 JUNCTION-112 6.000000 TCV 0.2000000 0 ;
VALVE-174 JUNCTION-113 JUNCTION-114 6.000000 TCV 0.2000000 0 ;
VALVE-175 JUNCTION-115 JUNCTION-116 10.000000 TCV 0.2000000 0 ;
VALVE-176 JUNCTION-117 JUNCTION-118 6.000000 TCV 0.2000 0 ;
VALVE-177 JUNCTION-119 JUNCTION-120 6.000000 TCV 0.2000000 0 ;
VALVE-178 JUNCTION-121 JUNCTION-122 6.000000 TCV 0.2000000 0 ;
VALVE-179 JUNCTION-123 JUNCTION-124 8.000000 TCV 0.2000000 0 ;
VALVE-180 JUNCTION-125 JUNCTION-126 8.000000 TCV 0.20000 0 ;
[TAGS]
[DEMANDS]
;Junction Demand Pattern Category
[STATUS]
;ID Status/Setting
VALVE-173 Open
VALVE-174 Open
VALVE-175 Open
VALVE-176 Open
VALVE-177 Open
VALVE-178 Open
VALVE-179 Open
VALVE-180 Open
[PATTERNS]
;ID Multipliers
;
PATTERN-0 1.560000 1.360000 1.170000 1.130000 1.080000 1.040000
PATTERN-0 1.200000 0.640000 1.080000 0.530000 0.290000 0.900000
PATTERN-0 1.110000 1.060000 1.000000 1.650000 0.550000 0.740000
PATTERN-0 0.640000 0.460000 0.580000 0.640000 0.710000 0.660000
PATTERN-0 0.680000 0.430000 0.370000 0.330000 0.230000 0.210000
PATTERN-0 0.060000 0.100000 0.100000 0.140000 0.090000 0.100000
PATTERN-0 0.090000 0.090000 0.030000 0.230000 0.270000 0.720000
PATTERN-0 0.930000 1.130000 1.390000 1.940000 1.900000 1.830000
PATTERN-0 2.730000 1.740000 1.290000 1.410000 1.390000 1.350000
PATTERN-0 1.190000 1.340000 0.950000 1.270000 1.280000 1.090000
PATTERN-0 1.010000 1.130000 1.000000 0.770000 0.670000 0.760000
PATTERN-0 0.760000 0.710000 0.580000 0.860000 0.960000 0.970000
PATTERN-0 0.820000 0.710000 0.650000 0.620000 0.440000 0.480000
PATTERN-0 0.550000 0.560000 0.610000 0.600000 0.440000 0.460000
PATTERN-0 0.440000 0.400000 0.440000 0.690000 0.760000 1.190000
PATTERN-0 1.330000 1.730000 1.970000 2.370000 2.280000 2.100000
;
PATTERN-1 80.000000 80.000000 80.000000 80.000000 80.000000 80.000000
PATTERN-1 80.000000 80.000000 80.000000 80.000000 80.000000 80.000000
PATTERN-1 80.000000 80.000000 80.000000 80.000000 80.000000 80.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 80.000000 80.000000
PATTERN-1 80.000000 80.000000 80.000000 80.000000 80.000000 80.000000
PATTERN-1 80.000000 80.000000 80.000000 80.000000 80.000000 80.000000
PATTERN-1 80.000000 80.000000 80.000000 80.000000 80.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PATTERN-1 0.000000 0.000000 0.000000 80.000000 80.000000 80.000000
;
PATTERN-2 0.800000 0.840000 0.880000 0.970000 1.070000 1.010000
PATTERN-2 0.960000 0.970000 0.990000 1.080000 1.180000 1.190000
PATTERN-2 1.190000 1.220000 1.250000 1.250000 1.260000 1.220000
PATTERN-2 1.190000 1.160000 1.140000 1.120000 1.110000 1.100000
PATTERN-2 1.100000 1.060000 1.020000 1.010000 1.010000 1.000000
PATTERN-2 1.000000 0.850000 0.710000 0.700000 0.690000 0.740000
PATTERN-2 0.790000 0.800000 0.800000 0.800000 0.810000 0.770000
PATTERN-2 0.740000 0.740000 0.750000 0.780000 0.810000 0.800000
;
PATTERN-3 423.300000 225.000000 26.700000 26.700000 26.700000 26.700000
PATTERN-3 26.700000 26.700000 26.700000 202.100000 377.500000 202.100000
PATTERN-3 25.800000 25.900000 25.900000 26.000000 26.000000 26.100000
PATTERN-3 26.100000 26.100000 26.200000 26.300000 26.300000 26.300000
PATTERN-3 26.300000 26.300000 26.400000 239.900000 453.500000 240.500000
PATTERN-3 27.400000 267.800000 508.100000 462.100000 416.000000 327.500000
PATTERN-3 238.900000 133.000000 27.100000 27.100000 27.100000 27.100000
PATTERN-3 27.100000 248.000000 468.900000 360.700000 252.400000 449.500000
PATTERN-3 646.500000 336.600000 26.800000 198.900000 371.100000 198.400000
PATTERN-3 25.800000 25.800000 25.800000 25.800000 25.800000 25.900000
PATTERN-3 26.000000 26.000000 26.000000 26.100000 26.200000 26.200000
PATTERN-3 26.200000 26.200000 26.300000 26.300000 26.300000 26.300000
PATTERN-3 26.300000 228.300000 430.200000 657.200000 884.200000 884.200000
PATTERN-3 884.300000 884.400000 884.500000 884.500000 884.500000 663.300000
PATTERN-3 442.100000 234.200000 26.300000 47.200000 68.000000 352.200000
PATTERN-3 636.400000 331.200000 26.000000 26.100000 26.100000 224.700000
[CURVES]
;ID X-Value Y-Value
;PUMP: PUMP: PUMP: PUMP: PUMP:
CURVE-0 0.000000 445.000000
CURVE-0 790.000000 365.000000
CURVE-0 1460.000000 120.000000
;PUMP: PUMP: PUMP: PUMP: PUMP:
CURVE-1 0.000000 730.000000
CURVE-1 1000.000000 500.000000
CURVE-1 1350.000000 260.000000
;PUMP: PUMP: PUMP: PUMP: PUMP:
CURVE-2 0.000000 740.000000
CURVE-2 2000.000000 530.000000
CURVE-2 3240.000000 205.000000
[CONTROLS]
[RULES]
[ENERGY]
Global Efficiency 75.000000
Global Price 0
Demand Charge 0.000000
[EMITTERS]
;Junction Coefficient
[QUALITY]
;Node InitQual
[SOURCES]
;Node Type Quality Pattern
[REACTIONS]
;Type Pipe/Tank Coefficient
[REACTIONS]
Order Bulk 1
Order Tank 1
Order Wall 1
Global Bulk 0.000000
Global Wall 0.000000
Limiting Potential 0
Roughness Correlation 0
[MIXING]
;Tank Model
[TIMES]
Duration 1:00
Hydraulic Timestep 0:30
Quality Timestep 0:05
Pattern Timestep 0:30
Pattern Start 0:00
Report Timestep 1:00
Report Start 0:00
Start ClockTime 8:00 AM
Statistic NONE
[REPORT]
Status No
Summary No
Page 0
[OPTIONS]
Units GPM
Headloss H-W
Specific Gravity 1.000000
Viscosity 1.1e-005
Trials 40
Accuracy 0.001
CHECKFREQ 2
MAXCHECK 10
DAMPLIMIT 0
Unbalanced Stop
Pattern PATTERN-0
Demand Multiplier 1.000000
Emitter Exponent 0.500000
Quality None mg/L
Diffusivity 100
Tolerance 0.010000
[COORDINATES]
;Node X-Coord Y-Coord
JUNCTION-0 10660.89 12699.67
JUNCTION-1 232.34 198.38
JUNCTION-2 10096.30 12963.00
JUNCTION-3 8407.85 12291.24
JUNCTION-4 9496.42 11972.35
JUNCTION-5 9011.59 11369.17
JUNCTION-6 9013.79 11080.51
JUNCTION-7 9250.29 11199.54
JUNCTION-8 9581.36 10752.81
JUNCTION-9 10733.82 11618.76
JUNCTION-10 9928.19 13544.98
JUNCTION-11 8807.74 13153.79
JUNCTION-12 7701.69 12907.40
JUNCTION-13 6876.11 12848.50
JUNCTION-14 8251.47 12444.71
JUNCTION-15 8259.98 12265.86
JUNCTION-16 6336.78 11924.32
JUNCTION-17 11390.23 12721.86
JUNCTION-18 11057.11 11140.34
JUNCTION-19 18876.92 11353.89
JUNCTION-20 17934.43 10606.32
JUNCTION-21 17059.69 8043.82
JUNCTION-22 17247.33 6999.27
JUNCTION-23 17410.54 5888.57
JUNCTION-24 17999.87 7351.33
JUNCTION-25 18109.38 7395.83
JUNCTION-26 19053.01 7351.84
JUNCTION-27 19106.85 7553.33
JUNCTION-28 19686.69 7293.81
JUNCTION-29 21853.72 7382.88
JUNCTION-30 17071.34 5128.88
JUNCTION-31 15171.37 5740.90
JUNCTION-32 13238.08 6332.93
JUNCTION-33 12424.38 7418.33
JUNCTION-34 1250.49 498.88
JUNCTION-35 19673.06 10686.87
JUNCTION-36 20403.76 10472.92
JUNCTION-37 18985.90 10631.23
JUNCTION-38 18607.97 10713.49
JUNCTION-39 19166.06 10506.15
JUNCTION-40 19099.54 10176.22
JUNCTION-41 17861.02 9889.20
JUNCTION-42 18385.78 9430.10
JUNCTION-43 18490.35 6790.82
JUNCTION-44 18645.08 7129.68
JUNCTION-45 21195.36 8702.78
JUNCTION-46 21278.01 7694.47
JUNCTION-47 16855.92 8656.03
JUNCTION-48 16904.90 7714.24
JUNCTION-49 16927.55 6903.29
JUNCTION-50 16551.63 7560.14
JUNCTION-51 16614.08 8245.07
JUNCTION-52 16228.29 7895.69
JUNCTION-53 15807.37 6484.02
JUNCTION-54 15143.01 5790.53
JUNCTION-55 15452.25 5855.21
JUNCTION-56 15614.75 6241.36
JUNCTION-57 12641.61 7580.16
JUNCTION-58 12889.67 5314.84
JUNCTION-59 14170.10 5753.98
JUNCTION-60 13812.99 6116.38
JUNCTION-61 13623.60 5755.55
JUNCTION-62 13553.54 5928.47
JUNCTION-63 13138.41 6329.93
JUNCTION-64 12860.32 6023.02
JUNCTION-65 12449.32 5619.02
JUNCTION-66 12955.43 5888.95
JUNCTION-67 13301.09 5801.58
JUNCTION-68 12578.78 5441.85
JUNCTION-69 10677.34 4900.98
JUNCTION-70 10181.06 5473.86
JUNCTION-71 11140.24 5728.02
JUNCTION-72 9885.02 5770.85
JUNCTION-73 8969.76 5646.52
JUNCTION-74 9308.85 5671.41
JUNCTION-75 9946.22 6083.37
JUNCTION-76 9607.47 6199.74
JUNCTION-77 9051.85 6450.38
JUNCTION-78 10166.55 6572.87
JUNCTION-79 9485.75 6648.12
JUNCTION-80 9568.49 6824.95
JUNCTION-81 8741.43 6287.84
JUNCTION-82 8978.26 6693.00
JUNCTION-83 8345.05 6938.19
JUNCTION-84 8751.56 6635.61
JUNCTION-85 9279.58 7087.57
JUNCTION-86 9876.13 7369.96
JUNCTION-87 9804.94 7308.79
JUNCTION-88 9879.39 6704.35
JUNCTION-89 10235.12 6748.13
JUNCTION-90 10216.80 7677.21
JUNCTION-91 11071.02 7420.24
JUNCTION-92 11350.46 7397.70
JUNCTION-93 10935.56 7058.08
JUNCTION-94 11167.17 7199.21
JUNCTION-95 11919.97 7225.08
JUNCTION-96 12279.69 6864.49
JUNCTION-97 12009.44 6806.61
JUNCTION-98 11504.57 6811.20
JUNCTION-99 10798.43 6305.49
JUNCTION-100 10495.63 6494.15
JUNCTION-101 11456.95 7127.08
JUNCTION-102 25891.06 3341.73
JUNCTION-103 24306.48 3387.26
JUNCTION-104 22275.22 7224.91
JUNCTION-105 22205.02 7496.88
JUNCTION-106 22698.70 7650.31
JUNCTION-109 694.79 -18.12
JUNCTION-110 862.27 205.84
JUNCTION-111 8270.97 12259.89
JUNCTION-112 8176.75 12053.87
JUNCTION-113 9457.16 13032.31
JUNCTION-114 9711.67 13144.65
JUNCTION-115 12096.99 10755.48
JUNCTION-116 11965.70 10646.33
JUNCTION-117 14008.10 13489.78
JUNCTION-118 13980.49 13520.62
JUNCTION-119 22395.73 7684.44
JUNCTION-120 22300.21 7726.14
JUNCTION-121 23322.75 3866.35
JUNCTION-122 23012.94 4255.69
JUNCTION-123 20282.88 5465.74
JUNCTION-124 20326.50 5404.05
JUNCTION-125 21576.64 13167.78
JUNCTION-126 21563.80 13128.27
JUNCTION-128 269.38 602.32
RESERVOIR-129 21.20 583.42
TANK-130 21873.08 6912.07
TANK-131 25900.14 3983.02
[VERTICES]
;Link X-Coord Y-Coord
[LABELS]
;X-Coord Y-Coord Label & Anchor Node
16759.25 11079.85 "JUNCTION-20"
16667.28 9546.98 "LINK-40"
17326.41 8029.44 "JUNCTION-22"
9539.44 8075.43 "JUNCTION-90"
9064.25 10589.33 "JUNCTION-8"
5891.21 11815.63 "JUNCTION-16"
21235.22 8719.23 "JUNCTION-45"
[BACKDROP]
DIMENSIONS -1295.01 -677.25 27195.15 14222.23
UNITS None
FILE
OFFSET 0.00 0.00
[END]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,134 @@
[TITLE]
[JUNCTIONS]
;ID Elev Demand Pattern
1 0 0 ;
2 0 0 ;
END 0 1 ;
[RESERVOIRS]
;ID Head Pattern
T 100 ;
[TANKS]
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
[PIPES]
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
p1 T 1 1000 600 100 0 Open ;
p2 2 END 1000 600 100 0 Open ;
[PUMPS]
;ID Node1 Node2 Parameters
pump 1 2 HEAD 1 ;
[VALVES]
;ID Node1 Node2 Diameter Type Setting MinorLoss
[TAGS]
[DEMANDS]
;Junction Demand Pattern Category
[STATUS]
;ID Status/Setting
[PATTERNS]
;ID Multipliers
[CURVES]
;ID X-Value Y-Value
;PUMP:
1 0 133
1 200 100
1 400 2
[CONTROLS]
[RULES]
[ENERGY]
Global Efficiency 75
Global Price 0
Demand Charge 0
[EMITTERS]
;Junction Coefficient
[QUALITY]
;Node InitQual
[SOURCES]
;Node Type Quality Pattern
[REACTIONS]
;Type Pipe/Tank Coefficient
[REACTIONS]
Order Bulk 1
Order Tank 1
Order Wall 1
Global Bulk 0
Global Wall 0
Limiting Potential 0
Roughness Correlation 0
[MIXING]
;Tank Model
[TIMES]
Duration 0
Hydraulic Timestep 1:00
Quality Timestep 0:05
Pattern Timestep 1:00
Pattern Start 0:00
Report Timestep 1:00
Report Start 0:00
Start ClockTime 12 am
Statistic None
[REPORT]
Status No
Summary No
Page 0
[OPTIONS]
Units LPS
Headloss H-W
Specific Gravity 1
Viscosity 1
Trials 40
Accuracy 0.001
CHECKFREQ 2
MAXCHECK 10
DAMPLIMIT 0
Unbalanced Continue 10
Pattern 1
Demand Multiplier 1.0
Emitter Exponent 0.5
Quality None mg/L
Diffusivity 1
Tolerance 0.01
[COORDINATES]
;Node X-Coord Y-Coord
1 1583.33 5000.00
2 3416.67 5037.04
END 5435.19 5000.00
T -435.19 5074.07
[VERTICES]
;Link X-Coord Y-Coord
[LABELS]
;X-Coord Y-Coord Label & Anchor Node
[BACKDROP]
DIMENSIONS 0.00 0.00 10000.00 10000.00
UNITS None
FILE
OFFSET 0.00 0.00
[END]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,198 @@
-----------------------------------
| HAMMER Engine 08.11.06.113 |
-------------------------------------------------------------------------------
Based on Technology Originally Developed by GENIVAR(EHG). Compiled by IVF.
Copyright (C) 2011 Bentley Systems, Incorporated. All Rights Reserved.
-------------------------------------------------------------------------------
Type of Run: Full
Date of Run: 03/21/20
Time of Run: 12:33 pm
Data File: Tnet0.wtg.sqlite.$$$
Hydrograph File: Not Selected
Labels: Long
*** SYSTEM INFORMATION ***
---------------------------------------------------
| ITEM | VALUE |
---------------------------------------------------
| | |
| Time Step (s) | |
| Automatic | 0.1000 |
| User-Selected | 0.1000 |
| Total Number | 600 |
| Total Simulation Time (s) | 60.00 |
| Units | cms, m |
| Total Number of Nodes | 3 |
| Total Number of Pipes | 2 |
| Specific Gravity | 1.00 |
| Wave Speed (m/s) | 1200 |
| Vapour Pressure(m) | -10.0 |
| Reports | |
| Number of Nodes | All |
| Number of Time Steps | All |
| Number of Paths | 0 |
| Output | |
| Standard | No |
| Cavities (Open/Close) | No |
| Adjustments | |
| Adjusted Variable | Wave Speed |
| Warning Limit (%) | 50.00 |
| Minimize | Adjustments |
| Calculate Transient Forces | No |
| Use Auxiliary Data File | Yes |
---------------------------------------------------
*** PREFERENCE AND DEBUG INFORMATION ***
--------------------------------------------------------
| ITEM | VALUE |
--------------------------------------------------------
| | |
| Tolerances | |
| Initial Flow Consistency Value | 0.0006 |
| Initial Head Consistency Value | 0.030 |
| Criterion for Fr. Coef. Flag | 0.020 |
| Adjustments | |
| Elevation Decrease | 0.00 |
| Extreme Heads Display | |
| All Times | Yes |
| After First Extreme | No |
| Friction Coefficient | |
| Model | Steady |
| 1,000,000 x Kinematic Viscosity | n/a |
| Debug Parameters | |
| Level | Null |
--------------------------------------------------------
*** NODE INFORMATION ***
----------------------------------------------------------------------------------------------------
| | CATEGORY | TYPE | ELEVATION | | | VAP PRESS |
| LABEL | DESCRIPTION | DESCRIPTION | (m) | X COORD | Y COORD | (m) |
----------------------------------------------------------------------------------------------------
| | | | | | | |
| 1 | Reservoir | 1 or more | 0.0 | 0.0 | 0.0 | -10.0 |
| D2A-3 | Valve | to atmos. | 0.0 | 2613.2 | 10.3 | -10.0 |
| 2 | Junction | 2 or more | 0.0 | 1152.3 | 10.3 | -10.0 |
----------------------------------------------------------------------------------------------------
*** NODE DATA ***
----------------------------------------------------------------------
| LABEL | DATA |
----------------------------------------------------------------------
| | |
| 1 | |
| | |
| D2A-3 | Initial/typical Outflow: 0.0500 |
| | Corresponding Pressure: 749.9 |
| | Operating Time: 2 |
| | Time Lag: 0 |
| | |
| 2 | |
----------------------------------------------------------------------
*** CONNECTIVITY ***
---------------------------------------------
| PIPE LABEL | FROM NODE | TO NODE |
---------------------------------------------
| | | |
| 2 | 2 | D2A-3 |
| 1 | 1 | 2 |
---------------------------------------------
*** PIPE INFORMATION ***
-----------------------------------------------------------------------------------------
| | LENGTH | DIAMETER | WAVESPEED | D-W | CHECK |
| LABEL | (m) | (mm) | (m /s) | FR. COEF. | VALVE |
-----------------------------------------------------------------------------------------
| | | | | | |
| 2 | 2400.0 | 1200.00 | 1200.0 | *0.021 | |
| 1 | 1200.0 | 600.00 | 1200.0 | 0.018 | |
-----------------------------------------------------------------------------------------
* Darcy-Weisbach friction coefficient exceeds 0.020
*** INITIAL PIPE CONDITIONS ***
-------------------------------------------------------------------------------------
| FROM | HEAD | TO | HEAD | FLOW | VEL |
| NODE | (m) | NODE | (m) | (cms) | (m/s) |
-------------------------------------------------------------------------------------
| | | | | | |
| 2 | 749.9 | D2A-3 | 749.9 | 0.0 | 0.0 |
| 1 | 750.0 | 2 | 749.9 | 0.0 | 0.2 |
-------------------------------------------------------------------------------------
-----------------------------------
| HAMMER Engine 08.11.06.113 |
-------------------------------------------------------------------------------
Based on Technology Originally Developed by GENIVAR(EHG). Compiled by IVF.
Copyright (C) 2011 Bentley Systems, Incorporated. All Rights Reserved.
-------------------------------------------------------------------------------
*** List of end points with possible discrepancies in input values ***
NOTE: End points where initial surges generated are included.
2:D2A-3
-----------------------------------
| HAMMER Engine 08.11.06.113 |
-------------------------------------------------------------------------------
Based on Technology Originally Developed by GENIVAR(EHG). Compiled by IVF.
Copyright (C) 2011 Bentley Systems, Incorporated. All Rights Reserved.
-------------------------------------------------------------------------------
*** LIST OF SORTED VAPOUR AND AIR POCKETS ***
No vapour/air pockets were formed.
-----------------------------------
| HAMMER Engine 08.11.06.113 |
-------------------------------------------------------------------------------
Based on Technology Originally Developed by GENIVAR(EHG). Compiled by IVF.
Copyright (C) 2011 Bentley Systems, Incorporated. All Rights Reserved.
-------------------------------------------------------------------------------
*** SUMMARY FOR Default Project-Base-Tnet0.wtg.sqlite.$$$ ***
--------------------------------------------------------------------------------
| END | MAX. PRESS. | MIN. PRESS. | MAX. HEAD | MIN. HEAD |
| POINT | (mH) | (mH) | (m) | (m) |
--------------------------------------------------------------------------------
| | | | | |
| 2:2 | 759.3 | 740.6 | 759.3 | 740.6 |
| 2:D2A-3 | 761.8 | 738.3 | 761.8 | 738.3 |
| 1:1 | 750.0 | 750.0 | 750.0 | 750.0 |
| 1:2 | 759.3 | 740.6 | 759.3 | 740.6 |
--------------------------------------------------------------------------------
*** Maximum pressure in entire network is 761.8 mH at point 2:D2A-3
*** Minimum pressure in entire network is 738.3 mH at point 2:D2A-3
Elapsed time: 0 s.

View File

@ -0,0 +1,53 @@
Page 1 Sat Mar 21 12:33:32 2020
******************************************************************
* W A T E R G E M S *
* Hydraulic and Water Quality *
* Analysis for Pipe Networks *
* Version 8.11 *
******************************************************************
Number of Junctions................ 2
Number of Reservoirs............... 1
Number of Tanks ................... 0
Number of Pipes ................... 2
Number of Pumps ................... 0
Number of Variable Speed Pumps .... 0
Number of Valves .................. 0
Headloss Formula .................. Darcy-Weisbach
Hydraulic Timestep ................ 1.00 hrs
Hydraulic Accuracy ................ 0.001000
Status Check Frequency ............ 2
Maximum Trials Checked ............ 10
Damping Limit Threshold ........... 0.000000
Maximum Trials .................... 40
Quality Analysis .................. None
Specific Gravity .................. 1.00
Relative Kinematic Viscosity ...... 0.99
Relative Chemical Diffusivity ..... -769230769230769150.00
Demand Multiplier ................. 1.00
Total Duration .................... 0.00 hrs
Reporting Criteria:
No Nodes
No Links
[Analysis Started]
Sat Mar 21 12:33:32 2020
[Steady State]
< 0:00:00 Balancing the network:>
Trial 1: relative flow change = 1.968338
Trial 2: relative flow change = 0.152481
Trial 3: relative flow change = 0.011763
Trial 4: relative flow change = 0.000069
< 0:00:00 Balanced after 4 trials; relative flow change = 0.000069>
<Flow Summary>
Flow Supplied 792.48 gpm
Flow Demanded 792.48 gpm
Flow Stored 0.00 gpm
<Flow Summary>
0:00:00 Reservoir 63 is emptying
[Analysis Ended]
Sat Mar 21 12:33:32 2020

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More