1*2219e2e3SSatish Balay #include <petsc-private/fortranimpl.h> 2*2219e2e3SSatish Balay #include <petsc-private/daimpl.h> 3*2219e2e3SSatish Balay #include <petscsnes.h> 4*2219e2e3SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5*2219e2e3SSatish Balay #define dmdasnessetjacobianlocal_ DMDASNESSETJACOBIANLOCAL 6*2219e2e3SSatish Balay #define dmdasnessetfunctionlocal_ DMDASNESSETFUNCTIONLOCAL 7*2219e2e3SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 8*2219e2e3SSatish Balay #define dmdasnessetjacobianlocal_ dmdasnessetjacobianlocal 9*2219e2e3SSatish Balay #define dmdasnessetfunctionlocal_ dmdasnessetfunctionlocal 10*2219e2e3SSatish Balay #endif 11*2219e2e3SSatish Balay 12*2219e2e3SSatish Balay EXTERN_C_BEGIN 13*2219e2e3SSatish Balay /************************************************/ 14*2219e2e3SSatish Balay static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,MatStructure *str,void *ptr) 15*2219e2e3SSatish Balay { 16*2219e2e3SSatish Balay PetscErrorCode ierr = 0; 17*2219e2e3SSatish Balay (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[0]))(info,&in[info->dof*info->gxs],&A,&m,str,ptr,&ierr);CHKERRQ(ierr); 18*2219e2e3SSatish Balay return 0; 19*2219e2e3SSatish Balay } 20*2219e2e3SSatish Balay 21*2219e2e3SSatish Balay static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,MatStructure *str,void *ptr) 22*2219e2e3SSatish Balay { 23*2219e2e3SSatish Balay PetscErrorCode ierr = 0; 24*2219e2e3SSatish Balay (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[1]))(info,&in[info->gys][info->dof*info->gxs],&A,&m,str,ptr,&ierr);CHKERRQ(ierr); 25*2219e2e3SSatish Balay return 0; 26*2219e2e3SSatish Balay } 27*2219e2e3SSatish Balay 28*2219e2e3SSatish Balay static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,MatStructure *str,void *ptr) 29*2219e2e3SSatish Balay { 30*2219e2e3SSatish Balay PetscErrorCode ierr = 0; 31*2219e2e3SSatish Balay (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[2]))(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,str,ptr,&ierr);CHKERRQ(ierr); 32*2219e2e3SSatish Balay return 0; 33*2219e2e3SSatish Balay } 34*2219e2e3SSatish Balay 35*2219e2e3SSatish Balay /* 36*2219e2e3SSatish Balay This is buggy, the function pointers should really be attached to the DMSNES object 37*2219e2e3SSatish Balay */ 38*2219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 39*2219e2e3SSatish Balay { 40*2219e2e3SSatish Balay PetscInt dim; 41*2219e2e3SSatish Balay 42*2219e2e3SSatish Balay PetscObjectAllocateFortranPointers(*da,6); 43*2219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 44*2219e2e3SSatish Balay if (dim == 2) { 45*2219e2e3SSatish Balay ((PetscObject)*da)->fortran_func_pointers[1] = (PetscVoidFunction)jac; 46*2219e2e3SSatish Balay *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj2d,ctx); 47*2219e2e3SSatish Balay } else if (dim == 3) { 48*2219e2e3SSatish Balay ((PetscObject)*da)->fortran_func_pointers[2] = (PetscVoidFunction)jac; 49*2219e2e3SSatish Balay *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj3d,ctx); 50*2219e2e3SSatish Balay } else if (dim == 1) { 51*2219e2e3SSatish Balay ((PetscObject)*da)->fortran_func_pointers[0] = (PetscVoidFunction)jac; 52*2219e2e3SSatish Balay *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj1d,ctx); 53*2219e2e3SSatish Balay } else *ierr = 1; 54*2219e2e3SSatish Balay } 55*2219e2e3SSatish Balay 56*2219e2e3SSatish Balay /************************************************/ 57*2219e2e3SSatish Balay 58*2219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr) 59*2219e2e3SSatish Balay { 60*2219e2e3SSatish Balay PetscErrorCode ierr = 0; 61*2219e2e3SSatish Balay (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[3]))(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ptr,&ierr);CHKERRQ(ierr); 62*2219e2e3SSatish Balay return 0; 63*2219e2e3SSatish Balay } 64*2219e2e3SSatish Balay 65*2219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr) 66*2219e2e3SSatish Balay { 67*2219e2e3SSatish Balay PetscErrorCode ierr = 0; 68*2219e2e3SSatish Balay (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[4]))(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ptr,&ierr);CHKERRQ(ierr); 69*2219e2e3SSatish Balay return 0; 70*2219e2e3SSatish Balay } 71*2219e2e3SSatish Balay 72*2219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr) 73*2219e2e3SSatish Balay { 74*2219e2e3SSatish Balay PetscErrorCode ierr = 0; 75*2219e2e3SSatish Balay (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[5]))(info,&in[info->gzs][info->gys][info->dof*info->gxs],&out[info->zs][info->ys][info->dof*info->xs],ptr,&ierr);CHKERRQ(ierr); 76*2219e2e3SSatish Balay return 0; 77*2219e2e3SSatish Balay } 78*2219e2e3SSatish Balay 79*2219e2e3SSatish Balay /* 80*2219e2e3SSatish Balay This is buggy, the function pointers should really be attached to the DMSNES object 81*2219e2e3SSatish Balay */ 82*2219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 83*2219e2e3SSatish Balay { 84*2219e2e3SSatish Balay PetscInt dim; 85*2219e2e3SSatish Balay 86*2219e2e3SSatish Balay PetscObjectAllocateFortranPointers(*da,6); 87*2219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 88*2219e2e3SSatish Balay if (dim == 2) { 89*2219e2e3SSatish Balay ((PetscObject)*da)->fortran_func_pointers[4] = (PetscVoidFunction)func; 90*2219e2e3SSatish Balay *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,ctx); 91*2219e2e3SSatish Balay } else if (dim == 3) { 92*2219e2e3SSatish Balay ((PetscObject)*da)->fortran_func_pointers[5] = (PetscVoidFunction)func; 93*2219e2e3SSatish Balay *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,ctx); 94*2219e2e3SSatish Balay } else if (dim == 1) { 95*2219e2e3SSatish Balay ((PetscObject)*da)->fortran_func_pointers[3] = (PetscVoidFunction)func; 96*2219e2e3SSatish Balay *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,ctx); 97*2219e2e3SSatish Balay } else *ierr = 1; 98*2219e2e3SSatish Balay } 99*2219e2e3SSatish Balay 100*2219e2e3SSatish Balay EXTERN_C_END 101