Anders Logg wrote:
> On Sun, Feb 17, 2008 at 10:35:25PM +0100, [EMAIL PROTECTED] wrote:
>   
>>>> On Fri, Feb 15, 2008 at 02:46:25PM +0100, [EMAIL PROTECTED] wrote:
>>>>         
>>>>>> On Thu, Feb 14, 2008 at 05:15:46PM +0100, [EMAIL PROTECTED] wrote:
>>>>>>             
>>>>>>>> On Thu, Feb 14, 2008 at 10:06:43AM +0100, Kristen Kaasbjerg wrote:
>>>>>>>>                 
>>>>>>>>> Anders Logg wrote:
>>>>>>>>>                   
>>>>>>>>>> On Wed, Feb 13, 2008 at 10:50:23PM +0100, [EMAIL PROTECTED]
>>>>>>>>>>                     
>>>>> wrote:
>>>>>           
>>>>>>>>>>>>> On Wed, Feb 13, 2008 at 08:49:09PM +0100, Shilpa Khatri
>>>>>>>>>>>>>                           
>>>>> wrote:
>>>>>           
>>>>>>>>>>>>>> We (Dag and I) are doing this because we would like to have
>>>>>>>>>>>>>>                             
>>>>>>> Dolfin
>>>>>>>               
>>>>>>>>>>>>>> solve
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> Stokes/Navier-Stokes equations as one part of a timestep in
>>>>>>>>>>>>>>                             
>>>>> our
>>>>>           
>>>>>>>>> code
>>>>>>>>>                   
>>>>>>>>>>>>>> where we
>>>>>>>>>>>>>> are moving interfaces that are defined as a random set of
>>>>>>>>>>>>>>                             
>>>>>>> points
>>>>>>>               
>>>>>>>>> in the
>>>>>>>>>                   
>>>>>>>>>>>>>> domain.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>> Shilpa
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>                             
>>>>>>>>>>>>> Then I suggest first finding out which cells those points
>>>>>>>>>>>>>                           
>>>>> lie
>>>>>           
>>>>>>> in,
>>>>>>>               
>>>>>>>>> then
>>>>>>>>>                   
>>>>>>>>>>>>> then for each cell with a point get the expansion
>>>>>>>>>>>>>                           
>>>>> coefficients
>>>>>           
>>>>>>>>> within
>>>>>>>>>                   
>>>>>>>>>>>>> that cell, then multiply those coefficients with the values
>>>>>>>>>>>>>                           
>>>>> of
>>>>>           
>>>>>>> the
>>>>>>>               
>>>>>>>>>>>>> basis functions at the points.
>>>>>>>>>>>>>
>>>>>>>>>>>>> The basis functions are available from the
>>>>>>>>>>>>>                           
>>>>> ufc::finite_element.
>>>>>           
>>>>>>>>>>>>> We can implement a suitable interface for this at some point
>>>>>>>>>>>>>                           
>>>>> but
>>>>>           
>>>>>>>>>>>>> until then, you can do it manually.
>>>>>>>>>>>>>
>>>>>>>>>>>>>                           
>>>>>>>>>>>> Sounds good. Is the GTS_Interface still in place for
>>>>>>>>>>>>                         
>>>>> searching?
>>>>>           
>>>>>>>>>>>> /Dag
>>>>>>>>>>>>
>>>>>>>>>>>>                         
>>>>>>>>>>> I'm a little lost here. How is the ufc module used to get hold
>>>>>>>>>>> of the basis functions ?
>>>>>>>>>>>
>>>>>>>>>>> Kristen
>>>>>>>>>>>
>>>>>>>>>>>                       
>>>>>>>>>> You need to get hold of a ufc::finite_element and then call
>>>>>>>>>> evaluate_basis_function (see UFC manual). If you have a
>>>>>>>>>>                     
>>>>> ufc::form,
>>>>>           
>>>>>>>>>> then you can create a ufc::finite_element by calling
>>>>>>>>>> create_finite_element. If you have a dolfin::Form, then first
>>>>>>>>>>                     
>>>>> get
>>>>>           
>>>>>>> the
>>>>>>>               
>>>>>>>>>> ufc::form by calling form().
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>                     
>>>>>>>>> Ok, so this is doable via the python interface ?
>>>>>>>>> In case yes, where is the dolfin::Form then hidden ?
>>>>>>>>>
>>>>>>>>> Kristen
>>>>>>>>>                   
>>>>>>>> Yes, you can use it from the Python interface by calling the JIT
>>>>>>>> compiler:
>>>>>>>>
>>>>>>>>   (compiled_form, compiled_module, form_data) = jit(a)
>>>>>>>>
>>>>>>>> You can then call compiled_form.create_finite_element(i) etc
>>>>>>>> since this will be a Python wrapper for a ufc::form.
>>>>>>>>
>>>>>>>> BUT: If you are using the Python interface, then everything is
>>>>>>>>                 
>>>>> already
>>>>>           
>>>>>>>> available through the Python interface, so if you have a
>>>>>>>> FiniteElement, you can tabulate it's values at any point by
>>>>>>>>                 
>>>>> calling
>>>>>           
>>>>>>>> element.tabulate(). Note that this gives you values on the
>>>>>>>>                 
>>>>> reference
>>>>>           
>>>>>>>> element so you need to map the values to the physical element.
>>>>>>>>
>>>>>>>> Another comment is that things like this are better (more
>>>>>>>>                 
>>>>> efficiently)
>>>>>           
>>>>>>>> implemented as C++ components in DOLFIN and then wrapped back to
>>>>>>>> Python for general use.
>>>>>>>>                 
>>>>>>> Yes, I know. I only have to evaluate the potential at very few
>>>>>>>               
>>>>> points
>>>>>           
>>>>>>> (< 100) though, so this wont be too expensive.
>>>>>>> What about the expansion coefficients - there must be a set for each
>>>>>>> cell ?
>>>>>>>               
>>>>>> You mean getting hold of the expansion coefficients so you can
>>>>>> multiply them with the basis functions? These are in the Vector of
>>>>>> degrees of freedom that each Function has:
>>>>>>
>>>>>>   x = u.vector()
>>>>>>
>>>>>> Then you need to get hold of the local-to-global mapping (which
>>>>>>             
>>>>> values
>>>>>           
>>>>>> in this vector that are the coefficients on any given element).
>>>>>>
>>>>>> The easiest way to do this is to let DOLFIN handle it by calling
>>>>>> u.interpolate() to get the coefficients on a given cell.
>>>>>>
>>>>>>             
>>>>> well, it seems to be an awful lot easier than I expected.
>>>>> It is hard to penetrate these things when an proper overview
>>>>> of the whole program structure is absent.
>>>>>           
>>>> Yes, the manual is in a sorry state.
>>>>
>>>>         
>>>>> If I understand you correctly then u.interpolate() returns the
>>>>> coefficients of the basis on a given cell, correct?
>>>>>           
>>>> Yes.
>>>>
>>>>         
>>>>> These then
>>>>> have to be multiplied by expansion coefficient from u.vector()
>>>>> which again have to multiplied by the returned array from
>>>>> element.tabulate(0,([x,y])).
>>>>>           
>>>> No, it's enough to multiply what you get from u.interpolate() with the
>>>> values of the basis functions. (What the interpolation does is just to
>>>> pick the correct values from the vector.)
>>>>
>>>>         
>>>>> One more thing. How are the coefficient extracted from the vector
>>>>> from u.vector()
>>>>>           
>>>> It is done by tabulating the local-to-global mapping (dofmap) on a
>>>> cell and then picking the values from the locations in the vector
>>>> given by the local-to-global mapping.
>>>>
>>>>         
>>>>> and what is the difference between ufc::cell and
>>>>> dolfin::Cell (arguments for the interpolate attribute of Function)?
>>>>>           
>>>> ufc::cell is a simple class that is used to pass data through the
>>>> UFC-interface (which is not DOLFIN-specific and can be used by other
>>>> libraries).
>>>>
>>>> dolfin::Cell is the DOLFIN implementation of a cell in a mesh. What we
>>>> do is that we take the dolfin::Cell and then extract the values we
>>>> need and put into the ufc::cell. There is a simple class UFCCell (yes,
>>>> a third cell class) which helps you do this.
>>>>         
>>> OK, so I now have the outputs from u.interpolate and element.tabulate.
>>> Then I need the wrapping from the reference element to the physical
>>> element. Any easy ways to do this from Python ?
>>>       
>> Correction:
>> OK, so I now have the outputs from u.interpolate and element.tabulate.
>> Then I need the mapping from the reference element to the physical
>> element. Any easy ways to do this from Python ?
>>
>> Kristen
>>     
>
> I don't think that should be necessary. The basis functions are
> evaluated directly on the physical element so just go ahead and
> compute the linear combination.
>
> (The mapping from reference to physical element is built into
> evaluate_basis.)
>
>   
Ok, but then I must have missed something. Let's agree on the
following steps towards the evaluation of the function u in (x,y)
(in python!):
- step #1: find cell that contains (x,y) (has been sorted out)
- step #2: u.interpolate -> expansion coefficients on the given cell
                 (has been sorted out)
- step #3: evaluate the basis functions of the relevant element in the
                 point (x,y) (not yet sorted out)

How is step #3 to be done in python ? Should the evaluate_basis 
attribute of the ufc::finite_element be used here ?

Kristen


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

Reply via email to