Grids


In [1]:
from dec.symbolic import *
from dec.grid1 import Grid_1D
from dec.grid2 import Grid_2D
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.collections as mc
%matplotlib inline

In [2]:
def format_fig(g, plot):
    plt.figure(figsize=(8,8))
    ax = plt.axes()
    plot(ax)
    plt.xlim(g.gx.xmin, g.gx.xmax)
    plt.ylim(g.gy.xmin, g.gy.xmax)
    ax.axes.set_aspect('equal')

In [3]:
def plot_grid(ax, g):
    ax.scatter(*g.verts, marker='o', c='black', s=30)
    ax.scatter(*g.verts_dual, marker='o', c='red', s=30, alpha=0.4)

    lines = np.rollaxis(np.array(g.edges), 2, 0)
    lc = mc.LineCollection(lines, colors='black')
    ax.add_collection(lc)

    lines = np.rollaxis(np.array(g.edges_dual), 2, 0)
    lc = mc.LineCollection(lines, colors='red', alpha=0.4)
    ax.add_collection(lc)

In [4]:
g = Grid_2D.periodic(16, 16)
def p(ax):
    plot_grid(ax, g)
    pi = np.pi
    ax.set_xticks((0, pi/2, pi, 3*pi/2, 2*pi))
    ax.set_yticks((0, pi/2, pi, 3*pi/2, 2*pi))
    ax.set_xticklabels(('$0$','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$',), size=20)
    ax.set_yticklabels(('','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$',), size=20)
format_fig(g, p)



In [5]:
g = Grid_2D.regular(16, 16)
def p(ax):
    plot_grid(ax, g)
    pi = np.pi
    d = pi/4
    ax.set_xticks(np.arange(5)*d)
    ax.set_yticks(np.arange(5)*d)
    ax.set_xticklabels(('$0$','$\pi/4$','$\pi/2$','$3\pi/4$','$\pi$',), size=20)
    ax.set_yticklabels(('','$\pi/4$','$\pi/2$','$3\pi/4$','$\pi$'), size=20)
format_fig(g, p)



In [6]:
g = Grid_2D.chebyshev(16, 16)
def p(ax):
    plot_grid(ax, g)
    ax.set_xticks((-1., -.5, .0, .5, 1.))
    ax.set_yticks((-1., -.5, .0, .5, 1.))
    ax.set_xticklabels(('$-1$','$-1/2$','$0$','$+1/2$','$+1$',), size=20)
    ax.set_yticklabels(('','$-1/2$','$0$','$+1/2$','$+1$',), size=20)
format_fig(g, p)



In [7]:
(x0,y0), (x1, y1) = g.edges
np.array(g.edges).shape
e = np.array(g.edges)
e= np.rollaxis(e, 2, 0)
e= np.rollaxis(e, 2, 1)
e.shape


Out[7]:
(480, 2, 2)

In [8]:
def get_meshgrid(N, M):
    X, Y = np.meshgrid(np.linspace(g.gx.xmin, g.gx.xmax, N),
                       np.linspace(g.gy.xmin, g.gy.xmax, M))
    return X, Y
XX, YY = get_meshgrid(100, 100)
X, Y = get_meshgrid(20, 20)

In [9]:
c = Chart(x,y)
f = form(0, c, (x+y,)).P(g, True)
def p(ax):
    ax.contourf(XX, YY, f.R(XX, YY))
    ax.quiver(X, Y, *f.D.R(X, Y), color='black')
format_fig(g, p)



In [10]:
f = form(0, c, (x**2-y**2,)).P(g, True)
def p(ax):
    ax.contourf(XX, YY, f.R(XX, YY))
    ax.quiver(X, Y, *f.D.R(X, Y), color='black')
format_fig(g, p)



In [11]:
f = form(0, c, (x**2+y**2,)).P(g, True)
def p(ax):
    ax.contourf(XX, YY, f.R(XX, YY))
    ax.quiver(X, Y, *f.D.R(X, Y), color='black')
format_fig(g, p)



In [12]:
# Curl
f =form(1, c, (-y**3,x**3)).P(g, True)
def p(ax):
    ax.contourf(XX, YY, f.D.H.R(XX, YY))
    ax.quiver(X, Y, *f.R(X, Y), color='black')
format_fig(g, p)



