1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> 3af0996ceSBarry Smith #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 12f6291634SJed Brown static struct { 13f6291634SJed Brown PetscFortranCallbackId lf1d; 14f6291634SJed Brown PetscFortranCallbackId lf2d; 15f6291634SJed Brown PetscFortranCallbackId lf3d; 16f6291634SJed Brown PetscFortranCallbackId lj1d; 17f6291634SJed Brown PetscFortranCallbackId lj2d; 18f6291634SJed Brown PetscFortranCallbackId lj3d; 19f6291634SJed Brown } _cb; 20f6291634SJed Brown 212219e2e3SSatish Balay /************************************************/ 22d1e9a80fSBarry Smith static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,void *ptr) 232219e2e3SSatish Balay { 24f6291634SJed Brown PetscErrorCode ierr; 25*19caf8f3SSatish Balay void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx; 26f6291634SJed Brown DMSNES sdm; 27f6291634SJed Brown 28f6291634SJed Brown PetscFunctionBegin; 29f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 30f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 31d1e9a80fSBarry Smith (*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr); 32f6291634SJed Brown PetscFunctionReturn(0); 332219e2e3SSatish Balay } 342219e2e3SSatish Balay 35d1e9a80fSBarry Smith static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,void *ptr) 362219e2e3SSatish Balay { 37f6291634SJed Brown PetscErrorCode ierr; 38*19caf8f3SSatish Balay void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx; 39f6291634SJed Brown DMSNES sdm; 40f6291634SJed Brown 41f6291634SJed Brown PetscFunctionBegin; 42f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 43f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 44d1e9a80fSBarry Smith (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr); 45f6291634SJed Brown PetscFunctionReturn(0); 462219e2e3SSatish Balay } 472219e2e3SSatish Balay 48d1e9a80fSBarry Smith static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,void *ptr) 492219e2e3SSatish Balay { 50f6291634SJed Brown PetscErrorCode ierr; 51*19caf8f3SSatish Balay void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx; 52f6291634SJed Brown DMSNES sdm; 53f6291634SJed Brown 54f6291634SJed Brown PetscFunctionBegin; 55f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 56f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 57d1e9a80fSBarry Smith (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr); 58f6291634SJed Brown PetscFunctionReturn(0); 592219e2e3SSatish Balay } 602219e2e3SSatish Balay 61*19caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetjacobianlocal_(DM *da,void (*jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 622219e2e3SSatish Balay { 63f6291634SJed Brown DMSNES sdm; 642219e2e3SSatish Balay PetscInt dim; 652219e2e3SSatish Balay 66f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 672219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 682219e2e3SSatish Balay if (dim == 2) { 69f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 70d1e9a80fSBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj2d,NULL); 712219e2e3SSatish Balay } else if (dim == 3) { 72f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 73d1e9a80fSBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj3d,NULL); 742219e2e3SSatish Balay } else if (dim == 1) { 75f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 76d1e9a80fSBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj1d,NULL); 772219e2e3SSatish Balay } else *ierr = 1; 782219e2e3SSatish Balay } 792219e2e3SSatish Balay 802219e2e3SSatish Balay /************************************************/ 812219e2e3SSatish Balay 822219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr) 832219e2e3SSatish Balay { 84f6291634SJed Brown PetscErrorCode ierr; 85*19caf8f3SSatish Balay void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 86f6291634SJed Brown DMSNES sdm; 87f6291634SJed Brown 88f6291634SJed Brown PetscFunctionBegin; 89f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 90f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 91f6291634SJed Brown (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 92f6291634SJed Brown PetscFunctionReturn(0); 932219e2e3SSatish Balay } 942219e2e3SSatish Balay 952219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr) 962219e2e3SSatish Balay { 97f6291634SJed Brown PetscErrorCode ierr; 98*19caf8f3SSatish Balay void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 99f6291634SJed Brown DMSNES sdm; 100f6291634SJed Brown 101f6291634SJed Brown PetscFunctionBegin; 102f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 103f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 104f6291634SJed Brown (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 105f6291634SJed Brown PetscFunctionReturn(0); 1062219e2e3SSatish Balay } 1072219e2e3SSatish Balay 1082219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr) 1092219e2e3SSatish Balay { 110f6291634SJed Brown PetscErrorCode ierr; 111*19caf8f3SSatish Balay void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 112f6291634SJed Brown DMSNES sdm; 113f6291634SJed Brown 114f6291634SJed Brown PetscFunctionBegin; 115f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 116f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 117f6291634SJed 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); 118f6291634SJed Brown PetscFunctionReturn(0); 1192219e2e3SSatish Balay } 1202219e2e3SSatish Balay 121*19caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (*func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1222219e2e3SSatish Balay { 123f6291634SJed Brown DMSNES sdm; 1242219e2e3SSatish Balay PetscInt dim; 1252219e2e3SSatish Balay 126f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 1272219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 1282219e2e3SSatish Balay if (dim == 2) { 129f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1300298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL); 1312219e2e3SSatish Balay } else if (dim == 3) { 132f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1330298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL); 1342219e2e3SSatish Balay } else if (dim == 1) { 135f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1360298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL); 1372219e2e3SSatish Balay } else *ierr = 1; 1382219e2e3SSatish Balay } 1392219e2e3SSatish Balay 1401a1c1e04SBarry Smith 1411a1c1e04SBarry Smith 142