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