dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #07069
Re: Subdomain.mark
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.
--
Anders
Follow ups
References