/[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

trunk/pycad/py_src/gmsh.py revision 999 by gross, Tue Feb 27 08:12:37 2007 UTC temp_trunk_copy/pycad/py_src/gmsh.py revision 1384 by phornby, Fri Jan 11 02:29:38 2008 UTC
# Line 1  Line 1 
1  # $Id:$  #
2    # $Id$
3    #
4    #######################################################
5    #
6    #           Copyright 2003-2007 by ACceSS MNRF
7    #       Copyright 2007 by University of Queensland
8    #
9    #                http://esscc.uq.edu.au
10    #        Primary Business: Queensland, Australia
11    #  Licensed under the Open Software License version 3.0
12    #     http://www.opensource.org/licenses/osl-3.0.php
13    #
14    #######################################################
15    #
16    
17  """  """
18  mesh generation using gmsh  mesh generation using gmsh
# Line 25  __date__="$Date:$" Line 39  __date__="$Date:$"
39  import design  import design
40  import tempfile  import tempfile
41  import os  import os
42    from primitives import Point, Spline, BezierCurve, BSpline, Line, Arc, CurveLoop, RuledSurface, PlaneSurface, SurfaceLoop, Volume, PropertySet, Ellipse
43    
44  class Design(design.Design):  class Design(design.Design):
45      """      """
# Line 74  class Design(design.Design): Line 89  class Design(design.Design):
89         returns the name of the file for the gmsh msh         returns the name of the file for the gmsh msh
90         """         """
91         return self.__mshname         return self.__mshname
92      def setOptions(self,algorithm=None,optimize_quality=True,smoothing=1):      def setOptions(self,algorithm=None,optimize_quality=True,smoothing=1, curvature_based_element_size=False):
93          """          """
94          sets options for the mesh generator          sets options for the mesh generator
95          """          """
96          if algorithm==None: algorithm=self.DELAUNAY          if algorithm==None: algorithm=self.DELAUNAY
97            self.__curvature_based_element_size=curvature_based_element_size
98          self.__algo=algorithm          self.__algo=algorithm
99          self.__optimize_quality=optimize_quality          self.__optimize_quality=optimize_quality
100          self.__smoothing=smoothing          self.__smoothing=smoothing
# Line 89  class Design(design.Design): Line 105  class Design(design.Design):
105          if not self.keepFiles():          if not self.keepFiles():
106                 os.unlink(self.getScriptFileName())                 os.unlink(self.getScriptFileName())
107                 os.unlink(self.getMeshFileName())                 os.unlink(self.getMeshFileName())
     def getScriptString(self):  
         """  
         returns the gmsh script to generate the mesh  
         """  
         prim=self.getAllPrimitives()  
         out="// generated by esys.pycad\n"  
         for p in prim:  
            out+=p.getGmshCommand(self.getElementSize())+"\n"  
         return out  
108      def getCommandString(self):      def getCommandString(self):
109          """          """
110          returns the gmsh comand          returns the gmsh comand
# Line 106  class Design(design.Design): Line 113  class Design(design.Design):
113                opt="-optimize "                opt="-optimize "
114          else:          else:
115                opt=""                opt=""
116          exe="gmsh -%s -algo %s -clcurv -smooth %s %s -v 0 -order %s -o %s %s"%(self.getDim(),          if self.__curvature_based_element_size:
117                  clcurv="-clcurv "
118            else:
119                  clcurv=""
120    
121            exe="gmsh -%s -algo %s %s-smooth %s %s-v 0 -order %s -o %s %s"%(self.getDim(),
122                                                                         self.__algo,                                                                         self.__algo,
123                                                                           clcurv,
124                                                                         self.__smoothing,                                                                         self.__smoothing,
125                                                                         opt,                                                                         opt,
126                                                                         self.getElementOrder(),                                                                         self.getElementOrder(),
# Line 120  class Design(design.Design): Line 133  class Design(design.Design):
133          a mesh file name in gmsh format is returned.          a mesh file name in gmsh format is returned.
134          """          """
135          open(self.getScriptFileName(),"w").write(self.getScriptString())          open(self.getScriptFileName(),"w").write(self.getScriptString())
136          os.system(self.getCommandString())          cmd = self.getCommandString()
137          return self.getMeshFileName()          ret = os.system(cmd) / 256
138        if ret > 0:
139          raise RuntimeError, "Could not build mesh: %s"%cmd
140        else:
141              return self.getMeshFileName()
142    
143        def getScriptString(self):
144            """
145            returns the gmsh script to generate the mesh
146            """
147            h=self.getElementSize()
148            out="// generated by esys.pycad\n"
149            for prim in self.getAllPrimitives():
150               p=prim.getUnderlyingPrimitive()
151               if isinstance(p, Point):
152                   c=p.getCoordinates()
153                   out+="Point(%s) = {%s , %s, %s , %s };\n"%(p.getID(),c[0],c[1],c[2], p.getLocalScale()*h)
154            
155               elif isinstance(p, Spline):
156                   out+="Spline(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))
157        
158               elif isinstance(p, BezierCurve):
159                   out+="Bezier(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))
160    
161               elif isinstance(p, BSpline):
162                   out+="BSpline(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getControlPoints()))
163    
164               elif isinstance(p, Line):
165                   out+="Line(%s) = {%s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getEndPoint().getDirectedID())
166    
167               elif isinstance(p, Arc):
168                  out+="Circle(%s) = {%s, %s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getCenterPoint().getDirectedID(),p.getEndPoint().getDirectedID())
169          
170               elif isinstance(p, Ellipse):
171                  out+="Ellipse(%s) = {%s, %s, %s, %s};\n"%(p.getID(),p.getStartPoint().getDirectedID(),p.getCenterPoint().getDirectedID(),p.getPointOnMainAxis().getDirectedID(), p.getEndPoint().getDirectedID())
172    
173               elif isinstance(p, CurveLoop):
174                   out+="Line Loop(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getCurves()))
175          
176               elif isinstance(p, RuledSurface):
177                   out+="Ruled Surface(%s) = {%s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID())
178          
179               elif isinstance(p, PlaneSurface):
180                   line=self.__mkArgs(p.getHoles())
181                   if len(line)>0:
182                     out+="Plane Surface(%s) = {%s, %s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID(), line)
183                   else:
184                     out+="Plane Surface(%s) = {%s};\n"%(p.getID(),p.getBoundaryLoop().getDirectedID())
185          
186               elif isinstance(p, SurfaceLoop):
187                   out+="Surface Loop(%s) = {%s};\n"%(p.getID(),self.__mkArgs(p.getSurfaces()))
188          
189               elif isinstance(p, Volume):
190                   line=self.__mkArgs(p.getHoles())
191                   if len(line)>0:
192                     out+="Volume(%s) = {%s, %s};\n"%(p.getID(),p.getSurfaceLoop().getDirectedID(), line)
193                   else:
194                     out+="Volume(%s) = {%s};\n"%(p.getID(),p.getSurfaceLoop().getDirectedID())
195    
196               elif isinstance(p, PropertySet):
197                   if p.getNumItems()>0:
198                  dim=p.getDim()
199                      line="Physical "
200                      if dim==0:
201                          line+="Point"
202                      elif dim==1:
203                          line+="Line"
204                      elif dim==2:
205                          line+="Surface"
206                      else:
207                          line+="Volume"
208                      out+=line+"(" + str(p.getID()) + ") = {"+self.__mkArgs(p.getItems())+"};\n"
209    
210               else:
211                   raise TypeError("unable to pass %s object to gmsh."%str(type(p)))
212            return out
213    
214    
215        def __mkArgs(self,args):
216            line=""
217            for i in args:
218                if len(line)>0:
219                    line+=", %s"%i.getDirectedID()
220                else:
221                    line="%s"%i.getDirectedID()
222            return line

Legend:
Removed from v.999  
changed lines
  Added in v.1384

  ViewVC Help
Powered by ViewVC 1.1.26