The Istart and Iend are the rows present on this particular processor,<br>
which can be obtain from MatGetOwnershipRange().<br>
<br>
&nbsp; Matt<br><br><div><span class="gmail_quote">On 6/15/06, <b class="gmail_sendername">Evrim Dizemen</b> &lt;<a href="mailto:gudik@ae.metu.edu.tr">gudik@ae.metu.edu.tr</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Dear Randall,<br><br>I guess i began to understand the consepts but there is still a missing<br>point that i do not know when and how we define Istart and Iend. I'll be<br>glade if you can send me the pre_op3d routine so i can see the algorithm
<br>which is a black box for me now.<br><br>Thanks a lot<br><br>EVRIM<br><br><br>Randall Mackie wrote:<br>&gt; Hi Evrim,<br>&gt;<br>&gt; It's quite easy to modify your Fortran code to do what you want. I<br>&gt; thought<br>
&gt; I had written it all out before, but I'll try again. There are many ways<br>&gt; to do this, but I'll start with the easiest, at least if you're going to<br>&gt; just modify your current sequential code.<br>&gt;<br>&gt; Let's say that your matrix has np global rows. Then
<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call VecCreateMPI(PETSC_COMM_WORLD,PETSC_DECIDE,np,b,ierr)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call VecDuplicate(b,xsol,ierr)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call VecGetLocalSize(b,mloc,ierr)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call VecGetOwnershipRange(b,Istart,Iend,ierr)
<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do i=Istart+1,Iend<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loc(i)=i-1<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end do<br>&gt;<br>&gt; These statements create parallel vectors for the solution (xsol) and<br>&gt; the right hand side (b). The vector loc(i)is used to set values in the
<br>&gt; vectors later.<br>&gt;<br>&gt; Then<br>&gt;<br>&gt; ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>&gt; !&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create the linear solver context<br>&gt; ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call KSPCreate(PETSC_COMM_WORLD,ksp,ierr)<br>&gt;<br>&gt; ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>&gt; !&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create the scatter context for getting results back to
<br>&gt; !&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; each node.<br>&gt; ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call VecScatterCreateToAll(xsol,xToLocalAll,xseq,ierr)<br>&gt;<br>&gt; ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<br>&gt; !&nbsp;&nbsp;&nbsp;&nbsp; Create the matrix that defines the linear system, Ax = b,<br>&gt; !&nbsp;&nbsp;&nbsp;&nbsp; for the EM problem.<br>&gt; ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call pre_op3d(l,m,nzn,Istart,Iend,ijkhx,ijkhy,ijkhz,d_nnz,o_nnz)
<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MatCreateMPIAIJ(PETSC_COMM_WORLD,mloc,mloc,np,np,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;&nbsp; PETSC_NULL_INTEGER, d_nnz, PETSC_NULL_INTEGER,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;&nbsp; o_nnz,A,ierr)<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call set_op3d(A,l,m,nzn,period,resist,x,y,z,Istart,Iend,
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ijkhx,ijkhy,ijkhz)<br>&gt;<br>&gt;<br>&gt; The subroutine pre_op3d is an important routine and it figures out<br>&gt; how to pre-allocate space for your parallel matrix. This will be<br>&gt; the difference between near-instanteous assembly and 
2.5 hours that<br>&gt; you experienced. Basically, it just computes the global column numbers,<br>&gt; and figures out if they are between Istart and Iend. I can send you<br>&gt; my subroutine if you'd like.<br>&gt;<br>&gt; The subroutine set_op3d.F actually assembles the parallel matrix and
<br>&gt; goes like this:<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jj=0<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do i=1,l<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do k=2,n<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do j=2,m<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jj=jj+1<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = jj-1<br>&gt;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF (jj &gt;= Istart+1 .and. jj &lt;= Iend) THEN<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compute elements...<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MatSetValues(A,i1,row,ic,col,v,INSERT_VALUES,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ierr)
<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end do<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end do<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end do<br>&gt;<br>&gt; At the end,<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)
<br>&gt;<br>&gt;<br>&gt; Again, because you compute the pre-allocation, this is near-instanteous,<br>&gt; even for large models (larger than you're using).<br>&gt;<br>&gt;<br>&gt; Once you do that, you're golden:<br>&gt;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN,ierr)<br>&gt;<br>&gt; etc.<br>&gt;<br>&gt; Randy M.<br>&gt; San Francisco<br>&gt;<br>&gt;<br>&gt; Evrim Dizemen wrote:<br>&gt;&gt; Hi all,<br>&gt;&gt;<br>
&gt;&gt; Again thanks for your comments. I guess i can not define the problem<br>&gt;&gt; correctly. I have a sequantial fortran code giving me the global<br>&gt;&gt; matrix of 200000x200000. The code writes the matrix in a binary file
<br>&gt;&gt; at little endian mode (i can write only the nonzero terms or the<br>&gt;&gt; entire matrix). I tried to change the binary mode to big endian and<br>&gt;&gt; read the global matrix by a c program as in the example
<br>&gt;&gt; /src/mat/example/tests/ex31.c. However the program reads binary file<br>&gt;&gt; wrong and gives the following error message but the true value of<br>&gt;&gt; no-nonzero in the binary file is 6 (for the test case 3x3 matrix) :
<br>&gt;&gt;<br>&gt;&gt; reading matrix in binary from matrix.dat ...<br>&gt;&gt; ------------------------------------------------------------------------<br>&gt;&gt; Petsc Release Version 2.3.1, Patch 13, Wed May 10 11:08:35 CDT 2006
<br>&gt;&gt; BK revision: balay@asterix.mcs.anl.gov|ChangeSet|20060510160640|13832<br>&gt;&gt; See docs/changes/index.html for recent updates.<br>&gt;&gt; See docs/faq.html for hints about trouble shooting.<br>&gt;&gt; See docs/index.html for manual pages.
<br>&gt;&gt; ------------------------------------------------------------------------<br>&gt;&gt; ./ex31 on a linux named <a href="http://akbaba.ae.metu.edu.tr">akbaba.ae.metu.edu.tr</a> by evrim Thu Jun 15<br>&gt;&gt; 09:26:36 2006
<br>&gt;&gt; Libraries linked from /home/evrim/petsc-2.3.1-p13/lib/linux<br>&gt;&gt; Configure run at Tue May 30 10:26:48 2006<br>&gt;&gt; Configure options --with-scalar-type=complex --with-shared=0<br>&gt;&gt; ------------------------------------------------------------------------
<br>&gt;&gt; [0]PETSC ERROR: MatLoad_SeqAIJ() line 3055 in<br>&gt;&gt; src/mat/impls/aij/seq/aij.c<br>&gt;&gt; [0]PETSC ERROR: Read from file failed!<br>&gt;&gt; [0]PETSC ERROR: Inconsistant matrix data in file. no-nonzeros =
<br>&gt;&gt; 100663296, sum-row-lengths = 234300<br>&gt;&gt; !<br>&gt;&gt; [0]PETSC ERROR: MatLoad() line 149 in src/mat/utils/matio.c<br>&gt;&gt; [0]PETSC ERROR: main() line 37 in src/mat/examples/tests/ex31.c<br>&gt;&gt;
<br>&gt;&gt; I want to send the global matrix at once to Petsc by a written input<br>&gt;&gt; file (as i'm working on now) or by sending the matrix array from my<br>&gt;&gt; fortran code and then partition it and solve iteratively. After the
<br>&gt;&gt; solution i also want to get the solution vector back to my fortran<br>&gt;&gt; code. As i told in the previous mails i tried to send the matrix<br>&gt;&gt; array to Petsc and used MatSetValues as reading one value at time in
<br>&gt;&gt; a do loop but it took about 2,5 hours to read the global matrix.<br>&gt;&gt; Additionally i tried to read a row at&nbsp;&nbsp;a time but can not figure out<br>&gt;&gt; a algorithm for this. Hence i do not prefer to create the matrix
<br>&gt;&gt; again in Petsc by MatSetValues.<br>&gt;&gt;<br>&gt;&gt; Aside i figured out that the binary files written in fortran and c<br>&gt;&gt; are completely different from each other (fortran adds the size of<br>&gt;&gt; the characters to the beginning and end of each character) so i wrote
<br>&gt;&gt; a c interface code to get the matrix array from the fortran code and<br>&gt;&gt; write it to a binary file in c format. By this code i avoided from<br>&gt;&gt; the additional information in the binary file but i still have the
<br>&gt;&gt; endianness problem.<br>&gt;&gt;<br>&gt;&gt; I know that i asked so much but since i'm a rookie in parallel<br>&gt;&gt; programming, c language and library using i really need your comments<br>&gt;&gt; on my problem. Sorry for this long mail and thanks a lot for your
<br>&gt;&gt; kind effort on guiding me.<br>&gt;&gt;<br>&gt;&gt; Thanks<br>&gt;&gt;<br>&gt;&gt; EVRIM<br>&gt;&gt;<br>&gt;<br><br></blockquote></div><br><br clear="all"><br>-- <br>&quot;Failure has a thousand explanations. Success doesn't need one&quot; -- Sir Alec Guiness