xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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 {
2419caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
25f6291634SJed Brown   DMSNES sdm;
26f6291634SJed Brown 
27f6291634SJed Brown   PetscFunctionBegin;
289566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
299566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx));
309566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr));
31*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
322219e2e3SSatish Balay }
332219e2e3SSatish Balay 
34d1e9a80fSBarry Smith static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,void *ptr)
352219e2e3SSatish Balay {
3619caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
37f6291634SJed Brown   DMSNES sdm;
38f6291634SJed Brown 
39f6291634SJed Brown   PetscFunctionBegin;
409566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
419566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx));
429566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr));
43*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
442219e2e3SSatish Balay }
452219e2e3SSatish Balay 
46d1e9a80fSBarry Smith static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,void *ptr)
472219e2e3SSatish Balay {
4819caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
49f6291634SJed Brown   DMSNES sdm;
50f6291634SJed Brown 
51f6291634SJed Brown   PetscFunctionBegin;
529566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
539566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx));
549566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr));
55*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
562219e2e3SSatish Balay }
572219e2e3SSatish Balay 
5819caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetjacobianlocal_(DM *da, void (*jac)(DMDALocalInfo *, void *, void *, void *, void *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
592219e2e3SSatish Balay {
60f6291634SJed Brown   DMSNES   sdm;
612219e2e3SSatish Balay   PetscInt dim;
622219e2e3SSatish Balay 
63*3ba16761SJacob Faibussowitsch   *ierr = DMGetDMSNESWrite(*da, &sdm);
64*3ba16761SJacob Faibussowitsch   if (*ierr) return;
65*3ba16761SJacob Faibussowitsch   *ierr = DMDAGetInfo(*da, &dim, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
66*3ba16761SJacob Faibussowitsch   if (*ierr) return;
672219e2e3SSatish Balay   if (dim == 2) {
68*3ba16761SJacob Faibussowitsch     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lj2d, (PetscVoidFunction)jac, ctx);
69*3ba16761SJacob Faibussowitsch     if (*ierr) return;
70d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da, (PetscErrorCode(*)(DMDALocalInfo *, void *, Mat, Mat, void *))sourlj2d, NULL);
712219e2e3SSatish Balay   } else if (dim == 3) {
72*3ba16761SJacob Faibussowitsch     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lj3d, (PetscVoidFunction)jac, ctx);
73*3ba16761SJacob Faibussowitsch     if (*ierr) return;
74d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da, (PetscErrorCode(*)(DMDALocalInfo *, void *, Mat, Mat, void *))sourlj3d, NULL);
752219e2e3SSatish Balay   } else if (dim == 1) {
76*3ba16761SJacob Faibussowitsch     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lj1d, (PetscVoidFunction)jac, ctx);
77*3ba16761SJacob Faibussowitsch     if (*ierr) return;
78d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da, (PetscErrorCode(*)(DMDALocalInfo *, void *, Mat, Mat, void *))sourlj1d, NULL);
79*3ba16761SJacob Faibussowitsch   } else *ierr = PETSC_ERR_ARG_OUTOFRANGE;
802219e2e3SSatish Balay }
812219e2e3SSatish Balay 
822219e2e3SSatish Balay /************************************************/
832219e2e3SSatish Balay 
842219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
852219e2e3SSatish Balay {
8619caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
87f6291634SJed Brown   DMSNES sdm;
88f6291634SJed Brown 
89f6291634SJed Brown   PetscFunctionBegin;
909566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
919566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx));
929566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr));
93*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
942219e2e3SSatish Balay }
952219e2e3SSatish Balay 
962219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
972219e2e3SSatish Balay {
9819caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
99f6291634SJed Brown   DMSNES sdm;
100f6291634SJed Brown 
101f6291634SJed Brown   PetscFunctionBegin;
1029566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
1039566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx));
1049566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr));
105*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1062219e2e3SSatish Balay }
1072219e2e3SSatish Balay 
1082219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
1092219e2e3SSatish Balay {
11019caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
111f6291634SJed Brown   DMSNES sdm;
112f6291634SJed Brown 
113f6291634SJed Brown   PetscFunctionBegin;
1149566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
1159566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx));
1169566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&out[info->zs][info->ys][info->dof*info->xs],ctx,&ierr));
117*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1182219e2e3SSatish Balay }
1192219e2e3SSatish Balay 
12019caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetfunctionlocal_(DM *da, InsertMode *mode, void (*func)(DMDALocalInfo *, void *, void *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
1212219e2e3SSatish Balay {
122f6291634SJed Brown   DMSNES   sdm;
1232219e2e3SSatish Balay   PetscInt dim;
1242219e2e3SSatish Balay 
125*3ba16761SJacob Faibussowitsch   *ierr = DMGetDMSNESWrite(*da, &sdm);
126*3ba16761SJacob Faibussowitsch   if (*ierr) return;
127*3ba16761SJacob Faibussowitsch   *ierr = DMDAGetInfo(*da, &dim, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
128*3ba16761SJacob Faibussowitsch   if (*ierr) return;
1292219e2e3SSatish Balay   if (dim == 2) {
130*3ba16761SJacob Faibussowitsch     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lf2d, (PetscVoidFunction)func, ctx);
131*3ba16761SJacob Faibussowitsch     if (*ierr) return;
1320298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da, *mode, (PetscErrorCode(*)(DMDALocalInfo *, void *, void *, void *))sourlf2d, NULL);
1332219e2e3SSatish Balay   } else if (dim == 3) {
134*3ba16761SJacob Faibussowitsch     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lf3d, (PetscVoidFunction)func, ctx);
135*3ba16761SJacob Faibussowitsch     if (*ierr) return;
1360298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da, *mode, (PetscErrorCode(*)(DMDALocalInfo *, void *, void *, void *))sourlf3d, NULL);
1372219e2e3SSatish Balay   } else if (dim == 1) {
138*3ba16761SJacob Faibussowitsch     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lf1d, (PetscVoidFunction)func, ctx);
139*3ba16761SJacob Faibussowitsch     if (*ierr) return;
1400298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da, *mode, (PetscErrorCode(*)(DMDALocalInfo *, void *, void *, void *))sourlf1d, NULL);
141*3ba16761SJacob Faibussowitsch   } else *ierr = PETSC_ERR_ARG_OUTOFRANGE;
1422219e2e3SSatish Balay }
143