Patterns
A time pattern is a named list of multipliers. The engine steps through the list as the run advances. It applies one multiplier per interval to each base value that points at the pattern. The project keeps all the patterns in one library. Everything in the model that varies through the day names a pattern to do it:
- Demand
- A reservoir’s head
- A pump’s speed
- A source’s strength
- The price of electricity
For what a multiplier does to the solution, see the EPANET 2.2 manual.

Patterns have an effect only on an extended period run. If Total duration is zero, the engine solves the network once and ignores every multiplier. A new model gets nothing from its patterns until you set the duration. See Simulation settings.
Opening the library
Section titled “Opening the library”Press Operational data in the toolbar, then Patterns. Panel rows that take a pattern also carry Open patterns…. It opens the library on the matching section and keeps the asset behind it. You can build a pattern at the moment you need it, and choose it as soon as you are back.
The Pattern column in a junction’s Demands grid is the exception. It lists the demand patterns that exist, but it gives no way into the library. You must build a demand pattern before the demands that use it. See Junctions.

The five categories
Section titled “The five categories”A pattern belongs to one category. The category is not a description. It decides where you can use the pattern. Each selector offers patterns of its own category and no others. A pattern built under Demand never appears in a pump’s speed list.
| Category | What it multiplies | Where it is chosen |
|---|---|---|
| Demand | a base demand, on a junction or a customer point | the Pattern column of a Demands grid, on either |
| Reservoir head | a reservoir’s Head | Head pattern on a reservoir |
| Pump speed | a pump’s Initial speed | Speed pattern, when Variable speed is Pattern based |
| Quality source strength | a node’s Source strength | Source pattern, in the Quality section |
| Energy price | the cost of a pump’s energy | Price pattern on a pump, or Global energy price pattern in Simulation settings |
Two consequences of this rule are worth knowing before you start:
- Global energy price pattern stays disabled and reads No patterns yet until an energy price pattern exists. If you built the pattern under the wrong heading, the setting looks broken.
- A pattern for two different jobs must exist twice, once under each category. There is no way to share one.
For the rows themselves, see Junctions, Reservoirs, Pumps, Water quality and Energy.
A sixth heading, Uncategorized, appears only when the project holds patterns with no category at all. An INP import produces such patterns. The menu of one of these patterns offers Set as Demand, Set as Reservoir head, Set as Pump speed, Set as Quality source strength and Set as Energy price. This is how you file the pattern where it belongs. Until you do, no selector in the app offers it, and the pattern has no effect on anything.
The pattern list
Section titled “The pattern list”Down the left is one section per category. Each section shows the number of patterns in it and a button to add one: Add demand pattern, Add reservoir head pattern, and so on. The button puts a new pattern straight into that section.
Each pattern has a menu with Rename, Duplicate and Delete. The app refuses a name that another pattern already uses. The field stays open and marks itself in error until you type a free name. Duplicate copies the multipliers into a new pattern in the same section. This is the quickest way to make a variant of a profile that you tuned already.
Editing the multipliers
Section titled “Editing the multipliers”When you select a pattern, the app opens a two-column table beside a graph.

- Timestep is read-only. It is the time from the start of the run, counted
in Pattern time step intervals. With the usual one-hour step, the rows
read
00:00,01:00,02:00and so on. - Multiplier is what you type. It is a factor, not a value.
1leaves the base value alone, and1.7is a peak of seventy percent above it.
Add timestep at the foot of the table adds a row. Each row has a menu with Delete, Insert row above and Insert row below. The times renumber themselves afterwards. A new row in the middle of a twenty-four hour profile moves everything under it by one interval, and leaves no gap.
A new pattern arrives with enough rows to cover the run. The count is
Total duration divided by Pattern time step, and every multiplier is 1.
A twenty-four hour run with a one-hour pattern step gives twenty-four rows of
1. A model whose duration is still zero gives a single row. A later change to
Pattern time step re-times the rows, but it never adds or removes them. You
must rewrite a profile by hand for another step.
Reading the graph
Section titled “Reading the graph”The graph is one bar per interval, and it is the fastest check that a profile does what you meant. When you click a bar, the app selects its row in the table. When you select rows in the table, the graph shows the matching bars as selected.

The graph also draws what happens past the end of the table. Bars after the pattern’s own last value are the repeats that EPANET applies, in a lighter shade. For example, a twelve-hour profile on a twenty-four hour run shows twelve solid bars and twelve pale ones.
Bars past the end of the run are gray instead. The run never reaches these multipliers. They are the sign that a pattern is longer than the duration you use it for.
A reservoir head pattern is the one exception to the shape of the graph. Its vertical axis does not start at zero. As a result, a narrow band of multipliers fills the graph, and the bars do not flatten against a zero baseline.
Saving, and what cannot be edited
Section titled “Saving, and what cannot be edited”Save stays disabled until something changes. The whole edit lands as one step in the undo history. If you press Cancel with unsaved work, the app offers Discard changes or Keep editing.
The library opens read-only in two cases: while the app plays a run back, and on Main whenever a scenario exists. Main is locked for as long as one exists. A read-only library has a single Close button, no add buttons and no editable cells.
Inside a scenario you can edit the library. The edit stays on the branch and never reaches the saved file, like every other change on a branch. You build a pattern that you mean to keep on Main, with the scenarios deleted. See Scenario work.
Putting one pattern on many assets
Section titled “Putting one pattern on many assets”The library builds a pattern. Something else must point at it. For more assets than you would want to open one at a time, the fastest route is the grid in Data tables:
- Set the Pattern cell on the first row.
- Copy the cell.
- Click the Pattern column header to select the whole column.
- Paste.
A single copied cell repeats down the whole selection. A network’s worth of customer points takes the pattern in one step and one undo.

Deleting a pattern
Section titled “Deleting a pattern”The library refuses to delete a pattern that is in use. It says Cannot delete a pattern that is in use. Free the pattern first: change the assets that point at it to another pattern, or to none. Then the delete goes through.
What is saved, and what the run sees
Section titled “What is saved, and what the run sees”Patterns are part of the model. The project file holds them with their categories, and they come back exactly as you left them. See Projects.
An INP is a lossier round trip:
- Export writes every pattern in the library, whether anything uses it or not. The file has nowhere to record a category.
- A run hands the engine only the patterns that something references. A pattern in the library that nothing points at has no effect on results, and it never appears in the report.
- Import works the categories out from use. A pattern goes under the first thing that names it. A pattern used for two different jobs is imported twice, and the second copy gets a generated label. For a pattern that the file defines and never uses, the app reads the comment on the line above its first row. If that comment names a kind, the pattern goes under it. If there is no such comment, the pattern lands in Uncategorized.
See Opening an existing model and Import and export.
- Junctions — demand categories, and the Pattern column that chooses from this library.
- Curves — the other shared library, for relationships rather than time.
- Simulation settings — Total duration and Pattern time step, which decide how much of a pattern the run uses.