diff --git a/examples/wave/wave-eager.py b/examples/wave/wave-eager.py index f80ff2c7c978e5c56ec7fb59cb6f270bc1b5361e..aa9e87ffa0a7885adf9cc8d67d82d1be15a44e93 100644 --- a/examples/wave/wave-eager.py +++ b/examples/wave/wave-eager.py @@ -69,12 +69,7 @@ def wave_flux(discr, c, w_tpair): 0.5*normal_times(v_jump), ) - flux_strong = join_fields( - np.dot(v.int, normal), - normal_times(u.int), - ) - flux_weak - - return discr.interp(w_tpair.dd, "all_faces", c*flux_strong) + return discr.interp(w_tpair.dd, "all_faces", c*flux_weak) def wave_operator(discr, c, w): @@ -87,12 +82,12 @@ def wave_operator(discr, c, w): dir_bc = join_fields(-dir_u, dir_v) return ( - - join_fields( - -c*discr.div(v), - -c*discr.grad(u) - ) - + # noqa: W504 discr.inverse_mass( + join_fields( + c*discr.weak_div(v), + c*discr.weak_grad(u) + ) + - # noqa: W504 discr.face_mass( wave_flux(discr, c=c, w_tpair=interior_trace_pair(discr, w)) + wave_flux(discr, c=c, w_tpair=TracePair( diff --git a/grudge/eager.py b/grudge/eager.py index 5cf380f822f294cfef83e843bd1eb9c1aa3b7010..e64e2fa8344a848f4d0a218cfd0286ec9f896e2a 100644 --- a/grudge/eager.py +++ b/grudge/eager.py @@ -66,6 +66,17 @@ class EagerDGDiscretization(DGDiscretizationWithBoundaries): return sum( self.grad(vec_i)[i] for i, vec_i in enumerate(vecs)) + @memoize_method + def _bound_weak_grad(self): + return bind(self, sym.stiffness_t(self.dim) * sym.Variable("u")) + + def weak_grad(self, vec): + return self._bound_weak_grad()(vec.queue, u=vec) + + def weak_div(self, vecs): + return sum( + self.weak_grad(vec_i)[i] for i, vec_i in enumerate(vecs)) + @memoize_method def normal(self, dd): with cl.CommandQueue(self.cl_context) as queue: