← Back to team overview

dolfin team mailing list archive

Re: Image to Function data structure conversion

 

On Sat, Feb 14, 2009 at 06:44:05PM +0000, Garth N. Wells wrote:
> 
> 
> 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

I think what you need to do is something like this:

1. Create a subclass of Function

2. In the constructor of your Function, call the empty Function()
constructor

3. Then, still in the constructor of your Function (not
FunctionSpace), create everything necessary like figuring out the
mesh, dofmap etc and from that create a FunctionSpace

4. Then use that FunctionSpace (still in the constructor of your
Function subclass) to create a new Function v which uses your special
FunctionSpace in its constructor

5. Finally, assign this function to the created Function:

  *this = v;

-- 
Anders

Attachment: signature.asc
Description: Digital signature


Follow ups

References