12219e2e3SSatish Balay #include <petsc-private/fortranimpl.h> 22219e2e3SSatish Balay #include <petsc-private/daimpl.h> 3*f6291634SJed Brown #include <petsc-private/snesimpl.h> 42219e2e3SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 52219e2e3SSatish Balay #define dmdasnessetjacobianlocal_ DMDASNESSETJACOBIANLOCAL 62219e2e3SSatish Balay #define dmdasnessetfunctionlocal_ DMDASNESSETFUNCTIONLOCAL 72219e2e3SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 82219e2e3SSatish Balay #define dmdasnessetjacobianlocal_ dmdasnessetjacobianlocal 92219e2e3SSatish Balay #define dmdasnessetfunctionlocal_ dmdasnessetfunctionlocal 102219e2e3SSatish Balay #endif 112219e2e3SSatish Balay 12*f6291634SJed Brown static struct { 13*f6291634SJed Brown PetscFortranCallbackId lf1d; 14*f6291634SJed Brown PetscFortranCallbackId lf2d; 15*f6291634SJed Brown PetscFortranCallbackId lf3d; 16*f6291634SJed Brown PetscFortranCallbackId lj1d; 17*f6291634SJed Brown PetscFortranCallbackId lj2d; 18*f6291634SJed Brown PetscFortranCallbackId lj3d; 19*f6291634SJed Brown } _cb; 20*f6291634SJed Brown 212219e2e3SSatish Balay EXTERN_C_BEGIN 222219e2e3SSatish Balay /************************************************/ 232219e2e3SSatish Balay static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,MatStructure *str,void *ptr) 242219e2e3SSatish Balay { 25*f6291634SJed Brown PetscErrorCode ierr; 26*f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx; 27*f6291634SJed Brown DMSNES sdm; 28*f6291634SJed Brown 29*f6291634SJed Brown PetscFunctionBegin; 30*f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 31*f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 32*f6291634SJed Brown (*func)(info,&in[info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr); 33*f6291634SJed Brown PetscFunctionReturn(0); 342219e2e3SSatish Balay } 352219e2e3SSatish Balay 362219e2e3SSatish Balay static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,MatStructure *str,void *ptr) 372219e2e3SSatish Balay { 38*f6291634SJed Brown PetscErrorCode ierr; 39*f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx; 40*f6291634SJed Brown DMSNES sdm; 41*f6291634SJed Brown 42*f6291634SJed Brown PetscFunctionBegin; 43*f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 44*f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 45*f6291634SJed Brown (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr); 46*f6291634SJed Brown PetscFunctionReturn(0); 472219e2e3SSatish Balay } 482219e2e3SSatish Balay 492219e2e3SSatish Balay static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,MatStructure *str,void *ptr) 502219e2e3SSatish Balay { 51*f6291634SJed Brown PetscErrorCode ierr; 52*f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx; 53*f6291634SJed Brown DMSNES sdm; 54*f6291634SJed Brown 55*f6291634SJed Brown PetscFunctionBegin; 56*f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 57*f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 58*f6291634SJed Brown (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr); 59*f6291634SJed Brown PetscFunctionReturn(0); 602219e2e3SSatish Balay } 612219e2e3SSatish Balay 622219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 632219e2e3SSatish Balay { 64*f6291634SJed Brown DMSNES sdm; 652219e2e3SSatish Balay PetscInt dim; 662219e2e3SSatish Balay 67*f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 682219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 692219e2e3SSatish Balay if (dim == 2) { 70*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 71*f6291634SJed Brown *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj2d,PETSC_NULL); 722219e2e3SSatish Balay } else if (dim == 3) { 73*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 74*f6291634SJed Brown *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj3d,PETSC_NULL); 752219e2e3SSatish Balay } else if (dim == 1) { 76*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 77*f6291634SJed Brown *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj1d,PETSC_NULL); 782219e2e3SSatish Balay } else *ierr = 1; 792219e2e3SSatish Balay } 802219e2e3SSatish Balay 812219e2e3SSatish Balay /************************************************/ 822219e2e3SSatish Balay 832219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr) 842219e2e3SSatish Balay { 85*f6291634SJed Brown PetscErrorCode ierr; 86*f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 87*f6291634SJed Brown DMSNES sdm; 88*f6291634SJed Brown 89*f6291634SJed Brown PetscFunctionBegin; 90*f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 91*f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 92*f6291634SJed Brown (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 93*f6291634SJed Brown PetscFunctionReturn(0); 942219e2e3SSatish Balay } 952219e2e3SSatish Balay 962219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr) 972219e2e3SSatish Balay { 98*f6291634SJed Brown PetscErrorCode ierr; 99*f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 100*f6291634SJed Brown DMSNES sdm; 101*f6291634SJed Brown 102*f6291634SJed Brown PetscFunctionBegin; 103*f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 104*f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 105*f6291634SJed Brown (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 106*f6291634SJed Brown PetscFunctionReturn(0); 1072219e2e3SSatish Balay } 1082219e2e3SSatish Balay 1092219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr) 1102219e2e3SSatish Balay { 111*f6291634SJed Brown PetscErrorCode ierr; 112*f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 113*f6291634SJed Brown DMSNES sdm; 114*f6291634SJed Brown 115*f6291634SJed Brown PetscFunctionBegin; 116*f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 117*f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 118*f6291634SJed Brown (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&out[info->zs][info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 119*f6291634SJed Brown PetscFunctionReturn(0); 1202219e2e3SSatish Balay } 1212219e2e3SSatish Balay 1222219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1232219e2e3SSatish Balay { 124*f6291634SJed Brown DMSNES sdm; 1252219e2e3SSatish Balay PetscInt dim; 1262219e2e3SSatish Balay 127*f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 1282219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 1292219e2e3SSatish Balay if (dim == 2) { 130*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return; 131*f6291634SJed Brown *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,PETSC_NULL); 1322219e2e3SSatish Balay } else if (dim == 3) { 133*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return; 134*f6291634SJed Brown *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,PETSC_NULL); 1352219e2e3SSatish Balay } else if (dim == 1) { 136*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return; 137*f6291634SJed Brown *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,PETSC_NULL); 1382219e2e3SSatish Balay } else *ierr = 1; 1392219e2e3SSatish Balay } 1402219e2e3SSatish Balay 1412219e2e3SSatish Balay EXTERN_C_END 142