DAMASK_EICMD/lib/damask_test.py

112 lines
3.7 KiB
Python

#!/usr/bin/env python
import os, sys
import subprocess,shutil
import damask_tools; reload(damask_tools)
import msc_tools; reload(msc_tools)
damask_tools.DAMASK_TOOLS().check_env()
class DAMASK_TEST():
modelname=None
jobname=None
testdir=None
spectral_options=None
orientations=[]
compile=False
def run_test(self):
self.modelname='one_element_model'
self.jobname='job1'
self.testdir='2001_hex_plastic'
self.orientations=[]
self.clean_current_results()
if self.calc_current_results() is False:
return False
print('simulation finished')
self.postprocess()
if self.compare_to_reference() is False:
return False
print 'Test OK'
return True
def clean_current_results(self):
try:
shutil.rmtree('current_results')
except:
print('Could not delete current_results')
os.mkdir('current_results')
def calc_current_results(self,compile=None):
#theDir = os.path.split(sys.argv[0])[0]
#os.chdir(theDir)
#os.chdir('..')
#os.chdir('%s/testing'%os.getenv('DAMASK_ROOT'))
if compile is None: compile=self.compile
self.copy_from_ref=[self.modelname+'_'+self.jobname+'.dat',
self.modelname+'.mfd', # for dev
'material.config'
]
for file in self.copy_from_ref:
shutil.copy2('./reference_results/%s'%file,'./current_results/%s'%file)
# Note: possibly symlinking? No, because copy is OS independent.
os.chdir('./current_results')
m=msc_tools.MSC_TOOLS()
m.submit_job(compile=compile, compiled_dir='../../../code/')
print('simulation submitted')
self.exit_number=m.exit_number_from_outFile(outFile=self.modelname+'_'+self.jobname+'.out')
if not self.exit_number==3004:
print('Job did not exit with No. 3004')
return False
return True
def postprocess(self):
#print 'postprocessing results ...'
#os.system('%s/processing/post/postResults --es "Comp 33 of Stress" %s.t16 --range 100 100 1'%(os.getenv('DAMASK_ROOT'),self.modelname+'_'+self.jobname))
print 'postprocessing results ...'
file=open('../postprocessing.cmd','r')
postproc=file.readlines()
file.close()
for cmd in postproc: # PHILIP: suggestion to just execute the script "postprocessing" directly within a shell, i.e. os.system('../postprocessing')
print(cmd)
os.system(cmd) # PHILIP: reason is that for loops and the like get broken with line by line execution from here...
def compare_to_reference(self,tol=1e-5):
import string
print 'comparing results against reference_results...'
txt_file=self.modelname+'_'+self.jobname+'.txt'
cur=self.read_val_from_file(fname='postProc/'+txt_file)
ref=self.read_val_from_file(fname='../reference_results/postProc/'+txt_file)
err=abs((ref/cur)-1.) # relative tolerance
#err=abs(ref-cur) # absolute tolerance
if err>tol:
print 'Current value: %e'%cur
print 'Reference value: %e'%ref
print('err: %e > tol: %e'%(err,tol))
return False
print('err: %e < tol: %e'%(err,tol))
return True
def read_val_from_file(self,fname=None):
fid=open(fname,'r')
rl=fid.readlines()
print rl
cur=rl[-1]
lst=cur.split('\t')
print lst
val=float(lst[-1].rstrip())
print val
fid.close()
return val
if __name__ == "__main__":
test=DAMASK_TESTER()
test.run_test()