← Back to team overview

dolfin team mailing list archive

Re: Image to Function data structure conversion

 



A Navaei wrote:
[snip]
Function should not change the FunctionSpace (that's why FunctionSpace is
const). FunctionSpace shouldn't depend on the data and its size should be
defined when creating the FunctionSpace.
The same applies for FunctionSpace as its member variables are private
and the public accessors are read-only which. Consider a sub-class
ImageFunctionSpace:FunctionSpace, with a constructor like:

ImageFunctionSpace(ImageType *imagePtr)

where imagePtr is supposed to initialise FunctionSpace::_mesh using
the image size, and then _dofmaps itself is initialised using _mesh.
How would you do that considering the restrictions?

The FunctionSpace has pointers to the mesh, etc. You just need to create
your mesh and pass it to the FunctionSpace constructor. What else you then
do with the mesh, etc is up to you.

That can be done _outside_ of a sub-class. A sub-class of
FunctionSpace doesn't have a control over _mesh of its own parent
FunctionSpace. The following example may make this more clear:

template <typename TImage>
class DolfinImageFunctionSpace : public dolfin::FunctionSpace
{
public:
        // just some itk typedefs -- ignore
	typedef TImage ImageType;
	typedef typename ImageType::PixelType PixelType;
	typedef typename ImageType::SizeType SizeType;

        // .. and some dolfin typedefs -- ignore
	typedef typename std::tr1::shared_ptr<const dolfin::Mesh> MeshConstPointerType;
	typedef typename std::tr1::shared_ptr<const dolfin::FiniteElement>
ElementConstPointerType;
	typedef typename std::tr1::shared_ptr<const dolfin::DofMap>
DofMapConstPointerType;

        // the ctor
	DolfinImageFunctionSpace(ImageType* imageData,
						MeshConstPointerType mesh,
						ElementConstPointerType element,
						DofMapConstPointerType dofmap) :
	dolfin::FunctionSpace(mesh, element, dofmap)
	{
		SizeType imageSize = imageData->GetBufferedRegion().GetSize();

                // here, we whish to call some thing like:
                // _mesh = UnitSquare(imageSize[0], imageSize[1]);
                // but it's private and the accessor is read-only.
	};
}


This breaks the concept of a function space. A function space is defined in terms of a mesh (and other things). A function space does not define its mesh.

It looks to me like the class that you're creating should be called something like

  DolfinImageProblem,

which can create its own Mesh, FunctionSpace and other objects.

Garth


-Ali



Follow ups

References