Skip to content

Commit 4fb42aa

Browse files
committed
updates
1 parent 7c0bd8b commit 4fb42aa

15 files changed

+1058
-180
lines changed

base/PyNucleus_base/performanceLogger.pxd

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ cdef class Timer(FakeTimer):
2424
double startTime_unsynced
2525
double elapsed
2626
double elapsed_unsynced
27-
double startMem
28-
double endMem
27+
readonly double startMem
28+
readonly double endMem
2929
str key
3030
FakePLogger parent
3131
BOOL_t manualDataEntry

base/PyNucleus_base/performanceLogger.pyx

+9
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ cdef class Timer(FakeTimer):
6262
else:
6363
self.memoryRegionsAreEnabled = memRegionsAreEnabled
6464
self.memoryProfiling = self.parent.memoryProfiling
65+
self.startMem = 0.0
66+
self.endMem = 0.0
6567
if self.sync:
6668
assert self.comm is not None
6769

@@ -102,8 +104,15 @@ cdef class Timer(FakeTimer):
102104
def getIntervalUnsynced(self):
103105
return self.elapsed_unsynced
104106

107+
def getMemoryDiff(self):
108+
if self.memoryProfiling:
109+
return self.endMem-self.startMem
110+
else:
111+
return 0.0
112+
105113
interval = property(fget=getInterval)
106114
interval_unsynced = property(fget=getIntervalUnsynced)
115+
diffMemory = property(fget=getMemoryDiff)
107116

108117

109118
cdef class LoggingTimer(Timer):

base/PyNucleus_base/utilsFem.py

+26-27
Original file line numberDiff line numberDiff line change
@@ -411,25 +411,22 @@ def updateFromDefaults(params, defaults):
411411
updateFromDefaults(params[key], defaults[key])
412412

413413

414-
KEY_VAL_FORMAT = '{:<54}{}'
415-
416-
417-
def getMPIinfo():
414+
def getMPIinfo(grp):
418415
from sys import modules
419416
if 'mpi4py.MPI' in modules:
420417
import mpi4py
421418
mpi4py.initialize = False
422419
from mpi4py import MPI
423420
if not MPI.Is_initialized():
424-
return ''
421+
return
425422
t = {MPI.THREAD_SINGLE: 'single',
426423
MPI.THREAD_FUNNELED: 'funneled',
427424
MPI.THREAD_SERIALIZED: 'serialized',
428425
MPI.THREAD_MULTIPLE: 'multiple'}
429426
hosts = MPI.COMM_WORLD.gather(MPI.Get_processor_name())
430427
if MPI.COMM_WORLD.rank == 0:
431428
hosts = ','.join(set(hosts))
432-
s = ['{}'.format(MPI.Get_library_version()[:-1])]
429+
grp.add('MPI library', '{}'.format(MPI.Get_library_version()[:-1]))
433430
for label, value in [('MPI standard supported:', MPI.Get_version()),
434431
('Vendor:', MPI.get_vendor()),
435432
('Level of thread support:', t[MPI.Query_thread()]),
@@ -438,13 +435,10 @@ def getMPIinfo():
438435
('Thread level requested:', mpi4py.rc.thread_level),
439436
('Hosts:', hosts),
440437
('Communicator size:', MPI.COMM_WORLD.size)]:
441-
s.append(KEY_VAL_FORMAT.format(label, value))
442-
return '\n'.join(s)
443-
else:
444-
return ''
438+
grp.add(label, value)
445439

446440

447-
def getEnvVariables(envVars=[('OMP_NUM_THREADS', True)]):
441+
def getEnvVariables(grp, envVars=[('OMP_NUM_THREADS', True)]):
448442
from os import environ
449443
s = []
450444
for var, printNotSet in envVars:
@@ -454,23 +448,22 @@ def getEnvVariables(envVars=[('OMP_NUM_THREADS', True)]):
454448
varVal = 'not set'
455449
else:
456450
continue
457-
s.append(KEY_VAL_FORMAT.format(var+':', varVal))
451+
grp.add(var, varVal)
458452
return '\n'.join(s)
459453

460454

