Skip to content

Commit 0db3f49

Browse files
committed
make padua nodes vary slowest in the first dimension
1 parent 417ca30 commit 0db3f49

2 files changed

Lines changed: 30 additions & 34 deletions

File tree

examples/plot-padua-nodes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ def plot_padua_nodes(alpha, beta, order, family):
4040
ax.grid()
4141

4242
ax.plot(curve[0], curve[1])
43-
ax.plot(nodes[0], nodes[1], "ko")
43+
for i, xi in enumerate(nodes.T):
44+
ax.plot(nodes[0], nodes[1], "ko", markersize=8)
45+
ax.text(*xi, str(i), color="k", fontsize=24, fontweight="bold")
4446

4547
ax.set_xlim([-1, 1])
4648
ax.set_ylim([-1, 1])

modepy/nodes.py

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -370,50 +370,44 @@ def legendre_gauss_lobatto_tensor_product_nodes(dims, n):
370370

371371
# {{{ Padua nodes
372372

373-
def _first_padua_jacobi_nodes(alpha, beta, order):
373+
def _make_padua_grid_nodes(alpha, beta, order):
374374
from modepy.quadrature.jacobi_gauss import jacobi_gauss_lobatto_nodes
375-
mu = jacobi_gauss_lobatto_nodes(alpha, beta, order)[::-1]
376-
eta = jacobi_gauss_lobatto_nodes(alpha, beta, order + 1)[::-1]
375+
mu = jacobi_gauss_lobatto_nodes(alpha, beta, order)
376+
eta = jacobi_gauss_lobatto_nodes(alpha, beta, order + 1)
377377

378-
nodes = np.stack(np.meshgrid(mu, eta))
379-
return np.hstack([
380-
nodes[:, ::2, 1::2].reshape(2, -1),
381-
nodes[:, 1::2, ::2].reshape(2, -1)
382-
])
378+
return mu, eta
383379

384380

385-
def _second_padua_jacobi_nodes(alpha, beta, order):
386-
rot = np.array([
387-
[np.cos(np.pi/2), -np.sin(np.pi/2)],
388-
[np.sin(np.pi/2), np.cos(np.pi/2)],
389-
])
390-
if order % 2 == 0:
391-
rot = -rot
381+
def _make_padua_jacobi_nodes(mu, eta, odd_or_even):
382+
nodes = np.stack(np.meshgrid(mu, eta, indexing="ij"))
383+
indices = np.sum(
384+
np.meshgrid(np.arange(mu.size), np.arange(eta.size), indexing="ij"),
385+
axis=0)
392386

393-
nodes = _first_padua_jacobi_nodes(alpha, beta, order)
394-
return rot @ nodes
387+
return nodes[:, indices % 2 == odd_or_even].reshape(2, -1)
395388

396389

397-
def _third_padua_jacobi_nodes(alpha, beta, order):
398-
rot = np.array([
399-
[np.cos(np.pi), -np.sin(np.pi)],
400-
[np.sin(np.pi), np.cos(np.pi)],
401-
])
390+
def _first_padua_jacobi_nodes(alpha, beta, order):
391+
mu, eta = _make_padua_grid_nodes(alpha, beta, order)
392+
return _make_padua_jacobi_nodes(mu, eta, 0)
402393

403-
nodes = _first_padua_jacobi_nodes(alpha, beta, order)
404-
return rot @ nodes
405394

395+
def _second_padua_jacobi_nodes(alpha, beta, order):
396+
# NOTE: these are just "rotated" by pi/2 from the first family
397+
mu, eta = _make_padua_grid_nodes(alpha, beta, order)
398+
return _make_padua_jacobi_nodes(eta, mu, 0)
406399

407-
def _fourth_padua_jacobi_nodes(alpha, beta, order):
408-
rot = np.array([
409-
[np.cos(np.pi/2), -np.sin(np.pi/2)],
410-
[np.sin(np.pi/2), np.cos(np.pi/2)],
411-
])
412-
if order % 2 == 1:
413-
rot = -rot
414400

415-
nodes = _first_padua_jacobi_nodes(alpha, beta, order)
416-
return rot @ nodes
401+
def _third_padua_jacobi_nodes(alpha, beta, order):
402+
# NOTE: these are just "rotated" by pi from the first family
403+
mu, eta = _make_padua_grid_nodes(alpha, beta, order)
404+
return _make_padua_jacobi_nodes(mu, eta, 1)
405+
406+
407+
def _fourth_padua_jacobi_nodes(alpha, beta, order):
408+
# NOTE: these are just "rotated" by 2 pi/3 from the first family
409+
mu, eta = _make_padua_grid_nodes(alpha, beta, order)
410+
return _make_padua_jacobi_nodes(eta, mu, 1)
417411

418412

419413
def padua_jacobi_nodes(alpha, beta, order, family="first"):

0 commit comments

Comments
 (0)