<div dir="ltr">On Tue, Jun 4, 2013 at 3:13 PM, Jin, Shuangshuang <span dir="ltr"><<a href="mailto:Shuangshuang.Jin@pnnl.gov" target="_blank">Shuangshuang.Jin@pnnl.gov</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">






<div>
<font face="Calibri, sans-serif">
<div>Hello, I have a question regarding how to set up the IFunction for TSSetIFunction. Please see the detailed illustration below:</div>
<div> </div>
<div>Inside my IFunction, I have one of the f equations defined as:</div>
<div> </div>
<div>if (i >= xstart && i < xstart+xlen) {</div>
<div>      f[i+2] = sin(x[i])*x[i+2] + cos(x[i])*x[i+3];</div></font></div></blockquote><div><br></div><div style>1) You should not be setting f[i+2]. You always set the residual local to your process.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><font face="Calibri, sans-serif">
<div>      for (k = 0; k < n; k++) {</div>
<div>          f[i+2] += -(cos(x[k])*a[k])*b) - (sin(x[k])*c[k])*d);               (1)</div>
<div>      }</div>
<div>}</div></font></div></blockquote><div><br></div><div style>2) This in effect says that your Jacobian is completely dense, or that your problem is fully coupled. I see two</div><div style>    choices:</div><div style>
<br></div><div style>  a) Use scalable dense linear algebra, like Elemental, and formulate your operations as linear algebra</div><div style><br></div><div style>  b) If this is a boundary integral equation, consider using the FMM technology</div>
<div style><br></div><div style>Either way, this is not a PDE, and so using that PETSc parallel paradigm is wrong.</div><div style><br></div><div style>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><font face="Calibri, sans-serif">
<div>Where x is an distributed array, a and c are constant arrays, b and d are constants. n is the length of the global length of x.</div>
<div style="text-indent:9pt"><font face="Times New Roman, serif"> </font></div>
<div>The problem is, since x is distributed across all the processes, each process only owns a piece of items of x, when I do (1) as written above, no matter which processor f[i+2] is on, it has to grab all the x array data from other processors, which means
I have to do a scattering of x array in advance to make the x[k] value available. This is quite an inefficient way given the scattering of vector would happen in each iteration when the IFuntion is called.</div>
<div> </div>
<div>I am wondering if this is the only way I have to deal with this problem, or am I trapped in a wrong direction?</div>
<div> </div>
<div>Your comments are highly appreciated!</div>
<div> </div>
<div>Thanks,</div>
<div>Shuangshuang</div>
<div><font face="Times New Roman, serif"> </font></div>
<div><font face="Times New Roman, serif"> </font></div>
</font>
</div>

</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>