I’m having trouble determining if I’ve completed all the necessary steps for importing a .xml mesh into fenics.
I have a .xml mesh. I am importing it using this code:
from dolfin import *
mesh = Mesh('mesh.xml')
Simple enough. However, I started poking around and called the num_edges() and num_faces() methods which returned zero. This did not seem correct. I now know that I need to initialize entities of a certain dimension with the init() method. Here is me doing that.
Anecdotally, I have never had a problem using a Mesh without manually calling init.
Out of curiosity, I took a look at the code on Bitbucket, and my understanding of it is that typical usage of FEniCS should not require manually calling init. From the comments of dolfin/mesh/Mesh.h:
/// Note that for efficiency, only entities of dimension zero
/// (vertices) and entities of the maximal dimension (cells) exist
/// when creating a _Mesh_. Other entities must be explicitly created
/// by calling init(). For example, all edges in a mesh may be
/// created by a call to mesh.init(1). Similarly, connectivities
/// such as all edges connected to a given vertex must also be
/// explicitly created (in this case by a call to mesh.init(0, 1)).
However, calls to Mesh::init for intermediate-dimensional entities appear to be made on an as-needed basis by functions like Assembler::assemble_exterior_facets, and would not normally need to be invoked by the end-user. For example, from dolfin/fem/Assembler.cpp:
// Compute facets and facet - cell connectivity if not already computed
const std::size_t D = mesh.topology().dim();
mesh.init(D - 1);
mesh.init(D - 1, D);
From the implementation of Mesh::init, you can see that there is a check to avoid redundant initialization:
// Skip if already computed
if (_topology.size(dim) > 0)
return _topology.size(dim);