Exemplo n.º 1
0
 def log(self, strng):
     self.loglock.acquire()
     try:
         if debug.debug() and not self.quiet:
             global debugcounter
             if len(strng) < 1000:
                 dstr = strng
             else:
                 dstr = strng[:80] + '...' + strng[-20:]
             debug.msg("====%04d===="%debugcounter, dstr)
             debugcounter += 1
         if self._loghalted == 0:
             self._logchanged = 1
             self.logbook.append(strng+'\n')
             for logger in self.loggers:
                 logger(strng)
     finally:
         self.loglock.release()
Exemplo n.º 2
0
 def getLine(self):
     line = self.file.readline()
     self.bytecount += len(line)
     debug.msg("%s: %s" % (self.filename, line[:min(len(line) - 1, 100)]))
     return line
Exemplo n.º 3
0
 def getLine(self):
     line = self.file.readline()
     self.bytecount += len(line)
     debug.msg("%s: %s" %(self.filename, line[:min(len(line)-1, 100)]))
     return line
Exemplo n.º 4
0
def writeABAQUSfromSkeleton(filename, mode, skelcontext):
    skelcontext.begin_reading()
    try:
        skeleton = skelcontext.getObject()

        buffer = "*HEADING\nABAQUS-style file created by OOF2 on %s from a skeleton " % (
            datetime.datetime.today())
        buffer += "of the microstructure %s.\n" % skeleton.MS.name()

        # Build dictionary (instead of using index()) for elements and nodes
        #  as was done in previous writeXXX() methods
        nodedict = {}
        i = 1
        for node in skeleton.nodes:
            nodedict[node] = i
            i += 1
        # same for elements
        elementdict = {}
        i = 1
        for el in skeleton.elements:
            elementdict[el] = i
            i += 1

        debug.fmsg("made dicts")

        # Collect elements with the same dominant material together in a
        #  dictionary, with a key given by the material name.
        #  Some elements may not have a material assigned and
        #  these should not be included in the dictionary(?). Have a feeling
        #  something like this has been done in the OOF universe.
        materiallist = {}
        elementlist = {}
        for el in skeleton.elements:
            matl = el.material(skelcontext)
            if matl:
                matname = matl.name()
                # Steve's suggestion
                elindex = elementdict[el]
                try:
                    elementlist[matname].append(elindex)
                except KeyError:
                    elementlist[matname] = [elindex]
                    materiallist[matname] = el.material(skelcontext)
        debug.fmsg("made materiallist and elementlist")

        buffer += "** Materials defined by OOF2:\n"
        for matname, details in materiallist.items():
            buffer += "**   %s:\n" % (matname)
            for prop in details.properties():
                for param in prop.registration().params:
                    buffer += "**     %s: %s\n" % (param.name, param.value)
        debug.fmsg("wrote materials")

        buffer += "** Notes:\n**   The nodes for a skeleton are always located at vertices or corners.\n"
        buffer += "**   More information may be obtained by saving ABAQUS from a mesh.\n"

        listbuf = ["*NODE\n"]
        for node in skeleton.nodes:
            listbuf.append(
                "%d, %s, %s\n" %
                (nodedict[node], node.position().x, node.position().y))
        buffer += string.join(listbuf, "")

        # Only expecting 3 or 4 noded skeleton elements
        for numnodes in [3, 4]:
            listbuf=["** The element type provided for ABAQUS is only a guess " \
                     "and may have to be modified by the user to be meaningful.\n*ELEMENT, TYPE=CPS%d\n" % numnodes]
            for el in skeleton.elements:
                if el.nnodes() == numnodes:
                    listbuf2 = ["%d" % (elementdict[el])]
                    for node in el.nodes:
                        listbuf2.append("%d" % (nodedict[node]))
                    listbuf.append(string.join(listbuf2, ", ") + "\n")
            if len(listbuf) > 1:
                buffer += string.join(listbuf, "")

        debug.fmsg("wrote elements")

        for group in skelcontext.nodegroups.groups:
            buffer += "*NSET, NSET=%s\n" % (group)
            listbuf = []
            i = 0
            for node in skelcontext.nodegroups.get_group(group):
                if i > 0 and i % 16 == 0:
                    listbuf.append("\n%d" % (nodedict[node]))
                else:
                    listbuf.append("%d" % (nodedict[node]))
                i += 1
            buffer += string.join(listbuf, ", ") + "\n"
        debug.fmsg("wrote node groups")

        for elgroup in skelcontext.elementgroups.groups:
            buffer += "*ELSET, ELSET=%s\n" % (elgroup)
            listbuf = []
            i = 0
            for el in skelcontext.elementgroups.get_group(elgroup):
                if i > 0 and i % 16 == 0:
                    listbuf.append("\n%d" % (elementdict[el]))
                else:
                    listbuf.append("%d" % (elementdict[el]))
                i += 1
            buffer += string.join(listbuf, ", ") + "\n"
        debug.fmsg("wrote element groups")

        buffer += "** Include point and edge boundaries from OOF2.\n"
        for pbname, pbdy in skeleton.pointboundaries.items():
            buffer += "*NSET, NSET=%s\n" % (pbname)
            listbuf = []
            i = 0
            for node in pbdy.nodes:
                if i > 0 and i % 16 == 0:
                    listbuf.append("\n%d" % (nodedict[node]))
                else:
                    listbuf.append("%d" % (nodedict[node]))
                i += 1
            buffer += string.join(listbuf, ", ") + "\n"
        debug.fmsg("wrote boundaries")

        # Use rearrangeEdges() to chain the edges together, then pick the
        #  unique nodes. It seems the edges can't be selected if they
        #  are empty, so edgeset=[(a,b),(b,c),...] is not checked
        #  for null content
        for ebname, ebdy in skeleton.edgeboundaries.items():
            edgeset = rearrangeEdges([
                tuple([nodedict[node] for node in edge.get_nodes()])
                for edge in ebdy.edges
            ])
            buffer += "*NSET, NSET=%s\n" % (ebname)
            listbuf = ["%d" % edgeset[0][0]]
            i = 1
            for edge in edgeset:
                if i % 16 == 0:
                    listbuf.append("\n%d" % (edge[1]))
                else:
                    listbuf.append("%d" % (edge[1]))
                i += 1
            buffer += string.join(listbuf, ", ") + "\n"

        for matname in materiallist:
            buffer += "*ELSET, ELSET=%s\n" % matname
            listbuf = []
            i = 0
            for elindex in elementlist[matname]:
                if i > 0 and i % 16 == 0:
                    listbuf.append("\n%d" % (elindex))
                else:
                    listbuf.append("%d" % (elindex))
                i += 1
            buffer += string.join(
                listbuf,
                ", ") + "\n*SOLID SECTION, ELSET=%s, MATERIAL=%s\n" % (matname,
                                                                       matname)
        debug.fmsg("wrote material elsets")

        for matname in materiallist:
            buffer += "*MATERIAL, NAME=%s\n** Use the information in the header to complete these fields under MATERIAL\n" % matname

        # Save/Commit to file. Perhaps should be done outside the current method
        debug.fmsg("opening file")
        fp = open(filename, mode)
        debug.msg("writing buffer")
        fp.write(buffer)
        debug.fmsg("done writing buffer")
        fp.close()
    finally:
        skelcontext.end_reading()
