computation of basis function values and derivatives

Asked by Nguyen Van Dang

Hello,

I am working with FEnics on C++. I want to take the values of basis function at each vertex directly. I read BasisFunction.h online but I don't know how to use this one.

Finally, I found in "Poisson.h" (created from "Poisson.ufl" in dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in which there is function "evaluate_basis(unsigned int i, double* values, double* coordinates, const ufc::cell& c)".
In "main.cpp" (in the same directory), I wrote:
   unsigned int i;
   double* values;
   double* coordinates;
   ufc::cell c;
   poisson_finite_element_0 finite_element;
   finite_element.evaluate_basis(i,values,coordinates,c);
I compiled it without any errors.
The problem is that how to input the value for c?
In fact, I have read the paper "efficient representation of computational meshes" of A. Logg and I could make a loop for all cells as well as vertices. However, the cell in this loop doesn't match with c anymore (because they have different type). Moreover, it is difficult to initialize the cell data structure:
  c.entity_indices = new unsigned int [...];
  c.coordinates = new double[..];
  .....

Is there any simple way to do this? Do you have any examples working on basis functions?

Please help me!
Thanks in advance

Question information

Language:
English Edit question
Status:
Solved
For:
DOLFIN Edit question
Assignee:
No assignee Edit question
Solved by:
Johan Hake
Solved:
Last query:
Last reply:
Revision history for this message
Anders Logg (logg) said :
#1

On Fri, Apr 29, 2011 at 08:01:55AM -0000, Nguyen Van Dang wrote:
> New question #154697 on DOLFIN:
> https://answers.launchpad.net/dolfin/+question/154697
>
> Hello,
>
> I am working with FEnics on C++. I want to take the values of basis function at each vertex directly. I read BasisFunction.h online but I don't know how to use this one.
>
> Finally, I found in "Poisson.h" (created from "Poisson.ufl" in dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in which there is function "evaluate_basis(unsigned int i, double* values, double* coordinates, const ufc::cell& c)".
> In "main.cpp" (in the same directory), I wrote:
> unsigned int i;
> double* values;
> double* coordinates;
> ufc::cell c;
> poisson_finite_element_0 finite_element;
> finite_element.evaluate_basis(i,values,coordinates,c);
> I compiled it without any errors.
> The problem is that how to input the value for c?
> In fact, I have read the paper "efficient representation of computational meshes" of A. Logg and I could make a loop for all cells as well as vertices. However, the cell in this loop doesn't match with c anymore (because they have different type). Moreover, it is difficult to initialize the cell data structure:
> c.entity_indices = new unsigned int [...];
> c.coordinates = new double[..];
> .....
>
> Is there any simple way to do this? Do you have any examples working on basis functions?

Look at the FiniteElement class and the function interpolate_vertex_values.

More generally (for evaluation at arbitrary points), you can use the
functions evaluate_basis or evaluate_basis_all.

--
Anders

Revision history for this message
Nguyen Van Dang (dang-1032170) said :
#2

Thank you very much for your reply.
However, I still got problem with evaluate_basis_derivatives. My code is as
follows:
  Poisson::FunctionSpace V(mesh);
  const dolfin::FiniteElement& finite_element = V.element();
  const dolfin::Cell& c = Cell(mesh,0);
  unsigned int i = 0;
  unsigned int n = 1;
  double values[1] = {0.0};
  double coordinates[2] = {0.0,0.5};
  //finite_element.evaluate_basis(i,values,coordinates,c) ;
  //std::cout<<"basis_value ="<<*values<< std::endl;
  double dval[2] = {0.0,0.0};
  double* dvalues = &dval[0];
  unsigned int n = 1;
  finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,c) ;
I got error because of the fourth variable c. In my program c is declared as
dofin::Cell& but in original function its type is ufc::cell&.
My questions are:
1. Why didn't I get this problem for evaluate_basis?
2. What will I do to fix this problem for evaluate_basis_derivatives?

Please help me again.
Thanks in advance.
Nguyen Van Dang

On Fri, Apr 29, 2011 at 3:24 PM, Anders Logg <
<email address hidden>> wrote:

> Your question #154697 on DOLFIN changed:
> https://answers.launchpad.net/dolfin/+question/154697
>
> Status: Open => Answered
>
> Anders Logg proposed the following answer:
> On Fri, Apr 29, 2011 at 08:01:55AM -0000, Nguyen Van Dang wrote:
> > New question #154697 on DOLFIN:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > Hello,
> >
> > I am working with FEnics on C++. I want to take the values of basis
> function at each vertex directly. I read BasisFunction.h online but I don't
> know how to use this one.
> >
> > Finally, I found in "Poisson.h" (created from "Poisson.ufl" in
> dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in which there
> is function "evaluate_basis(unsigned int i, double* values, double*
> coordinates, const ufc::cell& c)".
> > In "main.cpp" (in the same directory), I wrote:
> > unsigned int i;
> > double* values;
> > double* coordinates;
> > ufc::cell c;
> > poisson_finite_element_0 finite_element;
> > finite_element.evaluate_basis(i,values,coordinates,c);
> > I compiled it without any errors.
> > The problem is that how to input the value for c?
> > In fact, I have read the paper "efficient representation of computational
> meshes" of A. Logg and I could make a loop for all cells as well as
> vertices. However, the cell in this loop doesn't match with c anymore
> (because they have different type). Moreover, it is difficult to initialize
> the cell data structure:
> > c.entity_indices = new unsigned int [...];
> > c.coordinates = new double[..];
> > .....
> >
> > Is there any simple way to do this? Do you have any examples working on
> basis functions?
>
> Look at the FiniteElement class and the function
> interpolate_vertex_values.
>
> More generally (for evaluation at arbitrary points), you can use the
> functions evaluate_basis or evaluate_basis_all.
>
> --
> Anders
>
> --
> If this answers your question, please go to the following page to let us
> know that it is solved:
> https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=0
>
> If you still need help, you can reply to this email or go to the
> following page to enter your feedback:
> https://answers.launchpad.net/dolfin/+question/154697
>
> You received this question notification because you are a direct
> subscriber of the question.
>

--
*Nguyen Van Dang

Home Tel: +84 7 92 21 36 28
Another email: <email address hidden>*

Revision history for this message
Johan Hake (johan-hake) said :
#3

dolfin::FiniteElemens is a thin wrapper around ufc::finite_element and are
ment for the dolfin library to access. Therefore are most of the function only
available using ufc cell. However, some of the methods have been made
available using a dolfin::cell. These are evaluate_basis and
evaluate_basis_all. The last one only in the development version of dolfin.

Garth or Anders need to comment on if we want to dublicate more of these
functions or if we should force the user to construct a UFCCell to call the
methos with. If I am not totally of the latter should be possible by:

...
#include <"dolfin/fem/UFCCell.h">
...
dolfin::UFCCell ufc_cell(c);
finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,ufc_cell)

