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
dmdagetelements_(DM * dm,PetscInt * nel,PetscInt * nen,F90Array1d * e,int * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdarestoreelements_(DM * dm,PetscInt * nel,PetscInt * nen,F90Array1d * e,int * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarray1_(DM * da,Vec * v,F90Array1d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearray1_(DM * da,Vec * v,F90Array1d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarray2_(DM * da,Vec * v,F90Array2d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearray2_(DM * da,Vec * v,F90Array2d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarray3_(DM * da,Vec * v,F90Array3d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearray3_(DM * da,Vec * v,F90Array3d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarray4_(DM * da,Vec * v,F90Array4d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearray4_(DM * da,Vec * v,F90Array4d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarrayread1_(DM * da,Vec * v,F90Array1d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearrayread1_(DM * da,Vec * v,F90Array1d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarrayread2_(DM * da,Vec * v,F90Array2d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearrayread2_(DM * da,Vec * v,F90Array2d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarrayread3_(DM * da,Vec * v,F90Array3d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearrayread3_(DM * da,Vec * v,F90Array3d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecgetarrayread4_(DM * da,Vec * v,F90Array4d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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
dmdavecrestorearrayread4_(DM * da,Vec * v,F90Array4d * a,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptrd))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