So the DM is a sort of Builder patter object. I like that.<div><br></div><div>   Matt<br><div><br><div class="gmail_quote">On Wed, May 19, 2010 at 3:36 PM, 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;"><div class="im"><br>
On May 19, 2010, at 3:19 PM, Lisandro Dalcin wrote:<br>
<br>
> On 19 May 2010 16:18, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
>><br>
>> On May 19, 2010, at 2:07 PM, Jed Brown wrote:<br>
>><br>
>>> On Wed, 19 May 2010 15:17:19 -0300, Lisandro Dalcin <<a href="mailto:dalcinl@gmail.com">dalcinl@gmail.com</a>> wrote:<br>
>>>> If you do have the SNES availabe at the point you setIFunction(vec,<br>
>>>> func), then yes, there is no much to gain from having TS hold a ref to<br>
>><br>
><br>
</div><div class="im">> Barry/Jed, many thanks for your comments. Now things are far more<br>
> clear. So we should make KSPGetSolution(), KSPGetRHS(), etc. create<br>
> the inner vecs, and similarly for SNES and TS.<br>
<br>
</div>   We could. I don't know all the ramifications of doing this and if it could break things.<br>
<br>
   Also, with my plan to "merge" the "style" of DMMG into the TS, SNES, and KSP object would have the DM object be responsible for setting some of the correct values into those inner objects. So, for example, with KSPGetSolution() the KSP would do a VecCreate() with the appropriate MPI_Comm but the DM would then set the appropriate layout/sizes to that Vec.  A crude form of this would be<br>

KSPGetSolution(KSP ksp,Vec *v)<br>
{<br>
   if (!ksp->vec_sol) {<br>
      VecCreate(ksp->comm,v);<br>
      if (ksp->dm) {<br>
         DMSetUpGlobalVector(ksp->dm,v);<br>
     }<br>
  }<br>
<br>
Note that this requires pulling the VecCreate() part out of DMCreateGlobalVector();  so that it just "finishes" the job of creating the vector. Similar for PCGetOperators()<br>
<br>
PCGetOperators(PC pc,Mat *A) /* for the example pretend takes only one matrix */<br>
{<br>
   if (!pc->mat) {<br>
      ierr = MatCreate(pc->comm,A);<br>
      if (pc->dm) {<br>
         DMSetUpMatrix(pc->dm,A);<br>
     }<br>
  }<br>
<br>
  where similarly DMSetUpMatrix() is like DMGetMatrix() with the the MatCreate() part.<br>
<br>
The details of all this are not yet clear in my mind.<br>
<font color="#888888"><br>
<br>
   Barry<br>
</font><div><div></div><div class="h5"><br>
<br>
><br>
><br>
> --<br>
> Lisandro Dalcin<br>
> ---------------<br>
> CIMEC (INTEC/CONICET-UNL)<br>
> Predio CONICET-Santa Fe<br>
> Colectora RN 168 Km 472, Paraje El Pozo<br>
> Tel: +54-342-4511594 (ext 1011)<br>
> Tel/Fax: +54-342-4511169<br>
<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener<br>
</div></div>