From f961f3590ceba01b2829b0dbfc49e1b67ef6b1ee Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 21 Mar 2020 17:53:59 +0100 Subject: [PATCH] tested bugfix: correct coordinates for periodic Laguerre performance: do not waste memory --- PRIVATE | 2 +- .../pre/geom_fromVoronoiTessellation.py | 27 ++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/PRIVATE b/PRIVATE index c8bf5cf4b..62bd5ede5 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit c8bf5cf4b4700cb9b9cd3db67a9148298598ba3f +Subproject commit 62bd5ede5260cd4e0e3d1c3930c474c1e045aeef diff --git a/processing/pre/geom_fromVoronoiTessellation.py b/processing/pre/geom_fromVoronoiTessellation.py index 4c4514e7c..fbf30ae00 100755 --- a/processing/pre/geom_fromVoronoiTessellation.py +++ b/processing/pre/geom_fromVoronoiTessellation.py @@ -4,6 +4,7 @@ import os import sys import multiprocessing from io import StringIO +from functools import partial from optparse import OptionParser,OptionGroup import numpy as np @@ -11,12 +12,9 @@ from scipy import spatial import damask -def findClosestSeed(fargs): - seeds, myWeights, point = fargs - tmp = np.repeat(point.reshape(3,1), len(seeds), axis=1).T - dist = np.sum((tmp - seeds)**2,axis=1) -myWeights - return np.argmin(dist) # seed point closest to point +def findClosestSeed(seeds, weights, point): + return np.argmin(np.sum((np.broadcast_to(point,(len(seeds),3))-seeds)**2,axis=1) - weights) scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) @@ -26,25 +24,22 @@ def Laguerre_tessellation(grid, seeds, grains, size, periodic, weights, cpus): if periodic: weights_p = np.tile(weights,27).flatten(order='F') # Laguerre weights (1,2,3,1,2,3,...,1,2,3) - seeds_p = np.vstack((seeds +np.array([size[0],0.,0.]),seeds, seeds +np.array([size[0],0.,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 -np.array([size[0],0.,0.]),seeds, seeds +np.array([size[0],0.,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]]))) else: weights_p = weights.flatten() seeds_p = seeds - arguments = [[seeds_p,weights_p,arg] for arg in list(grid)] - - if cpus > 1: # use multithreading + if cpus > 1: + default_args = partial(findClosestSeed,seeds_p,weights_p) pool = multiprocessing.Pool(processes = cpus) # initialize workers - result = pool.map_async(findClosestSeed, arguments) # evaluate function in parallel + result = pool.map_async(default_args, [point for point in grid]) # evaluate function in parallel pool.close() pool.join() closestSeeds = np.array(result.get()).flatten() else: - closestSeeds = np.zeros(len(arguments),dtype='i') - for i,arg in enumerate(arguments): - closestSeeds[i] = findClosestSeed(arg) + closestSeeds= np.array([findClosestSeed(seeds_p,weights_p,point) for point in grid]) return grains[closestSeeds%seeds.shape[0]] @@ -53,6 +48,7 @@ def Voronoi_tessellation(grid, seeds, grains, size, periodic = True): KDTree = spatial.cKDTree(seeds,boxsize=size) if periodic else spatial.cKDTree(seeds) devNull,closestSeeds = KDTree.query(grid) + return grains[closestSeeds] @@ -185,7 +181,6 @@ for name in filenames: if options.size: size = np.array(options.size) if options.origin: origin = np.array(options.origin) - seeds = table.get(options.pos) grains = table.get(options.microstructure) if options.microstructure in table.labels else np.arange(len(seeds))+1