dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #18902
Re: python: xml read for vector / std::vector
On Friday August 6 2010 13:46:04 Garth N. Wells wrote:
> On Fri, 2010-08-06 at 13:37 -0700, Johan Hake wrote:
> > On Friday August 6 2010 12:10:34 Anders Logg wrote:
> > > On Fri, Aug 06, 2010 at 07:57:52PM +0100, Garth N. Wells wrote:
> > > > On Fri, 2010-08-06 at 11:55 -0700, Johan Hake wrote:
> > > > > On Friday August 6 2010 11:48:37 Anders Logg wrote:
> > > > > > On Wed, Aug 04, 2010 at 05:06:57PM -0700, Johan Hake wrote:
> > > > > > > On Wednesday August 4 2010 13:09:47 Riesen Patrick wrote:
> > > > > > > > -----Original Message-----
> > > > > > > > From: Garth N. Wells [mailto:gnw20@xxxxxxxxx]
> > > > > > > > Sent: Wed 04.08.2010 19:07
> > > > > > > > To: johan.hake@xxxxxxxxx
> > > > > > > > Cc: Riesen Patrick; dolfin@xxxxxxxxxxxxxxxxxxx
> > > > > > > > Subject: Re: [Dolfin] python: xml read for vector /
> > > > > > > > std::vector
> > > > > > > >
> > > > > > > > On Wed, 2010-08-04 at 10:03 -0700, Johan Hake wrote:
> > > > > > > > > On Wednesday August 4 2010 09:28:22 Patrick Riesen wrote:
> > > > > > > > > > Patrick Riesen wrote:
> > > > > > > > > > > Johan Hake wrote:
> > > > > > > > > > >> Patrick!
> > > > > > > > > > >>
> > > > > > > > > > >> On Wednesday August 4 2010 09:13:24 Patrick Riesen
wrote:
> > > > > > > > > > >>> hello dolfin developers
> > > > > > > > > > >>>
> > > > > > > > > > >>> I write out a std::vector in XML file format from
> > > > > > > > > > >>> cpp. Can I read the XML file in again in python and
> > > > > > > > > > >>> construct a numpy array? I know how to do it with a
> > > > > > > > > > >>> dolfin Vector, but is it possible with a
> > > > > > > > > > >>> std::vector<double>? I could not figure out the
> > > > > > > > > > >>> syntax, i tried
> > > > > > > > > > >>>
> > > > > > > > > > >>> # this is ok
> > > > > > > > > > >>> fn = File("data/norm.xml")
> > > > > > > > > > >>> div_vec = d.Vector()
> > > > > > > > > > >>> a = n.array((11,1))
> > > > > > > > > > >>>
> > > > > > > > > > >>> # fails
> > > > > > > > > > >>> fn >> a
> > > > > > > > > > >>> # fails
> > > > > > > > > > >>> fn >> div_vec.array()
> > > > > > > > > > >>
> > > > > > > > > > >> Have you tried:
> > > > > > > > > > >> fn >> div_vec
> > > > > > > > > > >> a = div_vec.array()
> > > > > > > > > > >
> > > > > > > > > > > yes, that gives the error:
> > > > > > > > > > > *** Error: Handler stack not empty. Something is wrong!
> > > > > > > > >
> > > > > > > > > The format is then different for the Vector XML file and
> > > > > > > > > the std::vector file?
> > > > > > > > >
> > > > > > > > > > if i write out a dolfin::Vector in xml, it's all fine
> > > > > > > > > > with:
> > > > > > > > > >
> > > > > > > > > > fn = File("data/norm.xml")
> > > > > > > > > > div_vec = d.Vector()
> > > > > > > > > > fn >> div_vec
> > > > > > > > > > a = div_vec.array()
> > > > > > > > > >
> > > > > > > > > > but if i write out a std::vector<double> in xml, I can't
> > > > > > > > > > read it in.
> > > > > > > > >
> > > > > > > > > Silly question from a Python user:
> > > > > > > > > How do you write the std::vector to a XML file?
> > > > > > > >
> > > > > > > > You don't ;);
> > > > > > > >
> > > > > > > > DOLFIN does. It's overloaded in the XMLFile class.
> > > > > > > > Well, anyway, i thought if dolfin can write out a std::vector
> > > > > > > > to xml via File/XMLFile, pydolfin can also read it in, but
> > > > > > > > obviously not.
> > > > > > >
> > > > > > > I think you stumble across some unused code there. I am not
> > > > > > > sure but I think Ola implemented this for some debugging of
> > > > > > > the parallel interface. But I am not sure actually.
> > > > > > >
> > > > > > > If we had a typemap for std::vector <-> numpy array (which we
> > > > > > > could have, but
> > > > > > >
> > > > > > > desided we did not want...) we sould be able to do:
> > > > > > > somefile >> array
> > > > > > > somefile << array
> > > > > > >
> > > > > > > Where somefile will be file generated by XMLArray, which
> > > > > > > probably define a different XML interfaces than XMLVector.
> > > > > >
> > > > > > Input/output is implemented for the Array class so it would be
> > > > > > appropriate to use that. It was implemented to handle
> > > > > > input/output for parallel mesh data (stored in the data section
> > > > > > of a mesh as MeshFunctions, Arrays and maps).
> > > > >
> > > > > Ok
> > > > >
> > > > > > Can someone remind me of why we don't have a typemap for
> > > > > > numpy.array and dolfin::Array? Or what am I missing here?
> > > > >
> > > > > We have that, but the XMLArray read and writes std::vector, which
> > > > > typemaps we decided to ditch.
> > > >
> > > > The best solution is to use dolfin::Array in XMLArray. It will also
> > > > simplify io of dolfin::Vector.
> > >
> > > Aha. I missed that. I suggest we support input/output for both
> > > dolfin::Array and std::vector. It should be possible to implement
> > > with a good deal of code reuse.
> >
> > Another thing, is it anything that prevent us to harmonize the xml format
> > of an XMLArray and an XMLVector? Any potential issues during parallel?
> > If so one should be able to do what Patrick did in the first place.
>
> Do you mean the structure of the XML file or the code in XMLArray and
> XMLVector? The only real difference between XMLArray and XMLVector is a
> call the GenericVector::set/set_local, so it should be possible to
> harmonise the two.
I mean the structure of the XML file. In that way it should not make any
difference if it came from a std::vector, dolfin::Vector, (dolfin::Array, if
it was added), and it should be possible to read it into any of the other
structures.
But while reading this I realise that std::vector and dolfin::Array are typed
data, while dolfin::Vector always are double.
> I'm modifying XMLArray right now to keep track of the index. This will
> allow reading elements in arbitrary orders, and it will permit reading
> just chunks of a file (one process handling only a portion of a file) or
> a reading a file containing only a portion of a vector.
Ok!
Johan
>
> Garth
>
> > > Speaking of which, would it be possible to add a constructor to
> > > dolfin::Array that takes a std::vector?
> > >
> > > std::vector<int> x(10);
> > >
> > > dolfin::Array<int> xx(x);
> > >
> > > ?
> > >
> > > I have been missing that on a few occasions.
> >
> > That should be possible with copying of data of course.
> >
> > Johan
References