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.