feectools 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {feectools-0.2.0/feectools.egg-info → feectools-0.3.0}/PKG-INFO +1 -1
- {feectools-0.2.0 → feectools-0.3.0}/feectools/api/essential_bc.py +3 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/cart.py +72 -13
- feectools-0.3.0/feectools/ddm/tests/test_coarsen.py +67 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/stencil.py +1 -1
- feectools-0.3.0/feectools/linalg/tests/test_axpy_ghost_sync.py +31 -0
- {feectools-0.2.0 → feectools-0.3.0/feectools.egg-info}/PKG-INFO +1 -1
- {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/SOURCES.txt +2 -0
- {feectools-0.2.0 → feectools-0.3.0}/pyproject.toml +1 -1
- {feectools-0.2.0 → feectools-0.3.0}/AUTHORS +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/LICENSE +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/README.md +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/accelerate/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/accelerate/accelerate.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/accelerate/compile_psydac.mk +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/api/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/api/fem_bilinear_form.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/api/fem_common.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/api/fem_sum_form.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/api/settings.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/bsplines.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/bsplines_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/field_evaluation_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/test_bsplines.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/test_bsplines_kernel.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/test_bsplines_pyccel.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/basic.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/blocking_data_exchanger.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/interface_data_exchanger.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/mpi.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/nonblocking_data_exchanger.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/partition.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/petsc.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_cart_1d.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_cart_2d.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_cart_3d.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_multicart_2d.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_partition.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/utilities.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/derivatives.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/dof_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/global_geometric_projectors.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/hodge.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/basic.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/grid.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/lst_preconditioner.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/partitioning.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/projectors.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/splines.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tensor.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/analytical_profiles_1d.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/analytical_profiles_base.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/splines_error_bounds.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_dirichlet_projectors.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_spline_histopolation.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_spline_interpolation.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_splines.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_splines_par.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_tensor.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_vector_spaces.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/utilities.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/vector.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/basic.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/block.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/direct_solvers.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/fft.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/axpy_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/inner_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/matvec_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/stencil2IJV_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/stencil2coo_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/transpose_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kron.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/memory.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/solvers.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/sparse.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/stencil_dot_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/stencil_transpose_kernels.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_block.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_fft.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_kron_stencil_matrix.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_linalg.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_matrix_free.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_solvers.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_stencil_interface_matrix.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_stencil_vector.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_stencil_vector_space.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_toarray.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/utilities.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/topetsc.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/utilities.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/utilities/__init__.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/utilities/quadratures.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/utilities/utils.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools/version.py +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/dependency_links.txt +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/entry_points.txt +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/requires.txt +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/top_level.txt +0 -0
- {feectools-0.2.0 → feectools-0.3.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: feectools
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Slimmed-down fork of Psydac (https://github.com/pyccel/psydac) with less functionality and fewer dependencies.
|
|
5
5
|
Author-email: Psydac development team <psydac@googlegroups.com>
|
|
6
6
|
Maintainer-email: Stefan Possanner <stefan.possanner@ipp.mpg.de>, Max Lindqvist <max.lindqvist@ipp.mpg.de>, Yaman Güçlü <yaman.guclu@gmail.com>, Martin Campos Pinto <martin.campos-pinto@ipp.mpg.de>, Ahmed Ratnani <ratnaniahmed@gmail.com>
|
|
@@ -72,6 +72,9 @@ def apply_essential_bc_stencil(a, *, axis, ext, order, identity=False):
|
|
|
72
72
|
if isinstance(a, StencilVector):
|
|
73
73
|
V = a.space
|
|
74
74
|
n = V.ndim
|
|
75
|
+
# Boundary entries may be ghost entries of neighbouring processes, which
|
|
76
|
+
# all call this function: their ghost regions are no longer up to date.
|
|
77
|
+
a.ghost_regions_in_sync = False
|
|
75
78
|
elif isinstance(a, StencilMatrix):
|
|
76
79
|
V = a.codomain
|
|
77
80
|
n = V.ndim * 2
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
|
|
3
|
+
import copy
|
|
3
4
|
import os
|
|
4
5
|
import numpy as np
|
|
5
6
|
import cunumpy as xp
|
|
@@ -409,42 +410,100 @@ class DomainDecomposition:
|
|
|
409
410
|
def refine(self, ncells, global_element_starts, global_element_ends):
|
|
410
411
|
""" Create the new Cartesian decomposition of the refined domain.
|
|
411
412
|
|
|
413
|
+
The process topology (and its communicators) is shared with ``self``.
|
|
414
|
+
|
|
412
415
|
Parameters
|
|
413
416
|
----------
|
|
414
417
|
ncells : list or tuple of int
|
|
415
418
|
Number of cells of refined space.
|
|
416
419
|
|
|
417
|
-
|
|
418
|
-
The starts
|
|
420
|
+
global_element_starts : list of list of int
|
|
421
|
+
The element starts for every process along each direction.
|
|
419
422
|
|
|
420
|
-
|
|
421
|
-
The ends
|
|
423
|
+
global_element_ends : list of list of int
|
|
424
|
+
The element ends for every process along each direction.
|
|
422
425
|
|
|
423
426
|
Returns
|
|
424
427
|
-------
|
|
425
|
-
domain :
|
|
426
|
-
|
|
428
|
+
domain : DomainDecomposition
|
|
429
|
+
Domain decomposition of the refined domain.
|
|
427
430
|
"""
|
|
428
431
|
|
|
429
432
|
# Check input arguments
|
|
430
433
|
assert len( ncells ) == len( self.ncells )
|
|
431
434
|
assert all(nc>=snc for nc, snc in zip(ncells, self.ncells))
|
|
432
435
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
436
|
+
return self._with_element_partition(ncells, global_element_starts, global_element_ends)
|
|
437
|
+
|
|
438
|
+
def coarsen(self, factors):
|
|
439
|
+
""" Create the Cartesian decomposition of a coarsened domain, aligned with ``self``.
|
|
440
|
+
|
|
441
|
+
Along axis ``i`` every ``factors[i]`` consecutive cells are merged into one coarse cell.
|
|
442
|
+
Each process owns the coarse cells covering exactly its fine cells, so the process
|
|
443
|
+
topology (and its communicators) is shared with ``self``. This requires that the
|
|
444
|
+
element starts and ends+1 of every process are divisible by ``factors[i]``.
|
|
445
|
+
|
|
446
|
+
Parameters
|
|
447
|
+
----------
|
|
448
|
+
factors : list or tuple of int
|
|
449
|
+
Coarsening factor (>= 1) along each direction.
|
|
450
|
+
|
|
451
|
+
Returns
|
|
452
|
+
-------
|
|
453
|
+
domain : DomainDecomposition
|
|
454
|
+
Domain decomposition of the coarse domain.
|
|
455
|
+
"""
|
|
456
|
+
|
|
457
|
+
assert len( factors ) == self.ndim
|
|
458
|
+
assert all( isinstance(f, (int, np.integer)) and f >= 1 for f in factors )
|
|
459
|
+
|
|
460
|
+
ncells = []
|
|
461
|
+
global_element_starts = []
|
|
462
|
+
global_element_ends = []
|
|
463
|
+
for axis, f in enumerate(factors):
|
|
464
|
+
gs = xp.asarray(self._global_element_starts[axis])
|
|
465
|
+
ge = xp.asarray(self._global_element_ends [axis])
|
|
466
|
+
if self._ncells[axis] % f != 0 or xp.any(gs % f != 0) or xp.any((ge + 1) % f != 0):
|
|
467
|
+
raise ValueError(
|
|
468
|
+
f"Cannot coarsen axis {axis} by a factor {f}: ncells={self._ncells[axis]}, "
|
|
469
|
+
f"element starts={gs.tolist()}, ends={ge.tolist()} are not all aligned."
|
|
470
|
+
)
|
|
471
|
+
ncells.append(self._ncells[axis] // f)
|
|
472
|
+
global_element_starts.append(xp.array(gs // f))
|
|
473
|
+
global_element_ends .append(xp.array((ge + 1) // f - 1))
|
|
474
|
+
|
|
475
|
+
return self._with_element_partition(ncells, global_element_starts, global_element_ends)
|
|
476
|
+
|
|
477
|
+
def _with_element_partition(self, ncells, global_element_starts, global_element_ends):
|
|
478
|
+
""" Return a copy of ``self`` with the same process topology but a new element partition.
|
|
479
|
+
|
|
480
|
+
Communicators are shared (not duplicated), hence this method is not collective.
|
|
481
|
+
"""
|
|
482
|
+
|
|
483
|
+
assert len( ncells ) == self.ndim
|
|
484
|
+
for axis in range(self.ndim):
|
|
485
|
+
gs = xp.asarray(global_element_starts[axis])
|
|
486
|
+
ge = xp.asarray(global_element_ends [axis])
|
|
487
|
+
assert len(gs) == len(ge) == self._nprocs[axis], \
|
|
488
|
+
f"Axis {axis}: need one block per process ({self._nprocs[axis]}), got {len(gs)}."
|
|
489
|
+
assert gs[0] == 0 and ge[-1] == ncells[axis] - 1, \
|
|
490
|
+
f"Axis {axis}: blocks must cover [0, {ncells[axis] - 1}]."
|
|
491
|
+
assert xp.all(ge >= gs), f"Axis {axis}: empty blocks are not allowed."
|
|
492
|
+
assert xp.all(gs[1:] == ge[:-1] + 1), f"Axis {axis}: blocks must be contiguous."
|
|
493
|
+
|
|
494
|
+
domain = copy.copy(self)
|
|
495
|
+
domain._ncells = tuple( int(n) for n in ncells )
|
|
437
496
|
|
|
438
497
|
# Store arrays with all the starts and ends along each direction for every process
|
|
439
|
-
domain._global_element_starts =
|
|
440
|
-
domain._global_element_ends =
|
|
498
|
+
domain._global_element_starts = list(global_element_starts)
|
|
499
|
+
domain._global_element_ends = list(global_element_ends)
|
|
441
500
|
if self.is_comm_null:return domain
|
|
442
501
|
|
|
443
502
|
# Start/end values of global indices (without ghost regions)
|
|
444
503
|
domain._starts = tuple( domain._global_element_starts[axis][c] for axis,c in zip(range(self._ndims), self._coords) )
|
|
445
504
|
domain._ends = tuple( domain._global_element_ends [axis][c] for axis,c in zip(range(self._ndims), self._coords) )
|
|
446
505
|
|
|
447
|
-
domain._local_ncells = tuple(e-s+1 for s,e in zip(
|
|
506
|
+
domain._local_ncells = tuple(e-s+1 for s,e in zip(domain._starts, domain._ends))
|
|
448
507
|
return domain
|
|
449
508
|
|
|
450
509
|
#==================================================================================
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pytest
|
|
3
|
+
|
|
4
|
+
from feectools.ddm.cart import DomainDecomposition
|
|
5
|
+
from feectools.ddm.mpi import mpi as MPI
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _comm(parallel):
|
|
9
|
+
return MPI.COMM_WORLD if parallel else None
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _as_list(arrs):
|
|
13
|
+
return [np.asarray(a).tolist() for a in arrs]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@pytest.mark.parametrize("parallel", [False, pytest.param(True, marks=pytest.mark.mpi)])
|
|
17
|
+
@pytest.mark.parametrize("periods", [(True, True, True), (False, True, False)])
|
|
18
|
+
def test_coarsen(parallel, periods):
|
|
19
|
+
comm = _comm(parallel)
|
|
20
|
+
fine = DomainDecomposition([32, 16, 8], periods, comm=comm)
|
|
21
|
+
coarse = fine.coarsen([2, 4, 1])
|
|
22
|
+
|
|
23
|
+
assert coarse.ncells == (16, 4, 8)
|
|
24
|
+
assert coarse.periods == fine.periods
|
|
25
|
+
assert tuple(coarse.nprocs) == tuple(fine.nprocs)
|
|
26
|
+
assert coarse.comm_cart is fine.comm_cart
|
|
27
|
+
assert tuple(coarse.coords) == tuple(fine.coords)
|
|
28
|
+
|
|
29
|
+
# every process owns exactly the coarse cells covering its fine cells
|
|
30
|
+
for axis, f in enumerate([2, 4, 1]):
|
|
31
|
+
assert coarse.starts[axis] * f == fine.starts[axis]
|
|
32
|
+
assert (coarse.ends[axis] + 1) * f == fine.ends[axis] + 1
|
|
33
|
+
assert coarse.local_ncells[axis] * f == fine.local_ncells[axis]
|
|
34
|
+
|
|
35
|
+
# the original object is untouched
|
|
36
|
+
assert fine.ncells == (32, 16, 8)
|
|
37
|
+
|
|
38
|
+
# refining back gives the original partition
|
|
39
|
+
back = coarse.refine(
|
|
40
|
+
fine.ncells,
|
|
41
|
+
[np.asarray(s) * f for s, f in zip(coarse.global_element_starts, [2, 4, 1])],
|
|
42
|
+
[(np.asarray(e) + 1) * f - 1 for e, f in zip(coarse.global_element_ends, [2, 4, 1])],
|
|
43
|
+
)
|
|
44
|
+
assert back.ncells == fine.ncells
|
|
45
|
+
assert _as_list(back.global_element_starts) == _as_list(fine.global_element_starts)
|
|
46
|
+
assert _as_list(back.global_element_ends) == _as_list(fine.global_element_ends)
|
|
47
|
+
assert back.starts == fine.starts
|
|
48
|
+
assert back.ends == fine.ends
|
|
49
|
+
assert back.local_ncells == fine.local_ncells
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@pytest.mark.parametrize("parallel", [False, pytest.param(True, marks=pytest.mark.mpi)])
|
|
53
|
+
def test_coarsen_repeated(parallel):
|
|
54
|
+
comm = _comm(parallel)
|
|
55
|
+
dd = DomainDecomposition([64, 32, 1], (True, True, True), comm=comm, mpi_dims_mask=[True, True, False])
|
|
56
|
+
for _ in range(3):
|
|
57
|
+
dd = dd.coarsen([2, 2, 1])
|
|
58
|
+
assert dd.ncells == (8, 4, 1)
|
|
59
|
+
assert dd.local_ncells[2] == 1
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_coarsen_misaligned():
|
|
63
|
+
dd = DomainDecomposition([6, 4, 4], (True, True, True))
|
|
64
|
+
with pytest.raises(ValueError):
|
|
65
|
+
dd.coarsen([4, 1, 1])
|
|
66
|
+
with pytest.raises(AssertionError):
|
|
67
|
+
dd.coarsen([0, 1, 1])
|
|
@@ -332,7 +332,7 @@ class StencilVectorSpace(VectorSpace):
|
|
|
332
332
|
import cupy as cp
|
|
333
333
|
y._interface_data[axis, ext][:] = cp.asarray(y_int_np)
|
|
334
334
|
|
|
335
|
-
|
|
335
|
+
y._sync = x._sync and y._sync
|
|
336
336
|
|
|
337
337
|
#--------------------------------------
|
|
338
338
|
# Other properties/methods
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from feectools.ddm.cart import DomainDecomposition, CartDecomposition
|
|
2
|
+
from feectools.linalg.stencil import StencilVectorSpace
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def _space():
|
|
6
|
+
dd = DomainDecomposition([8, 8], [True, True])
|
|
7
|
+
cart = CartDecomposition(dd, [8, 8], [[0], [0]], [[7], [7]], [2, 2], [1, 1])
|
|
8
|
+
return StencilVectorSpace(cart)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_axpy_ghost_sync():
|
|
12
|
+
"""y += a*x must mark y out of sync if x is, and must not modify the flag of x."""
|
|
13
|
+
V = _space()
|
|
14
|
+
x, y = V.zeros(), V.zeros()
|
|
15
|
+
|
|
16
|
+
x.ghost_regions_in_sync = False
|
|
17
|
+
y.ghost_regions_in_sync = True
|
|
18
|
+
y.mul_iadd(2.0, x)
|
|
19
|
+
assert not y.ghost_regions_in_sync
|
|
20
|
+
assert not x.ghost_regions_in_sync
|
|
21
|
+
|
|
22
|
+
x.ghost_regions_in_sync = True
|
|
23
|
+
y.ghost_regions_in_sync = False
|
|
24
|
+
y.mul_iadd(2.0, x)
|
|
25
|
+
assert not y.ghost_regions_in_sync
|
|
26
|
+
assert x.ghost_regions_in_sync
|
|
27
|
+
|
|
28
|
+
x.ghost_regions_in_sync = True
|
|
29
|
+
y.ghost_regions_in_sync = True
|
|
30
|
+
y.mul_iadd(2.0, x)
|
|
31
|
+
assert y.ghost_regions_in_sync
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: feectools
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Slimmed-down fork of Psydac (https://github.com/pyccel/psydac) with less functionality and fewer dependencies.
|
|
5
5
|
Author-email: Psydac development team <psydac@googlegroups.com>
|
|
6
6
|
Maintainer-email: Stefan Possanner <stefan.possanner@ipp.mpg.de>, Max Lindqvist <max.lindqvist@ipp.mpg.de>, Yaman Güçlü <yaman.guclu@gmail.com>, Martin Campos Pinto <martin.campos-pinto@ipp.mpg.de>, Ahmed Ratnani <ratnaniahmed@gmail.com>
|
|
@@ -41,6 +41,7 @@ feectools/ddm/tests/__init__.py
|
|
|
41
41
|
feectools/ddm/tests/test_cart_1d.py
|
|
42
42
|
feectools/ddm/tests/test_cart_2d.py
|
|
43
43
|
feectools/ddm/tests/test_cart_3d.py
|
|
44
|
+
feectools/ddm/tests/test_coarsen.py
|
|
44
45
|
feectools/ddm/tests/test_multicart_2d.py
|
|
45
46
|
feectools/ddm/tests/test_partition.py
|
|
46
47
|
feectools/feec/__init__.py
|
|
@@ -91,6 +92,7 @@ feectools/linalg/kernels/stencil2IJV_kernels.py
|
|
|
91
92
|
feectools/linalg/kernels/stencil2coo_kernels.py
|
|
92
93
|
feectools/linalg/kernels/transpose_kernels.py
|
|
93
94
|
feectools/linalg/tests/__init__.py
|
|
95
|
+
feectools/linalg/tests/test_axpy_ghost_sync.py
|
|
94
96
|
feectools/linalg/tests/test_block.py
|
|
95
97
|
feectools/linalg/tests/test_fft.py
|
|
96
98
|
feectools/linalg/tests/test_kron_stencil_matrix.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "feectools"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.0"
|
|
8
8
|
description = "Slimmed-down fork of Psydac (https://github.com/pyccel/psydac) with less functionality and fewer dependencies."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">= 3.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|