In [13]:
# Divergence 
f = form(1, c, (x**3,y**3)).P(g, False)
def p(ax):
    ax.contourf(XX, YY, f.H.D.H.R(XX, YY))
    ax.quiver(X, Y, *f.R(X, Y), color='black')
format_fig(g, p)



In [14]:
# Divergence 
f = form(1, c, (x**3,y**3))
fd = f.P(g, True)
def p(ax):
    ax.contourf(XX, YY, (fd.H.D+g.BC(f.H)).H.R(XX, YY))
    ax.quiver(X, Y, *fd.R(X, Y), color='black')
format_fig(g, p)



In [15]:
f = form(1, c, (1,0)).P(g, True)
def p(ax):
    xx, yy = g.verts
    ax.quiver(xx, yy, *f.R(xx, yy), color='blue')
    ax.quiver(xx, yy, *f.H.R(xx, yy), color='purple')
    ax.quiver(xx, yy, *f.H.H.R(xx, yy), color='red')
    ax.quiver(xx, yy, *f.H.H.H.R(xx, yy), color='green')
format_fig(g, p)



In [16]:
f = form(1, c, (1,0)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.quiver(X, Y, *f.R(X, Y), color='blue')
    ax.quiver(X, Y, *f.H.R(X, Y), color='purple')
    ax.quiver(X, Y, *f.H.H.R(X, Y), color='red')
    ax.quiver(X, Y, *f.H.H.H.R(X, Y), color='green')
format_fig(g, p)



In [17]:
f = form(1, c, (-y,x)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.quiver(X, Y, *f.R(X, Y), color='blue')
    ax.quiver(X, Y, *f.H.R(X, Y), color='purple')
    ax.quiver(X, Y, *f.H.H.R(X, Y), color='red')
    ax.quiver(X, Y, *f.H.H.H.R(X, Y), color='green')
format_fig(g, p)



In [18]:
f = form(1, c, (x, y)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.quiver(X, Y, *f.R(X, Y), color='blue')
    ax.quiver(X, Y, *f.H.R(X, Y), color='purple')
    ax.quiver(X, Y, *f.H.H.R(X, Y), color='red')
    ax.quiver(X, Y, *f.H.H.H.R(X, Y), color='green')
format_fig(g, p)



In [19]:
# Wedge Product f1 ^ f2
f1 = form(1, c, (x, y)).P(g, True)
f2 = form(1, c, (y, x)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.contourf(XX, YY, (f1 ^ f2).R(XX, YY))
    ax.quiver(X, Y, *f1.R(X, Y), color='white')
    ax.quiver(X, Y, *f2.R(X, Y), color='black')
format_fig(g, p)



In [20]:
#Contraction / innner product f1.C(f2)
f1 = form(1, c, (x, y)).P(g, True)
f2 = form(1, c, (y, x)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.contourf(XX, YY, f1.C(f2).R(XX, YY))
    ax.quiver(X, Y, *f1.R(X, Y), color='white')
    ax.quiver(X, Y, *f2.R(X, Y), color='black')
format_fig(g, p)



In [21]:
#Contraction / innner product f1.C(f2)
f1 = form(1, c, (y, x)).P(g, True)
f2 = form(2, c, (y+x,)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.contourf(XX, YY, f2.R(XX, YY))
    ax.quiver(X, Y, *f1.R(X, Y), color='white')
    ax.quiver(X, Y, *f1.C(f2).R(X, Y), color='black')
format_fig(g, p)



In [22]:
#Lie Derivative f1.C(f0.D)
f0 = form(0, c, (x**3,  )).P(g, True)
f1 = form(1, c, (1, 0)).P(g, True)
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.contourf(XX, YY, f0.R(XX, YY))
    ax.quiver(X, Y, *f1.R(X, Y), color='black')
format_fig(g, p)
def q(ax):
    X, Y = get_meshgrid(10, 10)
    ax.contourf(XX, YY, f1.C(f0.D).R(XX, YY))
format_fig(g, q)



In [23]:
#Lie Derivative f1.C(f0.D)
u = form(1, c, (x, y)).P(g, True)
v = form(1, c, (-y, x**3)).P(g, True)
w = u.C(v.D)+(u.C(v)).D
def p(ax):
    X, Y = get_meshgrid(10, 10)
    ax.quiver(X, Y, *u.R(X, Y), color='red')
    ax.quiver(X, Y, *v.R(X, Y), color='blue')
    ax.quiver(X, Y, *w.R(X, Y), color='black')
format_fig(g, p)



In [24]: