fullflow 2.0.1__tar.gz → 2.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. {fullflow-2.0.1 → fullflow-2.0.2}/CHANGELOG.md +6 -0
  2. {fullflow-2.0.1 → fullflow-2.0.2}/PKG-INFO +11 -6
  3. {fullflow-2.0.1 → fullflow-2.0.2}/README.md +9 -4
  4. {fullflow-2.0.1 → fullflow-2.0.2}/examples/testing/1test_data_anchoring.py +5 -6
  5. fullflow-2.0.2/pyproject.toml +101 -0
  6. fullflow-2.0.1/pyproject.toml → fullflow-2.0.2/pyproject.toml.orig +2 -2
  7. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Sensor.py +5 -4
  8. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/__init__.py +1 -1
  9. {fullflow-2.0.1 → fullflow-2.0.2}/tests/test_imports.py +1 -1
  10. {fullflow-2.0.1 → fullflow-2.0.2}/LICENSE +0 -0
  11. {fullflow-2.0.1 → fullflow-2.0.2}/THIRD_PARTY_LICENSES.md +0 -0
  12. {fullflow-2.0.1 → fullflow-2.0.2}/docs/system_reference.md +0 -0
  13. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/0state_basics.py +0 -0
  14. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/1state_bounds_tracking.py +0 -0
  15. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/2balance_basic.py +0 -0
  16. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/3balance_multiple.py +0 -0
  17. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/4composition_mixer.py +0 -0
  18. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/5composition_splitter.py +0 -0
  19. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/6lookup_function.py +0 -0
  20. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/7lookup_class_chaining.py +0 -0
  21. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/8map_manual.py +0 -0
  22. {fullflow-2.0.1 → fullflow-2.0.2}/examples/general/9map_hdf5.py +0 -0
  23. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/0function_lookup.py +0 -0
  24. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/1simple_pipe.py +0 -0
  25. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/2compressible_flow.py +0 -0
  26. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/3custom_component.py +0 -0
  27. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/4cavitating_venturi.py +0 -0
  28. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/5heat_exchanger.py +0 -0
  29. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/6flow_splitter.py +0 -0
  30. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/7flow_mixer.py +0 -0
  31. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/8turbopump.py +0 -0
  32. {fullflow-2.0.1 → fullflow-2.0.2}/examples/steady_state/9equilibrium_nozzle.py +0 -0
  33. {fullflow-2.0.1 → fullflow-2.0.2}/examples/testing/2sensor_events.py +0 -0
  34. {fullflow-2.0.1 → fullflow-2.0.2}/examples/testing/3sequences_and_commands.py +0 -0
  35. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/10custom_component.py +0 -0
  36. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/11heat_transfer.py +0 -0
  37. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/12heat_exchanger.py +0 -0
  38. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/13force_steady_heat_transfer.py +0 -0
  39. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/14force_steady_fluid.py +0 -0
  40. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/15piston_cylinder.py +0 -0
  41. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/16balloon.py +0 -0
  42. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/17relief_valve.py +0 -0
  43. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/18combustion_nozzle.py +0 -0
  44. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/19cavitating_venturi.py +0 -0
  45. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/1simple_pipe.py +0 -0
  46. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/20gas_turbine.py +0 -0
  47. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/21heatsink_tca.py +0 -0
  48. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/22water_hammer.py +0 -0
  49. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/23pid_throttle.py +0 -0
  50. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/24sudden_valve_opening.py +0 -0
  51. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/25engine_startup.py +0 -0
  52. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/2node_inertia.py +0 -0
  53. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/3shock_tube.py +0 -0
  54. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/4copv_blowdown.py +0 -0
  55. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/5bang_bang_control.py +0 -0
  56. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/6pump_transient.py +0 -0
  57. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/7flow_mixer.py +0 -0
  58. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/8flow_splitter.py +0 -0
  59. {fullflow-2.0.1 → fullflow-2.0.2}/examples/transient/9model_options.py +0 -0
  60. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Exceptions.py +0 -0
  61. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Exports/EXPORTS.md +0 -0
  62. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Exports/HDF5.py +0 -0
  63. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Exports/__init__.py +0 -0
  64. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/STEADY_STATE_SOLVER.md +0 -0
  65. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/TRANSIENT_SOLVER.md +0 -0
  66. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/__init__.py +0 -0
  67. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/balance_filtering.py +0 -0
  68. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/equations.py +0 -0
  69. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/__init__.py +0 -0
  70. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/diagnostics.py +0 -0
  71. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/evaluation.py +0 -0
  72. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/models.py +0 -0
  73. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/operations.py +0 -0
  74. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/results.py +0 -0
  75. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/runtime.py +0 -0
  76. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/settings.py +0 -0
  77. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/solver.py +0 -0
  78. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/steady_state/statistics.py +0 -0
  79. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/__init__.py +0 -0
  80. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/diagnostics.py +0 -0
  81. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/evaluation.py +0 -0
  82. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/models.py +0 -0
  83. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/operations.py +0 -0
  84. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/results.py +0 -0
  85. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/runtime.py +0 -0
  86. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/settings.py +0 -0
  87. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/Solvers/transient/solver.py +0 -0
  88. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Balance.py +0 -0
  89. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Component.py +0 -0
  90. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Actuators.py +0 -0
  91. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Composition.py +0 -0
  92. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/CompressibleFlow.py +0 -0
  93. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Controllers.py +0 -0
  94. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/ConvectionCoefficients.py +0 -0
  95. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/FrictionFactors.py +0 -0
  96. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/GeneralFlow.py +0 -0
  97. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/HeatTransfer.py +0 -0
  98. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Lookup.py +0 -0
  99. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Maps.py +0 -0
  100. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Nodes.py +0 -0
  101. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/RocketPerformance.py +0 -0
  102. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Sequence.py +0 -0
  103. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/Turbomachinery.py +0 -0
  104. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Components/__init__.py +0 -0
  105. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Model.py +0 -0
  106. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/Network.py +0 -0
  107. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/SYSTEM.md +0 -0
  108. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/State.py +0 -0
  109. {fullflow-2.0.1 → fullflow-2.0.2}/src/fullflow/System/__init__.py +0 -0
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.2
4
+
5
+ * Updated the FullPlot dependency to `fullplot>=0.1.1`.
6
+ * Updated Sensor missing-data documentation to match current `extend` behavior.
7
+ * Updated the test-data anchoring example to use shared `TimeAxis.window(...)` windowing.
8
+
3
9
  ## 2.0.1
