← Back to team overview

dolfin team mailing list archive

Re: python: xml read for vector / std::vector : what about xml for matrix

 

hello,

ehm, i just noticed the same problem for writing out a Matrix to XML from c++ and then reading it in again in PyDolfin:

in python, the read-in fails:
fn = "matrixdata.xml"
df = File(fn)

data = Matrix()
df >> data

gives:
RuntimeError: *** Error: Handler stack not empty. Something is wrong!

greetings,
patrick


Anders Logg wrote:
On Fri, Aug 06, 2010 at 01:37:12PM -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.

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.

I meant without copying. Isn't that one of the main points with the
Array class that it is flexible in terms of ownership?

--
Anders


------------------------------------------------------------------------

_______________________________________________
Mailing list: https://launchpad.net/~dolfin
Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~dolfin
More help   : https://help.launchpad.net/ListHelp




Follow ups

References