Exemplo n.º 5
0
def writeABAQUSfromSkeleton(filename, mode, skelcontext):
    skelcontext.begin_reading()
    try:
        skeleton = skelcontext.getObject()

        buffer="*HEADING\nABAQUS-style file created by OOF2 on %s from a skeleton " % (datetime.datetime.today())
        buffer+="of the microstructure %s.\n" % skeleton.MS.name()

        # Build dictionary (instead of using index()) for elements and nodes
        #  as was done in previous writeXXX() methods
        nodedict = {}
        i = 1
        for node in skeleton.nodes:
            nodedict[node] = i
            i += 1
        # same for elements
        elementdict = {}
        i = 1
        for el in skeleton.elements:
            elementdict[el] = i
            i += 1

        debug.fmsg("made dicts")
        
        # Collect elements with the same dominant material together in a
        #  dictionary, with a key given by the material name.
        #  Some elements may not have a material assigned and
        #  these should not be included in the dictionary(?). Have a feeling
        #  something like this has been done in the OOF universe.
        materiallist={}
        elementlist={}
        for el in skeleton.elements:
            matl = el.material(skelcontext)
            if matl:
                matname = matl.name()
                # Steve's suggestion
                elindex = elementdict[el]
                try:
                    elementlist[matname].append(elindex)
                except KeyError:
                    elementlist[matname] = [elindex]
                    materiallist[matname] = el.material(skelcontext)
        debug.fmsg("made materiallist and elementlist")

        buffer+="** Materials defined by OOF2:\n"
        for matname, details in materiallist.items():
            buffer+="**   %s:\n" % (matname)
            for prop in details.properties():
                for param in prop.registration().params:
                    buffer+="**     %s: %s\n" % (param.name,param.value)
        debug.fmsg("wrote materials")

        buffer+="** Notes:\n**   The nodes for a skeleton are always located at vertices or corners.\n"
        buffer+="**   More information may be obtained by saving ABAQUS from a mesh.\n"

        listbuf=["*NODE\n"]
        for node in skeleton.nodes:
            listbuf.append("%d, %s, %s\n" % (nodedict[node],node.position().x,node.position().y))
        buffer+=string.join(listbuf,"")

        # Only expecting 3 or 4 noded skeleton elements
        for numnodes in [3,4]:
            listbuf=["** The element type provided for ABAQUS is only a guess " \
                     "and may have to be modified by the user to be meaningful.\n*ELEMENT, TYPE=CPS%d\n" % numnodes]
            for el in skeleton.elements:
                if el.nnodes()==numnodes:
                    listbuf2=["%d" % (elementdict[el])]
                    for node in el.nodes:
                        listbuf2.append("%d" % (nodedict[node]))
                    listbuf.append(string.join(listbuf2,", ")+"\n")
            if len(listbuf)>1:
                buffer+=string.join(listbuf,"")

        debug.fmsg("wrote elements")

        for group in skelcontext.nodegroups.groups:
            buffer+="*NSET, NSET=%s\n" % (group)
            listbuf=[]
            i=0
            for node in skelcontext.nodegroups.get_group(group):
                if i>0 and i%16==0:
                    listbuf.append("\n%d" % (nodedict[node]))
                else:
                    listbuf.append("%d" % (nodedict[node]))
                i+=1
            buffer+=string.join(listbuf,", ")+"\n"
        debug.fmsg("wrote node groups")
        
        for elgroup in skelcontext.elementgroups.groups:
            buffer+="*ELSET, ELSET=%s\n" % (elgroup)
            listbuf=[]
            i=0
            for el in skelcontext.elementgroups.get_group(elgroup):
                if i>0 and i%16==0:
                    listbuf.append("\n%d" % (elementdict[el]))
                else:
                    listbuf.append("%d" % (elementdict[el]))
                i+=1
            buffer+=string.join(listbuf,", ")+"\n"
        debug.fmsg("wrote element groups")

        buffer+="** Include point and edge boundaries from OOF2.\n"
        for pbname, pbdy in skeleton.pointboundaries.items():
            buffer+="*NSET, NSET=%s\n" % (pbname)
            listbuf=[]
            i=0
            for node in pbdy.nodes:
                if i>0 and i%16==0:
                    listbuf.append("\n%d" % (nodedict[node]))
                else:
                    listbuf.append("%d" % (nodedict[node]))
                i+=1
            buffer+=string.join(listbuf,", ")+"\n"
        debug.fmsg("wrote boundaries")

        # Use rearrangeEdges() to chain the edges together, then pick the
        #  unique nodes. It seems the edges can't be selected if they
        #  are empty, so edgeset=[(a,b),(b,c),...] is not checked
        #  for null content
        for ebname, ebdy in skeleton.edgeboundaries.items():
            edgeset = rearrangeEdges([
                tuple([nodedict[node] for node in edge.get_nodes()])
                for edge in ebdy.edges
                ])
            buffer+="*NSET, NSET=%s\n" % (ebname)
            listbuf=["%d" % edgeset[0][0]]
            i=1
            for edge in edgeset:
                if i%16==0:
                    listbuf.append("\n%d" % (edge[1]))
                else:
                    listbuf.append("%d" % (edge[1]))
                i+=1
            buffer+=string.join(listbuf,", ")+"\n"

        for matname in materiallist:
            buffer+="*ELSET, ELSET=%s\n" % matname
            listbuf=[]
            i=0
            for elindex in elementlist[matname]:
                if i>0 and i%16==0:
                    listbuf.append("\n%d" % (elindex))
                else:
                    listbuf.append("%d" % (elindex))
                i+=1
            buffer+=string.join(listbuf,", ")+"\n*SOLID SECTION, ELSET=%s, MATERIAL=%s\n" % (matname,matname)
        debug.fmsg("wrote material elsets")
            
        for matname in materiallist:
            buffer+="*MATERIAL, NAME=%s\n** Use the information in the header to complete these fields under MATERIAL\n" % matname

        # Save/Commit to file. Perhaps should be done outside the current method
        debug.fmsg("opening file")
        fp=open(filename,mode)
        debug.msg("writing buffer")
        fp.write(buffer)
        debug.fmsg("done writing buffer")
        fp.close()
    finally:
        skelcontext.end_reading()