Source code for BasicTools.IO.SamcefWriter

# -*- coding: utf-8 -*-
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE.txt', which is part of this source code package.
#

"""Samcef dat (bank) file writer
"""

import numpy as np

from BasicTools.IO.WriterBase import WriterBase as WriterBase
import BasicTools.Containers.ElementNames as EN
from BasicTools.NumpyDefs import PBasicIndexType
from BasicTools.NumpyDefs import PBasicFloatType


BasicToolToSamcef = dict()
BasicToolToSamcef[EN.Bar_2] = (np.array([1,1]), np.arange(2),2)
BasicToolToSamcef[EN.Triangle_3] = (np.array([1,1,1]), np.arange(3),3)
BasicToolToSamcef[EN.Tetrahedron_4] = (np.array([1,1,1,1]), np.arange(4),4)

[docs]class DatWriter(WriterBase): """Class to write a Samcef dat (bank) file """ def __init__(self): super(DatWriter,self).__init__() def __str__(self): res = 'DatWriter : \n' res += ' FileName : '+str(self.fileName)+'\n' return res
[docs] def Write(self,meshObject,PointFieldsNames=None,PointFields=None,CellFieldsNames=None,CellFields=None,GridFieldsNames=None,GridFields=None): """Write mesh to file in Samcef dat format Parameters ---------- meshObject : UnstructuredMesh the mesh to be written PointFieldsNames : None Not Used, by default None PointFields : None Not Used, by default None CellFieldsNames : list[str], optional name of the fields defined at the cell to write, by default None CellFields : list[np.ndarray], optional fields defined at the cell to write, by default None GridFieldsNames : None Not Used, by default None GridFields : None Not Used, by default None """ #Nodes numberofpoints = meshObject.GetNumberOfNodes() posn = meshObject.GetPosOfNodes() self.writeText(".NOE\n") for n in range(numberofpoints): self.filePointer.write("{} ".format(n+1)) posn[np.newaxis,n,:].tofile(self.filePointer, sep=" ") self.writeText("\n") groupcpt = 1 gropuNames = dict() #Nodes Tags if len(meshObject.nodesTags): self.writeText('.SEL\n' ) for tag in meshObject.nodesTags: self.writeText('GROUP {} NOM "{}" NOEUDS \n'.format(groupcpt,tag.name) ) gropuNames[tag.name] = groupcpt groupcpt += 1 self.writeText('I ') #tag meshObject.nodesTags[tagname] (tag.GetIds()+1).tofile(self.filePointer, sep=" ") self.writeText("\n") #Elements self.writeText(".MAI\n") cpt =0 #for tagname in celtags: for name,data in meshObject.elements.items(): sign,permutation,splitpoint = BasicToolToSamcef[name] lconn = (1+data.connectivity)*sign lconn = lconn[:,permutation] fp = lconn[:,:splitpoint] sp = lconn[:,splitpoint:] for n in range(data.GetNumberOfElements()): self.writeText("I {} N ".format(cpt)) fp[n,:].tofile(self.filePointer, sep=" ") if sp.shape[1] > 0: self.writeText(" 0 ") sp[n,:].tofile(self.filePointer, sep=" ") cpt += 1 self.writeText("\n") celltags = meshObject.GetNamesOfElemTags() #Nodes Tags if len(celltags): self.writeText('.SEL\n' ) for tagname in celltags: self.writeText('GROUP {} NOM "{}" MAILLE \n'.format(groupcpt,tagname) ) gropuNames[tagname] = groupcpt groupcpt += 1 self.writeText('I ') ids = meshObject.GetElementsInTag(tagname)+1 ids.tofile(self.filePointer, sep=" ") self.writeText("\n") if "FrameX_0" in CellFieldsNames: FrameX_0 = CellFields[CellFieldsNames.index("FrameX_0")] FrameX_1 = CellFields[CellFieldsNames.index("FrameX_1")] FrameX_2 = CellFields[CellFieldsNames.index("FrameX_2")] FrameY_0 = CellFields[CellFieldsNames.index("FrameY_0")] FrameY_1 = CellFields[CellFieldsNames.index("FrameY_1")] FrameY_2 = CellFields[CellFieldsNames.index("FrameY_2")] nbelems = meshObject.GetNumberOfElements() self.writeText('.FRA\n') idx = [] for n in range(nbelems): if np.sum(np.abs([FrameX_0[n],FrameX_1[n],FrameX_2[n] ])) == 0: continue idx.append(n+1) self.writeText(f'I {n+1} V1 {FrameX_0[n]} {FrameX_1[n]} {FrameX_2[n]} V2 {FrameY_0[n]} {FrameY_1[n]} {FrameY_2[n]} \n') self.writeText('.AEL\n') for n in idx: self.writeText(f'I {n} FRAME {n} \n') self.writeText('RETURN\n')
from BasicTools.IO.IOFactory import RegisterWriterClass RegisterWriterClass(".datt",DatWriter)
[docs]def CheckIntegrity(): import BasicTools.Containers.UnstructuredMesh as UM from BasicTools.Helpers.Tests import TestTempDir tempdir = TestTempDir.GetTempPath() mymesh = UM.UnstructuredMesh() mymesh.nodes = np.array([[0.00000000001,0,0],[1,0,0],[0,1,0],[1,1,0]],dtype=PBasicFloatType) mymesh.originalIDNodes = np.array([1, 3, 4, 5],dtype=PBasicIndexType) mymesh.nodesTags.CreateTag("FirstNode").AddToTag(0) tris = mymesh.GetElementsOfType(EN.Triangle_3) tris.AddNewElement([0,1,2],0) tris.AddNewElement([2,1,3],3) tris.originalIds = np.array([3, 5],dtype=PBasicIndexType) mymesh.AddElementToTagUsingOriginalId(3,"Tag1") mymesh.AddElementToTagUsingOriginalId(5,"Tag3") nbel = mymesh.GetNumberOfElements() CellFields= [np.ones(nbel),np.zeros(nbel),np.zeros(nbel),np.zeros(nbel),np.ones(nbel),np.zeros(nbel)] CellFieldsNames= ["FrameX_0","FrameX_1","FrameX_2","FrameY_0","FrameY_1","FrameY_2"] OW = DatWriter() OW.Open(tempdir+"Test_SamcefWriter.datt") OW.Write(mymesh,CellFieldsNames=CellFieldsNames,CellFields=CellFields) OW.Close() return "ok"
if __name__ == '__main__': print(CheckIntegrity())# pragma: no cover