@@ -646,28 +646,61 @@ def generate_torus_and_cycle_vertices(
646646 r_major : float , r_minor : float ,
647647 n_major : int = 20 , n_minor : int = 10 , order : int = 1 ,
648648 node_vertex_consistency_tolerance : Optional [Union [float , bool ]] = None ,
649- unit_nodes : Optional [np .ndarray ] = None ):
649+ unit_nodes : Optional [np .ndarray ] = None ,
650+ group_cls : Optional [type ] = None ,
651+ ):
652+ from meshmode .mesh import SimplexElementGroup , TensorProductElementGroup
653+ if group_cls is None :
654+ group_cls = SimplexElementGroup
655+
650656 a = r_major
651657 b = r_minor
652658 u , v = np .mgrid [0 :2 * np .pi :2 * np .pi / n_major , 0 :2 * np .pi :2 * np .pi / n_minor ]
653659
654660 # https://web.archive.org/web/20160410151837/https://www.math.hmc.edu/~gu/curves_and_surfaces/surfaces/torus.html # noqa
655- x = np .cos (u )* (a + b * np .cos (v ))
656- y = np .sin (u )* (a + b * np .cos (v ))
657- z = b * np .sin (v )
658- vertices = (np .vstack ((x [np .newaxis ], y [np .newaxis ], z [np .newaxis ]))
661+ x = np .cos (u ) * (a + b * np .cos (v ))
662+ y = np .sin (u ) * (a + b * np .cos (v ))
663+ z = b * np .sin (v )
664+
665+ vertices = (
666+ np .vstack ((x [np .newaxis ], y [np .newaxis ], z [np .newaxis ]))
659667 .transpose (0 , 2 , 1 ).copy ().reshape (3 , - 1 ))
660668
661669 def idx (i , j ):
662670 return (i % n_major ) + (j % n_minor ) * n_major
663- vertex_indices = ([(idx (i , j ), idx (i + 1 , j ), idx (i , j + 1 ))
664- for i in range (n_major ) for j in range (n_minor )]
665- + [(idx (i + 1 , j ), idx (i + 1 , j + 1 ), idx (i , j + 1 ))
666- for i in range (n_major ) for j in range (n_minor )])
671+
672+ if issubclass (group_cls , SimplexElementGroup ):
673+ # NOTE: this makes two triangles from a the square like
674+ # (i, j+1) (i+1, j+1)
675+ # o---------o
676+ # | \ |
677+ # | \ |
678+ # | \ |
679+ # | \ |
680+ # o---------o
681+ # (i, j) (i+1, j)
682+
683+ vertex_indices = ([
684+ (idx (i , j ), idx (i + 1 , j ), idx (i , j + 1 ))
685+ for i in range (n_major ) for j in range (n_minor )
686+ ] + [
687+ (idx (i + 1 , j ), idx (i + 1 , j + 1 ), idx (i , j + 1 ))
688+ for i in range (n_major ) for j in range (n_minor )
689+ ])
690+ elif issubclass (group_cls , TensorProductElementGroup ):
691+ # NOTE: this should match the order of the points in modepy
692+ vertex_indices = [
693+ (idx (i , j ), idx (i + 1 , j ), idx (i , j + 1 ), idx (i + 1 , j + 1 ))
694+ for i in range (n_major ) for j in range (n_minor )
695+ ]
696+ else :
697+ raise TypeError (f"unsupported 'group_cls': { group_cls } " )
667698
668699 vertex_indices = np .array (vertex_indices , dtype = np .int32 )
669- grp = make_group_from_vertices (vertices , vertex_indices , order ,
670- unit_nodes = unit_nodes )
700+ grp = make_group_from_vertices (
701+ vertices , vertex_indices , order ,
702+ unit_nodes = unit_nodes ,
703+ group_cls = group_cls )
671704
672705 # ambient_dim, nelements, nunit_nodes
673706 nodes = grp .nodes .copy ()
@@ -693,12 +726,9 @@ def idx(i, j):
693726 x = np .sum (nodes * rvec , axis = 0 ) - a
694727
695728 minor_theta = np .arctan2 (nodes [2 ], x )
696-
697- nodes [0 ] = np .cos (major_theta )* (a + b * np .cos (
698- minor_theta ))
699- nodes [1 ] = np .sin (major_theta )* (a + b * np .cos (
700- minor_theta ))
701- nodes [2 ] = b * np .sin (minor_theta )
729+ nodes [0 ] = np .cos (major_theta ) * (a + b * np .cos (minor_theta ))
730+ nodes [1 ] = np .sin (major_theta ) * (a + b * np .cos (minor_theta ))
731+ nodes [2 ] = b * np .sin (minor_theta )
702732
703733 from meshmode .mesh import Mesh
704734 return (
@@ -716,7 +746,8 @@ def generate_torus(
716746 r_major : float , r_minor : float ,
717747 n_major : int = 20 , n_minor : int = 10 , order : int = 1 ,
718748 node_vertex_consistency_tolerance : Optional [Union [float , bool ]] = None ,
719- unit_nodes : Optional [np .ndarray ] = None ):
749+ unit_nodes : Optional [np .ndarray ] = None ,
750+ group_cls : Optional [type ] = None ):
720751 r"""Generate a torus.
721752
722753 .. figure:: images/torus.png
@@ -755,10 +786,12 @@ def generate_torus(
755786 :returns: a :class:`~meshmode.mesh.Mesh` of a torus.
756787
757788 """
789+
758790 mesh , _ , _ = generate_torus_and_cycle_vertices (
759791 r_major , r_minor , n_major , n_minor , order ,
760792 node_vertex_consistency_tolerance = node_vertex_consistency_tolerance ,
761- unit_nodes = unit_nodes )
793+ unit_nodes = unit_nodes ,
794+ group_cls = group_cls )
762795
763796 return mesh
764797
0 commit comments