Johan

On Sunday May 1 2011 02:45:30 Nguyen Van Dang wrote:
> Question #154697 on DOLFIN changed:
> https://answers.launchpad.net/dolfin/+question/154697
>
> Status: Answered => Open
>
> Nguyen Van Dang is still having a problem:
> Thank you very much for your reply.
> However, I still got problem with evaluate_basis_derivatives. My code is as
> follows:
> Poisson::FunctionSpace V(mesh);
> const dolfin::FiniteElement& finite_element = V.element();
> const dolfin::Cell& c = Cell(mesh,0);
> unsigned int i = 0;
> unsigned int n = 1;
> double values[1] = {0.0};
> double coordinates[2] = {0.0,0.5};
> //finite_element.evaluate_basis(i,values,coordinates,c) ;
> //std::cout<<"basis_value ="<<*values<< std::endl;
> double dval[2] = {0.0,0.0};
> double* dvalues = &dval[0];
> unsigned int n = 1;
> finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,c) ;
> I got error because of the fourth variable c. In my program c is declared
> as dofin::Cell& but in original function its type is ufc::cell&.
> My questions are:
> 1. Why didn't I get this problem for evaluate_basis?
> 2. What will I do to fix this problem for evaluate_basis_derivatives?
>
> Please help me again.
> Thanks in advance.
> Nguyen Van Dang
>
> On Fri, Apr 29, 2011 at 3:24 PM, Anders Logg <
>
> <email address hidden>> wrote:
> > Your question #154697 on DOLFIN changed:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > Status: Open => Answered
> >
> > Anders Logg proposed the following answer:
> >
> > On Fri, Apr 29, 2011 at 08:01:55AM -0000, Nguyen Van Dang wrote:
> > > New question #154697 on DOLFIN:
> > > https://answers.launchpad.net/dolfin/+question/154697
> > >
> > > Hello,
> > >
> > > I am working with FEnics on C++. I want to take the values of basis
> >
> > function at each vertex directly. I read BasisFunction.h online but I
> > don't know how to use this one.
> >
> > > Finally, I found in "Poisson.h" (created from "Poisson.ufl" in
> >
> > dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in which
> > there is function "evaluate_basis(unsigned int i, double* values,
> > double* coordinates, const ufc::cell& c)".
> >
> > > In "main.cpp" (in the same directory), I wrote:
> > > unsigned int i;
> > > double* values;
> > > double* coordinates;
> > > ufc::cell c;
> > > poisson_finite_element_0 finite_element;
> > > finite_element.evaluate_basis(i,values,coordinates,c);
> > >
> > > I compiled it without any errors.
> > > The problem is that how to input the value for c?
> > > In fact, I have read the paper "efficient representation of
> > > computational
> >
> > meshes" of A. Logg and I could make a loop for all cells as well as
> > vertices. However, the cell in this loop doesn't match with c anymore
> > (because they have different type). Moreover, it is difficult to
> > initialize
> >
> > the cell data structure:
> > > c.entity_indices = new unsigned int [...];
> > > c.coordinates = new double[..];
> > > .....
> > >
> > > Is there any simple way to do this? Do you have any examples working on
> >
> > basis functions?
> >
> > Look at the FiniteElement class and the function
> > interpolate_vertex_values.
> >
> > More generally (for evaluation at arbitrary points), you can use the
> > functions evaluate_basis or evaluate_basis_all.
> >
> > --
> > Anders
> >
> > --
> > If this answers your question, please go to the following page to let us
> > know that it is solved:
> > https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=
> > 0
> >
> > If you still need help, you can reply to this email or go to the
> > following page to enter your feedback:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > You received this question notification because you are a direct
> > subscriber of the question.

