xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision f6291634e93a0403f42e7a416abc639b040e23c6)
12219e2e3SSatish Balay #include <petsc-private/fortranimpl.h>
22219e2e3SSatish Balay #include <petsc-private/daimpl.h>
3*f6291634SJed 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 
12*f6291634SJed Brown static struct {
13*f6291634SJed Brown   PetscFortranCallbackId lf1d;
14*f6291634SJed Brown   PetscFortranCallbackId lf2d;
15*f6291634SJed Brown   PetscFortranCallbackId lf3d;
16*f6291634SJed Brown   PetscFortranCallbackId lj1d;
17*f6291634SJed Brown   PetscFortranCallbackId lj2d;
18*f6291634SJed Brown   PetscFortranCallbackId lj3d;
19*f6291634SJed Brown } _cb;
20*f6291634SJed Brown 
212219e2e3SSatish Balay EXTERN_C_BEGIN
222219e2e3SSatish Balay /************************************************/
232219e2e3SSatish Balay static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,MatStructure *str,void *ptr)
242219e2e3SSatish Balay {
25*f6291634SJed Brown   PetscErrorCode ierr;
26*f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx;
27*f6291634SJed Brown   DMSNES sdm;
28*f6291634SJed Brown 
29*f6291634SJed Brown   PetscFunctionBegin;
30*f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
31*f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
32*f6291634SJed Brown   (*func)(info,&in[info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr);
33*f6291634SJed Brown   PetscFunctionReturn(0);
342219e2e3SSatish Balay }
352219e2e3SSatish Balay 
362219e2e3SSatish Balay static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,MatStructure *str,void *ptr)
372219e2e3SSatish Balay {
38*f6291634SJed Brown   PetscErrorCode ierr;
39*f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx;
40*f6291634SJed Brown   DMSNES sdm;
41*f6291634SJed Brown 
42*f6291634SJed Brown   PetscFunctionBegin;
43*f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
44*f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
45*f6291634SJed Brown   (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr);
46*f6291634SJed Brown   PetscFunctionReturn(0);
472219e2e3SSatish Balay }
482219e2e3SSatish Balay 
492219e2e3SSatish Balay static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,MatStructure *str,void *ptr)
502219e2e3SSatish Balay {
51*f6291634SJed Brown   PetscErrorCode ierr;
52*f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),*ctx;
53*f6291634SJed Brown   DMSNES sdm;
54*f6291634SJed Brown 
55*f6291634SJed Brown   PetscFunctionBegin;
56*f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
57*f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
58*f6291634SJed Brown   (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,str,ctx,&ierr);CHKERRQ(ierr);
59*f6291634SJed Brown   PetscFunctionReturn(0);
602219e2e3SSatish Balay }
612219e2e3SSatish Balay 
622219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
632219e2e3SSatish Balay {
64*f6291634SJed Brown   DMSNES sdm;
652219e2e3SSatish Balay   PetscInt dim;
662219e2e3SSatish Balay 
67*f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
682219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
692219e2e3SSatish Balay   if (dim == 2) {
70*f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
71*f6291634SJed Brown     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj2d,PETSC_NULL);
722219e2e3SSatish Balay   } else if (dim == 3) {
73*f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
74*f6291634SJed Brown     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj3d,PETSC_NULL);
752219e2e3SSatish Balay   } else if (dim == 1) {
76*f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
77*f6291634SJed Brown     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj1d,PETSC_NULL);
782219e2e3SSatish Balay   } else *ierr = 1;
792219e2e3SSatish Balay }
802219e2e3SSatish Balay 
812219e2e3SSatish Balay /************************************************/
822219e2e3SSatish Balay 
832219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
842219e2e3SSatish Balay {
85*f6291634SJed Brown   PetscErrorCode ierr;
86*f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
87*f6291634SJed Brown   DMSNES sdm;
88*f6291634SJed Brown 
89*f6291634SJed Brown   PetscFunctionBegin;
90*f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
91*f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
92*f6291634SJed Brown   (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
93*f6291634SJed Brown   PetscFunctionReturn(0);
942219e2e3SSatish Balay }
952219e2e3SSatish Balay 
962219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
972219e2e3SSatish Balay {
98*f6291634SJed Brown   PetscErrorCode ierr;
99*f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
100*f6291634SJed Brown   DMSNES sdm;
101*f6291634SJed Brown 
102*f6291634SJed Brown   PetscFunctionBegin;
103*f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
104*f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
105*f6291634SJed Brown   (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
106*f6291634SJed Brown   PetscFunctionReturn(0);
1072219e2e3SSatish Balay }
1082219e2e3SSatish Balay 
1092219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
1102219e2e3SSatish Balay {
111*f6291634SJed Brown   PetscErrorCode ierr;
112*f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
113*f6291634SJed Brown   DMSNES sdm;
114*f6291634SJed Brown 
115*f6291634SJed Brown   PetscFunctionBegin;
116*f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
117*f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
118*f6291634SJed 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);
119*f6291634SJed Brown   PetscFunctionReturn(0);
1202219e2e3SSatish Balay }
1212219e2e3SSatish Balay 
1222219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1232219e2e3SSatish Balay {
124*f6291634SJed Brown   DMSNES sdm;
1252219e2e3SSatish Balay   PetscInt dim;
1262219e2e3SSatish Balay 
127*f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
1282219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
1292219e2e3SSatish Balay   if (dim == 2) {
130*f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return;
131*f6291634SJed Brown     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,PETSC_NULL);
1322219e2e3SSatish Balay   } else if (dim == 3) {
133*f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return;
134*f6291634SJed Brown     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,PETSC_NULL);
1352219e2e3SSatish Balay   } else if (dim == 1) {
136*f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return;
137*f6291634SJed Brown     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,PETSC_NULL);
1382219e2e3SSatish Balay   } else *ierr = 1;
1392219e2e3SSatish Balay }
1402219e2e3SSatish Balay 
1412219e2e3SSatish Balay EXTERN_C_END
142