1*6dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2*6dd63270SBarry Smith #include <petscdmswarm.h>
3*6dd63270SBarry Smith
4*6dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS)
5*6dd63270SBarry Smith #define dmswarmgetfield_ DMSWARMGETFIELD
6*6dd63270SBarry Smith #define dmswarmrestorefield_ DMSWARMRESTOREFIELD
7*6dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
8*6dd63270SBarry Smith #define dmswarmgetfield_ dmswarmgetfield
9*6dd63270SBarry Smith #define dmswarmrestorefield_ dmswarmrestorefield
10*6dd63270SBarry Smith #endif
11*6dd63270SBarry Smith
12*6dd63270SBarry Smith /* Definitions of Fortran Wrapper routines */
13*6dd63270SBarry Smith
dmswarmgetfield_(DM * dm,char * name,PetscInt * blocksize,PetscDataType * type,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd),PETSC_FORTRAN_CHARLEN_T lenN)14*6dd63270SBarry Smith PETSC_EXTERN void dmswarmgetfield_(DM *dm, char *name, PetscInt *blocksize, PetscDataType *type, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd), PETSC_FORTRAN_CHARLEN_T lenN)
15*6dd63270SBarry Smith {
16*6dd63270SBarry Smith PetscScalar *v;
17*6dd63270SBarry Smith PetscInt n;
18*6dd63270SBarry Smith char *fieldname;
19*6dd63270SBarry Smith
20*6dd63270SBarry Smith FIXCHAR(name, lenN, fieldname);
21*6dd63270SBarry Smith *ierr = DMSwarmGetSize(*dm, &n);
22*6dd63270SBarry Smith if (*ierr) return;
23*6dd63270SBarry Smith *ierr = DMSwarmGetField(*dm, fieldname, blocksize, type, (void **)&v);
24*6dd63270SBarry Smith if (*ierr) return;
25*6dd63270SBarry Smith *ierr = F90Array1dCreate((void *)v, MPIU_SCALAR, 1, n, ptr PETSC_F90_2PTR_PARAM(ptrd));
26*6dd63270SBarry Smith FREECHAR(name, fieldname);
27*6dd63270SBarry Smith }
28*6dd63270SBarry Smith
dmswarmrestorefield_(DM * dm,char * name,PetscInt * blocksize,PetscDataType * type,F90Array1d * ptr,int * ierr PETSC_F90_2PTR_PROTO (ptrd),PETSC_FORTRAN_CHARLEN_T lenN)29*6dd63270SBarry Smith PETSC_EXTERN void dmswarmrestorefield_(DM *dm, char *name, PetscInt *blocksize, PetscDataType *type, F90Array1d *ptr, int *ierr PETSC_F90_2PTR_PROTO(ptrd), PETSC_FORTRAN_CHARLEN_T lenN)
30*6dd63270SBarry Smith {
31*6dd63270SBarry Smith PetscScalar *v;
32*6dd63270SBarry Smith char *fieldname;
33*6dd63270SBarry Smith
34*6dd63270SBarry Smith FIXCHAR(name, lenN, fieldname);
35*6dd63270SBarry Smith *ierr = F90Array1dAccess(ptr, MPIU_SCALAR, (void **)&v PETSC_F90_2PTR_PARAM(ptrd));
36*6dd63270SBarry Smith if (*ierr) return;
37*6dd63270SBarry Smith if (*ierr) return;
38*6dd63270SBarry Smith *ierr = DMSwarmRestoreField(*dm, fieldname, blocksize, type, (void **)&v);
39*6dd63270SBarry Smith if (*ierr) return;
40*6dd63270SBarry Smith *ierr = F90Array1dDestroy(ptr, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd));
41*6dd63270SBarry Smith FREECHAR(name, fieldname);
42*6dd63270SBarry Smith }
43