python 3 compatible and modernized
This commit is contained in:
parent
99dc75c2fd
commit
6d9d25ea43
|
@ -13,7 +13,7 @@ scriptID = ' '.join([scriptName,damask.version])
|
||||||
try: # check for Python Image Lib
|
try: # check for Python Image Lib
|
||||||
from PIL import Image,ImageDraw
|
from PIL import Image,ImageDraw
|
||||||
ImageCapability = True
|
ImageCapability = True
|
||||||
except:
|
except ImportError:
|
||||||
ImageCapability = False
|
ImageCapability = False
|
||||||
|
|
||||||
sys.path.append(damask.solver.Marc().libraryPath())
|
sys.path.append(damask.solver.Marc().libraryPath())
|
||||||
|
@ -21,7 +21,7 @@ sys.path.append(damask.solver.Marc().libraryPath())
|
||||||
try: # check for MSC.Mentat Python interface
|
try: # check for MSC.Mentat Python interface
|
||||||
import py_mentat
|
import py_mentat
|
||||||
MentatCapability = True
|
MentatCapability = True
|
||||||
except:
|
except ImportError:
|
||||||
MentatCapability = False
|
MentatCapability = False
|
||||||
|
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn):
|
||||||
else:
|
else:
|
||||||
myNeighbors[grainNeighbors[leg][side]] = 1
|
myNeighbors[grainNeighbors[leg][side]] = 1
|
||||||
if myNeighbors: # do I have any neighbors (i.e., non-bounding box segment)
|
if myNeighbors: # do I have any neighbors (i.e., non-bounding box segment)
|
||||||
candidateGrains = sorted(myNeighbors.items(), key=lambda (k,v): (v,k), reverse=True) # sort grain counting
|
candidateGrains = sorted(myNeighbors.iteritems(), key=lambda p: (p[1],p[0]), reverse=True) # sort grain counting
|
||||||
# most frequent one not yet seen?
|
# most frequent one not yet seen?
|
||||||
rcData['grainMapping'].append(candidateGrains[0 if candidateGrains[0][0] not in rcData['grainMapping'] else 1][0]) # must be me then
|
rcData['grainMapping'].append(candidateGrains[0 if candidateGrains[0][0] not in rcData['grainMapping'] else 1][0]) # must be me then
|
||||||
# special case of bi-crystal situation...
|
# special case of bi-crystal situation...
|
||||||
|
@ -647,7 +647,6 @@ def job(grainNumber,grainMapping,twoD):
|
||||||
"*job_param univ_gas_const 8.314472",
|
"*job_param univ_gas_const 8.314472",
|
||||||
"*job_param planck_radiation_2 1.4387752e-2",
|
"*job_param planck_radiation_2 1.4387752e-2",
|
||||||
"*job_param speed_light_vacuum 299792458",
|
"*job_param speed_light_vacuum 299792458",
|
||||||
# "*job_usersub_file /san/%s/FEM/DAMASK/code/mpie_cpfem_marc2010.f90 | subroutine definition"%(pwd.getpwuid(os.geteuid())[0].rpartition("\\")[2]),
|
|
||||||
"*job_option user_source:compile_save",
|
"*job_option user_source:compile_save",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -750,7 +749,7 @@ def inside(x,y,points):
|
||||||
return inside
|
return inside
|
||||||
|
|
||||||
# -------------------------
|
# -------------------------
|
||||||
def fftbuild(rcData,height,xframe,yframe,resolution,extrusion):
|
def fftbuild(rcData,height,xframe,yframe,grid,extrusion):
|
||||||
"""Build array of grain numbers"""
|
"""Build array of grain numbers"""
|
||||||
maxX = -1.*sys.maxint
|
maxX = -1.*sys.maxint
|
||||||
maxY = -1.*sys.maxint
|
maxY = -1.*sys.maxint
|
||||||
|
@ -760,14 +759,14 @@ def fftbuild(rcData,height,xframe,yframe,resolution,extrusion):
|
||||||
maxY = max(maxY, y)
|
maxY = max(maxY, y)
|
||||||
xsize = maxX+2*xframe # add framsize
|
xsize = maxX+2*xframe # add framsize
|
||||||
ysize = maxY+2*yframe
|
ysize = maxY+2*yframe
|
||||||
xres = int(round(resolution/2.0)*2) # use only even resolution
|
xres = int(grid)
|
||||||
yres = int(round(xres/xsize*ysize/2.0)*2) # calculate other resolutions
|
yres = int(xres/xsize*ysize)
|
||||||
zres = extrusion
|
zres = extrusion
|
||||||
zsize = extrusion*min([xsize/xres,ysize/yres])
|
zsize = extrusion*min([xsize/xres,ysize/yres])
|
||||||
|
|
||||||
fftdata = {'fftpoints':[], \
|
fftdata = {'fftpoints':[], \
|
||||||
'resolution':(xres,yres,zres), \
|
'grid':(xres,yres,zres), \
|
||||||
'dimension':(xsize,ysize,zsize)}
|
'size':(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) # calculate step sizes
|
dx = xsize/(xres) # calculate step sizes
|
||||||
|
@ -841,8 +840,8 @@ parser.add_option('-x', '--xmargin', type='float', metavar = 'float',
|
||||||
dest='xmargin',help='margin in x in units of patch size [%default]')
|
dest='xmargin',help='margin in x in units of patch size [%default]')
|
||||||
parser.add_option('-y', '--ymargin', type='float', metavar = 'float',
|
parser.add_option('-y', '--ymargin', type='float', metavar = 'float',
|
||||||
dest='ymargin', help='margin in y in units of patch size [%default]')
|
dest='ymargin', help='margin in y in units of patch size [%default]')
|
||||||
parser.add_option('-r', '--resolution', type='int', metavar = 'int',
|
parser.add_option('-g', '--grid', type='int', metavar = 'int',
|
||||||
dest='resolution',help='number of Fourier points/Finite Elements across patch size + x_margin [%default]')
|
dest='grid',help='number of Fourier points/Finite Elements across patch size + x_margin [%default]')
|
||||||
parser.add_option('-z', '--extrusion', type='int', metavar = 'int',
|
parser.add_option('-z', '--extrusion', type='int', metavar = 'int',
|
||||||
dest='extrusion', help='number of repetitions in z-direction [%default]')
|
dest='extrusion', help='number of repetitions in z-direction [%default]')
|
||||||
parser.add_option('-i', '--imagesize', type='int', metavar = 'int',
|
parser.add_option('-i', '--imagesize', type='int', metavar = 'int',
|
||||||
|
@ -861,7 +860,7 @@ parser.set_defaults(output = [],
|
||||||
port = 40007,
|
port = 40007,
|
||||||
xmargin = 0.0,
|
xmargin = 0.0,
|
||||||
ymargin = 0.0,
|
ymargin = 0.0,
|
||||||
resolution = 64,
|
grid = 64,
|
||||||
extrusion = 2,
|
extrusion = 2,
|
||||||
imgsize = 512,
|
imgsize = 512,
|
||||||
M = (0.0,1.0,1.0,0.0), # M_11, M_12, M_21, M_22. x,y in RCB is y,x of Eulers!!
|
M = (0.0,1.0,1.0,0.0), # M_11, M_12, M_21, M_22. x,y in RCB is y,x of Eulers!!
|
||||||
|
@ -903,14 +902,14 @@ rcData = rcbParser(boundarySegments,options.M,options.size,options.tolerance,opt
|
||||||
Minv = np.linalg.inv(np.array(options.M).reshape(2,2))
|
Minv = np.linalg.inv(np.array(options.M).reshape(2,2))
|
||||||
|
|
||||||
if 'rcb' in options.output:
|
if 'rcb' in options.output:
|
||||||
print """# Header:
|
print('# Header:\n'+
|
||||||
#
|
'# \n'+
|
||||||
# Column 1-3: right hand average orientation (phi1, PHI, phi2 in radians)
|
'# Column 1-3: right hand average orientation (phi1, PHI, phi2 in radians)\n'+
|
||||||
# Column 4-6: left hand average orientation (phi1, PHI, phi2 in radians)
|
'# Column 4-6: left hand average orientation (phi1, PHI, phi2 in radians)\n'+
|
||||||
# Column 7: length (in microns)
|
'# Column 7: length (in microns)\n'+
|
||||||
# Column 8: trace angle (in degrees)
|
'# Column 8: trace angle (in degrees)\n'+
|
||||||
# Column 9-12: x,y coordinates of endpoints (in microns)
|
'# Column 9-12: x,y coordinates of endpoints (in microns)\n'+
|
||||||
# Column 13-14: IDs of right hand and left hand grains"""
|
'# Column 13-14: IDs of right hand and left hand grains')
|
||||||
for i,(left,right) in enumerate(rcData['neighbors']):
|
for i,(left,right) in enumerate(rcData['neighbors']):
|
||||||
if rcData['segment'][i]:
|
if rcData['segment'][i]:
|
||||||
first = np.dot(Minv,np.array([rcData['bounds'][0][0]+rcData['point'][rcData['segment'][i][0]][0]/rcData['scale'],
|
first = np.dot(Minv,np.array([rcData['bounds'][0][0]+rcData['point'][rcData['segment'][i][0]][0]/rcData['scale'],
|
||||||
|
@ -919,12 +918,12 @@ if 'rcb' in options.output:
|
||||||
second = np.dot(Minv,np.array([rcData['bounds'][0][0]+rcData['point'][rcData['segment'][i][1]][0]/rcData['scale'],
|
second = np.dot(Minv,np.array([rcData['bounds'][0][0]+rcData['point'][rcData['segment'][i][1]][0]/rcData['scale'],
|
||||||
rcData['bounds'][0][1]+rcData['point'][rcData['segment'][i][1]][1]/rcData['scale'],
|
rcData['bounds'][0][1]+rcData['point'][rcData['segment'][i][1]][1]/rcData['scale'],
|
||||||
]))
|
]))
|
||||||
print ' '.join(map(str,orientationData[left-1]+orientationData[right-1])),
|
print(' '.join(map(str,orientationData[left-1]+orientationData[right-1]))+
|
||||||
print np.linalg.norm(first-second),
|
str(np.linalg.norm(first-second))+
|
||||||
print '0',
|
'0'+
|
||||||
print ' '.join(map(str,first)),
|
' '.join(map(str,first))+
|
||||||
print ' '.join(map(str,second)),
|
' '.join(map(str,second))+
|
||||||
print ' '.join(map(str,[left,right]))
|
' '.join(map(str,[left,right])))
|
||||||
|
|
||||||
# ----- write image -----
|
# ----- write image -----
|
||||||
|
|
||||||
|
@ -934,28 +933,67 @@ if 'image' in options.output and options.imgsize > 0:
|
||||||
else:
|
else:
|
||||||
damask.util.croak('...no image drawing possible (PIL missing)...')
|
damask.util.croak('...no image drawing possible (PIL missing)...')
|
||||||
|
|
||||||
|
# ----- generate material.config -----
|
||||||
|
|
||||||
|
if any(output in options.output for output in ['spectral','mentat']):
|
||||||
|
config = []
|
||||||
|
config.append('<microstructure>')
|
||||||
|
|
||||||
|
for i,grain in enumerate(rcData['grainMapping']):
|
||||||
|
config+=['[grain{}]'.format(grain),
|
||||||
|
'crystallite\t1',
|
||||||
|
'(constituent)\tphase 1\ttexture {}\tfraction 1.0'.format(i+1)]
|
||||||
|
if (options.xmargin > 0.0):
|
||||||
|
config+=['[x-margin]',
|
||||||
|
'crystallite\t1',
|
||||||
|
'(constituent)\tphase 2\ttexture {}\tfraction 1.0\n'.format(len(rcData['grainMapping'])+1)]
|
||||||
|
if (options.ymargin > 0.0):
|
||||||
|
config+=['[y-margin]',
|
||||||
|
'crystallite\t1',
|
||||||
|
'(constituent)\tphase 2\ttexture {}\tfraction 1.0\n'.format(len(rcData['grainMapping'])+1)]
|
||||||
|
if (options.xmargin > 0.0 and options.ymargin > 0.0):
|
||||||
|
config+=['[xy-margin]',
|
||||||
|
'crystallite\t1',
|
||||||
|
'(constituent)\tphase 2\ttexture {}\tfraction 1.0\n'.format(len(rcData['grainMapping'])+1)]
|
||||||
|
|
||||||
|
if (options.xmargin > 0.0 or options.ymargin > 0.0):
|
||||||
|
config.append('[margin]')
|
||||||
|
|
||||||
|
config.append('<texture>')
|
||||||
|
for grain in rcData['grainMapping']:
|
||||||
|
config+=['[grain{}]'.format(grain),
|
||||||
|
'(gauss)\tphi1\t%f\tphi\t%f\tphi2\t%f\tscatter\t%f\tfraction\t1.0'\
|
||||||
|
%(math.degrees(orientationData[grain-1][0]),math.degrees(orientationData[grain-1][1]),\
|
||||||
|
math.degrees(orientationData[grain-1][2]),options.scatter)]
|
||||||
|
if (options.xmargin > 0.0 or options.ymargin > 0.0):
|
||||||
|
config+=['[margin]',
|
||||||
|
'(random)\t\tscatter\t0.0\tfraction\t1.0']
|
||||||
|
|
||||||
# ----- write spectral geom -----
|
# ----- write spectral geom -----
|
||||||
|
|
||||||
if 'spectral' in options.output:
|
if 'spectral' in options.output:
|
||||||
fftdata = fftbuild(rcData, options.size, options.xmargin, options.ymargin, options.resolution, options.extrusion)
|
fftdata = fftbuild(rcData, options.size, options.xmargin, options.ymargin, options.grid, options.extrusion)
|
||||||
|
|
||||||
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('grid a %i b %i c %i\n'%(fftdata['resolution'])) # grid resolution
|
|
||||||
geomFile.write('size x %f y %f z %f\n'%(fftdata['dimension'])) # size
|
|
||||||
geomFile.write('homogenization 1\n') # homogenization
|
|
||||||
for z in xrange(fftdata['resolution'][2]): # z repetions
|
|
||||||
for y in xrange(fftdata['resolution'][1]): # each x-row separately
|
|
||||||
geomFile.write('\t'.join(map(str,fftdata['fftpoints'][ y *fftdata['resolution'][0]:
|
|
||||||
(y+1)*fftdata['resolution'][0]]))+'\n') # grain indexes, x-row per line
|
|
||||||
geomFile.close() # close geom file
|
|
||||||
|
|
||||||
damask.util.croak('assigned {} out of {} (2D) Fourier points...'
|
|
||||||
.format(len(fftdata['fftpoints']),
|
|
||||||
int(fftdata['resolution'][0])*int(fftdata['resolution'][1])))
|
|
||||||
|
|
||||||
|
table = damask.ASCIItable(outname = myName+'_'+str(int(fftdata['grid'][0]))+'.geom',
|
||||||
|
labeled = False,
|
||||||
|
buffered = False)
|
||||||
|
table.labels_clear()
|
||||||
|
table.info_clear()
|
||||||
|
table.info_append([
|
||||||
|
scriptID + ' ' + ' '.join(sys.argv[1:]),
|
||||||
|
"grid\ta {grid[0]}\tb {grid[1]}\tc {grid[2]}".format(grid=fftdata['grid']),
|
||||||
|
"size\tx {size[0]}\ty {size[1]}\tz {size[2]}".format(size=fftdata['size']),
|
||||||
|
"homogenization\t1",
|
||||||
|
])
|
||||||
|
table.info_append(config)
|
||||||
|
table.head_write()
|
||||||
|
|
||||||
|
table.data = np.array(fftdata['fftpoints']*options.extrusion).\
|
||||||
|
reshape(fftdata['grid'][1]*fftdata['grid'][2],fftdata['grid'][0])
|
||||||
|
formatwidth = 1+int(math.log10(np.max(table.data)))
|
||||||
|
table.data_writeArray('%%%ii'%(formatwidth),delimiter=' ')
|
||||||
|
table.close()
|
||||||
|
|
||||||
# ----- write Mentat procedure -----
|
|
||||||
|
|
||||||
if 'mentat' in options.output:
|
if 'mentat' in options.output:
|
||||||
if MentatCapability:
|
if MentatCapability:
|
||||||
|
@ -964,19 +1002,19 @@ if 'mentat' in options.output:
|
||||||
|
|
||||||
cmds = [\
|
cmds = [\
|
||||||
init(),
|
init(),
|
||||||
sample(options.size,rcData['dimension'][1]/rcData['dimension'][0],12,options.xmargin,options.ymargin),
|
sample(options.size,rcData['dimension'][1]/rcData['size'][0],12,options.xmargin,options.ymargin),
|
||||||
patch(options.size,options.resolution,options.mesh,rcData),
|
patch(options.size,options.grid,options.mesh,rcData),
|
||||||
gage(options.mesh,rcData),
|
gage(options.mesh,rcData),
|
||||||
]
|
]
|
||||||
|
|
||||||
if not options.twoD:
|
if not options.twoD:
|
||||||
cmds += [expand3D(options.size*(1.0+2.0*options.xmargin)/options.resolution*options.extrusion,options.extrusion),]
|
cmds += [expand3D(options.size*(1.0+2.0*options.xmargin)/options.grid*options.extrusion,options.extrusion),]
|
||||||
|
|
||||||
cmds += [\
|
cmds += [\
|
||||||
cleanUp(options.size),
|
cleanUp(options.size),
|
||||||
materials(),
|
materials(),
|
||||||
initial_conditions(len(rcData['grain']),rcData['grainMapping']),
|
initial_conditions(len(rcData['grain']),rcData['grainMapping']),
|
||||||
boundary_conditions(options.strainrate,options.size*(1.0+2.0*options.xmargin)/options.resolution*options.extrusion,\
|
boundary_conditions(options.strainrate,options.size*(1.0+2.0*options.xmargin)/options.grid*options.extrusion,\
|
||||||
options.size,rcData['dimension'][1]/rcData['dimension'][0],options.xmargin,options.ymargin),
|
options.size,rcData['dimension'][1]/rcData['dimension'][0],options.xmargin,options.ymargin),
|
||||||
loadcase(options.strain/options.strainrate,options.increments,0.01),
|
loadcase(options.strain/options.strainrate,options.increments,0.01),
|
||||||
job(len(rcData['grain']),rcData['grainMapping'],options.twoD),
|
job(len(rcData['grain']),rcData['grainMapping'],options.twoD),
|
||||||
|
@ -996,51 +1034,5 @@ if 'mentat' in options.output:
|
||||||
else:
|
else:
|
||||||
damask.util.croak('...no interaction with Mentat possible...')
|
damask.util.croak('...no interaction with Mentat possible...')
|
||||||
|
|
||||||
|
with open(myName+'.config','w') as configFile:
|
||||||
# ----- write config data to file -----
|
configFile.write('\n'.join(config))
|
||||||
|
|
||||||
if 'mentat' in options.output or 'spectral' in options.output:
|
|
||||||
output = ''
|
|
||||||
output += '\n\n<homogenization>\n' + \
|
|
||||||
'\n[SX]\n' + \
|
|
||||||
'type\tisostrain\n' + \
|
|
||||||
'Ngrains\t1\n' + \
|
|
||||||
'\n\n<microstructure>\n'
|
|
||||||
|
|
||||||
for i,grain in enumerate(rcData['grainMapping']):
|
|
||||||
output += '\n[grain %i]\n'%grain + \
|
|
||||||
'crystallite\t1\n' + \
|
|
||||||
'(constituent)\tphase 1\ttexture %i\tfraction 1.0\n'%(i+1)
|
|
||||||
if (options.xmargin > 0.0):
|
|
||||||
output += '\n[x-margin]\n' + \
|
|
||||||
'crystallite\t1\n' + \
|
|
||||||
'(constituent)\tphase 2\ttexture %i\tfraction 1.0\n'%(len(rcData['grainMapping'])+1)
|
|
||||||
if (options.ymargin > 0.0):
|
|
||||||
output += '\n[y-margin]\n' + \
|
|
||||||
'crystallite\t1\n' + \
|
|
||||||
'(constituent)\tphase 2\ttexture %i\tfraction 1.0\n'%(len(rcData['grainMapping'])+1)
|
|
||||||
if (options.xmargin > 0.0 and options.ymargin > 0.0):
|
|
||||||
output += '\n[margin edge]\n' + \
|
|
||||||
'crystallite\t1\n' + \
|
|
||||||
'(constituent)\tphase 2\ttexture %i\tfraction 1.0\n'%(len(rcData['grainMapping'])+1)
|
|
||||||
|
|
||||||
output += '\n\n<crystallite>\n' + \
|
|
||||||
'\n[fillMeIn]\n' + \
|
|
||||||
'\n\n<phase>\n' + \
|
|
||||||
'\n[patch]\n'
|
|
||||||
if (options.xmargin > 0.0 or options.ymargin > 0.0):
|
|
||||||
output += '\n[margin]\n'
|
|
||||||
|
|
||||||
output += '\n\n<texture>\n\n'
|
|
||||||
for grain in rcData['grainMapping']:
|
|
||||||
output += '\n[grain %i]\n'%grain + \
|
|
||||||
'(gauss)\tphi1\t%f\tphi\t%f\tphi2\t%f\tscatter\t%f\tfraction\t1.0\n'\
|
|
||||||
%(math.degrees(orientationData[grain-1][0]),math.degrees(orientationData[grain-1][1]),\
|
|
||||||
math.degrees(orientationData[grain-1][2]),options.scatter)
|
|
||||||
if (options.xmargin > 0.0 or options.ymargin > 0.0):
|
|
||||||
output += '\n[margin]\n' + \
|
|
||||||
'(random)\t\tscatter\t0.0\tfraction\t1.0\n'
|
|
||||||
|
|
||||||
configFile = open(myName+'.config','w')
|
|
||||||
configFile.write(output)
|
|
||||||
configFile.close()
|
|
||||||
|
|
Loading…
Reference in New Issue