Anders Logg wrote:
> Garth N. Wells wrote:
>>
>> Ola Skavhaug wrote:
>>> Garth N. Wells skrev den 25/07-2007 følgende:
>>>> Martin Sandve Alnæs wrote:
>>>>> 2007/7/24, Garth N. Wells <[EMAIL PROTECTED]>:
>>>>>> Martin Sandve Alnæs wrote:
>>>>>>> 2007/7/24, Garth N. Wells <[EMAIL PROTECTED]>:
>>>>>>>> Martin Sandve Alnæs wrote:
>>>>>>>>> As I understand it, "Matrix" is just a convenience class for 
>>>>>>>>> users who
>>>>>>>>> don't care about the underlying format. It should never be used 
>>>>>>>>> at the
>>>>>>>>> library level (because it ties the library to one format for each
>>>>>>>>> compilation of the library), and can be ignored by anybody who
>>>>>>>>> actually cares about which library they'll use.
>>>>>>>> I would say that it is more than just a convenience class - it's 
>>>>>>>> more
>>>>>>>> like the default linear algebra backend. Part of the idea is to 
>>>>>>>> tie the
>>>>>>>> library to one format in order to guarantee that various objects 
>>>>>>>> are
>>>>>>>> compatible with each other.
>>>>>>> This doesn't sound like what Anders told me. Its the very idea of
>>>>>>> "tying" the library compile-time to a single backend that I don't
>>>>>>> like. As long as the rest of the library depends on GenericMatrix 
>>>>>>> and
>>>>>>> not Matrix, I'm happy. In that case, Matrix is a nice user-side
>>>>>>> feature to keep user code portable.
>>>>>>>
>>>>>>>
>>>>>>>> A possibility would be to make objects like
>>>>>>>> Function templated, at the cost of increased complexity.
>>>>>>> I don't see where Function enters this?
>>>>>>>
>>>>>> A Function requires a vector to store the dofs. This is currently a
>>>>>> Vector, so it would have to be possible to specify the type of 
>>>>>> vector.
>>>>>> With the current design, it's not enough to just make the underlying
>>>>>> pointer a GenericVector.
>>>>>>
>>>>>> Garth
>>>>> Using more than one linear algebra backend with this design must
>>>>> require separately compiled libraries for each backend then? This is
>>>>> not ok for Python apps at all, and will make the PyCC merge impossible
>>>>> in my opinion.
>>>>>
>>>> What's the problem that makes things impossible?
>>> Well, one problem is that PyCC uses its own linear algebra system (or
>>> collection of linear algebra systems). It would me much simpler if we 
>>> can just
>>> inherit a set of base classes, and then use our code transparently with
>>> DOLFIN. The alternative would be to compile DOLFIN with the specific 
>>> linear
>>> algebra systems of PyCC. I fear that this would require much work.
>>>
>>> I suggest that we invest some time to resolve how this should be done 
>>> in a
>>> general and flexible manner. It might require some work, but we are 
>>> ready to
>>> do this. The benefits of the merge will for sure pay this effort off.
>>>
>>
>> Yes, I agree and I'm looking forward to the merge. Would the below 
>> template approach work for you? Function will require some changes for 
>> parallel assembly and solve (which is being worked on), so now is a 
>> good time to work out what we need to make the merge smooth.
>>
>> Garth
> 
> I think there is a very simple solution. We just change the constructor 
> of Function to
> 
>     Function(Mesh& mesh, GenericVector& x, const Form& form, uint i = 1)
> 
> and the vector member of DiscreteFunction to
> 
>     GenericVector* x;
> 
> Then if one needs a Function that uses a particular linear algebra 
> backend, then just create the Function from a PETScVector, uBlasVector 
> or EpetraVector. Otherwise, create it from a Vector (tied to the default 
> backend) or let the Function itself decide (in which case it will be a 
> Vector).
>

I thought that this would be a simple solution, but there a "new Vector" 
in DiscreteFunction which requires that the vector type be known. If 
this is somehow re-written, the above approach could be used.

Garth



> /Anders
> 
> 
> 
>>> Ola
>>>
>>>
>>>> I agree that it would be more elegant to allow the use of different 
>>>> back-ends, and it should require only a minor redesign. The least 
>>>> intrusive solution would be to make Function a templated class,
>>>>
>>>> template< class T > Function
>>>> {
>>>>    public:
>>>>
>>>>      . . .
>>>>      T& vec();
>>>>
>>>>    private:
>>>>
>>>>      T* vector;
>>>> }
>>>>
>>>> Garth
>>>>
>>>>> I guess this requirement stems from that Function needs to construct
>>>>> objects of GenericVector subclasses? We could use a factory design
>>>>> then. The factory pattern is usually a good solution when "virtual
>>>>> constructors" are needed, like here. But this probably leads to
>>>>> changes many places, so I'm not trying to come up with a solution
>>>>> right now.
>>>>>
>>>>> Martin
>>>>> _______________________________________________
>>>>> DOLFIN-dev mailing list
>>>>> [email protected]
>>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>>>>>
>>>>
>>>> _______________________________________________
>>>> DOLFIN-dev mailing list
>>>> [email protected]
>>>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>>
>>
>> _______________________________________________
>> DOLFIN-dev mailing list
>> [email protected]
>> http://www.fenics.org/mailman/listinfo/dolfin-dev
> 


_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to