← Back to team overview

dolfin team mailing list archive

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