xref: /petsc/src/dm/impls/da/dagetelem.c (revision 454e267fa71b7f5405b8566cd3ab1a4f9e8c6e0e)
1*454e267fSLisandro Dalcin #define PETSCDM_DLL
2*454e267fSLisandro Dalcin 
3*454e267fSLisandro Dalcin #include "private/daimpl.h"     /*I  "petscdm.h"   I*/
4*454e267fSLisandro Dalcin 
5*454e267fSLisandro Dalcin #undef __FUNCT__
6*454e267fSLisandro Dalcin #define __FUNCT__ "DMGetElements_DA_1D"
7*454e267fSLisandro Dalcin static PetscErrorCode DMGetElements_DA_1D(DM dm,PetscInt *nel,PetscInt *nen,const PetscInt *e[])
8*454e267fSLisandro Dalcin {
9*454e267fSLisandro Dalcin   PetscErrorCode ierr;
10*454e267fSLisandro Dalcin   DM_DA          *da = (DM_DA*)dm->data;
11*454e267fSLisandro Dalcin   PetscInt       i,xs,xe,Xs,Xe;
12*454e267fSLisandro Dalcin   PetscInt       cnt=0;
13*454e267fSLisandro Dalcin   PetscFunctionBegin;
14*454e267fSLisandro Dalcin   if (!da->e) {
15*454e267fSLisandro Dalcin     ierr = DMDAGetCorners(dm,&xs,0,0,&xe,0,0);CHKERRQ(ierr);
16*454e267fSLisandro Dalcin     ierr = DMDAGetGhostCorners(dm,&Xs,0,0,&Xe,0,0);CHKERRQ(ierr);
17*454e267fSLisandro Dalcin     xe += xs; Xe += Xs; if (xs != Xs) xs -= 1;
18*454e267fSLisandro Dalcin     da->ne = 1*(xe - xs - 1);
19*454e267fSLisandro Dalcin     ierr = PetscMalloc((1 + 2*da->ne)*sizeof(PetscInt),&da->e);CHKERRQ(ierr);
20*454e267fSLisandro Dalcin     for (i=xs; i<xe-1; i++) {
21*454e267fSLisandro Dalcin       da->e[cnt++] = (i-Xs  );
22*454e267fSLisandro Dalcin       da->e[cnt++] = (i-Xs+1);
23*454e267fSLisandro Dalcin     }
24*454e267fSLisandro Dalcin   }
25*454e267fSLisandro Dalcin   *nel = da->ne;
26*454e267fSLisandro Dalcin   *nen = 2;
27*454e267fSLisandro Dalcin   *e   = da->e;
28*454e267fSLisandro Dalcin   PetscFunctionReturn(0);
29*454e267fSLisandro Dalcin }
30*454e267fSLisandro Dalcin 
31*454e267fSLisandro Dalcin #undef __FUNCT__
32*454e267fSLisandro Dalcin #define __FUNCT__ "DMGetElements_DA_2D"
33*454e267fSLisandro Dalcin static PetscErrorCode DMGetElements_DA_2D(DM dm,PetscInt *nel,PetscInt *nen,const PetscInt *e[])
34*454e267fSLisandro Dalcin {
35*454e267fSLisandro Dalcin   PetscErrorCode ierr;
36*454e267fSLisandro Dalcin   DM_DA          *da = (DM_DA*)dm->data;
37*454e267fSLisandro Dalcin   PetscInt       i,xs,xe,Xs,Xe;
38*454e267fSLisandro Dalcin   PetscInt       j,ys,ye,Ys,Ye;
39*454e267fSLisandro Dalcin   PetscInt       cnt=0, cell[4], ns=2, nn=3;
40*454e267fSLisandro Dalcin   PetscInt       c, split[] = {0,1,3,
41*454e267fSLisandro Dalcin                                2,3,1};
42*454e267fSLisandro Dalcin   PetscFunctionBegin;
43*454e267fSLisandro Dalcin   if (!da->e) {
44*454e267fSLisandro Dalcin     if (da->elementtype == DMDA_ELEMENT_P1) {ns=2; nn=3;}
45*454e267fSLisandro Dalcin     if (da->elementtype == DMDA_ELEMENT_Q1) {ns=1; nn=4;}
46*454e267fSLisandro Dalcin     ierr = DMDAGetCorners(dm,&xs,&ys,0,&xe,&ye,0);CHKERRQ(ierr);
47*454e267fSLisandro Dalcin     ierr = DMDAGetGhostCorners(dm,&Xs,&Ys,0,&Xe,&Ye,0);CHKERRQ(ierr);
48*454e267fSLisandro Dalcin     xe += xs; Xe += Xs; if (xs != Xs) xs -= 1;
49*454e267fSLisandro Dalcin     ye += ys; Ye += Ys; if (ys != Ys) ys -= 1;
50*454e267fSLisandro Dalcin     da->ne = ns*(xe - xs - 1)*(ye - ys - 1);
51*454e267fSLisandro Dalcin     ierr = PetscMalloc((1 + nn*da->ne)*sizeof(PetscInt),&da->e);CHKERRQ(ierr);
52*454e267fSLisandro Dalcin     for (j=ys; j<ye-1; j++) {
53*454e267fSLisandro Dalcin       for (i=xs; i<xe-1; i++) {
54*454e267fSLisandro Dalcin         cell[0] = (i-Xs  ) + (j-Ys  )*(Xe-Xs);
55*454e267fSLisandro Dalcin         cell[1] = (i-Xs+1) + (j-Ys  )*(Xe-Xs);
56*454e267fSLisandro Dalcin         cell[2] = (i-Xs+1) + (j-Ys+1)*(Xe-Xs);
57*454e267fSLisandro Dalcin         cell[3] = (i-Xs  ) + (j-Ys+1)*(Xe-Xs);
58*454e267fSLisandro Dalcin         if (da->elementtype == DMDA_ELEMENT_P1) {
59*454e267fSLisandro Dalcin           for (c=0; c<ns*nn; c++)
60*454e267fSLisandro Dalcin             da->e[cnt++] = cell[split[c]];
61*454e267fSLisandro Dalcin         }
62*454e267fSLisandro Dalcin         if (da->elementtype == DMDA_ELEMENT_Q1) {
63*454e267fSLisandro Dalcin           for (c=0; c<ns*nn; c++)
64*454e267fSLisandro Dalcin             da->e[cnt++] = cell[c];
65*454e267fSLisandro Dalcin         }
66*454e267fSLisandro Dalcin       }
67*454e267fSLisandro Dalcin     }
68*454e267fSLisandro Dalcin   }
69*454e267fSLisandro Dalcin   *nel = da->ne;
70*454e267fSLisandro Dalcin   *nen = nn;
71*454e267fSLisandro Dalcin   *e   = da->e;
72*454e267fSLisandro Dalcin   PetscFunctionReturn(0);
73*454e267fSLisandro Dalcin }
74*454e267fSLisandro Dalcin 
75*454e267fSLisandro Dalcin #undef __FUNCT__
76*454e267fSLisandro Dalcin #define __FUNCT__ "DMGetElements_DA_3D"
77*454e267fSLisandro Dalcin static PetscErrorCode DMGetElements_DA_3D(DM dm,PetscInt *nel,PetscInt *nen,const PetscInt *e[])
78*454e267fSLisandro Dalcin {
79*454e267fSLisandro Dalcin   PetscErrorCode ierr;
80*454e267fSLisandro Dalcin   DM_DA          *da = (DM_DA*)dm->data;
81*454e267fSLisandro Dalcin   PetscInt       i,xs,xe,Xs,Xe;
82*454e267fSLisandro Dalcin   PetscInt       j,ys,ye,Ys,Ye;
83*454e267fSLisandro Dalcin   PetscInt       k,zs,ze,Zs,Ze;
84*454e267fSLisandro Dalcin   PetscInt       cnt=0, cell[8], ns=6, nn=4;
85*454e267fSLisandro Dalcin   PetscInt       c, split[] = {0,1,3,7,
86*454e267fSLisandro Dalcin                                0,1,7,4,
87*454e267fSLisandro Dalcin                                1,2,3,7,
88*454e267fSLisandro Dalcin                                1,2,7,6,
89*454e267fSLisandro Dalcin                                1,4,5,7,
90*454e267fSLisandro Dalcin                                1,5,6,7};
91*454e267fSLisandro Dalcin   PetscFunctionBegin;
92*454e267fSLisandro Dalcin   if (!da->e) {
93*454e267fSLisandro Dalcin     if (da->elementtype == DMDA_ELEMENT_P1) {ns=6; nn=4;}
94*454e267fSLisandro Dalcin     if (da->elementtype == DMDA_ELEMENT_Q1) {ns=1; nn=8;}
95*454e267fSLisandro Dalcin     ierr = DMDAGetCorners(dm,&xs,&ys,&zs,&xe,&ye,&ze);CHKERRQ(ierr);
96*454e267fSLisandro Dalcin     ierr = DMDAGetGhostCorners(dm,&Xs,&Ys,&Zs,&Xe,&Ye,&Ze);CHKERRQ(ierr);
97*454e267fSLisandro Dalcin     xe += xs; Xe += Xs; if (xs != Xs) xs -= 1;
98*454e267fSLisandro Dalcin     ye += ys; Ye += Ys; if (ys != Ys) ys -= 1;
99*454e267fSLisandro Dalcin     ze += zs; Ze += Zs; if (zs != Zs) zs -= 1;
100*454e267fSLisandro Dalcin     da->ne = ns*(xe - xs - 1)*(ye - ys - 1)*(ze - zs - 1);
101*454e267fSLisandro Dalcin     ierr = PetscMalloc((1 + nn*da->ne)*sizeof(PetscInt),&da->e);CHKERRQ(ierr);
102*454e267fSLisandro Dalcin     for (k=zs; k<ze-1; k++) {
103*454e267fSLisandro Dalcin       for (j=ys; j<ye-1; j++) {
104*454e267fSLisandro Dalcin         for (i=xs; i<xe-1; i++) {
105*454e267fSLisandro Dalcin           cell[0] = (i-Xs  ) + (j-Ys  )*(Xe-Xs) + (k-Zs  )*(Xe-Xs)*(Ye-Ys);
106*454e267fSLisandro Dalcin           cell[1] = (i-Xs+1) + (j-Ys  )*(Xe-Xs) + (k-Zs  )*(Xe-Xs)*(Ye-Ys);
107*454e267fSLisandro Dalcin           cell[2] = (i-Xs+1) + (j-Ys+1)*(Xe-Xs) + (k-Zs  )*(Xe-Xs)*(Ye-Ys);
108*454e267fSLisandro Dalcin           cell[3] = (i-Xs  ) + (j-Ys+1)*(Xe-Xs) + (k-Zs  )*(Xe-Xs)*(Ye-Ys);
109*454e267fSLisandro Dalcin           cell[4] = (i-Xs  ) + (j-Ys  )*(Xe-Xs) + (k-Zs+1)*(Xe-Xs)*(Ye-Ys);
110*454e267fSLisandro Dalcin           cell[5] = (i-Xs+1) + (j-Ys  )*(Xe-Xs) + (k-Zs+1)*(Xe-Xs)*(Ye-Ys);
111*454e267fSLisandro Dalcin           cell[6] = (i-Xs+1) + (j-Ys+1)*(Xe-Xs) + (k-Zs+1)*(Xe-Xs)*(Ye-Ys);
112*454e267fSLisandro Dalcin           cell[7] = (i-Xs  ) + (j-Ys+1)*(Xe-Xs) + (k-Zs+1)*(Xe-Xs)*(Ye-Ys);
113*454e267fSLisandro Dalcin           if (da->elementtype == DMDA_ELEMENT_P1) {
114*454e267fSLisandro Dalcin             for (c=0; c<ns*nn; c++)
115*454e267fSLisandro Dalcin               da->e[cnt++] = cell[split[c]];
116*454e267fSLisandro Dalcin           }
117*454e267fSLisandro Dalcin           if (da->elementtype == DMDA_ELEMENT_Q1) {
118*454e267fSLisandro Dalcin             for (c=0; c<ns*nn; c++)
119*454e267fSLisandro Dalcin               da->e[cnt++] = cell[c];
120*454e267fSLisandro Dalcin           }
121*454e267fSLisandro Dalcin         }
122*454e267fSLisandro Dalcin       }
123*454e267fSLisandro Dalcin     }
124*454e267fSLisandro Dalcin   }
125*454e267fSLisandro Dalcin   *nel = da->ne;
126*454e267fSLisandro Dalcin   *nen = nn;
127*454e267fSLisandro Dalcin   *e   = da->e;
128*454e267fSLisandro Dalcin   PetscFunctionReturn(0);
129*454e267fSLisandro Dalcin }
130*454e267fSLisandro Dalcin 
131*454e267fSLisandro Dalcin #undef __FUNCT__
132*454e267fSLisandro Dalcin #define __FUNCT__ "DMGetElements_DA"
133*454e267fSLisandro Dalcin PetscErrorCode PETSCDM_DLLEXPORT DMGetElements_DA(DM dm,PetscInt *nel,PetscInt *nen,const PetscInt *e[])
134*454e267fSLisandro Dalcin {
135*454e267fSLisandro Dalcin   DM_DA          *da = (DM_DA*)dm->data;
136*454e267fSLisandro Dalcin   PetscErrorCode ierr;
137*454e267fSLisandro Dalcin   PetscFunctionBegin;
138*454e267fSLisandro Dalcin   if (da->dim==-1) {
139*454e267fSLisandro Dalcin     *nel = 0; *nen = 0; *e = PETSC_NULL;
140*454e267fSLisandro Dalcin   } else if (da->dim==1) {
141*454e267fSLisandro Dalcin     ierr = DMGetElements_DA_1D(dm,nel,nen,e);CHKERRQ(ierr);
142*454e267fSLisandro Dalcin   } else if (da->dim==2) {
143*454e267fSLisandro Dalcin     ierr = DMGetElements_DA_2D(dm,nel,nen,e);CHKERRQ(ierr);
144*454e267fSLisandro Dalcin   } else if (da->dim==3) {
145*454e267fSLisandro Dalcin     ierr = DMGetElements_DA_3D(dm,nel,nen,e);CHKERRQ(ierr);
146*454e267fSLisandro Dalcin   } else {
147*454e267fSLisandro Dalcin     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"DMDA dimension not 1, 2, or 3, it is %D\n",da->dim);
148*454e267fSLisandro Dalcin   }
149*454e267fSLisandro Dalcin 
150*454e267fSLisandro Dalcin   PetscFunctionReturn(0);
151*454e267fSLisandro Dalcin }
152