grain circumference identification

fixed right most path selection criteria for grain circumference
This commit is contained in:
Aritra Chakraborty 2016-09-26 16:30:50 -04:00
parent 9f08258e05
commit 1d06e82700
1 changed files with 10 additions and 13 deletions

View File

@ -270,7 +270,6 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn):
myWalk = point['segments'].pop() myWalk = point['segments'].pop()
grainLegs = [myWalk] grainLegs = [myWalk]
myEnd = segments[myWalk][1 if segments[myWalk][0] == myStart else 0] myEnd = segments[myWalk][1 if segments[myWalk][0] == myStart else 0]
while (myEnd != pointId): while (myEnd != pointId):
myV = [points[myEnd]['coords'][0]-points[myStart]['coords'][0], myV = [points[myEnd]['coords'][0]-points[myStart]['coords'][0],
points[myEnd]['coords'][1]-points[myStart]['coords'][1]] points[myEnd]['coords'][1]-points[myStart]['coords'][1]]
@ -281,13 +280,13 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn):
if peek == myWalk: if peek == myWalk:
continue # do not go back same path continue # do not go back same path
peekEnd = segments[peek][1 if segments[peek][0] == myEnd else 0] peekEnd = segments[peek][1 if segments[peek][0] == myEnd else 0]
peekV = [points[myEnd]['coords'][0]-points[peekEnd]['coords'][0], peekV = [points[peekEnd]['coords'][0]-points[myEnd]['coords'][0],
points[myEnd]['coords'][1]-points[peekEnd]['coords'][1]] points[peekEnd]['coords'][1]-points[myEnd]['coords'][1]]
peekLen = math.sqrt(peekV[0]**2+peekV[1]**2) peekLen = math.sqrt(peekV[0]**2+peekV[1]**2)
if peekLen == 0.0: damask.util.croak('peeklen is zero: peek point {}'.format(peek)) if peekLen == 0.0: damask.util.croak('peeklen is zero: peek point {}'.format(peek))
crossproduct = (myV[0]*peekV[1] - myV[1]*peekV[0])/myLen/peekLen crossproduct = (myV[0]*peekV[1] - myV[1]*peekV[0])/myLen/peekLen
dotproduct = (myV[0]*peekV[0] + myV[1]*peekV[1])/myLen/peekLen dotproduct = (myV[0]*peekV[0] + myV[1]*peekV[1])/myLen/peekLen
innerAngle = crossproduct*(dotproduct+1.0) innerAngle = math.copysign(1.0,crossproduct)*(dotproduct-1.0)
if innerAngle >= best['product']: # takes sharpest left turn if innerAngle >= best['product']: # takes sharpest left turn
best['product'] = innerAngle best['product'] = innerAngle
best['peek'] = peek best['peek'] = peek
@ -301,7 +300,7 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn):
if myWalk in points[myStart]['segments']: if myWalk in points[myStart]['segments']:
points[myStart]['segments'].remove(myWalk) points[myStart]['segments'].remove(myWalk)
else: else:
damask.utilcroak('{} not in segments of point {}'.format(myWalk,myStart)) damask.util.croak('{} not in segments of point {}'.format(myWalk,myStart))
grainDraw.append(points[myStart]['coords']) grainDraw.append(points[myStart]['coords'])
grainLegs.append(myWalk) grainLegs.append(myWalk)
@ -311,7 +310,6 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn):
else: else:
grains['box'] = grainLegs grains['box'] = grainLegs
# build overall data structure # build overall data structure
rcData = {'dimension':[dX,dY], rcData = {'dimension':[dX,dY],
@ -772,8 +770,8 @@ def fftbuild(rcData,height,xframe,yframe,resolution,extrusion):
'dimension':(xsize,ysize,zsize)} 'dimension':(xsize,ysize,zsize)}
frameindex=len(rcData['grain'])+1 # calculate frame index as largest grain index plus one frameindex=len(rcData['grain'])+1 # calculate frame index as largest grain index plus one
dx = xsize/(xres+1) # calculate step sizes dx = xsize/(xres) # calculate step sizes
dy = ysize/(yres+1) dy = ysize/(yres)
grainpoints = [] grainpoints = []
for segments in rcData['grain']: # get segments of each grain for segments in rcData['grain']: # get segments of each grain
@ -788,11 +786,10 @@ def fftbuild(rcData,height,xframe,yframe,resolution,extrusion):
grainpoints.append([]) # start out blank for current grain grainpoints.append([]) # start out blank for current grain
for p in sorted(points, key=points.get): # loop thru set of sorted points for p in sorted(points, key=points.get): # loop thru set of sorted points
grainpoints[-1].append([rcData['point'][p][0],rcData['point'][p][1]]) # append x,y of point grainpoints[-1].append([rcData['point'][p][0],rcData['point'][p][1]]) # append x,y of point
bestGuess = 0 # assume grain 0 as best guess bestGuess = 0 # assume grain 0 as best guess
for i in range(int(xres*yres)): # walk through all points in xy plane for i in range(int(xres*yres)): # walk through all points in xy plane
xtest = -xframe+((i%xres)+0.5)*dx # calculate coordinates xtest = -xframe+((i%xres)+0.5)*dx # calculate coordinates
ytest = -yframe+(int(i/xres)+0.5)*dy ytest = -yframe+((i//xres)+0.5)*dy
if(xtest < 0 or xtest > maxX): # check wether part of frame if(xtest < 0 or xtest > maxX): # check wether part of frame
if( ytest < 0 or ytest > maxY): # part of edges if( ytest < 0 or ytest > maxY): # part of edges
fftdata['fftpoints'].append(frameindex+2) # append frameindex to result array fftdata['fftpoints'].append(frameindex+2) # append frameindex to result array
@ -944,8 +941,8 @@ if 'spectral' in options.output:
geomFile = open(myName+'_'+str(int(fftdata['resolution'][0]))+'.geom','w') # open geom file for writing geomFile = open(myName+'_'+str(int(fftdata['resolution'][0]))+'.geom','w') # open geom file for writing
geomFile.write('3\theader\n') # write header info geomFile.write('3\theader\n') # write header info
geomFile.write('resolution a %i b %i c %i\n'%(fftdata['resolution'])) # resolution geomFile.write('grid a %i b %i c %i\n'%(fftdata['resolution'])) # grid resolution
geomFile.write('dimension x %f y %f z %f\n'%(fftdata['dimension'])) # size geomFile.write('size x %f y %f z %f\n'%(fftdata['dimension'])) # size
geomFile.write('homogenization 1\n') # homogenization geomFile.write('homogenization 1\n') # homogenization
for z in xrange(fftdata['resolution'][2]): # z repetions for z in xrange(fftdata['resolution'][2]): # z repetions
for y in xrange(fftdata['resolution'][1]): # each x-row separately for y in xrange(fftdata['resolution'][1]): # each x-row separately