FEniCS:从单元格中提取点

计算科学 C++ 芬尼克斯
2021-12-07 22:35:57

我想遍历单纯形的所有边缘(在网格中)。为此:如何从单元格中提取点?

这是针对 的evalC++ 定义的方法Expression,即

void eval(Array<double>& v,                                                     
          const Array<double>& x,                                               
          const ufc::cell& c                                                    
         ) const
{
Cell cell(*mesh, c.index);                                                  
// do something with cell?
}
2个回答

您始终可以使用迭代器来访问连接到单元格的实体,例如您的案例中的边缘。正如您所建议的,您首先需要从 ufc::cell 创建一个 dolfin::Cell。然后做这样的事情:

void eval(Array<double>& v,                                                     
          const Array<double>& x,                                               
          const ufc::cell& c) const
{
  Cell cell(*mesh, c.index);                                                  
  for (EdgeIterator edge(cell); !edge.end(); ++edge)
  {
    // Do something with edge
  }
}

为了速度,也许更容易访问,您可以直接访问边缘(维度 1 的实体如下):

const unsigned int* edge_indices = cell.entities(1);
Edge e0(mesh, edge_indices[0]);
Edge e1(mesh, edge_indices[1]);
Edge e2(mesh, edge_indices[2]);

以类似的方式,您可以访问边的顶点(通过调用cell.entities(0)or ei.entities(0))。

请注意,要使其正常工作,您需要实例化网格的边缘(它们将由迭代器自动创建)。你可以这样做

mesh.init(1);

这应该做。在这里,我假设这mesh是您的网格,Q是函数空间,并且您在 python 中使用了 dolfin 接口。

for (i, cell) in enumerate(cells(mesh)):
    print "Global dofs associated with cell %d: " % i
    print Q.dofmap().cell_dofs(i)
    print "The Dof coordinates:"
    print Q.dofmap().tabulate_coordinates(cell)