4
10
 
5
11
  ### PID controller
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fullflow
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Python-native fluid, thermal, propulsion, control, and transient network simulation.
5
5
  Keywords: fluid-dynamics,fluid-network,network-analysis,thermodynamics,thermal-analysis,heat-transfer,propulsion,rocket-propulsion,rocket-engine,compressible-flow,turbomachinery,control-systems,transient-simulation,simulation,engineering,scientific-computing
6
6
  Author: Saaketh Ramoju
@@ -24,7 +24,7 @@ Requires-Dist: numpy>=1.26
24
24
  Requires-Dist: scipy>=1.11
25
25
  Requires-Dist: rich>=13.7
26
26
  Requires-Dist: h5py>=3.10
27
- Requires-Dist: fullplot>=0.1.0
27
+ Requires-Dist: fullplot>=0.1.1
28
28
  Requires-Dist: pytest>=8.0 ; extra == 'dev'
29
29
  Requires-Dist: build>=1.2 ; extra == 'dev'
30
30
  Requires-Dist: twine>=5.0 ; extra == 'dev'
@@ -1742,27 +1742,32 @@ from fullflow import *
1742
1742
  Net = Network("Anchored Example")
1743
1743
  pressure = State(2.0e6)
1744
1744
 
1745
+ time = fplt.TimeAxis([0.0, 1.0, 2.0], name="Time")
1745
1746
  pressure_trace = fplt.Trace(
1746
- x=[0.0, 1.0, 2.0],
1747
+ x=time,
1747
1748
  y=[2.0e6, 2.1e6, 2.05e6],
1748
1749
  name="measured pressure",
1749
1750
  role="data",
1750
1751
  )
1751
1752
 
1753
+ time.window(0.5, 2.0)
1754
+
1752
1755
  PressureSensor = Sensor(
1753
1756
  "Chamber Pressure Sensor",
1754
1757
  Net,
1755
1758
  reading=pressure,
1756
1759
  variable=pressure,
1757
1760
  data=pressure_trace,
1758
- extend=False,
1759
1761
  )
