xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision 7d5fd1e4d9337468ad3f05b65b7facdcd2dfd2a4)
1 #include <petsc/private/fortranimpl.h>
2 #include <petsc/private/dmdaimpl.h>
3 #include <petsc/private/snesimpl.h>
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5 #define dmdasnessetjacobianlocal_      DMDASNESSETJACOBIANLOCAL
6 #define dmdasnessetfunctionlocal_      DMDASNESSETFUNCTIONLOCAL
7 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
8 #define dmdasnessetjacobianlocal_      dmdasnessetjacobianlocal
9 #define dmdasnessetfunctionlocal_      dmdasnessetfunctionlocal
10 #endif
11 
12 static struct {
13   PetscFortranCallbackId lf1d;
14   PetscFortranCallbackId lf2d;
15   PetscFortranCallbackId lf3d;
16   PetscFortranCallbackId lj1d;
17   PetscFortranCallbackId lj2d;
18   PetscFortranCallbackId lj3d;
19 } _cb;
20 
21 /************************************************/
22 static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,void *ptr)
23 {
24   PetscErrorCode ierr;
25   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
26   DMSNES sdm;
27 
28   PetscFunctionBegin;
29   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
30   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
31   (*func)(info,&in[info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
32   PetscFunctionReturn(0);
33 }
34 
35 static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,void *ptr)
36 {
37   PetscErrorCode ierr;
38   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
39   DMSNES sdm;
40 
41   PetscFunctionBegin;
42   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
43   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
44   (*func)(info,&in[info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
45   PetscFunctionReturn(0);
46 }
47 
48 static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,void *ptr)
49 {
50   PetscErrorCode ierr;
51   void (*func)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
52   DMSNES sdm;
53 
54   PetscFunctionBegin;
55   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
56   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lj2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
57   (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,ctx,&ierr);CHKERRQ(ierr);
58   PetscFunctionReturn(0);
59 }
60 
61 PETSC_EXTERN void dmdasnessetjacobianlocal_(DM *da,void (*jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
62 {
63   DMSNES   sdm;
64   PetscInt dim;
65 
66   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
67   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
68   if (dim == 2) {
69     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj2d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
70     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj2d,NULL);
71   } else if (dim == 3) {
72     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj3d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
73     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj3d,NULL);
74   } else if (dim == 1) {
75     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lj1d,(PetscVoidFunction)jac,ctx); if (*ierr) return;
76     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))sourlj1d,NULL);
77   } else *ierr = 1;
78 }
79 
80 /************************************************/
81 
82 static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
83 {
84   PetscErrorCode ierr;
85   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
86   DMSNES sdm;
87 
88   PetscFunctionBegin;
89   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
90   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf1d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
91   (*func)(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
92   PetscFunctionReturn(0);
93 }
94 
95 static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
96 {
97   PetscErrorCode ierr;
98   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
99   DMSNES sdm;
100 
101   PetscFunctionBegin;
102   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
103   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf2d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
104   (*func)(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
105   PetscFunctionReturn(0);
106 }
107 
108 static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
109 {
110   PetscErrorCode ierr;
111   void (*func)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*),*ctx;
112   DMSNES sdm;
113 
114   PetscFunctionBegin;
115   ierr = DMGetDMSNES(info->da,&sdm);CHKERRQ(ierr);
116   ierr = PetscObjectGetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,_cb.lf3d,(PetscVoidFunction*)&func,&ctx);CHKERRQ(ierr);
117   (*func)(info,&in[info->gzs][info->gys][info->dof*info->gxs],&out[info->zs][info->ys][info->dof*info->xs],ctx,&ierr);CHKERRQ(ierr);
118   PetscFunctionReturn(0);
119 }
120 
121 PETSC_EXTERN void dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (*func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
122 {
123   DMSNES   sdm;
124   PetscInt dim;
125 
126   *ierr = DMGetDMSNESWrite(*da,&sdm); if (*ierr) return;
127   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
128   if (dim == 2) {
129     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf2d,(PetscVoidFunction)func,ctx); if (*ierr) return;
130     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,NULL);
131   } else if (dim == 3) {
132     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf3d,(PetscVoidFunction)func,ctx); if (*ierr) return;
133     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,NULL);
134   } else if (dim == 1) {
135     *ierr = PetscObjectSetFortranCallback((PetscObject)sdm,PETSC_FORTRAN_CALLBACK_SUBTYPE,&_cb.lf1d,(PetscVoidFunction)func,ctx); if (*ierr) return;
136     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,NULL);
137   } else *ierr = 1;
138 }
139 
140