From bee34848c248b0a15b96665e8521eb067266f57a Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sat, 4 Sep 2021 22:37:09 -0500
Subject: [PATCH] inverse_surface_metric_derivative_mat: add, use
 times_area_element keyword arg

---
 grudge/geometry/metrics.py | 16 +++++++++++++---
 grudge/op.py               | 32 ++++++++++++++------------------
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/grudge/geometry/metrics.py b/grudge/geometry/metrics.py
index 1ce02ce2..24c5f8a2 100644
--- a/grudge/geometry/metrics.py
+++ b/grudge/geometry/metrics.py
@@ -414,7 +414,8 @@ def inverse_surface_metric_derivative(
 
 
 def inverse_surface_metric_derivative_mat(
-        actx: ArrayContext, dcoll: DiscretizationCollection, dd=None):
+        actx: ArrayContext, dcoll: DiscretizationCollection, dd=None,
+        *, times_area_element=False):
     r"""Computes the matrix of inverse surface metric derivatives, indexed by
     ``(xyz_axis, rst_axis)``. It returns all values of
     :func:`inverse_surface_metric_derivative_mat` in cached matrix form.
@@ -423,16 +424,25 @@ def inverse_surface_metric_derivative_mat(
 
     :arg dd: a :class:`~grudge.dof_desc.DOFDesc`, or a value convertible to one.
         Defaults to the base volume discretization.
+    :arg times_area_element: If *True*, each entry of the matrix is premultiplied
+        with the value of :func:`area_element`, reflecting the typical use
+        of the matrix in integrals evaluating weak derivatives.
     :returns: a :class:`~meshmode.dof_array.DOFArray` containing the
         inverse metric derivatives in per-group arrays of shape
         ``(xyz_dimension, rst_dimension, nelements, ndof)``.
     """
 
-    @memoize_in(dcoll, (inverse_surface_metric_derivative_mat, dd))
+    @memoize_in(dcoll, (inverse_surface_metric_derivative_mat, dd,
+        times_area_element))
     def _inv_surf_metric_deriv():
+        if times_area_element:
+            multiplier = area_element(actx, dcoll, dd=dd)
+        else:
+            multiplier = 1
+
         mat = actx.np.stack([
                 actx.np.stack(
-                    [inverse_surface_metric_derivative(actx, dcoll,
+                    [multiplier * inverse_surface_metric_derivative(actx, dcoll,
                         rst_axis, xyz_axis, dd=dd)
                         for rst_axis in range(dcoll.dim)])
                 for xyz_axis in range(dcoll.ambient_dim)])
diff --git a/grudge/op.py b/grudge/op.py
index 5176a710..4aac9881 100644
--- a/grudge/op.py
+++ b/grudge/op.py
@@ -306,32 +306,30 @@ def weak_local_grad(dcoll: DiscretizationCollection, *args, nested=False):
         else:
             return np.stack(grad, axis=0)
 
-    from grudge.geometry import \
-        inverse_surface_metric_derivative_mat, area_element
+    from grudge.geometry import inverse_surface_metric_derivative_mat
 
     in_discr = dcoll.discr_from_dd(dd_in)
     out_discr = dcoll.discr_from_dd(dof_desc.DD_VOLUME)
 
     actx = vec.array_context
-    area_elements = area_element(actx, dcoll, dd=dd_in)
-    inverse_jac_mat = inverse_surface_metric_derivative_mat(actx, dcoll, dd=dd_in)
+    inverse_jac_mat = inverse_surface_metric_derivative_mat(actx, dcoll, dd=dd_in,
+            times_area_element=True)
 
     per_group_grads = [
         # r for rst axis
         # x for xyz axis
-        actx.einsum("rij,ej,ej,xrej->xei",
+        actx.einsum("rij,ej,xrej->xei",
                     reference_stiffness_transpose_matrix(
                         actx,
                         out_element_group=out_grp,
                         in_element_group=in_grp
                     ),
-                    ae_i,
                     vec_i,
                     ijm_i,
-                    arg_names=("ref_stiffT_mat", "jac", "vec", "inv_jac_t"),
+                    arg_names=("ref_stiffT_mat", "vec", "inv_jac_t"),
                     tagged=(FirstAxisIsElementsTag(),))
-        for out_grp, in_grp, vec_i, ae_i, ijm_i in zip(
-            out_discr.groups, in_discr.groups, vec, area_elements,
+        for out_grp, in_grp, vec_i, ijm_i in zip(
+            out_discr.groups, in_discr.groups, vec,
             inverse_jac_mat)]
 
     return make_obj_array([
@@ -374,33 +372,31 @@ def weak_local_d_dx(dcoll: DiscretizationCollection, *args):
     else:
         raise TypeError("invalid number of arguments")
 
-    from grudge.geometry import \
-        inverse_surface_metric_derivative_mat, area_element
+    from grudge.geometry import inverse_surface_metric_derivative_mat
 
     in_discr = dcoll.discr_from_dd(dd_in)
     out_discr = dcoll.discr_from_dd(dof_desc.DD_VOLUME)
 
     actx = vec.array_context
-    area_elements = area_element(actx, dcoll, dd=dd_in)
-    inverse_jac_mat = inverse_surface_metric_derivative_mat(actx, dcoll, dd=dd_in)
+    inverse_jac_mat = inverse_surface_metric_derivative_mat(actx, dcoll, dd=dd_in,
+            times_area_element=True)
 
     return DOFArray(
         actx,
         data=tuple(
-            actx.einsum("dij,ej,ej,dej->ei",
+            actx.einsum("dij,ej,dej->ei",
                         reference_stiffness_transpose_matrix(
                             actx,
                             out_element_group=out_grp,
                             in_element_group=in_grp
                         ),
-                        ae_i,
                         vec_i,
                         ijm_i[xyz_axis],
-                        arg_names=("ref_stiffT_mat", "jac", "vec", "inv_jac_t"),
+                        arg_names=("ref_stiffT_mat", "vec", "inv_jac_t"),
                         tagged=(FirstAxisIsElementsTag(),))
 
-            for out_grp, in_grp, vec_i, ae_i, ijm_i in zip(
-                out_discr.groups, in_discr.groups, vec, area_elements,
+            for out_grp, in_grp, vec_i, ijm_i in zip(
+                out_discr.groups, in_discr.groups, vec,
                 inverse_jac_mat)))
 
 
-- 
GitLab