The second patch has typos. Attaching the modified patch. If it works for you - I'll add it to petsc-3.3/petsc-dev
thanks, Satish On Wed, 11 Jul 2012, TAY wee-beng wrote: > On 6/7/2012 5:48 PM, Barry Smith wrote: > > Blaise, > > > > Thanks. > > > > Satish, > > > > If they look good could you apply them to 3.3 and dev? > > > > Thanks > > > > Barry > > Hi, > > I downloaded petsc-dev a few days ago and applied both patches using "patch -v > ..." in both linux and windows vs2008 > > It worked great in linux > > However, when I compile and link in vs2008, it gives the error: > / > 1>Compiling manifest to resources... > 1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1 > 1>Copyright (C) Microsoft Corporation. All rights reserved. > 1>Linking... > 1>libpetsc.lib(f90_cwrap.o) : error LNK2019: unresolved external symbol > F90ARRAY4dCREATESCALAR referenced in function F90Array4dCreate > 1>libpetsc.lib(f90_cwrap.o) : error LNK2019: unresolved external symbol > F90ARRAY4dACCESSFORTRANADDR referenced in function F90Array4dAccess > 1>libpetsc.lib(f90_cwrap.o) : error LNK2019: unresolved external symbol > F90ARRAY4dACCESSINT referenced in function F90Array4dAccess > 1>libpetsc.lib(f90_cwrap.o) : error LNK2019: unresolved external symbol > F90ARRAY4dACCESSREAL referenced in function F90Array4dAccess > 1>libpetsc.lib(f90_cwrap.o) : error LNK2019: unresolved external symbol > F90ARRAY4dACCESSSCALAR referenced in function F90Array4dAccess > 1>libpetsc.lib(f90_cwrap.o) : error LNK2019: unresolved external symbol > F90ARRAY4dDESTROYSCALAR referenced in function F90Array4dDestroy > 1>c:\obj_tmp\ibm2d_high_Re_staggered_old\Debug/ibm2d_high_Re_staggered.exe : > fatal error LNK1120: 6 unresolved externals/ > > I wonder if it's fixed in the new petsc-dev. > > Thanks > > > > On Jul 6, 2012, at 6:30 AM, Blaise Bourdin wrote: > > > > > Hi, > > > > > > I have added the creation, destruction and accessor functions for 4d > > > vectors in F90. The accessor was missing and needed for DMDAVecGetArrayF90 > > > with a 3d DMDA and >1 dof. As far as I can test, ex11f90 in DM should now > > > completely work with the intel compilers. > > > > > > Some of the functions are probably not used (F90Array4dAccessReal, > > > F90Array4dAccessInt, F90Array4dAccessFortranAddr, for instance), but I > > > added them anyway. Let me know if you want me to submit a patch without > > > them. > > > > > > Regards, > > > > > > Blaise > > > <DMDAVecRestoreArrayF90-2.patch> > > > > > > > > > -- > > > Department of Mathematics and Center for Computation & Technology > > > Louisiana State University, Baton Rouge, LA 70803, USA > > > Tel. +1 (225) 578 1612, Fax +1 (225) 578 4276 > > > http://www.math.lsu.edu/~bourdin > > > > > > > > > > > > > > > > > > > > > > > > -------------- next part -------------- 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 <finclude/petscsys.h> - 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 <finclude/petscsys.h> @@ -426,10 +409,158 @@ end subroutine !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine F90Array4dCreateScalar(array,start1,len1, & + & start2,len2,start3,len3,start4,len4,ptr) + implicit none +#include <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> + 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 <finclude/petscsys.h> - PetscScalar, pointer :: ptr(:,:,:) + PetscScalar, pointer :: ptr(:,:,:,:) + + nullify(ptr) + end subroutine + + subroutine F90Array4dDestroyReal(ptr) + implicit none +#include <finclude/petscsys.h> + PetscReal, pointer :: ptr(:,:,:,:) + + nullify(ptr) + end subroutine + + subroutine F90Array4dDestroyInt(ptr) + implicit none +#include <finclude/petscsys.h> + PetscInt, pointer :: ptr(:,:,:,:) + + nullify(ptr) + end subroutine + + subroutine F90Array4dDestroyFortranAddr(ptr) + implicit none +#include <finclude/petscsys.h> + PetscFortranAddr, pointer :: ptr(:,:,:,:) nullify(ptr) end subroutine
