Skip to content

Commit 2dd5227

Browse files
author
FEniCS GitHub Actions
committed
1 parent 719dced commit 2dd5227

File tree

5 files changed

+49
-21
lines changed

5 files changed

+49
-21
lines changed

ufl/main/_modules/ufl/algorithms/analysis.html

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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">&quot;&quot;&quot;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&#39;t forms or base form operators</span>
398405
<span class="c1"># only contain arguments &amp; 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` &lt;=&gt; `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&#39;s argument slots</span>
436448
<span class="c1"># only since that&#39;s where they are by definition. Don&#39;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>

ufl/main/_modules/ufl/core/base_form_operator.html

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,8 @@ <h1>Source code for ufl.core.base_form_operator</h1><div class="highlight"><pre>
439439

440440
<span class="k">def</span><span class="w"> </span><span class="nf">_analyze_form_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
441441
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Analyze which Argument and Coefficient objects can be found in the base form.&quot;&quot;&quot;</span>
442-
<span class="kn">from</span><span class="w"> </span><span class="nn">ufl.algorithms.analysis</span><span class="w"> </span><span class="kn">import</span> <span class="n">extract_arguments</span><span class="p">,</span> <span class="n">extract_coefficients</span><span class="p">,</span> <span class="n">extract_type</span>
442+
<span class="kn">from</span><span class="w"> </span><span class="nn">ufl.algorithms.analysis</span><span class="w"> </span><span class="kn">import</span> <span class="n">extract_coefficients</span><span class="p">,</span> <span class="n">extract_type</span>
443+
<span class="kn">from</span><span class="w"> </span><span class="nn">ufl.form</span><span class="w"> </span><span class="kn">import</span> <span class="n">Form</span>
443444

444445
<span class="n">dual_arg</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">argument_slots</span><span class="p">()</span>
445446
<span class="c1"># When coarguments are treated as BaseForms, they have two</span>
@@ -450,9 +451,17 @@ <h1>Source code for ufl.core.base_form_operator</h1><div class="highlight"><pre>
450451
<span class="c1"># exact same situation than BaseFormOperator&#39;s arguments which</span>
451452
<span class="c1"># are different depending on whether the BaseFormOperator is</span>
452453
<span class="c1"># used in an outer form or not.</span>
453-
<span class="n">arguments</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">extract_type</span><span class="p">(</span><span class="n">dual_arg</span><span class="p">,</span> <span class="n">Coargument</span><span class="p">))</span> <span class="o">+</span> <span class="nb">tuple</span><span class="p">(</span>
454-
<span class="n">a</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">arguments</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">extract_arguments</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
454+
455+
<span class="n">primal_args</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
456+
<span class="n">a</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">arguments</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">extract_type</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">Argument</span><span class="p">,</span> <span class="n">base_form_op_as_expr</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
457+
<span class="p">)</span>
458+
<span class="n">primal_arg_num</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="o">.</span><span class="n">number</span><span class="p">()</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">primal_args</span><span class="p">}</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dual_arg</span><span class="p">,</span> <span class="n">Form</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span>
459+
<span class="n">dual_args</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
460+
<span class="n">arg</span>
461+
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">dual_arg</span><span class="o">.</span><span class="n">arguments</span><span class="p">()</span>
462+
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">Coargument</span><span class="p">)</span> <span class="ow">or</span> <span class="n">arg</span><span class="o">.</span><span class="n">number</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">primal_arg_num</span>
455463
<span class="p">)</span>
464+
<span class="n">arguments</span> <span class="o">=</span> <span class="n">dual_args</span> <span class="o">+</span> <span class="n">primal_args</span>
456465
<span class="n">coefficients</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">c</span> <span class="k">for</span> <span class="n">op</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ufl_operands</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">extract_coefficients</span><span class="p">(</span><span class="n">op</span><span class="p">))</span>
457466
<span class="c1"># Define canonical numbering of arguments and coefficients</span>
458467
<span class="c1"># 1) Need concept of order since we may have arguments with the same number</span>

0 commit comments

Comments
 (0)