Skip to content

Commit b774d79

Browse files
committed
Fix sub-packages
1 parent 10f0431 commit b774d79

36 files changed

+305
-297
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ flake8:
177177
rm flake8.txt
178178

179179
cython-lint:
180-
- cython-lint --max-line-length=160 drivers examples packageTools base metisCy fem multilevelSolver nl tests > cython-lint.txt 2>&1
180+
- cython-lint --max-line-length=160 --ignore="E741" drivers examples packageTools base metisCy fem multilevelSolver nl tests > cython-lint.txt 2>&1
181181
flake8_junit cython-lint.txt cython-lint.xml
182182
rm cython-lint.txt
183183
sed 's/name="flake8"/name="cython-lint"/g' cython-lint.xml > cython-lint2.xml

base/PyNucleus_base/factory.py

-10
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,6 @@ def numRegistered(self, countAliases=False):
5151
return len(self.classes) + len(self.aliases)
5252

5353
def __str__(self):
54-
s = ''
55-
for canonical_name in self.classes:
56-
a = [self.aliases[canonical_alias][0] for canonical_alias in self.aliases if self.aliases[canonical_alias][1] == canonical_name]
57-
s += '{} {} {}\n'.format(canonical_name, a, self.classes[canonical_name])
58-
return s
59-
60-
def __repr__(self):
6154
s = 'Available:\n'
6255
for canonical_name in self.classes:
6356
name = self.classes[canonical_name][0]
@@ -77,6 +70,3 @@ def __repr__(self):
7770
else:
7871
s += '\'{}\', signature: \'{}\'\n'.format(name, sig)
7972
return s
80-
81-
def print(self):
82-
print(repr(self))

base/PyNucleus_base/solver_factory.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ def build(self, name, **kwargs):
9595
solvers[k].setPreconditioner(solvers[k+1].asPreconditioner())
9696
return solvers[0]
9797

98-
def __repr__(self):
98+
def __str__(self):
9999
s = ''
100100
if self.singleLevelSolverFactory.numRegistered() > 0:
101101
s += 'Single level solvers:\n'
102-
s += repr(self.singleLevelSolverFactory)
102+
s += str(self.singleLevelSolverFactory)
103103
if self.multiLevelSolverFactory.numRegistered() > 0:
104104
s += 'Multi level solvers:\n'
105-
s += repr(self.multiLevelSolverFactory)
105+
s += str(self.multiLevelSolverFactory)
106106
return s

base/PyNucleus_base/timestepping.py

+33-28
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ class Stepper:
1515
"""
1616
Solve
1717
18-
f(t, u, u_t) = A(t, u_t) + B(t, u) - g(t) = 0
18+
f(t, u, u_t) = A(t, u_t) + B(t, u) - g(t) = 0.
1919
20-
mass: t, u -> A(t, u)
21-
explicit: t, u -> B(t, u)
22-
forcing: t -> g(t)
20+
We assume that A is linear in its second argument. Let
21+
22+
mass: t, u -> A(t, u)
23+
explicit: t, u -> B(t, u)
24+
forcing: t -> g(t)
2325
implicitSolverBuilder: t, alpha, beta -> solver for alpha*A(t, u)+beta*B(t, u) = g
2426
2527
"""
@@ -51,9 +53,12 @@ def apply_jacobian(self, t, dt, ut, ut_plus_dt, residual, alpha=1., beta=1.):
5153

5254

5355
class CrankNicolson(Stepper):
56+
"""
57+
1/dt*A(t+dt, u_{k+1}) + theta*B(t+dt, u_{k+1}) = (1-theta)*g(t_{k}) + theta*g(t_{k+1}) + 1/dt*A(t_{k}, u_{k}) - (1-theta)*B(t_{k}, u_{k})
58+
"""
5459
def __init__(self, dm, mass, solverBuilder, forcing, explicit=None, theta=0.5, dt=None,
5560
solverIsTimeDependent=False, explicitIslinearAndTimeIndependent=False):
56-
assert theta > 0 and theta <= 1.
61+
assert theta >= 0 and theta <= 1.
5762
self.theta = theta
5863
super(CrankNicolson, self).__init__(dm, mass, solverBuilder, forcing, explicit, dt, solverIsTimeDependent, explicitIslinearAndTimeIndependent)
5964
if self.theta < 1.:
@@ -73,12 +78,16 @@ def getSolver(self, t, dt):
7378
return self.solverBuilder(t+dt, 1./dt, self.theta)
7479

