xref: /petsc/src/snes/utils/ftn-custom/zdmdasnesf.c (revision 2219e2e304e1a2e54c1b183c5c37120de5aac0d7)
1*2219e2e3SSatish Balay #include <petsc-private/fortranimpl.h>
2*2219e2e3SSatish Balay #include <petsc-private/daimpl.h>
3*2219e2e3SSatish Balay #include <petscsnes.h>
4*2219e2e3SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5*2219e2e3SSatish Balay #define dmdasnessetjacobianlocal_      DMDASNESSETJACOBIANLOCAL
6*2219e2e3SSatish Balay #define dmdasnessetfunctionlocal_      DMDASNESSETFUNCTIONLOCAL
7*2219e2e3SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
8*2219e2e3SSatish Balay #define dmdasnessetjacobianlocal_      dmdasnessetjacobianlocal
9*2219e2e3SSatish Balay #define dmdasnessetfunctionlocal_      dmdasnessetfunctionlocal
10*2219e2e3SSatish Balay #endif
11*2219e2e3SSatish Balay 
12*2219e2e3SSatish Balay EXTERN_C_BEGIN
13*2219e2e3SSatish Balay /************************************************/
14*2219e2e3SSatish Balay static PetscErrorCode sourlj1d(DMDALocalInfo *info,PetscScalar *in,Mat A,Mat m,MatStructure *str,void *ptr)
15*2219e2e3SSatish Balay {
16*2219e2e3SSatish Balay   PetscErrorCode ierr = 0;
17*2219e2e3SSatish Balay   (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[0]))(info,&in[info->dof*info->gxs],&A,&m,str,ptr,&ierr);CHKERRQ(ierr);
18*2219e2e3SSatish Balay   return 0;
19*2219e2e3SSatish Balay }
20*2219e2e3SSatish Balay 
21*2219e2e3SSatish Balay static PetscErrorCode sourlj2d(DMDALocalInfo *info,PetscScalar **in,Mat A,Mat m,MatStructure *str,void *ptr)
22*2219e2e3SSatish Balay {
23*2219e2e3SSatish Balay   PetscErrorCode ierr = 0;
24*2219e2e3SSatish Balay   (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[1]))(info,&in[info->gys][info->dof*info->gxs],&A,&m,str,ptr,&ierr);CHKERRQ(ierr);
25*2219e2e3SSatish Balay   return 0;
26*2219e2e3SSatish Balay }
27*2219e2e3SSatish Balay 
28*2219e2e3SSatish Balay static PetscErrorCode sourlj3d(DMDALocalInfo *info,PetscScalar ***in,Mat A,Mat m,MatStructure *str,void *ptr)
29*2219e2e3SSatish Balay {
30*2219e2e3SSatish Balay   PetscErrorCode ierr = 0;
31*2219e2e3SSatish Balay   (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[2]))(info,&in[info->gzs][info->gys][info->dof*info->gxs],&A,&m,str,ptr,&ierr);CHKERRQ(ierr);
32*2219e2e3SSatish Balay   return 0;
33*2219e2e3SSatish Balay }
34*2219e2e3SSatish Balay 
35*2219e2e3SSatish Balay /*
36*2219e2e3SSatish Balay    This is buggy, the function pointers should really be attached to the DMSNES object
37*2219e2e3SSatish Balay */
38*2219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetjacobianlocal_(DM *da,void (PETSC_STDCALL *jac)(DMDALocalInfo*,void*,void*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
39*2219e2e3SSatish Balay {
40*2219e2e3SSatish Balay   PetscInt dim;
41*2219e2e3SSatish Balay 
42*2219e2e3SSatish Balay   PetscObjectAllocateFortranPointers(*da,6);
43*2219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
44*2219e2e3SSatish Balay   if (dim == 2) {
45*2219e2e3SSatish Balay     ((PetscObject)*da)->fortran_func_pointers[1] = (PetscVoidFunction)jac;
46*2219e2e3SSatish Balay     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj2d,ctx);
47*2219e2e3SSatish Balay   } else if (dim == 3) {
48*2219e2e3SSatish Balay     ((PetscObject)*da)->fortran_func_pointers[2] = (PetscVoidFunction)jac;
49*2219e2e3SSatish Balay     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj3d,ctx);
50*2219e2e3SSatish Balay   } else if (dim == 1) {
51*2219e2e3SSatish Balay     ((PetscObject)*da)->fortran_func_pointers[0] = (PetscVoidFunction)jac;
52*2219e2e3SSatish Balay     *ierr = DMDASNESSetJacobianLocal(*da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,MatStructure*,void*))sourlj1d,ctx);
53*2219e2e3SSatish Balay   } else *ierr = 1;
54*2219e2e3SSatish Balay }
55*2219e2e3SSatish Balay 
56*2219e2e3SSatish Balay /************************************************/
57*2219e2e3SSatish Balay 
58*2219e2e3SSatish Balay static PetscErrorCode sourlf1d(DMDALocalInfo *info,PetscScalar *in,PetscScalar *out,void *ptr)
59*2219e2e3SSatish Balay {
60*2219e2e3SSatish Balay   PetscErrorCode ierr = 0;
61*2219e2e3SSatish Balay   (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[3]))(info,&in[info->dof*info->gxs],&out[info->dof*info->xs],ptr,&ierr);CHKERRQ(ierr);
62*2219e2e3SSatish Balay   return 0;
63*2219e2e3SSatish Balay }
64*2219e2e3SSatish Balay 
65*2219e2e3SSatish Balay static PetscErrorCode sourlf2d(DMDALocalInfo *info,PetscScalar **in,PetscScalar **out,void *ptr)
66*2219e2e3SSatish Balay {
67*2219e2e3SSatish Balay   PetscErrorCode ierr = 0;
68*2219e2e3SSatish Balay   (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[4]))(info,&in[info->gys][info->dof*info->gxs],&out[info->ys][info->dof*info->xs],ptr,&ierr);CHKERRQ(ierr);
69*2219e2e3SSatish Balay   return 0;
70*2219e2e3SSatish Balay }
71*2219e2e3SSatish Balay 
72*2219e2e3SSatish Balay static PetscErrorCode sourlf3d(DMDALocalInfo *info,PetscScalar ***in,PetscScalar ***out,void *ptr)
73*2219e2e3SSatish Balay {
74*2219e2e3SSatish Balay   PetscErrorCode ierr = 0;
75*2219e2e3SSatish Balay   (*(void (PETSC_STDCALL *)(DMDALocalInfo*,PetscScalar*,PetscScalar*,void*,PetscErrorCode*))(((PetscObject)info->da)->fortran_func_pointers[5]))(info,&in[info->gzs][info->gys][info->dof*info->gxs],&out[info->zs][info->ys][info->dof*info->xs],ptr,&ierr);CHKERRQ(ierr);
76*2219e2e3SSatish Balay   return 0;
77*2219e2e3SSatish Balay }
78*2219e2e3SSatish Balay 
79*2219e2e3SSatish Balay /*
80*2219e2e3SSatish Balay    This is buggy, the function pointers should really be attached to the DMSNES object
81*2219e2e3SSatish Balay */
82*2219e2e3SSatish Balay void PETSC_STDCALL dmdasnessetfunctionlocal_(DM *da,InsertMode *mode,void (PETSC_STDCALL *func)(DMDALocalInfo*,void*,void*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
83*2219e2e3SSatish Balay {
84*2219e2e3SSatish Balay   PetscInt dim;
85*2219e2e3SSatish Balay 
86*2219e2e3SSatish Balay   PetscObjectAllocateFortranPointers(*da,6);
87*2219e2e3SSatish Balay   *ierr = DMDAGetInfo(*da,&dim,0,0,0,0,0,0,0,0,0,0,0,0); if (*ierr) return;
88*2219e2e3SSatish Balay   if (dim == 2) {
89*2219e2e3SSatish Balay     ((PetscObject)*da)->fortran_func_pointers[4] = (PetscVoidFunction)func;
90*2219e2e3SSatish Balay     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf2d,ctx);
91*2219e2e3SSatish Balay   } else if (dim == 3) {
92*2219e2e3SSatish Balay     ((PetscObject)*da)->fortran_func_pointers[5] = (PetscVoidFunction)func;
93*2219e2e3SSatish Balay     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf3d,ctx);
94*2219e2e3SSatish Balay   } else if (dim == 1) {
95*2219e2e3SSatish Balay     ((PetscObject)*da)->fortran_func_pointers[3] = (PetscVoidFunction)func;
96*2219e2e3SSatish Balay     *ierr = DMDASNESSetFunctionLocal(*da,*mode,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))sourlf1d,ctx);
97*2219e2e3SSatish Balay   } else *ierr = 1;
98*2219e2e3SSatish Balay }
99*2219e2e3SSatish Balay 
100*2219e2e3SSatish Balay EXTERN_C_END
101