/[escript]/trunk/pycad/py_src/gmsh.py
ViewVC logotype

Diff of /trunk/pycad/py_src/gmsh.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2096 by phornby, Tue Nov 25 10:29:27 2008 UTC revision 2180 by caltinay, Thu Dec 18 00:30:25 2008 UTC
# Line 39  from primitives import Point, Spline, Be Line 39  from primitives import Point, Spline, Be
39    
40  class Design(design.Design):  class Design(design.Design):
41      """      """
42      design fo gmsh      Design for gmsh.
43      """      """
44      DELAUNAY="iso"      DELAUNAY="iso"
45      NETGEN="netgen"      NETGEN="netgen"
# Line 47  class Design(design.Design): Line 47  class Design(design.Design):
47    
48      def __init__(self,dim=3,element_size=1.,order=1,keep_files=False):      def __init__(self,dim=3,element_size=1.,order=1,keep_files=False):
49         """         """
50         initializes the gmsh design         Initializes the gmsh design.
51    
52         @param dim: patial dimension         @param dim: spatial dimension
53         @param element_size: global element size         @param element_size: global element size
54         @param order: element order         @param order: element order
55         @param keep_files: flag to keep work files.         @param keep_files: flag to keep work files
56         """         """
57         design.Design.__init__(self,dim=dim,element_size=element_size,order=order,keep_files=keep_files)         design.Design.__init__(self,dim=dim,element_size=element_size,order=order,keep_files=keep_files)
58         self.setScriptFileName()         self.setScriptFileName()
59         self.setMeshFileName()         self.setMeshFileName()
60         self.setOptions()         self.setOptions()
61    
62      def setScriptFileName(self,name=None):      def setScriptFileName(self,name=None):
63         """         """
64         set the filename for the gmsh input script. if no name is given a name with extension geo is generated.         Sets the filename for the gmsh input script. If no name is given a name
65           with extension I{geo} is generated.
66         """         """
67         if name == None:         if name == None:
68             tmp_f_id=tempfile.mkstemp(suffix=".geo")             tmp_f_id=tempfile.mkstemp(suffix=".geo")
# Line 69  class Design(design.Design): Line 71  class Design(design.Design):
71         else:         else:
72             self.__scriptname=name             self.__scriptname=name
73             self.setKeepFilesOn()             self.setKeepFilesOn()
74    
75      def getScriptFileName(self):      def getScriptFileName(self):
76         """         """
77         returns the name of the file for the gmsh script         Returns the name of the gmsh script file.
78         """         """
79         return self.__scriptname         return self.__scriptname
80    
81      def setMeshFileName(self, name=None):      def setMeshFileName(self, name=None):
82         """         """
83         sets the name for the gmsh mesh file. if no name is given a name with extension msh is generated.         Sets the name for the gmsh mesh file. If no name is given a name with
84           extension I{msh} is generated.
85         """         """
86         if name == None:         if name == None:
87             tmp_f_id=tempfile.mkstemp(suffix=".msh")             tmp_f_id=tempfile.mkstemp(suffix=".msh")
# Line 85  class Design(design.Design): Line 90  class Design(design.Design):
90         else:         else:
91             self.__mshname=name             self.__mshname=name
92             self.setKeepFilesOn()             self.setKeepFilesOn()
93    
94      def getMeshFileName(self):      def getMeshFileName(self):
95         """         """
96         returns the name of the file for the gmsh msh         Returns the name of the gmsh mesh file.
97         """         """
98         return self.__mshname         return self.__mshname
99    
100      def setOptions(self,algorithm=None,optimize_quality=True,smoothing=1, curvature_based_element_size=False):      def setOptions(self,algorithm=None,optimize_quality=True,smoothing=1, curvature_based_element_size=False):
101          """          """
102          sets options for the mesh generator          Sets options for the mesh generator.
103          """          """
104          if algorithm==None: algorithm=self.DELAUNAY          if algorithm==None: algorithm=self.DELAUNAY
105          self.__curvature_based_element_size=curvature_based_element_size          self.__curvature_based_element_size=curvature_based_element_size
106          self.__algo=algorithm          self.__algo=algorithm
107          self.__optimize_quality=optimize_quality          self.__optimize_quality=optimize_quality
108          self.__smoothing=smoothing          self.__smoothing=smoothing
109    
110      def __del__(self):      def __del__(self):
111          """          """
112          clean up          Cleans up.
113          """          """
114          if not self.keepFiles() :          if not self.keepFiles() :
115              os.unlink(self.getScriptFileName())              os.unlink(self.getScriptFileName())
# Line 109  class Design(design.Design): Line 117  class Design(design.Design):
117    
118      def getCommandString(self):      def getCommandString(self):
119          """          """
120          returns the gmsh comand          Returns the gmsh command line.
121          """          """
122          if self.__optimize_quality:          if self.__optimize_quality:
123                opt="-optimize "                opt="-optimize "
# Line 117  class Design(design.Design): Line 125  class Design(design.Design):
125                opt=""                opt=""
126          if self.__curvature_based_element_size:          if self.__curvature_based_element_size:
127                clcurv="-clcurv "                clcurv="-clcurv "
128          else:          else:
129                clcurv=""                clcurv=""
130    
131          exe="gmsh -%s -algo %s %s-smooth %s %s-v 0 -order %s -o %s %s"%(self.getDim(),          exe="gmsh -%s -algo %s %s-smooth %s %s-v 0 -order %s -o %s %s" % (
132                                                                         self.__algo,                  self.getDim(), self.__algo, clcurv, self.__smoothing, opt,
133                                                                         clcurv,                  self.getElementOrder(), self.getMeshFileName(),
134                                                                         self.__smoothing,                  self.getScriptFileName())
                                                                        opt,  
                                                                        self.getElementOrder(),  
                                                                        self.getMeshFileName(),  
                                                                        self.getScriptFileName())  
