xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision 19caf8f3c08b1f0ca9f5469bde385c134aa76c82)
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 {
24f6291634SJed Brown   PetscErrorCode ierr;
25*19caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
26f6291634SJed Brown   DMSNES sdm;
27f6291634SJed Brown 
28f6291634SJed Brown   PetscFunctionBegin;
29f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
30f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
31d1e9a80fSBarry Smith   (*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
32f6291634SJed Brown   PetscFunctionReturn(0);
332219e2e3SSatish Balay }
342219e2e3SSatish Balay 
35d1e9a80fSBarry Smith static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,void *ptr)
362219e2e3SSatish Balay {
37f6291634SJed Brown   PetscErrorCode ierr;
38*19caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
39f6291634SJed Brown   DMSNES sdm;
40f6291634SJed Brown 
41f6291634SJed Brown   PetscFunctionBegin;
42f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
43f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
44d1e9a80fSBarry Smith   (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
45f6291634SJed Brown   PetscFunctionReturn(0);
462219e2e3SSatish Balay }
472219e2e3SSatish Balay 
48d1e9a80fSBarry Smith static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,void *ptr)
492219e2e3SSatish Balay {
50f6291634SJed Brown   PetscErrorCode ierr;
51*19caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
52f6291634SJed Brown   DMSNES sdm;
53f6291634SJed Brown 
54f6291634SJed Brown   PetscFunctionBegin;
55f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
56f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
57d1e9a80fSBarry Smith   (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
58f6291634SJed Brown   PetscFunctionReturn(0);
592219e2e3SSatish Balay }
602219e2e3SSatish Balay 
61*19caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetjacobianlocal_(DM *da,void (*jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
622219e2e3SSatish Balay {
63f6291634SJed Brown   DMSNES   sdm;
642219e2e3SSatish Balay   PetscInt dim;
652219e2e3SSatish Balay 
66f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
672219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
682219e2e3SSatish Balay   if (dim == 2) {
69f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
70d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj2d,NULL);
712219e2e3SSatish Balay   } else if (dim == 3) {
72f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
73d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj3d,NULL);
742219e2e3SSatish Balay   } else if (dim == 1) {
75f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
76d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj1d,NULL);
772219e2e3SSatish Balay   } else *ierr = 1;
782219e2e3SSatish Balay }
792219e2e3SSatish Balay 
802219e2e3SSatish Balay /************************************************/
812219e2e3SSatish Balay 
822219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
832219e2e3SSatish Balay {
84f6291634SJed Brown   PetscErrorCode ierr;
85*19caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
86f6291634SJed Brown   DMSNES sdm;
87f6291634SJed Brown 
88f6291634SJed Brown   PetscFunctionBegin;
89f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
90f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
91f6291634SJed Brown   (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
92f6291634SJed Brown   PetscFunctionReturn(0);
932219e2e3SSatish Balay }
942219e2e3SSatish Balay 
952219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
962219e2e3SSatish Balay {
97f6291634SJed Brown   PetscErrorCode ierr;
98*19caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
99f6291634SJed Brown   DMSNES sdm;
100f6291634SJed Brown 
101f6291634SJed Brown   PetscFunctionBegin;
102f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
103f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
104f6291634SJed Brown   (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
105f6291634SJed Brown   PetscFunctionReturn(0);
1062219e2e3SSatish Balay }
1072219e2e3SSatish Balay 
1082219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
1092219e2e3SSatish Balay {
110f6291634SJed Brown   PetscErrorCode ierr;
111*19caf8f3SSatish Balay   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
112f6291634SJed Brown   DMSNES sdm;
113f6291634SJed Brown 
114f6291634SJed Brown   PetscFunctionBegin;
115f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
116f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
117f6291634SJed 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);
118f6291634SJed Brown   PetscFunctionReturn(0);
1192219e2e3SSatish Balay }
1202219e2e3SSatish Balay 
121*19caf8f3SSatish Balay PETSC_EXTERN void dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (*func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1222219e2e3SSatish Balay {
123f6291634SJed Brown   DMSNES   sdm;
1242219e2e3SSatish Balay   PetscInt dim;
1252219e2e3SSatish Balay 
126f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
1272219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
1282219e2e3SSatish Balay   if (dim == 2) {
129f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1300298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL);
1312219e2e3SSatish Balay   } else if (dim == 3) {
132f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1330298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL);
1342219e2e3SSatish Balay   } else if (dim == 1) {
135f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1360298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL);
1372219e2e3SSatish Balay   } else *ierr = 1;
1382219e2e3SSatish Balay }
1392219e2e3SSatish Balay 
1401a1c1e04SBarry Smith 
1411a1c1e04SBarry Smith 
142