5
5
from enum import IntEnum
6
6
from firedrake .petsc import PETSc
7
7
from firedrake .embedding import get_embedding_dg_element
8
+ from .utils import get_level
8
9
9
10
10
11
__all__ = ("TransferManager" , )
@@ -40,7 +41,7 @@ class Cache(object):
40
41
"""A caching object for work vectors and matrices.
41
42
42
43
:arg element: The element to use for the caching."""
43
- def __init__ (self , ufl_element , value_shape ):
44
+ def __init__ (self , ufl_element , value_shape , boundary_set ):
44
45
self .embedding_element = get_embedding_dg_element (ufl_element , value_shape )
45
46
self ._dat_versions = {}
46
47
self ._V_DG_mass = {}
@@ -65,7 +66,6 @@ def __init__(self, *, native_transfers=None, use_averaging=True):
65
66
"""
66
67
self .native_transfers = native_transfers or {}
67
68
self .use_averaging = use_averaging
68
- self .caches = {}
69
69
70
70
def is_native (self , element , op ):
71
71
if element in self .native_transfers .keys ():
@@ -87,14 +87,17 @@ def _native_transfer(self, element, op):
87
87
return None
88
88
89
89
def cache (self , V ):
90
- key = (V .ufl_element (), V .value_shape )
90
+ mh , _ = get_level (V .mesh ())
91
+ caches = mh ._shared_data_cache ["transfer_manager_cache" ]
92
+ key = (V .ufl_element (), V .value_shape , V .boundary_set )
91
93
try :
92
- return self . caches [key ]
94
+ return caches [key ]
93
95
except KeyError :
94
- return self . caches .setdefault (key , TransferManager .Cache (* key ))
96
+ return caches .setdefault (key , TransferManager .Cache (* key ))
95
97
96
98
def cache_key (self , V ):
97
- return (V .dim (), V .boundary_set )
99
+ _ , level = get_level (V .mesh ())
100
+ return level
98
101
99
102
def V_dof_weights (self , V ):
100
103
"""Dof weights for averaging projection.
0 commit comments