461-
def getSystemInfo(argv=None, envVars=[('OMP_NUM_THREADS', True)]):
455+
def getSystemInfo(grp, argv=None, envVars=[('OMP_NUM_THREADS', True)]):
462456
from sys import executable
463-
s = '\n'
464457
if argv is not None:
465-
s += KEY_VAL_FORMAT.format('Running:', executable + ' ' + ' '.join(argv)) + '\n'
458+
grp.add('Running', executable + ' ' + ' '.join(argv))
466459
else:
467-
s += KEY_VAL_FORMAT.format('Running:', executable) + '\n'
460+
grp.add('Running', executable)
468461
import mpi4py
469462
mpi4py.initialize = False
470463
from mpi4py import MPI
471464
if MPI.Is_initialized():
472-
s += getMPIinfo()+'\n'
473-
s += getEnvVariables(envVars)+'\n'
465+
getMPIinfo(grp)
466+
getEnvVariables(grp, envVars)
474467
import pkg_resources
475468
from PyNucleus import subpackages
476469
versions = {}
@@ -481,17 +474,21 @@ def getSystemInfo(argv=None, envVars=[('OMP_NUM_THREADS', True)]):
481474
except KeyError:
482475
versions[version] = [pkg]
483476
for version in versions:
484-
s += KEY_VAL_FORMAT.format(','.join(versions[version])+':', version)+'\n'
477+
grp.add(','.join(versions[version]), version)
478+
479+
import importlib
480+
485481
versions = {}
486482
for pkg in sorted(subpackages.keys()):
487483
version = pkg_resources.get_distribution('PyNucleus_'+pkg).version
484+
module = importlib.import_module('PyNucleus_'+pkg+'.config')
485+
sha = module.gitSHA
488486
try:
489-
versions[version].append(pkg)
487+
versions[(version, sha)].append(pkg)
490488
except KeyError:
491-
versions[version] = [pkg]
489+
versions[(version, sha)] = [pkg]
492490
for version in versions:
493-
s += KEY_VAL_FORMAT.format('PyNucleus_'+(','.join(versions[version]))+':', version)+'\n'
494-
return s
491+
grp.add('PyNucleus_'+(','.join(versions[version])), version)
495492

496493

497494
class MPIFileHandler(logging.Handler):
@@ -504,6 +501,7 @@ def __init__(self, filename, comm, mode=MPI.MODE_WRONLY | MPI.MODE_CREATE):
504501
# keep the absolute path, otherwise derived classes which use this
505502
# may come a cropper when the current directory changes
506503
self.baseFilename = os.path.abspath(filename)
504+
assert len(self.baseFilename) <= 245, 'The length of the log file path \"{}\" is too long and will probably crash MPI. Try running with \"--disableFileLog\"'.format(self.baseFilename)
507505
if Path(self.baseFilename).exists() and comm.rank == 0:
508506
from os import remove
509507
remove(self.baseFilename)
@@ -1095,11 +1093,12 @@ def process(self, override={}):
10951093
if params['displayConfig']:
10961094
from pprint import pformat
10971095
self.logger.info('\n'+pformat(params))
1096+
1097+
from sys import argv
1098+
sysInfo = self.addOutputGroup('sysInfo')
1099+
getSystemInfo(argv=argv, grp=sysInfo)
10981100
if not params['disableHeader']:
1099-
from sys import argv
1100-
sysInfo = getSystemInfo(argv)
1101-
if self.isMaster:
1102-
self.logger.info(sysInfo)
1101+
self.logger.info('\n'+str(sysInfo))
11031102
if params['logDependencies']:
11041103
dependencyLogger.setLevel(logging.DEBUG)
11051104
else:

docs/example1.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Example 1 - A simple PDE problem
33
================================
44

55
In this first example, we will construct a finite element discretization of a classical PDE problem and solve it.
6-
The full code of this example can be found in ``drivers/example1.py``.
6+
The full code of this example can be found in ``examples/example1.py``.
77

88
Factories
99
---------

docs/example2.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Example 2 - Nonlocal problems
33
=============================
44

55
I this second example, we will assemble and solve several nonlocal equations.
6-
The full code of this example can be found in ``drivers/example2.py``.
6+
The full code of this example can be found in ``examples/example2.py``.
77

88
PyNucleus can assemble operators of the form
99

File renamed without changes.

drivers/example2.py renamed to examples/example2.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@
9494
dmConst = dofmapFactory('P1', meshConst, nIConst['domain'])
9595
dmConstInteraction = dmConst.getComplementDoFMap()
9696

97-
A_const = dmConst.assembleNonlocal(kernelConst, matrixFormat='sparsified')
98-
B_const = dmConst.assembleNonlocal(kernelConst, dm2=dmConstInteraction, matrixFormat='sparsified')
97+
A_const = dmConst.assembleNonlocal(kernelConst, matrixFormat='sparse')
98+
B_const = dmConst.assembleNonlocal(kernelConst, dm2=dmConstInteraction, matrixFormat='sparse')
9999

100100
g = functionFactory('Lambda', lambda x: -(x[0]**2 + x[1]**2)/4)
101101
g_interp = dmConstInteraction.interpolate(g)
@@ -109,7 +109,7 @@
109109

