← Back to team overview

dolfin team mailing list archive

Re: eval query

 

On Oct 18 2009, mspieg wrote:


On Oct 16, 2009, at 6:04 PM, Anders Logg wrote:

On Fri, Oct 16, 2009 at 03:34:06PM -0400, mspieg wrote:
Hi All,
I'm trying to update a working 0.9.3 code to 0.9.4, and I need to understand
the new interfaces for Function::eval a bit better.

I had things working fine with the old interface

Function::eval (double *values, const double *x, const ufc::cell &ufc_cell,
uint cell_index)

and am trying to understand how to efficiently use

Function::eval (double *values, const double *x, const Cell &dolfin_cell, const
ufc::cell &ufc_cell)

(My codes need to do a large number of evals at arbitrary points and cells
efficiently)

among other things, is there an easy way to update the index of a cell, without constructing a new Cell every time? (or shouldn't I be worrying about this).

Constructing a cell should not cost that much. It just stores the
index, the dimension and a reference to the mesh.

If you are using iterators over a mesh, then you already have the cell
by dereferencing the pointer. The typical usage would be

UFCCell ufc_cell(mesh);
for (CellIterator cell(mesh); !mesh.end(); ++cell)
{
  ufc_cell.update(*cell);

  f.eval(values, x, *cell, ufc_cell);
}

But perhaps you don't use iterators?

Thanks Anders,
I haven't been using iterators because I've been overloading eval (double* values, Data& data) and getting the cells passed through data during assembly

the issue is that I'm not necessarily evaluating at the position and cell in data, but at another point and cell derived from the current location and cell (it's basically a particle tracking problem).

Ideally, given data I would set another Data structure (data_prime) with the new point, cell and ufc_cell, then call eval as needed. As long as the cost to construct a cell is small, it will probably be easy enough to do with the current code (the problem is I need to do this at every quadrature point, and I found previously that construction of UFCCell at every point was exceptionally expensive).


Yes, a UFCCell is expensive to construct as it allocates memory dynamically. UFCCell::update should be cheap though.

 UFCCell ufc_cell(mesh);
 for (CellIterator . . . . )
 {
   ufc_cell.update(*cell);
 }

Garth

Anyway, I'll play around a bit more and if I have specific issues or design questions, I'll let you know.

cheers
marc





Anyway, I need to play with things a bit more, but looking at the source code
for eval,  I was also wondering
if lines 320 and 321 are required as line 322 doesn't seem to require cell.

 typo? bug? or general ignorance on my part (probably the latter).

Yes, lines 320-321 should be removed. Thanks for noticing. I've fixed
this now.

--
Anders


cheers
marc

void Function::eval(double* values, const Data& data) const

00311 {
00312   assert(values);
00313   assert(_function_space);
00314
00315   // Check if UFC cell if available and cell matches
00316 if (data._dolfin_cell && _function_space->has_cell (*data._dolfin_cell))
00317   {
00318     // Efficient evaluation on given cell
00319     assert(data._ufc_cell);
00320 const uint cell_index = data._ufc_cell->entity_indices [data._ufc_cell->topological_dimension][0];
00321     Cell cell(_function_space->mesh(), cell_index);
00322     eval(values, data.x, *data._dolfin_cell, *data._ufc_cell);
00323   }
00324   else
00325   {
00326     // Redirect to point-based evaluation
00327     eval(values, data.x);
00328   }
00329 }

----------------------------------------------------
Marc Spiegelman
Lamont-Doherty Earth Observatory
Dept. of Applied Physics/Applied Math
Columbia University
http://www.ldeo.columbia.edu/~mspieg
tel: 845 704 2323 (SkypeIn)
----------------------------------------------------



_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev

_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev

----------------------------------------------------
Marc Spiegelman
Lamont-Doherty Earth Observatory
Dept. of Applied Physics/Applied Math
Columbia University
http://www.ldeo.columbia.edu/~mspieg
tel: 845 704 2323 (SkypeIn)
----------------------------------------------------






References