Skip to content

Commit ce61877

Browse files
authored
PhysicallyMapped: implement point_evaluation (#144)
* PhysicallyMapped: implement point_evaluation
1 parent 79ea05d commit ce61877

15 files changed

+105
-53
lines changed

finat/cube.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,12 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
7777

7878
return self.product.basis_evaluation(order, ps, self._unflatten[entity])
7979

80-
def point_evaluation(self, order, point, entity=None):
80+
def point_evaluation(self, order, point, entity=None, coordinate_mapping=None):
8181
if entity is None:
8282
entity = (self.cell.get_spatial_dimension(), 0)
8383

84-
return self.product.point_evaluation(order, point, self._unflatten[entity])
84+
return self.product.point_evaluation(order, point, self._unflatten[entity],
85+
coordinate_mapping)
8586

8687
@property
8788
def dual_basis(self):

finat/direct_serendipity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
122122

123123
return result
124124

125-
def point_evaluation(self, order, refcoords, entity=None):
125+
def point_evaluation(self, order, point, entity=None, coordinate_mapping=None):
126126
raise NotImplementedError("Not done yet, sorry!")
127127

128128
def mapping(self):

finat/discontinuous.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ def fiat_equivalent(self):
6868
def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
6969
return self.element.basis_evaluation(order, ps, entity, coordinate_mapping=coordinate_mapping)
7070

71-
def point_evaluation(self, order, refcoords, entity=None):
72-
return self.element.point_evaluation(order, refcoords, entity)
71+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
72+
return self.element.point_evaluation(order, refcoords, entity, coordinate_mapping)
7373

7474
@property
7575
def dual_basis(self):

finat/enriched.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
125125
for element in self.elements]
126126
return self._compose_evaluations(results)
127127

128-
def point_evaluation(self, order, refcoords, entity=None):
128+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
129129
'''Return code for evaluating the element at an arbitrary points on
130130
the reference element.
131131
@@ -136,7 +136,7 @@ def point_evaluation(self, order, refcoords, entity=None):
136136
free indices are arbitrary.
137137
:param entity: the cell entity on which to tabulate.
138138
'''
139-
results = [element.point_evaluation(order, refcoords, entity)
139+
results = [element.point_evaluation(order, refcoords, entity, coordinate_mapping)
140140
for element in self.elements]
141141
return self._compose_evaluations(results)
142142

finat/fiat_elements.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
156156
result[alpha] = expr
157157
return result
158158

159-
def point_evaluation(self, order, refcoords, entity=None):
159+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
160160
'''Return code for evaluating the element at an arbitrary points on
161161
the reference element.
162162
@@ -166,6 +166,9 @@ def point_evaluation(self, order, refcoords, entity=None):
166166
a vector with the correct dimension, its
167167
free indices are arbitrary.
168168
:param entity: the cell entity on which to tabulate.
169+
:param coordinate_mapping: a
170+
:class:`~.physically_mapped.PhysicalGeometry` object that
171+
provides physical geometry callbacks (may be None).
169172
'''
170173
if entity is None:
171174
entity = (self.cell.get_dimension(), 0)

finat/finiteelementbase.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
165165
'''
166166

167167
@abstractmethod
168-
def point_evaluation(self, order, refcoords, entity=None):
168+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
169169
'''Return code for evaluating the element at an arbitrary points on
170170
the reference element.
171171
@@ -175,6 +175,9 @@ def point_evaluation(self, order, refcoords, entity=None):
175175
a vector with the correct dimension, its
176176
free indices are arbitrary.
177177
:param entity: the cell entity on which to tabulate.
178+
:param coordinate_mapping: a
179+
:class:`~.physically_mapped.PhysicalGeometry` object that
180+
provides physical geometry callbacks (may be None).
178181
'''
179182

180183
@property

finat/hdivcurl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
7474
core_eval = self.wrappee.basis_evaluation(order, ps, entity)
7575
return self._transform_evaluation(core_eval)
7676

77-
def point_evaluation(self, order, refcoords, entity=None):
77+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
7878
core_eval = self.wrappee.point_evaluation(order, refcoords, entity)
7979
return self._transform_evaluation(core_eval)
8080

finat/mixed.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
9191
core_eval = self.element.basis_evaluation(order, ps, entity, coordinate_mapping=coordinate_mapping)
9292
return self._transform_evaluation(core_eval)
9393

94-
def point_evaluation(self, order, refcoords, entity=None):
94+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
9595
core_eval = self.element.point_evaluation(order, refcoords, entity)
9696
return self._transform_evaluation(core_eval)
9797

finat/physically_mapped.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def basis_transformation(self, coordinate_mapping):
264264
:arg coordinate_mapping: Object providing physical geometry."""
265265
pass
266266

267-
def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
267+
def map_tabulation(self, tabulation, coordinate_mapping):
268268
assert coordinate_mapping is not None
269269

270270
M = self.basis_transformation(coordinate_mapping)
@@ -281,13 +281,15 @@ def matvec(table):
281281
val = gem.ListTensor(expressions)
282282
return gem.optimise.aggressive_unroll(val)
283283

284-
result = super().basis_evaluation(order, ps, entity=entity)
284+
return {alpha: matvec(tabulation[alpha]) for alpha in tabulation}
285285

286-
return {alpha: matvec(table)
287-
for alpha, table in result.items()}
286+
def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
287+
result = super().basis_evaluation(order, ps, entity=entity)
288+
return self.map_tabulation(result, coordinate_mapping)
288289

289-
def point_evaluation(self, order, refcoords, entity=None):
290-
raise NotImplementedError("TODO: not yet thought about it")
290+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
291+
result = super().point_evaluation(order, refcoords, entity=entity)
292+
return self.map_tabulation(result, coordinate_mapping)
291293

292294

293295
class DirectlyDefinedElement(NeedsCoordinateMappingElement):

finat/quadrature_element.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def basis_evaluation(self, order, ps, entity=None, coordinate_mapping=None):
149149
sd = self.cell.get_spatial_dimension()
150150
return {(0,) * sd: gem.ComponentTensor(delta, basis_indices)}
151151

152-
def point_evaluation(self, order, refcoords, entity=None):
152+
def point_evaluation(self, order, refcoords, entity=None, coordinate_mapping=None):
153153
raise NotImplementedError("QuadratureElement cannot do point evaluation!")
154154

155155
@property

0 commit comments

Comments
 (0)