dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #07074
Re: Subdomain.mark
Quoting Murtazo Nazarov <murtazo@xxxxxxxxxxx>:
> 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.
Sounds like a similar issue that we have for Discontinuous elements. Have you
tried to apply BCs using a geometrical (or pointwise) approach?
Kristian
> /murtazo
>
>
> _______________________________________________
> DOLFIN-dev mailing list
> DOLFIN-dev@xxxxxxxxxx
> http://www.fenics.org/mailman/listinfo/dolfin-dev
>
Follow ups
References