From: Truman E. <tr...@ic...> - 2011-08-30 19:57:56
|
I have a question about FEMSystem::init_context and inherited instances like NavierSystem::init_context from example 18. Why is it necessary to call get_JxW(), get_phi(), etc? In FEMSystem::assembly() this is only called once before we have actually started looping over any elements. Furthermore, all of the get_* functions are actually called again in the appropriate *_time_derivative, and *_constraint functions. I believe they are appropriate in this latter case because a specific element has been specified at this point. I tried commenting out this block of code in ex18, and it doesn't appear to break anything. Can anyone explain if and what the purpose of this code is? Thanks, -- Truman Ellis |
From: John P. <jwp...@gm...> - 2011-08-30 20:01:38
|
On Tue, Aug 30, 2011 at 1:57 PM, Truman Ellis <tr...@ic...> wrote: > I have a question about FEMSystem::init_context and inherited instances like > NavierSystem::init_context from example 18. Why is it necessary to call > get_JxW(), get_phi(), etc? In FEMSystem::assembly() this is only called once > before we have actually started looping over any elements. Furthermore, all > of the get_* functions are actually called again in the appropriate > *_time_derivative, and *_constraint functions. I believe they are > appropriate in this latter case because a specific element has been > specified at this point. I tried commenting out this block of code in ex18, > and it doesn't appear to break anything. Can anyone explain if and what the > purpose of this code is? This tells the FE object that we will need the JxW, phi, etc values eventually, and that it should compute them. Here's the get_phi() implementation. Note that it sets the calculate_phi flag. const std::vector<std::vector<Real> >& get_phi() const { libmesh_assert(!calculations_started || calculate_phi); calculate_phi = true; return phi; } -- John |
From: Truman E. <tr...@ic...> - 2011-08-30 20:06:43
|
On 08/30/2011 03:00 PM, John Peterson wrote: > On Tue, Aug 30, 2011 at 1:57 PM, Truman Ellis <tr...@ic...> wrote: >> I have a question about FEMSystem::init_context and inherited instances like >> NavierSystem::init_context from example 18. Why is it necessary to call >> get_JxW(), get_phi(), etc? In FEMSystem::assembly() this is only called once >> before we have actually started looping over any elements. Furthermore, all >> of the get_* functions are actually called again in the appropriate >> *_time_derivative, and *_constraint functions. I believe they are >> appropriate in this latter case because a specific element has been >> specified at this point. I tried commenting out this block of code in ex18, >> and it doesn't appear to break anything. Can anyone explain if and what the >> purpose of this code is? > This tells the FE object that we will need the JxW, phi, etc values > eventually, and that it should compute them. > > Here's the get_phi() implementation. Note that it sets the calculate_phi flag. > > const std::vector<std::vector<Real> >& get_phi() const > { libmesh_assert(!calculations_started || calculate_phi); > calculate_phi = true; return phi; } > So it is a performance issue? How does this handle p-adaptivity? -- Truman Ellis |
From: Roy S. <roy...@ic...> - 2011-08-30 20:20:23
|
On Tue, 30 Aug 2011, Truman Ellis wrote: > So it is a performance issue? Yes. If you don't prerequest anything, then everything gets calculated by FE::reinit. If you prerequest some things, then only those things get calculated. > How does this handle p-adaptivity? It assumes that you want the same things for every p level. If you've got some weird formulation that uses only phi for p=3 but only dphi for p=4, then you'll be stuck calculating both all the time. --- Roy |