diff -r c449016b5325 src/dm/impls/da/f90-custom/zda1f90.c --- a/src/dm/impls/da/f90-custom/zda1f90.c Tue Jul 03 13:22:19 2012 -0500 +++ b/src/dm/impls/da/f90-custom/zda1f90.c Fri Jul 06 15:15:48 2012 +0400 @@ -175,9 +175,7 @@ void PETSC_STDCALL dmdavecrestorearrayf9 /* F90Array4dAccess is not implemented, so the following call would fail */ - /* *ierr = F90Array4dAccess(a,PETSC_SCALAR,(void**)&fa PETSC_F90_2PTR_PARAM(ptrd)); - */ *ierr = VecRestoreArray(*v,&fa);if (*ierr) return; *ierr = F90Array4dDestroy(&a,PETSC_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); } diff -r c449016b5325 src/sys/f90-src/f90_cwrap.c --- a/src/sys/f90-src/f90_cwrap.c Tue Jul 03 13:22:19 2012 -0500 +++ b/src/sys/f90-src/f90_cwrap.c Fri Jul 06 15:15:48 2012 +0400 @@ -307,17 +307,46 @@ PetscErrorCode F90Array3dDestroy(F90Arr } /*************************************************************************/ - #if defined(PETSC_HAVE_FORTRAN_CAPS) -#define f90array4dcreatescalar_ F90ARRAY4DCREATESCALAR -#define f90array4ddestroyscalar_ F90ARRAY4DDESTROYSCALAR +#define f90array4dcreatescalar_ F90ARRAY4dCREATESCALAR +#define f90array4daccessscalar_ F90ARRAY4dACCESSSCALAR +#define f90array4ddestroyscalar_ F90ARRAY4dDESTROYSCALAR +#define f90array4dcreatereal_ F90ARRAY4dCREATEREAL +#define f90array4daccessreal_ F90ARRAY4dACCESSREAL +#define f90array4ddestroyreal_ F90ARRAY4dDESTROYREAL +#define f90array4dcreateint_ F90ARRAY4dCREATEINT +#define f90array4daccessint_ F90ARRAY4dACCESSINT +#define f90array4ddestroyint_ F90ARRAY4dDESTROYINT +#define f90array4dcreatefortranaddr_ F90ARRAY4dCREATEFORTRANADDR +#define f90array4daccessfortranaddr_ F90ARRAY4dACCESSFORTRANADDR +#define f90array4ddestroyfortranaddr_ F90ARRAY4dDESTROYFORTRANADDR #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) #define f90array4dcreatescalar_ f90array4dcreatescalar +#define f90array4daccessscalar_ f90array4daccessscalar #define f90array4ddestroyscalar_ f90array4ddestroyscalar +#define f90array4dcreatereal_ f90array4dcreatereal +#define f90array4daccessreal_ f90array4daccessreal +#define f90array4ddestroyreal_ f90array4ddestroyreal +#define f90array4dcreateint_ f90array4dcreateint +#define f90array4daccessint_ f90array4daccessint +#define f90array4ddestroyint_ f90array4ddestroyint +#define f90array4dcreatefortranaddr_ f90array4dcreatefortranaddr +#define f90array4daccessfortranaddr_ f90array4daccessfortranaddr +#define f90array4ddestroyfortranaddr_ f90array4ddestroyfortranaddr #endif PETSC_EXTERN_C void PETSC_STDCALL f90array4dcreatescalar_(void *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt*,PetscInt*,F90Array4d * PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4daccessscalar_(F90Array4d*,void** PETSC_F90_2PTR_PROTO_NOVAR); PETSC_EXTERN_C void PETSC_STDCALL f90array4ddestroyscalar_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4dcreatereal_(void *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt*,PetscInt*,F90Array4d * PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4daccessreal_(F90Array4d*,void** PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4ddestroyreal_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4dcreateint_(void *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt*,PetscInt*,F90Array4d * PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4daccessint_(F90Array4d*,void** PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4ddestroyint_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4dcreatefortranaddr_(void *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt *,PetscInt*,PetscInt*,F90Array4d * PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4daccessfortranaddr_(F90Array4d*,void** PETSC_F90_2PTR_PROTO_NOVAR); +PETSC_EXTERN_C void PETSC_STDCALL f90array4ddestroyfortranaddr_(F90Array4d *ptr PETSC_F90_2PTR_PROTO_NOVAR); #undef __FUNCT__ #define __FUNCT__ "F90Array4dCreate" @@ -333,6 +362,25 @@ PetscErrorCode F90Array4dCreate(void *ar } #undef __FUNCT__ +#define __FUNCT__ "F90Array4dAccess" +PetscErrorCode F90Array4dAccess(F90Array4d *ptr,PetscDataType type,void **array PETSC_F90_2PTR_PROTO(ptrd)) +{ + PetscFunctionBegin; + if (type == PETSC_SCALAR) { + f90array4daccessscalar_(ptr,array PETSC_F90_2PTR_PARAM(ptrd)); + } else if (type == PETSC_REAL) { + f90array4daccessreal_(ptr,array PETSC_F90_2PTR_PARAM(ptrd)); + } else if (type == PETSC_INT) { + f90array4daccessint_(ptr,array PETSC_F90_2PTR_PARAM(ptrd)); + } else if (type == PETSC_FORTRANADDR) { + f90array4daccessfortranaddr_(ptr,array PETSC_F90_2PTR_PARAM(ptrd)); + } else { + SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unsupported PetscDataType: %d",(PetscInt)type); + } + PetscFunctionReturn(0); +} + +#undef __FUNCT__ #define __FUNCT__ "F90Array4dDestroy" PetscErrorCode F90Array4dDestroy(F90Array4d *ptr,PetscDataType type PETSC_F90_2PTR_PROTO(ptrd)) { @@ -436,3 +484,31 @@ PETSC_EXTERN_C void PETSC_STDCALL f90arr } /*************************************************************************/ +#if defined(PETSC_HAVE_FORTRAN_CAPS) +#define f90array4dgetaddrscalar_ F90ARRAY4DGETADDRSCALAR +#define f90array4dgetaddrreal_ F90ARRAY4DGETADDRREAL +#define f90array4dgetaddrint_ F90ARRAY4DGETADDRINT +#define f90array4dgetaddrfortranaddr_ F90ARRAY4DGETADDRFORTRANADDR +#elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) +#define f90array4dgetaddrscalar_ f90array4dgetaddrscalar +#define f90array4dgetaddrreal_ f90array4dgetaddrreal +#define f90array4dgetaddrint_ f90array4dgetaddrint +#define f90array4dgetaddrfortranaddr_ f90array4dgetaddrfortranaddr +#endif + +PETSC_EXTERN_C void PETSC_STDCALL f90array4dgetaddrscalar_(void *array, PetscFortranAddr *address) +{ + *address = (PetscFortranAddr)array; +} +PETSC_EXTERN_C void PETSC_STDCALL f90array4dgetaddrreal_(void *array, PetscFortranAddr *address) +{ + *address = (PetscFortranAddr)array; +} +PETSC_EXTERN_C void PETSC_STDCALL f90array4dgetaddrint_(void *array, PetscFortranAddr *address) +{ + *address = (PetscFortranAddr)array; +} +PETSC_EXTERN_C void PETSC_STDCALL f90array4dgetaddrfortranaddr_(void *array, PetscFortranAddr *address) +{ + *address = (PetscFortranAddr)array; +} diff -r c449016b5325 src/sys/f90-src/fsrc/f90_fwrap.F --- a/src/sys/f90-src/fsrc/f90_fwrap.F Tue Jul 03 13:22:19 2012 -0500 +++ b/src/sys/f90-src/fsrc/f90_fwrap.F Fri Jul 06 15:15:48 2012 +0400 @@ -322,23 +322,6 @@ end subroutine !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - subroutine F90Array4dCreateScalar(array,start1,len1, & - & start2,len2,start3,len3,start4,len4,ptr) - implicit none -#include - PetscInt start1,len1 - PetscInt start2,len2 - PetscInt start3,len3 - PetscInt start4,len4 - PetscScalar, target :: & - & array(start1:start1+len1-1,start2:start2+len2-1, & - & start3:start3+len3-1,start4:start4+len4-1) - PetscScalar, pointer :: ptr(:,:,:,:) - - ptr => array - end subroutine - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine F90Array3dAccessScalar(ptr,address) implicit none #include @@ -426,10 +409,158 @@ end subroutine !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine F90Array4dCreateScalar(array,start1,len1, & + & start2,len2,start3,len3,start4,len4,ptr) + implicit none +#include + PetscInt start1,len1 + PetscInt start2,len2 + PetscInt start3,len3 + PetscInt start4,len4 + PetscScalar, target :: & + & array(start1:start1+len1-1,start2:start2+len2-1, & + & start3:start3+len3-1,start4:start4+len4-1) + PetscScalar, pointer :: ptr(:,:,:,:) + + ptr => array + end subroutine + + subroutine F90Array4dCreateReal(array,start1,len1, & + & start2,len2,start3,len3,start4,len4,ptr) + implicit none +#include + PetscInt start1,len1 + PetscInt start2,len2 + PetscInt start3,len3 + PetscInt start4,len4 + PetscReal, target :: & + & array(start1:start1+len1-1,start2:start2+len2-1, & + & start3:start3+len3-1,start4:start4+len4-1) + PetscReal, pointer :: ptr(:,:,:,:) + + ptr => array + end subroutine + + subroutine F90Array4dCreateInt(array,start1,len1, & + & start2,len2,start3,len3,start4,len4,ptr) + implicit none +#include + PetscInt start1,len1 + PetscInt start2,len2 + PetscInt start3,len3 + PetscInt start4,len4 + PetscInt, target :: & + & array(start1:start1+len1-1,start2:start2+len2-1, & + & start3:start3+len3-1,start4:start4+len4-1) + PetscInt, pointer :: ptr(:,:,:,:) + + ptr => array + end subroutine + + subroutine F90Array4dCreateFortranAddr(array,start1,len1, & + & start2,len2,start3,len3,start4,len4,ptr) + implicit none +#include + PetscInt start1,len1 + PetscInt start2,len2 + PetscInt start3,len3 + PetscInt start4,len4 + PetscFortranAddr, target :: & + & array(start1:start1+len1-1,start2:start2+len2-1, & + & start3:start3+len3-1,start4:start4+len4-1) + PetscFortranAddr, pointer :: ptr(:,:,:,:) + + ptr => array + end subroutine + + subroutine F90Array4dAccessScalar(ptr,address) + implicit none +#include + PetscScalar, pointer :: ptr(:,:,:,:) + PetscFortranAddr address + PetscInt start1,start2,start3,start4 + + start1 = lbound(ptr,1) + start2 = lbound(ptr,2) + start3 = lbound(ptr,3) + start4 = lbound(ptr,4) + call F90Array4dGetAddrScalar(ptr(start1,start2,start3,start4), & + & address) + end subroutine + + subroutine F90Array4dAccessReal(ptr,address) + implicit none +#include + PetscReal, pointer :: ptr(:,:,:,:) + PetscFortranAddr address + PetscInt start1,start2,start3,start4 + + start1 = lbound(ptr,1) + start2 = lbound(ptr,2) + start3 = lbound(ptr,3) + start4 = lbound(ptr,4) + call F90Array4dGetAddrReal(ptr(start1,start2,start3,start4), & + & address) + end subroutine + + subroutine F90Array4dAccessInt(ptr,address) + implicit none +#include + PetscInt, pointer :: ptr(:,:,:,:) + PetscFortranAddr address + PetscInt start1,start2,start3,start4 + + start1 = lbound(ptr,1) + start2 = lbound(ptr,2) + start3 = lbound(ptr,3) + start4 = lbound(ptr,4) + call F90Array4dGetAddrInt(ptr(start1,start2,start3,start4), & + & address) + end subroutine + + subroutine F90Array4dAccessFortranAddr(ptr,address) + implicit none +#include + PetscScalar, pointer :: ptr(:,:,:,:) + PetscFortranAddr address + PetscFortranAddr start1,start2,start3,start4 + + start1 = lbound(ptr,1) + start2 = lbound(ptr,2) + start3 = lbound(ptr,3) + start4 = lbound(ptr,4) + call F90Array4dGetAddrFortranAddr(ptr(start1,start2,start3, & + & start4),address) + end subroutine + subroutine F90Array4dDestroyScalar(ptr) implicit none #include - PetscScalar, pointer :: ptr(:,:,:) + PetscScalar, pointer :: ptr(:,:,:,:) + + nullify(ptr) + end subroutine + + subroutine F90Array4dDestroyReal(ptr) + implicit none +#include + PetscReal, pointer :: ptr(:,:,:,:) + + nullify(ptr) + end subroutine + + subroutine F90Array4dDestroyInt(ptr) + implicit none +#include + PetscInt, pointer :: ptr(:,:,:,:) + + nullify(ptr) + end subroutine + + subroutine F90Array4dDestroyFortranAddr(ptr) + implicit none +#include + PetscFortranAddr, pointer :: ptr(:,:,:,:) nullify(ptr) end subroutine