@@ -343,6 +343,7 @@ <h1>Source code for ufl.algorithms.analysis</h1><div class="highlight"><pre>
343343< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.coefficient</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> BaseCoefficient</ span >
344344< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.constant</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> Constant</ span >
345345< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.core.base_form_operator</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> BaseFormOperator</ span >
346+ < span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.core.expr</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> Expr</ span >
346347< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.core.terminal</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> Terminal</ span >
347348< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.corealg.traversal</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> traverse_unique_terminals</ span > < span class ="p "> ,</ span > < span class ="n "> unique_pre_traversal</ span >
348349< span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ufl.domain</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> Mesh</ span >
@@ -375,12 +376,15 @@ <h1>Source code for ufl.algorithms.analysis</h1><div class="highlight"><pre>
375376
376377< div class ="viewcode-block " id ="extract_type ">
377378< a class ="viewcode-back " href ="../../../api/api-algorithms.html#ufl.algorithms.extract_type "> [docs]</ a >
378- < span class ="k "> def</ span > < span class ="w "> </ span > < span class ="nf "> extract_type</ span > < span class ="p "> (</ span > < span class ="n "> a</ span > < span class ="p "> ,</ span > < span class ="n "> ufl_types</ span > < span class ="p "> ):</ span >
379+ < span class ="k "> def</ span > < span class ="w "> </ span > < span class ="nf "> extract_type</ span > < span class ="p "> (</ span > < span class ="n "> a</ span > < span class ="p "> ,</ span > < span class ="n "> ufl_types</ span > < span class ="p "> , </ span > < span class =" n " > base_form_op_as_expr </ span > < span class =" o " > = </ span > < span class =" kc " > None </ span > < span class =" p " > ):</ span >
379380< span class ="w "> </ span > < span class ="sd "> """Build a set of all objects found in a whose class is in ufl_types.</ span >
380381
381382< span class ="sd "> Args:</ span >
382383< span class ="sd "> a: A BaseForm, Integral or Expr</ span >
383384< span class ="sd "> ufl_types: A list of UFL types</ span >
385+ < span class ="sd "> base_form_op_as_expr: If True, treat BaseFormOperators as expressions by</ span >
386+ < span class ="sd "> dropping the dual argument. If False, treat them as BaseForms by including</ span >
387+ < span class ="sd "> coarguments. If None (default), decide based on whether `a` is a Form or Expr.</ span >
384388
385389< span class ="sd "> Returns:</ span >
386390< span class ="sd "> All objects found in a whose class is in ufl_type</ span >
@@ -394,6 +398,9 @@ <h1>Source code for ufl.algorithms.analysis</h1><div class="highlight"><pre>
394398 < span class ="k "> else</ span > < span class ="p "> :</ span >
395399 < span class ="n "> remove_base_form_ops</ span > < span class ="o "> =</ span > < span class ="kc "> False</ span >
396400
401+ < span class ="k "> if</ span > < span class ="n "> base_form_op_as_expr</ span > < span class ="ow "> is</ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
402+ < span class ="n "> base_form_op_as_expr</ span > < span class ="o "> =</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> a</ span > < span class ="p "> ,</ span > < span class ="n "> Form</ span > < span class ="o "> |</ span > < span class ="n "> Expr</ span > < span class ="p "> )</ span > < span class ="ow "> and</ span > < span class ="ow "> not</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> a</ span > < span class ="p "> ,</ span > < span class ="n "> BaseFormOperator</ span > < span class ="p "> )</ span >
403+
397404 < span class ="c1 "> # BaseForms that aren't forms or base form operators</ span >
398405 < span class ="c1 "> # only contain arguments & coefficients</ span >
399406 < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> a</ span > < span class ="p "> ,</ span > < span class ="n "> BaseForm</ span > < span class ="p "> )</ span > < span class ="ow "> and</ span > < span class ="ow "> not</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> a</ span > < span class ="p "> ,</ span > < span class ="n "> Form</ span > < span class ="o "> |</ span > < span class ="n "> BaseFormOperator</ span > < span class ="p "> ):</ span >
@@ -423,23 +430,28 @@ <h1>Source code for ufl.algorithms.analysis</h1><div class="highlight"><pre>
423430 < span class ="c1 "> # This accounts for having BaseFormOperator in Forms: if N is a BaseFormOperator</ span >
424431 < span class ="c1 "> # `N(u; v*) * v * dx` <=> `action(v1 * v * dx, N(...; v*))`</ span >
425432 < span class ="c1 "> # where `v`, `v1` are `Argument`s and `v*` a `Coargument`.</ span >
426- < span class ="k "> for</ span > < span class ="n "> ai</ span > < span class ="ow "> in</ span > < span class ="nb "> tuple</ span > < span class ="p "> (</ span > < span class ="n "> arg</ span > < span class ="k "> for</ span > < span class ="n "> arg</ span > < span class ="ow "> in</ span > < span class ="n "> o</ span > < span class ="o "> .</ span > < span class ="n "> argument_slots</ span > < span class ="p "> (</ span > < span class ="nb " > isinstance </ span > < span class ="p " > ( </ span > < span class =" n " > a </ span > < span class ="p " > , </ span > < span class =" n "> Form </ span > < span class ="p "> ) )):</ span >
433+ < span class ="k "> for</ span > < span class ="n "> ai</ span > < span class ="ow "> in</ span > < span class ="nb "> tuple</ span > < span class ="p "> (</ span > < span class ="n "> arg</ span > < span class ="k "> for</ span > < span class ="n "> arg</ span > < span class ="ow "> in</ span > < span class ="n "> o</ span > < span class ="o "> .</ span > < span class ="n "> argument_slots</ span > < span class ="p "> (</ span > < span class ="n " > outer_form </ span > < span class ="o " > = </ span > < span class ="n "> base_form_op_as_expr </ span > < span class ="p "> )):</ span >
427434 < span class ="c1 "> # Extracting BaseArguments of an object of which a</ span >
428435 < span class ="c1 "> # Coargument is an argument, then we just return the dual</ span >
429436 < span class ="c1 "> # argument of the Coargument and not its primal argument.</ span >
430437 < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> ai</ span > < span class ="p "> ,</ span > < span class ="n "> Coargument</ span > < span class ="p "> ):</ span >
431438 < span class ="n "> new_types</ span > < span class ="o "> =</ span > < span class ="nb "> tuple</ span > < span class ="p "> (</ span > < span class ="n "> Coargument</ span > < span class ="k "> if</ span > < span class ="n "> t</ span > < span class ="ow "> is</ span > < span class ="n "> BaseArgument</ span > < span class ="k "> else</ span > < span class ="n "> t</ span > < span class ="k "> for</ span > < span class ="n "> t</ span > < span class ="ow "> in</ span > < span class ="n "> ufl_types</ span > < span class ="p "> )</ span >
432- < span class ="n "> base_form_objects </ span > < span class ="o "> . </ span > < span class ="n "> extend </ span > < span class ="p "> (</ span > < span class ="n "> extract_type </ span > < span class ="p "> ( </ span > < span class ="n "> ai </ span > < span class ="p "> ,</ span > < span class ="n "> new_types </ span > < span class ="p "> ) )</ span >
439+ < span class ="n "> extracted </ span > < span class ="o "> = </ span > < span class ="n "> extract_type </ span > < span class ="p "> (</ span > < span class ="n "> ai </ span > < span class ="p "> , </ span > < span class ="n "> new_types </ span > < span class ="p "> ,</ span > < span class ="n "> base_form_op_as_expr </ span > < span class ="p "> )</ span >
433440 < span class ="k "> else</ span > < span class ="p "> :</ span >
434- < span class ="n "> base_form_objects</ span > < span class ="o "> .</ span > < span class ="n "> extend</ span > < span class ="p "> (</ span > < span class ="n "> extract_type</ span > < span class ="p "> (</ span > < span class ="n "> ai</ span > < span class ="p "> ,</ span > < span class ="n "> ufl_types</ span > < span class ="p "> ))</ span >
441+ < span class ="n "> extracted</ span > < span class ="o "> =</ span > < span class ="n "> extract_type</ span > < span class ="p "> (</ span > < span class ="n "> ai</ span > < span class ="p "> ,</ span > < span class ="n "> ufl_types</ span > < span class ="p "> ,</ span > < span class ="n "> base_form_op_as_expr</ span > < span class ="p "> )</ span >
442+ < span class ="c1 "> # Filter out any BaseFormOperators if necessary</ span >
443+ < span class ="c1 "> # from the recursively extracted results</ span >
444+ < span class ="k "> if</ span > < span class ="n "> remove_base_form_ops</ span > < span class ="p "> :</ span >
445+ < span class ="n "> extracted</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="n "> obj</ span > < span class ="k "> for</ span > < span class ="n "> obj</ span > < span class ="ow "> in</ span > < span class ="n "> extracted</ span > < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> obj</ span > < span class ="p "> ,</ span > < span class ="n "> BaseFormOperator</ span > < span class ="p "> )}</ span >
446+ < span class ="n "> base_form_objects</ span > < span class ="o "> .</ span > < span class ="n "> extend</ span > < span class ="p "> (</ span > < span class ="n "> extracted</ span > < span class ="p "> )</ span >
435447 < span class ="c1 "> # Look for BaseArguments in BaseFormOperator's argument slots</ span >
436448 < span class ="c1 "> # only since that's where they are by definition. Don't look</ span >
437449 < span class ="c1 "> # into operands, which is convenient for external operator</ span >
438450 < span class ="c1 "> # composition, e.g. N1(N2; v*) where N2 is seen as an operator</ span >
439451 < span class ="c1 "> # and not a form.</ span >
440452 < span class ="n "> slots</ span > < span class ="o "> =</ span > < span class ="n "> o</ span > < span class ="o "> .</ span > < span class ="n "> ufl_operands</ span >
441453 < span class ="k "> for</ span > < span class ="n "> ai</ span > < span class ="ow "> in</ span > < span class ="n "> slots</ span > < span class ="p "> :</ span >
442- < span class ="n "> base_form_objects</ span > < span class ="o "> .</ span > < span class ="n "> extend</ span > < span class ="p "> (</ span > < span class ="n "> extract_type</ span > < span class ="p "> (</ span > < span class ="n "> ai</ span > < span class ="p "> ,</ span > < span class ="n "> ufl_types_no_args</ span > < span class ="p "> ))</ span >
454+ < span class ="n "> base_form_objects</ span > < span class ="o "> .</ span > < span class ="n "> extend</ span > < span class ="p "> (</ span > < span class ="n "> extract_type</ span > < span class ="p "> (</ span > < span class ="n "> ai</ span > < span class ="p "> ,</ span > < span class ="n "> ufl_types_no_args</ span > < span class ="p "> , </ span > < span class =" n " > base_form_op_as_expr </ span > < span class =" p " > ))</ span >
443455 < span class ="n "> objects</ span > < span class ="o "> .</ span > < span class ="n "> update</ span > < span class ="p "> (</ span > < span class ="n "> base_form_objects</ span > < span class ="p "> )</ span >
444456
445457 < span class ="c1 "> # `Remove BaseFormOperator` objects if there were initially not in `ufl_types`</ span >
0 commit comments