consistent layout for grid data
has now always the shape ([x,y,z,...]) with x fastest. For conversion from or to linear layout ([x*y*z,...]), e.g. storage in ASCII table, reshape needs to have the 'F' option. Credits to Vitesh and Fran for pointing this out.
This commit is contained in:
parent
bce5ed62d5
commit
9979eb58f4
|
@ -49,9 +49,10 @@ for name in filenames:
|
||||||
for label in options.labels:
|
for label in options.labels:
|
||||||
field = table.get(label)
|
field = table.get(label)
|
||||||
shape = (3,) if np.prod(field.shape)//np.prod(grid) == 3 else (3,3) # vector or tensor
|
shape = (3,) if np.prod(field.shape)//np.prod(grid) == 3 else (3,3) # vector or tensor
|
||||||
field = field.reshape(np.append(grid[::-1],shape))
|
field = field.reshape(tuple(grid)+(-1,),order='F').reshape(tuple(grid)+shape)
|
||||||
|
curl = damask.grid_filters.curl(size,field)
|
||||||
table.add('curlFFT({})'.format(label),
|
table.add('curlFFT({})'.format(label),
|
||||||
damask.grid_filters.curl(size[::-1],field).reshape(-1,np.prod(shape)),
|
curl.reshape(tuple(grid)+(-1,)).reshape(-1,np.prod(shape),order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
table.to_ASCII(sys.stdout if name is None else name)
|
table.to_ASCII(sys.stdout if name is None else name)
|
||||||
|
|
|
@ -52,22 +52,22 @@ for name in filenames:
|
||||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
grid,size,origin = damask.grid_filters.cell_coord0_gridSizeOrigin(table.get(options.pos))
|
grid,size,origin = damask.grid_filters.cell_coord0_gridSizeOrigin(table.get(options.pos))
|
||||||
|
|
||||||
F = table.get(options.f).reshape(np.append(grid[::-1],(3,3)))
|
F = table.get(options.f).reshape(tuple(grid)+(-1,),order='F').reshape(tuple(grid)+(3,3))
|
||||||
if options.nodal:
|
if options.nodal:
|
||||||
table = damask.Table(damask.grid_filters.node_coord0(grid[::-1],size[::-1]).reshape(-1,3),
|
table = damask.Table(damask.grid_filters.node_coord0(grid,size).reshape(-1,3,order='F'),
|
||||||
{'pos':(3,)})
|
{'pos':(3,)})
|
||||||
table.add('avg({}).{}'.format(options.f,options.pos),
|
table.add('avg({}).{}'.format(options.f,options.pos),
|
||||||
damask.grid_filters.node_displacement_avg(size[::-1],F).reshape(-1,3),
|
damask.grid_filters.node_displacement_avg(size,F).reshape(-1,3,order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
table.add('fluct({}).{}'.format(options.f,options.pos),
|
table.add('fluct({}).{}'.format(options.f,options.pos),
|
||||||
damask.grid_filters.node_displacement_fluct(size[::-1],F).reshape(-1,3),
|
damask.grid_filters.node_displacement_fluct(size,F).reshape(-1,3,order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
table.to_ASCII(sys.stdout if name is None else os.path.splitext(name)[0]+'_nodal.txt')
|
table.to_ASCII(sys.stdout if name is None else os.path.splitext(name)[0]+'_nodal.txt')
|
||||||
else:
|
else:
|
||||||
table.add('avg({}).{}'.format(options.f,options.pos),
|
table.add('avg({}).{}'.format(options.f,options.pos),
|
||||||
damask.grid_filters.cell_displacement_avg(size[::-1],F).reshape(-1,3),
|
damask.grid_filters.cell_displacement_avg(size,F).reshape(-1,3,order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
table.add('fluct({}).{}'.format(options.f,options.pos),
|
table.add('fluct({}).{}'.format(options.f,options.pos),
|
||||||
damask.grid_filters.cell_displacement_fluct(size[::-1],F).reshape(-1,3),
|
damask.grid_filters.cell_displacement_fluct(size,F).reshape(-1,3,order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
table.to_ASCII(sys.stdout if name is None else name)
|
table.to_ASCII(sys.stdout if name is None else name)
|
||||||
|
|
|
@ -49,9 +49,10 @@ for name in filenames:
|
||||||
for label in options.labels:
|
for label in options.labels:
|
||||||
field = table.get(label)
|
field = table.get(label)
|
||||||
shape = (3,) if np.prod(field.shape)//np.prod(grid) == 3 else (3,3) # vector or tensor
|
shape = (3,) if np.prod(field.shape)//np.prod(grid) == 3 else (3,3) # vector or tensor
|
||||||
field = field.reshape(np.append(grid[::-1],shape))
|
field = field.reshape(tuple(grid)+(-1,),order='F').reshape(tuple(grid)+shape)
|
||||||
|
div = damask.grid_filters.divergence(size,field)
|
||||||
table.add('divFFT({})'.format(label),
|
table.add('divFFT({})'.format(label),
|
||||||
damask.grid_filters.divergence(size[::-1],field).reshape(-1,np.prod(shape)//3),
|
div.reshape(tuple(grid)+(-1,)).reshape(-1,np.prod(shape)//3,order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
table.to_ASCII(sys.stdout if name is None else name)
|
table.to_ASCII(sys.stdout if name is None else name)
|
||||||
|
|
|
@ -49,9 +49,10 @@ for name in filenames:
|
||||||
for label in options.labels:
|
for label in options.labels:
|
||||||
field = table.get(label)
|
field = table.get(label)
|
||||||
shape = (1,) if np.prod(field.shape)//np.prod(grid) == 1 else (3,) # scalar or vector
|
shape = (1,) if np.prod(field.shape)//np.prod(grid) == 1 else (3,) # scalar or vector
|
||||||
field = field.reshape(np.append(grid[::-1],shape))
|
field = field.reshape(tuple(grid)+(-1,),order='F').reshape(tuple(grid)+shape)
|
||||||
|
grad = damask.grid_filters.gradient(size,field)
|
||||||
table.add('gradFFT({})'.format(label),
|
table.add('gradFFT({})'.format(label),
|
||||||
damask.grid_filters.gradient(size[::-1],field).reshape(-1,np.prod(shape)*3),
|
grad.reshape(tuple(grid)+(-1,)).reshape(-1,np.prod(shape)*3,order='F'),
|
||||||
scriptID+' '+' '.join(sys.argv[1:]))
|
scriptID+' '+' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
table.to_ASCII(sys.stdout if name is None else name)
|
table.to_ASCII(sys.stdout if name is None else name)
|
||||||
|
|
|
@ -357,7 +357,6 @@ class Geom:
|
||||||
seeds_p = np.vstack((seeds_p-np.array([0.,size[1],0.]),seeds_p,seeds_p+np.array([0.,size[1],0.])))
|
seeds_p = np.vstack((seeds_p-np.array([0.,size[1],0.]),seeds_p,seeds_p+np.array([0.,size[1],0.])))
|
||||||
seeds_p = np.vstack((seeds_p-np.array([0.,0.,size[2]]),seeds_p,seeds_p+np.array([0.,0.,size[2]])))
|
seeds_p = np.vstack((seeds_p-np.array([0.,0.,size[2]]),seeds_p,seeds_p+np.array([0.,0.,size[2]])))
|
||||||
coords = grid_filters.cell_coord0(grid*3,size*3,-size).reshape(-1,3,order='F')
|
coords = grid_filters.cell_coord0(grid*3,size*3,-size).reshape(-1,3,order='F')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
weights_p = weights.flatten()
|
weights_p = weights.flatten()
|
||||||
seeds_p = seeds
|
seeds_p = seeds
|
||||||
|
@ -370,10 +369,10 @@ class Geom:
|
||||||
microstructure = np.array(result.get())
|
microstructure = np.array(result.get())
|
||||||
|
|
||||||
if periodic:
|
if periodic:
|
||||||
microstructure = microstructure.reshape(grid*3)
|
microstructure = microstructure.reshape(grid*3,order='F')
|
||||||
microstructure = microstructure[grid[0]:grid[0]*2,grid[1]:grid[1]*2,grid[2]:grid[2]*2]%seeds.shape[0]
|
microstructure = microstructure[grid[0]:grid[0]*2,grid[1]:grid[1]*2,grid[2]:grid[2]*2]%seeds.shape[0]
|
||||||
else:
|
else:
|
||||||
microstructure = microstructure.reshape(grid)
|
microstructure = microstructure.reshape(grid,order='F')
|
||||||
|
|
||||||
#comments = 'geom.py:from_Laguerre_tessellation v{}'.format(version)
|
#comments = 'geom.py:from_Laguerre_tessellation v{}'.format(version)
|
||||||
return Geom(microstructure+1,size,homogenization=1)
|
return Geom(microstructure+1,size,homogenization=1)
|
||||||
|
@ -401,7 +400,7 @@ class Geom:
|
||||||
devNull,microstructure = KDTree.query(coords)
|
devNull,microstructure = KDTree.query(coords)
|
||||||
|
|
||||||
#comments = 'geom.py:from_Voronoi_tessellation v{}'.format(version)
|
#comments = 'geom.py:from_Voronoi_tessellation v{}'.format(version)
|
||||||
return Geom(microstructure.reshape(grid)+1,size,homogenization=1)
|
return Geom(microstructure.reshape(grid,order='F')+1,size,homogenization=1)
|
||||||
|
|
||||||
|
|
||||||
def to_file(self,fname,pack=None):
|
def to_file(self,fname,pack=None):
|
||||||
|
|
|
@ -7,7 +7,7 @@ def _ks(size,grid,first_order=False):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -19,8 +19,7 @@ def _ks(size,grid,first_order=False):
|
||||||
|
|
||||||
k_si = _np.arange(grid[2]//2+1)/size[2]
|
k_si = _np.arange(grid[2]//2+1)/size[2]
|
||||||
|
|
||||||
kk, kj, ki = _np.meshgrid(k_sk,k_sj,k_si,indexing = 'ij')
|
return _np.stack(_np.meshgrid(k_sk,k_sj,k_si,indexing = 'ij'), axis=-1)
|
||||||
return _np.concatenate((ki[:,:,:,None],kj[:,:,:,None],kk[:,:,:,None]),axis = 3)
|
|
||||||
|
|
||||||
|
|
||||||
def curl(size,field):
|
def curl(size,field):
|
||||||
|
@ -29,7 +28,7 @@ def curl(size,field):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -53,7 +52,7 @@ def divergence(size,field):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -73,7 +72,7 @@ def gradient(size,field):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -93,9 +92,9 @@ def cell_coord0(grid,size,origin=_np.zeros(3)):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
grid : numpy.ndarray
|
grid : numpy.ndarray of shape (3)
|
||||||
number of grid points.
|
number of grid points.
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
origin : numpy.ndarray, optional
|
origin : numpy.ndarray, optional
|
||||||
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
||||||
|
@ -103,7 +102,11 @@ def cell_coord0(grid,size,origin=_np.zeros(3)):
|
||||||
"""
|
"""
|
||||||
start = origin + size/grid*.5
|
start = origin + size/grid*.5
|
||||||
end = origin + size - size/grid*.5
|
end = origin + size - size/grid*.5
|
||||||
return _np.mgrid[start[0]:end[0]:grid[0]*1j,start[1]:end[1]:grid[1]*1j,start[2]:end[2]:grid[2]*1j].T
|
|
||||||
|
return _np.stack(_np.meshgrid(_np.linspace(start[0],end[0],grid[0]),
|
||||||
|
_np.linspace(start[1],end[1],grid[1]),
|
||||||
|
_np.linspace(start[2],end[2],grid[2]),indexing = 'ij'),
|
||||||
|
axis = -1)
|
||||||
|
|
||||||
|
|
||||||
def cell_displacement_fluct(size,F):
|
def cell_displacement_fluct(size,F):
|
||||||
|
@ -112,7 +115,7 @@ def cell_displacement_fluct(size,F):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
|
@ -139,14 +142,14 @@ def cell_displacement_avg(size,F):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
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][::-1],size))
|
return _np.einsum('ml,ijkl->ijkm',F_avg - _np.eye(3),cell_coord0(F.shape[:3],size))
|
||||||
|
|
||||||
|
|
||||||
def cell_displacement(size,F):
|
def cell_displacement(size,F):
|
||||||
|
@ -155,7 +158,7 @@ def cell_displacement(size,F):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
|
@ -170,30 +173,30 @@ def cell_coord(size,F,origin=_np.zeros(3)):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
origin : numpy.ndarray, optional
|
origin : numpy.ndarray of shape (3), optional
|
||||||
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
||||||
|
|
||||||
"""
|
"""
|
||||||
return cell_coord0(F.shape[:3][::-1],size,origin) + cell_displacement(size,F)
|
return cell_coord0(F.shape[:3],size,origin) + cell_displacement(size,F)
|
||||||
|
|
||||||
|
|
||||||
def cell_coord0_gridSizeOrigin(coord0,ordered=True):
|
def cell_coord0_gridSizeOrigin(coord0,ordered=True):
|
||||||
"""
|
"""
|
||||||
Return grid 'DNA', i.e. grid, size, and origin from array of cell positions.
|
Return grid 'DNA', i.e. grid, size, and origin from 1D array of cell positions.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
coord0 : numpy.ndarray
|
coord0 : numpy.ndarray of shape (:,3)
|
||||||
array of undeformed cell coordinates.
|
undeformed cell coordinates.
|
||||||
ordered : bool, optional
|
ordered : bool, optional
|
||||||
expect coord0 data to be ordered (x fast, z slow).
|
expect coord0 data to be ordered (x fast, z slow).
|
||||||
|
|
||||||
"""
|
"""
|
||||||
coords = [_np.unique(coord0[:,i]) for i in range(3)]
|
coords = [_np.unique(coord0[:,i]) for i in range(3)] # _np.unique(coord0, axis=1)
|
||||||
mincorner = _np.array(list(map(min,coords)))
|
mincorner = _np.array(list(map(min,coords)))
|
||||||
maxcorner = _np.array(list(map(max,coords)))
|
maxcorner = _np.array(list(map(max,coords)))
|
||||||
grid = _np.array(list(map(len,coords)),'i')
|
grid = _np.array(list(map(len,coords)),'i')
|
||||||
|
@ -216,7 +219,7 @@ def cell_coord0_gridSizeOrigin(coord0,ordered=True):
|
||||||
_np.allclose(coords[2],_np.linspace(start[2],end[2],grid[2])):
|
_np.allclose(coords[2],_np.linspace(start[2],end[2],grid[2])):
|
||||||
raise ValueError('Regular grid spacing violated.')
|
raise ValueError('Regular grid spacing violated.')
|
||||||
|
|
||||||
if ordered and not _np.allclose(coord0.reshape(tuple(grid[::-1])+(3,)),cell_coord0(grid,size,origin)):
|
if ordered and not _np.allclose(coord0.reshape(tuple(grid)+(3,),order='F'),cell_coord0(grid,size,origin)):
|
||||||
raise ValueError('Input data is not a regular grid.')
|
raise ValueError('Input data is not a regular grid.')
|
||||||
|
|
||||||
return (grid,size,origin)
|
return (grid,size,origin)
|
||||||
|
@ -241,17 +244,18 @@ def node_coord0(grid,size,origin=_np.zeros(3)):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
grid : numpy.ndarray
|
grid : numpy.ndarray of shape (3)
|
||||||
number of grid points.
|
number of grid points.
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
origin : numpy.ndarray, optional
|
origin : numpy.ndarray of shape (3), optional
|
||||||
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
||||||
|
|
||||||
"""
|
"""
|
||||||
return _np.mgrid[origin[0]:size[0]+origin[0]:(grid[0]+1)*1j,
|
return _np.stack(_np.meshgrid(_np.linspace(origin[0],size[0]+origin[0],grid[0]+1),
|
||||||
origin[1]:size[1]+origin[1]:(grid[1]+1)*1j,
|
_np.linspace(origin[1],size[1]+origin[1],grid[1]+1),
|
||||||
origin[2]:size[2]+origin[2]:(grid[2]+1)*1j].T
|
_np.linspace(origin[2],size[2]+origin[2],grid[2]+1),indexing = 'ij'),
|
||||||
|
axis = -1)
|
||||||
|
|
||||||
|
|
||||||
def node_displacement_fluct(size,F):
|
def node_displacement_fluct(size,F):
|
||||||
|
@ -260,7 +264,7 @@ def node_displacement_fluct(size,F):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
|
@ -275,14 +279,14 @@ def node_displacement_avg(size,F):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
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),node_coord0(F.shape[:3][::-1],size))
|
return _np.einsum('ml,ijkl->ijkm',F_avg - _np.eye(3),node_coord0(F.shape[:3],size))
|
||||||
|
|
||||||
|
|
||||||
def node_displacement(size,F):
|
def node_displacement(size,F):
|
||||||
|
@ -291,7 +295,7 @@ def node_displacement(size,F):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
|
@ -306,15 +310,15 @@ def node_coord(size,F,origin=_np.zeros(3)):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size of the periodic field.
|
physical size of the periodic field.
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field.
|
deformation gradient field.
|
||||||
origin : numpy.ndarray, optional
|
origin : numpy.ndarray of shape (3), optional
|
||||||
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
physical origin of the periodic field. Defaults to [0.0,0.0,0.0].
|
||||||
|
|
||||||
"""
|
"""
|
||||||
return node_coord0(F.shape[:3][::-1],size,origin) + node_displacement(size,F)
|
return node_coord0(F.shape[:3],size,origin) + node_displacement(size,F)
|
||||||
|
|
||||||
|
|
||||||
def cell_2_node(cell_data):
|
def cell_2_node(cell_data):
|
||||||
|
@ -335,19 +339,19 @@ def node_2_cell(node_data):
|
||||||
return c[:-1,:-1,:-1]
|
return c[:-1,:-1,:-1]
|
||||||
|
|
||||||
|
|
||||||
def node_coord0_gridSizeOrigin(coord0,ordered=False):
|
def node_coord0_gridSizeOrigin(coord0,ordered=True):
|
||||||
"""
|
"""
|
||||||
Return grid 'DNA', i.e. grid, size, and origin from array of nodal positions.
|
Return grid 'DNA', i.e. grid, size, and origin from 1D array of nodal positions.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
coord0 : numpy.ndarray
|
coord0 : numpy.ndarray of shape (:,3)
|
||||||
array of undeformed nodal coordinates.
|
undeformed nodal coordinates.
|
||||||
ordered : bool, optional
|
ordered : bool, optional
|
||||||
expect coord0 data to be ordered (x fast, z slow).
|
expect coord0 data to be ordered (x fast, z slow).
|
||||||
|
|
||||||
"""
|
"""
|
||||||
coords = [_np.unique(coord0[:,i]) for i in range(3)]
|
coords = [_np.unique(coord0[:,i]) for i in range(3)] # _np.unique(coord0, axis=1)
|
||||||
mincorner = _np.array(list(map(min,coords)))
|
mincorner = _np.array(list(map(min,coords)))
|
||||||
maxcorner = _np.array(list(map(max,coords)))
|
maxcorner = _np.array(list(map(max,coords)))
|
||||||
grid = _np.array(list(map(len,coords)),'i') - 1
|
grid = _np.array(list(map(len,coords)),'i') - 1
|
||||||
|
@ -362,7 +366,7 @@ def node_coord0_gridSizeOrigin(coord0,ordered=False):
|
||||||
_np.allclose(coords[2],_np.linspace(mincorner[2],maxcorner[2],grid[2]+1)):
|
_np.allclose(coords[2],_np.linspace(mincorner[2],maxcorner[2],grid[2]+1)):
|
||||||
raise ValueError('Regular grid spacing violated.')
|
raise ValueError('Regular grid spacing violated.')
|
||||||
|
|
||||||
if ordered and not _np.allclose(coord0.reshape(tuple((grid+1)[::-1])+(3,)),node_coord0(grid,size,origin)):
|
if ordered and not _np.allclose(coord0.reshape(tuple(grid+1)+(3,),order='F'),node_coord0(grid,size,origin)):
|
||||||
raise ValueError('Input data is not a regular grid.')
|
raise ValueError('Input data is not a regular grid.')
|
||||||
|
|
||||||
return (grid,size,origin)
|
return (grid,size,origin)
|
||||||
|
@ -374,7 +378,7 @@ def regrid(size,F,new_grid):
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
size : numpy.ndarray
|
size : numpy.ndarray of shape (3)
|
||||||
physical size
|
physical size
|
||||||
F : numpy.ndarray
|
F : numpy.ndarray
|
||||||
deformation gradient field
|
deformation gradient field
|
||||||
|
@ -382,7 +386,7 @@ def regrid(size,F,new_grid):
|
||||||
new grid for undeformed coordinates
|
new grid for undeformed coordinates
|
||||||
|
|
||||||
"""
|
"""
|
||||||
c = cell_coord0(F.shape[:3][::-1],size) \
|
c = cell_coord0(F.shape[:3],size) \
|
||||||
+ cell_displacement_avg(size,F) \
|
+ cell_displacement_avg(size,F) \
|
||||||
+ cell_displacement_fluct(size,F)
|
+ cell_displacement_fluct(size,F)
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,13 @@ class TestGridFilters:
|
||||||
size = np.random.random(3)
|
size = np.random.random(3)
|
||||||
grid = np.random.randint(8,32,(3))
|
grid = np.random.randint(8,32,(3))
|
||||||
coord = grid_filters.cell_coord0(grid,size)
|
coord = grid_filters.cell_coord0(grid,size)
|
||||||
assert np.allclose(coord[0,0,0],size/grid*.5) and coord.shape == tuple(grid[::-1]) + (3,)
|
assert np.allclose(coord[0,0,0],size/grid*.5) and coord.shape == tuple(grid) + (3,)
|
||||||
|
|
||||||
def test_node_coord0(self):
|
def test_node_coord0(self):
|
||||||
size = np.random.random(3)
|
size = np.random.random(3)
|
||||||
grid = np.random.randint(8,32,(3))
|
grid = np.random.randint(8,32,(3))
|
||||||
coord = grid_filters.node_coord0(grid,size)
|
coord = grid_filters.node_coord0(grid,size)
|
||||||
assert np.allclose(coord[-1,-1,-1],size) and coord.shape == tuple(grid[::-1]+1) + (3,)
|
assert np.allclose(coord[-1,-1,-1],size) and coord.shape == tuple(grid+1) + (3,)
|
||||||
|
|
||||||
def test_coord0(self):
|
def test_coord0(self):
|
||||||
size = np.random.random(3)
|
size = np.random.random(3)
|
||||||
|
@ -31,7 +31,7 @@ class TestGridFilters:
|
||||||
size = np.random.random(3)
|
size = np.random.random(3)
|
||||||
origin = np.random.random(3)
|
origin = np.random.random(3)
|
||||||
coord0 = eval('grid_filters.{}_coord0(grid,size,origin)'.format(mode)) # noqa
|
coord0 = eval('grid_filters.{}_coord0(grid,size,origin)'.format(mode)) # noqa
|
||||||
_grid,_size,_origin = eval('grid_filters.{}_coord0_gridSizeOrigin(coord0.reshape(-1,3))'.format(mode))
|
_grid,_size,_origin = eval('grid_filters.{}_coord0_gridSizeOrigin(coord0.reshape(-1,3,order="F"))'.format(mode))
|
||||||
assert np.allclose(grid,_grid) and np.allclose(size,_size) and np.allclose(origin,_origin)
|
assert np.allclose(grid,_grid) and np.allclose(size,_size) and np.allclose(origin,_origin)
|
||||||
|
|
||||||
def test_displacement_fluct_equivalence(self):
|
def test_displacement_fluct_equivalence(self):
|
||||||
|
@ -57,9 +57,9 @@ class TestGridFilters:
|
||||||
shifted = eval('grid_filters.{}_coord0(grid,size,origin)'.format(mode))
|
shifted = eval('grid_filters.{}_coord0(grid,size,origin)'.format(mode))
|
||||||
unshifted = eval('grid_filters.{}_coord0(grid,size)'.format(mode))
|
unshifted = eval('grid_filters.{}_coord0(grid,size)'.format(mode))
|
||||||
if mode == 'cell':
|
if mode == 'cell':
|
||||||
assert np.allclose(shifted,unshifted+np.broadcast_to(origin,tuple(grid[::-1]) +(3,)))
|
assert np.allclose(shifted,unshifted+np.broadcast_to(origin,tuple(grid) +(3,)))
|
||||||
elif mode == 'node':
|
elif mode == 'node':
|
||||||
assert np.allclose(shifted,unshifted+np.broadcast_to(origin,tuple(grid[::-1]+1)+(3,)))
|
assert np.allclose(shifted,unshifted+np.broadcast_to(origin,tuple(grid+1)+(3,)))
|
||||||
|
|
||||||
@pytest.mark.parametrize('function',[grid_filters.cell_displacement_avg,
|
@pytest.mark.parametrize('function',[grid_filters.cell_displacement_avg,
|
||||||
grid_filters.node_displacement_avg])
|
grid_filters.node_displacement_avg])
|
||||||
|
@ -83,5 +83,5 @@ class TestGridFilters:
|
||||||
def test_regrid(self):
|
def test_regrid(self):
|
||||||
size = np.random.random(3)
|
size = np.random.random(3)
|
||||||
grid = np.random.randint(8,32,(3))
|
grid = np.random.randint(8,32,(3))
|
||||||
F = np.broadcast_to(np.eye(3), tuple(grid[::-1])+(3,3))
|
F = np.broadcast_to(np.eye(3), tuple(grid)+(3,3))
|
||||||
assert all(grid_filters.regrid(size,F,grid) == np.arange(grid.prod()))
|
assert all(grid_filters.regrid(size,F,grid) == np.arange(grid.prod()))
|
||||||
|
|
Loading…
Reference in New Issue