@@ -111,7 +111,7 @@ def create_reference(cell_type, vertices=None):
111111 raise ValueError (f"Unknown cell type: { cell_type } " )
112112
113113
114- def create_element (cell_type , element_type , order , variant = "equispaced" ):
114+ def create_element (cell_type , element_type , order , ** kwargs ):
115115 """Make a finite element.
116116
117117 Parameters
@@ -172,19 +172,37 @@ def create_element(cell_type, element_type, order, variant="equispaced"):
172172 Bogner-Fox-Schmit, BFS,
173173 Fortin-Soulie, FS,
174174 Bernardi-Raugel,
175- Wu-Xu
175+ Wu-Xu,
176+ transition
176177 order : int
177178 The order of the element.
178- variant : str
179- The arrangement type of the points used the define the space.
180-
181- Supported values:
182- equispaced, lobatto, radau, legendre
183179 """
184180 reference = create_reference (cell_type )
185181
186182 if element_type in _elementmap :
187- assert reference .name in _elementmap [element_type ]
188- return _elementmap [element_type ][reference .name ](reference , order , variant = variant )
183+ if reference .name not in _elementmap [element_type ]:
184+ raise ValueError (f"{ element_type } element cannot be created on a { reference .name } ." )
185+ element_class = _elementmap [element_type ][reference .name ]
186+ if not _order_is_allowed (element_class , reference .name , order ):
187+ raise ValueError (f"Order { order } { element_type } element cannot be created." )
188+ return element_class (reference , order , ** kwargs )
189189
190190 raise ValueError (f"Unsupported element type: { element_type } " )
191+
192+
193+ def _order_is_allowed (element_class , ref , order ):
194+ if hasattr (element_class , "min_order" ):
195+ if isinstance (element_class .min_order , dict ):
196+ if ref in element_class .min_order :
197+ if order < element_class .min_order [ref ]:
198+ return False
199+ elif order < element_class .min_order :
200+ return False
201+ if hasattr (element_class , "max_order" ):
202+ if isinstance (element_class .max_order , dict ):
203+ if ref in element_class .max_order :
204+ if order > element_class .max_order [ref ]:
205+ return False
206+ elif order > element_class .max_order :
207+ return False
208+ return True
0 commit comments