modified file reading/writing methods to load_X, save_X formalism
This commit is contained in:
parent
77026e5d53
commit
96ad358f83
2
PRIVATE
2
PRIVATE
|
@ -1 +1 @@
|
|||
Subproject commit 65ec74c07052e77f35a4b5e80bf110aff1f5ae61
|
||||
Subproject commit 5b7c34e586589141d1e061f021512e65308fc1f7
|
|
@ -42,11 +42,10 @@ rot_to_TSL = damask.Rotation.from_axis_angle([-1,0,0,.75*np.pi])
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
coord = - table.get(options.frame)
|
||||
coord[:,2] += table.get(options.depth)[:,0]
|
||||
|
||||
table.add('coord',rot_to_TSL.broadcast_to(coord.shape[0]) @ coord,scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.add('coord',rot_to_TSL.broadcast_to(coord.shape[0]) @ coord,scriptID+' '+' '.join(sys.argv[1:]))\
|
||||
.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -39,10 +39,10 @@ if options.labels is None:
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
for label in options.labels:
|
||||
table.add('cum_{}({})'.format('prod' if options.product else 'sum',label),
|
||||
np.cumprod(table.get(label),0) if options.product else np.cumsum(table.get(label),0),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
table = table.add('cum_{}({})'.format('prod' if options.product else 'sum',label),
|
||||
np.cumprod(table.get(label),0) if options.product else np.cumsum(table.get(label),0),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -38,8 +38,8 @@ for filename in options.filenames:
|
|||
N_digits = int(np.floor(np.log10(int(results.increments[-1][3:]))))+1
|
||||
N_digits = 5 # hack to keep test intact
|
||||
for inc in damask.util.show_progress(results.iterate('increments'),len(results.increments)):
|
||||
table = damask.Table(np.ones(np.product(results.grid),dtype=int)*int(inc[3:]),{'inc':(1,)})
|
||||
table = table.add('pos',coords.reshape(-1,3))
|
||||
table = damask.Table(np.ones(np.product(results.grid),dtype=int)*int(inc[3:]),{'inc':(1,)})\
|
||||
.add('pos',coords.reshape(-1,3))
|
||||
|
||||
results.pick('materialpoints',False)
|
||||
results.pick('constituents', True)
|
||||
|
@ -60,4 +60,4 @@ for filename in options.filenames:
|
|||
os.mkdir(dirname,0o755)
|
||||
file_out = '{}_inc{}.txt'.format(os.path.splitext(os.path.split(filename)[-1])[0],
|
||||
inc[3:].zfill(N_digits))
|
||||
table.to_file(os.path.join(dirname,file_out))
|
||||
table.save_ASCII(os.path.join(dirname,file_out))
|
||||
|
|
|
@ -172,7 +172,7 @@ if filenames == []: filenames = [None]
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_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))
|
||||
|
||||
F = table.get(options.defgrad).reshape(tuple(grid)+(-1,),order='F').reshape(tuple(grid)+(3,3))
|
||||
|
@ -191,4 +191,4 @@ for name in filenames:
|
|||
volumeMismatch.reshape(-1,1,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -43,7 +43,7 @@ if options.labels is None: parser.error('no data column specified.')
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_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))
|
||||
|
||||
for label in options.labels:
|
||||
|
@ -55,4 +55,4 @@ for name in filenames:
|
|||
curl.reshape(tuple(grid)+(-1,)).reshape(-1,np.prod(shape),order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -14,9 +14,9 @@ scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
|||
scriptID = ' '.join([scriptName,damask.version])
|
||||
|
||||
def derivative(coordinates,what):
|
||||
|
||||
|
||||
result = np.empty_like(what)
|
||||
|
||||
|
||||
# use differentiation by interpolation
|
||||
# as described in http://www2.math.umd.edu/~dlevy/classes/amsc466/lecture-notes/differentiation-chap.pdf
|
||||
|
||||
|
@ -31,7 +31,7 @@ def derivative(coordinates,what):
|
|||
(coordinates[0] - coordinates[1])
|
||||
result[-1,:] = (what[-1,:] - what[-2,:]) / \
|
||||
(coordinates[-1] - coordinates[-2])
|
||||
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
@ -65,10 +65,10 @@ if options.labels is None:
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
for label in options.labels:
|
||||
table = table.add('d({})/d({})'.format(label,options.coordinates),
|
||||
derivative(table.get(options.coordinates),table.get(label)),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -47,25 +47,25 @@ parser.set_defaults(f = 'f',
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_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))
|
||||
|
||||
F = table.get(options.f).reshape(tuple(grid)+(-1,),order='F').reshape(tuple(grid)+(3,3))
|
||||
if options.nodal:
|
||||
table = damask.Table(damask.grid_filters.node_coord0(grid,size).reshape(-1,3,order='F'),
|
||||
damask.Table(damask.grid_filters.node_coord0(grid,size).reshape(-1,3,order='F'),
|
||||
{'pos':(3,)})\
|
||||
.add('avg({}).{}'.format(options.f,options.pos),
|
||||
damask.grid_filters.node_displacement_avg(size,F).reshape(-1,3,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))\
|
||||
.add('fluct({}).{}'.format(options.f,options.pos),
|
||||
damask.grid_filters.node_displacement_fluct(size,F).reshape(-1,3,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
table.to_file(sys.stdout if name is None else os.path.splitext(name)[0]+'_nodal.txt')
|
||||
scriptID+' '+' '.join(sys.argv[1:]))\
|
||||
.save_ASCII(sys.stdout if name is None else os.path.splitext(name)[0]+'_nodal.txt')
|
||||
else:
|
||||
table = table.add('avg({}).{}'.format(options.f,options.pos),
|
||||
table.add('avg({}).{}'.format(options.f,options.pos),
|
||||
damask.grid_filters.cell_displacement_avg(size,F).reshape(-1,3,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))\
|
||||
.add('fluct({}).{}'.format(options.f,options.pos),
|
||||
damask.grid_filters.cell_displacement_fluct(size,F).reshape(-1,3,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
scriptID+' '+' '.join(sys.argv[1:]))\
|
||||
.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -43,7 +43,7 @@ if options.labels is None: parser.error('no data column specified.')
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_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))
|
||||
|
||||
for label in options.labels:
|
||||
|
@ -55,4 +55,4 @@ for name in filenames:
|
|||
div.reshape(tuple(grid)+(-1,)).reshape(-1,np.prod(shape)//3,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -142,7 +142,7 @@ for i,feature in enumerate(features):
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_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))
|
||||
|
||||
neighborhood = neighborhoods[options.neighborhood]
|
||||
|
@ -158,7 +158,7 @@ for name in filenames:
|
|||
diffToNeighbor[:,:,:,i] = ndimage.convolve(microstructure,stencil) # compare ID at each point...
|
||||
# ...to every one in the specified neighborhood
|
||||
# for same IDs at both locations ==> 0
|
||||
|
||||
|
||||
diffToNeighbor = np.sort(diffToNeighbor) # sort diff such that number of changes in diff (steps)...
|
||||
# ...reflects number of unique neighbors
|
||||
uniques = np.where(diffToNeighbor[1:-1,1:-1,1:-1,0] != 0, 1,0) # initialize unique value counter (exclude myself [= 0])
|
||||
|
@ -184,4 +184,4 @@ for name in filenames:
|
|||
distance[i,:],
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -63,7 +63,7 @@ if options.labels is None: parser.error('no data column specified.')
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
damask.grid_filters.coord0_check(table.get(options.pos))
|
||||
|
||||
for label in options.labels:
|
||||
|
@ -73,4 +73,4 @@ for name in filenames:
|
|||
mode = 'wrap' if options.periodic else 'nearest'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -43,7 +43,7 @@ if options.labels is None: parser.error('no data column specified.')
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_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))
|
||||
|
||||
for label in options.labels:
|
||||
|
@ -55,4 +55,4 @@ for name in filenames:
|
|||
grad.reshape(tuple(grid)+(-1,)).reshape(-1,np.prod(shape)*3,order='F'),
|
||||
scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -110,7 +110,7 @@ R = damask.Rotation.from_axis_angle(np.array(options.labrotation),options.degree
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
if options.eulers is not None:
|
||||
label = options.eulers
|
||||
|
@ -147,4 +147,4 @@ for name in filenames:
|
|||
if 'axisangle' in options.output:
|
||||
table = table.add('om({})'.format(label),o.as_axisangle(options.degrees), scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -175,7 +175,7 @@ labels = ['S[{direction[0]:.1g}_{direction[1]:.1g}_{direction[2]:.1g}]'
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
o = damask.Rotation.from_quaternion(table.get(options.quaternion))
|
||||
|
||||
|
@ -189,4 +189,4 @@ for name in filenames:
|
|||
for i,label in enumerate(labels):
|
||||
table = table.add(label,S[:,i],scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -27,7 +27,7 @@ def sortingList(labels,whitelistitems):
|
|||
else:
|
||||
indices.append(0)
|
||||
names.append(label)
|
||||
|
||||
|
||||
return [indices,names,whitelistitems]
|
||||
|
||||
|
||||
|
@ -72,11 +72,11 @@ for name in filenames:
|
|||
continue
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
# ------------------------------------------ assemble info ---------------------------------------
|
||||
# ------------------------------------------ assemble info ---------------------------------------
|
||||
|
||||
table.head_read()
|
||||
|
||||
# ------------------------------------------ process data ---------------------------------------
|
||||
# ------------------------------------------ process data ---------------------------------------
|
||||
|
||||
specials = { \
|
||||
'_row_': 0,
|
||||
|
@ -103,12 +103,12 @@ for name in filenames:
|
|||
else np.lexsort(sortingList(labels,whitelistitem)) # reorder if unique, i.e. no "-1" in whitelistitem
|
||||
else:
|
||||
order = range(len(labels)) # maintain original order of labels
|
||||
|
||||
|
||||
# --------------------------------------- evaluate condition ---------------------------------------
|
||||
if options.condition is not None:
|
||||
condition = options.condition # copy per file, since might be altered inline
|
||||
breaker = False
|
||||
|
||||
|
||||
for position,(all,marker,column) in enumerate(set(re.findall(r'#(([s]#)?(.+?))#',condition))): # find three groups
|
||||
idx = table.label_index(column)
|
||||
dim = table.label_dimension(column)
|
||||
|
@ -123,11 +123,11 @@ for name in filenames:
|
|||
's#':'str'}[marker],idx) # take float or string value of data column
|
||||
elif dim > 1: # multidimensional input (vector, tensor, etc.)
|
||||
replacement = 'np.array(table.data[{}:{}],dtype=float)'.format(idx,idx+dim) # use (flat) array representation
|
||||
|
||||
|
||||
condition = condition.replace('#'+all+'#',replacement)
|
||||
|
||||
|
||||
if breaker: continue # found mistake in condition evaluation --> next file
|
||||
|
||||
|
||||
# ------------------------------------------ assemble header ---------------------------------------
|
||||
|
||||
table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:]))
|
||||
|
@ -138,7 +138,7 @@ for name in filenames:
|
|||
# ------------------------------------------ process and output data ------------------------------------------
|
||||
|
||||
positions = np.array(positions)[order]
|
||||
|
||||
|
||||
atOnce = options.condition is None
|
||||
if atOnce: # read full array and filter columns
|
||||
try:
|
||||
|
|
|
@ -47,7 +47,7 @@ if filenames == []: filenames = [None]
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
randomSeed = int(os.urandom(4).hex(), 16) if options.randomSeed is None else options.randomSeed # random seed per file
|
||||
rng = np.random.default_rng(randomSeed)
|
||||
|
@ -58,4 +58,4 @@ for name in filenames:
|
|||
rng.shuffle(uniques)
|
||||
table = table.set(label,uniques[inverse], scriptID+' '+' '.join(sys.argv[1:]))
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -154,4 +154,4 @@ for name in filenames:
|
|||
homogenization=options.homogenization,comments=header)
|
||||
damask.util.croak(geom)
|
||||
|
||||
geom.to_file(os.path.splitext(name)[0]+'.geom',format='ASCII',pack=False)
|
||||
geom.save_ASCII(os.path.splitext(name)[0]+'.geom',pack=False)
|
||||
|
|
|
@ -89,4 +89,4 @@ geom=damask.Geom(microstructure,options.size,
|
|||
comments=[scriptID + ' ' + ' '.join(sys.argv[1:])])
|
||||
damask.util.croak(geom)
|
||||
|
||||
geom.to_file(sys.stdout if name is None else name,format='ASCII',pack=False)
|
||||
geom.save_ASCII(sys.stdout if name is None else name,pack=False)
|
||||
|
|
|
@ -142,4 +142,4 @@ geom = damask.Geom(microstructure.reshape(grid),
|
|||
homogenization=options.homogenization,comments=header)
|
||||
damask.util.croak(geom)
|
||||
|
||||
geom.to_file(sys.stdout if name is None else name,format='ASCII',pack=False)
|
||||
geom.save_ASCII(sys.stdout if name is None else name,pack=False)
|
||||
|
|
|
@ -68,7 +68,7 @@ if options.axes is not None and not set(options.axes).issubset(set(['x','+x','-x
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table.sort_by(['{}_{}'.format(i,options.pos) for i in range(3,0,-1)]) # x fast, y slow
|
||||
grid,size,origin = damask.grid_filters.cell_coord0_gridSizeOrigin(table.get(options.pos))
|
||||
|
||||
|
@ -105,5 +105,4 @@ for name in filenames:
|
|||
homogenization=options.homogenization,comments=header)
|
||||
damask.util.croak(geom)
|
||||
|
||||
geom.to_file(sys.stdout if name is None else os.path.splitext(name)[0]+'.geom',
|
||||
format='ASCII',pack=False)
|
||||
geom.save_ASCII(sys.stdout if name is None else os.path.splitext(name)[0]+'.geom',pack=False)
|
||||
|
|
|
@ -171,7 +171,7 @@ if filenames == []: filenames = [None]
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
size = np.ones(3)
|
||||
origin = np.zeros(3)
|
||||
|
@ -228,5 +228,4 @@ for name in filenames:
|
|||
homogenization=options.homogenization,comments=header)
|
||||
damask.util.croak(geom)
|
||||
|
||||
geom.to_file(sys.stdout if name is None else os.path.splitext(name)[0]+'.geom',
|
||||
format='ASCII',pack=False)
|
||||
geom.save_ASCII(sys.stdout if name is None else os.path.splitext(name)[0]+'.geom',pack=False)
|
||||
|
|
|
@ -62,7 +62,7 @@ if filenames == []: filenames = [None]
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
geom = damask.Geom.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
grid_original = geom.get_grid()
|
||||
damask.util.croak(geom)
|
||||
|
@ -169,7 +169,7 @@ for name in filenames:
|
|||
# undo any changes involving immutable microstructures
|
||||
microstructure = np.where(immutable, microstructure_original,microstructure)
|
||||
|
||||
geom=geom.duplicate(microstructure[0:grid_original[0],0:grid_original[1],0:grid_original[2]])
|
||||
geom = geom.duplicate(microstructure[0:grid_original[0],0:grid_original[1],0:grid_original[2]])
|
||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||
|
||||
geom.to_file(sys.stdout if name is None else name,format='ASCII',pack=False)
|
||||
geom.save_ASCII(sys.stdout if name is None else name,pack=False)
|
||||
|
|
|
@ -31,7 +31,7 @@ def binAsBins(bin,intervals):
|
|||
bins[1] = (bin//intervals[2]) % intervals[1]
|
||||
bins[2] = bin % intervals[2]
|
||||
return bins
|
||||
|
||||
|
||||
def binsAsBin(bins,intervals):
|
||||
"""Implode 3D bins into compound bin."""
|
||||
return (bins[0]*intervals[1] + bins[1])*intervals[2] + bins[2]
|
||||
|
@ -95,7 +95,7 @@ def directInversion (ODF,nSamples):
|
|||
float(nInvSamples)/nOptSamples-1.0,
|
||||
scale,nSamples))
|
||||
repetition = [None]*ODF['nBins'] # preallocate and clear
|
||||
|
||||
|
||||
for bin in range(ODF['nBins']): # loop over bins
|
||||
repetition[bin] = int(round(ODF['dV_V'][bin]*scale)) # calc repetition
|
||||
|
||||
|
@ -105,7 +105,7 @@ def directInversion (ODF,nSamples):
|
|||
for bin in range(ODF['nBins']):
|
||||
set[i:i+repetition[bin]] = [bin]*repetition[bin] # fill set with bin, i.e. orientation
|
||||
i += repetition[bin] # advance set counter
|
||||
|
||||
|
||||
orientations = np.zeros((nSamples,3),'f')
|
||||
reconstructedODF = np.zeros(ODF['nBins'],'f')
|
||||
unitInc = 1.0/nSamples
|
||||
|
@ -117,7 +117,7 @@ def directInversion (ODF,nSamples):
|
|||
orientations[j] = np.degrees(Eulers)
|
||||
reconstructedODF[bin] += unitInc
|
||||
set[ex] = set[j] # exchange orientations
|
||||
|
||||
|
||||
return orientations, reconstructedODF
|
||||
|
||||
|
||||
|
@ -130,7 +130,7 @@ def MonteCarloEulers (ODF,nSamples):
|
|||
orientations = np.zeros((nSamples,3),'f')
|
||||
reconstructedODF = np.zeros(ODF['nBins'],'f')
|
||||
unitInc = 1.0/nSamples
|
||||
|
||||
|
||||
for j in range(nSamples):
|
||||
MC = maxdV_V*2.0
|
||||
bin = 0
|
||||
|
@ -153,7 +153,7 @@ def MonteCarloBins (ODF,nSamples):
|
|||
orientations = np.zeros((nSamples,3),'f')
|
||||
reconstructedODF = np.zeros(ODF['nBins'],'f')
|
||||
unitInc = 1.0/nSamples
|
||||
|
||||
|
||||
for j in range(nSamples):
|
||||
MC = maxdV_V*2.0
|
||||
bin = 0
|
||||
|
@ -173,14 +173,14 @@ def TothVanHoutteSTAT (ODF,nSamples):
|
|||
orientations = np.zeros((nSamples,3),'f')
|
||||
reconstructedODF = np.zeros(ODF['nBins'],'f')
|
||||
unitInc = 1.0/nSamples
|
||||
|
||||
|
||||
selectors = [random.random() for i in range(nSamples)]
|
||||
selectors.sort()
|
||||
indexSelector = 0
|
||||
|
||||
|
||||
cumdV_V = 0.0
|
||||
countSamples = 0
|
||||
|
||||
|
||||
for bin in range(ODF['nBins']) :
|
||||
cumdV_V += ODF['dV_V'][bin]
|
||||
while indexSelector < nSamples and selectors[indexSelector] < cumdV_V:
|
||||
|
@ -191,7 +191,7 @@ def TothVanHoutteSTAT (ODF,nSamples):
|
|||
indexSelector += 1
|
||||
|
||||
damask.util.croak('created set of %i when asked to deliver %i'%(countSamples,nSamples))
|
||||
|
||||
|
||||
return orientations, reconstructedODF
|
||||
|
||||
|
||||
|
@ -233,8 +233,8 @@ if filenames == []: filenames = [None]
|
|||
|
||||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
table = damask.Table.from_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
table = damask.Table.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
randomSeed = int(os.urandom(4).hex(),16) if options.randomSeed is None else options.randomSeed # random seed per file
|
||||
random.seed(randomSeed)
|
||||
|
@ -253,7 +253,7 @@ for name in filenames:
|
|||
if eulers.shape[0] != ODF['nBins']:
|
||||
damask.util.croak('expecting %i values but got %i'%(ODF['nBins'],eulers.shape[0]))
|
||||
continue
|
||||
|
||||
|
||||
# ----- build binnedODF array and normalize ------------------------------------------------------
|
||||
sumdV_V = 0.0
|
||||
ODF['dV_V'] = [None]*ODF['nBins']
|
||||
|
@ -267,7 +267,7 @@ for name in filenames:
|
|||
if ODF['dV_V'][b] > 0.0:
|
||||
sumdV_V += ODF['dV_V'][b]
|
||||
ODF['nNonZero'] += 1
|
||||
|
||||
|
||||
for b in range(ODF['nBins']):
|
||||
ODF['dV_V'][b] /= sumdV_V # normalize dV/V
|
||||
|
||||
|
@ -277,19 +277,19 @@ for name in filenames:
|
|||
'Volume integral of ODF: %12.11f\n'%sumdV_V,
|
||||
'Reference Integral: %12.11f\n'%(ODF['limit'][0]*ODF['limit'][2]*(1-math.cos(ODF['limit'][1]))),
|
||||
])
|
||||
|
||||
|
||||
Functions = {'IA': 'directInversion', 'STAT': 'TothVanHoutteSTAT', 'MC': 'MonteCarloBins'}
|
||||
method = Functions[options.algorithm]
|
||||
|
||||
Orientations, ReconstructedODF = (globals()[method])(ODF,options.number)
|
||||
|
||||
|
||||
# calculate accuracy of sample
|
||||
squaredDiff = {'orig':0.0,method:0.0}
|
||||
squaredRelDiff = {'orig':0.0,method:0.0}
|
||||
mutualProd = {'orig':0.0,method:0.0}
|
||||
indivSum = {'orig':0.0,method:0.0}
|
||||
indivSquaredSum = {'orig':0.0,method:0.0}
|
||||
|
||||
|
||||
for bin in range(ODF['nBins']):
|
||||
squaredDiff[method] += (ODF['dV_V'][bin] - ReconstructedODF[bin])**2
|
||||
if ODF['dV_V'][bin] > 0.0:
|
||||
|
@ -299,7 +299,7 @@ for name in filenames:
|
|||
indivSquaredSum[method] += ReconstructedODF[bin]**2
|
||||
indivSum['orig'] += ODF['dV_V'][bin]
|
||||
indivSquaredSum['orig'] += ODF['dV_V'][bin]**2
|
||||
|
||||
|
||||
damask.util.croak(['sqrt(N*)RMSD of ODFs:\t %12.11f'% math.sqrt(options.number*squaredDiff[method]),
|
||||
'RMSrD of ODFs:\t %12.11f'%math.sqrt(squaredRelDiff[method]),
|
||||
'rMSD of ODFs:\t %12.11f'%(squaredDiff[method]/indivSquaredSum['orig']),
|
||||
|
@ -311,10 +311,10 @@ for name in filenames:
|
|||
(ODF['nNonZero']*math.sqrt((indivSquaredSum['orig']/ODF['nNonZero']-(indivSum['orig']/ODF['nNonZero'])**2)*\
|
||||
(indivSquaredSum[method]/ODF['nNonZero']-(indivSum[method]/ODF['nNonZero'])**2)))),
|
||||
])
|
||||
|
||||
|
||||
if method == 'IA' and options.number < ODF['nNonZero']:
|
||||
strOpt = '(%i)'%ODF['nNonZero']
|
||||
|
||||
|
||||
formatwidth = 1+int(math.log10(options.number))
|
||||
|
||||
materialConfig = [
|
||||
|
@ -324,12 +324,12 @@ for name in filenames:
|
|||
'<microstructure>',
|
||||
'#-------------------#',
|
||||
]
|
||||
|
||||
|
||||
for i,ID in enumerate(range(options.number)):
|
||||
materialConfig += ['[Grain%s]'%(str(ID+1).zfill(formatwidth)),
|
||||
'(constituent) phase %i texture %s fraction 1.0'%(options.phase,str(ID+1).rjust(formatwidth)),
|
||||
]
|
||||
|
||||
|
||||
materialConfig += [
|
||||
'#-------------------#',
|
||||
'<texture>',
|
||||
|
@ -338,12 +338,12 @@ for name in filenames:
|
|||
|
||||
for ID in range(options.number):
|
||||
eulers = Orientations[ID]
|
||||
|
||||
|
||||
materialConfig += ['[Grain%s]'%(str(ID+1).zfill(formatwidth)),
|
||||
'(gauss) phi1 {} Phi {} phi2 {} scatter 0.0 fraction 1.0'.format(*eulers),
|
||||
]
|
||||
|
||||
#--- output finalization --------------------------------------------------------------------------
|
||||
#--- output finalization --------------------------------------------------------------------------
|
||||
|
||||
with (open(os.path.splitext(name)[0]+'_'+method+'_'+str(options.number)+'_material.config','w')) as outfile:
|
||||
outfile.write('\n'.join(materialConfig)+'\n')
|
||||
|
|
|
@ -42,7 +42,7 @@ def output(cmds,locals,dest):
|
|||
else:
|
||||
outFile(str(cmd),locals,dest)
|
||||
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------------------------
|
||||
def init():
|
||||
return [
|
||||
|
@ -114,7 +114,7 @@ def material():
|
|||
"*add_geometry_elements",
|
||||
"all_existing",
|
||||
]
|
||||
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------------------------
|
||||
def geometry():
|
||||
|
@ -127,14 +127,14 @@ def geometry():
|
|||
"*element_type 7",
|
||||
"all_existing",
|
||||
]
|
||||
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------------------------
|
||||
def initial_conditions(microstructures):
|
||||
elements = []
|
||||
element = 0
|
||||
for id in microstructures:
|
||||
element += 1
|
||||
element += 1
|
||||
if len(elements) < id:
|
||||
for i in range(id-len(elements)):
|
||||
elements.append([])
|
||||
|
@ -195,8 +195,8 @@ if filenames == []: filenames = [None]
|
|||
|
||||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
geom = damask.Geom.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
microstructure = geom.get_microstructure().flatten(order='F')
|
||||
|
||||
cmds = [\
|
||||
|
@ -210,7 +210,7 @@ for name in filenames:
|
|||
'*redraw',
|
||||
'*draw_automatic',
|
||||
]
|
||||
|
||||
|
||||
outputLocals = {}
|
||||
if options.port:
|
||||
py_mentat.py_connect('',options.port)
|
||||
|
|
|
@ -78,7 +78,7 @@ class myThread (threading.Thread):
|
|||
perturbedSeedsVFile = StringIO()
|
||||
myBestSeedsVFile.seek(0)
|
||||
|
||||
perturbedSeedsTable = damask.Table.from_ASCII(myBestSeedsVFile)
|
||||
perturbedSeedsTable = damask.Table.load_ASCII(myBestSeedsVFile)
|
||||
coords = perturbedSeedsTable.get('pos')
|
||||
i = 0
|
||||
for ms,coord in enumerate(coords):
|
||||
|
@ -89,8 +89,7 @@ class myThread (threading.Thread):
|
|||
coords[i]=newCoords
|
||||
direction[i]*=2.
|
||||
i+= 1
|
||||
perturbedSeedsTable.set('pos',coords)
|
||||
perturbedSeedsTable.to_file(perturbedSeedsVFile)
|
||||
perturbedSeedsTable.set('pos',coords).save_ASCII(perturbedSeedsVFile)
|
||||
|
||||
#--- do tesselation with perturbed seed file ------------------------------------------------------
|
||||
perturbedGeomVFile.close()
|
||||
|
@ -101,7 +100,7 @@ class myThread (threading.Thread):
|
|||
perturbedGeomVFile.seek(0)
|
||||
|
||||
#--- evaluate current seeds file ------------------------------------------------------------------
|
||||
perturbedGeom = damask.Geom.from_file(perturbedGeomVFile)
|
||||
perturbedGeom = damask.Geom.load_ASCII(perturbedGeomVFile)
|
||||
myNmicrostructures = len(np.unique(perturbedGeom.microstructure))
|
||||
currentData=np.bincount(perturbedGeom.microstructure.ravel())[1:]/points
|
||||
currentError=[]
|
||||
|
@ -213,14 +212,14 @@ if options.randomSeed is None:
|
|||
options.randomSeed = int(os.urandom(4).hex(),16)
|
||||
damask.util.croak(options.randomSeed)
|
||||
delta = options.scale/np.array(options.grid)
|
||||
baseFile=os.path.splitext(os.path.basename(options.seedFile))[0]
|
||||
baseFile = os.path.splitext(os.path.basename(options.seedFile))[0]
|
||||
points = np.array(options.grid).prod().astype('float')
|
||||
|
||||
# ----------- calculate target distribution and bin edges
|
||||
targetGeom = damask.Geom.from_file(os.path.splitext(os.path.basename(options.target))[0]+'.geom')
|
||||
targetGeom = damask.Geom.load_ASCII(os.path.splitext(os.path.basename(options.target))[0]+'.geom')
|
||||
nMicrostructures = len(np.unique(targetGeom.microstructure))
|
||||
targetVolFrac = np.bincount(targetGeom.microstructure.flatten())/targetGeom.grid.prod().astype(np.float)
|
||||
target=[]
|
||||
target = []
|
||||
for i in range(1,nMicrostructures+1):
|
||||
targetHist,targetBins = np.histogram(targetVolFrac,bins=i) #bin boundaries
|
||||
target.append({'histogram':targetHist,'bins':targetBins})
|
||||
|
@ -243,7 +242,7 @@ initialGeomVFile = StringIO()
|
|||
initialGeomVFile.write(damask.util.execute('geom_fromVoronoiTessellation '+
|
||||
' -g '+' '.join(list(map(str, options.grid))),bestSeedsVFile)[0])
|
||||
initialGeomVFile.seek(0)
|
||||
initialGeom = damask.Geom.from_file(initialGeomVFile)
|
||||
initialGeom = damask.Geom.load_ASCII(initialGeomVFile)
|
||||
|
||||
if len(np.unique(targetGeom.microstructure)) != nMicrostructures:
|
||||
damask.util.croak('error. Microstructure count mismatch')
|
||||
|
@ -273,8 +272,8 @@ sys.stdout.flush()
|
|||
initialGeomVFile.close()
|
||||
|
||||
# start mulithreaded monte carlo simulation
|
||||
threads=[]
|
||||
s=threading.Semaphore(1)
|
||||
threads = []
|
||||
s = threading.Semaphore(1)
|
||||
|
||||
for i in range(options.threads):
|
||||
threads.append(myThread(i))
|
||||
|
|
|
@ -46,7 +46,7 @@ options.blacklist = [int(i) for i in options.blacklist]
|
|||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
|
||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
geom = damask.Geom.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
microstructure = geom.get_microstructure().reshape((-1,1),order='F')
|
||||
|
||||
mask = np.logical_and(np.in1d(microstructure,options.whitelist,invert=False) if options.whitelist else \
|
||||
|
@ -63,6 +63,6 @@ for name in filenames:
|
|||
'origin\tx {}\ty {}\tz {}'.format(*geom.origin),
|
||||
'homogenization\t{}'.format(geom.homogenization)]
|
||||
|
||||
table = damask.Table(seeds[mask],{'pos':(3,)},comments)
|
||||
table = table.add('microstructure',microstructure[mask])
|
||||
table.to_file(sys.stdout if name is None else os.path.splitext(name)[0]+'.seeds')
|
||||
damask.Table(seeds[mask],{'pos':(3,)},comments)\
|
||||
.add('microstructure',microstructure[mask].astype(int))\
|
||||
.save_ASCII(sys.stdout if name is None else os.path.splitext(name)[0]+'.seeds')
|
||||
|
|
|
@ -52,7 +52,7 @@ options.box = np.array(options.box).reshape(3,2)
|
|||
|
||||
for name in filenames:
|
||||
damask.util.report(scriptName,name)
|
||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
geom = damask.Geom.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||
|
||||
offset =(np.amin(options.box, axis=1)*geom.grid/geom.size).astype(int)
|
||||
box = np.amax(options.box, axis=1) \
|
||||
|
@ -91,6 +91,6 @@ for name in filenames:
|
|||
'homogenization\t{}'.format(geom.homogenization)]
|
||||
|
||||
table = damask.Table(seeds,{'pos':(3,),'microstructure':(1,)},comments)
|
||||
table.set('microstructure',table.get('microstructure').astype(np.int))
|
||||
table.to_file(sys.stdout if name is None else \
|
||||
os.path.splitext(name)[0]+f'_poked_{options.N}.seeds')
|
||||
table.set('microstructure',table.get('microstructure').astype(np.int))\
|
||||
.save_ASCII(sys.stdout if name is None else \
|
||||
os.path.splitext(name)[0]+f'_poked_{options.N}.seeds')
|
||||
|
|
|
@ -154,12 +154,12 @@ for name in filenames:
|
|||
'randomSeed\t{}'.format(options.randomSeed),
|
||||
]
|
||||
|
||||
table = damask.Table(np.hstack((seeds,eulers)),{'pos':(3,),'euler':(3,)},comments)
|
||||
table = table.add('microstructure',np.arange(options.microstructure,options.microstructure + options.N,dtype=int))
|
||||
table = damask.Table(np.hstack((seeds,eulers)),{'pos':(3,),'euler':(3,)},comments)\
|
||||
.add('microstructure',np.arange(options.microstructure,options.microstructure + options.N,dtype=int))
|
||||
|
||||
if options.weights:
|
||||
weights = np.random.uniform(low = 0, high = options.max, size = options.N) if options.max > 0.0 \
|
||||
else np.random.normal(loc = options.mean, scale = options.sigma, size = options.N)
|
||||
table = table.add('weight',weights)
|
||||
|
||||
table.to_file(sys.stdout if name is None else name)
|
||||
table.save_ASCII(sys.stdout if name is None else name)
|
||||
|
|
|
@ -235,100 +235,128 @@ class Colormap(mpl.colors.ListedColormap):
|
|||
return Colormap(np.array(rev.colors),rev.name[:-4] if rev.name.endswith('_r_r') else rev.name)
|
||||
|
||||
|
||||
def to_file(self,fname=None,format='ParaView'):
|
||||
|
||||
def save_paraview(self,fname=None):
|
||||
"""
|
||||
Export colormap to file for use in external programs.
|
||||
Write colormap to JSON file for Paraview.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : file, str, or pathlib.Path, optional.
|
||||
Filename to store results. If not given, the filename will
|
||||
consist of the name of the colormap and an extension that
|
||||
depends on the file format.
|
||||
format : {'ParaView', 'ASCII', 'GOM', 'gmsh'}, optional
|
||||
File format, defaults to 'ParaView'. Available formats are:
|
||||
- ParaView: JSON file, extension '.json'.
|
||||
- ASCII: Plain text file, extension '.txt'.
|
||||
- GOM: Aramis GOM (DIC), extension '.legend'.
|
||||
- Gmsh: Gmsh FEM mesh-generator, extension '.msh'.
|
||||
consist of the name of the colormap and extension '.json'.
|
||||
|
||||
"""
|
||||
if fname is not None:
|
||||
try:
|
||||
f = open(fname,'w')
|
||||
fhandle = open(fname,'w')
|
||||
except TypeError:
|
||||
f = fname
|
||||
fhandle = fname
|
||||
else:
|
||||
f = None
|
||||
fhandle = None
|
||||
|
||||
if format.lower() == 'paraview':
|
||||
Colormap._export_paraview(self,f)
|
||||
elif format.lower() == 'ascii':
|
||||
Colormap._export_ASCII(self,f)
|
||||
elif format.lower() == 'gom':
|
||||
Colormap._export_GOM(self,f)
|
||||
elif format.lower() == 'gmsh':
|
||||
Colormap._export_gmsh(self,f)
|
||||
else:
|
||||
raise ValueError('Unknown output format: {format}.')
|
||||
|
||||
@staticmethod
|
||||
def _export_paraview(colormap,fhandle=None):
|
||||
"""Write colormap to JSON file for Paraview."""
|
||||
colors = []
|
||||
for i,c in enumerate(np.round(colormap.colors,6).tolist()):
|
||||
for i,c in enumerate(np.round(self.colors,6).tolist()):
|
||||
colors+=[i]+c
|
||||
|
||||
out = [{
|
||||
'Creator':util.execution_stamp('Colormap'),
|
||||
'ColorSpace':'RGB',
|
||||
'Name':colormap.name,
|
||||
'Name':self.name,
|
||||
'DefaultMap':True,
|
||||
'RGBPoints':colors
|
||||
}]
|
||||
if fhandle is None:
|
||||
with open(colormap.name.replace(' ','_')+'.json', 'w') as f:
|
||||
with open(self.name.replace(' ','_')+'.json', 'w') as f:
|
||||
json.dump(out, f,indent=4)
|
||||
else:
|
||||
json.dump(out,fhandle,indent=4)
|
||||
|
||||
@staticmethod
|
||||
def _export_ASCII(colormap,fhandle=None):
|
||||
"""Write colormap to ASCII table."""
|
||||
labels = {'RGBA':4} if colormap.colors.shape[1] == 4 else {'RGB': 3}
|
||||
t = Table(colormap.colors,labels,f'Creator: {util.execution_stamp("Colormap")}')
|
||||
|
||||
def save_ASCII(self,fname=None):
|
||||
"""
|
||||
Write colormap to ASCII table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : file, str, or pathlib.Path, optional.
|
||||
Filename to store results. If not given, the filename will
|
||||
consist of the name of the colormap and extension '.txt'.
|
||||
|
||||
"""
|
||||
if fname is not None:
|
||||
try:
|
||||
fhandle = open(fname,'w')
|
||||
except TypeError:
|
||||
fhandle = fname
|
||||
else:
|
||||
fhandle = None
|
||||
|
||||
labels = {'RGBA':4} if self.colors.shape[1] == 4 else {'RGB': 3}
|
||||
t = Table(self.colors,labels,f'Creator: {util.execution_stamp("Colormap")}')
|
||||
|
||||
if fhandle is None:
|
||||
with open(colormap.name.replace(' ','_')+'.txt', 'w') as f:
|
||||
t.to_file(f,new_style=True)
|
||||
with open(self.name.replace(' ','_')+'.txt', 'w') as f:
|
||||
t.save_ASCII(f)
|
||||
else:
|
||||
t.to_file(fhandle,new_style=True)
|
||||
t.save_ASCII(fhandle)
|
||||
|
||||
@staticmethod
|
||||
def _export_GOM(colormap,fhandle=None):
|
||||
"""Write colormap to GOM Aramis compatible format."""
|
||||
|
||||
def save_GOM(self,fname=None):
|
||||
"""
|
||||
Write colormap to GOM Aramis compatible format.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : file, str, or pathlib.Path, optional.
|
||||
Filename to store results. If not given, the filename will
|
||||
consist of the name of the colormap and extension '.legend'.
|
||||
|
||||
"""
|
||||
if fname is not None:
|
||||
try:
|
||||
fhandle = open(fname,'w')
|
||||
except TypeError:
|
||||
fhandle = fname
|
||||
else:
|
||||
fhandle = None
|
||||
# ToDo: test in GOM
|
||||
GOM_str = f'1 1 {colormap.name.replace(" ","_")} 9 {colormap.name.replace(" ","_")} ' \
|
||||
GOM_str = '1 1 {name} 9 {name} '.format(name=self.name.replace(" ","_")) \
|
||||
+ '0 1 0 3 0 0 -1 9 \\ 0 0 0 255 255 255 0 0 255 ' \
|
||||
+ f'30 NO_UNIT 1 1 64 64 64 255 1 0 0 0 0 0 0 3 0 {len(colormap.colors)}' \
|
||||
+ ' '.join([f' 0 {c[0]} {c[1]} {c[2]} 255 1' for c in reversed((colormap.colors*255).astype(int))]) \
|
||||
+ f'30 NO_UNIT 1 1 64 64 64 255 1 0 0 0 0 0 0 3 0 {len(self.colors)}' \
|
||||
+ ' '.join([f' 0 {c[0]} {c[1]} {c[2]} 255 1' for c in reversed((self.colors*255).astype(int))]) \
|
||||
+ '\n'
|
||||
if fhandle is None:
|
||||
with open(colormap.name.replace(' ','_')+'.legend', 'w') as f:
|
||||
with open(self.name.replace(' ','_')+'.legend', 'w') as f:
|
||||
f.write(GOM_str)
|
||||
else:
|
||||
fhandle.write(GOM_str)
|
||||
|
||||
|
||||
@staticmethod
|
||||
def _export_gmsh(colormap,fhandle=None):
|
||||
"""Write colormap to Gmsh compatible format."""
|
||||
def save_gmsh(self,fname=None):
|
||||
"""
|
||||
Write colormap to Gmsh compatible format.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : file, str, or pathlib.Path, optional.
|
||||
Filename to store results. If not given, the filename will
|
||||
consist of the name of the colormap and extension '.msh'.
|
||||
|
||||
"""
|
||||
if fname is not None:
|
||||
try:
|
||||
fhandle = open(fname,'w')
|
||||
except TypeError:
|
||||
fhandle = fname
|
||||
else:
|
||||
fhandle = None
|
||||
# ToDo: test in gmsh
|
||||
gmsh_str = 'View.ColorTable = {\n' \
|
||||
+'\n'.join([f'{c[0]},{c[1]},{c[2]},' for c in colormap.colors[:,:3]*255]) \
|
||||
+'\n'.join([f'{c[0]},{c[1]},{c[2]},' for c in self.colors[:,:3]*255]) \
|
||||
+'\n}\n'
|
||||
if fhandle is None:
|
||||
with open(colormap.name.replace(' ','_')+'.msh', 'w') as f:
|
||||
with open(self.name.replace(' ','_')+'.msh', 'w') as f:
|
||||
f.write(gmsh_str)
|
||||
else:
|
||||
fhandle.write(gmsh_str)
|
||||
|
|
|
@ -284,7 +284,7 @@ class Geom:
|
|||
|
||||
|
||||
@staticmethod
|
||||
def from_file(fname):
|
||||
def load_ASCII(fname):
|
||||
"""
|
||||
Read a geom file.
|
||||
|
||||
|
@ -350,7 +350,7 @@ class Geom:
|
|||
|
||||
|
||||
@staticmethod
|
||||
def from_vtr(fname):
|
||||
def load_vtr(fname):
|
||||
"""
|
||||
Read a VTK rectilinear grid.
|
||||
|
||||
|
@ -361,7 +361,7 @@ class Geom:
|
|||
Valid extension is .vtr, it will be appended if not given.
|
||||
|
||||
"""
|
||||
v = VTK.from_file(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr')
|
||||
v = VTK.load(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr')
|
||||
comments = v.get_comments()
|
||||
grid = np.array(v.vtk_data.GetDimensions())-1
|
||||
bbox = np.array(v.vtk_data.GetBounds()).reshape(3,2).T
|
||||
|
@ -447,128 +447,106 @@ class Geom:
|
|||
)
|
||||
|
||||
|
||||
def to_file(self,fname,format='vtr',pack=None):
|
||||
def save_ASCII(self,fname,pack=None):
|
||||
"""
|
||||
Writes a geom file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
geom : Geom object
|
||||
Geometry to write.
|
||||
fname : str or file handle
|
||||
Geometry file to write.
|
||||
format : {'vtr', 'ASCII'}, optional
|
||||
File format, defaults to 'vtr'. Available formats are:
|
||||
- vtr: VTK rectilinear grid file, extension '.vtr'.
|
||||
- ASCII: Plain text file, extension '.geom'.
|
||||
Geometry file to write with extension '.geom'.
|
||||
pack : bool, optional
|
||||
Compress ASCII geometry with 'x of y' and 'a to b'.
|
||||
Compress geometry with 'x of y' and 'a to b'.
|
||||
|
||||
"""
|
||||
def _to_ASCII(geom,fname,pack=None):
|
||||
"""
|
||||
Writes a geom file.
|
||||
header = [f'{len(self.comments)+4} header'] + self.comments
|
||||
header.append('grid a {} b {} c {}'.format(*self.get_grid()))
|
||||
header.append('size x {} y {} z {}'.format(*self.get_size()))
|
||||
header.append('origin x {} y {} z {}'.format(*self.get_origin()))
|
||||
header.append(f'homogenization {self.get_homogenization()}')
|
||||
|
||||
Parameters
|
||||
----------
|
||||
geom : Geom object
|
||||
Geometry to write.
|
||||
fname : str or file handle
|
||||
Geometry file to write.
|
||||
pack : bool, optional
|
||||
Compress geometry with 'x of y' and 'a to b'.
|
||||
grid = self.get_grid()
|
||||
|
||||
"""
|
||||
header = [f'{len(geom.comments)+4} header'] + geom.comments
|
||||
header.append('grid a {} b {} c {}'.format(*geom.get_grid()))
|
||||
header.append('size x {} y {} z {}'.format(*geom.get_size()))
|
||||
header.append('origin x {} y {} z {}'.format(*geom.get_origin()))
|
||||
header.append(f'homogenization {geom.get_homogenization()}')
|
||||
|
||||
grid = geom.get_grid()
|
||||
|
||||
if pack is None:
|
||||
plain = grid.prod()/geom.N_microstructure < 250
|
||||
else:
|
||||
plain = not pack
|
||||
|
||||
if plain:
|
||||
format_string = '%g' if geom.microstructure.dtype in np.sctypes['float'] else \
|
||||
'%{}i'.format(1+int(np.floor(np.log10(np.nanmax(geom.microstructure)))))
|
||||
np.savetxt(fname,
|
||||
geom.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T,
|
||||
header='\n'.join(header), fmt=format_string, comments='')
|
||||
else:
|
||||
try:
|
||||
f = open(fname,'w')
|
||||
except TypeError:
|
||||
f = fname
|
||||
|
||||
compressType = None
|
||||
former = start = -1
|
||||
reps = 0
|
||||
for current in geom.microstructure.flatten('F'):
|
||||
if abs(current - former) == 1 and (start - current) == reps*(former - current):
|
||||
compressType = 'to'
|
||||
reps += 1
|
||||
elif current == former and start == former:
|
||||
compressType = 'of'
|
||||
reps += 1
|
||||
else:
|
||||
if compressType is None:
|
||||
f.write('\n'.join(header)+'\n')
|
||||
elif compressType == '.':
|
||||
f.write(f'{former}\n')
|
||||
elif compressType == 'to':
|
||||
f.write(f'{start} to {former}\n')
|
||||
elif compressType == 'of':
|
||||
f.write(f'{reps} of {former}\n')
|
||||
|
||||
compressType = '.'
|
||||
start = current
|
||||
reps = 1
|
||||
|
||||
former = current
|
||||
|
||||
if compressType == '.':
|
||||
f.write(f'{former}\n')
|
||||
elif compressType == 'to':
|
||||
f.write(f'{start} to {former}\n')
|
||||
elif compressType == 'of':
|
||||
f.write(f'{reps} of {former}\n')
|
||||
|
||||
|
||||
def _to_vtr(geom,fname=None):
|
||||
"""
|
||||
Generates vtk rectilinear grid.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
geom : Geom object
|
||||
Geometry to write.
|
||||
fname : str, optional
|
||||
Filename to write. If no file is given, a string is returned.
|
||||
Valid extension is .vtr, it will be appended if not given.
|
||||
|
||||
"""
|
||||
v = VTK.from_rectilinearGrid(geom.grid,geom.size,geom.origin)
|
||||
v.add(geom.microstructure.flatten(order='F'),'materialpoint')
|
||||
v.add_comments(geom.comments)
|
||||
|
||||
if fname:
|
||||
v.to_file(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr')
|
||||
else:
|
||||
sys.stdout.write(v.__repr__())
|
||||
|
||||
if format.lower() == 'ascii':
|
||||
return _to_ASCII(self,fname,pack)
|
||||
elif format.lower() == 'vtr':
|
||||
return _to_vtr(self,fname)
|
||||
if pack is None:
|
||||
plain = grid.prod()/self.N_microstructure < 250
|
||||
else:
|
||||
raise TypeError(f'Unknown format {format}.')
|
||||
plain = not pack
|
||||
|
||||
if plain:
|
||||
format_string = '%g' if self.microstructure.dtype in np.sctypes['float'] else \
|
||||
'%{}i'.format(1+int(np.floor(np.log10(np.nanmax(self.microstructure)))))
|
||||
np.savetxt(fname,
|
||||
self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T,
|
||||
header='\n'.join(header), fmt=format_string, comments='')
|
||||
else:
|
||||
try:
|
||||
f = open(fname,'w')
|
||||
except TypeError:
|
||||
f = fname
|
||||
|
||||
compressType = None
|
||||
former = start = -1
|
||||
reps = 0
|
||||
for current in self.microstructure.flatten('F'):
|
||||
if abs(current - former) == 1 and (start - current) == reps*(former - current):
|
||||
compressType = 'to'
|
||||
reps += 1
|
||||
elif current == former and start == former:
|
||||
compressType = 'of'
|
||||
reps += 1
|
||||
else:
|
||||
if compressType is None:
|
||||
f.write('\n'.join(header)+'\n')
|
||||
elif compressType == '.':
|
||||
f.write(f'{former}\n')
|
||||
elif compressType == 'to':
|
||||
f.write(f'{start} to {former}\n')
|
||||
elif compressType == 'of':
|
||||
f.write(f'{reps} of {former}\n')
|
||||
|
||||
compressType = '.'
|
||||
start = current
|
||||
reps = 1
|
||||
|
||||
former = current
|
||||
|
||||
if compressType == '.':
|
||||
f.write(f'{former}\n')
|
||||
elif compressType == 'to':
|
||||
f.write(f'{start} to {former}\n')
|
||||
elif compressType == 'of':
|
||||
f.write(f'{reps} of {former}\n')
|
||||
|
||||
|
||||
def save_vtr(self,fname=None):
|
||||
"""
|
||||
Generates vtk rectilinear grid.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
geom : Geom object
|
||||
Geometry to write with extension '.vtr'.
|
||||
fname : str, optional
|
||||
Filename to write. If no file is given, a string is returned.
|
||||
Valid extension is .vtr, it will be appended if not given.
|
||||
|
||||
"""
|
||||
v = VTK.from_rectilinearGrid(self.grid,self.size,self.origin)
|
||||
v.add(self.microstructure.flatten(order='F'),'materialpoint')
|
||||
v.add_comments(self.comments)
|
||||
|
||||
if fname:
|
||||
v.save(fname if str(fname).endswith('.vtr') else str(fname)+'.vtr')
|
||||
else:
|
||||
sys.stdout.write(v.__repr__())
|
||||
|
||||
|
||||
def as_ASCII(self,pack=False):
|
||||
"""Format geometry as human-readable ASCII."""
|
||||
f = StringIO()
|
||||
self.to_file(f,'ASCII',pack)
|
||||
self.save_ASCII(f,pack)
|
||||
f.seek(0)
|
||||
return ''.join(f.readlines())
|
||||
|
||||
|
|
|
@ -1196,7 +1196,7 @@ class Result:
|
|||
f.write(xml.dom.minidom.parseString(ET.tostring(xdmf).decode()).toprettyxml())
|
||||
|
||||
|
||||
def to_vtk(self,labels=[],mode='cell'):
|
||||
def save_vtk(self,labels=[],mode='cell'):
|
||||
"""
|
||||
Export to vtk cell/point data.
|
||||
|
||||
|
@ -1268,4 +1268,4 @@ class Result:
|
|||
u = self.read_dataset(self.get_dataset_location('u_n' if mode.lower() == 'cell' else 'u_p'))
|
||||
v.add(u,'u')
|
||||
|
||||
v.to_file(f'{self.fname.stem}_inc{inc[3:].zfill(N_digits)}')
|
||||
v.save(f'{self.fname.stem}_inc{inc[3:].zfill(N_digits)}')
|
||||
|
|
|
@ -27,7 +27,7 @@ class Table:
|
|||
self.comments = [] if comments_ is None else [c for c in comments_]
|
||||
self.data = pd.DataFrame(data=data)
|
||||
self.shapes = { k:(v,) if isinstance(v,(np.int,int)) else v for k,v in shapes.items() }
|
||||
self._label_condensed()
|
||||
self._label_uniform()
|
||||
|
||||
|
||||
def __copy__(self):
|
||||
|
@ -39,7 +39,7 @@ class Table:
|
|||
return self.__copy__()
|
||||
|
||||
|
||||
def _label_flat(self):
|
||||
def _label_discrete(self):
|
||||
"""Label data individually, e.g. v v v ==> 1_v 2_v 3_v."""
|
||||
labels = []
|
||||
for label,shape in self.shapes.items():
|
||||
|
@ -48,8 +48,8 @@ class Table:
|
|||
self.data.columns = labels
|
||||
|
||||
|
||||
def _label_condensed(self):
|
||||
"""Label data condensed, e.g. 1_v 2_v 3_v ==> v v v."""
|
||||
def _label_uniform(self):
|
||||
"""Label data uniformly, e.g. 1_v 2_v 3_v ==> v v v."""
|
||||
labels = []
|
||||
for label,shape in self.shapes.items():
|
||||
labels += [label] * int(np.prod(shape))
|
||||
|
@ -64,12 +64,15 @@ class Table:
|
|||
|
||||
|
||||
@staticmethod
|
||||
def from_ASCII(fname):
|
||||
def load_ASCII(fname):
|
||||
"""
|
||||
Create table from ASCII file.
|
||||
|
||||
The first line can indicate the number of subsequent header lines as 'n header',
|
||||
alternatively first line is the header and comments are marked by '#' ('new style').
|
||||
In legacy style, the first line indicates the number of
|
||||
subsequent header lines as "N header", with the last header line being
|
||||
interpreted as column labels.
|
||||
Alternatively, initial comments are marked by '#', with the first non-comment line
|
||||
containing the column labels.
|
||||
Vector data column labels are indicated by '1_v, 2_v, ..., n_v'.
|
||||
Tensor data column labels are indicated by '3x3:1_T, 3x3:2_T, ..., 3x3:9_T'.
|
||||
|
||||
|
@ -119,7 +122,7 @@ class Table:
|
|||
return Table(data,shapes,comments)
|
||||
|
||||
@staticmethod
|
||||
def from_ang(fname):
|
||||
def load_ang(fname):
|
||||
"""
|
||||
Create table from TSL ang file.
|
||||
|
||||
|
@ -289,9 +292,9 @@ class Table:
|
|||
|
||||
"""
|
||||
dup = self.copy()
|
||||
dup._label_flat()
|
||||
dup._label_discrete()
|
||||
dup.data.sort_values(labels,axis=0,inplace=True,ascending=ascending)
|
||||
dup._label_condensed()
|
||||
dup._label_uniform()
|
||||
dup.comments.append(f'sorted {"ascending" if ascending else "descending"} by {labels}')
|
||||
return dup
|
||||
|
||||
|
@ -338,59 +341,40 @@ class Table:
|
|||
return dup
|
||||
|
||||
|
||||
def to_file(self,fname,format='ASCII',new_style=False):
|
||||
def save_ASCII(table,fname,legacy=False):
|
||||
"""
|
||||
Store as plain text file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
table : Table object
|
||||
Table to write.
|
||||
fname : file, str, or pathlib.Path
|
||||
Filename or file for writing.
|
||||
format : {ASCII'}, optional
|
||||
File format, defaults to 'ASCII'. Available formats are:
|
||||
- ASCII: Plain text file, extension '.txt'.
|
||||
new_style : Boolean, optional
|
||||
Write table in new style, indicating header lines by comment sign ('#') only.
|
||||
legacy : Boolean, optional
|
||||
Write table in legacy style, indicating header lines by "N header"
|
||||
in contrast to using comment sign ('#') at beginning of lines.
|
||||
|
||||
"""
|
||||
def _to_ASCII(table,fname,new_style=False):
|
||||
"""
|
||||
Store as plain text file.
|
||||
seen = set()
|
||||
labels = []
|
||||
for l in [x for x in table.data.columns if not (x in seen or seen.add(x))]:
|
||||
if table.shapes[l] == (1,):
|
||||
labels.append(f'{l}')
|
||||
elif len(table.shapes[l]) == 1:
|
||||
labels += [f'{i+1}_{l}' \
|
||||
for i in range(table.shapes[l][0])]
|
||||
else:
|
||||
labels += [f'{util.srepr(table.shapes[l],"x")}:{i+1}_{l}' \
|
||||
for i in range(np.prod(table.shapes[l]))]
|
||||
|
||||
Parameters
|
||||
----------
|
||||
table : Table object
|
||||
Table to write.
|
||||
fname : file, str, or pathlib.Path
|
||||
Filename or file for writing.
|
||||
new_style : Boolean, optional
|
||||
Write table in new style, indicating header lines by comment sign ('#') only.
|
||||
header = ([f'{len(table.comments)+1} header'] + table.comments) if legacy else \
|
||||
[f'# {comment}' for comment in table.comments]
|
||||
|
||||
"""
|
||||
seen = set()
|
||||
labels = []
|
||||
for l in [x for x in table.data.columns if not (x in seen or seen.add(x))]:
|
||||
if table.shapes[l] == (1,):
|
||||
labels.append(f'{l}')
|
||||
elif len(table.shapes[l]) == 1:
|
||||
labels += [f'{i+1}_{l}' \
|
||||
for i in range(table.shapes[l][0])]
|
||||
else:
|
||||
labels += [f'{util.srepr(table.shapes[l],"x")}:{i+1}_{l}' \
|
||||
for i in range(np.prod(table.shapes[l]))]
|
||||
try:
|
||||
f = open(fname,'w')
|
||||
except TypeError:
|
||||
f = fname
|
||||
|
||||
header = [f'# {comment}' for comment in table.comments] if new_style else \
|
||||
[f'{len(table.comments)+1} header'] + table.comments
|
||||
|
||||
try:
|
||||
f = open(fname,'w')
|
||||
except TypeError:
|
||||
f = fname
|
||||
|
||||
for line in header + [' '.join(labels)]: f.write(line+'\n')
|
||||
table.data.to_csv(f,sep=' ',na_rep='nan',index=False,header=False)
|
||||
|
||||
if format.lower() == 'ascii':
|
||||
return _to_ASCII(self,fname,new_style)
|
||||
else:
|
||||
raise TypeError(f'Unknown format {format}.')
|
||||
for line in header + [' '.join(labels)]: f.write(line+'\n')
|
||||
table.data.to_csv(f,sep=' ',na_rep='nan',index=False,header=False)
|
||||
|
|
|
@ -228,7 +228,7 @@ class Test:
|
|||
|
||||
def copy_Base2Current(self,sourceDir,sourcefiles=[],targetfiles=[]):
|
||||
|
||||
source=os.path.normpath(os.path.join(self.dirBase,'../../..',sourceDir))
|
||||
source = os.path.normpath(os.path.join(self.dirBase,'../../..',sourceDir))
|
||||
if len(targetfiles) == 0: targetfiles = sourcefiles
|
||||
for i,f in enumerate(sourcefiles):
|
||||
try:
|
||||
|
@ -287,30 +287,30 @@ class Test:
|
|||
|
||||
import numpy as np
|
||||
logging.info('\n '.join(['comparing',File1,File2]))
|
||||
table = damask.Table.from_ASCII(File1)
|
||||
len1=len(table.comments)+2
|
||||
table = damask.Table.from_ASCII(File2)
|
||||
len2=len(table.comments)+2
|
||||
table = damask.Table.load_ASCII(File1)
|
||||
len1 = len(table.comments)+1
|
||||
table = damask.Table.load_ASCII(File2)
|
||||
len2 = len(table.comments)+1
|
||||
|
||||
refArray = np.nan_to_num(np.genfromtxt(File1,missing_values='n/a',skip_header = len1,autostrip=True))
|
||||
curArray = np.nan_to_num(np.genfromtxt(File2,missing_values='n/a',skip_header = len2,autostrip=True))
|
||||
|
||||
if len(curArray) == len(refArray):
|
||||
refArrayNonZero = refArray[refArray.nonzero()]
|
||||
curArray = curArray[refArray.nonzero()]
|
||||
max_err=np.max(abs(refArrayNonZero[curArray.nonzero()]/curArray[curArray.nonzero()]-1.))
|
||||
max_loc=np.argmax(abs(refArrayNonZero[curArray.nonzero()]/curArray[curArray.nonzero()]-1.))
|
||||
curArray = curArray[refArray.nonzero()]
|
||||
max_err = np. max(abs(refArrayNonZero[curArray.nonzero()]/curArray[curArray.nonzero()]-1.))
|
||||
max_loc = np.argmax(abs(refArrayNonZero[curArray.nonzero()]/curArray[curArray.nonzero()]-1.))
|
||||
refArrayNonZero = refArrayNonZero[curArray.nonzero()]
|
||||
curArray = curArray[curArray.nonzero()]
|
||||
curArray = curArray[curArray.nonzero()]
|
||||
print(f' ********\n * maximum relative error {max_err} between {refArrayNonZero[max_loc]} and {curArray[max_loc]}\n ********')
|
||||
return max_err
|
||||
else:
|
||||
raise Exception('mismatch in array size to compare')
|
||||
raise Exception(f'mismatch in array sizes ({len(refArray)} and {len(curArray)}) to compare')
|
||||
|
||||
|
||||
def compare_ArrayRefCur(self,ref,cur=''):
|
||||
|
||||
if cur =='': cur = ref
|
||||
if cur == '': cur = ref
|
||||
refName = self.fileInReference(ref)
|
||||
curName = self.fileInCurrent(cur)
|
||||
return self.compare_Array(refName,curName)
|
||||
|
@ -399,10 +399,8 @@ class Test:
|
|||
if any(norm[i]) == 0.0 or absTol[i]:
|
||||
norm[i] = [1.0 for j in range(line0-len(skipLines))]
|
||||
absTol[i] = True
|
||||
if perLine:
|
||||
logging.warning(f"At least one norm of \"{headings0[i]['label']}\" in first table is 0.0, using absolute tolerance")
|
||||
else:
|
||||
logging.warning(f"Maximum norm of \"{headings0[i]['label']}\" in first table is 0.0, using absolute tolerance")
|
||||
logging.warning(f'''{"At least one" if perLine else "Maximum"} norm of
|
||||
"{headings0[i]['label']}" in first table is 0.0, using absolute tolerance''')
|
||||
|
||||
line1 = 0
|
||||
while table1.data_read(): # read next data line of ASCII table
|
||||
|
@ -418,20 +416,18 @@ class Test:
|
|||
|
||||
logging.info(' ********')
|
||||
for i in range(dataLength):
|
||||
if absTol[i]:
|
||||
logging.info(f" * maximum absolute error {maxError[i]} between {headings0[i]['label']} and {headings1[i]['label']}")
|
||||
else:
|
||||
logging.info(f" * maximum relative error {maxError[i]} between {headings0[i]['label']} and {headings1[i]['label']}")
|
||||
logging.info(f''' * maximum {'absolute' if absTol[i] else 'relative'} error {maxError[i]}
|
||||
between {headings0[i]['label']} and {headings1[i]['label']}''')
|
||||
logging.info(' ********')
|
||||
return maxError
|
||||
|
||||
|
||||
def compare_TablesStatistically(self,
|
||||
files = [None,None], # list of file names
|
||||
columns = [None], # list of list of column labels (per file)
|
||||
meanTol = 1.0e-4,
|
||||
stdTol = 1.0e-6,
|
||||
preFilter = 1.0e-9):
|
||||
files = [None,None], # list of file names
|
||||
columns = [None], # list of list of column labels (per file)
|
||||
meanTol = 1.0e-4,
|
||||
stdTol = 1.0e-6,
|
||||
preFilter = 1.0e-9):
|
||||
"""
|
||||
Calculate statistics of tables.
|
||||
|
||||
|
@ -440,9 +436,9 @@ class Test:
|
|||
if not (isinstance(files, Iterable) and not isinstance(files, str)): # check whether list of files is requested
|
||||
files = [str(files)]
|
||||
|
||||
tables = [damask.Table.from_ASCII(filename) for filename in files]
|
||||
tables = [damask.Table.load_ASCII(filename) for filename in files]
|
||||
for table in tables:
|
||||
table._label_flat()
|
||||
table._label_discrete()
|
||||
|
||||
columns += [columns[0]]*(len(files)-len(columns)) # extend to same length as files
|
||||
columns = columns[:len(files)] # truncate to same length as files
|
||||
|
@ -462,7 +458,7 @@ class Test:
|
|||
|
||||
data = []
|
||||
for table,labels in zip(tables,columns):
|
||||
table._label_condensed()
|
||||
table._label_uniform()
|
||||
data.append(np.hstack(list(table.get(label) for label in labels)))
|
||||
|
||||
|
||||
|
@ -471,12 +467,11 @@ class Test:
|
|||
normBy = (np.abs(data[i]) + np.abs(data[i-1]))*0.5
|
||||
normedDelta = np.where(normBy>preFilter,delta/normBy,0.0)
|
||||
mean = np.amax(np.abs(np.mean(normedDelta,0)))
|
||||
std = np.amax(np.std(normedDelta,0))
|
||||
std = np.amax(np.std(normedDelta,0))
|
||||
logging.info(f'mean: {mean:f}')
|
||||
logging.info(f'std: {std:f}')
|
||||
|
||||
return (mean<meanTol) & (std < stdTol)
|
||||
|
||||
return (mean < meanTol) & (std < stdTol)
|
||||
|
||||
|
||||
def compare_Tables(self,
|
||||
|
@ -491,7 +486,7 @@ class Test:
|
|||
|
||||
if len(files) < 2: return True # single table is always close to itself...
|
||||
|
||||
tables = [damask.Table.from_ASCII(filename) for filename in files]
|
||||
tables = [damask.Table.load_ASCII(filename) for filename in files]
|
||||
|
||||
columns += [columns[0]]*(len(files)-len(columns)) # extend to same length as files
|
||||
columns = columns[:len(files)] # truncate to same length as files
|
||||
|
@ -580,7 +575,7 @@ class Test:
|
|||
|
||||
if culprit == 0:
|
||||
count = len(self.variants) if self.options.select is None else len(self.options.select)
|
||||
msg = 'Test passed.' if count == 1 else f'All {count} tests passed.'
|
||||
msg = ('Test passed.' if count == 1 else f'All {count} tests passed.') + '\a\a\a'
|
||||
elif culprit == -1:
|
||||
msg = 'Warning: could not start test...'
|
||||
ret = 0
|
||||
|
|
|
@ -118,7 +118,7 @@ class VTK:
|
|||
|
||||
|
||||
@staticmethod
|
||||
def from_file(fname,dataset_type=None):
|
||||
def load(fname,dataset_type=None):
|
||||
"""
|
||||
Create VTK from file.
|
||||
|
||||
|
@ -168,7 +168,7 @@ class VTK:
|
|||
def _write(writer):
|
||||
"""Wrapper for parallel writing."""
|
||||
writer.Write()
|
||||
def to_file(self,fname,parallel=True,compress=True):
|
||||
def save(self,fname,parallel=True,compress=True):
|
||||
"""
|
||||
Write to file.
|
||||
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"cells": [],
|
||||
"metadata": {},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
|
@ -0,0 +1,276 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import damask\n",
|
||||
"\n",
|
||||
"from pathlib import Path"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"orientations,rODF = damask.Rotation.from_ODF('hybridIA_ODF.txt',\n",
|
||||
" 2**14,\n",
|
||||
" degrees=True,\n",
|
||||
" reconstruct=True,\n",
|
||||
" fractions=True,\n",
|
||||
" seed=0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"VTK = damask.VTK.from_rectilinearGrid([36,36,36],[90,90,90])\n",
|
||||
"VTK.add(damask.Table.from_ASCII('hybridIA_ODF.txt').get('intensity'),'intensity')\n",
|
||||
"VTK.add(rODF.flatten(order='F'),'rODF')\n",
|
||||
"VTK.to_file('hybridIA_ODF.vtr')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Help on class VTK in module damask._vtk:\n",
|
||||
"\n",
|
||||
"class VTK(builtins.object)\n",
|
||||
" | VTK(geom)\n",
|
||||
" | \n",
|
||||
" | Spatial visualization (and potentially manipulation).\n",
|
||||
" | \n",
|
||||
" | High-level interface to VTK.\n",
|
||||
" | \n",
|
||||
" | Methods defined here:\n",
|
||||
" | \n",
|
||||
" | __init__(self, geom)\n",
|
||||
" | Set geometry and topology.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | geom : subclass of vtk.vtkDataSet\n",
|
||||
" | Description of geometry and topology. Valid types are vtk.vtkRectilinearGrid,\n",
|
||||
" | vtk.vtkUnstructuredGrid, or vtk.vtkPolyData.\n",
|
||||
" | \n",
|
||||
" | __repr__(self)\n",
|
||||
" | ASCII representation of the VTK data.\n",
|
||||
" | \n",
|
||||
" | add(self, data, label=None)\n",
|
||||
" | Add data to either cells or points.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | data : numpy.ndarray\n",
|
||||
" | Data to add. First dimension need to match either\n",
|
||||
" | number of cells or number of points\n",
|
||||
" | label : str\n",
|
||||
" | Data label.\n",
|
||||
" | \n",
|
||||
" | add_comments(self, comments)\n",
|
||||
" | Add Comments.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | comments : str or list of str\n",
|
||||
" | Comments to add.\n",
|
||||
" | \n",
|
||||
" | get(self, label)\n",
|
||||
" | Get either cell or point data.\n",
|
||||
" | \n",
|
||||
" | Cell data takes precedence over point data, i.e. this\n",
|
||||
" | function assumes that labels are unique among cell and\n",
|
||||
" | point data.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | label : str\n",
|
||||
" | Data label.\n",
|
||||
" | \n",
|
||||
" | get_comments(self)\n",
|
||||
" | Return the comments.\n",
|
||||
" | \n",
|
||||
" | set_comments(self, comments)\n",
|
||||
" | Set Comments.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | comments : str or list of str\n",
|
||||
" | Comments.\n",
|
||||
" | \n",
|
||||
" | show(self)\n",
|
||||
" | Render.\n",
|
||||
" | \n",
|
||||
" | See http://compilatrix.com/article/vtk-1 for further ideas.\n",
|
||||
" | \n",
|
||||
" | write(self, fname, parallel=True)\n",
|
||||
" | Write to file.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | fname : str or pathlib.Path\n",
|
||||
" | Filename for writing.\n",
|
||||
" | parallel : boolean, optional\n",
|
||||
" | Write data in parallel background process. Defaults to True.\n",
|
||||
" | \n",
|
||||
" | ----------------------------------------------------------------------\n",
|
||||
" | Static methods defined here:\n",
|
||||
" | \n",
|
||||
" | from_file(fname, dataset_type=None)\n",
|
||||
" | Create VTK from file.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | fname : str or pathlib.Path\n",
|
||||
" | Filename for reading. Valid extensions are .vtr, .vtu, .vtp, and .vtk.\n",
|
||||
" | dataset_type : str, optional\n",
|
||||
" | Name of the vtk.vtkDataSet subclass when opening an .vtk file. Valid types are vtkRectilinearGrid,\n",
|
||||
" | vtkUnstructuredGrid, and vtkPolyData.\n",
|
||||
" | \n",
|
||||
" | from_polyData(points)\n",
|
||||
" | Create VTK of type vtk.polyData.\n",
|
||||
" | \n",
|
||||
" | This is the common type for point-wise data.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | points : numpy.ndarray of shape (:,3)\n",
|
||||
" | Spatial position of the points.\n",
|
||||
" | \n",
|
||||
" | from_rectilinearGrid(grid, size, origin=array([0., 0., 0.]))\n",
|
||||
" | Create VTK of type vtk.vtkRectilinearGrid.\n",
|
||||
" | \n",
|
||||
" | This is the common type for results from the grid solver.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | grid : numpy.ndarray of shape (3) of np.dtype = int\n",
|
||||
" | Number of cells.\n",
|
||||
" | size : numpy.ndarray of shape (3)\n",
|
||||
" | Physical length.\n",
|
||||
" | origin : numpy.ndarray of shape (3), optional\n",
|
||||
" | Spatial origin.\n",
|
||||
" | \n",
|
||||
" | from_unstructuredGrid(nodes, connectivity, cell_type)\n",
|
||||
" | Create VTK of type vtk.vtkUnstructuredGrid.\n",
|
||||
" | \n",
|
||||
" | This is the common type for results from FEM solvers.\n",
|
||||
" | \n",
|
||||
" | Parameters\n",
|
||||
" | ----------\n",
|
||||
" | nodes : numpy.ndarray of shape (:,3)\n",
|
||||
" | Spatial position of the nodes.\n",
|
||||
" | connectivity : numpy.ndarray of np.dtype = int\n",
|
||||
" | Cell connectivity (0-based), first dimension determines #Cells, second dimension determines #Nodes/Cell.\n",
|
||||
" | cell_type : str\n",
|
||||
" | Name of the vtk.vtkCell subclass. Tested for TRIANGLE, QUAD, TETRA, and HEXAHEDRON.\n",
|
||||
" | \n",
|
||||
" | ----------------------------------------------------------------------\n",
|
||||
" | Data descriptors defined here:\n",
|
||||
" | \n",
|
||||
" | __dict__\n",
|
||||
" | dictionary for instance variables (if defined)\n",
|
||||
" | \n",
|
||||
" | __weakref__\n",
|
||||
" | list of weak references to the object (if defined)\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"help(damask.VTK)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"a,b=np.radians(([90,90],[45,45]))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([1.57079633, 1.57079633])"
|
||||
]
|
||||
},
|
||||
"execution_count": 19,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([0.78539816, 0.78539816])"
|
||||
]
|
||||
},
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"b"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
|
@ -75,41 +75,36 @@ class TestColormap:
|
|||
assert np.allclose(Colormap._xyz2msh(xyz),msh,atol=1.e-6,rtol=0)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('format',['ASCII','paraview','GOM','Gmsh'])
|
||||
@pytest.mark.parametrize('format',['ASCII','paraview','GOM','gmsh'])
|
||||
@pytest.mark.parametrize('model',['rgb','hsv','hsl','xyz','lab','msh'])
|
||||
def test_from_range(self,model,format,tmpdir):
|
||||
N = np.random.randint(2,256)
|
||||
c = Colormap.from_range(np.random.rand(3),np.random.rand(3),model=model,N=N)
|
||||
c.to_file(tmpdir/'color_out',format=format)
|
||||
c = Colormap.from_range(np.random.rand(3),np.random.rand(3),model=model,N=N) # noqa
|
||||
eval(f'c.save_{format}(tmpdir/"color_out")')
|
||||
|
||||
@pytest.mark.parametrize('format',['ASCII','paraview','GOM','Gmsh'])
|
||||
@pytest.mark.parametrize('format',['ASCII','paraview','GOM','gmsh'])
|
||||
@pytest.mark.parametrize('name',['strain','gnuplot','Greys','PRGn','viridis'])
|
||||
def test_from_predefined(self,name,format,tmpdir):
|
||||
N = np.random.randint(2,256)
|
||||
c = Colormap.from_predefined(name,N)
|
||||
c = Colormap.from_predefined(name,N) # noqa
|
||||
os.chdir(tmpdir)
|
||||
c.to_file(format=format)
|
||||
eval(f'c.save_{format}()')
|
||||
|
||||
@pytest.mark.parametrize('format,name',[('ASCII','test.txt'),
|
||||
('paraview','test.json'),
|
||||
('GOM','test.legend'),
|
||||
('Gmsh','test.msh')
|
||||
('gmsh','test.msh')
|
||||
])
|
||||
def test_write_filehandle(self,format,name,tmpdir):
|
||||
c = Colormap.from_predefined('Dark2')
|
||||
c = Colormap.from_predefined('Dark2') # noqa
|
||||
fname = tmpdir/name
|
||||
with open(fname,'w') as f:
|
||||
c.to_file(f,format=format)
|
||||
with open(fname,'w') as f: # noqa
|
||||
eval(f'c.save_{format}(f)')
|
||||
for i in range(10):
|
||||
if fname.exists(): return
|
||||
time.sleep(.5)
|
||||
assert False
|
||||
|
||||
def test_write_invalid_format(self):
|
||||
c = Colormap.from_predefined('Dark2')
|
||||
with pytest.raises(ValueError):
|
||||
c.to_file(format='invalid')
|
||||
|
||||
@pytest.mark.parametrize('model',['rgb','hsv','hsl','lab','invalid'])
|
||||
def test_invalid_color(self,model):
|
||||
with pytest.raises(ValueError):
|
||||
|
@ -119,13 +114,13 @@ class TestColormap:
|
|||
c_1 = Colormap.from_predefined('stress')
|
||||
c_2 = c_1.reversed()
|
||||
assert (not np.allclose(c_1.colors,c_2.colors)) and \
|
||||
np.allclose(c_1.colors,c_2.reversed().colors)
|
||||
np.allclose(c_1.colors,c_2.reversed().colors)
|
||||
|
||||
def test_invert(self):
|
||||
c_1 = Colormap.from_predefined('strain')
|
||||
c_2 = ~c_1
|
||||
assert (not np.allclose(c_1.colors,c_2.colors)) and \
|
||||
np.allclose(c_1.colors,(~c_2).colors)
|
||||
assert (not np.allclose(c_1.colors, c_2.colors)) and \
|
||||
np.allclose(c_1.colors,(~c_2).colors)
|
||||
|
||||
def test_add(self):
|
||||
c = Colormap.from_predefined('jet')
|
||||
|
@ -149,16 +144,16 @@ class TestColormap:
|
|||
@pytest.mark.parametrize('format,ext',[('ASCII','.txt'),
|
||||
('paraview','.json'),
|
||||
('GOM','.legend'),
|
||||
('Gmsh','.msh')
|
||||
('gmsh','.msh')
|
||||
])
|
||||
def test_compare_reference(self,format,ext,tmpdir,reference_dir,update):
|
||||
name = 'binary'
|
||||
c = Colormap.from_predefined(name)
|
||||
c = Colormap.from_predefined(name) # noqa
|
||||
if update:
|
||||
os.chdir(reference_dir)
|
||||
c.to_file(format=format)
|
||||
eval(f'c.save_{format}()')
|
||||
else:
|
||||
os.chdir(tmpdir)
|
||||
c.to_file(format=format)
|
||||
eval(f'c.save_{format}()')
|
||||
time.sleep(.5)
|
||||
assert filecmp.cmp(tmpdir/(name+ext),reference_dir/(name+ext))
|
||||
|
|
|
@ -63,31 +63,31 @@ class TestGeom:
|
|||
|
||||
|
||||
def test_write_read_str(self,default,tmpdir):
|
||||
default.to_file(str(tmpdir/'default.geom'),format='ASCII')
|
||||
new = Geom.from_file(str(tmpdir/'default.geom'))
|
||||
default.save_ASCII(str(tmpdir/'default.geom'))
|
||||
new = Geom.load_ASCII(str(tmpdir/'default.geom'))
|
||||
assert geom_equal(default,new)
|
||||
|
||||
def test_write_read_file(self,default,tmpdir):
|
||||
with open(tmpdir/'default.geom','w') as f:
|
||||
default.to_file(f,format='ASCII',pack=True)
|
||||
default.save_ASCII(f,pack=True)
|
||||
with open(tmpdir/'default.geom') as f:
|
||||
new = Geom.from_file(f)
|
||||
new = Geom.load_ASCII(f)
|
||||
assert geom_equal(default,new)
|
||||
|
||||
def test_write_as_ASCII(self,default,tmpdir):
|
||||
with open(tmpdir/'str.geom','w') as f:
|
||||
f.write(default.as_ASCII())
|
||||
with open(tmpdir/'str.geom') as f:
|
||||
new = Geom.from_file(f)
|
||||
new = Geom.load_ASCII(f)
|
||||
assert geom_equal(default,new)
|
||||
|
||||
def test_read_write_vtr(self,default,tmpdir):
|
||||
default.to_file(tmpdir/'default',format='vtr')
|
||||
default.save_vtr(tmpdir/'default')
|
||||
for _ in range(10):
|
||||
time.sleep(.2)
|
||||
if os.path.exists(tmpdir/'default.vtr'): break
|
||||
|
||||
new = Geom.from_vtr(tmpdir/'default.vtr')
|
||||
new = Geom.load_vtr(tmpdir/'default.vtr')
|
||||
assert geom_equal(new,default)
|
||||
|
||||
def test_invalid_geom(self,tmpdir):
|
||||
|
@ -95,22 +95,22 @@ class TestGeom:
|
|||
f.write('this is not a valid header')
|
||||
with open('invalid_file','r') as f:
|
||||
with pytest.raises(TypeError):
|
||||
Geom.from_file(f)
|
||||
Geom.load_ASCII(f)
|
||||
|
||||
def test_invalid_vtr(self,tmpdir):
|
||||
v = VTK.from_rectilinearGrid(np.random.randint(5,10,3)*2,np.random.random(3) + 1.0)
|
||||
v.to_file(tmpdir/'no_materialpoint.vtr')
|
||||
v.save(tmpdir/'no_materialpoint.vtr')
|
||||
for _ in range(10):
|
||||
time.sleep(.2)
|
||||
if os.path.exists(tmpdir/'no_materialpoint.vtr'): break
|
||||
with pytest.raises(ValueError):
|
||||
Geom.from_vtr(tmpdir/'no_materialpoint.vtr')
|
||||
Geom.load_vtr(tmpdir/'no_materialpoint.vtr')
|
||||
|
||||
|
||||
@pytest.mark.parametrize('pack',[True,False])
|
||||
def test_pack(self,default,tmpdir,pack):
|
||||
default.to_file(tmpdir/'default.geom',format='ASCII',pack=pack)
|
||||
new = Geom.from_file(tmpdir/'default.geom')
|
||||
default.save_ASCII(tmpdir/'default.geom',pack=pack)
|
||||
new = Geom.load_ASCII(tmpdir/'default.geom')
|
||||
assert geom_equal(new,default)
|
||||
|
||||
def test_invalid_combination(self,default):
|
||||
|
@ -139,10 +139,6 @@ class TestGeom:
|
|||
with pytest.raises(TypeError):
|
||||
default.set_homogenization(homogenization=0)
|
||||
|
||||
def test_invalid_write_format(self,default):
|
||||
with pytest.raises(TypeError):
|
||||
default.to_file(format='invalid')
|
||||
|
||||
@pytest.mark.parametrize('directions,reflect',[
|
||||
(['x'], False),
|
||||
(['x','y','z'],True),
|
||||
|
@ -154,8 +150,8 @@ class TestGeom:
|
|||
modified = default.mirror(directions,reflect)
|
||||
tag = f'directions={"-".join(directions)}_reflect={reflect}'
|
||||
reference = reference_dir/f'mirror_{tag}.geom'
|
||||
if update: modified.to_file(reference)
|
||||
assert geom_equal(Geom.from_file(reference),
|
||||
if update: modified.save_ASCII(reference)
|
||||
assert geom_equal(Geom.load_ASCII(reference),
|
||||
modified)
|
||||
|
||||
@pytest.mark.parametrize('directions',[(1,2,'y'),('a','b','x'),[1]])
|
||||
|
@ -175,8 +171,8 @@ class TestGeom:
|
|||
modified = default.flip(directions)
|
||||
tag = f'directions={"-".join(directions)}'
|
||||
reference = reference_dir/f'flip_{tag}.geom'
|
||||
if update: modified.to_file(reference)
|
||||
assert geom_equal(Geom.from_file(reference),
|
||||
if update: modified.save_ASCII(reference)
|
||||
assert geom_equal(Geom.load_ASCII(reference),
|
||||
modified)
|
||||
|
||||
def test_flip_invariant(self,default):
|
||||
|
@ -199,11 +195,11 @@ class TestGeom:
|
|||
current = default.clean(stencil,selection,periodic)
|
||||
reference = reference_dir/f'clean_{stencil}_{"+".join(map(str,[None] if selection is None else selection))}_{periodic}'
|
||||
if update and stencil > 1:
|
||||
current.to_file(reference,format='vtr')
|
||||
current.save_vtr(reference)
|
||||
for _ in range(10):
|
||||
time.sleep(.2)
|
||||
if os.path.exists(reference.with_suffix('.vtr')): break
|
||||
assert geom_equal(Geom.from_vtr(reference) if stencil > 1 else default,
|
||||
assert geom_equal(Geom.load_vtr(reference) if stencil > 1 else default,
|
||||
current
|
||||
)
|
||||
|
||||
|
@ -220,8 +216,8 @@ class TestGeom:
|
|||
modified = default.scale(grid)
|
||||
tag = f'grid={util.srepr(grid,"-")}'
|
||||
reference = reference_dir/f'scale_{tag}.geom'
|
||||
if update: modified.to_file(reference)
|
||||
assert geom_equal(Geom.from_file(reference),
|
||||
if update: modified.save_ASCII(reference)
|
||||
assert geom_equal(Geom.load_ASCII(reference),
|
||||
modified)
|
||||
|
||||
def test_renumber(self,default):
|
||||
|
@ -255,8 +251,8 @@ class TestGeom:
|
|||
modified = default.rotate(Rotation.from_Eulers(Eulers,degrees=True))
|
||||
tag = f'Eulers={util.srepr(Eulers,"-")}'
|
||||
reference = reference_dir/f'rotate_{tag}.geom'
|
||||
if update: modified.to_file(reference)
|
||||
assert geom_equal(Geom.from_file(reference),
|
||||
if update: modified.save_ASCII(reference)
|
||||
assert geom_equal(Geom.load_ASCII(reference),
|
||||
modified)
|
||||
|
||||
def test_canvas(self,default):
|
||||
|
|
|
@ -107,7 +107,7 @@ class TestOrientation:
|
|||
table = Table(eu,{'Eulers':(3,)})
|
||||
table = table.add('pos',coords)
|
||||
table.to_ASCII(reference)
|
||||
assert np.allclose(eu,Table.from_ASCII(reference).get('Eulers'))
|
||||
assert np.allclose(eu,Table.load_ASCII(reference).get('Eulers'))
|
||||
|
||||
@pytest.mark.parametrize('lattice',Lattice.lattices)
|
||||
def test_disorientation360(self,lattice):
|
||||
|
@ -129,4 +129,3 @@ class TestOrientation:
|
|||
eqs = [r for r in R_1.equivalent]
|
||||
R_2 = Orientation.from_average(eqs)
|
||||
assert np.allclose(R_1.rotation.quaternion,R_2.rotation.quaternion)
|
||||
|
||||
|
|
|
@ -339,7 +339,7 @@ class TestResult:
|
|||
@pytest.mark.parametrize('output',['F',[],['F','P']])
|
||||
def test_vtk(self,tmp_path,default,output):
|
||||
os.chdir(tmp_path)
|
||||
default.to_vtk(output)
|
||||
default.save_vtk(output)
|
||||
|
||||
def test_XDMF(self,tmp_path,single_phase):
|
||||
os.chdir(tmp_path)
|
||||
|
|
|
@ -35,50 +35,50 @@ class TestTable:
|
|||
|
||||
@pytest.mark.parametrize('mode',['str','path'])
|
||||
def test_write_read(self,default,tmpdir,mode):
|
||||
default.to_file(tmpdir/'default.txt')
|
||||
default.save_ASCII(tmpdir/'default.txt')
|
||||
if mode == 'path':
|
||||
new = Table.from_ASCII(tmpdir/'default.txt')
|
||||
new = Table.load_ASCII(tmpdir/'default.txt')
|
||||
elif mode == 'str':
|
||||
new = Table.from_ASCII(str(tmpdir/'default.txt'))
|
||||
new = Table.load_ASCII(str(tmpdir/'default.txt'))
|
||||
assert all(default.data==new.data) and default.shapes == new.shapes
|
||||
|
||||
def test_write_read_file(self,default,tmpdir):
|
||||
with open(tmpdir/'default.txt','w') as f:
|
||||
default.to_file(f)
|
||||
default.save_ASCII(f)
|
||||
with open(tmpdir/'default.txt') as f:
|
||||
new = Table.from_ASCII(f)
|
||||
new = Table.load_ASCII(f)
|
||||
assert all(default.data==new.data) and default.shapes == new.shapes
|
||||
|
||||
def test_write_read_new_style(self,default,tmpdir):
|
||||
with open(tmpdir/'new_style.txt','w') as f:
|
||||
default.to_file(f,new_style=True)
|
||||
with open(tmpdir/'new_style.txt') as f:
|
||||
new = Table.from_ASCII(f)
|
||||
def test_write_read_legacy_style(self,default,tmpdir):
|
||||
with open(tmpdir/'legacy.txt','w') as f:
|
||||
default.save_ASCII(f,legacy=True)
|
||||
with open(tmpdir/'legacy.txt') as f:
|
||||
new = Table.load_ASCII(f)
|
||||
assert all(default.data==new.data) and default.shapes == new.shapes
|
||||
|
||||
def test_write_invalid_format(self,default,tmpdir):
|
||||
with pytest.raises(TypeError):
|
||||
default.to_file(tmpdir/'shouldnotbethere.txt',format='invalid')
|
||||
default.save_ASCII(tmpdir/'shouldnotbethere.txt',format='invalid')
|
||||
|
||||
@pytest.mark.parametrize('mode',['str','path'])
|
||||
def test_read_ang(self,reference_dir,mode):
|
||||
if mode == 'path':
|
||||
new = Table.from_ang(reference_dir/'simple.ang')
|
||||
new = Table.load_ang(reference_dir/'simple.ang')
|
||||
elif mode == 'str':
|
||||
new = Table.from_ang(str(reference_dir/'simple.ang'))
|
||||
new = Table.load_ang(str(reference_dir/'simple.ang'))
|
||||
assert new.data.shape == (4,10) and \
|
||||
new.labels == ['eu', 'pos', 'IQ', 'CI', 'ID', 'intensity', 'fit']
|
||||
|
||||
def test_read_ang_file(self,reference_dir):
|
||||
f = open(reference_dir/'simple.ang')
|
||||
new = Table.from_ang(f)
|
||||
new = Table.load_ang(f)
|
||||
assert new.data.shape == (4,10) and \
|
||||
new.labels == ['eu', 'pos', 'IQ', 'CI', 'ID', 'intensity', 'fit']
|
||||
|
||||
@pytest.mark.parametrize('fname',['datatype-mix.txt','whitespace-mix.txt'])
|
||||
def test_read_strange(self,reference_dir,fname):
|
||||
with open(reference_dir/fname) as f:
|
||||
Table.from_ASCII(f)
|
||||
Table.load_ASCII(f)
|
||||
|
||||
def test_set(self,default):
|
||||
d = default.set('F',np.zeros((5,3,3)),'set to zero').get('F')
|
||||
|
@ -166,7 +166,7 @@ class TestTable:
|
|||
x = np.random.random((5,12))
|
||||
t = Table(x,{'F':(3,3),'v':(3,)},['random test data'])
|
||||
unsort = t.get('4_F')
|
||||
sort = t.sort_by('4_F').get('4_F')
|
||||
sort = t.sort_by('4_F').get('4_F')
|
||||
assert np.all(np.sort(unsort,0)==sort)
|
||||
|
||||
def test_sort_revert(self):
|
||||
|
@ -179,6 +179,6 @@ class TestTable:
|
|||
t = Table(np.array([[0,1,],[2,1,]]),
|
||||
{'v':(2,)},
|
||||
['test data'])\
|
||||
.add('s',np.array(['b','a']))\
|
||||
.sort_by('s')
|
||||
.add('s',np.array(['b','a']))\
|
||||
.sort_by('s')
|
||||
assert np.all(t.get('1_v') == np.array([2,0]).reshape(2,1))
|
||||
|
|
|
@ -32,22 +32,22 @@ class TestVTK:
|
|||
origin = np.random.random(3)
|
||||
v = VTK.from_rectilinearGrid(grid,size,origin)
|
||||
string = v.__repr__()
|
||||
v.to_file(tmp_path/'rectilinearGrid',False)
|
||||
vtr = VTK.from_file(tmp_path/'rectilinearGrid.vtr')
|
||||
v.save(tmp_path/'rectilinearGrid',False)
|
||||
vtr = VTK.load(tmp_path/'rectilinearGrid.vtr')
|
||||
with open(tmp_path/'rectilinearGrid.vtk','w') as f:
|
||||
f.write(string)
|
||||
vtk = VTK.from_file(tmp_path/'rectilinearGrid.vtk','VTK_rectilinearGrid')
|
||||
vtk = VTK.load(tmp_path/'rectilinearGrid.vtk','VTK_rectilinearGrid')
|
||||
assert(string == vtr.__repr__() == vtk.__repr__())
|
||||
|
||||
def test_polyData(self,tmp_path):
|
||||
points = np.random.rand(100,3)
|
||||
v = VTK.from_polyData(points)
|
||||
string = v.__repr__()
|
||||
v.to_file(tmp_path/'polyData',False)
|
||||
vtp = VTK.from_file(tmp_path/'polyData.vtp')
|
||||
v.save(tmp_path/'polyData',False)
|
||||
vtp = VTK.load(tmp_path/'polyData.vtp')
|
||||
with open(tmp_path/'polyData.vtk','w') as f:
|
||||
f.write(string)
|
||||
vtk = VTK.from_file(tmp_path/'polyData.vtk','polyData')
|
||||
vtk = VTK.load(tmp_path/'polyData.vtk','polyData')
|
||||
assert(string == vtp.__repr__() == vtk.__repr__())
|
||||
|
||||
@pytest.mark.parametrize('cell_type,n',[
|
||||
|
@ -62,11 +62,11 @@ class TestVTK:
|
|||
connectivity = np.random.choice(np.arange(n),n,False).reshape(-1,n)
|
||||
v = VTK.from_unstructuredGrid(nodes,connectivity,cell_type)
|
||||
string = v.__repr__()
|
||||
v.to_file(tmp_path/'unstructuredGrid',False)
|
||||
vtu = VTK.from_file(tmp_path/'unstructuredGrid.vtu')
|
||||
v.save(tmp_path/'unstructuredGrid',False)
|
||||
vtu = VTK.load(tmp_path/'unstructuredGrid.vtu')
|
||||
with open(tmp_path/'unstructuredGrid.vtk','w') as f:
|
||||
f.write(string)
|
||||
vtk = VTK.from_file(tmp_path/'unstructuredGrid.vtk','unstructuredgrid')
|
||||
vtk = VTK.load(tmp_path/'unstructuredGrid.vtk','unstructuredgrid')
|
||||
assert(string == vtu.__repr__() == vtk.__repr__())
|
||||
|
||||
|
||||
|
@ -75,8 +75,8 @@ class TestVTK:
|
|||
v = VTK.from_polyData(points)
|
||||
fname_s = tmp_path/'single.vtp'
|
||||
fname_p = tmp_path/'parallel.vtp'
|
||||
v.to_file(fname_s,False)
|
||||
v.to_file(fname_p,True)
|
||||
v.save(fname_s,False)
|
||||
v.save(fname_p,True)
|
||||
for i in range(10):
|
||||
if os.path.isfile(fname_p) and filecmp.cmp(fname_s,fname_p):
|
||||
assert(True)
|
||||
|
@ -90,11 +90,11 @@ class TestVTK:
|
|||
('this_file_does_not_exist.vtx', None)])
|
||||
def test_invalid_dataset_type(self,name,dataset_type):
|
||||
with pytest.raises(TypeError):
|
||||
VTK.from_file(name,dataset_type)
|
||||
VTK.load(name,dataset_type)
|
||||
|
||||
def test_invalid_extension_write(self,default):
|
||||
with pytest.raises(ValueError):
|
||||
default.to_file('default.txt')
|
||||
default.save('default.txt')
|
||||
|
||||
def test_invalid_get(self,default):
|
||||
with pytest.raises(ValueError):
|
||||
|
@ -115,8 +115,8 @@ class TestVTK:
|
|||
|
||||
def test_comments(self,tmp_path,default):
|
||||
default.add_comments(['this is a comment'])
|
||||
default.to_file(tmp_path/'with_comments',parallel=False)
|
||||
new = VTK.from_file(tmp_path/'with_comments.vtr')
|
||||
default.save(tmp_path/'with_comments',parallel=False)
|
||||
new = VTK.load(tmp_path/'with_comments.vtr')
|
||||
assert new.get_comments() == ['this is a comment']
|
||||
|
||||
def test_compare_reference_polyData(self,update,reference_dir,tmp_path):
|
||||
|
@ -124,9 +124,9 @@ class TestVTK:
|
|||
polyData = VTK.from_polyData(points)
|
||||
polyData.add(points,'coordinates')
|
||||
if update:
|
||||
polyData.to_file(reference_dir/'polyData')
|
||||
polyData.save(reference_dir/'polyData')
|
||||
else:
|
||||
reference = VTK.from_file(reference_dir/'polyData.vtp')
|
||||
reference = VTK.load(reference_dir/'polyData.vtp')
|
||||
assert polyData.__repr__() == reference.__repr__() and \
|
||||
np.allclose(polyData.get('coordinates'),points)
|
||||
|
||||
|
@ -139,8 +139,8 @@ class TestVTK:
|
|||
rectilinearGrid.add(c,'cell')
|
||||
rectilinearGrid.add(n,'node')
|
||||
if update:
|
||||
rectilinearGrid.to_file(reference_dir/'rectilinearGrid')
|
||||
rectilinearGrid.save(reference_dir/'rectilinearGrid')
|
||||
else:
|
||||
reference = VTK.from_file(reference_dir/'rectilinearGrid.vtr')
|
||||
reference = VTK.load(reference_dir/'rectilinearGrid.vtr')
|
||||
assert rectilinearGrid.__repr__() == reference.__repr__() and \
|
||||
np.allclose(rectilinearGrid.get('cell'),c)
|
||||
|
|
Loading…
Reference in New Issue