Garth N. Wells wrote:
> 
> 
> 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

This is used to create copies of the vector (when creating a sub 
function or in the copy constructor). How about adding a factory 
function to GenericVector? (And also to GenericFoo in general.)

     virtual GenericVector* create() = 0;

Then we can call this instead of new Vector() in DiscreteFunction.cpp.

/Anders


>> /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