← Back to team overview

dolfin team mailing list archive

Re: GenericVector and PyDOLFIN

 



Johan Hake wrote:
On Wednesday 19 August 2009 19:11:42 Garth N. Wells wrote:
Johan Hake wrote:
On Wednesday 19 August 2009 18:50:13 Garth N. Wells wrote:
Johan Hake wrote:
On Wednesday 19 August 2009 17:29:52 Garth N. Wells wrote:
What's going on behind the scene when I copy one vector to another in
PyDOLFIN using

     u0.vector()[:] = u.vector()[:]
When I add:

u2 = Function(V)
u2.vector()[:] = u.vector()[:]

# Plot solution
plot(u2)

In a the Poisson demo it works fine.
In parallel?
Yupp!

This type of slice only uses the assignment operator.
The GenericVector assignment operator?
Yes. This is done in __setslice__/__getslice__ in the extended python
class.
I don't see then why the we end up inside

   _compare_vector_with_vector

for the Cahn-Hilliard demo when running in parallel?

Are you sure it is in
  _compare_vector_with_vector

this should only kick in if you used '==' or some other comparison operator.

Yep, I put a print statement in there.

Garth


When I run this demo in parallel, I get passed the assignment line but it stops when calling the solve function with the following message:

Traceback (most recent call last):
  File "demo.py", line 86, in <module>
    Traceback (most recent call last):
solver.solve(problem, u.vector())
RuntimeError: *** Error: MUMPS is required for parallel symbolic LU.
I delved into the problem and the program ends up in the function
_compare_vector_with_vector from dolfin_la_get_set_items.i. It uses
GenericVector::get and GenericVector::set. These need to be used with
caution in parallel.
Yes, when other type of slices are used we need to find a way to do that
in parallel. I have just started digging in the parallel code, and need
to look into all the changes to get familiar with it before I try to
solve this.
This shouldn't be too hard.

    set(const double* block, uint m, const uint* rows)

works in parallel but

    get(double* block, uint m, const uint* rows)

doesn't yet (not too hard to fix though). The really evil functions are

   set(const double*)

and

   get(double*)

I think I am only using

   set(const double* block, uint m, const uint* rows)
   get(double* block, uint m, const uint* rows)

However GenericVector.array is using the get(double*) function, and returns some fishy numbers in the numpy.array.

Johan

Garth

The best solution would be to have a full fledge VectotView in place ;)

Johan

Garth

Other slices might not

work. Have not checked.

Johan

? The issue is that it doesn't work in parallel.

Garth
_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev


References