← Back to team overview

dolfin team mailing list archive

Re: A minimal c++ Function test and some bugs

 



A Navaei wrote:
2009/2/19 Johan Hake <hake@xxxxxxxxx>:
The previous email was sent a bit premature...

[snip]

I have also thought of this :)

Then you can take an ordered mesh, iterate over the vertices, and use the
present implementation of the eval function (which in its present shape
is a piecewise constant interpolator isn't it?), to fill the new _vector,
all done in the constructor. Then you have a discrete function in the
first place :)
Is it possible to set the pointer to _vector data directly where we
can pass the pointer to image data? If this works, no loop will be
involve in data conversion and it will be super fast.
Yes but you do not know how the mesh is ordered.

Consider a 2D image data mapped on a structured grid, with size
(number of nodes in each direction) of (sx, sy), the value of image
brightness at coordinate (i, j) is given by I(k), where:

k = i + sx * j

Is this not enough information to create the mesh?

It seems _vector.set()
(http://www.fenics.org/pub/documents/dolfin/dolfin-progr-reference/d6/da4/c
lassdolfin_1_1GenericVector.html#bc4ecede55f2846ecadae02426df8f63) accepts
the pointer to each row, is that right?
There is no such thing as a row in a vector. It stores the data in a
contigouos way (if not distributed).

No idea why it says rows: virtual void dolfin::GenericVector::set
(const double *block, const uint *num_rows, const uint *const *
	rows).


You can set as few or as many entries as you wish at once. 'block' contains the values you want to set, 'num_rows' are the number of entries you wish to set, and 'rows' are the positions into which the entries should be inserted.

Garth


Is there a better way of assigning the whole data at once?
Maybe but you then have to be sure that your data is arrange in exact same
manner as the mesh.

As long as we work with complete rectangular images, which is the
frequently used case, it should be fine. Given this, how is it
possible to directly assign the image data pointer to _vector?

Note that this will only work for a piecewise linear lagrange
FunctionSpace.
It should be ok, it would be equivalent of having the image function
initialised with Lagrange element, but much more faster.

But haveing this in place you can always interpolate to other
FunctionSpaces. However these interpolations will only be linear of
course.
It is not possible to interpolate a function to another space using
non-linear interpolators?
If your raw image data is represented by a linear FunctionSpace any
interpolation using this space would be linear.

Right, that's yet another problem.


-Ali

Johan

To Anders: Do you think if this is more practical and efficient than
the other discussed approach? Would this be general enough to work
with an arbitrary PDE of any finite element type?


-Ali

Johan

-Ali

-Ali

Another way of doing this could be by the use of an existing
FunctionSpace:

  UnitSquare dummy_mesh(1, 1);
  PoissonFunctionSpace V(dummy_mesh);
  ImageFunction v(image, V);

Then, in the constructor of ImageFunction, V.element and V.dofmap
can be used to create another FunctionSpace which has a mesh
created using image:

  ImageToFunction(Image image, const FunctionSpace& V)
  {
    // Create the function space
    UnitSquare mesh(image.get_size()[0] - 1, image.get_size()[1]
- 1); FunctionSpace IV(mesh, V.element(), V.dofmap());

    // ...
  };

The problem with this approach is that it involves the use of a
dummy mesh.

A mesh-independent constructor added to FunctionSpace could help.
Alternatively, if a (protected) default (empty) constructor is
added to FunctionSpace, ImageFunctionSpace:FunctionSpace can have
a mesh-independent constructor. However, the FFC-generated
function spaces, eg PoissonFunctionSpace, still need a mesh.

Hope this makes the problem more clear now.
Create the mesh and the FunctionSpace subclass inside the
ImageFunction constructor. Neither the mesh nor the function space
need to be visible outside.
Again, there is no mesh-free ctor for FunctionSpace, and it doesn't
come with a default ctor so that the subclass can implement a
mesh-free ctor. I quote the above again:
You don't need a mesh-free constructor for FunctionSpace, see above.

' A mesh-independent constructor added to FunctionSpace could help.
 Alternatively, if a (protected) default (empty) constructor is
added to FunctionSpace, ImageFunctionSpace:FunctionSpace can have a
mesh-independent constructor.'
It's not needed if you do as I suggest.

--
Anders

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkmdMN8ACgkQTuwUCDsYZdGnOQCdFBJSD4FymLnVPbheRt63aJJa
yyoAn3KDuOmwd8ZX5YR1KucbafvieNBc
=lpyI
-----END PGP SIGNATURE-----

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


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




Follow ups

References