DAMASK_EICMD/processing/mentat_spectralBox.py

220 lines
5.9 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
from io import StringIO
from optparse import OptionParser
import damask
script_name = os.path.splitext(os.path.basename(__file__))[0]
script_id = ' '.join([script_name,damask.version])
#-------------------------------------------------------------------------------------------------
def outMentat(cmd,locals):
if cmd[0:3] == '(!)':
exec(cmd[3:])
elif cmd[0:3] == '(?)':
cmd = eval(cmd[3:])
py_mentat.py_send(cmd)
else:
py_mentat.py_send(cmd)
#-------------------------------------------------------------------------------------------------
def outFile(cmd,locals,dest):
if cmd[0:3] == '(!)':
exec(cmd[3:])
elif cmd[0:3] == '(?)':
cmd = eval(cmd[3:])
dest.write(cmd+'\n')
else:
dest.write(cmd+'\n')
#-------------------------------------------------------------------------------------------------
def output(cmds,locals,dest):
for cmd in cmds:
if isinstance(cmd,list):
output(cmd,locals,dest)
else:
if dest == 'Mentat':
outMentat(str(cmd),locals)
else:
outFile(str(cmd),locals,dest)
#-------------------------------------------------------------------------------------------------
def init():
return [
"|"+' '.join([script_id] + sys.argv[1:]),
"*draw_manual", # prevent redrawing in Mentat, should be much faster
"*new_model yes",
"*reset",
"*select_clear",
"*set_element_class hex8",
"*set_nodes off",
"*elements_solid",
"*show_view 4",
"*reset_view",
"*view_perspective",
"*redraw",
]
#-------------------------------------------------------------------------------------------------
def mesh(r,d):
return [
"*add_nodes",
"%f %f %f"%(0.0,0.0,0.0),
"%f %f %f"%(d[0],0.0,0.0),
"%f %f %f"%(d[0],d[1],0.0),
"%f %f %f"%(0.0,d[1],0.0),
"%f %f %f"%(0.0,0.0,d[2]),
"%f %f %f"%(d[0],0.0,d[2]),
"%f %f %f"%(d[0],d[1],d[2]),
"%f %f %f"%(0.0,d[1],d[2]),
"*add_elements",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"*sub_divisions",
"%i %i %i"%(r[0],r[1],r[2]),
"*subdivide_elements",
"all_existing",
"*set_sweep_tolerance",
"%f"%(float(min(d))/max(r)/2.0),
"*sweep_all",
"*remove_unused_nodes",
"*set_renumber_direction",
"%i %i %i"%(1,r[0],r[0]*r[1]),
"*renumber_elements_directed",
"*renumber_nodes_directed",
]
#-------------------------------------------------------------------------------------------------
def materials():
return [\
"*new_mater standard",
"*mater_option general:state:solid",
"*mater_option structural:type:hypo_elast",
"*mater_name",
"hypela2",
"*add_mater_elements",
"all_existing",
"*geometry_type mech_three_solid",
# "*geometry_option red_integ_capacity:on", reduced integration with one IP gave trouble being always OUTDATED...
"*add_geometry_elements",
"all_existing",
]
#-------------------------------------------------------------------------------------------------
def geometry():
return [\
"*geometry_type mech_three_solid",
# "*geometry_option red_integ_capacity:on",
"*add_geometry_elements",
"all_existing",
# we are NOT using reduced integration (type 117) but opt for /elementhomogeneous/ in the respective phase description (material.config)
"*element_type 7",
"all_existing",
]
#-------------------------------------------------------------------------------------------------
def initial_conditions(material):
elements = []
element = 0
for id in material:
element += 1
if len(elements) < id:
for i in range(id-len(elements)):
elements.append([])
elements[id-1].append(element)
cmds = [\
"*new_icond",
"*icond_name _temperature",
"*icond_type elem_temperature_state",
"*icond_dof_value var 300",
"*add_icond_elements",
"all_existing",
]
for grain,elementList in enumerate(elements):
cmds.append([\
"*new_icond",
"*icond_name material_%i"%(grain+1),
"*icond_type elem_user_state",
"*icond_param_value state_var_id 2",
"*icond_dof_value var %i"%(grain),
"*add_icond_elements",
elementList,
"#",
])
return cmds
#--------------------------------------------------------------------------------------------------
# MAIN
#--------------------------------------------------------------------------------------------------
parser = OptionParser(usage='%prog options [file[s]]', description = """
Generate MSC.Marc FE hexahedral mesh from geom file.
""", version = script_id)
parser.add_option('-p', '--port',
dest = 'port',
type = 'int', metavar = 'int',
help = 'Mentat connection port [%default]')
parser.set_defaults(port = None,
)
(options, filenames) = parser.parse_args()
if options.port is not None:
try:
sys.path.append(str(damask.solver.Marc().library_path))
import py_mentat
except ImportError:
parser.error('no valid Mentat release found')
# --- loop over input files ------------------------------------------------------------------------
if filenames == []: filenames = [None]
for name in filenames:
print(script_name+': '+name)
geom = damask.Grid.load(StringIO(''.join(sys.stdin.read())) if name is None else name)
material = geom.material.flatten(order='F')
cmds = [\
init(),
mesh(geom.cells,geom.size),
materials(),
geometry(),
initial_conditions(material),
'*identify_sets',
'*show_model',
'*redraw',
'*draw_automatic',
'*fill_view',
]
output_locals = {}
if options.port:
py_mentat.py_connect('',options.port)
output(cmds,output_locals,'Mentat')
py_mentat.py_disconnect()
else:
with sys.stdout if name is None else open(os.path.splitext(name)[0]+'.proc','w') as f:
output(cmds,output_locals,f)