1760
1762
  ```
1761
1763
 
1762
1764
  When used in a transient solve, the sensor samples the test data at
1763
1765
  `network.time` and exposes a balance between the model variable and the sampled
1764
- trace value. With `extend=False`, the transient stops cleanly when the trace no
1765
- longer has data.
1766
+ trace value. A shared FullPlot `TimeAxis` can window all attached traces at once.
1767
+ With the default `extend=True`, an anchor is inactive when no finite data is
1768
+ available and the solve continues; an otherwise unconstrained anchored variable
1769
+ retains its last accepted value. With `extend=False`, the transient stops cleanly
1770
+ when data is unavailable.
1766
1771
 
1767
1772
  ## Sequences, controllers, and actuators
1768
1773
 
@@ -1698,27 +1698,32 @@ from fullflow import *
1698
1698
  Net = Network("Anchored Example")
1699
1699
  pressure = State(2.0e6)
1700
1700
 
1701
+ time = fplt.TimeAxis([0.0, 1.0, 2.0], name="Time")
1701
1702
  pressure_trace = fplt.Trace(
1702
- x=[0.0, 1.0, 2.0],
1703
+ x=time,
1703
1704
  y=[2.0e6, 2.1e6, 2.05e6],
1704
1705
  name="measured pressure",
1705
1706
  role="data",
1706
1707
  )
1707
1708
 
1709
+ time.window(0.5, 2.0)
1710
+
1708
1711
  PressureSensor = Sensor(
1709
1712
  "Chamber Pressure Sensor",
1710
1713
  Net,
1711
1714
  reading=pressure,
1712
1715
  variable=pressure,
1713
1716
  data=pressure_trace,
1714
- extend=False,
1715
1717
  )
1716
1718
  ```
1717
1719
 
1718
1720
  When used in a transient solve, the sensor samples the test data at
1719
1721
  `network.time` and exposes a balance between the model variable and the sampled
1720
- trace value. With `extend=False`, the transient stops cleanly when the trace no
1721
- longer has data.
1722
+ trace value. A shared FullPlot `TimeAxis` can window all attached traces at once.
1723
+ With the default `extend=True`, an anchor is inactive when no finite data is
1724
+ available and the solve continues; an otherwise unconstrained anchored variable
1725
+ retains its last accepted value. With `extend=False`, the transient stops cleanly
1726
+ when data is unavailable.
1722
1727
 
1723
1728
  ## Sequences, controllers, and actuators
1724
1729
 
