The Workspace and Projects#

OpenPNM V2.0 implemented new ways to manage and control objects, specifically the Workspace and Projects.

You probably don’t need to worry about these features until your simulations get large and complicated.

The Workspace is equivalent to a web browser window, while a Project is like tabs inside the browser. Each Project is an isolated OpenPNM simulation with a single Network and all associated objects. All Projects are stored in the same Workspace. There can be only 1 Workspace open at a given time, so all new projects are registered in the same Workspace. Projects and Workspaces can be saved and loaded.

[1]:
import openpnm as op

Usage of Projects and Workspace#

Initialize the Workspace and save in a variable called ws, and print it to verify that it is currently empty:

[2]:
ws = op.Workspace()
print(ws)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
OpenPNM Version 2.8.2.dev1116 Workspace
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

Next, create a new Project and print:

[3]:
proj = ws.new_project()
proj
[3]:
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 Object Name     Object ID
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

The project is an empty list since there have been no objects created yet.

Now create a new network object with passing in proj into the initialization:

[4]:
pn = op.network.Cubic(shape=[4, 4, 4], project=proj)

Now printing the Project via print(proj) will include the newly created network:

[5]:
print(proj)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 Object Name     Object ID
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 net_01          <openpnm.network.Cubic at 0x7fce3b18e720>
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

It is not necessary to create a project before creating a network. Since a project can only have one network, then a new project is created each time a network is created if not specified as we did above:

[6]:
pn2 = op.network.Cubic(shape=[4, 4, 4])

The project that each object belongs to can be found since each object has a project attribute. You can use this to see what other objects are defined in a project:

[7]:
print(pn2.project)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 Object Name     Object ID
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 net_01          <openpnm.network.Cubic at 0x7fce3b18e590>
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

Finally, you can view all active projects by printing the workspace via:

[8]:
print(ws)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
OpenPNM Version 2.8.2.dev1116 Workspace
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 proj_01
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 Object Name     Object ID
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 net_01          <openpnm.network.Cubic at 0x7fce3b18e720>
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 proj_02
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 Object Name     Object ID
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 net_01          <openpnm.network.Cubic at 0x7fce3b18e590>
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

A project can be purged from the workspace via ws.close_project(proj). Let’s print workspace again,:

[9]:
ws.close_project(proj)
print(ws)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
OpenPNM Version 2.8.2.dev1116 Workspace
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 proj_02
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 Object Name     Object ID
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 net_01          <openpnm.network.Cubic at 0x7fce3b18e590>
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

Design of Workspace and Project Classes#

It is worth describing the design of these classes to help explain how they work. The workspace is a dict subclass while the project is a list subclass. Each subclass has numerous methods added to aid in the management of the objects.

In the Workspace dict each project object is stored by name in each ‘key: value’ pair. Printing the workspace gives a nicely formatted output as shown above, but the basic command-line representation gives its true structure via running ws in the command-line:

{'sim_02': []}

Where the only project in the workspace is 'sim_02', and it is a list that contains only a single Cubic network object.