On Thursday 19 February 2009 17:51:12 A Navaei wrote: > 2009/2/19 Anders Logg <[email protected]>: > > On Thu, Feb 19, 2009 at 02:53:52PM +0000, A Navaei wrote: > >> ---------- Forwarded message ---------- > >> From: A Navaei <[email protected]> > >> Date: 2009/2/19 > >> Subject: Re: [DOLFIN-dev] A minimal c++ Function test and some bugs > >> To: Johan Hake <[email protected]> > >> > >> 2009/2/19 Johan Hake <[email protected]>: > >> > On Thursday 19 February 2009 14:54:57 A Navaei wrote: > >> >> 2009/2/19 Johan Hake <[email protected]>: > >> >> > On Thursday 19 February 2009 14:46:18 A Navaei wrote: > >> >> >> 2009/2/19 Garth N. Wells <[email protected]>: > >> >> >> > A Navaei wrote: > >> >> >> >> 2009/2/19 Johan Hake <[email protected]>: > >> >> >> >>> 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-refe > >> >> >> >>>>rence/ d6/ da4/c > >> >> >> >>>> lassdolfin_1_1GenericVector.html#bc4ecede55f2846ecadae02426df > >> >> >> >>>>8f63) 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. > >> >> >> > >> >> >> I hate to say this, but _vector is private! > >> >> > > >> >> > ... and perfectly accesable through vector() > >> >> > >> >> ... and perfectly read-only through vector() > >> > > >> > I past from Function.h > >> > > >> > /// Return the vector of expansion coefficients, automatically > >> > /// initialized to zero if coefficients have not been computed > >> > (non-const version) > >> > GenericVector& vector(); > >> > > >> > /// Return the vector of expansion coefficients, automatically > >> > /// initialized to zero if coefficients have not been computed > >> > (const version) > >> > const GenericVector& vector() const; > >> > > >> > So one const version and one that is not. > >> > >> Would this be the right way of initialising _vector in the subclass? : > >> > >> DefaultFactory factory; > >> vector() = > >> *(boost::shared_ptr<GenericVector>(factory.create_vector())); > >> > >> Try attached in your sandbox. > > > > No, just do > > > > vector(); > > > > That will initialize a zero vector of correct size. > > These two work: > > Function1(boost::shared_ptr<const Image> image) : Function() > { > }; > > Function1() : Function() > { > vector(); > }; > > But the combination generates a segmentation fault: > > class Function2 : public Function > { > public: > Function2(boost::shared_ptr<const Image> image) : Function() > { > vector(); > }; > }; > > The trace includes /libdolfin.so.0(_ZN6dolfin8Function6vectorEv+0x38). > Example attached.
I get: terminate called after throwing an instance of 'std::runtime_error' what(): *** Assertion (_function_space) [at dolfin/function/Function.cpp:303 in init()] You need to attach a FunctionSpace before you call vector() otherwise it cannot know how long the vector should be. The first constructor is not called (for what reason I do not know) and wont trigger the assertion. Johan _______________________________________________ DOLFIN-dev mailing list [email protected] http://www.fenics.org/mailman/listinfo/dolfin-dev
