<div class="gmail_quote">On Sat, Feb 25, 2012 at 15:27, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
   Let's back up a step before everyone gets totally confused (and worry less about exact syntax to use instead focus on concepts)<br>
<br>
Proposal 1: Jed<br>
<div class="im"><br>
    // Conservative gas dynamics with fields ordered as [rho, rho*u, rho*v, rho*w, E]<br>
   DMGetFieldSplitting(dm,"conservative-vector",&fscons); // creates if it doesn't exist<br>
   DMFieldSplittingAddField(dm,fscons,"rho",{0});<br>
   DMFieldSplittingAddField(dm,fscons,"momentum",{1,2,3});<br>
<br>
</div>    This seems to be premised on having an underlying "canonical" set of fields that one can define unions of to make new fields. For example with DMDA the underlying<br>
    fields are simply the 0th, 1st, 2nd etc DOF at each node. For a simple staggered grid 0 canonical may be the pressure centers, 1 the x velocities, 2 the y velocities<br></blockquote><div><br></div><div>Alright, lets abandon this "canonical field" idea, it was broken to begin with and less flexible, as you say.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Proposal 2: Barry<br>
<br>
     Use IS's to define the fields, not unions of canonical fields. Reason: more general than proposal 1<br></blockquote><div><br></div><div>Great, my concern is that we would like DM to be able to declare multiple named partitions. For example, so that we can have a conservative-scalar splitting, a conservative vector splitting (keeps vector components together), primitive variable splittings, local-characteristic splittings (analytically diagonalize the flux Jacobian for hyperbolic problems), etc.</div>
<div><br></div><div>We can think of these transformations as symmetric preconditioning. Suppose that we want to solve with J, operating on conservative variables. Suppose P converts conservative to primitive variables and C = P^{-1} converts primitive to conservative. I'm using matrix notation for because this would often be applied to perturbations. We need to solve a linear system with J_c, the Jacobian acting on conservative variables, but the preconditioner wants to operate in primitive variables, so the user assembles</div>
<div><br></div><div>J_p = P J_c C.</div><div><br></div><div>(Usually they do this only approximately and it's done without looking at J_c.) The conservative system is</div><div><br></div><div>J_c = C J_p P</div><div><br>
</div><div>At the algebraic level, I think this logic belongs in a new preconditioner that applies a user-defined pre- and post-transformation, the concern is how to forward DM-based information into PCFieldSplit and PCMG operating on J_p.</div>
<div> </div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 Because Jed's proposal 1 violates the use of IS for indexing paradigm and is less general than Proposal 2 I'd like to drop that Proposal 1; but it does bring up an issue. I think we need another IS implementation that is more "general" than stride for handling sets of DOFs of freedom associated with those canonical sets of fields. So it is easy to access canonical fields that are not simply stride. For example ISCreateCanonical(MPI_Comm,PetscInt ncanonical,PetscInt *fields), we can even have "predefined" ones available for use such as IS_CANONICAL_(MPI_Comm,3,{1,2,3}) Thus we can preserve some of the simplicity of proposal 1.  Jed's (again not worrying about syntax)<br>

<br>
DMFieldSplittingAddField(dm,fscons,"momentum",{1,2,3});  becomes<br>
<br>
DMFieldSplittingAddField(dm,fscons,"momentum",IS_CANONICAL_(comm,3,{1,2,3})<br>
<br>
Note that for a Vec with a given block size the canonical fields are simply the stride fields so IS_CANONICAL_(comm,1,{start}) is pretty much ISStride().<br></blockquote><div><br></div><div>Ignoring syntax, I think this is fine. </div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Proposal 3: Jed<br>
<br>
    Observation: Using IS does not give all desired generality since the new field may be a linear combination of DOFs. Or, yikes, a nonlinear transformation of DOF.<br>
    Thus we may need something like DMTransformVec() to do these transformations.<br>
<br>
<br>
So this moves us beyond the traditional block linear algebra methods but if we could solve it we'd have some very nice new powerful capabilities on our hands.<br>
<br>
Question 1:  Do we need to solve this for the current generation of PCFieldsplit?<br>
Question 2:  Do we want to solve it in PCFieldSplit or should that come later in a different PC, PCBasisChangeThingy or something?<br></blockquote><div><br></div><div>Yes, but what DM should PCBasisChangeThingy forward to the inner PC?</div>
</div>