237 lines
8.4 KiB
Python
Executable File
237 lines
8.4 KiB
Python
Executable File
# -*- coding: UTF-8 no BOM -*-
|
|
|
|
import threading,os,string
|
|
import numpy as np
|
|
from optparse import OptionParser
|
|
from shutil import copy2
|
|
from re import split
|
|
import damask
|
|
|
|
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
|
scriptID = ' '.join([scriptName,damask.version])
|
|
|
|
def list_split(option, opt, value, parser):
|
|
setattr(parser.values, option.dest, value.split(','))
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
class myThread (threading.Thread):
|
|
"""Runner"""
|
|
|
|
def __init__(self, threadID):
|
|
threading.Thread.__init__(self)
|
|
self.threadID = threadID
|
|
def run(self):
|
|
s.acquire()
|
|
conv=isFinished()
|
|
s.release()
|
|
while conv:
|
|
doSim(4.,self.name)
|
|
s.acquire()
|
|
conv=isFinished()
|
|
s.release()
|
|
|
|
def doSim(delay,thread):
|
|
global dirCurrent
|
|
s.acquire()
|
|
delta_angle = offsetPhi()
|
|
if len(str(delta_angle)) > 5:
|
|
file_angle = str(delta_angle)[:5]
|
|
else:
|
|
file_angle = str(delta_angle)
|
|
dire = dirCurrent+'/'+file_angle
|
|
|
|
if not os.path.isdir(dire):
|
|
os.mkdir(dire,0755)
|
|
for file in [options.geometry+'.geom',options.load+'.load','numerics.config']:
|
|
copy2(dirCurrent+'/'+file, dire)
|
|
newMaterialConfig(dirCurrent,delta_angle)
|
|
|
|
os.chdir(dire)
|
|
if not os.path.isfile('%s_%s.spectralOut'%(options.geometry,options.load)):
|
|
print('starting uniaxial tension in direction of angle %s from %s'%(file_angle,thread))
|
|
s.release()
|
|
damask.util.execute('DAMASK_spectral -g %s -l %s'%(options.geometry,options.load))
|
|
else: s.release()
|
|
|
|
s.acquire()
|
|
if not os.path.isfile('./%s/%s_%s.txt'%('Rvalues',options.geometry,options.load)):
|
|
print('starting post processing for angle %s from %s'%(file_angle,thread))
|
|
s.release()
|
|
damask.util.execute('postResults --cr f,p -d %s %s_%s.spectralOut'%('Rvalues',options.geometry,options.load))
|
|
damask.util.execute('addCauchy ./%s/%s_%s.txt'%('Rvalues',options.geometry,options.load))
|
|
damask.util.execute('addStrainTensors -l -v ./%s/%s_%s.txt'%('Rvalues',options.geometry,options.load))
|
|
print('post processing for angle %s from %s is finished'%(file_angle,thread))
|
|
|
|
else:
|
|
s.release()
|
|
os.chdir(dirCurrent)
|
|
|
|
def isFinished():
|
|
global N_simulations
|
|
|
|
if N_simulations < options.number:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def offsetPhi():
|
|
global N_simulations #, N_tensile
|
|
N_simulations+=1
|
|
return np.linspace(0,90,options.number)[N_simulations-1]
|
|
|
|
def newMaterialConfig(dire,angle):
|
|
filename = '/material.config'
|
|
if len(str(angle)) > 5:
|
|
file_angle = str(angle)[:5]
|
|
else:
|
|
file_angle = str(angle)
|
|
f = open(dire+'/'+file_angle+filename,'w')
|
|
data = open(dire+filename, 'r').readlines()
|
|
|
|
for line in data:
|
|
if '(gauss)' in line:
|
|
linesplit = split(r'[;,\s,\t]\s*',line)
|
|
index = linesplit.index('phi1')
|
|
phi = float(linesplit[index+1]) - angle
|
|
if phi > 360. :
|
|
phi = phi-360.0
|
|
elif phi < 0.0:
|
|
phi = phi+360.0
|
|
index2 = line.index(linesplit[index+1])
|
|
line2 = line[:index2]+str(phi)+line[index2+len(str(float(linesplit[index+1]))):]
|
|
else:
|
|
line2 = line
|
|
f.write(line2)
|
|
f.close()
|
|
|
|
# --------------------------------------------------------------------
|
|
# MAIN
|
|
# --------------------------------------------------------------------
|
|
|
|
parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """
|
|
Calculate the deformation anisotropic coefficients (r values) and
|
|
strength anisotropic coefficients (normalized yield stress)
|
|
|
|
""", version=string.replace(scriptID,'\n','\\n')
|
|
)
|
|
|
|
parser.add_option('-l','--load' ,
|
|
dest='load', type='string',
|
|
help='name of the load file [%default]', metavar='string')
|
|
parser.add_option('-g','--geometry',
|
|
dest='geometry', type='string',
|
|
help='name of the geometry file [%default]', metavar='string')
|
|
parser.add_option('-s', '--strain',
|
|
dest='strain', type='string', action='callback', callback=list_split,
|
|
help='threshold strains, using comma to seperate multiple strains [%default]', metavar='string')
|
|
parser.add_option('-t','--threads',
|
|
dest='threads', type='int',
|
|
help='number of parallel executions [%default]', metavar='int')
|
|
parser.add_option('-n','--number',
|
|
dest='number', type='int',
|
|
help='Number of uni-axial tensile tests [%default]', metavar='int')
|
|
|
|
parser.set_defaults(geometry = '20grains16x16x16')
|
|
parser.set_defaults(load = 'tensionX')
|
|
parser.set_defaults(threads = 1)
|
|
parser.set_defaults(number = 7)
|
|
parser.set_defaults(strain = ('0.0025','0.025'))
|
|
|
|
options = parser.parse_args()[0]
|
|
|
|
if not os.path.isfile(options.geometry+'.geom'):
|
|
parser.error('geometry file %s.geom not found'%options.geometry)
|
|
if not os.path.isfile('material.config'):
|
|
parser.error('material.config file not found')
|
|
|
|
thresStrain = [float(i) for i in options.strain]
|
|
|
|
if not os.path.isfile(options.load+'.load'):
|
|
maxstrain = max(thresStrain)
|
|
f11 = str(1.2*maxstrain + 1.0)
|
|
if maxstrain < 0.05:
|
|
maxincs = '60'; maxtime = '30'
|
|
else:
|
|
maxincs = str(int(maxstrain*3000)); maxtime = str(maxstrain*600)
|
|
|
|
f=open('tensionX.load','w')
|
|
uniaxial_load = 'f ' +f11+ ' 0 0 0 * 0 0 0 * ' + \
|
|
'stress ' +'* * * * 0 * * * 0 ' + \
|
|
'time '+ maxtime + ' incs ' + maxincs + ' freq 3'
|
|
f.write(uniaxial_load)
|
|
f.close()
|
|
|
|
N_simulations=0
|
|
s=threading.Semaphore(1)
|
|
threads=[]
|
|
dirCurrent = os.getcwd()
|
|
for i in range(options.threads):
|
|
threads.append(myThread(i))
|
|
threads[i].start()
|
|
|
|
for i in range(options.threads):
|
|
threads[i].join()
|
|
|
|
anisotropy = {}
|
|
for i,delta_angle in enumerate(np.linspace(0,90,options.number)):
|
|
if len(str(delta_angle)) > 5:
|
|
file_angle = str(delta_angle)[:5]
|
|
else:
|
|
file_angle = str(delta_angle)
|
|
refFile = dirCurrent+'/'+file_angle+'/Rvalues/%s_%s.txt'%(options.geometry,options.load)
|
|
if not os.path.isfile(refFile):
|
|
print('post processing file is not found for the angle %s'%file_angle)
|
|
else:
|
|
File = open(refFile)
|
|
table = damask.ASCIItable(File)
|
|
table.head_read()
|
|
if not set(['1_ln(V)','5_ln(V)','9_ln(V)','1_Cauchy']).issubset(set(table.labels)):
|
|
print 'data missing in direction %s'%str(delta_angle)
|
|
table.data_readArray(['%i_Cauchy'%(i+1) for i in xrange(9)]+['%i_ln(V)'%(i+1) for i in xrange(9)])
|
|
line, lines = 0, np.shape(table.data)[0]
|
|
aniso_thres = {}
|
|
for threshold in thresStrain:
|
|
while line < lines:
|
|
if abs(table.data[line,9])>= threshold: # 1_ln(V), e_xx
|
|
upper,lower = abs(table.data[line,9]),abs(table.data[line-1,9]) # values for linear interpolation
|
|
interplate = lambda x_d, x_u : x_d * (upper-threshold)/(upper-lower) + x_u * (threshold-lower)/(upper-lower)
|
|
e_yy = interplate (table.data[line-1,13], table.data[line,13])
|
|
e_zz = interplate (table.data[line-1,17], table.data[line,17])
|
|
s_xx = interplate (table.data[line-1,0 ], table.data[line,0 ])
|
|
aniso_thres[str(threshold)] = [e_yy/e_zz, s_xx]
|
|
break
|
|
else:
|
|
line+=1
|
|
anisotropy[file_angle] = aniso_thres
|
|
|
|
f = open('./anisotropy.txt','w')
|
|
f.write('4 header \n')
|
|
f.write('#the first row mean the threshold strain e_xx \n#the first column means loading directions \n')
|
|
f.write('#none means the data is unavailable\n# \n')
|
|
title = ['*R values (Lankford coefficients) \n', '# \n*Normalized yield stress \n']
|
|
for i in xrange(2):
|
|
f.write(title[i])
|
|
f.write(' '*10+len(thresStrain)*'%-12.4f'%tuple(thresStrain)+'\n')
|
|
for j,delta_angle in enumerate(np.linspace(0,90,options.number)):
|
|
if len(str(delta_angle)) > 5:
|
|
file_angle = str(delta_angle)[:5]
|
|
else:
|
|
file_angle = str(delta_angle)
|
|
|
|
if file_angle in anisotropy.keys():
|
|
aniso_dic_ang = anisotropy[file_angle]
|
|
aniso_list_ang_strain = []; writeformat = ''
|
|
for threshold in thresStrain:
|
|
if str(threshold) in aniso_dic_ang.keys():
|
|
if i == 1: # extract the normalized stress
|
|
aniso = aniso_dic_ang[str(threshold)][i]/anisotropy['0.0'][str(threshold)][i]
|
|
else: # extract r value
|
|
aniso = aniso_dic_ang[str(threshold)][i]
|
|
aniso_list_ang_strain.append(aniso)
|
|
writeformat = writeformat+'%-12.6f'
|
|
else:
|
|
aniso_list_ang_strain.append('none')
|
|
writeformat = writeformat+'%-12s'
|
|
f.write('%-10s'%file_angle + writeformat%(tuple(aniso_list_ang_strain))+'\n')
|
|
f.close()
|