7580
def setRHS(self, t, dt, rhs):
76-
self.forcing(t+dt, rhs)
77-
if self.theta < 1.:
81+
if self.theta > 0. and self.theta < 1.:
82+
self.forcing(t+dt, rhs)
7883
rhs *= self.theta
7984
self.forcing(t, self.rhs2)
8085
self.rhs2 *= (1.-self.theta)
8186
rhs += self.rhs2
87+
elif self.theta == 0.:
88+
self.forcing(t, rhs)
89+
elif self.theta == 1.:
90+
self.forcing(t+dt, rhs)
8291

8392
def step(self, t, dt, u, forcingVector=None):
8493
if dt is None:
@@ -105,6 +114,9 @@ def step(self, t, dt, u, forcingVector=None):
105114
return t+dt
106115

107116
def residual(self, t, dt, ut, ut_plus_dt, residual, alpha=1., beta=1., forcingVector=None):
117+
# alpha/dt*[A(t+dt, ut_plus_dt) - A(t, ut)]
118+
# + beta*[(1-theta)*B(t, ut) + theta*B(t+dt, ut_plus_dt)]
119+
# - (1-theta)*g(t) - theta*g(t+dt)
108120
if abs(alpha/dt) > 0:
109121
self.mass(t, ut, self.rhs)
110122
self.mass(t+dt, ut_plus_dt, self.rhs2)
@@ -134,6 +146,8 @@ def residual(self, t, dt, ut, ut_plus_dt, residual, alpha=1., beta=1., forcingVe
134146
residual -= self.rhs
135147

136148
def apply_jacobian(self, t, dt, ut, ut_plus_dt, residual, alpha=1., beta=1.):
149+
# alpha/dt*[A(t+dt, ut_plus_dt) - A(t, ut)]
150+
# + beta*[(1-theta)*B(t, ut) + theta*B(t+dt, ut_plus_dt)]
137151
if abs(alpha/dt) > 0:
138152
self.mass(t, ut, self.rhs)
139153
self.mass(t+dt, ut_plus_dt, self.rhs2)
@@ -157,30 +171,21 @@ def apply_jacobian(self, t, dt, ut, ut_plus_dt, residual, alpha=1., beta=1.):
157171
residual += self.rhs2
158172

159173

160-
class ExplicitEuler(Stepper):
161-
def __init__(self, dm, mass, solverBuilder, forcing, explicit, solverIsTimeDependent=False):
162-
assert explicit is not None
163-
super(ExplicitEuler, self).__init__(dm, mass, solverBuilder, forcing, explicit, 0., solverIsTimeDependent)
164-
self.rhs = self.dm.zeros()
165-
self.rhs2 = self.dm.zeros()
166-
167-
def step(self, t, dt, u):
168-
self.forcing(t+dt, self.rhs)
169-
self.rhs *= dt
170-
self.explicit(t, u, self.rhs2)
171-
self.rhs2 *= -dt
172-
self.rhs += self.rhs2
173-
if not self.solverIsTimeDependent:
174-
solver = self.solver
175-
else:
176-
solver = self.solverBuilder(t+dt, 0.)
177-
if isinstance(solver, iterative_solver):
178-
solver.setInitialGuess(u)
179-
solver(self.rhs, u)
180-
return t+dt
174+
class ExplicitEuler(CrankNicolson):
175+
"""
176+
1/dt*A(t+dt, u_{k+1}) = g(t_{k}) + 1/dt*A(t_{k}, u_{k}) - B(t_{k}, u_{k})
177+
"""
178+
def __init__(self, dm, mass, solverBuilder, forcing, explicit=None, dt=None, solverIsTimeDependent=False):
179+
super(ExplicitEuler, self).__init__(dm, mass, solverBuilder, forcing, explicit,
180+
dt=dt,
181+
theta=0.,
182+
solverIsTimeDependent=solverIsTimeDependent)
181183

182184

183185
class ImplicitEuler(CrankNicolson):
186+
"""
187+
1/dt*A(t+dt, u_{k+1}) + B(t+dt, u_{k+1}) = g(t_{k+1}) + 1/dt*A(t_{k}, u_{k})
188+
"""
184189
def __init__(self, dm, mass, solverBuilder, forcing, explicit=None, dt=None, solverIsTimeDependent=False):
185190
super(ImplicitEuler, self).__init__(dm, mass, solverBuilder, forcing, explicit,
186191
dt=dt,

base/PyNucleus_base/utilsFem.py

+24-15
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def saveDictToHDF5(params, f, ignore=set()):
310310
def loadDictFromHDF5(f):
311311
import h5py
312312
from . linear_operators import LinearOperator
313-
from PyNucleus.fem.DoFMaps import DoFMap
313+
from PyNucleus_fem.DoFMaps import DoFMap
314314
params = {}
315315
for key in f.attrs:
316316
if isinstance(f.attrs[key], h5py.Empty):
@@ -352,7 +352,7 @@ def loadDictFromHDF5(f):
352352
else:
353353
params[key] = LinearOperator.HDF5read(f[key])
354354
elif 'vertices' in f[key] and 'cells' in f[key]:
355-
from PyNucleus.fem.mesh import meshNd
355+
from PyNucleus_fem.mesh import meshNd
356356
params[key] = meshNd.HDF5read(f[key])
357357
else:
358358
params[key] = loadDictFromHDF5(f[key])
@@ -369,7 +369,7 @@ def loadDictFromHDF5(f):
369369

370370

371371
def processDictForYaml(params):
372-
from PyNucleus.fem.functions import function
372+
from PyNucleus_fem.functions import function
373373
paramsNew = {}
374374
for key in params:
375375
if isinstance(params[key], dict):
@@ -411,7 +411,7 @@ def updateFromDefaults(params, defaults):
411411
updateFromDefaults(params[key], defaults[key])
412412

413413

414-
def getMPIinfo(grp):
414+
def getMPIinfo(grp, verbose=False):
415415
from sys import modules
416416
if 'mpi4py.MPI' in modules:
417417
import mpi4py
@@ -427,13 +427,15 @@ def getMPIinfo(grp):
427427
if MPI.COMM_WORLD.rank == 0:
428428
hosts = ','.join(set(hosts))
429429
grp.add('MPI library', '{}'.format(MPI.Get_library_version()[:-1]))
430-
for label, value in [('MPI standard supported', MPI.Get_version()),
431-
('Vendor', MPI.get_vendor()),
432-
('Level of thread support', t[MPI.Query_thread()]),
433-
('Is threaded', MPI.Is_thread_main()),
434-
('Threads requested', mpi4py.rc.threads),
435-
('Thread level requested', mpi4py.rc.thread_level),
436-
('Hosts', hosts),
430+
if verbose:
431+
for label, value in [('MPI standard supported', MPI.Get_version()),
432+
('Vendor', MPI.get_vendor()),
433+
('Level of thread support', t[MPI.Query_thread()]),
434+
('Is threaded', MPI.Is_thread_main()),
435+
('Threads requested', mpi4py.rc.threads),
436+
('Thread level requested', mpi4py.rc.thread_level)]:
437+
grp.add(label, value)
438+
for label, value in [('Hosts', hosts),
437439
('Communicator size', MPI.COMM_WORLD.size)]:
438440
grp.add(label, value)
439441

@@ -487,8 +489,8 @@ def getSystemInfo(grp, argv=None, envVars=[('OMP_NUM_THREADS', True)]):
487489
versions[(version, sha)].append(pkg)
488490
except KeyError:
489491
versions[(version, sha)] = [pkg]
490-
for version in versions:
491-
grp.add('PyNucleus_'+(','.join(versions[version])), version)
492+
for version, sha in versions:
493+
grp.add('PyNucleus_'+(','.join(versions[(version, sha)])), '{}, {}'.format(version, sha))
492494

493495

494496
class MPIFileHandler(logging.Handler):
@@ -1382,6 +1384,7 @@ def runDriver(path, py, python=None, timeout=600, ranks=None, cacheDir='',
13821384
py += ['--overwriteCache']
13831385
else:
13841386
py += ['--test']
1387+
py += ['--disableFileLog']
13851388
if extra is not None:
13861389
plotDir.mkdir(exist_ok=True, parents=True)
13871390
py += ['--plotFolder={}'.format(plotDir), '--plotFormat=png']
@@ -1444,7 +1447,7 @@ def __init__(self, name, params=[]):
14441447
fields.append('True|False')
14451448
else:
14461449
raise NotImplementedError()
1447-
self.regexp = re.compile(name+'\('+','.join(['\s*(' + f + ')\s*' for f in fields])+'\)')
1450+
self.regexp = re.compile(name+'\(?'+','.join(['\s*(' + f + ')\s*' for f in fields])+'\)?')
14481451

14491452
def match(self, s):
14501453
return self.regexp.match(s) is not None
@@ -1841,7 +1844,13 @@ def processCmdline(self, params):
18411844
pass
18421845

18431846
def getIdentifier(self, params):
1844-
return ''
1847+
from sys import argv
1848+
identifier = '-'.join(argv)
1849+
pos = identifier.rfind('/')
1850+
if pos >= 0:
1851+
return identifier[pos+1:]
1852+
else:
1853+
return identifier
18451854

18461855
def process(self, params):
18471856
self.processCmdline(params)

docs/PyNucleus_base.rst

+19-19
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,111 @@
11

2-
PyNucleus.base package
2+
PyNucleus_base package
33
=======================
44

55
.. automodule:: PyNucleus_base
66

77

8-
PyNucleus.base.blas module
8+
PyNucleus_base.blas module
99
---------------------------
1010

1111
.. automodule:: PyNucleus_base.blas
1212

1313

14-
PyNucleus.base.convergence module
14+
PyNucleus_base.convergence module
1515
----------------------------------
1616

1717
.. automodule:: PyNucleus_base.convergence
1818

1919

20-
PyNucleus.base.factory module
20+
PyNucleus_base.factory module
2121
------------------------------
2222

2323
.. automodule:: PyNucleus_base.factory
2424

2525

26-
PyNucleus.base.intTuple module
26+
PyNucleus_base.intTuple module
2727
-------------------------------
2828

2929
.. automodule:: PyNucleus_base.intTuple
3030

3131

32-
PyNucleus.base.ip.norm module
32+
PyNucleus_base.ip.norm module
3333
-------------------------------
3434

3535
.. automodule:: PyNucleus_base.ip_norm
3636

3737

38-
PyNucleus.base.linalg module
38+
PyNucleus_base.linalg module
3939
-----------------------------
4040

4141
.. automodule:: PyNucleus_base.linalg
4242

4343

44-
PyNucleus.base.linear.operators module
44+
PyNucleus_base.linear.operators module
4545
----------------------------------------
4646

4747
.. automodule:: PyNucleus_base.linear_operators
4848

4949

50-
PyNucleus.base.memProfile module
50+
PyNucleus_base.memProfile module
5151
---------------------------------
5252

5353
.. automodule:: PyNucleus_base.memProfile
5454

5555

56-
PyNucleus.base.myTypes module
56+
PyNucleus_base.myTypes module
5757
------------------------------
5858

5959
.. automodule:: PyNucleus_base.myTypes
6060

6161

62-
PyNucleus.base.performanceLogger module
62+
PyNucleus_base.performanceLogger module
6363
----------------------------------------
6464

6565
.. automodule:: PyNucleus_base.performanceLogger
6666

6767

68-
PyNucleus.base.plot.utils module
68+
PyNucleus_base.plot.utils module
6969
----------------------------------
7070

7171
.. automodule:: PyNucleus_base.plot_utils
7272

7373

74-
PyNucleus.base.solver.factory module
74+
PyNucleus_base.solver.factory module
7575
--------------------------------------
7676

7777
.. automodule:: PyNucleus_base.solver_factory
7878

7979

80-
PyNucleus.base.solvers module
80+
PyNucleus_base.solvers module
8181
------------------------------
8282

8383
.. automodule:: PyNucleus_base.solvers
8484

85-
PyNucleus.base.sparseGraph module
85+
PyNucleus_base.sparseGraph module
8686
----------------------------------
8787

8888
.. automodule:: PyNucleus_base.sparseGraph
8989

90-
PyNucleus.base.sparsityPattern module
90+
PyNucleus_base.sparsityPattern module
9191
--------------------------------------
9292

9393
.. automodule:: PyNucleus_base.sparsityPattern
9494

9595

96-
PyNucleus.base.tupleDict module
96+
PyNucleus_base.tupleDict module
9797
--------------------------------
9898

9999
.. automodule:: PyNucleus_base.tupleDict
100100

101101

102-
PyNucleus.base.utilsCy module
102+
PyNucleus_base.utilsCy module
103103
------------------------------
104104

105105
.. automodule:: PyNucleus_base.utilsCy
106106

107107

108-
PyNucleus.base.utilsFem module
108+
PyNucleus_base.utilsFem module
109109
-------------------------------
110110

111111
.. automodule:: PyNucleus_base.utilsFem

0 commit comments

Comments
 (0)