static char help[] = "Checks the functionality of DMGetInterpolation() on deformed grids.\n\n"; #include #include typedef struct _n_CCmplx CCmplx; struct _n_CCmplx { PetscReal real; PetscReal imag; }; CCmplx CCmplxPow(CCmplx a,PetscReal n) { CCmplx b; PetscReal r,theta; r = PetscSqrtReal(a.real*a.real + a.imag*a.imag); theta = PetscAtan2Real(a.imag,a.real); b.real = PetscPowReal(r,n) * PetscCosReal(n*theta); b.imag = PetscPowReal(r,n) * PetscSinReal(n*theta); return b; } CCmplx CCmplxExp(CCmplx a) { CCmplx b; b.real = PetscExpReal(a.real) * PetscCosReal(a.imag); b.imag = PetscExpReal(a.real) * PetscSinReal(a.imag); return b; } CCmplx CCmplxSqrt(CCmplx a) { CCmplx b; PetscReal r,theta; r = PetscSqrtReal(a.real*a.real + a.imag*a.imag); theta = PetscAtan2Real(a.imag,a.real); b.real = PetscSqrtReal(r) * PetscCosReal(0.5*theta); b.imag = PetscSqrtReal(r) * PetscSinReal(0.5*theta); return b; } CCmplx CCmplxAdd(CCmplx a,CCmplx c) { CCmplx b; b.real = a.real +c.real; b.imag = a.imag +c.imag; return b; } PetscScalar CCmplxRe(CCmplx a) { return (PetscScalar)a.real; } PetscScalar CCmplxIm(CCmplx a) { return (PetscScalar)a.imag; } PetscErrorCode DAApplyConformalMapping(DM da,PetscInt idx) { PetscErrorCode ierr; PetscInt i,n; PetscInt sx,nx,sy,ny,sz,nz,dim; Vec Gcoords; PetscScalar *XX; PetscScalar xx,yy,zz; DM cda; PetscFunctionBeginUser; if (idx==0) { PetscFunctionReturn(0); } else if (idx==1) { /* dam break */ ierr = DMDASetUniformCoordinates(da, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr); } else if (idx==2) { /* stagnation in a corner */ ierr = DMDASetUniformCoordinates(da, -1.0,1.0, 0.0,1.0, -1.0,1.0);CHKERRQ(ierr); } else if (idx==3) { /* nautilis */ ierr = DMDASetUniformCoordinates(da, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr); } else if (idx==4) { ierr = DMDASetUniformCoordinates(da, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr); } ierr = DMGetCoordinateDM(da,&cda);CHKERRQ(ierr); ierr = DMGetCoordinates(da,&Gcoords);CHKERRQ(ierr); ierr = VecGetArray(Gcoords,&XX);CHKERRQ(ierr); ierr = DMDAGetCorners(da,&sx,&sy,&sz,&nx,&ny,&nz);CHKERRQ(ierr); ierr = DMDAGetInfo(da, &dim, 0,0,0, 0,0,0, 0,0,0,0,0,0);CHKERRQ(ierr); ierr = VecGetLocalSize(Gcoords,&n);CHKERRQ(ierr); n = n / dim; for (i=0; i%D, interp err = %1.4e\n",mx,Mx,(double)(nrm/PetscSqrtReal((PetscReal)N)));CHKERRQ(ierr); ierr = VecDestroy(&afexact);CHKERRQ(ierr); } ierr = PetscOptionsGetBool(NULL,NULL,"-output",&output,NULL);CHKERRQ(ierr); if (output) { ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_1D.vtr", &vv);CHKERRQ(ierr); ierr = VecView(ac, vv);CHKERRQ(ierr); ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr); ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_1D.vtr", &vv);CHKERRQ(ierr); ierr = VecView(af, vv);CHKERRQ(ierr); ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr); } ierr = MatDestroy(&INTERP);CHKERRQ(ierr); ierr = DMDestroy(&dac);CHKERRQ(ierr); ierr = DMDestroy(&daf);CHKERRQ(ierr); ierr = VecDestroy(&ac);CHKERRQ(ierr); ierr = VecDestroy(&af);CHKERRQ(ierr); PetscFunctionReturn(0); } PetscErrorCode da_test_RefineCoords2D(PetscInt mx,PetscInt my) { PetscErrorCode ierr; DM dac,daf; PetscViewer vv; Vec ac,af; PetscInt map_id,Mx,My; Mat II,INTERP; Vec scale; PetscBool output = PETSC_FALSE; PetscFunctionBeginUser; ierr = DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX,mx+1,my+1,PETSC_DECIDE, PETSC_DECIDE,1, /* 1 dof */1, /* stencil = 1 */NULL, NULL,&dac);CHKERRQ(ierr); ierr = DMSetFromOptions(dac);CHKERRQ(ierr); ierr = DMSetUp(dac);CHKERRQ(ierr); ierr = DMRefine(dac,MPI_COMM_NULL,&daf);CHKERRQ(ierr); ierr = DMDAGetInfo(daf,0,&Mx,&My,0,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr); Mx--; My--; ierr = DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); ierr = DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); /* apply conformal mappings */ map_id = 0; ierr = PetscOptionsGetInt(NULL,NULL,"-cmap", &map_id,NULL);CHKERRQ(ierr); if (map_id >= 1) { ierr = DAApplyConformalMapping(dac,map_id);CHKERRQ(ierr); } { DM cdaf,cdac; Vec coordsc,coordsf; ierr = DMGetCoordinateDM(dac,&cdac);CHKERRQ(ierr); ierr = DMGetCoordinateDM(daf,&cdaf);CHKERRQ(ierr); ierr = DMGetCoordinates(dac,&coordsc);CHKERRQ(ierr); ierr = DMGetCoordinates(daf,&coordsf);CHKERRQ(ierr); ierr = DMCreateInterpolation(cdac,cdaf,&II,&scale);CHKERRQ(ierr); ierr = MatInterpolate(II,coordsc,coordsf);CHKERRQ(ierr); ierr = MatDestroy(&II);CHKERRQ(ierr); ierr = VecDestroy(&scale);CHKERRQ(ierr); } ierr = DMCreateInterpolation(dac,daf,&INTERP,NULL);CHKERRQ(ierr); ierr = DMCreateGlobalVector(dac,&ac);CHKERRQ(ierr); ierr = DADefineXLinearField2D(dac,ac);CHKERRQ(ierr); ierr = DMCreateGlobalVector(daf,&af);CHKERRQ(ierr); ierr = MatMult(INTERP,ac, af);CHKERRQ(ierr); { Vec afexact; PetscReal nrm; PetscInt N; ierr = DMCreateGlobalVector(daf,&afexact);CHKERRQ(ierr); ierr = VecZeroEntries(afexact);CHKERRQ(ierr); ierr = DADefineXLinearField2D(daf,afexact);CHKERRQ(ierr); ierr = VecAXPY(afexact,-1.0,af);CHKERRQ(ierr); /* af <= af - afinterp */ ierr = VecNorm(afexact,NORM_2,&nrm);CHKERRQ(ierr); ierr = VecGetSize(afexact,&N);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"[%D x %D]=>[%D x %D], interp err = %1.4e\n",mx,my,Mx,My,(double)(nrm/PetscSqrtReal((PetscReal)N)));CHKERRQ(ierr); ierr = VecDestroy(&afexact);CHKERRQ(ierr); } ierr = PetscOptionsGetBool(NULL,NULL,"-output",&output,NULL);CHKERRQ(ierr); if (output) { ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_2D.vtr", &vv);CHKERRQ(ierr); ierr = VecView(ac, vv);CHKERRQ(ierr); ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr); ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_2D.vtr", &vv);CHKERRQ(ierr); ierr = VecView(af, vv);CHKERRQ(ierr); ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr); } ierr = MatDestroy(&INTERP);CHKERRQ(ierr); ierr = DMDestroy(&dac);CHKERRQ(ierr); ierr = DMDestroy(&daf);CHKERRQ(ierr); ierr = VecDestroy(&ac);CHKERRQ(ierr); ierr = VecDestroy(&af);CHKERRQ(ierr); PetscFunctionReturn(0); } PetscErrorCode da_test_RefineCoords3D(PetscInt mx,PetscInt my,PetscInt mz) { PetscErrorCode ierr; DM dac,daf; PetscViewer vv; Vec ac,af; PetscInt map_id,Mx,My,Mz; Mat II,INTERP; Vec scale; PetscBool output = PETSC_FALSE; PetscFunctionBeginUser; ierr = DMDACreate3d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_BOX,mx+1, my+1,mz+1,PETSC_DECIDE, PETSC_DECIDE,PETSC_DECIDE,1, /* 1 dof */ 1, /* stencil = 1 */NULL,NULL,NULL,&dac);CHKERRQ(ierr); ierr = DMSetFromOptions(dac);CHKERRQ(ierr); ierr = DMSetUp(dac);CHKERRQ(ierr); ierr = DMRefine(dac,MPI_COMM_NULL,&daf);CHKERRQ(ierr); ierr = DMDAGetInfo(daf,0,&Mx,&My,&Mz,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr); Mx--; My--; Mz--; ierr = DMDASetUniformCoordinates(dac, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr); ierr = DMDASetUniformCoordinates(daf, -1.0,1.0, -1.0,1.0, -1.0,1.0);CHKERRQ(ierr); /* apply trilinear mappings */ /*ierr = DAApplyTrilinearMapping(dac);CHKERRQ(ierr);*/ /* apply conformal mappings */ map_id = 0; ierr = PetscOptionsGetInt(NULL,NULL,"-cmap", &map_id,NULL);CHKERRQ(ierr); if (map_id >= 1) { ierr = DAApplyConformalMapping(dac,map_id);CHKERRQ(ierr); } { DM cdaf,cdac; Vec coordsc,coordsf; ierr = DMGetCoordinateDM(dac,&cdac);CHKERRQ(ierr); ierr = DMGetCoordinateDM(daf,&cdaf);CHKERRQ(ierr); ierr = DMGetCoordinates(dac,&coordsc);CHKERRQ(ierr); ierr = DMGetCoordinates(daf,&coordsf);CHKERRQ(ierr); ierr = DMCreateInterpolation(cdac,cdaf,&II,&scale);CHKERRQ(ierr); ierr = MatInterpolate(II,coordsc,coordsf);CHKERRQ(ierr); ierr = MatDestroy(&II);CHKERRQ(ierr); ierr = VecDestroy(&scale);CHKERRQ(ierr); } ierr = DMCreateInterpolation(dac,daf,&INTERP,NULL);CHKERRQ(ierr); ierr = DMCreateGlobalVector(dac,&ac);CHKERRQ(ierr); ierr = VecZeroEntries(ac);CHKERRQ(ierr); ierr = DADefineXLinearField3D(dac,ac);CHKERRQ(ierr); ierr = DMCreateGlobalVector(daf,&af);CHKERRQ(ierr); ierr = VecZeroEntries(af);CHKERRQ(ierr); ierr = MatMult(INTERP,ac, af);CHKERRQ(ierr); { Vec afexact; PetscReal nrm; PetscInt N; ierr = DMCreateGlobalVector(daf,&afexact);CHKERRQ(ierr); ierr = VecZeroEntries(afexact);CHKERRQ(ierr); ierr = DADefineXLinearField3D(daf,afexact);CHKERRQ(ierr); ierr = VecAXPY(afexact,-1.0,af);CHKERRQ(ierr); /* af <= af - afinterp */ ierr = VecNorm(afexact,NORM_2,&nrm);CHKERRQ(ierr); ierr = VecGetSize(afexact,&N);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"[%D x %D x %D]=>[%D x %D x %D], interp err = %1.4e\n",mx,my,mz,Mx,My,Mz,(double)(nrm/PetscSqrtReal((PetscReal)N)));CHKERRQ(ierr); ierr = VecDestroy(&afexact);CHKERRQ(ierr); } ierr = PetscOptionsGetBool(NULL,NULL,"-output",&output,NULL);CHKERRQ(ierr); if (output) { ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "dac_3D.vtr", &vv);CHKERRQ(ierr); ierr = VecView(ac, vv);CHKERRQ(ierr); ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr); ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "daf_3D.vtr", &vv);CHKERRQ(ierr); ierr = VecView(af, vv);CHKERRQ(ierr); ierr = PetscViewerDestroy(&vv);CHKERRQ(ierr); } ierr = MatDestroy(&INTERP);CHKERRQ(ierr); ierr = DMDestroy(&dac);CHKERRQ(ierr); ierr = DMDestroy(&daf);CHKERRQ(ierr); ierr = VecDestroy(&ac);CHKERRQ(ierr); ierr = VecDestroy(&af);CHKERRQ(ierr); PetscFunctionReturn(0); } int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt mx = 2,my = 2,mz = 2,l,nl,dim; ierr = PetscInitialize(&argc,&argv,0,help);if (ierr) return ierr; ierr = PetscOptionsGetInt(NULL,NULL,"-mx", &mx, 0);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-my", &my, 0);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-mz", &mz, 0);CHKERRQ(ierr); nl = 1; ierr = PetscOptionsGetInt(NULL,NULL,"-nl", &nl, 0);CHKERRQ(ierr); dim = 2; ierr = PetscOptionsGetInt(NULL,NULL,"-dim", &dim, 0);CHKERRQ(ierr); for (l=0; l