source: issm/trunk-jpl/externalpackages/petsc-dev/src/config/PETSc/packages/tetgen.py@ 11896

Last change on this file since 11896 was 11896, checked in by habbalf, 13 years ago

petsc-dev : Petsc development code in external packages. Mercurial updates

File size: 6.9 KB
Line 
1import PETSc.package
2
3structDecl = '''
4#include <stdio.h> // Needed for FILE, NULL
5class tetgenio {
6
7 public:
8 enum {FILENAMESIZE = 1024};
9 enum {INPUTLINESIZE = 1024};
10
11 typedef struct {
12 int *vertexlist;
13 int numberofvertices;
14 } polygon;
15
16 static void init(polygon* p) {
17 p->vertexlist = (int *) NULL;
18 p->numberofvertices = 0;
19 }
20
21 typedef struct {
22 polygon *polygonlist;
23 int numberofpolygons;
24 double *holelist;
25 int numberofholes;
26 } facet;
27
28 static void init(facet* f) {
29 f->polygonlist = (polygon *) NULL;
30 f->numberofpolygons = 0;
31 f->holelist = (double *) NULL;
32 f->numberofholes = 0;
33 }
34
35 typedef struct {
36 int fmark1, fmark2;
37 double transmat[4][4];
38 int numberofpointpairs;
39 int *pointpairlist;
40 } pbcgroup;
41
42 public:
43
44 int firstnumber;
45 int mesh_dim;
46 double *pointlist;
47 double *pointattributelist;
48 double *addpointlist;
49 int *pointmarkerlist;
50 int numberofpoints;
51 int numberofpointattributes;
52 int numberofaddpoints;
53 int *tetrahedronlist;
54 double *tetrahedronattributelist;
55 double *tetrahedronvolumelist;
56 int *neighborlist;
57 int numberoftetrahedra;
58 int numberofcorners;
59 int numberoftetrahedronattributes;
60 facet *facetlist;
61 int *facetmarkerlist;
62 int numberoffacets;
63 double *holelist;
64 int numberofholes;
65 double *regionlist;
66 int numberofregions;
67 double *facetconstraintlist;
68 int numberoffacetconstraints;
69 double *segmentconstraintlist;
70 int numberofsegmentconstraints;
71 double *nodeconstraintlist;
72 int numberofnodeconstraints;
73 pbcgroup *pbcgrouplist;
74 int numberofpbcgroups;
75 int *trifacelist;
76 int *trifacemarkerlist;
77 int numberoftrifaces;
78 int *edgelist;
79 int *edgemarkerlist;
80 int numberofedges;
81
82 public:
83 void initialize();
84 void deinitialize();
85 bool load_node_call(FILE* infile, int markers, char* nodefilename);
86 bool load_node(char* filename);
87 bool load_addnodes(char* filename);
88 bool load_pbc(char* filename);
89 bool load_var(char* filename);
90 bool load_poly(char* filename);
91 bool load_off(char* filename);
92 bool load_ply(char* filename);
93 bool load_stl(char* filename);
94 bool load_medit(char* filename);
95 bool load_plc(char* filename, int object);
96 bool load_tetmesh(char* filename);
97 void save_nodes(char* filename);
98 void save_elements(char* filename);
99 void save_faces(char* filename);
100 void save_edges(char* filename);
101 void save_neighbors(char* filename);
102 void save_poly(char* filename);
103 char *readline(char* string, FILE* infile, int *linenumber);
104 char *findnextfield(char* string);
105 char *readnumberline(char* string, FILE* infile, char* infilename);
106 char *findnextnumber(char* string);
107 tetgenio() {initialize();}
108 ~tetgenio() {deinitialize();}
109};
110'''
111
112class Configure(PETSc.package.NewPackage):
113 def __init__(self, framework):
114 PETSc.package.NewPackage.__init__(self, framework)
115 self.download = ['http://tetgen.berlios.de/files/tetgen1.4.3.tar.gz']
116 self.functions = ['tetrahedralize']
117 self.functionsCxx = [1, structDecl+'void tetrahedralize(char *switches, tetgenio *in, tetgenio *out, tetgenio *addin = NULL, tetgenio *bgmin = NULL);', 'tetrahedralize((char *) "", NULL, NULL)']
118 self.includes = ['tetgen.h']
119 self.liblist = [['libtet.a']]
120 self.cxx = 1
121 self.needsMath = 1
122 self.complex = 1
123 return
124
125 def setupDependencies(self, framework):
126 PETSc.package.NewPackage.setupDependencies(self, framework)
127 self.sharedLibraries = framework.require('PETSc.utilities.sharedLibraries', self)
128 self.make = framework.require('config.programs', self)
129 self.deps = []
130 return
131
132 def Install(self):
133 import os, sys
134 import config.base
135 import fileinput
136
137 libDir = os.path.join(self.installDir, 'lib')
138 includeDir = os.path.join(self.installDir, 'include')
139 makeinc = os.path.join(self.packageDir, 'make.inc')
140 configheader = os.path.join(self.packageDir, 'configureheader.h')
141
142 # This make.inc stuff is completely unnecessary for compiling TetGen. It is
143 # just here for comparing different PETSC_ARCH's
144 self.setCompilers.pushLanguage('C++')
145 g = open(makeinc,'w')
146 g.write('SHELL = '+self.programs.SHELL+'\n')
147 g.write('CP = '+self.programs.cp+'\n')
148 g.write('RM = '+self.programs.RM+'\n')
149 g.write('MKDIR = '+self.programs.mkdir+'\n')
150 g.write('OMAKE = '+self.make.make+' '+self.make.flags+'\n')
151
152 g.write('CLINKER = '+self.setCompilers.getLinker()+'\n')
153 g.write('AR = '+self.setCompilers.AR+'\n')
154 g.write('ARFLAGS = '+self.setCompilers.AR_FLAGS+'\n')
155 g.write('AR_LIB_SUFFIX = '+self.setCompilers.AR_LIB_SUFFIX+'\n')
156 g.write('RANLIB = '+self.setCompilers.RANLIB+'\n')
157 g.write('SL_LINKER_SUFFIX = '+self.setCompilers.sharedLibraryExt+'\n')
158
159 g.write('TETGEN_ROOT = '+self.packageDir+'\n')
160 g.write('PREFIX = '+self.installDir+'\n')
161 g.write('LIBDIR = '+libDir+'\n')
162 g.write('INSTALL_LIB_DIR = '+libDir+'\n')
163 g.write('TETGENLIB = $(LIBDIR)/libtet.$(AR_LIB_SUFFIX)\n')
164 g.write('SHLIB = libtet\n')
165
166 cflags = self.setCompilers.getCompilerFlags().replace('-Wall','').replace('-Wshadow','')
167 cflags += ' '+self.headers.toString('.')
168 cflags += ' -fPIC'
169 predcflags = '-O0 -fPIC' # Need to compile without optimization
170
171 g.write('CC = '+self.setCompilers.getCompiler()+'\n')
172 g.write('CFLAGS = '+cflags+'\n')
173 g.write('PREDCXXFLAGS = '+predcflags+'\n')
174 self.setCompilers.popLanguage()
175 g.close()
176
177 # I'd rather have this than to completely fork TetGen
178 new_file = open(os.path.join(self.packageDir, 'tetgen_def.h'),'w')
179 old_file = open(os.path.join(self.packageDir, 'tetgen.h'))
180 for line in old_file:
181 new_file.write(line.replace('// #define TETLIBRARY', '#define TETLIBRARY'))
182 new_file.close()
183 old_file.close()
184
185 # Now compile & install
186 if self.installNeeded('make.inc'):
187 self.framework.outputHeader(configheader)
188 try:
189 self.logPrintBox('Compiling & installing TetGen; this may take several minutes')
190 output1,err1,ret1 = PETSc.package.NewPackage.executeShellCommand('cd '+self.packageDir+' && make CXX="'+ self.setCompilers.getCompiler() + '" CXXFLAGS="' + cflags + '" PREDCXXFLAGS="' + predcflags + '" tetlib && mv tetgen_def.h tetgen.h && cp *.a ' + libDir + ' && rm *.a *.o', timeout=2500, log = self.framework.log)
191 except RuntimeError, e:
192 raise RuntimeError('Error running make on TetGen: '+str(e))
193 output2,err2,ret2 = PETSc.package.NewPackage.executeShellCommand('cp -f '+os.path.join(self.packageDir, 'tetgen.h')+' '+includeDir, timeout=5, log = self.framework.log)
194 self.postInstall(output1+err1+output2+err2,'make.inc')
195
196 return self.installDir
Note: See TracBrowser for help on using the repository browser.