xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision d1e9a80f72efc361583d2fc822de9783b227627d)
12219e2e3SSatish Balay #include <petsc-private/fortranimpl.h>
24035e84dSBarry 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 
21f7ecc322SBarry Smith #undef __FUNCT__
22f7ecc322SBarry Smith #define __FUNCT__ "sourlj1d"
232219e2e3SSatish Balay /************************************************/
24*d1e9a80fSBarry Smith static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,void *ptr)
252219e2e3SSatish Balay {
26f6291634SJed Brown   PetscErrorCode ierr;
27*d1e9a80fSBarry Smith   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
28f6291634SJed Brown   DMSNES sdm;
29f6291634SJed Brown 
30f6291634SJed Brown   PetscFunctionBegin;
31f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
32f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
33*d1e9a80fSBarry Smith   (*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
34f6291634SJed Brown   PetscFunctionReturn(0);
352219e2e3SSatish Balay }
362219e2e3SSatish Balay 
37f7ecc322SBarry Smith #undef __FUNCT__
38f7ecc322SBarry Smith #define __FUNCT__ "sourlj2d"
39*d1e9a80fSBarry Smith static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,void *ptr)
402219e2e3SSatish Balay {
41f6291634SJed Brown   PetscErrorCode ierr;
42*d1e9a80fSBarry Smith   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
43f6291634SJed Brown   DMSNES sdm;
44f6291634SJed Brown 
45f6291634SJed Brown   PetscFunctionBegin;
46f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
47f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
48*d1e9a80fSBarry Smith   (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
49f6291634SJed Brown   PetscFunctionReturn(0);
502219e2e3SSatish Balay }
512219e2e3SSatish Balay 
52f7ecc322SBarry Smith #undef __FUNCT__
53f7ecc322SBarry Smith #define __FUNCT__ "sourlj3d"
54*d1e9a80fSBarry Smith static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,void *ptr)
552219e2e3SSatish Balay {
56f6291634SJed Brown   PetscErrorCode ierr;
57*d1e9a80fSBarry Smith   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
58f6291634SJed Brown   DMSNES sdm;
59f6291634SJed Brown 
60f6291634SJed Brown   PetscFunctionBegin;
61f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
62f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
63*d1e9a80fSBarry Smith   (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
64f6291634SJed Brown   PetscFunctionReturn(0);
652219e2e3SSatish Balay }
662219e2e3SSatish Balay 
678cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
682219e2e3SSatish Balay {
69f6291634SJed Brown   DMSNES   sdm;
702219e2e3SSatish Balay   PetscInt dim;
712219e2e3SSatish Balay 
72f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
732219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
742219e2e3SSatish Balay   if (dim == 2) {
75f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
76*d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj2d,NULL);
772219e2e3SSatish Balay   } else if (dim == 3) {
78f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
79*d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj3d,NULL);
802219e2e3SSatish Balay   } else if (dim == 1) {
81f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
82*d1e9a80fSBarry Smith     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj1d,NULL);
832219e2e3SSatish Balay   } else *ierr = 1;
842219e2e3SSatish Balay }
852219e2e3SSatish Balay 
862219e2e3SSatish Balay /************************************************/
872219e2e3SSatish Balay 
88f7ecc322SBarry Smith #undef __FUNCT__
89f7ecc322SBarry Smith #define __FUNCT__ "sourlf1d"
902219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
912219e2e3SSatish Balay {
92f6291634SJed Brown   PetscErrorCode ierr;
93f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
94f6291634SJed Brown   DMSNES sdm;
95f6291634SJed Brown 
96f6291634SJed Brown   PetscFunctionBegin;
97f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
98f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
99f6291634SJed Brown   (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
100f6291634SJed Brown   PetscFunctionReturn(0);
1012219e2e3SSatish Balay }
1022219e2e3SSatish Balay 
103f7ecc322SBarry Smith #undef __FUNCT__
104f7ecc322SBarry Smith #define __FUNCT__ "sourlf2d"
1052219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
1062219e2e3SSatish Balay {
107f6291634SJed Brown   PetscErrorCode ierr;
108f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
109f6291634SJed Brown   DMSNES sdm;
110f6291634SJed Brown 
111f6291634SJed Brown   PetscFunctionBegin;
112f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
113f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
114f6291634SJed Brown   (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
115f6291634SJed Brown   PetscFunctionReturn(0);
1162219e2e3SSatish Balay }
1172219e2e3SSatish Balay 
118f7ecc322SBarry Smith #undef __FUNCT__
119f7ecc322SBarry Smith #define __FUNCT__ "sourlf3d"
1202219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
1212219e2e3SSatish Balay {
122f6291634SJed Brown   PetscErrorCode ierr;
123f6291634SJed Brown   void (PETSC_STDCALL *func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
124f6291634SJed Brown   DMSNES sdm;
125f6291634SJed Brown 
126f6291634SJed Brown   PetscFunctionBegin;
127f6291634SJed Brown   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
128f6291634SJed Brown   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
129f6291634SJed 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);
130f6291634SJed Brown   PetscFunctionReturn(0);
1312219e2e3SSatish Balay }
1322219e2e3SSatish Balay 
1338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1342219e2e3SSatish Balay {
135f6291634SJed Brown   DMSNES   sdm;
1362219e2e3SSatish Balay   PetscInt dim;
1372219e2e3SSatish Balay 
138f6291634SJed Brown   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
1392219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
1402219e2e3SSatish Balay   if (dim == 2) {
141f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1420298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL);
1432219e2e3SSatish Balay   } else if (dim == 3) {
144f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1450298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL);
1462219e2e3SSatish Balay   } else if (dim == 1) {
147f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return;
1480298fd71SBarry Smith     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL);
1492219e2e3SSatish Balay   } else *ierr = 1;
1502219e2e3SSatish Balay }
1512219e2e3SSatish Balay 
1521a1c1e04SBarry Smith 
1531a1c1e04SBarry Smith 
154