0

I am trying to get values from a region. I know that there is a method to call the values by introducing the coordinates:

var([(x1, x2, x3) #xvalues
     (y1, y2, y3)]) #yvalues

But, for instance, it is confusing to how many points and which coordinates they have if I previously set the values by using the 'where' attr in var.setValue (which accepts regions).

var.setValue(20., where=(Y <= y1) & ((X <= x1) & (X > x2)))

Is there any method to get the values by "querying" a region as in the var.setValue(where='...')?

Thank you.

Toni P
  • 47
  • 5

1 Answers1

0

If it's possible to construct a mask for a region from the cell coordinates then that mask can be used to extract the values. There is no special function in FiPy to do this, but we can use a boolean mask to index into the variable. For example,

from fipy import CellVariable, Grid2D

mesh = Grid2D(nx=4, ny=4)
var = CellVariable(mesh=mesh)
mask = (mesh.y <= 2) & (mesh.x <= 3) & (mesh.x > 1)
var.setValue(20., where=mask)
print('x:', mesh.x[mask.value])
print('y:', mesh.y[mask.value])
print('val:', var[mask.value])
print(var.mesh)
print(var[mask.value].mesh)

gives

x: [1.5 2.5 1.5 2.5]
y: [0.5 0.5 1.5 1.5]
val: [20. 20. 20. 20.]
UniformGrid2D(dx=1.0, nx=4, dy=1.0, ny=4)
Traceback (most recent call last):
  File "tmp.py", line 11, in <module>
    print(var[mask.value].mesh)
AttributeError: 'unOp' object has no attribute 'mesh'

This above gets you the sub-region of values along with the corresponding coordinates. However, there is no way in FiPy to extract a sub-region variable that also maintains its associated mesh data.

wd15
  • 1,068
  • 5
  • 8
  • Thank you. Your solution is simpler than mine: `mesh = Grid2D(Lx=Lx, Ly = Ly, nx=nx, ny=ny) X,Y = mesh.cellCenters mask = ((Y <= y1 ) & (X <= x1)) mask_cells = [i for i in range(len(mask)) if mask[i]] val = var.value[mask_cells]` – Toni P Mar 23 '21 at 10:29