← Back to team overview

dolfin team mailing list archive

Re: Subdomain.mark

 

Anders Logg wrote:
On Tue, Apr 01, 2008 at 02:32:17PM +0200, Murtazo Nazarov wrote:
Anders Logg wrote:
On Mon, Mar 31, 2008 at 07:15:23PM +0200, Murtazo Nazarov wrote:
Anders Logg wrote:
On Mon, Mar 31, 2008 at 03:52:57PM +0200, Murtazo Nazarov wrote:
Hi,

I want to apply a boundary condition to the vertices on a boundary. For that I define:

// Sub domain for MyBC class MyBC_Boundary2D : public SubDomain
{
public:
  bool inside(const real* p, bool on_boundary) const
  {
    return  on_boundary && (p[0] < xmax - bmarg) && (p[0] > xmin + bmarg);
  }
};

Then I initialize:
//----------------------------------------------------------------------------- void MyBC::init(SubDomain& sub_domain)
{ ...
  mesh.init(0);
  sub_domains = new MeshFunction<uint>(mesh, 0);
...}
Do you remember to set everything to 1 (number of subdomains) here?

Yes I do:

// Mark everything as sub domain 1 (*sub_domains) = 1;


// Mark the sub domain as sub domain 0 sub_domain.mark(*sub_domains, 0);

/murtazo
Then I have no idea. You just need to dig into the code and see what
goes wrong.

I think I found a mistake in Subdomain.mark(). The thing is bool on_boundary should be defined
 inside the loop for computing subdomain marker:

// Always false when not marking facets //bool on_boundary = false;

// Compute sub domain markers
  for (MeshEntityIterator entity(mesh, dim); !entity.end(); ++entity)
  {
    bool on_boundary = false;
    ...
   }

Otherwise, if you want to apply a boundary condition on vertices, it becomes always
true after once meeting a vertex on the boundary.


It solved problem for me.

I'm not sure. If you are marking vertices, then they will never be on
the boundary, unless you are doing this for a 1-dimensional mesh
(which typically has just 2 boundary vertices). Only *facets* will
ever be marked as being on the boundary, so for a 2-dimensional mesh,
edges on the boundary will be marked as being on the boundary and for
a 3-dimensional mesh, faces on the boundary will be marked as being on
the boundary.

With the change I wrote I was able to mark vertices. Because,
if I mark facets or faces, I miss some nodes in the boundary
of the subdomain where I am applying my bc. That destroys
the solution. Now, I apply my boundary only for vertices
I need, and I do not miss any nodes. It work perfectly with
the slip BC.

/murtazo




Follow ups

References