dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #02695
Re: Subfunctions
On Tue, Jun 06, 2006 at 03:09:58PM +0200, Kristian Oelgaard wrote:
> Quoting Anders Logg <logg@xxxxxxxxx>:
>
> > On Tue, Jun 06, 2006 at 12:05:10PM +0200, Kristian Oelgaard wrote:
> > >
> > >
> > > Hi,
> > > I have some difficulties with the subfunction facility in Dolfin. I'm
> > interested
> > > in saving the normal and shear components of a stress function (in 3D) for
> > post
> > > processing purposes.
> > >
> > > the stress function is initialised in this way:
> > >
> > > stress.init(mesh, a_strain.trial());
> > >
> > > and the trial element 'a_strain.trial()' is defined as:
> > >
> > > elementB = FiniteElement("Discontinuous vector Lagrange", "tetrahedron",
> > 0, 3)
> > > elementC = FiniteElement("Discontinuous vector Lagrange", "tetrahedron",
> > 0, 3)
> > >
> > > strain_element = elementB + elementC
> > >
> > > (wn,ws) = TrialFunctions(strain_element)
> > >
> > > Now, when doing:
> > >
> > > Function n_stress = stress[0];
> > > Function s_stress = stress[1];
> > >
> > > File file_normal_stress("normal_stress.pvd");
> > > File file_shear_stress("shear_stress.pvd");
> > >
> > > while( t < T)
> > > {
> > >
> > > nonlinear_solver.solve(nonlinear_problem, x);
> > >
> > > n_stress = stress[0];
> > > s_stress = stress[1];
> > >
> > > file_normal_stress << n_stress;
> > > file_shear_stress << s_stress;
> > >
> > > }
> > >
> > > the values of the two files are exactly the same as if only the first half
> > of
> > > stress.vector() is used as a basis for both subfunctions.
> > >
> > > Funny thing is that a similar approach works fine in the elasticity demo.
> > Only
> > > difference is that in this case the strains are computed in FFC, where my
> > > stresses are computed in the non-linear problem, on element level, and
> > then
> > > written into the stress.vector(). So, what am I doing wrong?
> > >
> > > Regards,
> > >
> > > Kristian
> > >
> > > _______________________________________________
> > > DOLFIN-dev mailing list
> > > DOLFIN-dev@xxxxxxxxxx
> > > http://www.fenics.org/cgi-bin/mailman/listinfo/dolfin-dev
> >
> > Which versions of DOLFIN and FFC are you using? We recently updated
> > the evaluation at vertices (that is called when saving to file), so we
> > might have broken something.
>
> The versions i used were a couple of days old, but to be sure I just grapped new
> versions of FFC and Dolfin, and I still get problems.
>
> >
> > Check the code generated by FFC, what does the function(s) vertexeval
> > say?
>
> In class trial function:
>
> public:
>
> void vertexeval(uint vertex_nodes[], unsigned int vertex, const Mesh& mesh) const
> {
> // FIXME: Temporary fix for Lagrange elements
> vertex_nodes[0] = vertex;
> int offset = mesh.numCells();
> vertex_nodes[1] = offset + vertex;
> offset = offset + mesh.numCells();
> vertex_nodes[2] = offset + vertex;
> offset = offset + mesh.numCells();
> vertex_nodes[3] = offset + vertex;
> offset = offset + mesh.numCells();
> vertex_nodes[4] = offset + vertex;
> offset = offset + mesh.numCells();
> vertex_nodes[5] = offset + vertex;
> }
>
> in private:
>
> class SubElement_0 : public dolfin::FiniteElement
> {
> public:
>
> void vertexeval(uint vertex_nodes[], unsigned int vertex, const Mesh& mesh) const
> {
> // FIXME: Temporary fix for Lagrange elements
> vertex_nodes[0] = vertex;
> int offset = mesh.numCells();
> vertex_nodes[1] = offset + vertex;
> offset = offset + mesh.numCells();
> vertex_nodes[2] = offset + vertex;
> }
> }
>
> class SubElement_1 : public dolfin::FiniteElement
> {
> public:
>
> void vertexeval(uint vertex_nodes[], unsigned int vertex, const Mesh&
> mesh) const
> {
> // FIXME: Temporary fix for Lagrange elements
> vertex_nodes[0] = vertex;
> int offset = mesh.numCells();
> vertex_nodes[1] = offset + vertex;
> offset = offset + mesh.numCells();
> vertex_nodes[2] = offset + vertex;
> }
> }
>
> I guess the two functions look too much alike?
>
> >
> > You're using discontinuous Lagrange which I don't think is supported
> > correctly by vertexeval().
>
> Could very well be, if I try to project the strains onto a discontinuous basis
> in elasticity demo I get the same error.
>
> /Kristian
I need to think about this (and not right now). Will try to think
about it tomorrow...
/Anders
References