Skip to content

Commit 528154d

Browse files
committed
updates
1 parent 07ee407 commit 528154d

29 files changed

+963
-776
lines changed

.github/workflows/build.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ jobs:
4747
OMPI_CXX: ${{ matrix.cxx-compiler }}
4848
BUILD_PRETTY_IDENTIFIER: "Linux ${{ matrix.c-compiler }} Python ${{ matrix.py-version }}"
4949
BUILD_IDENTIFIER: "Linux-${{ matrix.c-compiler }}-${{ matrix.py-version }}"
50+
OMP_NUM_THREADS: 1
5051

5152
steps:
5253
- name: Check out repo
@@ -70,7 +71,7 @@ jobs:
7071
if: always()
7172
run: |
7273
sudo apt-get update
73-
sudo apt-get install mpi-default-bin mpi-default-dev libmetis-dev libparmetis-dev libsuitesparse-dev ccache
74+
sudo apt-get install -yq mpi-default-bin mpi-default-dev libmetis-dev libparmetis-dev libsuitesparse-dev ccache
7475
7576
- name: Get ccache config dir
7677
if: always()
@@ -149,7 +150,7 @@ jobs:
149150
fail-fast: false
150151
name: Mac clang Python ${{ matrix.py-version }}
151152

152-
runs-on: macos-latest
153+
runs-on: macos-12
153154
timeout-minutes: 180
154155
env:
155156
MPIEXEC_FLAGS: "--allow-run-as-root --oversubscribe"
@@ -158,6 +159,7 @@ jobs:
158159
SUITESPARSE_LIBRARY_DIR: /usr/local/Cellar/brewsci-suite-sparse/4.5.5_2/lib
159160
LDFLAGS: -L/usr/local/opt/brewsci-metis/lib -L/usr/local/opt/brewsci-parmetis/lib
160161
CPPFLAGS: -I/usr/local/opt/brewsci-metis/include -I/usr/local/opt/brewsci-parmetis/include
162+
OMP_NUM_THREADS: 1
161163

162164
steps:
163165
- name: Check out repo

base/PyNucleus_base/utilsFem.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -1356,7 +1356,7 @@ def diffDict(d1, d2, aTol, relTol):
13561356
return diff
13571357

13581358

