rom: Unsteady LSPG: General Info
todo: write more
The pressio4py unsteady LSPG ROMs are designed such that using them involves these main steps:
1. Create
You create an instance of a "LSPG problem", e.g.:
problem = pressio4py.rom.lspg.unsteady.DefaultProblem(args)
We currently support three variants:
All variants return a problem object that meets the following interface:
class UnsteadyLSPGProblem def __call__(state, time, time_step_size, step_count, solver); def createResidual() return # a residual instance def createJacobian() return # a Jacobian instance def residual(state, R) # evaluates the residual for the given state def jacobian(state, J) # evaluates the Jacobian for the given state def fomStateReconstructor() };
2. Solve in time
What does a stepper have to do with a LSPG ROM? The answer is that practically speaking, at the lowest-level, an unsteady LSPG problem can be reduced to simply a "custom" stepper to advance in time. This is how pressio4py implements this and the reason why a LSPG problem behaves like a stepper. You don't need to know how this is done, or rely on the details, because these are problem- and implementation-dependent, and we reserve the right to change this in the future.
stepper = ... pressio4py.ode.advance_n_steps_and_observe(problem, ...)
Remember that for LSPG, you are solving at each step a nonlinear least-squares problem. Therefore, the solver you need to use is a nonlinear least-squares solver, e.g, Gauss-Newton or Levernberg-Marquardt.