Curves
A curve is a named list of points. It describes one quantity against another, for example level against volume in a tank, or flow against headloss through a valve. A pattern says how something varies with time. A curve says how something varies with whatever the network does.
The curves library holds the three kinds an asset can point at: Tank volume, Valve and Headloss. The head and efficiency curves of a pump are curves too, but they live in their own library and do not appear here. See Pump library.
Opening the library
Section titled “Opening the library”To open the library, press Operational data in the toolbar, then Curves. The three rows that take a curve carry Open curves… as well:
- Volume curve on a tank, once Tank geometry is set to Volume curve. See Tanks.
- Headloss curve on a GPV. A GPV has no Setting row at all.
- Curve on a PCV, next to its Setting. See Valves.
Open curves… opens the library on the matching section, and you do not lose the asset behind it.

The three kinds
Section titled “The three kinds”Each section takes two columns. Where a quantity has a unit, the caption gives the unit of the project. Each section also has its own rule about the order of the points.
| Section | Columns | The rule |
|---|---|---|
| Tank volume | level, volume | both columns strictly increasing |
| Valve | % Open, % Full flow | both columns strictly increasing |
| Headloss | flow, headloss | flow strictly increasing, headloss free |
A Tank volume curve needs both columns increasing because EPANET reads it backwards as well as forwards. EPANET works a level out from a volume, and it can only do this if each volume belongs to exactly one level.
A Headloss curve has no rule on its second column. The headloss is free to fall as well as rise.
A Valve curve carries no units on either column. It is also the one kind that a single point is enough for. EPANET interpolates between that point and the fully open point at 100, 100.
To add a curve, press the button on its section: Add tank volume curve, Add valve curve or Add headloss curve. Then name the curve. The menu on each curve has Rename, Duplicate and Delete.
Building a curve
Section titled “Building a curve”When you select a curve, the app opens a numbered point table with a graph under it. You type the values in both columns. Add point at the foot of the table adds a row. The menu on each row has Delete, Insert row above and Insert row below. An insert copies the row you called it on, which is usually a better start than a pair of zeroes.
When you click a point on the graph, the app selects its row in the table. When you select a row, the app marks the point on the graph. At the bottom of the table, a row with zero in both columns is dropped when you save. You thus do not have to delete a row that you added and left empty.

When a curve is not valid
Section titled “When a curve is not valid”The dialog looks at the order of the points as you type, and it says so in three places at once. It marks the wrong cells in the table. It draws the wrong points as orange triangles on the graph. Between the two, a banner headed Invalid curve appears with what is wrong.
- The curve requires more than one point. This message comes from a Tank volume or Headloss curve with a single row. The curve needs a second point.
- Level values must be in ascending order., Volume values must be in ascending order. and Flow values must be in ascending order. Each message names the column that is out of order. A Tank volume curve with its levels and its volumes both the wrong way gets both messages.
For as long as the curve is invalid, its entry in the list carries a warning triangle. You can thus see a problem without opening every curve in the project.

Uncategorized curves
Section titled “Uncategorized curves”When the project holds curves with no kind, a fourth heading appears: Uncategorized. An import produces these curves. The library lists them and you can delete them. It shows their points under plain X and Y headings, and you cannot edit them. Until the app knows the kind of a curve, it has no rule for the order of the points and no units for the captions.
The menu on an uncategorized curve offers Set as Tank volume, Set as Valve and Set as Headloss. When you choose one, the app files the curve in that section. It opens the points for editing under the right column headings. It also makes the curve available to the rows that take that kind.
Deleting a curve
Section titled “Deleting a curve”The library does not delete a curve that is in use, and it says Cannot delete a curve that is in use. Free the curve first: point the tank or the valve that holds it at another curve, or at none. The delete then goes through.
Saving, and what cannot be edited
Section titled “Saving, and what cannot be edited”Save stays disabled until something changes, and the whole edit lands as one step in the undo history. When you press Cancel with unsaved work, the app offers Discard changes or Keep editing.
The library opens read-only during the playback of a run, and on Main when a scenario exists. Inside a scenario you can edit it, but the edit belongs to that branch and never reaches the saved file. See Scenario work.
What is saved, and what the run sees
Section titled “What is saved, and what the run sees”Curves are part of the model, and the app writes them into the project file with their kinds. See Projects.
Through an INP, curves behave like this:
- An export writes every curve in the library, used or not. A comment before
each curve names its kind:
;VOLUME:,;VALVE:or;HEADLOSS:. That comment lets a file epanet-js wrote come back with its sections intact. - A run gives the engine only the curves that something references.
- An import takes the kind from the first thing that uses the curve. A curve used in two different ways is imported twice, and the second copy gets a generated label. For a curve that nothing uses, the comment above its first point decides. A file written by another tool usually has no such comment, and those curves arrive Uncategorized.
See Opening an existing model and Import and export.
- Tanks — Tank geometry, and what happens when you attach a volume curve.
- Valves — which valve types need a curve.
- Pump library — head and efficiency curves, which live apart from these.