[petsc-dev] XXXGetContext() in Fortran

Ethan Coon ecoon at lanl.gov
Wed Nov 9 12:22:45 CST 2011


Doesn't the bag construct do just this?  

http://www.mcs.anl.gov/petsc/petsc-as/snapshots/petsc-dev/src/sys/examples/tutorials/ex5f90.F90.html

and

src/sys/bag/f90-custom/zbagf90.c

Ethan

On Tue, 2011-11-08 at 22:11 -0600, Satish Balay wrote:
> On Tue, 8 Nov 2011, Jed Brown wrote:
> 
> > We have bindings for this, but I can't find a way to make it work. I can
> > pass a context into a function, but I can't get one back out with a
> > subroutine call. F90 pointers are grotesque creatures that don't seem to be
> > up to this task either, at least not with any chance of portability.
> > 
> > Is there anything we can do to avoid common blocks without losing all hope
> > of portability? How does anyone use this sorry excuse for a language?
> > 
> > Note that having the context passed in as an argument isn't feasible for
> > PCShell and MatShell, so it's nigh impossible to use these objects with
> > multigrid (or any other case where you have multiple instances of shell
> > objects, breaking the common blocks.)
> 
> The following is an example on passing in 'ctx' back and forth between
> c & F90. Not sure if we can do some bindings on the petsc side to help
> with this usage..
> 
> Satish
> 
> ----------
> asterix:/home/balay/junk/ctx>cat ctxf.F
>       module ctxmod
>       type userctx
>       integer :: a
>       double precision :: b
>       end type userctx
>       end module ctxmod
> 
>       program main
>       use ctxmod
>       interface
>          subroutine setcontext(ctx)
>          use ctxmod
>          type(userctx) ctx
>          end subroutine
>          subroutine getcontext(ctx)
>          use ctxmod
>          type(userctx),pointer:: ctx
>          end subroutine
>       end interface
>       external setctxptr
> 
>       type(userctx),target  :: ctxin
>       type(userctx),pointer :: ctxout
>       ctxin%a = 13
>       ctxin%b = 3.14d0
>       call setcontext(ctxin)
>       call setcontextfunction(setctxptr)
>       call getcontext(ctxout)
>       write(*,*) ctxout%a, ctxout%b
>       end program
> 
>       subroutine setctxptr(ctxin,ctxout)
>       use ctxmod
>       type(userctx),target:: ctxin
>       type(userctx),pointer:: ctxout
>       ctxout => ctxin
>       end 
> asterix:/home/balay/junk/ctx>cat ctxc.c
> static void* ctxptr = 0;
> static  void (*ctxfunction)(void*,void*) = 0;
> 
> void setcontext_(void* inptr)
> {
>   ctxptr = inptr;
>   return;
> }
> 
> void setcontextfunction_(void(*fin)(void*,void*))
> {
>   ctxfunction = fin;
>   return;
> }
> 
> void getcontext_(void*outptr)
> {
>   (*ctxfunction)(ctxptr,outptr);
>   return;
> }
> asterix:/home/balay/junk/ctx>gcc -c -g ctxc.c
> asterix:/home/balay/junk/ctx>gfortran -g ctxf.F ctxc.o 
> asterix:/home/balay/junk/ctx>./a.out 
>           13   3.1400000000000001     
> asterix:/home/balay/junk/ctx>

-- 
------------------------------------
Ethan Coon
Post-Doctoral Researcher
Applied Mathematics - T-5
Los Alamos National Laboratory
505-665-8289

http://www.ldeo.columbia.edu/~ecoon/
------------------------------------




More information about the petsc-dev mailing list