Revision history for this message
Nguyen Van Dang (dang-1032170) said :
#4

It works. Thank you very much for your help.
However, the form of basis functions is phi(x,y). So, my expectation is
getting the gradient of these functions. It means that the output is a
vector, not a scalar. Would you like to tell me how to do that?
Thanks in advance,

Nguyen Van Dang

On Sun, May 1, 2011 at 10:27 PM, Johan Hake <
<email address hidden>> wrote:

> Your question #154697 on DOLFIN changed:
> https://answers.launchpad.net/dolfin/+question/154697
>
> Status: Open => Answered
>
> Johan Hake proposed the following answer:
> dolfin::FiniteElemens is a thin wrapper around ufc::finite_element and are
> ment for the dolfin library to access. Therefore are most of the function
> only
> available using ufc cell. However, some of the methods have been made
> available using a dolfin::cell. These are evaluate_basis and
> evaluate_basis_all. The last one only in the development version of dolfin.
>
> Garth or Anders need to comment on if we want to dublicate more of these
> functions or if we should force the user to construct a UFCCell to call the
> methos with. If I am not totally of the latter should be possible by:
>
> ...
> #include <"dolfin/fem/UFCCell.h">
> ...
> dolfin::UFCCell ufc_cell(c);
> finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,ufc_cell)
>
>
> Johan
>
>
> On Sunday May 1 2011 02:45:30 Nguyen Van Dang wrote:
> > Question #154697 on DOLFIN changed:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > Status: Answered => Open
> >
> > Nguyen Van Dang is still having a problem:
> > Thank you very much for your reply.
> > However, I still got problem with evaluate_basis_derivatives. My code is
> as
> > follows:
> > Poisson::FunctionSpace V(mesh);
> > const dolfin::FiniteElement& finite_element = V.element();
> > const dolfin::Cell& c = Cell(mesh,0);
> > unsigned int i = 0;
> > unsigned int n = 1;
> > double values[1] = {0.0};
> > double coordinates[2] = {0.0,0.5};
> > //finite_element.evaluate_basis(i,values,coordinates,c) ;
> > //std::cout<<"basis_value ="<<*values<< std::endl;
> > double dval[2] = {0.0,0.0};
> > double* dvalues = &dval[0];
> > unsigned int n = 1;
> > finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,c) ;
> > I got error because of the fourth variable c. In my program c is declared
> > as dofin::Cell& but in original function its type is ufc::cell&.
> > My questions are:
> > 1. Why didn't I get this problem for evaluate_basis?
> > 2. What will I do to fix this problem for evaluate_basis_derivatives?
> >
> > Please help me again.
> > Thanks in advance.
> > Nguyen Van Dang
> >
> > On Fri, Apr 29, 2011 at 3:24 PM, Anders Logg <
> >
> > <email address hidden>> wrote:
> > > Your question #154697 on DOLFIN changed:
> > > https://answers.launchpad.net/dolfin/+question/154697
> > >
> > > Status: Open => Answered
> > >
> > > Anders Logg proposed the following answer:
> > >
> > > On Fri, Apr 29, 2011 at 08:01:55AM -0000, Nguyen Van Dang wrote:
> > > > New question #154697 on DOLFIN:
> > > > https://answers.launchpad.net/dolfin/+question/154697
> > > >
> > > > Hello,
> > > >
> > > > I am working with FEnics on C++. I want to take the values of basis
> > >
> > > function at each vertex directly. I read BasisFunction.h online but I
> > > don't know how to use this one.
> > >
> > > > Finally, I found in "Poisson.h" (created from "Poisson.ufl" in
> > >
> > > dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in which
> > > there is function "evaluate_basis(unsigned int i, double* values,
> > > double* coordinates, const ufc::cell& c)".
> > >
> > > > In "main.cpp" (in the same directory), I wrote:
> > > > unsigned int i;
> > > > double* values;
> > > > double* coordinates;
> > > > ufc::cell c;
> > > > poisson_finite_element_0 finite_element;
> > > > finite_element.evaluate_basis(i,values,coordinates,c);
> > > >
> > > > I compiled it without any errors.
> > > > The problem is that how to input the value for c?
> > > > In fact, I have read the paper "efficient representation of
> > > > computational
> > >
> > > meshes" of A. Logg and I could make a loop for all cells as well as
> > > vertices. However, the cell in this loop doesn't match with c anymore
> > > (because they have different type). Moreover, it is difficult to
> > > initialize
> > >
> > > the cell data structure:
> > > > c.entity_indices = new unsigned int [...];
> > > > c.coordinates = new double[..];
> > > > .....
> > > >
> > > > Is there any simple way to do this? Do you have any examples working
> on
> > >
> > > basis functions?
> > >
> > > Look at the FiniteElement class and the function
> > > interpolate_vertex_values.
> > >
> > > More generally (for evaluation at arbitrary points), you can use the
> > > functions evaluate_basis or evaluate_basis_all.
> > >
> > > --
> > > Anders
> > >
> > > --
> > > If this answers your question, please go to the following page to let
> us
> > > know that it is solved:
> > >
> https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=
> > > 0
> > >
> > > If you still need help, you can reply to this email or go to the
> > > following page to enter your feedback:
> > > https://answers.launchpad.net/dolfin/+question/154697
> > >
> > > You received this question notification because you are a direct
> > > subscriber of the question.
>
> --
> If this answers your question, please go to the following page to let us
> know that it is solved:
> https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=2
>
> If you still need help, you can reply to this email or go to the
> following page to enter your feedback:
> https://answers.launchpad.net/dolfin/+question/154697
>
> You received this question notification because you are a direct
> subscriber of the question.
>

