> On May 11, 2018, at 10:17 AM, Smith, Barry F. <bsm...@mcs.anl.gov> wrote: > > > >> On May 11, 2018, at 7:05 AM, Matthew Knepley <knep...@gmail.com> wrote: >> >> On Fri, May 11, 2018 at 12:25 AM, Smith, Barry F. <bsm...@mcs.anl.gov> wrote: >> >> >>> On May 10, 2018, at 4:12 PM, Jed Brown <j...@jedbrown.org> wrote: >>> >>> "Zhang, Hong" <hongzh...@anl.gov> writes: >>> >>>> Dear PETSc folks, >>>> >>>> Current TS APIs (IFunction/IJacobian+RHSFunction/RHSJacobian) were >>>> designed for the fully implicit formulation F(t,U,Udot) = G(t,U). >>>> Shampine's paper >>>> (https://www.sciencedirect.com/science/article/pii/S0377042706004110?via%3Dihub<https://www.sciencedirect.com/science/article/pii/S0377042706004110?via=ihub>) >>>> explains some reasoning behind it. >>>> >>>> Our formulation is general enough to cover all the following common cases >>>> >>>> * Udot = G(t,U) (classic ODE) >>>> * M Udot = G(t,U) (ODEs/DAEs for mechanical and electronic systems) >>>> * M(t,U) Udot = G(t,U) (PDEs) >>>> >>>> Yet the TS APIs provide the capability to solve both simple problems and >>>> complicated problems. However, we are not doing well to make TS easy to >>>> use and efficient especially for simple problems. Over the years, we have >>>> clearly seen the main drawbacks including: >>>> 1. The shift parameter exposed in IJacobian is terribly confusing, >>>> especially to new users. Also it is not conceptually straightforward when >>>> using AD or finite differences on IFunction to approximate IJacobian. >>> >>> What isn't straightforward about AD or FD on the IFunction? That one >>> bit of chain rule? >>> >>>> 2. It is difficult to switch from fully implicit to fully explicit. Users >>>> cannot use explicit methods when they provide IFunction/IJacobian. >>> >>> This is a real issue, but it's extremely common for PDE to have boundary >>> conditions enforced as algebraic constraints, thus yielding a DAE. >>> >>>> 3. The structure of mass matrix is completely invisible to TS. This means >>>> giving up all the opportunities to improve efficiency. For example, when M >>>> is constant or weekly dependent on U, we might not want to evaluate/update >>>> it every time IJacobian is called. If M is diagonal, the Jacobian can be >>>> shifted more efficiently than just using MatAXPY(). >>> >>> I don't understand >>> >>>> 4. Reshifting the Jacobian is unnecessarily expensive and sometimes buggy. >>> >>> Why is "reshifting" needed? After a step is rejected and when the step >>> size changes for a linear constant operator? >>> >>>> Consider the scenario below. >>>> shift = a; >>>> TSComputeIJacobian() >>>> shift = b; >>>> TSComputeIJacobian() // with the same U and Udot as last call >>>> Changing the shift parameter requires the Jacobian function to be >>>> evaluated again. If users provide only RHSJacobian, the Jacobian will not >>>> be updated/reshifted in the second call because TSComputeRHSJacobian() >>>> finds out that U has not been changed. This issue is fixable by adding >>>> more logic into the already convoluted implementation of >>>> TSComputeIJacobian(), but the intention here is to illustrate the >>>> cumbersomeness of current IJacobian and the growing complications in >>>> TSComputeIJacobian() that IJacobian causes. >>>> >>>> So I propose that we have two separate matrices dF/dUdot and dF/dU, and >>>> remove the shift parameter from IJacobian. dF/dU will be calculated by >>>> IJacobian; dF/dUdot will be calculated by a new callback function and >>>> default to an identity matrix if it is not provided by users. Then the >>>> users do not need to assemble the shifted Jacobian since TS will handle >>>> the shifting whenever needed. And knowing the structure of dF/dUdot (the >>>> mass matrix), TS will become more flexible. In particular, we will have >>>> >>>> * easy access to the unshifted Jacobian dF/dU (this simplifies the >>>> adjoint implementation a lot), >>> >>> How does this simplify the adjoint? >>> >>>> * plenty of opportunities to optimize TS when the mass matrix is >>>> diagonal or constant or weekly dependent on U (which accounts for almost >>>> all use cases in practice), >>> >>> But longer critical path, >> >> What do you mean by longer critical path? >> >>> more storage required, and more data motion. >> >> The extra storage needed is related to the size of the mass matrix correct? >> And the extra data motion is related to the size of the mass matrix correct? >> >> Is the extra work coming from a needed call to MatAXPY (to combine the >> scaled mass matrix with the Jacobian) in Hong's approach? While, in theory, >> the user can avoid the MatAXPY in the current code if they have custom code >> that assembles directly the scaled mass matrix and Jacobian? But surely most >> users would not write such custom code and would themselves keep a copy of >> the mass matrix (likely constant) and use MatAXPY() to combine the copy of >> the mass matrix with the Jacobian they compute at each timestep/stage? Or >> am I missing something? >> >> I assemble the combined system directly. > > How, two sets of calls to MatSetValues(), One for the scaled mass matrix > and one for the Jacobian entries? For a constant mass matrix does this mean > you are recomputing the mass matrix entries each call? Or are you storing the > mass matrix entries somewhere? Or is your mass matrix diagonal only?
Or do you build element by element the M*shift + J element stiffness and then insert it with a single MatSetValues() call? Barry > > Barry > >> >> Matt >> >>> And if the mass matrix is simple, won't it take a very small fraction of >>> time, thus have little gains from "optimizing it"? >> >> Is the Function approach only theoretically much more efficient than >> Hong's approach when the mass matrix is nontrivial? That is the mass matrix >> has a nonzero structure similar to the Jacobian? >>> >>>> * easy conversion from fully implicit to fully explicit, >>>> * an IJacobian without shift parameter that is easy to understand and >>>> easy to port to other software. >>> >>> Note that even CVODE has an interface similar to PETSc; e.g., gamma >>> parameter in CVSpilsPrecSetupFn. >>> >>>> Regarding the changes on the user side, most IJacobian users should not >>>> have problem splitting the old Jacobian if they compute dF/dUdot and dF/dU >>>> explicitly. If dF/dUdot is too complicated to build, matrix-free is an >>>> alternative option. >>>> >>>> While this proposal is somehow related to Barry's idea of having a >>>> TSSetMassMatrix() last year, I hope it provides more details for your >>>> information. Any of your comments and feedback would be appreciated. >>>> >>>> Thanks, >>>> Hong >> >> >> >> >> -- >> What most experimenters take for granted before they begin their experiments >> is infinitely more interesting than any results to which their experiments >> lead. >> -- Norbert Wiener >> >> https://www.cse.buffalo.edu/~knepley/ >