135          return exe          return exe
136    
137      def getMeshHandler(self):      def getMeshHandler(self):
138          """          """
139          returns a handle to a mesh meshing the design. In the current implementation          Returns a handle to a mesh meshing the design. In the current
140          a mesh file name in gmsh format is returned.          implementation a mesh file name in gmsh format is returned.
141          """          """
142          f = open(self.getScriptFileName(),"w")          f = open(self.getScriptFileName(),"w")
143          f.write(self.getScriptString())          f.write(self.getScriptString())
144          f.close()          f.close()
145          cmd = self.getCommandString()          cmd = self.getCommandString()
146          ret = os.system(cmd) / 256          ret = os.system(cmd) / 256
147      if ret > 0:          if ret > 0:
148        raise RuntimeError, "Could not build mesh: %s"%cmd            raise RuntimeError, "Could not build mesh: %s"%cmd
149      else:          else:
150            return self.getMeshFileName()            return self.getMeshFileName()
151    
152      def getScriptString(self):      def getScriptString(self):
153          """          """
154          returns the gmsh script to generate the mesh          Returns the gmsh script to generate the mesh.
155          """          """
156          h=self.getElementSize()          h=self.getElementSize()
157          out="// generated by esys.pycad\n"          out="// generated by esys.pycad\n"
# Line 155  class Design(design.Design): Line 160  class Design(design.Design):
160             if isinstance(p, Point):             if isinstance(p, Point):
161                 c=p.getCoordinates()                 c=p.getCoordinates()
162                 out+="Point(%s) = {%s , %s, %s , %s };\n"%(p.getID(),c[0],c[1],c[2], p.getLocalScale()*h)                 out+="Point(%s) = {%s , %s, %s , %s };\n"%(p.getID(),c[0],c[1],c[2], p.getLocalScale()*h)
163            
164             elif isinstance(p, Spline):             elif isinstance(p, Spline):
165                 out+="Spline(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))                 out+="Spline(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))
166        
167             elif isinstance(p, BezierCurve):             elif isinstance(p, BezierCurve):
168                 out+="Bezier(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))                 out+="Bezier(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))
169    
# Line 170  class Design(design.Design): Line 175  class Design(design.Design):
175    
176             elif isinstance(p, Arc):             elif isinstance(p, Arc):
177                out+="Circle(%s) = {%s, %s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getCenterPoint().getDirectedID(),p.getEndPoint().getDirectedID())                out+="Circle(%s) = {%s, %s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getCenterPoint().getDirectedID(),p.getEndPoint().getDirectedID())
178          
179             elif isinstance(p, Ellipse):             elif isinstance(p, Ellipse):
180                out+="Ellipse(%s) = {%s, %s, %s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getCenterPoint().getDirectedID(),p.getPointOnMainAxis().getDirectedID(), p.getEndPoint().getDirectedID())                out+="Ellipse(%s) = {%s, %s, %s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getCenterPoint().getDirectedID(),p.getPointOnMainAxis().getDirectedID(), p.getEndPoint().getDirectedID())
181    
182             elif isinstance(p, CurveLoop):             elif isinstance(p, CurveLoop):
183                 out+="Line Loop(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getCurves()))                 out+="Line Loop(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getCurves()))
184          
185             elif isinstance(p, RuledSurface):             elif isinstance(p, RuledSurface):
186                 out+="Ruled Surface(%s) = {%s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID())                 out+="Ruled Surface(%s) = {%s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID())
187          
188             elif isinstance(p, PlaneSurface):             elif isinstance(p, PlaneSurface):
189                 line=self.__mkArgs(p.getHoles())                 line=self.__mkArgs(p.getHoles())
190                 if len(line)>0:                 if len(line)>0:
191                   out+="Plane Surface(%s) = {%s, %s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID(), line)                   out+="Plane Surface(%s) = {%s, %s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID(), line)
192                 else:                 else:
193                   out+="Plane Surface(%s) = {%s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID())                   out+="Plane Surface(%s) = {%s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID())
194          
195             elif isinstance(p, SurfaceLoop):             elif isinstance(p, SurfaceLoop):
196                 out+="Surface Loop(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getSurfaces()))                 out+="Surface Loop(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getSurfaces()))
197          
198             elif isinstance(p, Volume):             elif isinstance(p, Volume):
199                 line=self.__mkArgs(p.getHoles())                 line=self.__mkArgs(p.getHoles())
200                 if len(line)>0:                 if len(line)>0:
# Line 198  class Design(design.Design): Line 203  class Design(design.Design):
203                   out+="Volume(%s) = {%s};\n"%(p.getID(),p.getSurfaceLoop().getDirectedID())                   out+="Volume(%s) = {%s};\n"%(p.getID(),p.getSurfaceLoop().getDirectedID())
204    
205             elif isinstance(p, PropertySet):             elif isinstance(p, PropertySet):
206                 if p.getNumItems()>0:                 if p.getNumItems()>0:
207                dim=p.getDim()                    dim=p.getDim()
208                    line="Physical "                    line="Physical "
209                    if dim==0:                    if dim==0:
210                        line+="Point"                        line+="Point"
211                    elif dim==1:                    elif dim==1:
212                        line+="Line"                        line+="Line"
213                    elif dim==2:                    elif dim==2:
214                        line+="Surface"                        line+="Surface"
215                    else:                    else:
216                        line+="Volume"                        line+="Volume"
# Line 219  class Design(design.Design): Line 224  class Design(design.Design):
224      def __mkArgs(self,args):      def __mkArgs(self,args):
225          line=""          line=""
226          for i in args:          for i in args:
227              if len(line)>0:              if len(line)>0:
228                  line+=", %s"%i.getDirectedID()                  line+=", %s"%i.getDirectedID()
229              else:              else:
230                  line="%s"%i.getDirectedID()                  line="%s"%i.getDirectedID()
231          return line          return line
232    

Legend:
Removed from v.2096  
changed lines
  Added in v.2180

  ViewVC Help
Powered by ViewVC 1.1.26