Published on: Nov 9, 2011, 1:03:00 PM

Permalink - Source code

A useful new addition to yt are *boolean* data containers. These are hybrid
data containers that are built by relating already-defined data containers with
each other using boolean operators. Nested boolean logic, using parentheses, is
also supported. The boolean data container (or volume) is made by constructing
a list of volumes interspersed with operators given as strings. Below are some
examples of what can be done with boolean data containers.

The "OR" operator combines volume of the two data containers into one. The two intial volumes may or may not overlap, meaning that the combined volume may constitute several disjoint volumes. Here is an example showing the construction of a boolean volume of two disjoint spheres:

```
sp1 = pf.h.sphere([0.3]*3, .15)
sp2 = pf.h.sphere([0.7]*3, .25)
bool = pf.h.boolean([sp1, "OR", sp2])
```

Here is a short video showing the result:

The "AND" operator mixes two volumes where both volumes cover the same volume. Put another way, the "AND" operator produces a new volume that is defined by all cells that lie in both of the initial volumes. Here is an example of the intersection of a sphere and a cube:

```
re1 = pf.h.region([0.5]*3, [0.0]*3, [0.7]*3)
sp1 = pf.h.sphere([0.5]*3, 0.5)
bool = pf.h.boolean([re1, "AND", sp1])
```

Here is a short video showing the result:

The "NOT" operator is the only non-transitive operator, and is read from left
to right. For example, if there are multiple "NOT" operators, the first "NOT"
on the left and the two volumes on either side are considered first. The new
volume constructed is the volume *contained in the first data container* that
the *second data container* does **not** cover. This can be thought of as a
subtraction from the first volume by the second volume. Here is an example of
a cubical region having a corner cut out of it:

```
re1 = pf.h.region([0.5]*3, [0.]*3, [1.]*3)
re2 = pf.h.region([0.5]*3, [0.5]*3, [1.]*3)
bool = pf.h.boolean([re1, "NOT", re2])
```

Here is a short video showing the result:

It is possible to use nested logic using parentheses. When nested logic is
used, the order of logical operations begins at the inner-most nested level and
proceeds outwards, always respecting the left to right ordering for "NOT"
operations. This may be used to create truly fantastic volumes. Here is an
example of a piece of Swiss cheese created from two cubical regions and two
spheres. The second sphere `sp2` wraps around the periodic boundaries and
impacts the largest cube in more than one place.

```
re1 = pf.h.region([0.5]*3, [0.]*3, [1.]*3)
re2 = pf.h.region([0.5]*3, [0.5]*3, [1.]*3)
sp1 = pf.h.sphere([0.5, 0.7, 0.5], .25)
sp2 = pf.h.sphere([0.1]*3, .25)
bool = pf.h.boolean([re1, "NOT", "(", re2, "AND", sp1, ")", "NOT", sp2])
```

For those wondering how the movies were made, I've posted the script here . Note that blocks of comments will need to be turned on/off to get the desired boolean data container.