xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision 9566063d113dddea24716c546802770db7481bc0)
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;
28*9566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
29*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx));
30*9566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr));
31f6291634SJed Brown   PetscFunctionReturn(0);
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;
40*9566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
41*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx));
42*9566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr));
43f6291634SJed Brown   PetscFunctionReturn(0);
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;
52*9566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
53*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx));
54*9566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr));
55f6291634SJed Brown   PetscFunctionReturn(0);
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 
63f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
642219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
652219e2e3SSatish Balay   if (dim == 2) {
66f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
67d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj2d,NULL);
682219e2e3SSatish Balay   } else if (dim == 3) {
69f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
70d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj3d,NULL);
712219e2e3SSatish Balay   } else if (dim == 1) {
72f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
73d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj1d,NULL);
742219e2e3SSatish Balay   } else *ierr = 1;
752219e2e3SSatish Balay }
762219e2e3SSatish Balay 
772219e2e3SSatish Balay /************************************************/
782219e2e3SSatish Balay 
792219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
802219e2e3SSatish Balay {
8119caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
82f6291634SJed Brown   DMSNES sdm;
83f6291634SJed Brown 
84f6291634SJed Brown   PetscFunctionBegin;
85*9566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
86*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx));
87*9566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr));
88f6291634SJed Brown   PetscFunctionReturn(0);
892219e2e3SSatish Balay }
902219e2e3SSatish Balay 
912219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
922219e2e3SSatish Balay {
9319caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
94f6291634SJed Brown   DMSNES sdm;
95f6291634SJed Brown 
96f6291634SJed Brown   PetscFunctionBegin;
97*9566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
98*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx));
99*9566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr));
100f6291634SJed Brown   PetscFunctionReturn(0);
1012219e2e3SSatish Balay }
1022219e2e3SSatish Balay 
1032219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
1042219e2e3SSatish Balay {
10519caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
106f6291634SJed Brown   DMSNES sdm;
107f6291634SJed Brown 
108f6291634SJed Brown   PetscFunctionBegin;
109*9566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(info->da,&sdm));
110*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx));
111*9566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&out[info->zs][info->ys][info->dof*info->xs],ctx,&ierr));
112f6291634SJed Brown   PetscFunctionReturn(0);
1132219e2e3SSatish Balay }
1142219e2e3SSatish Balay 
11519caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (*func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1162219e2e3SSatish Balay {
117f6291634SJed Brown   DMSNES   sdm;
1182219e2e3SSatish Balay   PetscInt dim;
1192219e2e3SSatish Balay 
120f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
1212219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
1222219e2e3SSatish Balay   if (dim == 2) {
123f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1240298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL);
1252219e2e3SSatish Balay   } else if (dim == 3) {
126f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1270298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL);
1282219e2e3SSatish Balay   } else if (dim == 1) {
129f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1300298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL);
1312219e2e3SSatish Balay   } else *ierr = 1;
1322219e2e3SSatish Balay }
133