12219e2e3SSatish Balay #include <petsc-private/fortranimpl.h> 2*4035e84dSBarry 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 212219e2e3SSatish Balay EXTERN_C_BEGIN 22f7ecc322SBarry Smith #undef __FUNCT__ 23f7ecc322SBarry Smith #define __FUNCT__ "sourlj1d" 242219e2e3SSatish Balay /************************************************/ 252219e2e3SSatish Balay static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,MatStructure *str,void *ptr) 262219e2e3SSatish Balay { 27f6291634SJed Brown PetscErrorCode ierr; 28f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx; 29f6291634SJed Brown DMSNES sdm; 30f6291634SJed Brown 31f6291634SJed Brown PetscFunctionBegin; 32f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 33f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 34f6291634SJed Brown (*func)(info,&in[info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr); 35f6291634SJed Brown PetscFunctionReturn(0); 362219e2e3SSatish Balay } 372219e2e3SSatish Balay 38f7ecc322SBarry Smith #undef __FUNCT__ 39f7ecc322SBarry Smith #define __FUNCT__ "sourlj2d" 402219e2e3SSatish Balay static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,MatStructure *str,void *ptr) 412219e2e3SSatish Balay { 42f6291634SJed Brown PetscErrorCode ierr; 43f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx; 44f6291634SJed Brown DMSNES sdm; 45f6291634SJed Brown 46f6291634SJed Brown PetscFunctionBegin; 47f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 48f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 49f6291634SJed Brown (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr); 50f6291634SJed Brown PetscFunctionReturn(0); 512219e2e3SSatish Balay } 522219e2e3SSatish Balay 53f7ecc322SBarry Smith #undef __FUNCT__ 54f7ecc322SBarry Smith #define __FUNCT__ "sourlj3d" 552219e2e3SSatish Balay static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,MatStructure *str,void *ptr) 562219e2e3SSatish Balay { 57f6291634SJed Brown PetscErrorCode ierr; 58f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx; 59f6291634SJed Brown DMSNES sdm; 60f6291634SJed Brown 61f6291634SJed Brown PetscFunctionBegin; 62f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 63f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 64f6291634SJed Brown (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr); 65f6291634SJed Brown PetscFunctionReturn(0); 662219e2e3SSatish Balay } 672219e2e3SSatish Balay 682219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 692219e2e3SSatish Balay { 70f6291634SJed Brown DMSNES sdm; 712219e2e3SSatish Balay PetscInt dim; 722219e2e3SSatish Balay 73f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 742219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 752219e2e3SSatish Balay if (dim == 2) { 76f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 770298fd71SBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj2d,NULL); 782219e2e3SSatish Balay } else if (dim == 3) { 79f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 800298fd71SBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj3d,NULL); 812219e2e3SSatish Balay } else if (dim == 1) { 82f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return; 830298fd71SBarry Smith *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj1d,NULL); 842219e2e3SSatish Balay } else *ierr = 1; 852219e2e3SSatish Balay } 862219e2e3SSatish Balay 872219e2e3SSatish Balay /************************************************/ 882219e2e3SSatish Balay 89f7ecc322SBarry Smith #undef __FUNCT__ 90f7ecc322SBarry Smith #define __FUNCT__ "sourlf1d" 912219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr) 922219e2e3SSatish Balay { 93f6291634SJed Brown PetscErrorCode ierr; 94f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 95f6291634SJed Brown DMSNES sdm; 96f6291634SJed Brown 97f6291634SJed Brown PetscFunctionBegin; 98f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 99f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 100f6291634SJed Brown (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 101f6291634SJed Brown PetscFunctionReturn(0); 1022219e2e3SSatish Balay } 1032219e2e3SSatish Balay 104f7ecc322SBarry Smith #undef __FUNCT__ 105f7ecc322SBarry Smith #define __FUNCT__ "sourlf2d" 1062219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr) 1072219e2e3SSatish Balay { 108f6291634SJed Brown PetscErrorCode ierr; 109f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 110f6291634SJed Brown DMSNES sdm; 111f6291634SJed Brown 112f6291634SJed Brown PetscFunctionBegin; 113f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 114f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 115f6291634SJed Brown (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr); 116f6291634SJed Brown PetscFunctionReturn(0); 1172219e2e3SSatish Balay } 1182219e2e3SSatish Balay 119f7ecc322SBarry Smith #undef __FUNCT__ 120f7ecc322SBarry Smith #define __FUNCT__ "sourlf3d" 1212219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr) 1222219e2e3SSatish Balay { 123f6291634SJed Brown PetscErrorCode ierr; 124f6291634SJed Brown void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx; 125f6291634SJed Brown DMSNES sdm; 126f6291634SJed Brown 127f6291634SJed Brown PetscFunctionBegin; 128f6291634SJed Brown ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr); 129f6291634SJed Brown ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr); 130f6291634SJed 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); 131f6291634SJed Brown PetscFunctionReturn(0); 1322219e2e3SSatish Balay } 1332219e2e3SSatish Balay 1342219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1352219e2e3SSatish Balay { 136f6291634SJed Brown DMSNES sdm; 1372219e2e3SSatish Balay PetscInt dim; 1382219e2e3SSatish Balay 139f6291634SJed Brown *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return; 1402219e2e3SSatish Balay *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return; 1412219e2e3SSatish Balay if (dim == 2) { 142f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1430298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL); 1442219e2e3SSatish Balay } else if (dim == 3) { 145f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1460298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL); 1472219e2e3SSatish Balay } else if (dim == 1) { 148f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return; 1490298fd71SBarry Smith *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL); 1502219e2e3SSatish Balay } else *ierr = 1; 1512219e2e3SSatish Balay } 1522219e2e3SSatish Balay 1532219e2e3SSatish Balay EXTERN_C_END 154