[petsc-users] Declaring struct to represent field for dof > 1 for DM in Fortran
Jed Brown
jedbrown at mcs.anl.gov
Tue Jul 10 13:29:56 CDT 2012
On Tue, Jul 10, 2012 at 1:22 PM, TAY wee-beng <zonexo at gmail.com> wrote:
> Do you mean DMDAVecGetArrayDOFF90 ? I tried to compile but it gives the
> error during linking:
>
> 1>dm_test2d.obj : error LNK2019: unresolved external symbol
> DMDAVECGETARRAYDOFF90 referenced in function MAIN__
>
Matt was suggesting that someone should implement this function, it doesn't
exist currently.
Fortran makes this stuff really painful and we don't know how to make it do
something reasonable without depending on your types. You can write your
own DMDAVecGetArrayF90WithYourType(), but sadly, it requires some circus
tricks to make work. (We can't put this in PETSc because we don't know what
your field type is.)
>
> Also from the manual of DMDAVecGetArray, it says:
> *
> Fortran Notes: From Fortran use DMDAVecGetArrayF90() and pass for the
> array type PetscScalar<http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Sys/PetscScalar.html#PetscScalar>,pointer
> :: array(:,...,:) of the appropriate dimension. For a DMDA created with a
> dof of 1 use the dimension of the DMDA, for a DMDA created with a dof
> greater than 1 use one more than the dimension of the DMDA. The order of
> the indices is array(xs:xs+xm-1,ys:ys+ym-1,zs:zs+zm-1) (when dof is 1)
> otherwise array(1:dof,xs:xs+xm-1,ys:ys+ym-1,zs:zs+zm-1) where the values
> are obtained from DMDAGetCorners<http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/DM/DMDAGetCorners.html#DMDAGetCorners>()
> for a global array or DMDAGetGhostCorners<http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/DM/DMDAGetGhostCorners.html#DMDAGetGhostCorners>()
> for a local array. Include finclude/petscdmda.h90 to access this routine.
> *
>
> I just tried with dof = 2 and there's no problem. However, the manual says
> that for dof > 1, the array is *
> array(1:dof,xs:xs+xm-1,ys:ys+ym-1,zs:zs+zm-1)*.
>
> Should it be *array(0:dof-1,xs:xs+xm-1,ys:ys+ym-1,zs:zs+zm-1)* instead? I
> had problems with the former, but the latter works fine.
>
> Also, I'm still not sure how the memory is allocated. If I have:
>
> *Vec x_local
>
>
> PetscScalar,pointer :: array2(:,:,:)
>
> with DMDACreate2d using dof = 2,
>
> call DMDAVecGetArrayF90(da,x_local,array2,ierr)
>
> access array2 ....
>
> call DMDAVecRestoreArrayF90(da,x_local,array2,ierr)
> *
>
>
> How is the memory for "array2" allocated ? Is it allocated all the time,
> or only between the DMDAVecGetArrayF90 and DMDAVecRestoreArrayF90?
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120710/d33cbf53/attachment.html>
More information about the petsc-users
mailing list