12219e2e3SSatish Balay #include <petsc-private/fortranimpl.h> 24035e84dSBarry Smith #include <petsc-private/dmdaimpl.h> 3f6291634SJed 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 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 21f7ecc322SBarry Smith #undef __FUNCT__ 22f7ecc322SBarry Smith #define __FUNCT__ "sourlj1d" 232219e2e3SSatish Balay /************************************************/ 24*d1e9a80fSBarry Smith static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,void *ptr) 252219e2e3SSatish Balay { 26f6291634SJed Brown PetscErrorCode ierr; 27*d1e9a80fSBarry Smith void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx; 28f6291634SJed Brown DMSNES sdm; 29f6291634SJed Brown 30f6291634SJed Brown PetscFunctionBegin; 31f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 32f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 33*d1e9a80fSBarry Smith (*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr); 34f6291634SJed Brown PetscFunctionReturn(0); 352219e2e3SSatish Balay } 362219e2e3SSatish Balay 37f7ecc322SBarry Smith #undef __FUNCT__ 38f7ecc322SBarry Smith #define __FUNCT__ "sourlj2d" 39*d1e9a80fSBarry Smith static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,void *ptr) 402219e2e3SSatish Balay { 41f6291634SJed Brown PetscErrorCode ierr; 42*d1e9a80fSBarry Smith void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx; 43f6291634SJed Brown DMSNES sdm; 44f6291634SJed Brown 45f6291634SJed Brown PetscFunctionBegin; 46f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 47f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 48*d1e9a80fSBarry Smith (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr); 49f6291634SJed Brown PetscFunctionReturn(0); 502219e2e3SSatish Balay } 512219e2e3SSatish Balay 52f7ecc322SBarry Smith #undef __FUNCT__ 53f7ecc322SBarry Smith #define __FUNCT__ "sourlj3d" 54*d1e9a80fSBarry Smith static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,void *ptr) 552219e2e3SSatish Balay { 56f6291634SJed Brown PetscErrorCode ierr; 57*d1e9a80fSBarry Smith void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx; 58f6291634SJed Brown DMSNES sdm; 59f6291634SJed Brown 60f6291634SJed Brown PetscFunctionBegin; 61f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 62f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 63*d1e9a80fSBarry Smith (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr); 64f6291634SJed Brown PetscFunctionReturn(0); 652219e2e3SSatish Balay } 662219e2e3SSatish Balay 678cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 682219e2e3SSatish Balay { 69f6291634SJed Brown DMSNES sdm; 702219e2e3SSatish Balay PetscInt dim; 712219e2e3SSatish Balay 72f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 732219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 742219e2e3SSatish Balay if (dim == 2) { 75f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 76*d1e9a80fSBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj2d,NULL); 772219e2e3SSatish Balay } else if (dim == 3) { 78f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 79*d1e9a80fSBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj3d,NULL); 802219e2e3SSatish Balay } else if (dim == 1) { 81f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 82*d1e9a80fSBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj1d,NULL); 832219e2e3SSatish Balay } else *ierr = 1; 842219e2e3SSatish Balay } 852219e2e3SSatish Balay 862219e2e3SSatish Balay /************************************************/ 872219e2e3SSatish Balay 88f7ecc322SBarry Smith #undef __FUNCT__ 89f7ecc322SBarry Smith #define __FUNCT__ "sourlf1d" 902219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr) 912219e2e3SSatish Balay { 92f6291634SJed Brown PetscErrorCode ierr; 93f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 94f6291634SJed Brown DMSNES sdm; 95f6291634SJed Brown 96f6291634SJed Brown PetscFunctionBegin; 97f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 98f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 99f6291634SJed Brown (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 100f6291634SJed Brown PetscFunctionReturn(0); 1012219e2e3SSatish Balay } 1022219e2e3SSatish Balay 103f7ecc322SBarry Smith #undef __FUNCT__ 104f7ecc322SBarry Smith #define __FUNCT__ "sourlf2d" 1052219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr) 1062219e2e3SSatish Balay { 107f6291634SJed Brown PetscErrorCode ierr; 108f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 109f6291634SJed Brown DMSNES sdm; 110f6291634SJed Brown 111f6291634SJed Brown PetscFunctionBegin; 112f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 113f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 114f6291634SJed Brown (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 115f6291634SJed Brown PetscFunctionReturn(0); 1162219e2e3SSatish Balay } 1172219e2e3SSatish Balay 118f7ecc322SBarry Smith #undef __FUNCT__ 119f7ecc322SBarry Smith #define __FUNCT__ "sourlf3d" 1202219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr) 1212219e2e3SSatish Balay { 122f6291634SJed Brown PetscErrorCode ierr; 123f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 124f6291634SJed Brown DMSNES sdm; 125f6291634SJed Brown 126f6291634SJed Brown PetscFunctionBegin; 127f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 128f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 129f6291634SJed 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); 130f6291634SJed Brown PetscFunctionReturn(0); 1312219e2e3SSatish Balay } 1322219e2e3SSatish Balay 1338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1342219e2e3SSatish Balay { 135f6291634SJed Brown DMSNES sdm; 1362219e2e3SSatish Balay PetscInt dim; 1372219e2e3SSatish Balay 138f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 1392219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 1402219e2e3SSatish Balay if (dim == 2) { 141f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1420298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL); 1432219e2e3SSatish Balay } else if (dim == 3) { 144f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1450298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL); 1462219e2e3SSatish Balay } else if (dim == 1) { 147f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1480298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL); 1492219e2e3SSatish Balay } else *ierr = 1; 1502219e2e3SSatish Balay } 1512219e2e3SSatish Balay 1521a1c1e04SBarry Smith 1531a1c1e04SBarry Smith 154