--
Nguyen Van Dang

Home Tel: +84 7 92 21 36 28
Another email: <email address hidden>

Revision history for this message
Best Johan Hake (johan-hake) said :
#5

Not sure what you mean.

You call evaluate_basis_derivatives with a value argument. Without knowing too
much how the generated code is supposed to be used, I would suspect that you
would then need to pass a pointer to a C-array with appropriate length to get
the correct values out.

Johan

On Monday May 2 2011 09:27:21 Nguyen Van Dang wrote:
> Question #154697 on DOLFIN changed:
> https://answers.launchpad.net/dolfin/+question/154697
>
> Status: Answered => Open
>
> Nguyen Van Dang is still having a problem:
> It works. Thank you very much for your help.
> However, the form of basis functions is phi(x,y). So, my expectation is
> getting the gradient of these functions. It means that the output is a
> vector, not a scalar. Would you like to tell me how to do that?
> Thanks in advance,
>
> Nguyen Van Dang
>
> On Sun, May 1, 2011 at 10:27 PM, Johan Hake <
>
> <email address hidden>> wrote:
> > Your question #154697 on DOLFIN changed:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > Status: Open => Answered
> >
> > Johan Hake proposed the following answer:
> > dolfin::FiniteElemens is a thin wrapper around ufc::finite_element and
> > are ment for the dolfin library to access. Therefore are most of the
> > function only
> > available using ufc cell. However, some of the methods have been made
> > available using a dolfin::cell. These are evaluate_basis and
> > evaluate_basis_all. The last one only in the development version of
> > dolfin.
> >
> > Garth or Anders need to comment on if we want to dublicate more of these
> > functions or if we should force the user to construct a UFCCell to call
> > the methos with. If I am not totally of the latter should be possible
> > by:
> >
> > ...
> > #include <"dolfin/fem/UFCCell.h">
> > ...
> > dolfin::UFCCell ufc_cell(c);
> > finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,ufc_cel
> > l)
> >
> >
> > Johan
> >
> > On Sunday May 1 2011 02:45:30 Nguyen Van Dang wrote:
> > > Question #154697 on DOLFIN changed:
> > > https://answers.launchpad.net/dolfin/+question/154697
> > >
> > > Status: Answered => Open
> > >
> > > Nguyen Van Dang is still having a problem:
> > > Thank you very much for your reply.
> > > However, I still got problem with evaluate_basis_derivatives. My code
> > > is
> >
> > as
> >
> > > follows:
> > > Poisson::FunctionSpace V(mesh);
> > > const dolfin::FiniteElement& finite_element = V.element();
> > > const dolfin::Cell& c = Cell(mesh,0);
> > > unsigned int i = 0;
> > > unsigned int n = 1;
> > > double values[1] = {0.0};
> > > double coordinates[2] = {0.0,0.5};
> > > //finite_element.evaluate_basis(i,values,coordinates,c) ;
> > > //std::cout<<"basis_value ="<<*values<< std::endl;
> > > double dval[2] = {0.0,0.0};
> > > double* dvalues = &dval[0];
> > > unsigned int n = 1;
> > > finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,c)
> > > ;
> > >
> > > I got error because of the fourth variable c. In my program c is
> > > declared as dofin::Cell& but in original function its type is
> > > ufc::cell&. My questions are:
> > > 1. Why didn't I get this problem for evaluate_basis?
> > > 2. What will I do to fix this problem for evaluate_basis_derivatives?
> > >
> > > Please help me again.
> > > Thanks in advance.
> > > Nguyen Van Dang
> > >
> > > On Fri, Apr 29, 2011 at 3:24 PM, Anders Logg <
> > >
> > > <email address hidden>> wrote:
> > > > Your question #154697 on DOLFIN changed:
> > > > https://answers.launchpad.net/dolfin/+question/154697
> > > >
> > > > Status: Open => Answered
> > > >
> > > > Anders Logg proposed the following answer:
> > > >
> > > > On Fri, Apr 29, 2011 at 08:01:55AM -0000, Nguyen Van Dang wrote:
> > > > > New question #154697 on DOLFIN:
> > > > > https://answers.launchpad.net/dolfin/+question/154697
> > > > >
> > > > > Hello,
> > > > >
> > > > > I am working with FEnics on C++. I want to take the values of basis
> > > >
> > > > function at each vertex directly. I read BasisFunction.h online but I
> > > > don't know how to use this one.
> > > >
> > > > > Finally, I found in "Poisson.h" (created from "Poisson.ufl" in
> > > >
> > > > dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in
> > > > which there is function "evaluate_basis(unsigned int i, double*
> > > > values, double* coordinates, const ufc::cell& c)".
> > > >
> > > > > In "main.cpp" (in the same directory), I wrote:
> > > > > unsigned int i;
> > > > > double* values;
> > > > > double* coordinates;
> > > > > ufc::cell c;
> > > > > poisson_finite_element_0 finite_element;
> > > > > finite_element.evaluate_basis(i,values,coordinates,c);
> > > > >
> > > > > I compiled it without any errors.
> > > > > The problem is that how to input the value for c?
> > > > > In fact, I have read the paper "efficient representation of
> > > > > computational
> > > >
> > > > meshes" of A. Logg and I could make a loop for all cells as well as
> > > > vertices. However, the cell in this loop doesn't match with c anymore
> > > > (because they have different type). Moreover, it is difficult to
> > > > initialize
> > > >
> > > > the cell data structure:
> > > > > c.entity_indices = new unsigned int [...];
> > > > > c.coordinates = new double[..];
> > > > > .....
> > > > >
> > > > > Is there any simple way to do this? Do you have any examples
> > > > > working
> >
> > on
> >
> > > > basis functions?
> > > >
> > > > Look at the FiniteElement class and the function
> > > > interpolate_vertex_values.
> > > >
> > > > More generally (for evaluation at arbitrary points), you can use the
> > > > functions evaluate_basis or evaluate_basis_all.
> > > >
> > > > --
> > > > Anders
> > > >
> > > > --
> > > > If this answers your question, please go to the following page to let
> >
> > us
> >
> > > > know that it is solved:
> > https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=
> >
> > > > 0
> > > >
> > > > If you still need help, you can reply to this email or go to the
> > > > following page to enter your feedback:
> > > > https://answers.launchpad.net/dolfin/+question/154697
> > > >
> > > > You received this question notification because you are a direct
> > > > subscriber of the question.
> >
> > --
> > If this answers your question, please go to the following page to let us
> > know that it is solved:
> > https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=
> > 2
> >
> > If you still need help, you can reply to this email or go to the
> > following page to enter your feedback:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > You received this question notification because you are a direct
> > subscriber of the question.

