@@ -42,15 +42,14 @@ <h1>Source code for ufl.action</h1><div class="highlight"><pre>
4242
4343< span class ="kn "> from</ span > < span class ="nn "> itertools</ span > < span class ="kn "> import</ span > < span class ="n "> chain</ span >
4444
45+ < span class ="kn "> from</ span > < span class ="nn "> ufl</ span > < span class ="kn "> import</ span > < span class ="n "> matrix</ span > < span class ="c1 "> # noqa 401</ span >
4546< span class ="kn "> from</ span > < span class ="nn "> ufl.algebra</ span > < span class ="kn "> import</ span > < span class ="n "> Sum</ span >
4647< span class ="kn "> from</ span > < span class ="nn "> ufl.argument</ span > < span class ="kn "> import</ span > < span class ="n "> Argument</ span > < span class ="p "> ,</ span > < span class ="n "> Coargument</ span >
47- < span class ="kn "> from</ span > < span class ="nn "> ufl.coefficient</ span > < span class ="kn "> import</ span > < span class ="n "> BaseCoefficient</ span > < span class ="p "> ,</ span > < span class ="n "> Coefficient</ span > < span class =" p " > , </ span > < span class =" n " > Cofunction </ span >
48+ < span class ="kn "> from</ span > < span class ="nn "> ufl.coefficient</ span > < span class ="kn "> import</ span > < span class ="n "> BaseCoefficient</ span > < span class ="p "> ,</ span > < span class ="n "> Coefficient</ span >
4849< span class ="kn "> from</ span > < span class ="nn "> ufl.constantvalue</ span > < span class ="kn "> import</ span > < span class ="n "> Zero</ span >
49- < span class ="kn "> from</ span > < span class ="nn "> ufl.core.base_form_operator</ span > < span class ="kn "> import</ span > < span class ="n "> BaseFormOperator</ span >
5050< span class ="kn "> from</ span > < span class ="nn "> ufl.core.ufl_type</ span > < span class ="kn "> import</ span > < span class ="n "> ufl_type</ span >
5151< span class ="kn "> from</ span > < span class ="nn "> ufl.differentiation</ span > < span class ="kn "> import</ span > < span class ="n "> CoefficientDerivative</ span >
5252< span class ="kn "> from</ span > < span class ="nn "> ufl.form</ span > < span class ="kn "> import</ span > < span class ="n "> BaseForm</ span > < span class ="p "> ,</ span > < span class ="n "> Form</ span > < span class ="p "> ,</ span > < span class ="n "> FormSum</ span > < span class ="p "> ,</ span > < span class ="n "> ZeroBaseForm</ span >
53- < span class ="kn "> from</ span > < span class ="nn "> ufl.matrix</ span > < span class ="kn "> import</ span > < span class ="n "> Matrix</ span >
5453
5554< span class ="c1 "> # --- The Action class represents the action of a numerical object that needs</ span >
5655< span class ="c1 "> # to be computed at assembly time ---</ span >
@@ -73,14 +72,14 @@ <h1>Source code for ufl.action</h1><div class="highlight"><pre>
7372< span class ="sd "> """</ span >
7473
7574 < span class ="vm "> __slots__</ span > < span class ="o "> =</ span > < span class ="p "> (</ span >
76- < span class ="s2 "> "_left"</ span > < span class ="p "> ,</ span >
77- < span class ="s2 "> "_right"</ span > < span class ="p "> ,</ span >
78- < span class ="s2 "> "ufl_operands"</ span > < span class ="p "> ,</ span >
79- < span class ="s2 "> "_repr"</ span > < span class ="p "> ,</ span >
8075 < span class ="s2 "> "_arguments"</ span > < span class ="p "> ,</ span >
8176 < span class ="s2 "> "_coefficients"</ span > < span class ="p "> ,</ span >
8277 < span class ="s2 "> "_domains"</ span > < span class ="p "> ,</ span >
8378 < span class ="s2 "> "_hash"</ span > < span class ="p "> ,</ span >
79+ < span class ="s2 "> "_left"</ span > < span class ="p "> ,</ span >
80+ < span class ="s2 "> "_repr"</ span > < span class ="p "> ,</ span >
81+ < span class ="s2 "> "_right"</ span > < span class ="p "> ,</ span >
82+ < span class ="s2 "> "ufl_operands"</ span > < span class ="p "> ,</ span >
8483 < span class ="p "> )</ span >
8584
8685 < span class ="k "> def</ span > < span class ="fm "> __new__</ span > < span class ="p "> (</ span > < span class ="bp "> cls</ span > < span class ="p "> ,</ span > < span class ="o "> *</ span > < span class ="n "> args</ span > < span class ="p "> ,</ span > < span class ="o "> **</ span > < span class ="n "> kw</ span > < span class ="p "> ):</ span >
@@ -210,29 +209,36 @@ <h1>Source code for ufl.action</h1><div class="highlight"><pre>
210209
211210< span class ="k "> def</ span > < span class ="nf "> _check_function_spaces</ span > < span class ="p "> (</ span > < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="n "> right</ span > < span class ="p "> ):</ span >
212211< span class ="w "> </ span > < span class ="sd "> """Check if the function spaces of left and right match."""</ span >
212+ < span class ="c1 "> # Action differentiation pushes differentiation through</ span >
213+ < span class ="c1 "> # right as a consequence of Leibniz formula.</ span >
213214 < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="n "> CoefficientDerivative</ span > < span class ="p "> ):</ span >
214- < span class ="c1 "> # Action differentiation pushes differentiation through</ span >
215- < span class ="c1 "> # right as a consequence of Leibniz formula.</ span >
216215 < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="o "> *</ span > < span class ="n "> _</ span > < span class ="o "> =</ span > < span class ="n "> right</ span > < span class ="o "> .</ span > < span class ="n "> ufl_operands</ span >
216+ < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="n "> CoefficientDerivative</ span > < span class ="p "> ):</ span >
217+ < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="o "> *</ span > < span class ="n "> _</ span > < span class ="o "> =</ span > < span class ="n "> left</ span > < span class ="o "> .</ span > < span class ="n "> ufl_operands</ span >
217218
218- < span class ="c1 "> # `left` can also be a Coefficient in V (= V**), e.g.</ span >
219- < span class ="c1 "> # `action(Coefficient(V), Cofunction(V.dual()))`.</ span >
220- < span class ="n "> left_arg</ span > < span class ="o "> =</ span > < span class ="n "> left</ span > < span class ="o "> .</ span > < span class ="n "> arguments</ span > < span class ="p "> ()[</ span > < span class ="o "> -</ span > < span class ="mi "> 1</ span > < span class ="p "> ]</ span > < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="n "> Coefficient</ span > < span class ="p "> )</ span > < span class ="k "> else</ span > < span class ="n "> left</ span >
221- < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="p "> (</ span > < span class ="n "> Form</ span > < span class ="p "> ,</ span > < span class ="n "> Action</ span > < span class ="p "> ,</ span > < span class ="n "> Matrix</ span > < span class ="p "> ,</ span > < span class ="n "> ZeroBaseForm</ span > < span class ="p "> )):</ span >
222- < span class ="k "> if</ span > < span class ="n "> left_arg</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ()</ span > < span class ="o "> .</ span > < span class ="n "> dual</ span > < span class ="p "> ()</ span > < span class ="o "> !=</ span > < span class ="n "> right</ span > < span class ="o "> .</ span > < span class ="n "> arguments</ span > < span class ="p "> ()[</ span > < span class ="mi "> 0</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ():</ span >
223- < span class ="k "> raise</ span > < span class ="ne "> TypeError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Incompatible function spaces in Action"</ span > < span class ="p "> )</ span >
224- < span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="p "> (</ span > < span class ="n "> Coefficient</ span > < span class ="p "> ,</ span > < span class ="n "> Cofunction</ span > < span class ="p "> ,</ span > < span class ="n "> Argument</ span > < span class ="p "> ,</ span > < span class ="n "> BaseFormOperator</ span > < span class ="p "> )):</ span >
225- < span class ="k "> if</ span > < span class ="n "> left_arg</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ()</ span > < span class ="o "> !=</ span > < span class ="n "> right</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ():</ span >
226- < span class ="k "> raise</ span > < span class ="ne "> TypeError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Incompatible function spaces in Action"</ span > < span class ="p "> )</ span >
227219 < span class ="c1 "> # `Zero` doesn't contain any information about the function space.</ span >
228220 < span class ="c1 "> # -> Not a problem since Action will get simplified with a</ span >
229221 < span class ="c1 "> # `ZeroBaseForm` which won't take into account the arguments on</ span >
230222 < span class ="c1 "> # the right because of argument contraction.</ span >
231223 < span class ="c1 "> # This occurs for:</ span >
232224 < span class ="c1 "> # `derivative(Action(A, B), u)` with B is an `Expr` such that dB/du == 0</ span >
233225 < span class ="c1 "> # -> `derivative(B, u)` becomes `Zero` when expanding derivatives since B is an Expr.</ span >
234- < span class ="k "> elif</ span > < span class ="ow "> not</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="n "> Zero</ span > < span class ="p "> ):</ span >
235- < span class ="k "> raise</ span > < span class ="ne "> TypeError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Incompatible argument in Action: </ span > < span class ="si "> %s</ span > < span class ="s2 "> "</ span > < span class ="o "> %</ span > < span class ="nb "> type</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ))</ span >
226+ < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="n "> Zero</ span > < span class ="p "> )</ span > < span class ="ow "> or</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="n "> Zero</ span > < span class ="p "> ):</ span >
227+ < span class ="k "> return</ span >
228+
229+ < span class ="c1 "> # `left` can also be a Coefficient in V (= V**), e.g.</ span >
230+ < span class ="c1 "> # `action(Coefficient(V), Cofunction(V.dual()))`.</ span >
231+ < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="n "> Coefficient</ span > < span class ="p "> ):</ span >
232+ < span class ="n "> V_left</ span > < span class ="o "> =</ span > < span class ="n "> left</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ()</ span >
233+ < span class ="k "> else</ span > < span class ="p "> :</ span >
234+ < span class ="n "> V_left</ span > < span class ="o "> =</ span > < span class ="n "> left</ span > < span class ="o "> .</ span > < span class ="n "> arguments</ span > < span class ="p "> ()[</ span > < span class ="o "> -</ span > < span class ="mi "> 1</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ()</ span > < span class ="o "> .</ span > < span class ="n "> dual</ span > < span class ="p "> ()</ span >
235+ < span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> right</ span > < span class ="p "> ,</ span > < span class ="n "> Coefficient</ span > < span class ="p "> ):</ span >
236+ < span class ="n "> V_right</ span > < span class ="o "> =</ span > < span class ="n "> right</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ()</ span >
237+ < span class ="k "> else</ span > < span class ="p "> :</ span >
238+ < span class ="n "> V_right</ span > < span class ="o "> =</ span > < span class ="n "> right</ span > < span class ="o "> .</ span > < span class ="n "> arguments</ span > < span class ="p "> ()[</ span > < span class ="mi "> 0</ span > < span class ="p "> ]</ span > < span class ="o "> .</ span > < span class ="n "> ufl_function_space</ span > < span class ="p "> ()</ span > < span class ="o "> .</ span > < span class ="n "> dual</ span > < span class ="p "> ()</ span >
239+
240+ < span class ="k "> if</ span > < span class ="n "> V_left</ span > < span class ="o "> .</ span > < span class ="n "> dual</ span > < span class ="p "> ()</ span > < span class ="o "> !=</ span > < span class ="n "> V_right</ span > < span class ="p "> :</ span >
241+ < span class ="k "> raise</ span > < span class ="ne "> TypeError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Incompatible function spaces in Action"</ span > < span class ="p "> )</ span >
236242
237243
238244< span class ="k "> def</ span > < span class ="nf "> _get_action_form_arguments</ span > < span class ="p "> (</ span > < span class ="n "> left</ span > < span class ="p "> ,</ span > < span class ="n "> right</ span > < span class ="p "> ):</ span >
0 commit comments