1359-
def runDriver(path, py, python=None, timeout=600, ranks=None, cacheDir='',
1359+
def runDriver(path, py, python=None, timeout=900, ranks=None, cacheDir='',
13601360
overwriteCache=False,
13611361
aTol=1e-12, relTol=1e-2, extra=None):
13621362
from subprocess import Popen, PIPE, TimeoutExpired
@@ -1481,6 +1481,7 @@ def declareGeneratedProperties(self, props):
14811481
self.declareGeneratedProperty(prop)
14821482

14831483
def __call__(self):
1484+
from PyNucleus_fem.DoFMaps import fe_vector, complex_fe_vector
14841485
cached_args = {}
14851486
args = []
14861487
needToBuild = False
@@ -1499,6 +1500,14 @@ def __call__(self):
14991500
needToBuild = True
15001501
else:
15011502
dependencyLogger.log(self.logLevel, 'Values for {} are identical: \'{}\' == \'{}\''.format(prop, oldValue, newValue))
1503+
elif isinstance(newValue, (fe_vector, complex_fe_vector)):
1504+
cached_args[prop] = newValue.copy()
1505+
if oldValue is None or (newValue.toarray() != oldValue.toarray()).any():
1506+
dependencyLogger.log(self.logLevel, 'Values for {} differ: \'{}\' != \'{}\', calling \'{}\''.format(prop, oldValue,
1507+
newValue, self.fun.__name__))
1508+
needToBuild = True
1509+
else:
1510+
dependencyLogger.log(self.logLevel, 'Values for {} are identical: \'{}\' == \'{}\''.format(prop, oldValue, newValue))
15021511
elif newValue != oldValue:
15031512
cached_args[prop] = newValue
15041513
dependencyLogger.log(self.logLevel, 'Values for {} differ: \'{}\' != \'{}\', calling \'{}\''.format(prop, oldValue,

fem/PyNucleus_fem/algebraicOverlaps.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1312,7 +1312,7 @@ cdef class algebraicOverlapManager:
13121312
v[i] = m
13131313
m += 1
13141314
self.unique(v)
1315-
return np.array(v, copy=False, dtype=INDEX)
1315+
return np.asarray(v, dtype=INDEX)
13161316

13171317
def __repr__(self):
13181318
s = ''

fem/PyNucleus_fem/distributed_operators_{SCALAR}.pxi

+2-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ cdef class {SCALAR_label}CSR_DistributedLinearOperator({SCALAR_label}Distributed
127127

128128
k = 0
129129
for i in range(self.num_rows):
130-
if self.overlap_indices[k] == i:
130+
if k < self.overlap_indices.shape[0] and self.overlap_indices[k] == i:
131131
k += 1
132132
continue
133133
temp = 0.0
@@ -173,7 +173,7 @@ cdef class {SCALAR_label}CSR_DistributedLinearOperator({SCALAR_label}Distributed
173173

174174
k = 0
175175
for i in range(self.num_rows):
176-
if self.overlap_indices[k] == i:
176+
if k < self.overlap_indices.shape[0] and self.overlap_indices[k] == i:
177177
k += 1
178178
continue
179179
temp = rhs[i]

fem/PyNucleus_fem/pdeProblems.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ def n(x):
231231
else:
232232
raise NotImplementedError(problem)
233233
elif domain == 'cube':
234-
self.noRef = 5
234+
self.noRef = 6
235235

236236
def n(x):
237237
if x[2] == 0:

multilevelSolver/PyNucleus_multilevelSolver/connectors.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ def build(self):
241241
with self.Timer('Building distribute from \'{}\' to \'{}\''.format(label1, self.label2)):
242242
self.algOM.prepareDistributeRepartition(dm)
243243
if self.debugOverlaps:
244-
from PyNucleus_fem import solSin1D, solSin2D, solSin3D
244+
from PyNucleus_fem.factories import solSin1D, solSin2D, solSin3D
245245
if subdomain.dim == 1:
246246
xOld = dm.interpolate(solSin1D)
247247
elif subdomain.dim == 2:
@@ -270,7 +270,7 @@ def build(self):
270270
with self.Timer('Building distribute from \'{}\' to \'{}\''.format(label1, self.label2)):
271271
self.algOMnew.prepareDistributeRepartition(dmNew)
272272
if self.debugOverlaps:
273-
from PyNucleus_fem import solSin1D, solSin2D, solSin3D
273+
from PyNucleus_fem.factories import solSin1D, solSin2D, solSin3D
274274
if subdomainNew.dim == 1:
275275
xNew = dmNew.interpolate(solSin1D)
276276
elif subdomainNew.dim == 2:
@@ -312,7 +312,7 @@ def build(self):
312312
self.algOM.prepareDistributeRepartitionSend(dm)
313313
self.algOMnew.prepareDistributeRepartition(dmNew, doSend=False)
314314
if self.debugOverlaps:
315-
from PyNucleus_fem import solSin1D, solSin2D, solSin3D
315+
from PyNucleus_fem.factories import solSin1D, solSin2D, solSin3D
316316
if subdomain.dim == 1:
317317
xOld = dm.interpolate(solSin1D)
318318
elif subdomain.dim == 2:

multilevelSolver/PyNucleus_multilevelSolver/geometricMG.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def paramsForSerialMG(noRef, global_params):
3535

3636

3737
def paramsForMG(noRef, onRanks, global_params, dim, element, repartitionFactor=0.05,
38-
max_coarse_grid_size=5000):
38+
max_coarse_grid_size=4500):
3939
from . connectors import repartitionConnector
4040

4141
numProcsAvail = len(onRanks)
@@ -61,7 +61,7 @@ def paramsForMG(noRef, onRanks, global_params, dim, element, repartitionFactor=0
6161
else:
6262
raise NotImplementedError()
6363
elif dim == 3:
64-
numInitialCells = 6
64+
numInitialCells = 48
6565
if element in ('P1', 1):
6666
cells2dofsFactor = 1./6.
6767
elif element in ('P2', 2):

multilevelSolver/PyNucleus_multilevelSolver/hierarchies.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def build(self):
154154
multLvlAlgOvManager.levels[lvl].prepareDistribute()
155155

156156
if self.params['debugOverlaps']:
157-
from PyNucleus_fem import solSin1D, solSin2D, solSin3D
157+
from PyNucleus_fem.factories import solSin1D, solSin2D, solSin3D
158158
for lvl in range(len(self.algebraicLevels)):
159159
if self.algebraicLevels[lvl].DoFMap is not None:
160160
dm = self.algebraicLevels[lvl].DoFMap

nl/PyNucleus_nl/interactionDomains.pyx

+36-6
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ cdef class interactionDomain(parametrizedTwoPointFunction):
295295
return interactionDomain, (self.horizonFun, self.complement, self.symmetric)
296296

297297
def getLongDescription(self):
298-
return ''
298+
return 'MISSING DESCRIPTION'
299299

300300

301301
cdef class barycenterDomain(interactionDomain):
@@ -659,7 +659,8 @@ cdef class retriangulationDomain(interactionDomain):
659659
self.A_Node[self.iterEnd_Node, outside2, outside2] = c2
660660
self.vol_Node[self.iterEnd_Node] = bary[outside1]*c2+bary[outside2]*c1-c1*c2
661661
self.iterEnd_Node += 1
662-
else:
662+
elif numIntersections == 2:
663+
663664
self.A_Node[self.iterEnd_Node, :, :] = 0.
664665
self.A_Node[self.iterEnd_Node, inside, inside] = 1
665666
self.A_Node[self.iterEnd_Node, outside1, outside1] = c1
@@ -687,6 +688,26 @@ cdef class retriangulationDomain(interactionDomain):
687688
self.vol_Node[self.iterEnd_Node] = c2*(1-intersections[1])
688689
self.iterEnd_Node += 1
689690

691+
else:
692+
693+
self.A_Node[self.iterEnd_Node, :, :] = 0.
694+
self.A_Node[self.iterEnd_Node, inside, inside] = 1
695+
self.A_Node[self.iterEnd_Node, outside1, outside1] = c1
696+
self.A_Node[self.iterEnd_Node, inside, outside1] = 1-c1
697+
self.A_Node[self.iterEnd_Node, outside2, outside2] = intersections[0]
698+
self.A_Node[self.iterEnd_Node, outside1, outside2] = 1-intersections[0]
699+
self.vol_Node[self.iterEnd_Node] = c1*intersections[0]
700+
self.iterEnd_Node += 1
701+
702+
self.A_Node[self.iterEnd_Node, :, :] = 0.
703+
self.A_Node[self.iterEnd_Node, inside, inside] = 1
704+
self.A_Node[self.iterEnd_Node, outside1, outside1] = 1-intersections[0]
705+
self.A_Node[self.iterEnd_Node, outside2, outside1] = intersections[0]
706+
self.A_Node[self.iterEnd_Node, outside2, outside2] = c2
707+
self.A_Node[self.iterEnd_Node, inside, outside2] = 1-c2
708+
self.vol_Node[self.iterEnd_Node] = c2*(1-intersections[0])
709+
self.iterEnd_Node += 1
710+
690711
elif numInside == 2:
691712
outside = 0
692713
while ind[outside]:
@@ -1561,6 +1582,9 @@ cdef class ellipse_barycenter(linearTransformInteraction):
15611582
def __reduce__(self):
15621583
return ellipse_barycenter, (self.horizonFun, self.a, self.b, self.theta)
15631584

1585+
def getLongDescription(self):
1586+
return '\\chi_{ellipse(x,y;a,b,\\theta)<\\delta}'
1587+
15641588

15651589
cdef class ball1_retriangulation(linearTransformInteraction):
15661590
"l1 ball interaction domain"
@@ -1662,7 +1686,7 @@ cdef class ball1_barycenter(linearTransformInteraction):
16621686

16631687
cdef class ball2_dilation_barycenter(barycenterDomain):
16641688
def __init__(self, sqrtAffineFunction horizonFun):
1665-
super(ball2_dilation_barycenter, self).__init__(horizonFun, False, False)
1689+
super(ball2_dilation_barycenter, self).__init__(horizonFun, False, True)
16661690
self.c = horizonFun.c
16671691
self.d = np.linalg.norm(horizonFun.w)
16681692
self.w = np.array(horizonFun.w)/self.d
@@ -1799,10 +1823,13 @@ cdef class ball2_dilation_barycenter(barycenterDomain):
17991823
def __reduce__(self):
18001824
return ballInf_retriangulation, (self.horizonFun, )
18011825

1826+
def getLongDescription(self):
1827+
return '\\chi_{|x-y|_2<\\delta(x)} \\chi_{|x-y|_2<\\delta(y)}'
1828+
18021829

18031830
cdef class ball2_dilation_retriangulation(retriangulationDomain):
18041831
def __init__(self, sqrtAffineFunction horizonFun):
1805-
super(ball2_dilation_retriangulation, self).__init__(horizonFun, False, False)
1832+
super(ball2_dilation_retriangulation, self).__init__(horizonFun, False, True)
18061833
self.c = horizonFun.c
18071834
self.d = np.linalg.norm(horizonFun.w)
18081835
self.w = np.array(horizonFun.w)/self.d
@@ -1946,11 +1973,11 @@ cdef class ball2_dilation_retriangulation(retriangulationDomain):
19461973
A = -p*0.5
19471974
B = sqrt(A**2-q)
19481975
c = A-B
1949-
if (c >= 0) and (c <= 1):
1976+
if (c >= -1e-12) and (c <= 1+1e-12):
19501977
intersections[numIntersections] = c
19511978
numIntersections += 1
19521979
c = A+B
1953-
if (c >= 0) and (c <= 1):
1980+
if (c >= -1e-12) and (c <= 1+1e-12):
19541981
intersections[numIntersections] = c
19551982
numIntersections += 1
19561983
return numIntersections
@@ -2030,3 +2057,6 @@ cdef class ball2_dilation_retriangulation(retriangulationDomain):
20302057
break
20312058
if doExit:
20322059
break
2060+
2061+
def getLongDescription(self):
2062+
return '\\chi_{|x-y|_2<\\delta(x)} \\chi_{|x-y|_2<\\delta(y)}'

nl/PyNucleus_nl/kernel_params.pxi

+1
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,4 @@ cpdef enum:
9595
GREENS_3D = 7
9696
EXPONENTIAL = 8
9797
POLYNOMIAL = 9
98+
PERIODIC_FRACTIONAL = 10

nl/PyNucleus_nl/kernels.py

+6
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@ def getFractionalKernel(dim,
157157
phi = fac
158158
kernel = FractionalKernel(dim_, sFun, horizonFun, interaction, scaling, phi, piecewise=piecewise, boundary=boundary,
159159
derivative=derivative, tempered=tempered, max_horizon=max_horizon)
160+
161+
from . twoPointFunctions import parametrizedTwoPointFunction
162+
if isinstance(kernel.scaling, parametrizedTwoPointFunction):
163+
assert kernel.getParamPtrAddr() == kernel.scaling.getParamPtrAddr()
164+
if isinstance(kernel.interaction, parametrizedTwoPointFunction):
165+
assert kernel.getParamPtrAddr() == kernel.interaction.getParamPtrAddr()
160166
return kernel
161167

162168

0 commit comments

Comments
 (0)