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 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 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