110110
solver(b, u)
111111

112-
u_global = dmConst.augmentWithBoundaryData(u, g_interp)
112+
u_global = u.augmentWithBoundaryData(g_interp)
113113

114114
plt.figure().gca().set_title('Numerical solution, constant kernel')
115115
u_global.plot()
@@ -121,3 +121,4 @@
121121

122122
######################################################################
123123
plt.show()
124+

nl/PyNucleus_nl/clusterMethodCy.pxd

+27-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ from PyNucleus_fem.quadrature cimport (simplexDuffyTransformation,
1313
from PyNucleus_fem.functions cimport function
1414
from PyNucleus_base.myTypes cimport INDEX_t, REAL_t, BOOL_t
1515
from PyNucleus_base.linear_operators cimport (LinearOperator,
16+
VectorLinearOperator,
1617
Dense_LinearOperator,
1718
CSR_LinearOperator,
1819
SSS_LinearOperator)
@@ -76,6 +77,7 @@ cdef class tree_node:
7677
public REAL_t[:, ::1] transferOperator
7778
public REAL_t[:, :, ::1] value
7879
public REAL_t[::1] coefficientsUp, coefficientsDown
80+
public REAL_t[:, ::1] coefficientsDownVec
7981
public BOOL_t mixed_node
8082
public BOOL_t canBeAssembled
8183
public INDEX_t levelNo
@@ -89,15 +91,17 @@ cdef class tree_node:
8991
cdef BOOL_t get_is_leaf(self)
9092
cdef INDEX_t _getLevels(self)
9193
cdef INDEX_t _getParentLevels(self)
92-
cdef void prepareTransferOperators(self, INDEX_t m, transferMatrixBuilder tMB=*)
94+
cdef void prepareTransferOperators(self, INDEX_t m, INDEX_t valueSize, transferMatrixBuilder tMB=*)
9395
cdef void upwardPass(self, REAL_t[::1] x, INDEX_t componentNo=*, BOOL_t skip_leaves=*, BOOL_t local=*)
94-
cdef void resetCoefficientsDown(self)
96+
cdef void resetCoefficientsDown(self, BOOL_t vecValued=*)
9597
cdef void resetCoefficientsUp(self)
9698
cdef void downwardPass(self, REAL_t[::1] y, INDEX_t componentNo=*, BOOL_t local=*)
99+
cdef void downwardPassVec(self, REAL_t[:, ::1] y, INDEX_t componentNo=*, BOOL_t local=*)
97100
cpdef INDEX_t findCell(self, meshBase mesh, REAL_t[::1] vertex, REAL_t[:, ::1] simplex, REAL_t[::1] bary)
98101
cpdef set findCells(self, meshBase mesh, REAL_t[::1] vertex, REAL_t r, REAL_t[:, ::1] simplex)
99102
cdef BOOL_t trim(self, bitArray keep)
100103
cdef void upwardPassMatrix(self, dict coefficientsUp)
104+
cpdef void relabelDoFs(self, INDEX_t[::1] translate)
101105

102106

103107
cdef class productIterator:
@@ -113,7 +117,9 @@ cdef class farFieldClusterPair:
113117
cdef:
114118
public tree_node n1, n2
115119
public REAL_t[:, ::1] kernelInterpolant
120+
public REAL_t[:, :, ::1] kernelInterpolantVec
116121
cpdef void apply(self, REAL_t[::1] x, REAL_t[::1] y)
122+
cpdef void applyVec(farFieldClusterPair self, REAL_t[::1] x, REAL_t[:, ::1] y)
117123

118124

119125
cdef class H2Matrix(LinearOperator):
@@ -135,6 +141,25 @@ cdef class H2Matrix(LinearOperator):
135141
tree_node left) except -1
136142

137143

144+
cdef class VectorH2Matrix(VectorLinearOperator):
145+
cdef:
146+
public VectorLinearOperator Anear
147+
public dict Pfar
148+
public tree_node tree
149+
public FakePLogger PLogger
150+
public LinearOperator basis
151+
public BOOL_t skip_leaves_upward
152+
public REAL_t[::1] leafCoefficientsUp
153+
# cdef INDEX_t matvec(self,
154+
# REAL_t[::1] x,
155+
# REAL_t[:, ::1] y) except -1
156+
# cdef INDEX_t matvec_submat(self,
157+
# REAL_t[::1] x,
158+
# REAL_t[:, ::1] y,
159+
# list right_list,
160+
# tree_node left) except -1
161+
162+
138163
cdef class DistributedH2Matrix_globalData(LinearOperator):
139164
cdef:
140165
public LinearOperator localMat

0 commit comments

Comments
 (0)