xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision 4035e84d3faf4a20d1b4a222249bd7c04df3e9ca)
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