[petsc-users] updating values in a DA Global array

Matthew Knepley knepley at gmail.com
Tue Jun 22 18:53:59 CDT 2010


On Tue, Jun 22, 2010 at 11:30 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
>   Matt,
>
>    Actually 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 > 1) stuff written.
>

Ah, I see. Mark, if you can bear C for 1 function, it will work. The problem
for the F90 is that we
are cutting out a section of a big array, and making it look
multidimensional. It is possible with F90,
but a pain to get everything right in the array descriptor and no one has
had to stamina to do it yet.

  Sorry about that,

     Matt


>    Barry
>
>
> On Jun 22, 2010, at 6:21 PM, Matthew Knepley wrote:
>
> On Tue, Jun 22, 2010 at 12:59 PM, Mark Cheeseman <
> mark.cheeseman at kaust.edu.sa> wrote:
>
>> Hi,
>>
>> I am trying to write a PETSc program in FORTRAN90 where I need to update a
>> single value in a global distributed array.  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.  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].  I cannot seem
>> to be able to do this... what am I doing wrong?
>>
>> ...
>> DA da
>> Vec uGLOBAL, uLOCAL, tmp
>> PetscErrorCode ierr
>> PetscScalar, pointer :: xx
>> PetscInt rank, source_rank, i,j,k, row
>>
>> ....
>>
>> call MPI_Comm_rank( PETSC_COMM_WORLD, rank, ierr )
>> call DACreate3d( PETSC_COMM_WORLD, DA_NONPERIODIC, DA_STENCIL_BOX,       &
>>                       arraysize(1), arraysize(2), arraysize(3),
>> PETSC_DECIDE, &
>>                       PETSC_DECIDE, PETSC_DECIDE, 1, 5,
>> PETSC_NULL_INTEGER,   &
>>                       PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, da, ierr)
>> call DACreateGlobalVector( da, pNOW, ierr )
>> call DAGetCorners( da, xs, ys, zs, xl, yl, zl, ierr )
>>
>
> call DAVecGetArrayF90()
>
>
>>     do i = xs,xs+xl-1
>>         if ( i.eq.arraysize(1)/2-1 ) then
>>            do j = ys,ys+yl-1
>>               if ( j.eq.arraysize(2)/2-1 ) then
>>                  do k = zs,zs+zl-1
>>                     if ( k.eq.3 ) then
>>
>
>                          array(k,j,i) = pressure
>
>
>>                     endif
>>                  enddo
>>               endif
>>            enddo
>>         endif
>>      enddo
>>
>>
> call
>
>
>
>
> That should work.
>
>    Matt
>
> Thank you,
>> Mark
>>
>> --
>> Mark Patrick Cheeseman
>>
>> Computational Scientist
>> KSL (KAUST Supercomputing Laboratory)
>> Building 1, Office #126
>> King Abdullah University of Science & Technology
>> Thuwal 23955-6900
>> Kingdom of Saudi Arabia
>>
>> EMAIL   : mark.cheeseman at kaust.edu.sa
>> PHONE : +966   (2) 808 0221 (office)
>>               +966 (54) 470 1082 (mobile)
>> SKYPE : mark.patrick.cheeseman
>>
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> -- Norbert Wiener
>
>
>


-- 
What most experimenters take for granted before they begin their experiments
is infinitely more interesting than any results to which their experiments
lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20100622/dbbaccbf/attachment-0001.htm>


More information about the petsc-users mailing list