<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Oct 8, 2014 at 3:00 PM, Håkon Strandenes <span dir="ltr"><<a href="mailto:haakon@hakostra.net" target="_blank">haakon@hakostra.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I am making a new, simple incompressible CFD code. I have created a grid as a 3D DMDA, with ndof=4, one dof for each velocity component (u,v,w) and one for the pressure (p). Currently I am creating a forward Euler step, where the velocities are updated based on the velocities and pressure from the previous time step. That works great. Now I need to solve a Poisson equation for the pressure correction term, enforcing continuity onto my solution, and this is where I have a few questions for you:<br>
<br>
1)<br>
How do I set up my equation system in the most efficient way? The vectors from the DMDA is not contiguous in a global sense, i.e. if I map the local (i,j,k) indices to a global index with<br>
<br>
globId = (<a href="http://info.mx" target="_blank">info.mx</a>*info.my)*k + (info-.mx)*j + i;<br>
<br>
globId is not gontignous on any process. How do I create my coefficient matrix, r.h.s. vector and solution vector? Is there some way I can make the local parts of the matrix and vectors mimic the decomposition from the DMDA? Or should I push all values into a different decomposition scheme, where each process holds one contigous slab of the equation system using the global ID's calculated above? Have I missed some really basic stuff here?<br></blockquote><div><br></div><div>See SNES ex5 (which is Poisson when you throw away the extra e^u term). Hopefully this will explain your question about numbering.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2)<br>
I know that my coefficient matrix from the Poisson equation is symmetric. Currently I am still creating and inserting values on both the upper and lower diagonal. Is this really necessary? Or is there a "smart" way I can save half the storage by only creating the upper or lower part?<br></blockquote><div><br></div><div>You can save storage, but not work, so unless you are memory constrained, this is not worth doing.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
3)<br>
I solve a transient problem, but my coefficient matrix is the same for all time steps and I only recompute the r.h.s. vector for each time step. I have got the impression that KSPsolve "finds out" if the A matrix have changed since last invocation or not, recalculating the preconditioner as necessary. But still I feel that I should utilize this property more. Do you have any tips in how I can use this in the most efficient way possible? For example really, really efficient, but expensive, preconditioners?<br></blockquote><div><br></div><div>We should figure this out automatically. Please report if this does not happen for you. Also, we recommend using</div><div>TS for timestepping (at least eventually).</div><div><br></div><div> Thanks,</div><div><br></div><div>    Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thanks in advance.<br>
<br>
Regards,<br>
Håkon Strandenes<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <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
</div></div>