1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests DMCreateInterpolation() for nonuniform DMDA coordinates.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscdm.h> 5c4762a1bSJed Brown #include <petscdmda.h> 6c4762a1bSJed Brown 7c4762a1bSJed Brown PetscErrorCode SetCoordinates1d(DM da) 8c4762a1bSJed Brown { 9c4762a1bSJed Brown PetscInt i,start,m; 10c4762a1bSJed Brown Vec local,global; 11c4762a1bSJed Brown PetscScalar *coors,*coorslocal; 12c4762a1bSJed Brown DM cda; 13c4762a1bSJed Brown 14c4762a1bSJed Brown PetscFunctionBeginUser; 15*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0)); 16*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(da,&cda)); 17*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(da,&global)); 18*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinatesLocal(da,&local)); 19*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecGetArray(cda,global,&coors)); 20*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecGetArrayRead(cda,local,&coorslocal)); 21*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAGetCorners(cda,&start,0,0,&m,0,0)); 22c4762a1bSJed Brown for (i=start; i<start+m; i++) { 23c4762a1bSJed Brown if (i % 2) { 24c4762a1bSJed Brown coors[i] = coorslocal[i-1] + .1*(coorslocal[i+1] - coorslocal[i-1]); 25c4762a1bSJed Brown } 26c4762a1bSJed Brown } 27*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecRestoreArray(cda,global,&coors)); 28*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecRestoreArrayRead(cda,local,&coorslocal)); 29*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalBegin(cda,global,INSERT_VALUES,local)); 30*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalEnd(cda,global,INSERT_VALUES,local)); 31c4762a1bSJed Brown PetscFunctionReturn(0); 32c4762a1bSJed Brown } 33c4762a1bSJed Brown 34c4762a1bSJed Brown PetscErrorCode SetCoordinates2d(DM da) 35c4762a1bSJed Brown { 36c4762a1bSJed Brown PetscInt i,j,mstart,m,nstart,n; 37c4762a1bSJed Brown Vec local,global; 38c4762a1bSJed Brown DMDACoor2d **coors,**coorslocal; 39c4762a1bSJed Brown DM cda; 40c4762a1bSJed Brown 41c4762a1bSJed Brown PetscFunctionBeginUser; 42*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0)); 43*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(da,&cda)); 44*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(da,&global)); 45*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinatesLocal(da,&local)); 46*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecGetArray(cda,global,&coors)); 47*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecGetArrayRead(cda,local,&coorslocal)); 48*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAGetCorners(cda,&mstart,&nstart,0,&m,&n,0)); 49c4762a1bSJed Brown for (i=mstart; i<mstart+m; i++) { 50c4762a1bSJed Brown for (j=nstart; j<nstart+n; j++) { 51c4762a1bSJed Brown if (i % 2) { 52c4762a1bSJed Brown coors[j][i].x = coorslocal[j][i-1].x + .1*(coorslocal[j][i+1].x - coorslocal[j][i-1].x); 53c4762a1bSJed Brown } 54c4762a1bSJed Brown if (j % 2) { 55c4762a1bSJed Brown coors[j][i].y = coorslocal[j-1][i].y + .3*(coorslocal[j+1][i].y - coorslocal[j-1][i].y); 56c4762a1bSJed Brown } 57c4762a1bSJed Brown } 58c4762a1bSJed Brown } 59*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecRestoreArray(cda,global,&coors)); 60*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecRestoreArrayRead(cda,local,&coorslocal)); 61c4762a1bSJed Brown 62*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalBegin(cda,global,INSERT_VALUES,local)); 63*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalEnd(cda,global,INSERT_VALUES,local)); 64c4762a1bSJed Brown PetscFunctionReturn(0); 65c4762a1bSJed Brown } 66c4762a1bSJed Brown 67c4762a1bSJed Brown PetscErrorCode SetCoordinates3d(DM da) 68c4762a1bSJed Brown { 69c4762a1bSJed Brown PetscInt i,j,mstart,m,nstart,n,pstart,p,k; 70c4762a1bSJed Brown Vec local,global; 71c4762a1bSJed Brown DMDACoor3d ***coors,***coorslocal; 72c4762a1bSJed Brown DM cda; 73c4762a1bSJed Brown 74c4762a1bSJed Brown PetscFunctionBeginUser; 75*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0)); 76*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinateDM(da,&cda)); 77*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinates(da,&global)); 78*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetCoordinatesLocal(da,&local)); 79*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecGetArray(cda,global,&coors)); 80*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecGetArrayRead(cda,local,&coorslocal)); 81*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAGetCorners(cda,&mstart,&nstart,&pstart,&m,&n,&p)); 82c4762a1bSJed Brown for (i=mstart; i<mstart+m; i++) { 83c4762a1bSJed Brown for (j=nstart; j<nstart+n; j++) { 84c4762a1bSJed Brown for (k=pstart; k<pstart+p; k++) { 85c4762a1bSJed Brown if (i % 2) { 86c4762a1bSJed Brown coors[k][j][i].x = coorslocal[k][j][i-1].x + .1*(coorslocal[k][j][i+1].x - coorslocal[k][j][i-1].x); 87c4762a1bSJed Brown } 88c4762a1bSJed Brown if (j % 2) { 89c4762a1bSJed Brown coors[k][j][i].y = coorslocal[k][j-1][i].y + .3*(coorslocal[k][j+1][i].y - coorslocal[k][j-1][i].y); 90c4762a1bSJed Brown } 91c4762a1bSJed Brown if (k % 2) { 92c4762a1bSJed Brown coors[k][j][i].z = coorslocal[k-1][j][i].z + .4*(coorslocal[k+1][j][i].z - coorslocal[k-1][j][i].z); 93c4762a1bSJed Brown } 94c4762a1bSJed Brown } 95c4762a1bSJed Brown } 96c4762a1bSJed Brown } 97*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecRestoreArray(cda,global,&coors)); 98*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAVecRestoreArrayRead(cda,local,&coorslocal)); 99*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalBegin(cda,global,INSERT_VALUES,local)); 100*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalEnd(cda,global,INSERT_VALUES,local)); 101c4762a1bSJed Brown PetscFunctionReturn(0); 102c4762a1bSJed Brown } 103c4762a1bSJed Brown 104c4762a1bSJed Brown int main(int argc,char **argv) 105c4762a1bSJed Brown { 106c4762a1bSJed Brown PetscInt M = 5,N = 4,P = 3, m = PETSC_DECIDE,n = PETSC_DECIDE,p = PETSC_DECIDE,dim = 1; 107c4762a1bSJed Brown PetscErrorCode ierr; 108c4762a1bSJed Brown DM dac,daf; 109c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE,by=DM_BOUNDARY_NONE,bz=DM_BOUNDARY_NONE; 110c4762a1bSJed Brown DMDAStencilType stype = DMDA_STENCIL_BOX; 111c4762a1bSJed Brown Mat A; 112c4762a1bSJed Brown 113c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 114*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL)); 115*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL)); 116*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-P",&P,NULL)); 117*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); 118*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); 119*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-p",&p,NULL)); 120*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-dim",&dim,NULL)); 121c4762a1bSJed Brown 122c4762a1bSJed Brown /* Create distributed array and get vectors */ 123c4762a1bSJed Brown if (dim == 1) { 124*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDACreate1d(PETSC_COMM_WORLD,bx,M,1,1,NULL,&dac)); 125c4762a1bSJed Brown } else if (dim == 2) { 126*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDACreate2d(PETSC_COMM_WORLD,bx,by,stype,M,N,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&dac)); 127c4762a1bSJed Brown } else if (dim == 3) { 128*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stype,M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,NULL,&dac)); 129c4762a1bSJed Brown } else SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"dim must be 1,2, or 3"); 130*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(dac)); 131*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetUp(dac)); 132c4762a1bSJed Brown 133*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMRefine(dac,PETSC_COMM_WORLD,&daf)); 134c4762a1bSJed Brown 135*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDASetUniformCoordinates(dac,0.0,1.0,0.0,1.0,0.0,1.0)); 136c4762a1bSJed Brown if (dim == 1) { 137*5f80ce2aSJacob Faibussowitsch CHKERRQ(SetCoordinates1d(daf)); 138c4762a1bSJed Brown } else if (dim == 2) { 139*5f80ce2aSJacob Faibussowitsch CHKERRQ(SetCoordinates2d(daf)); 140c4762a1bSJed Brown } else if (dim == 3) { 141*5f80ce2aSJacob Faibussowitsch CHKERRQ(SetCoordinates3d(daf)); 142c4762a1bSJed Brown } 143*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateInterpolation(dac,daf,&A,0)); 144c4762a1bSJed Brown 145c4762a1bSJed Brown /* Free memory */ 146*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&dac)); 147*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&daf)); 148*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 149c4762a1bSJed Brown ierr = PetscFinalize(); 150c4762a1bSJed Brown return ierr; 151c4762a1bSJed Brown } 152c4762a1bSJed Brown 153c4762a1bSJed Brown /*TEST 154c4762a1bSJed Brown 155c4762a1bSJed Brown test: 156c4762a1bSJed Brown nsize: 3 157c4762a1bSJed Brown args: -mat_view 158c4762a1bSJed Brown 159c4762a1bSJed Brown test: 160c4762a1bSJed Brown suffix: 2 161c4762a1bSJed Brown nsize: 3 162c4762a1bSJed Brown args: -mat_view -dim 2 163c4762a1bSJed Brown 164c4762a1bSJed Brown test: 165c4762a1bSJed Brown suffix: 3 166c4762a1bSJed Brown nsize: 3 167c4762a1bSJed Brown args: -mat_view -dim 3 168c4762a1bSJed Brown 169c4762a1bSJed Brown TEST*/ 170