Hi All,
Thanks that is really helpful, apologies for my slow response I just wanted to be certain that I've understood correctly. I understand your point about working with the preconditioned system Keaton, but as I'm concerned with taking the adjoint of Dedalus's IVP implementation, I'm constrained to take the adjoint of the preconditioned IVP as it's implemented and whatever this works out to be is what I must solve.
My current understanding is that while you write:
PL . L . PR . PR^{-1} . X = PL . F
the PL on the left and right hand side of this equation are really not the same, but instead, akin to what Callum suggested, we have something like
PL . L . PR . PR^{-1} . X = PL . T . F
where PL is dim (Nz* number of fields,Nz* number of fields) and T dim (Nz* number of fields,Nz* number of equations) is mapping of the vector F size (Nz * number of equations) to X a vector of size (Nz * number of fields). If this is the case?? then the system I want to solve, when I work through the algebra for the problem, becomes
(PL . L . PR)^H . PL . X = PR^H . T . F
which makes sense as the matrices are now of the same rank. In order to solve this however I need to split what Dedalus calls "pre_left" which is non-square into a square PL and a non-square T as I've termed them above.
Following Daniel's suggestion I noticed that these are defined in the _build_coupled_matrices() method of the Pencil class defined in pencil.py. Do you foresee any problems constructing these within this class for each pencil and adding them to the namespace? Or perhaps there's an easier way to extract these?
Thanks again for your help and suggestions,
Paul