improvements to grid generation
- handling of origin - inverse functions: calculate grid,size,origin from regular coordinates (cell or node). should replace corresponding functionality in util
This commit is contained in:
parent
75e93d9f0c
commit
8d0c4310cf
|
@ -57,12 +57,13 @@ def gradient(size,field):
|
||||||
return np.fft.irfftn(gradient,axes=(0,1,2),s=field.shape[:3])
|
return np.fft.irfftn(gradient,axes=(0,1,2),s=field.shape[:3])
|
||||||
|
|
||||||
|
|
||||||
def cell_coord0(grid,size):
|
def cell_coord0(grid,size,origin=np.zeros(3)):
|
||||||
"""Cell center positions (undeformed)."""
|
"""Cell center positions (undeformed)."""
|
||||||
delta = size/grid*0.5
|
start = origin + size/grid*.5
|
||||||
x, y, z = np.meshgrid(np.linspace(delta[2],size[2]-delta[2],grid[2]),
|
end = origin - size/grid*.5 + size
|
||||||
np.linspace(delta[1],size[1]-delta[1],grid[1]),
|
x, y, z = np.meshgrid(np.linspace(start[2],end[2],grid[2]),
|
||||||
np.linspace(delta[0],size[0]-delta[0],grid[0]),
|
np.linspace(start[1],end[1],grid[1]),
|
||||||
|
np.linspace(start[0],end[0],grid[0]),
|
||||||
indexing = 'ij')
|
indexing = 'ij')
|
||||||
|
|
||||||
return np.concatenate((z[:,:,:,None],y[:,:,:,None],x[:,:,:,None]),axis = 3)
|
return np.concatenate((z[:,:,:,None],y[:,:,:,None],x[:,:,:,None]),axis = 3)
|
||||||
|
@ -88,12 +89,37 @@ def cell_displacement_avg(size,F):
|
||||||
F_avg = np.average(F,axis=(0,1,2))
|
F_avg = np.average(F,axis=(0,1,2))
|
||||||
return np.einsum('ml,ijkl->ijkm',F_avg-np.eye(3),cell_coord0(F.shape[:3],size))
|
return np.einsum('ml,ijkl->ijkm',F_avg-np.eye(3),cell_coord0(F.shape[:3],size))
|
||||||
|
|
||||||
|
def cell_coord0_2_DNA(coord0,ordered=False):
|
||||||
|
coords = [np.unique(coord0[:,i]) for i in range(3)]
|
||||||
|
mincorner = np.array(list(map(min,coords)))
|
||||||
|
maxcorner = np.array(list(map(max,coords)))
|
||||||
|
grid = np.array(list(map(len,coords)),'i')
|
||||||
|
size = grid/np.maximum(grid-1,1) * (maxcorner-mincorner)
|
||||||
|
delta = size/grid
|
||||||
|
origin = mincorner - delta*.5
|
||||||
|
|
||||||
def node_coord0(grid,size):
|
if grid.prod() != len(coord0):
|
||||||
|
raise ValueError('Data count {} does not match grid {}.'.format(len(coord0),grid))
|
||||||
|
|
||||||
|
start = origin + delta*.5
|
||||||
|
end = origin + size -delta*.5
|
||||||
|
|
||||||
|
if not np.allclose(coords[0],np.linspace(start[0],end[0],grid[0])) and \
|
||||||
|
np.allclose(coords[1],np.linspace(start[1],end[1],grid[1])) and \
|
||||||
|
np.allclose(coords[2],np.linspace(start[2],end[2],grid[2])):
|
||||||
|
raise ValueError('Regular grid spacing violated.')
|
||||||
|
|
||||||
|
if ordered:
|
||||||
|
if not np.allclose(coord0.reshape(tuple(grid[::-1])+(3,)),cell_coord0(grid,size,origin)):
|
||||||
|
raise ValueError('Input data is not a regular grid.')
|
||||||
|
return (grid,size,origin)
|
||||||
|
|
||||||
|
|
||||||
|
def node_coord0(grid,size,origin=np.zeros(3)):
|
||||||
"""Nodal positions (undeformed)."""
|
"""Nodal positions (undeformed)."""
|
||||||
x, y, z = np.meshgrid(np.linspace(0,size[2],1+grid[2]),
|
x, y, z = np.meshgrid(np.linspace(origin[2],size[2]+origin[2],1+grid[2]),
|
||||||
np.linspace(0,size[1],1+grid[1]),
|
np.linspace(origin[1],size[1]+origin[1],1+grid[1]),
|
||||||
np.linspace(0,size[0],1+grid[0]),
|
np.linspace(origin[0],size[0]+origin[0],1+grid[0]),
|
||||||
indexing = 'ij')
|
indexing = 'ij')
|
||||||
|
|
||||||
return np.concatenate((z[:,:,:,None],y[:,:,:,None],x[:,:,:,None]),axis = 3)
|
return np.concatenate((z[:,:,:,None],y[:,:,:,None],x[:,:,:,None]),axis = 3)
|
||||||
|
@ -124,6 +150,28 @@ def node_2_cell(node_data):
|
||||||
|
|
||||||
return c[:-1,:-1,:-1]
|
return c[:-1,:-1,:-1]
|
||||||
|
|
||||||
|
def node_coord0_2_DNA(coord0,ordered=False):
|
||||||
|
coords = [np.unique(coord0[:,i]) for i in range(3)]
|
||||||
|
mincorner = np.array(list(map(min,coords)))
|
||||||
|
maxcorner = np.array(list(map(max,coords)))
|
||||||
|
grid = np.array(list(map(len,coords)),'i') - 1
|
||||||
|
size = maxcorner-mincorner
|
||||||
|
origin = mincorner
|
||||||
|
|
||||||
|
if (grid+1).prod() != len(coord0):
|
||||||
|
raise ValueError('Data count {} does not match grid {}.'.format(len(coord0),grid))
|
||||||
|
|
||||||
|
if not np.allclose(coords[0],np.linspace(mincorner[0],maxcorner[0],grid[0]+1)) and \
|
||||||
|
np.allclose(coords[1],np.linspace(mincorner[1],maxcorner[1],grid[1]+1)) and \
|
||||||
|
np.allclose(coords[2],np.linspace(mincorner[2],maxcorner[2],grid[2]+1)):
|
||||||
|
raise ValueError('Regular grid spacing violated.')
|
||||||
|
|
||||||
|
if ordered:
|
||||||
|
if not np.allclose(coord0.reshape(tuple((grid+1)[::-1])+(3,)),node_coord0(grid,size,origin)):
|
||||||
|
raise ValueError('Input data is not a regular grid.')
|
||||||
|
return (grid,size,origin)
|
||||||
|
|
||||||
|
|
||||||
def regrid(size,F,new_grid):
|
def regrid(size,F,new_grid):
|
||||||
"""tbd."""
|
"""tbd."""
|
||||||
c = cell_coord0(F.shape[:3][::-1],size) \
|
c = cell_coord0(F.shape[:3][::-1],size) \
|
||||||
|
|
Loading…
Reference in New Issue