Revision history for this message
Anders Logg (logg) said :
#6

Just look it up in the UFC manual.

--
Anders

On Mon, May 02, 2011 at 09:40:24AM -0700, Johan Hake wrote:
> Not sure what you mean.
>
> You call evaluate_basis_derivatives with a value argument. Without knowing too
> much how the generated code is supposed to be used, I would suspect that you
> would then need to pass a pointer to a C-array with appropriate length to get
> the correct values out.
>
> Johan
>
> On Monday May 2 2011 09:27:21 Nguyen Van Dang wrote:
> > Question #154697 on DOLFIN changed:
> > https://answers.launchpad.net/dolfin/+question/154697
> >
> > Status: Answered => Open
> >
> > Nguyen Van Dang is still having a problem:
> > It works. Thank you very much for your help.
> > However, the form of basis functions is phi(x,y). So, my expectation is
> > getting the gradient of these functions. It means that the output is a
> > vector, not a scalar. Would you like to tell me how to do that?
> > Thanks in advance,
> >
> > Nguyen Van Dang
> >
> > On Sun, May 1, 2011 at 10:27 PM, Johan Hake <
> >
> > <email address hidden>> wrote:
> > > Your question #154697 on DOLFIN changed:
> > > https://answers.launchpad.net/dolfin/+question/154697
> > >
> > > Status: Open => Answered
> > >
> > > Johan Hake proposed the following answer:
> > > dolfin::FiniteElemens is a thin wrapper around ufc::finite_element and
> > > are ment for the dolfin library to access. Therefore are most of the
> > > function only
> > > available using ufc cell. However, some of the methods have been made
> > > available using a dolfin::cell. These are evaluate_basis and
> > > evaluate_basis_all. The last one only in the development version of
> > > dolfin.
> > >
> > > Garth or Anders need to comment on if we want to dublicate more of these
> > > functions or if we should force the user to construct a UFCCell to call
> > > the methos with. If I am not totally of the latter should be possible
> > > by:
> > >
> > > ...
> > > #include <"dolfin/fem/UFCCell.h">
> > > ...
> > > dolfin::UFCCell ufc_cell(c);
> > > finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,ufc_cel
> > > l)
> > >
> > >
> > > Johan
> > >
> > > On Sunday May 1 2011 02:45:30 Nguyen Van Dang wrote:
> > > > Question #154697 on DOLFIN changed:
> > > > https://answers.launchpad.net/dolfin/+question/154697
> > > >
> > > > Status: Answered => Open
> > > >
> > > > Nguyen Van Dang is still having a problem:
> > > > Thank you very much for your reply.
> > > > However, I still got problem with evaluate_basis_derivatives. My code
> > > > is
> > >
> > > as
> > >
> > > > follows:
> > > > Poisson::FunctionSpace V(mesh);
> > > > const dolfin::FiniteElement& finite_element = V.element();
> > > > const dolfin::Cell& c = Cell(mesh,0);
> > > > unsigned int i = 0;
> > > > unsigned int n = 1;
> > > > double values[1] = {0.0};
> > > > double coordinates[2] = {0.0,0.5};
> > > > //finite_element.evaluate_basis(i,values,coordinates,c) ;
> > > > //std::cout<<"basis_value ="<<*values<< std::endl;
> > > > double dval[2] = {0.0,0.0};
> > > > double* dvalues = &dval[0];
> > > > unsigned int n = 1;
> > > > finite_element.evaluate_basis_derivatives(i,n,dvalues,coordinates,c)
> > > > ;
> > > >
> > > > I got error because of the fourth variable c. In my program c is
> > > > declared as dofin::Cell& but in original function its type is
> > > > ufc::cell&. My questions are:
> > > > 1. Why didn't I get this problem for evaluate_basis?
> > > > 2. What will I do to fix this problem for evaluate_basis_derivatives?
> > > >
> > > > Please help me again.
> > > > Thanks in advance.
> > > > Nguyen Van Dang
> > > >
> > > > On Fri, Apr 29, 2011 at 3:24 PM, Anders Logg <
> > > >
> > > > <email address hidden>> wrote:
> > > > > Your question #154697 on DOLFIN changed:
> > > > > https://answers.launchpad.net/dolfin/+question/154697
> > > > >
> > > > > Status: Open => Answered
> > > > >
> > > > > Anders Logg proposed the following answer:
> > > > >
> > > > > On Fri, Apr 29, 2011 at 08:01:55AM -0000, Nguyen Van Dang wrote:
> > > > > > New question #154697 on DOLFIN:
> > > > > > https://answers.launchpad.net/dolfin/+question/154697
> > > > > >
> > > > > > Hello,
> > > > > >
> > > > > > I am working with FEnics on C++. I want to take the values of basis
> > > > >
> > > > > function at each vertex directly. I read BasisFunction.h online but I
> > > > > don't know how to use this one.
> > > > >
> > > > > > Finally, I found in "Poisson.h" (created from "Poisson.ufl" in
> > > > >
> > > > > dolfin/demo/pde/poisson/cpp) class "poisson_finite_element_0" in
> > > > > which there is function "evaluate_basis(unsigned int i, double*
> > > > > values, double* coordinates, const ufc::cell& c)".
> > > > >
> > > > > > In "main.cpp" (in the same directory), I wrote:
> > > > > > unsigned int i;
> > > > > > double* values;
> > > > > > double* coordinates;
> > > > > > ufc::cell c;
> > > > > > poisson_finite_element_0 finite_element;
> > > > > > finite_element.evaluate_basis(i,values,coordinates,c);
> > > > > >
> > > > > > I compiled it without any errors.
> > > > > > The problem is that how to input the value for c?
> > > > > > In fact, I have read the paper "efficient representation of
> > > > > > computational
> > > > >
> > > > > meshes" of A. Logg and I could make a loop for all cells as well as
> > > > > vertices. However, the cell in this loop doesn't match with c anymore
> > > > > (because they have different type). Moreover, it is difficult to
> > > > > initialize
> > > > >
> > > > > the cell data structure:
> > > > > > c.entity_indices = new unsigned int [...];
> > > > > > c.coordinates = new double[..];
> > > > > > .....
> > > > > >
> > > > > > Is there any simple way to do this? Do you have any examples
> > > > > > working
> > >
> > > on
> > >
> > > > > basis functions?
> > > > >
> > > > > Look at the FiniteElement class and the function
> > > > > interpolate_vertex_values.
> > > > >
> > > > > More generally (for evaluation at arbitrary points), you can use the
> > > > > functions evaluate_basis or evaluate_basis_all.
> > > > >
> > >
> > > us
> > >
> > > > > know that it is solved:
> > > https://answers.launchpad.net/dolfin/+question/154697/+confirm?answer_id=
> > >
> > > > > 0
> > > > >
> > > > > If you still need help, you can reply to this email or go to the
> > > > > following page to enter your feedback:
> > > > > https://answers.launchpad.net/dolfin/+question/154697
> > > > >
> > > > > You received this question notification because you are a direct
> > > > > subscriber of the question.
> > >
>
> _______________________________________________
> Mailing list: https://launchpad.net/~dolfin
> Post to : <email address hidden>
> Unsubscribe : https://launchpad.net/~dolfin
> More help : https://help.launchpad.net/ListHelp

Revision history for this message
Nguyen Van Dang (dang-1032170) said :
#7

Thanks Johan Hake, that solved my question.