@@ -155,13 +155,12 @@ fflow = data.trace(y="FUEL_MDOT", x=time, name="Fuel Flow Test Data", role="data
155
155
 
156
156
  # A user can process a test-data trace before anchoring to it. The filtered trace
157
157
  # keeps the same role as the source trace, so it is still valid Sensor.data.
158
- ftpt_filtered = ftpt_raw.filter("moving_average", window=0.04)
159
- fipt_filtered = fipt_raw.filter("moving_average", window=0.04)
158
+ ftpt = ftpt_raw.filter("moving_average", window=0.04) * psia_to_pa
159
+ fipt = fipt_raw.filter("moving_average", window=0.04) * psia_to_pa
160
160
 
161
- # Only use the useful part of the test. Windowing keeps the trace role too.
162
- ftpt = ftpt_filtered.window(start=0.0, stop=6.5) * psia_to_pa
163
- fipt = fipt_filtered.window(start=0.0, stop=6.5) * psia_to_pa
164
- fflow = fflow.window(start=0.0, stop=6.5)
161
+ # All three traces share this TimeAxis, so one window selects the useful part of
162
+ # the test for every attached trace.
163
+ time.window(start=0.0, stop=6.5)
165
164
 
166
165
  # Conditions are optional in this example. They demonstrate that a Sensor can
167
166
  # both anchor to data and log line-crossing events during the same run.
@@ -0,0 +1,101 @@
1
+ [project]
2
+ name = "fullflow"
3
+ version = "2.0.2"
4
+ description = "Python-native fluid, thermal, propulsion, control, and transient network simulation."
5
+ readme = "README.md"
6
+ license = "GPL-3.0-only"
7
+ license-files = ["LICENSE"]
8
+ requires-python = ">=3.11"
9
+ keywords = [
10
+ "fluid-dynamics",
11
+ "fluid-network",
12
+ "network-analysis",
13
+ "thermodynamics",
14
+ "thermal-analysis",
15
+ "heat-transfer",
16
+ "propulsion",
17
+ "rocket-propulsion",
18
+ "rocket-engine",
19
+ "compressible-flow",
20
+ "turbomachinery",
21
+ "control-systems",
22
+ "transient-simulation",
23
+ "simulation",
24
+ "engineering",
25
+ "scientific-computing",
26
+ ]
27
+ classifiers = [
28
+ "Development Status :: 4 - Beta",
29
+ "Intended Audience :: Science/Research",
30
+ "Intended Audience :: Education",
31
+ "Intended Audience :: Developers",
32
+ "Topic :: Scientific/Engineering",
33
+ "Topic :: Scientific/Engineering :: Physics",
34
+ "Topic :: Scientific/Engineering :: Information Analysis",
35
+ "Topic :: Scientific/Engineering :: Mathematics",
36
+ "Programming Language :: Python :: 3",
37
+ "Programming Language :: Python :: 3.11",
38
+ "Programming Language :: Python :: 3.12",
39
+ "Programming Language :: Python :: 3.13",
40
+ "Operating System :: OS Independent",
41
+ ]
42
+ dependencies = [
43
+ "numpy>=1.26",
44
+ "scipy>=1.11",
45
+ "rich>=13.7",
46
+ "h5py>=3.10",
47
+ "fullplot>=0.1.1",
48
+ ]
49
+
50
+ [[project.authors]]
51
+ name = "Saaketh Ramoju"
52
+ email = "skramoju@gmail.com"
53
+
54
+ [project.optional-dependencies]
55
+ thermo = ["thermoprop>=2.0.0"]
56
+ examples = [
57
+ "thermoprop>=2.0.0",
58
+ "matplotlib>=3.8",
59
+ ]
60
+ dev = [
61
+ "pytest>=8.0",
62
+ "build>=1.2",
63
+ "twine>=5.0",
64
+ ]
65
+
66
+ [project.urls]
67
+ Homepage = "https://github.com/saakethramoju/FullFlow"
68
+ Repository = "https://github.com/saakethramoju/FullFlow"
69
+ Issues = "https://github.com/saakethramoju/FullFlow/issues"
70
+ Changelog = "https://github.com/saakethramoju/FullFlow/blob/main/CHANGELOG.md"
71
+ PyPI = "https://pypi.org/project/fullflow/"
72
+
73
+ [project.scripts]
74
+ fullflow = "fullflow:main"
75
+
76
+ [build-system]
77
+ requires = ["uv_build>=0.11.18,<0.12.0"]
78
+ build-backend = "uv_build"
79
+
80
+ [tool.uv.build-backend]
81
+ source-include = [
82
+ "README.md",
83
+ "CHANGELOG.md",
84
+ "LICENSE",
85
+ "THIRD_PARTY_LICENSES.md",
86
+ "PUBLISHING.md",
87
+ "CONTRIBUTING.md",
88
+ "CODE_OF_CONDUCT.md",
89
+ "SECURITY.md",
90
+ "CITATION.cff",
91
+ "docs/**",
92
+ "examples/**",
93
+ "tests/**",
94
+ ]
95
+
96
+ [dependency-groups]
97
+ dev = [
98
+ "pytest>=8.0",
99
+ "build>=1.2",
100
+ "twine>=5.0",
101
+ ]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fullflow"
3
- version = "2.0.1"
3
+ version = "2.0.2"
4
4
  description = "Python-native fluid, thermal, propulsion, control, and transient network simulation."
5
5
  readme = "README.md"
6
6
  license = "GPL-3.0-only"
@@ -50,7 +50,7 @@ dependencies = [
50
50
  "scipy>=1.11",
51
51
  "rich>=13.7",
52
52
  "h5py>=3.10",
53
- "fullplot>=0.1.0",
53
+ "fullplot>=0.1.1",
54
54
  ]
55
55
 
56
56
  [project.optional-dependencies]
@@ -103,10 +103,11 @@ class Sensor(Component):
103
103
 
104
104
  Missing data
105
105
  ------------
106
- ``extend=True`` holds the nearest data value outside the trace range.
107
- ``extend=False`` requests a clean transient stop when no data value is
108
- available. This lets simulations end naturally when the test-data window is
109
- exhausted."""
106
+ ``extend=True`` allows the solve to continue when no finite data value is
107
+ available. The sensor anchor is inactive during those times; if its
108
+ variable would otherwise be unconstrained, FullFlow retains the last
109
+ accepted value. ``extend=False`` requests a clean transient stop when no
110
+ data value is available."""
110
111
 
111
112
  def __init__(
112
113
  self,
@@ -2,7 +2,7 @@
2
2
  FullFlow: fluid, thermal, and propulsion network simulation.
3
3
  """
4
4
 
5
- __version__ = "2.0.1"
5
+ __version__ = "2.0.2"
6
6
 
7
7
  from fullflow.System import *
8
8
  from fullflow.Solvers import *
@@ -3,4 +3,4 @@ def test_fullflow_imports():
3
3
  import fullflow.System
4
4
  import fullflow.Solvers
5
5
 
6
- assert fullflow.__version__ == "2.0.1"
6
+ assert fullflow.__version__ == "2.0.2"
File without changes