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.
Files changed (111) hide show
  1. {feectools-0.2.0/feectools.egg-info → feectools-0.3.0}/PKG-INFO +1 -1
  2. {feectools-0.2.0 → feectools-0.3.0}/feectools/api/essential_bc.py +3 -0
  3. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/cart.py +72 -13
  4. feectools-0.3.0/feectools/ddm/tests/test_coarsen.py +67 -0
  5. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/stencil.py +1 -1
  6. feectools-0.3.0/feectools/linalg/tests/test_axpy_ghost_sync.py +31 -0
  7. {feectools-0.2.0 → feectools-0.3.0/feectools.egg-info}/PKG-INFO +1 -1
  8. {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/SOURCES.txt +2 -0
  9. {feectools-0.2.0 → feectools-0.3.0}/pyproject.toml +1 -1
  10. {feectools-0.2.0 → feectools-0.3.0}/AUTHORS +0 -0
  11. {feectools-0.2.0 → feectools-0.3.0}/LICENSE +0 -0
  12. {feectools-0.2.0 → feectools-0.3.0}/README.md +0 -0
  13. {feectools-0.2.0 → feectools-0.3.0}/feectools/__init__.py +0 -0
  14. {feectools-0.2.0 → feectools-0.3.0}/feectools/accelerate/__init__.py +0 -0
  15. {feectools-0.2.0 → feectools-0.3.0}/feectools/accelerate/accelerate.py +0 -0
  16. {feectools-0.2.0 → feectools-0.3.0}/feectools/accelerate/compile_psydac.mk +0 -0
  17. {feectools-0.2.0 → feectools-0.3.0}/feectools/api/__init__.py +0 -0
  18. {feectools-0.2.0 → feectools-0.3.0}/feectools/api/fem_bilinear_form.py +0 -0
  19. {feectools-0.2.0 → feectools-0.3.0}/feectools/api/fem_common.py +0 -0
  20. {feectools-0.2.0 → feectools-0.3.0}/feectools/api/fem_sum_form.py +0 -0
  21. {feectools-0.2.0 → feectools-0.3.0}/feectools/api/settings.py +0 -0
  22. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/__init__.py +0 -0
  23. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/bsplines.py +0 -0
  24. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/bsplines_kernels.py +0 -0
  25. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/field_evaluation_kernels.py +0 -0
  26. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/__init__.py +0 -0
  27. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/test_bsplines.py +0 -0
  28. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/test_bsplines_kernel.py +0 -0
  29. {feectools-0.2.0 → feectools-0.3.0}/feectools/core/tests/test_bsplines_pyccel.py +0 -0
  30. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/__init__.py +0 -0
  31. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/basic.py +0 -0
  32. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/blocking_data_exchanger.py +0 -0
  33. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/interface_data_exchanger.py +0 -0
  34. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/mpi.py +0 -0
  35. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/nonblocking_data_exchanger.py +0 -0
  36. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/partition.py +0 -0
  37. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/petsc.py +0 -0
  38. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/__init__.py +0 -0
  39. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_cart_1d.py +0 -0
  40. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_cart_2d.py +0 -0
  41. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_cart_3d.py +0 -0
  42. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_multicart_2d.py +0 -0
  43. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/tests/test_partition.py +0 -0
  44. {feectools-0.2.0 → feectools-0.3.0}/feectools/ddm/utilities.py +0 -0
  45. {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/__init__.py +0 -0
  46. {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/derivatives.py +0 -0
  47. {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/dof_kernels.py +0 -0
  48. {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/global_geometric_projectors.py +0 -0
  49. {feectools-0.2.0 → feectools-0.3.0}/feectools/feec/hodge.py +0 -0
  50. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/__init__.py +0 -0
  51. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/basic.py +0 -0
  52. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/grid.py +0 -0
  53. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/lst_preconditioner.py +0 -0
  54. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/partitioning.py +0 -0
  55. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/projectors.py +0 -0
  56. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/splines.py +0 -0
  57. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tensor.py +0 -0
  58. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/__init__.py +0 -0
  59. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/analytical_profiles_1d.py +0 -0
  60. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/analytical_profiles_base.py +0 -0
  61. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/splines_error_bounds.py +0 -0
  62. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_dirichlet_projectors.py +0 -0
  63. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_spline_histopolation.py +0 -0
  64. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_spline_interpolation.py +0 -0
  65. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_splines.py +0 -0
  66. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_splines_par.py +0 -0
  67. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_tensor.py +0 -0
  68. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/test_vector_spaces.py +0 -0
  69. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/tests/utilities.py +0 -0
  70. {feectools-0.2.0 → feectools-0.3.0}/feectools/fem/vector.py +0 -0
  71. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/__init__.py +0 -0
  72. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/basic.py +0 -0
  73. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/block.py +0 -0
  74. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/direct_solvers.py +0 -0
  75. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/fft.py +0 -0
  76. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/__init__.py +0 -0
  77. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/axpy_kernels.py +0 -0
  78. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/inner_kernels.py +0 -0
  79. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/matvec_kernels.py +0 -0
  80. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/stencil2IJV_kernels.py +0 -0
  81. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/stencil2coo_kernels.py +0 -0
  82. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kernels/transpose_kernels.py +0 -0
  83. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/kron.py +0 -0
  84. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/memory.py +0 -0
  85. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/solvers.py +0 -0
  86. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/sparse.py +0 -0
  87. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/stencil_dot_kernels.py +0 -0
  88. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/stencil_transpose_kernels.py +0 -0
  89. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/__init__.py +0 -0
  90. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_block.py +0 -0
  91. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_fft.py +0 -0
  92. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_kron_stencil_matrix.py +0 -0
  93. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_linalg.py +0 -0
  94. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_matrix_free.py +0 -0
  95. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_solvers.py +0 -0
  96. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_stencil_interface_matrix.py +0 -0
  97. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_stencil_vector.py +0 -0
  98. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_stencil_vector_space.py +0 -0
  99. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/test_toarray.py +0 -0
  100. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/tests/utilities.py +0 -0
  101. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/topetsc.py +0 -0
  102. {feectools-0.2.0 → feectools-0.3.0}/feectools/linalg/utilities.py +0 -0
  103. {feectools-0.2.0 → feectools-0.3.0}/feectools/utilities/__init__.py +0 -0
  104. {feectools-0.2.0 → feectools-0.3.0}/feectools/utilities/quadratures.py +0 -0
  105. {feectools-0.2.0 → feectools-0.3.0}/feectools/utilities/utils.py +0 -0
  106. {feectools-0.2.0 → feectools-0.3.0}/feectools/version.py +0 -0
  107. {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/dependency_links.txt +0 -0
  108. {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/entry_points.txt +0 -0
  109. {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/requires.txt +0 -0
  110. {feectools-0.2.0 → feectools-0.3.0}/feectools.egg-info/top_level.txt +0 -0
  111. {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.2.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
- global_starts: list of list of int
418
- The starts of the coefficients for every process along each direction.
420
+ global_element_starts : list of list of int
421
+ The element starts for every process along each direction.
419
422
 
420
- global_ends: list of list of int
421
- The ends of the coefficients for every process along each direction.
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 : CartDecomposition
426
- Cartesian decomposition of the refined domain.
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
- domain = DomainDecomposition(self.ncells, self.periods, comm=self.comm,
434
- global_comm=self.global_comm, num_threads=self.num_threads,
435
- size=self.size)
436
- domain._ncells = tuple ( ncells )
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 = tuple(global_element_starts)
440
- domain._global_element_ends = tuple(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(self._starts, self._ends))
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
- x._sync = x._sync and y._sync
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.2.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.2.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