Anders Logg wrote:
> On Tue, Apr 01, 2008 at 11:37:58PM +0200, Murtazo Nazarov wrote:
>   
>>> On Tue, Apr 01, 2008 at 09:52:02PM +0200, Murtazo Nazarov wrote:
>>>       
>>>>> Quoting Murtazo Nazarov <[EMAIL PROTECTED]>:
>>>>>
>>>>>           
>>>>>> 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
>>>>         
>>> I still don't understand what the problem is. What kind of mesh do you
>>> have? Triangles or tetrahedra? What are you marking? Vertices?
>>>
>>> If you are marking vertices, then on_boundary should always be
>>> false. It is set to false on line 53 and it will never change since
>>> line 60 will not be reached.
>>>       
>> Ok, I see. It seems we are looking to some different version of DOLFIN. My
>> Subdomain.init looks like the following:
>>
>>   // Always false when not marking facets
>>   //bool on_boundary = false;
>>
>>   // Compute sub domain markers
>>   for (MeshEntityIterator entity(mesh, dim); !entity.end(); ++entity)
>>   {
>>     // on_boundary should be initialized here:
>>     bool on_boundary = false;
>>
>>     // Check if entity is on the boundary if entity is a facet
>>     if (dim == D - 1)
>>       on_boundary = entity->numEntities(D) == 1;
>>     if (dim == 0)
>>     {
>>       for (FacetIterator fi(*entity); !fi.end(); ++fi)
>>       {
>>         if(fi->numEntities(D) == 1)
>>           on_boundary = true;
>>       }
>>     }
>>     ...
>>    }
>>
>> Now, you see then in the loop FacetIterator on_boundary is true, even if
>> we iterate over the vertices. Here dim = 0.
>>
>> /murtazo
>>     
>
> ok, good. So does it work for you with the latest version?
>
>   
Yes, It works for me with the latest version of Subdomain.cpp (from 
dolfin-dev) and with dolfin-snapshot-2008-01-21.


/murtazo
_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev

Reply via email to