From d965f14f90af636c0cabba051901ce8d6718a0d9 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Mon, 25 Oct 2010 17:57:57 +0000 Subject: [PATCH] generate hexahedral mesh in Mentat based on a data file of Ricardo Lebensohn's "txfft" format (phi1, Phi, phi2, x, y, z, grainId, phaseId) Only grainId is used, physical dimension and subdivisions need to be provided on command line. improvement possible by parsing x, y, z columns to get those directly. --- processing/pre/mentat_spectralBox | 181 ++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100755 processing/pre/mentat_spectralBox diff --git a/processing/pre/mentat_spectralBox b/processing/pre/mentat_spectralBox new file mode 100755 index 000000000..2eb99f0f7 --- /dev/null +++ b/processing/pre/mentat_spectralBox @@ -0,0 +1,181 @@ +#!/usr/bin/env python + +import os, sys, math, re, threading, time +from optparse import OptionParser, OptionGroup, Option, SUPPRESS_HELP + +releases = {'2010':['linux64',''], + '2008r1':[''], + '2007r1':[''], + '2005r3':[''], + } + +file = open('%s/../MSCpath'%os.path.dirname(sys.argv[0])) +MSCpath = os.path.normpath(file.readline().strip()) +file.close() + +for release,subdirs in sorted(releases.items(),reverse=True): + for subdir in subdirs: + libPath = '%s/mentat%s/shlib/%s'%(MSCpath,release,subdir) + if os.path.exists(libPath): + sys.path.append(libPath) + break + else: + continue + break + +from py_mentat import * + + +def outMentat(cmd,locals): + if cmd[0:3] == '(!)': + exec(cmd[3:]) + elif cmd[0:3] == '(?)': + cmd = eval(cmd[3:]) + py_send(cmd) + else: + py_send(cmd) + return + +def outStdout(cmd,locals): + if cmd[0:3] == '(!)': + exec(cmd[3:]) + elif cmd[0:3] == '(?)': + cmd = eval(cmd[3:]) + print cmd + else: + print cmd + return + + +def output(cmds,locals,dest): + for cmd in cmds: + if isinstance(cmd,list): + output(cmd,locals,dest) + else: + {\ + 'Mentat': outMentat,\ + 'Stdout': outStdout,\ + }[dest](cmd,locals) + return + + + +def init(): + return ["*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(N,d): + return [ + "*add_nodes", + "%f %f %f"%(0.0,0.0,0.0), + "%f %f %f"%(0.0,0.0,d[2]), + "%f %f %f"%(0.0,d[1],d[2]), + "%f %f %f"%(0.0,d[1],0.0), + "%f %f %f"%(-d[0],0.0,0.0), + "%f %f %f"%(-d[0],0.0,d[2]), + "%f %f %f"%(-d[0],d[1],d[2]), + "%f %f %f"%(-d[0],d[1],0.0), + "*add_elements", + "1 2 3 4 5 6 7 8", + "*sub_divisions", + "%i %i %i"%(N[2],N[1],N[0]), + "*subdivide_elements", + "all_existing", + "*set_sweep_tolerance", + "%f"%(float(min(d))/max(N)/2.0), + "*sweep_all", + "*renumber_all", + "*set_move_scale_factor x -1", + "*move_elements", + "all_existing", + "*flip_elements", + "all_existing", + "*fill_view", + ] + + + +def initial_conditions(N,data): + elements = [] + element = 0 + for line in data: + element += 1 + phi1,phi,phi2,x,y,z,id,phase = line.split() + id = int(id) + if len(elements) < id: + for i in range(id-len(elements)): + elements.append([]) + elements[id-1].append(element) + + cmds = [\ + "*new_icond", + "*icond_name homogenization", + "*icond_type state_variable", + "*icond_param_value state_var_id 2", + "*icond_dof_value var 1", + "*add_icond_elements", + "all_existing", + ] + + for grain,elementList in enumerate(elements): + cmds.append([\ + "*new_icond", + "*icond_name microstructure_%i"%(grain+1), + "*icond_type state_variable", + "*icond_param_value state_var_id 3", + "*icond_dof_value var %i"%(grain+1), + "*add_icond_elements", + map(str,elementList), + "#", + ]) + return cmds + + +# ----------------------- MAIN ------------------------------- + +parser = OptionParser() +parser.add_option("-p", "--port", type="int",\ + dest="port",\ + help="Mentat connection port") +parser.add_option("-d", "--dimension", type="int", nargs=3,\ + dest="d",\ + help="physical dimension") +parser.add_option("-N", "--subdivisions", type="int", nargs=3,\ + dest="N",\ + help="number of subdivisions") + +parser.set_defaults(d = (16,16,16)) +parser.set_defaults(N = (16,16,16)) + +(options, args) = parser.parse_args() + +if not os.path.isfile(args[0]): + parser.error("cannot open %s"%args[0]) + +file = open(args[0]) +content = file.readlines() +file.close() + +cmds = [\ + init(), + mesh(options.N,options.d), + initial_conditions(options.N,content), +] + +outputLocals = {} +if (options.port != None): + py_connect('',options.port) + output(cmds,outputLocals,'Mentat') + py_disconnect() +else: + output(cmds,outputLocals,'Stdout')