From de5f4e21b9cb803344f03b3d8cf4f2aa30072898 Mon Sep 17 00:00:00 2001
From: Thomas Gibson <gibsonthomas1120@hotmail.com>
Date: Fri, 14 May 2021 15:47:55 -0500
Subject: [PATCH] Convert variable coefficient advection example

---
 examples/advection/var-velocity.py | 88 ++++++++++++++++--------------
 1 file changed, 47 insertions(+), 41 deletions(-)

diff --git a/examples/advection/var-velocity.py b/examples/advection/var-velocity.py
index 5843b993..7c7873b1 100644
--- a/examples/advection/var-velocity.py
+++ b/examples/advection/var-velocity.py
@@ -29,10 +29,10 @@ from meshmode.array_context import PyOpenCLArrayContext
 from meshmode.dof_array import thaw, flatten
 from meshmode.mesh import BTAG_ALL
 
-from grudge import bind, sym
 from pytools.obj_array import flat_obj_array
 
 import grudge.dof_desc as dof_desc
+import grudge.op as op
 
 import logging
 logger = logging.getLogger(__name__)
@@ -41,9 +41,9 @@ logger = logging.getLogger(__name__)
 # {{{ plotting (keep in sync with `weak.py`)
 
 class Plotter:
-    def __init__(self, actx, discr, order, visualize=True, ylim=None):
+    def __init__(self, actx, dcoll, order, visualize=True, ylim=None):
         self.actx = actx
-        self.dim = discr.ambient_dim
+        self.dim = dcoll.ambient_dim
 
         self.visualize = visualize
         if not self.visualize:
@@ -54,11 +54,11 @@ class Plotter:
             self.fig = pt.figure(figsize=(8, 8), dpi=300)
             self.ylim = ylim
 
-            volume_discr = discr.discr_from_dd(dof_desc.DD_VOLUME)
+            volume_discr = dcoll.discr_from_dd(dof_desc.DD_VOLUME)
             self.x = actx.to_numpy(flatten(thaw(actx, volume_discr.nodes()[0])))
         else:
             from grudge.shortcuts import make_visualizer
-            self.vis = make_visualizer(discr)
+            self.vis = make_visualizer(dcoll)
 
     def __call__(self, evt, basename, overwrite=True):
         if not self.visualize:
@@ -91,7 +91,7 @@ class Plotter:
 # }}}
 
 
-def main(ctx_factory, dim=2, order=4, product_tag=None, visualize=False):
+def main(ctx_factory, dim=2, order=4, use_quad=False, visualize=False):
     cl_ctx = ctx_factory()
     queue = cl.CommandQueue(cl_ctx)
     actx = PyOpenCLArrayContext(queue)
@@ -116,16 +116,11 @@ def main(ctx_factory, dim=2, order=4, product_tag=None, visualize=False):
 
     # flux
     flux_type = "upwind"
-    # velocity field
-    sym_x = sym.nodes(dim)
-    if dim == 1:
-        c = sym_x
+
+    if use_quad:
+        qtag = dof_desc.DISCR_TAG_QUAD
     else:
-        # solid body rotation
-        c = flat_obj_array(
-                np.pi * (d/2 - sym_x[1]),
-                np.pi * (sym_x[0] - d/2),
-                0)[:dim]
+        qtag = None
 
     # }}}
 
@@ -140,51 +135,63 @@ def main(ctx_factory, dim=2, order=4, product_tag=None, visualize=False):
     from meshmode.discretization.poly_element import \
             QuadratureSimplexGroupFactory
 
-    if product_tag:
+    if use_quad:
         discr_tag_to_group_factory = {
-            product_tag: QuadratureSimplexGroupFactory(order=4*order)
+            qtag: QuadratureSimplexGroupFactory(order=4*order)
         }
     else:
         discr_tag_to_group_factory = {}
 
     from grudge import DiscretizationCollection
-    discr = DiscretizationCollection(
+
+    dcoll = DiscretizationCollection(
         actx, mesh, order=order,
         discr_tag_to_group_factory=discr_tag_to_group_factory
     )
 
     # }}}
 
-    # {{{ symbolic operators
+    # {{{ advection operator
 
     # gaussian parameters
     source_center = np.array([0.5, 0.75, 0.0])[:dim]
     source_width = 0.05
-    dist_squared = np.dot(sym_x - source_center, sym_x - source_center)
 
     def f_gaussian(x):
-        return sym.exp(-dist_squared / source_width**2)
+        return actx.np.exp(-np.dot(x - source_center,
+                                   x - source_center) / source_width**2)
 
-    def f_step(x):
-        return sym.If(sym.Comparison(
-            dist_squared, "<", (4*source_width) ** 2),
-            1, 0)
-
-    def u_bc(x):
-        return 0.0
+    def zero_inflow_bc(dtag, t=0):
+        dd = dof_desc.DOFDesc(dtag, qtag)
+        return dcoll.discr_from_dd(dd).zeros(actx)
 
     from grudge.models.advection import VariableCoefficientAdvectionOperator
-    op = VariableCoefficientAdvectionOperator(
-            c,
-            u_bc(sym.nodes(dim, BTAG_ALL)),
-            quad_tag=product_tag,
-            flux_type=flux_type)
 
-    bound_op = bind(discr, op.sym_operator())
-    u = bind(discr, f_gaussian(sym.nodes(dim)))(actx, t=0)
+    x = thaw(actx, op.nodes(dcoll))
+
+    # velocity field
+    if dim == 1:
+        c = x
+    else:
+        # solid body rotation
+        c = flat_obj_array(
+            np.pi * (d/2 - x[1]),
+            np.pi * (x[0] - d/2),
+            0
+        )[:dim]
+
+    adv_operator = VariableCoefficientAdvectionOperator(
+        dcoll,
+        c,
+        inflow_u=lambda t: zero_inflow_bc(BTAG_ALL, t),
+        quad_tag=qtag,
+        flux_type=flux_type
+    )
+
+    u = f_gaussian(x)
 
     def rhs(t, u):
-        return bound_op(t=t, u=u)
+        return adv_operator.operator(t, u)
 
     # }}}
 
@@ -192,17 +199,16 @@ def main(ctx_factory, dim=2, order=4, product_tag=None, visualize=False):
 
     from grudge.shortcuts import set_up_rk4
     dt_stepper = set_up_rk4("u", dt, u, rhs)
-    plot = Plotter(actx, discr, order, visualize=visualize,
+    plot = Plotter(actx, dcoll, order, visualize=visualize,
             ylim=[-0.1, 1.1])
 
     step = 0
-    norm = bind(discr, sym.norm(2, sym.var("u")))
     for event in dt_stepper.run(t_end=final_time):
         if not isinstance(event, dt_stepper.StateComputed):
             continue
 
         if step % 10 == 0:
-            norm_u = norm(u=event.state_component)
+            norm_u = op.norm(dcoll, event.state_component, 2)
             plot(event, "fld-var-velocity-%04d" % step)
 
         step += 1
@@ -216,10 +222,10 @@ if __name__ == "__main__":
 
     parser = argparse.ArgumentParser()
     parser.add_argument("--dim", default=2, type=int)
-    parser.add_argument("--qtag", default="product")
+    parser.add_argument("--use_quad", choices=[True, False], default=False)
     args = parser.parse_args()
 
     logging.basicConfig(level=logging.INFO)
     main(cl.create_some_context,
             dim=args.dim,
-            product_tag=args.qtag)
+            use_quad=args.use_quad)
-- 
GitLab