On Thu, 21 Feb 2013, Manav Bhatia wrote:

What is throwing me off is that the class documentation of Euler2_Solver says: 

 * Euler solves u' = f(theta*u_new + (1-theta)*u_old),
 * Euler2 solves u' = theta*f(u_new) + (1-theta)*f(u_old)

which seems to imply that no mass matrix is accounted for.

This is a flaw in the documentation; I'll fix it ASAP.

Also, while going through the code, I came across the following in 
euler_solver.C (lines 124-129)

  // We do a trick here to avoid using a non-1
  // elem_solution_derivative:
  context.elem_jacobian *= -1.0;
  jacobian_computed = _system.mass_residual(jacobian_computed, context) &&
    jacobian_computed;
  context.elem_jacobian *= -1.0;


What is the need to multiply the elem_jacobian by -1.0 both before
and after the function call? Wouldn't the call to mass_residual
overwrite the elem_jacobian anyways? 

The call to mass_residual (or anything else) is supposed to *augment*
the Jacobian, rather than writing to a separate jacobian that would
then just be added to the original.  This was my bright idea for
minimizing L1 cache use and is one of the "premature optimization"
examples I was talking about.

A problem with that is, if mass_residual is computing a jacobian
w.r.t. elem_solution, but elem_solution is storing something whose
derivative w.r.t. the real solution isn't 1.0, then the user has to
remember to multiply those jacobian terms by elem_solution_derivative
to take the chain rule into account.  The way we do scaling with
deltat and 1.0 bits was intended to try and avoid this complication
for most codes.
---
Roy
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to