← Back to team overview

dolfin team mailing list archive

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?
>

Yes, I have. But as I said I had a problem with some side nodes. The
boundary condition did not apply to those nodes. Therefore I got incorrect
result. But, with this approach everything went well.

/murtazo

> Kristian
>
>> /murtazo
>>
>>
>> _______________________________________________
>> DOLFIN-dev mailing list
>> DOLFIN-dev@xxxxxxxxxx
>> http://www.fenics.org/mailman/listinfo/dolfin-dev
>>
>
>
>




Follow ups

References