dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #24054
Re: NonlinearVariationalProblem interface
-
To:
Anders Logg <logg@xxxxxxxxx>
-
From:
"Garth N. Wells" <gnw20@xxxxxxxxx>
-
Date:
Tue, 05 Jul 2011 07:49:51 +0100
-
Cc:
DOLFIN Mailing List <dolfin@xxxxxxxxxxxxxxxxxxx>
-
In-reply-to:
<20110705062415.GG24805@smaug>
-
User-agent:
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Thunderbird/3.1.10
On 05/07/11 07:24, Anders Logg wrote:
> On Mon, Jul 04, 2011 at 11:46:00PM +0100, Garth N. Wells wrote:
>>
>>
>> On 04/07/11 23:37, Anders Logg wrote:
>>> On Mon, Jul 04, 2011 at 11:28:56PM +0100, Garth N. Wells wrote:
>>>>
>>>>
>>>> On 04/07/11 17:22, Anders Logg wrote:
>>>>> On Mon, Jul 04, 2011 at 04:47:46PM +0100, Garth N. Wells wrote:
>>>>>>
>>>>>>
>>>>>> On 04/07/11 16:44, Anders Logg wrote:
>>>>>>> On Mon, Jul 04, 2011 at 04:39:04PM +0100, Garth N. Wells wrote:
>>>>>>>> I'm not sold on the NonlinearVariationalProblem interface. I would
>>>>>>>> prefer a constructor takes the Jacobian as an argument. It's much
>>>>>>>> cleaner to do things at construction and removes the need to later
>>>>>>>> attach the Jacobian.
>>>>>>>
>>>>>>> The point is that one should be able to define a nonlinear problem
>>>>>>> with or without a Jacobian. Not all nonlinear solvers need a Jacobian.
>>>>>>>
>>>>>>
>>>>>> That's why I wrote 'a' constructor. We can have two versions.
>>>>>
>>>>> Yes, that's an option. The drawback with that is that it would double
>>>>> the number of constructors (from 6 to 12) but it's a small thing to
>>>>> fix. I wouldn't mind moving it to the constructor.
>>>>>
>>>>
>>>> I think that we can rationalise the number of constructors in
>>>> FooVariationalProblem. For the shared pointer versions, it would be
>>>> enough to have just
>>>>
>>>> LinearVariationalProblem(boost::shared_ptr<const Form> a,
>>>> boost::shared_ptr<const Form> L,
>>>> boost::shared_ptr<Function> u,
>>>> std::vector<boost::shared_ptr<const BoundaryCondition> > bcs);
>>>>
>>>> and
>>>>
>>>> NonlinearVariationalProblem(boost::shared_ptr<const Form> F,
>>>> boost::shared_ptr<const Form> J,
>>>> boost::shared_ptr<Function> u,
>>>> std::vector<boost::shared_ptr<const BoundaryCondition> > bcs);
>>>
>>> I think it's important that we keep the same argument order as for the
>>> reference versions, and that the Jacobian comes last to emphasize
>>> that it is an optional/auxiliary argument. It also removes some of the
>>> confusion we had be for with (a, L) vs (F, J). How about this:
>>>
>>> LinearVariationalProblem(boost::shared_ptr<const Form> a,
>>> boost::shared_ptr<const Form> L,
>>> boost::shared_ptr<Function> u,
>>> std::vector<boost::shared_ptr<const
>>> BoundaryCondition> > bcs);
>>>
>>> NonlinearVariationalProblem(boost::shared_ptr<const Form> F,
>>> int rhs,
>>> boost::shared_ptr<Function> u,
>>> std::vector<boost::shared_ptr<const
>>> BoundaryCondition> > bcs,
>>> boost::shared_ptr<const Form> J);
>>>
>>> Same as your suggestion (just one shared ptr constructor in each
>>> class) but placing the Jacobian last and keeping the right-hand side
>>> in there.
>>>
>>
>> I'm don't mind the order being the same (I didn't pay any attention to
>> it). My main point is that the shared_ptr interface is lower level so we
>> don't need to provide multiple convenience versions.
>
> Agree.
>
>>> Keeping the right-hand side is important since it makes it possible to
>>> check for errors (like a nonzero right-hand side) in one single
>>> place (inside NonlinearVariationaProblem.cpp). We would otherwise need
>>> to check it inside Equation.cpp and possibly in the Python layer.
>>>
>>
>> I don't like it. It makes the nonlinear interface clumsy. Reading
>> the signature it's not clear to me what it's for or what I should
>> pass in.
>
> The point is that it makes the interface for all variational problems
> (linear or nonlinear) the same:
>
> lhs, rhs, solution, [bcs], [jacobian]
>
> I think this is helpful to minimize errors.
>
I don't agree. It's confusing. It's not clear to me why I would want to
pass a pointless integer to a NonlinearVariationalProblem. I wouldn't
expect a pointless argument, so I would start to wonder what it should
be and what it's for.
Garth
> The docstrings in the FooVariationalProblem classes can be expanded to
> explain the arguments in more detail.
>
> --
> Anders
Follow ups
References