<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div>&nbsp;&nbsp; It turns out there was a bug in gfortran versions prior to 2.5 that made DAVecGetArrayF90() unworkable. After Satish told me this, ...<div><br></div><div>&nbsp;&nbsp; I have implemented DAVecGetArrayF90() for 1, 2, and 3 dimensions with dof = 1 and dof &gt; 1 in petsc-dev. The test example is src/dm/da/examples/tutorials/ex11f90.F&nbsp;</div><div><br></div><div>&nbsp;&nbsp; Please report any problems with it to <a href="mailto:petsc-maint@mcs.anl.gov">petsc-maint@mcs.anl.gov</a> and if you use gfortran make sure it is version 2.5. Not that if your dof passed to DACreate is greater than one then you need another dimension in the array pointer you declare. Also, in keeping with the Fortran tradition indices for it start at 1 not zero.</div><div><br></div><div>&nbsp;&nbsp; This can lead to much simplier structured grid Fortran codes.</div><div><br></div><div>&nbsp;&nbsp; Barry</div><div><br><div><div>On Jun 22, 2010, at 6:53 PM, Matthew Knepley wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Tue, Jun 22, 2010 at 11:30 PM, Barry Smith <span dir="ltr">&lt;<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; ">
<div style="word-wrap:break-word"><div><br></div>&nbsp;&nbsp;Matt,<div><br></div><div>&nbsp;&nbsp; Actually&nbsp;DAVecRestoreArrayF90() only works for 1 dimensional DAs. The F90 interface has to be written for 2 and 3d and the creation of Fortran 3d arrays (and 4d for dof &gt; 1) stuff written.&nbsp;</div>
</div></blockquote><div><br></div><div>Ah, I see. Mark, if you can bear C for 1 function, it will work. The problem for the F90 is that we</div><div>are cutting out a section of a big array, and making it look multidimensional. It is possible with F90,</div>
<div>but a pain to get everything right in the array descriptor and no one has had to stamina to do it yet.</div><div><br></div><div>&nbsp;&nbsp;Sorry about that,</div><div><br></div><div>&nbsp;&nbsp; &nbsp; Matt</div><div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word"><div>&nbsp;&nbsp; Barry</div><div><br></div><div><br><div><div><div></div><div class="h5"><div>On Jun 22, 2010, at 6:21 PM, Matthew Knepley wrote:</div><br><blockquote type="cite">On Tue, Jun 22, 2010 at 12:59 PM, Mark Cheeseman <span dir="ltr">&lt;<a href="mailto:mark.cheeseman@kaust.edu.sa" target="_blank">mark.cheeseman@kaust.edu.sa</a>&gt;</span> wrote:<br>
<div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204, 204, 204);border-left-style:solid;padding-left:1ex">

<div dir="ltr">Hi,<br><br>I am trying to write a PETSc program in FORTRAN90 where I need to update a single value in a global distributed array.&nbsp; I know the global coordinates of the position that needs to be updated in the global array but I cannot get the mapping from the local vector correct.&nbsp; In this case, I am working on a domain with global dimensions [arraysize(1),arraysize(2),arraysize(3)] and I want to alter a single point in the global distributed array, uGLOBAL, at the global position [arraysize(1)/2-1,arraysize(2)-1,3].&nbsp; I cannot seem to be able to do this... what am I doing wrong?<br>


<br>...<br>DA da<br>Vec uGLOBAL, uLOCAL, tmp<br>PetscErrorCode ierr<br>PetscScalar, pointer :: xx<br>PetscInt rank, source_rank, i,j,k, row<br><br clear="all">....<br><br>call MPI_Comm_rank( PETSC_COMM_WORLD, rank, ierr )<br>


call DACreate3d( PETSC_COMM_WORLD, DA_NONPERIODIC, DA_STENCIL_BOX,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arraysize(1), arraysize(2), arraysize(3), PETSC_DECIDE, &amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PETSC_DECIDE, PETSC_DECIDE, 1, 5, PETSC_NULL_INTEGER,&nbsp;&nbsp; &amp;<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, da, ierr)<br>call DACreateGlobalVector( da, pNOW, ierr )<br>call DAGetCorners( da, xs, ys, zs, xl, yl, zl, ierr )<br></div></blockquote><div><br></div><div>call DAVecGetArrayF90()</div>

<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">&nbsp;&nbsp;&nbsp; do i = xs,xs+xl-1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( i.eq.arraysize(1)/2-1 ) then<br>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; do j = ys,ys+yl-1<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( j.eq.arraysize(2)/2-1 ) then<br>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; do k = zs,zs+zl-1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( k.eq.3 ) then<br></div></blockquote><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array(k,j,i) = pressure</div>

<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;endif<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endif<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enddo<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endif<br>&nbsp;&nbsp;&nbsp;&nbsp; enddo<br><br></div></blockquote><div><br></div><div>call&nbsp;</div></div></blockquote>&nbsp;<br></div></div><blockquote type="cite"><div class="gmail_quote"><div>&nbsp;</div><div class="im"><div>That should work.</div>
<div><br></div><div>&nbsp;&nbsp; Matt</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Thank you,<br>Mark<br><br>-- <br>Mark Patrick Cheeseman<br><br>Computational Scientist<br>KSL (KAUST Supercomputing Laboratory)<br>Building 1, Office #126<br>King Abdullah University of Science &amp; Technology<br>

Thuwal 23955-6900<br>
Kingdom of Saudi Arabia<br> &nbsp; &nbsp; &nbsp; &nbsp; <br>EMAIL &nbsp; : <a href="mailto:mark.cheeseman@kaust.edu.sa" target="_blank">mark.cheeseman@kaust.edu.sa</a><br>PHONE : +966 &nbsp; (2) 808 0221 (office)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; +966 (54) 470 1082 (mobile)<br>

SKYPE : mark.patrick.cheeseman<br>

</div>
</blockquote></div></div><div class="im"><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></blockquote></div><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>
</blockquote></div><br></div></body></html>