1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """
20 Helping functionalities.
21 """
24 """
25 Print message to a stream.
26
27 @ivar _streams: list of (stream, filename) tuples to be used..
28 @itype _streams: list
29 """
30
32 import sys, os
33 import warnings
34 self.prefix = kw.pop('prefix', '')
35 self.postfix = kw.pop('postfix', '')
36 self.override = kw.pop('override', False)
37 self.force_flush = kw.pop('force_flush', True)
38
39 if not isinstance(streams, list) and not isinstance(streams, tuple):
40 streams = [streams]
41 self._streams = []
42 for stream in streams:
43 if isinstance(stream, str):
44 if stream == 'sys.stdout':
45 self._streams.append((sys.stdout, None))
46 else:
47 if not self.override and os.path.exists(stream):
48 warnings.warn('file %s overriden.' % stream,
49 UserWarning)
50 self._streams.append((open(stream, 'w'), stream))
51 else:
52 self._streams.append((stream, None))
53
54 @property
56 return (s[0] for s in self._streams)
57
59 msg = ''.join([self.prefix, msg, self.postfix])
60 for stream in self.streams:
61 stream.write(msg)
62 if self.force_flush:
63 stream.flush()
64
97 info = Information()
100 """
101 Use epydoc to generate API doc.
102 """
103 import os
104 from epydoc.docbuilder import build_doc_index
105 from epydoc.docwriter.html import HTMLWriter
106 docindex = build_doc_index(['solvcon'], introspect=True, parse=True,
107 add_submodules=True)
108 html_writer = HTMLWriter(docindex)
109
110 outputdir = os.path.join(*outputdir.split('/'))
111 if not os.path.exists(outputdir):
112 os.makedirs(outputdir)
113 html_writer.write(outputdir)
114
116 """
117 @return: flag under windows or not.
118 @rtype: bool
119 """
120 import sys
121 if sys.platform.startswith('win'):
122 return True
123 else:
124 return False
125
127 import os
128 try:
129 username = os.getlogin()
130 except:
131 username = None
132 if not username:
133 username = os.environ['LOGNAME']
134 return username
135
137 """
138 Search for something in the file system all the way up from the specified
139 location to the root.
140
141 @param loc: the location to start searching.
142 @type loc: str
143 @param name: the searching target.
144 @type name: str
145 @return: the absolute path to the FS item.
146 @rtype: str
147 """
148 import os
149 item = ''
150 loc = os.path.abspath(loc)
151 while True:
152 if os.path.exists(os.path.join(loc, name)):
153 item = os.path.join(loc, name)
154 break
155 parent = os.path.dirname(loc)
156 if loc == parent:
157 break
158 else:
159 loc = parent
160 return os.path.abspath(item) if item else item
161
163 """
164 Delegate Cubit command through journaling file and load the generated mesh.
165
166 @ivar cmds: commands to be sent to Cubit.
167 @itype cmds: list
168 @ivar ndim: number of dimensions.
169 @itype ndim: int
170 @ivar large: use large file of Genesis/ExodusII or not.
171 @itype large: bool
172 """
173 - def __init__(self, cmds, ndim, large=False):
174 self.cmds = cmds
175 self.ndim = ndim
176 self.large = large
177 self.stdout = None
179 """
180 Launch Cubit for generating mesh and then load the generated
181 Genesis/ExodusII file.
182
183 @return: the loaded Genesis object.
184 @rtype: solvcon.io.genesis.Genesis
185 """
186 from tempfile import mkdtemp
187 import os, shutil
188 from subprocess import Popen, PIPE, STDOUT
189 from .io.genesis import Genesis
190
191 wdir = mkdtemp()
192 joup = os.path.join(wdir, 'jou.jou')
193 gnp = os.path.join(wdir, 'gn.g')
194
195 cmds = self.cmds[:]
196 cmds.insert(0, 'cd "%s"' % wdir)
197 cmds.append('set large exodus file %s' % 'on' if self.large else 'off')
198 cmds.append('export genesis "%s" dimension %d overwrite' % (
199 gnp, self.ndim))
200 jouf = open(joup, 'w')
201 jouf.write('\n'.join(cmds))
202 jouf.close()
203
204 cli = 'cubit -nographics -batch -nojournal -input %s' % joup
205 try:
206 pobj = Popen(cli, shell=True, stdout=PIPE, stderr=STDOUT)
207 self.stdout = pobj.stdout.read()
208 gn = Genesis(gnp)
209 gn.load()
210 gn.close_file()
211 except:
212 gn = None
213 finally:
214 shutil.rmtree(wdir)
215 return gn
216