@@ -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
419413def padua_jacobi_nodes (alpha , beta , order , family = "first" ):
0 commit comments