16dd63270SBarry Smith #include <petsc/private/ftnimpl.h> 26dd63270SBarry Smith #include <petscdmda.h> 36dd63270SBarry Smith 46dd63270SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 5*0da4d79bSMartin Diehl #define dmdavecgetarray1_ DMDAVECGETARRAY1 6*0da4d79bSMartin Diehl #define dmdavecrestorearray1_ DMDAVECRESTOREARRAY1 7*0da4d79bSMartin Diehl #define dmdavecgetarray2_ DMDAVECGETARRAY2 8*0da4d79bSMartin Diehl #define dmdavecrestorearray2_ DMDAVECRESTOREARRAY2 9*0da4d79bSMartin Diehl #define dmdavecgetarray3_ DMDAVECGETARRAY3 10*0da4d79bSMartin Diehl #define dmdavecrestorearray3_ DMDAVECRESTOREARRAY3 11*0da4d79bSMartin Diehl #define dmdavecgetarray4_ DMDAVECGETARRAY4 12*0da4d79bSMartin Diehl #define dmdavecrestorearray4_ DMDAVECRESTOREARRAY4 13*0da4d79bSMartin Diehl #define dmdavecgetarrayread1_ DMDAVECGETARRAYREAD1 14*0da4d79bSMartin Diehl #define dmdavecrestorearrayread1_ DMDAVECRESTOREARRAYREAD1 15*0da4d79bSMartin Diehl #define dmdavecgetarrayread2_ DMDAVECGETARRAYREAD2 16*0da4d79bSMartin Diehl #define dmdavecrestorearrayread2_ DMDAVECRESTOREARRAYREAD2 17*0da4d79bSMartin Diehl #define dmdavecgetarrayread3_ DMDAVECGETARRAYREAD3 18*0da4d79bSMartin Diehl #define dmdavecrestorearrayread3_ DMDAVECRESTOREARRAYREAD3 19*0da4d79bSMartin Diehl #define dmdavecgetarrayread4_ DMDAVECGETARRAYREAD4 20*0da4d79bSMartin Diehl #define dmdavecrestorearrayread4_ DMDAVECRESTOREARRAYREAD4 216dd63270SBarry Smith #define dmdagetelements_ DMDAGETELEMENTS 226dd63270SBarry Smith #define dmdarestoreelements_ DMDARESTOREELEMENTS 236dd63270SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 24*0da4d79bSMartin Diehl #define dmdavecgetarray1_ dmdavecgetarray1 25*0da4d79bSMartin Diehl #define dmdavecrestorearray1_ dmdavecrestorearray1 26*0da4d79bSMartin Diehl #define dmdavecgetarray2_ dmdavecgetarray2 27*0da4d79bSMartin Diehl #define dmdavecrestorearray2_ dmdavecrestorearray2 28*0da4d79bSMartin Diehl #define dmdavecgetarray3_ dmdavecgetarray3 29*0da4d79bSMartin Diehl #define dmdavecrestorearray3_ dmdavecrestorearray3 30*0da4d79bSMartin Diehl #define dmdavecgetarray4_ dmdavecgetarray4 31*0da4d79bSMartin Diehl #define dmdavecrestorearray4_ dmdavecrestorearray4 32*0da4d79bSMartin Diehl #define dmdavecgetarrayread1_ dmdavecgetarrayread1 33*0da4d79bSMartin Diehl #define dmdavecrestorearrayread1_ dmdavecrestorearrayread1 34*0da4d79bSMartin Diehl #define dmdavecgetarrayread2_ dmdavecgetarrayread2 35*0da4d79bSMartin Diehl #define dmdavecrestorearrayread2_ dmdavecrestorearrayread2 36*0da4d79bSMartin Diehl #define dmdavecgetarrayread3_ dmdavecgetarrayread3 37*0da4d79bSMartin Diehl #define dmdavecrestorearrayread3_ dmdavecrestorearrayread3 38*0da4d79bSMartin Diehl #define dmdavecgetarrayread4_ dmdavecgetarrayread4 39*0da4d79bSMartin Diehl #define dmdavecrestorearrayread4_ dmdavecrestorearrayread4 406dd63270SBarry Smith #define dmdagetelements_ dmdagetelements 416dd63270SBarry Smith #define dmdarestoreelements_ dmdarestoreelements 426dd63270SBarry Smith #endif 436dd63270SBarry Smith 446dd63270SBarry Smith PETSC_EXTERN void dmdagetelements_(DM *dm, PetscInt *nel, PetscInt *nen, F90Array1d *e, int *ierr PETSC_F90_2PTR_PROTO(ptrd)) 456dd63270SBarry Smith { 466dd63270SBarry Smith const PetscInt *fa; 476dd63270SBarry Smith 486dd63270SBarry Smith if (!e) { 496dd63270SBarry Smith *ierr = PetscError(((PetscObject)e)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "e==NULL, maybe #include <petsc/finclude/petscvec.h> is missing?"); 506dd63270SBarry Smith return; 516dd63270SBarry Smith } 526dd63270SBarry Smith *ierr = DMDAGetElements(*dm, nel, nen, &fa); 536dd63270SBarry Smith if (*ierr) return; 546dd63270SBarry Smith *ierr = F90Array1dCreate((PetscInt *)fa, MPIU_INT, 1, (*nel) * (*nen), e PETSC_F90_2PTR_PARAM(ptrd)); 556dd63270SBarry Smith } 566dd63270SBarry Smith 576dd63270SBarry Smith PETSC_EXTERN void dmdarestoreelements_(DM *dm, PetscInt *nel, PetscInt *nen, F90Array1d *e, int *ierr PETSC_F90_2PTR_PROTO(ptrd)) 586dd63270SBarry Smith { 596dd63270SBarry Smith if (!e) { 606dd63270SBarry Smith *ierr = PetscError(((PetscObject)e)->comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, PETSC_ERR_ARG_BADPTR, PETSC_ERROR_INITIAL, "e==NULL, maybe #include <petsc/finclude/petscvec.h> is missing?"); 616dd63270SBarry Smith return; 626dd63270SBarry Smith } 636dd63270SBarry Smith *ierr = F90Array1dDestroy(e, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 646dd63270SBarry Smith } 656dd63270SBarry Smith 66*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarray1_(DM *da, Vec *v, F90Array1d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 676dd63270SBarry Smith { 686dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 696dd63270SBarry Smith PetscScalar *aa; 706dd63270SBarry Smith 716dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 726dd63270SBarry Smith if (*ierr) return; 736dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 746dd63270SBarry Smith if (*ierr) return; 756dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 766dd63270SBarry Smith if (*ierr) return; 776dd63270SBarry Smith 786dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 796dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 806dd63270SBarry Smith if (*ierr) return; 816dd63270SBarry Smith if (N == xm * ym * zm * dof) { 826dd63270SBarry Smith gxm = xm; 836dd63270SBarry Smith gym = ym; 846dd63270SBarry Smith gzm = zm; 856dd63270SBarry Smith gxs = xs; 866dd63270SBarry Smith gys = ys; 876dd63270SBarry Smith gzs = zs; 886dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 896dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 906dd63270SBarry Smith return; 916dd63270SBarry Smith } 926dd63270SBarry Smith *ierr = VecGetArray(*v, &aa); 936dd63270SBarry Smith if (*ierr) return; 946dd63270SBarry Smith *ierr = F90Array1dCreate(aa, MPIU_SCALAR, gxs, gxm, a PETSC_F90_2PTR_PARAM(ptrd)); 956dd63270SBarry Smith if (*ierr) return; 966dd63270SBarry Smith } 976dd63270SBarry Smith 98*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearray1_(DM *da, Vec *v, F90Array1d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 996dd63270SBarry Smith { 1006dd63270SBarry Smith PetscScalar *fa; 1016dd63270SBarry Smith *ierr = F90Array1dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 1026dd63270SBarry Smith *ierr = VecRestoreArray(*v, &fa); 1036dd63270SBarry Smith if (*ierr) return; 1046dd63270SBarry Smith *ierr = F90Array1dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 1056dd63270SBarry Smith } 1066dd63270SBarry Smith 107*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarray2_(DM *da, Vec *v, F90Array2d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 1086dd63270SBarry Smith { 1096dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 1106dd63270SBarry Smith PetscScalar *aa; 1116dd63270SBarry Smith 1126dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 1136dd63270SBarry Smith if (*ierr) return; 1146dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 1156dd63270SBarry Smith if (*ierr) return; 1166dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 1176dd63270SBarry Smith if (*ierr) return; 1186dd63270SBarry Smith 1196dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 1206dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 1216dd63270SBarry Smith if (*ierr) return; 1226dd63270SBarry Smith if (N == xm * ym * zm * dof) { 1236dd63270SBarry Smith gxm = xm; 1246dd63270SBarry Smith gym = ym; 1256dd63270SBarry Smith gzm = zm; 1266dd63270SBarry Smith gxs = xs; 1276dd63270SBarry Smith gys = ys; 1286dd63270SBarry Smith gzs = zs; 1296dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 1306dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 1316dd63270SBarry Smith return; 1326dd63270SBarry Smith } 1336dd63270SBarry Smith if (dim == 1) { 1346dd63270SBarry Smith gys = gxs; 1356dd63270SBarry Smith gym = gxm; 1366dd63270SBarry Smith gxs = 0; 1376dd63270SBarry Smith gxm = dof; 1386dd63270SBarry Smith } 1396dd63270SBarry Smith *ierr = VecGetArray(*v, &aa); 1406dd63270SBarry Smith if (*ierr) return; 1416dd63270SBarry Smith *ierr = F90Array2dCreate(aa, MPIU_SCALAR, gxs, gxm, gys, gym, a PETSC_F90_2PTR_PARAM(ptrd)); 1426dd63270SBarry Smith if (*ierr) return; 1436dd63270SBarry Smith } 1446dd63270SBarry Smith 145*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearray2_(DM *da, Vec *v, F90Array2d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 1466dd63270SBarry Smith { 1476dd63270SBarry Smith PetscScalar *fa; 1486dd63270SBarry Smith *ierr = F90Array2dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 1496dd63270SBarry Smith *ierr = VecRestoreArray(*v, &fa); 1506dd63270SBarry Smith if (*ierr) return; 1516dd63270SBarry Smith *ierr = F90Array2dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 1526dd63270SBarry Smith } 1536dd63270SBarry Smith 154*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarray3_(DM *da, Vec *v, F90Array3d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 1556dd63270SBarry Smith { 1566dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 1576dd63270SBarry Smith PetscScalar *aa; 1586dd63270SBarry Smith 1596dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 1606dd63270SBarry Smith if (*ierr) return; 1616dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 1626dd63270SBarry Smith if (*ierr) return; 1636dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 1646dd63270SBarry Smith if (*ierr) return; 1656dd63270SBarry Smith 1666dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 1676dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 1686dd63270SBarry Smith if (*ierr) return; 1696dd63270SBarry Smith if (N == xm * ym * zm * dof) { 1706dd63270SBarry Smith gxm = xm; 1716dd63270SBarry Smith gym = ym; 1726dd63270SBarry Smith gzm = zm; 1736dd63270SBarry Smith gxs = xs; 1746dd63270SBarry Smith gys = ys; 1756dd63270SBarry Smith gzs = zs; 1766dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 1776dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 1786dd63270SBarry Smith return; 1796dd63270SBarry Smith } 1806dd63270SBarry Smith if (dim == 2) { 1816dd63270SBarry Smith gzs = gys; 1826dd63270SBarry Smith gzm = gym; 1836dd63270SBarry Smith gys = gxs; 1846dd63270SBarry Smith gym = gxm; 1856dd63270SBarry Smith gxs = 0; 1866dd63270SBarry Smith gxm = dof; 1876dd63270SBarry Smith } 1886dd63270SBarry Smith *ierr = VecGetArray(*v, &aa); 1896dd63270SBarry Smith if (*ierr) return; 1906dd63270SBarry Smith *ierr = F90Array3dCreate(aa, MPIU_SCALAR, gxs, gxm, gys, gym, gzs, gzm, a PETSC_F90_2PTR_PARAM(ptrd)); 1916dd63270SBarry Smith if (*ierr) return; 1926dd63270SBarry Smith } 1936dd63270SBarry Smith 194*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearray3_(DM *da, Vec *v, F90Array3d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 1956dd63270SBarry Smith { 1966dd63270SBarry Smith PetscScalar *fa; 1976dd63270SBarry Smith *ierr = F90Array3dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 1986dd63270SBarry Smith *ierr = VecRestoreArray(*v, &fa); 1996dd63270SBarry Smith if (*ierr) return; 2006dd63270SBarry Smith *ierr = F90Array3dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 2016dd63270SBarry Smith } 2026dd63270SBarry Smith 203*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarray4_(DM *da, Vec *v, F90Array4d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 2046dd63270SBarry Smith { 2056dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof, zero = 0; 2066dd63270SBarry Smith PetscScalar *aa; 2076dd63270SBarry Smith 2086dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 2096dd63270SBarry Smith if (*ierr) return; 2106dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 2116dd63270SBarry Smith if (*ierr) return; 2126dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 2136dd63270SBarry Smith if (*ierr) return; 2146dd63270SBarry Smith 2156dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 2166dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 2176dd63270SBarry Smith if (*ierr) return; 2186dd63270SBarry Smith if (N == xm * ym * zm * dof) { 2196dd63270SBarry Smith gxm = xm; 2206dd63270SBarry Smith gym = ym; 2216dd63270SBarry Smith gzm = zm; 2226dd63270SBarry Smith gxs = xs; 2236dd63270SBarry Smith gys = ys; 2246dd63270SBarry Smith gzs = zs; 2256dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 2266dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 2276dd63270SBarry Smith return; 2286dd63270SBarry Smith } 2296dd63270SBarry Smith *ierr = VecGetArray(*v, &aa); 2306dd63270SBarry Smith if (*ierr) return; 2316dd63270SBarry Smith *ierr = F90Array4dCreate(aa, MPIU_SCALAR, zero, dof, gxs, gxm, gys, gym, gzs, gzm, a PETSC_F90_2PTR_PARAM(ptrd)); 2326dd63270SBarry Smith if (*ierr) return; 2336dd63270SBarry Smith } 2346dd63270SBarry Smith 235*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearray4_(DM *da, Vec *v, F90Array4d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 2366dd63270SBarry Smith { 2376dd63270SBarry Smith PetscScalar *fa; 2386dd63270SBarry Smith /* 2396dd63270SBarry Smith F90Array4dAccess is not implemented, so the following call would fail 2406dd63270SBarry Smith */ 2416dd63270SBarry Smith *ierr = F90Array4dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 2426dd63270SBarry Smith *ierr = VecRestoreArray(*v, &fa); 2436dd63270SBarry Smith if (*ierr) return; 2446dd63270SBarry Smith *ierr = F90Array4dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 2456dd63270SBarry Smith } 2466dd63270SBarry Smith 247*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarrayread1_(DM *da, Vec *v, F90Array1d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 2486dd63270SBarry Smith { 2496dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 2506dd63270SBarry Smith const PetscScalar *aa; 2516dd63270SBarry Smith 2526dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 2536dd63270SBarry Smith if (*ierr) return; 2546dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 2556dd63270SBarry Smith if (*ierr) return; 2566dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 2576dd63270SBarry Smith if (*ierr) return; 2586dd63270SBarry Smith 2596dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 2606dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 2616dd63270SBarry Smith if (*ierr) return; 2626dd63270SBarry Smith if (N == xm * ym * zm * dof) { 2636dd63270SBarry Smith gxm = xm; 2646dd63270SBarry Smith gym = ym; 2656dd63270SBarry Smith gzm = zm; 2666dd63270SBarry Smith gxs = xs; 2676dd63270SBarry Smith gys = ys; 2686dd63270SBarry Smith gzs = zs; 2696dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 2706dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 2716dd63270SBarry Smith return; 2726dd63270SBarry Smith } 2736dd63270SBarry Smith *ierr = VecGetArrayRead(*v, &aa); 2746dd63270SBarry Smith if (*ierr) return; 2756dd63270SBarry Smith *ierr = F90Array1dCreate((void *)aa, MPIU_SCALAR, gxs, gxm, a PETSC_F90_2PTR_PARAM(ptrd)); 2766dd63270SBarry Smith if (*ierr) return; 2776dd63270SBarry Smith } 2786dd63270SBarry Smith 279*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearrayread1_(DM *da, Vec *v, F90Array1d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 2806dd63270SBarry Smith { 2816dd63270SBarry Smith const PetscScalar *fa; 2826dd63270SBarry Smith *ierr = F90Array1dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 2836dd63270SBarry Smith *ierr = VecRestoreArrayRead(*v, &fa); 2846dd63270SBarry Smith if (*ierr) return; 2856dd63270SBarry Smith *ierr = F90Array1dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 2866dd63270SBarry Smith } 2876dd63270SBarry Smith 288*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarrayread2_(DM *da, Vec *v, F90Array2d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 2896dd63270SBarry Smith { 2906dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 2916dd63270SBarry Smith const PetscScalar *aa; 2926dd63270SBarry Smith 2936dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 2946dd63270SBarry Smith if (*ierr) return; 2956dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 2966dd63270SBarry Smith if (*ierr) return; 2976dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 2986dd63270SBarry Smith if (*ierr) return; 2996dd63270SBarry Smith 3006dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 3016dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 3026dd63270SBarry Smith if (*ierr) return; 3036dd63270SBarry Smith if (N == xm * ym * zm * dof) { 3046dd63270SBarry Smith gxm = xm; 3056dd63270SBarry Smith gym = ym; 3066dd63270SBarry Smith gzm = zm; 3076dd63270SBarry Smith gxs = xs; 3086dd63270SBarry Smith gys = ys; 3096dd63270SBarry Smith gzs = zs; 3106dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 3116dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 3126dd63270SBarry Smith return; 3136dd63270SBarry Smith } 3146dd63270SBarry Smith if (dim == 1) { 3156dd63270SBarry Smith gys = gxs; 3166dd63270SBarry Smith gym = gxm; 3176dd63270SBarry Smith gxs = 0; 3186dd63270SBarry Smith gxm = dof; 3196dd63270SBarry Smith } 3206dd63270SBarry Smith *ierr = VecGetArrayRead(*v, &aa); 3216dd63270SBarry Smith if (*ierr) return; 3226dd63270SBarry Smith *ierr = F90Array2dCreate((void *)aa, MPIU_SCALAR, gxs, gxm, gys, gym, a PETSC_F90_2PTR_PARAM(ptrd)); 3236dd63270SBarry Smith if (*ierr) return; 3246dd63270SBarry Smith } 3256dd63270SBarry Smith 326*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearrayread2_(DM *da, Vec *v, F90Array2d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 3276dd63270SBarry Smith { 3286dd63270SBarry Smith const PetscScalar *fa; 3296dd63270SBarry Smith *ierr = F90Array2dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 3306dd63270SBarry Smith *ierr = VecRestoreArrayRead(*v, &fa); 3316dd63270SBarry Smith if (*ierr) return; 3326dd63270SBarry Smith *ierr = F90Array2dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 3336dd63270SBarry Smith } 3346dd63270SBarry Smith 335*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarrayread3_(DM *da, Vec *v, F90Array3d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 3366dd63270SBarry Smith { 3376dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 3386dd63270SBarry Smith const PetscScalar *aa; 3396dd63270SBarry Smith 3406dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 3416dd63270SBarry Smith if (*ierr) return; 3426dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 3436dd63270SBarry Smith if (*ierr) return; 3446dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 3456dd63270SBarry Smith if (*ierr) return; 3466dd63270SBarry Smith 3476dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 3486dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 3496dd63270SBarry Smith if (*ierr) return; 3506dd63270SBarry Smith if (N == xm * ym * zm * dof) { 3516dd63270SBarry Smith gxm = xm; 3526dd63270SBarry Smith gym = ym; 3536dd63270SBarry Smith gzm = zm; 3546dd63270SBarry Smith gxs = xs; 3556dd63270SBarry Smith gys = ys; 3566dd63270SBarry Smith gzs = zs; 3576dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 3586dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 3596dd63270SBarry Smith return; 3606dd63270SBarry Smith } 3616dd63270SBarry Smith if (dim == 2) { 3626dd63270SBarry Smith gzs = gys; 3636dd63270SBarry Smith gzm = gym; 3646dd63270SBarry Smith gys = gxs; 3656dd63270SBarry Smith gym = gxm; 3666dd63270SBarry Smith gxs = 0; 3676dd63270SBarry Smith gxm = dof; 3686dd63270SBarry Smith } 3696dd63270SBarry Smith *ierr = VecGetArrayRead(*v, &aa); 3706dd63270SBarry Smith if (*ierr) return; 3716dd63270SBarry Smith *ierr = F90Array3dCreate((void *)aa, MPIU_SCALAR, gxs, gxm, gys, gym, gzs, gzm, a PETSC_F90_2PTR_PARAM(ptrd)); 3726dd63270SBarry Smith if (*ierr) return; 3736dd63270SBarry Smith } 3746dd63270SBarry Smith 375*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearrayread3_(DM *da, Vec *v, F90Array3d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 3766dd63270SBarry Smith { 3776dd63270SBarry Smith const PetscScalar *fa; 3786dd63270SBarry Smith *ierr = F90Array3dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 3796dd63270SBarry Smith *ierr = VecRestoreArrayRead(*v, &fa); 3806dd63270SBarry Smith if (*ierr) return; 3816dd63270SBarry Smith *ierr = F90Array3dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 3826dd63270SBarry Smith } 3836dd63270SBarry Smith 384*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecgetarrayread4_(DM *da, Vec *v, F90Array4d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 3856dd63270SBarry Smith { 3866dd63270SBarry Smith PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof, zero = 0; 3876dd63270SBarry Smith const PetscScalar *aa; 3886dd63270SBarry Smith 3896dd63270SBarry Smith *ierr = DMDAGetCorners(*da, &xs, &ys, &zs, &xm, &ym, &zm); 3906dd63270SBarry Smith if (*ierr) return; 3916dd63270SBarry Smith *ierr = DMDAGetGhostCorners(*da, &gxs, &gys, &gzs, &gxm, &gym, &gzm); 3926dd63270SBarry Smith if (*ierr) return; 3936dd63270SBarry Smith *ierr = DMDAGetInfo(*da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL); 3946dd63270SBarry Smith if (*ierr) return; 3956dd63270SBarry Smith 3966dd63270SBarry Smith /* Handle case where user passes in global vector as opposed to local */ 3976dd63270SBarry Smith *ierr = VecGetLocalSize(*v, &N); 3986dd63270SBarry Smith if (*ierr) return; 3996dd63270SBarry Smith if (N == xm * ym * zm * dof) { 4006dd63270SBarry Smith gxm = xm; 4016dd63270SBarry Smith gym = ym; 4026dd63270SBarry Smith gzm = zm; 4036dd63270SBarry Smith gxs = xs; 4046dd63270SBarry Smith gys = ys; 4056dd63270SBarry Smith gzs = zs; 4066dd63270SBarry Smith } else if (N != gxm * gym * gzm * dof) { 4076dd63270SBarry Smith *ierr = PETSC_ERR_ARG_INCOMP; 4086dd63270SBarry Smith return; 4096dd63270SBarry Smith } 4106dd63270SBarry Smith *ierr = VecGetArrayRead(*v, &aa); 4116dd63270SBarry Smith if (*ierr) return; 4126dd63270SBarry Smith *ierr = F90Array4dCreate((void *)aa, MPIU_SCALAR, zero, dof, gxs, gxm, gys, gym, gzs, gzm, a PETSC_F90_2PTR_PARAM(ptrd)); 4136dd63270SBarry Smith if (*ierr) return; 4146dd63270SBarry Smith } 4156dd63270SBarry Smith 416*0da4d79bSMartin Diehl PETSC_EXTERN void dmdavecrestorearrayread4_(DM *da, Vec *v, F90Array4d *a, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptrd)) 4176dd63270SBarry Smith { 4186dd63270SBarry Smith const PetscScalar *fa; 4196dd63270SBarry Smith /* 4206dd63270SBarry Smith F90Array4dAccess is not implemented, so the following call would fail 4216dd63270SBarry Smith */ 4226dd63270SBarry Smith *ierr = F90Array4dAccess(a, MPIU_SCALAR, (void **)&fa PETSC_F90_2PTR_PARAM(ptrd)); 4236dd63270SBarry Smith *ierr = VecRestoreArrayRead(*v, &fa); 4246dd63270SBarry Smith if (*ierr) return; 4256dd63270SBarry Smith *ierr = F90Array4dDestroy(a, MPIU_SCALAR PETSC_F90_2PTR_PARAM(ptrd)); 4266dd63270SBarry Smith } 427