File: | ksp/pc/impls/telescope/telescope_coarsedm.c |
Warning: | line 285, column 89 Array access (from variable 'sub_vecs') results in a null pointer dereference |
[?] Use j/k keys for keyboard navigation
1 | ||||
2 | #include <petsc/private/matimpl.h> | |||
3 | #include <petsc/private/pcimpl.h> | |||
4 | #include <petsc/private/dmimpl.h> | |||
5 | #include <petscksp.h> /*I "petscksp.h" I*/ | |||
6 | #include <petscdm.h> | |||
7 | #include <petscdmda.h> | |||
8 | #include <petscdmshell.h> | |||
9 | ||||
10 | #include "../src/ksp/pc/impls/telescope/telescope.h" | |||
11 | ||||
12 | static PetscBool cited = PETSC_FALSE; | |||
13 | static const char citation[] = | |||
14 | "@inproceedings{MaySananRuppKnepleySmith2016,\n" | |||
15 | " title = {Extreme-Scale Multigrid Components within PETSc},\n" | |||
16 | " author = {Dave A. May and Patrick Sanan and Karl Rupp and Matthew G. Knepley and Barry F. Smith},\n" | |||
17 | " booktitle = {Proceedings of the Platform for Advanced Scientific Computing Conference},\n" | |||
18 | " series = {PASC '16},\n" | |||
19 | " isbn = {978-1-4503-4126-4},\n" | |||
20 | " location = {Lausanne, Switzerland},\n" | |||
21 | " pages = {5:1--5:12},\n" | |||
22 | " articleno = {5},\n" | |||
23 | " numpages = {12},\n" | |||
24 | " url = {https://doi.acm.org/10.1145/2929908.2929913},\n" | |||
25 | " doi = {10.1145/2929908.2929913},\n" | |||
26 | " acmid = {2929913},\n" | |||
27 | " publisher = {ACM},\n" | |||
28 | " address = {New York, NY, USA},\n" | |||
29 | " keywords = {GPU, HPC, agglomeration, coarse-level solver, multigrid, parallel computing, preconditioning},\n" | |||
30 | " year = {2016}\n" | |||
31 | "}\n"; | |||
32 | ||||
33 | typedef struct { | |||
34 | DM dm_fine,dm_coarse; /* these DM's should be topologically identical but use different communicators */ | |||
35 | Mat permutation; | |||
36 | Vec xp; | |||
37 | PetscErrorCode (*fp_dm_field_scatter)(DM,Vec,ScatterMode,DM,Vec); | |||
38 | PetscErrorCode (*fp_dm_state_scatter)(DM,ScatterMode,DM); | |||
39 | void *dmksp_context_determined; | |||
40 | void *dmksp_context_user; | |||
41 | } PC_Telescope_CoarseDMCtx; | |||
42 | ||||
43 | ||||
44 | PetscErrorCode PCTelescopeSetUp_scatters_CoarseDM(PC pc,PC_Telescope sred,PC_Telescope_CoarseDMCtx *ctx) | |||
45 | { | |||
46 | PetscErrorCode ierr; | |||
47 | Vec xred,yred,xtmp,x,xp; | |||
48 | VecScatter scatter; | |||
49 | IS isin; | |||
50 | Mat B; | |||
51 | PetscInt m,bs,st,ed; | |||
52 | MPI_Comm comm; | |||
53 | ||||
54 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 54; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
55 | ierr = PetscObjectGetComm((PetscObject)pc,&comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),55,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
56 | ierr = PCGetOperators(pc,NULL((void*)0),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),56,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
57 | ierr = MatCreateVecs(B,&x,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),57,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
58 | ierr = MatGetBlockSize(B,&bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),58,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
59 | ierr = VecDuplicate(x,&xp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),59,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
60 | m = 0; | |||
61 | xred = NULL((void*)0); | |||
62 | yred = NULL((void*)0); | |||
63 | if (PCTelescope_isActiveRank(sred)) { | |||
64 | ierr = DMCreateGlobalVector(ctx->dm_coarse,&xred);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),64,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
65 | ierr = VecDuplicate(xred,&yred);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),65,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
66 | ierr = VecGetOwnershipRange(xred,&st,&ed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),66,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
67 | ierr = ISCreateStride(comm,ed-st,st,1,&isin);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),67,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
68 | ierr = VecGetLocalSize(xred,&m);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),68,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
69 | } else { | |||
70 | ierr = VecGetOwnershipRange(x,&st,&ed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),70,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
71 | ierr = ISCreateStride(comm,0,st,1,&isin);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),71,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
72 | } | |||
73 | ierr = ISSetBlockSize(isin,bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),73,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
74 | ierr = VecCreate(comm,&xtmp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),74,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
75 | ierr = VecSetSizes(xtmp,m,PETSC_DECIDE-1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),75,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
76 | ierr = VecSetBlockSize(xtmp,bs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),76,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
77 | ierr = VecSetType(xtmp,((PetscObject)x)->type_name);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),77,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
78 | ierr = VecScatterCreate(x,isin,xtmp,NULL((void*)0),&scatter);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),78,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
79 | sred->xred = xred; | |||
80 | sred->yred = yred; | |||
81 | sred->isin = isin; | |||
82 | sred->scatter = scatter; | |||
83 | sred->xtmp = xtmp; | |||
84 | ctx->xp = xp; | |||
85 | ierr = VecDestroy(&x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),85,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
86 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
87 | } | |||
88 | ||||
89 | PetscErrorCode PCTelescopeSetUp_CoarseDM(PC pc,PC_Telescope sred) | |||
90 | { | |||
91 | PC_Telescope_CoarseDMCtx *ctx; | |||
92 | DM dm,dm_coarse = NULL((void*)0); | |||
93 | MPI_Comm comm; | |||
94 | PetscBool has_perm,has_kspcomputeoperators,using_kspcomputeoperators; | |||
95 | PetscErrorCode ierr; | |||
96 | ||||
97 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 97; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
98 | ierr = PetscInfo(pc,"PCTelescope: setup (CoarseDM)\n")PetscInfo_Private(__func__,pc,"PCTelescope: setup (CoarseDM)\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),98,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
99 | ierr = PetscNew(&ctx)PetscMallocA(1,PETSC_TRUE,99,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,(size_t)(1)*sizeof(**((&ctx))),((&ctx)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),99,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
100 | sred->dm_ctx = (void*)ctx; | |||
101 | ||||
102 | ierr = PetscObjectGetComm((PetscObject)pc,&comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),102,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
103 | ierr = PCGetDM(pc,&dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),103,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
104 | ierr = DMGetCoarseDM(dm,&dm_coarse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),104,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
105 | ctx->dm_fine = dm; | |||
106 | ctx->dm_coarse = dm_coarse; | |||
107 | ||||
108 | /* attach coarse dm to ksp on sub communicator */ | |||
109 | if (PCTelescope_isActiveRank(sred)) { | |||
110 | ierr = KSPSetDM(sred->ksp,ctx->dm_coarse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),110,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
111 | if (sred->ignore_kspcomputeoperators) { | |||
112 | ierr = KSPSetDMActive(sred->ksp,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),112,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
113 | } | |||
114 | } | |||
115 | ||||
116 | /* check if there is a method to provide a permutation */ | |||
117 | has_perm = PETSC_FALSE; | |||
118 | has_kspcomputeoperators = PETSC_FALSE; | |||
119 | using_kspcomputeoperators = PETSC_FALSE; | |||
120 | ||||
121 | /* if no permutation is provided, we must rely on KSPSetComputeOperators */ | |||
122 | { | |||
123 | PetscErrorCode (*dmfine_kspfunc)(KSP,Mat,Mat,void*) = NULL((void*)0); | |||
124 | void *dmfine_kspctx = NULL((void*)0),*dmcoarse_kspctx = NULL((void*)0); | |||
125 | void *dmfine_appctx = NULL((void*)0),*dmcoarse_appctx = NULL((void*)0); | |||
126 | void *dmfine_shellctx = NULL((void*)0),*dmcoarse_shellctx = NULL((void*)0); | |||
127 | ||||
128 | ierr = DMKSPGetComputeOperators(dm,&dmfine_kspfunc,&dmfine_kspctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),128,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
129 | if (dmfine_kspfunc) { has_kspcomputeoperators = PETSC_TRUE; } | |||
130 | ||||
131 | ierr = DMGetApplicationContext(ctx->dm_fine,&dmfine_appctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),131,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
132 | ierr = DMShellGetContext(ctx->dm_fine,&dmfine_shellctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),132,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
133 | ||||
134 | /* need to define dmcoarse_kspctx */ | |||
135 | if (dmfine_kspfunc && !sred->ignore_kspcomputeoperators) { | |||
136 | ||||
137 | ierr = PetscInfo(pc,"PCTelescope: KSPSetComputeOperators fetched from parent DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: KSPSetComputeOperators fetched from parent DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),137,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
138 | if (PCTelescope_isActiveRank(sred)) { | |||
139 | ierr = DMGetApplicationContext(ctx->dm_coarse,&dmcoarse_appctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),139,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
140 | ierr = DMShellGetContext(ctx->dm_coarse,&dmcoarse_shellctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),140,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
141 | } | |||
142 | ||||
143 | /* Assume that if the fine operator didn't require any context, neither will the coarse */ | |||
144 | if (!dmfine_kspctx) { | |||
145 | dmcoarse_kspctx = NULL((void*)0); | |||
146 | ierr = PetscInfo(pc,"PCTelescope: KSPSetComputeOperators using NULL context\n")PetscInfo_Private(__func__,pc,"PCTelescope: KSPSetComputeOperators using NULL context\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),146,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
147 | } else { | |||
148 | ||||
149 | ierr = PetscInfo(pc,"PCTelescope: KSPSetComputeOperators detected non-NULL context from parent DM \n")PetscInfo_Private(__func__,pc,"PCTelescope: KSPSetComputeOperators detected non-NULL context from parent DM \n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),149,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
150 | if (PCTelescope_isActiveRank(sred)) { | |||
151 | ||||
152 | if (dmfine_kspctx == dmfine_appctx) { | |||
153 | dmcoarse_kspctx = dmcoarse_appctx; | |||
154 | ierr = PetscInfo(pc,"PCTelescope: KSPSetComputeOperators using context from DM->ApplicationContext\n")PetscInfo_Private(__func__,pc,"PCTelescope: KSPSetComputeOperators using context from DM->ApplicationContext\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),154,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
155 | if (!dmcoarse_kspctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Non NULL dmfine->kspctx == dmfine->appctx. NULL dmcoarse->appctx found. Likely this is an error")return PetscError(((MPI_Comm)0x44000001),155,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,83,PETSC_ERROR_INITIAL,"Non NULL dmfine->kspctx == dmfine->appctx. NULL dmcoarse->appctx found. Likely this is an error" ); | |||
156 | } else if (dmfine_kspctx == dmfine_shellctx) { | |||
157 | dmcoarse_kspctx = dmcoarse_shellctx; | |||
158 | ierr = PetscInfo(pc,"PCTelescope: KSPSetComputeOperators using context from DMShell->Context\n")PetscInfo_Private(__func__,pc,"PCTelescope: KSPSetComputeOperators using context from DMShell->Context\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),158,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
159 | if (!dmcoarse_kspctx) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Non NULL dmfine->kspctx == dmfine.shell->ctx. NULL dmcoarse.shell->ctx found. Likely this is an error")return PetscError(((MPI_Comm)0x44000001),159,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,83,PETSC_ERROR_INITIAL,"Non NULL dmfine->kspctx == dmfine.shell->ctx. NULL dmcoarse.shell->ctx found. Likely this is an error" ); | |||
160 | } | |||
161 | ctx->dmksp_context_determined = dmcoarse_kspctx; | |||
162 | ||||
163 | /* look for user provided method to fetch the context */ | |||
164 | { | |||
165 | PetscErrorCode (*fp_get_coarsedm_context)(DM,void**) = NULL((void*)0); | |||
166 | void *dmcoarse_context_user = NULL((void*)0); | |||
167 | char dmcoarse_method[PETSC_MAX_PATH_LEN4096]; | |||
168 | ||||
169 | ierr = PetscSNPrintf(dmcoarse_method,sizeof(dmcoarse_method),"PCTelescopeGetCoarseDMKSPContext");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),169,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
170 | ierr = PetscObjectQueryFunction((PetscObject)ctx->dm_coarse,dmcoarse_method,&fp_get_coarsedm_context)PetscObjectQueryFunction_Private(((PetscObject)ctx->dm_coarse ),(dmcoarse_method),(PetscVoidFunction*)(&fp_get_coarsedm_context ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),170,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
171 | if (fp_get_coarsedm_context) { | |||
172 | ierr = PetscInfo(pc,"PCTelescope: Found composed method PCTelescopeGetCoarseDMKSPContext from coarse DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: Found composed method PCTelescopeGetCoarseDMKSPContext from coarse DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),172,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
173 | ierr = fp_get_coarsedm_context(ctx->dm_coarse,&dmcoarse_context_user);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),173,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
174 | ctx->dmksp_context_user = dmcoarse_context_user; | |||
175 | dmcoarse_kspctx = dmcoarse_context_user; | |||
176 | } else { | |||
177 | ierr = PetscInfo(pc,"PCTelescope: Failed to find composed method PCTelescopeGetCoarseDMKSPContext from coarse DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: Failed to find composed method PCTelescopeGetCoarseDMKSPContext from coarse DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),177,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
178 | } | |||
179 | } | |||
180 | ||||
181 | if (!dmcoarse_kspctx) { | |||
182 | ierr = PetscInfo(pc,"PCTelescope: KSPSetComputeOperators failed to determine the context to use on sub-communicator\n")PetscInfo_Private(__func__,pc,"PCTelescope: KSPSetComputeOperators failed to determine the context to use on sub-communicator\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),182,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
183 | SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Cannot determine which context with use for KSPSetComputeOperators() on sub-communicator")return PetscError(((MPI_Comm)0x44000001),183,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,83,PETSC_ERROR_INITIAL,"Cannot determine which context with use for KSPSetComputeOperators() on sub-communicator" ); | |||
184 | } | |||
185 | } | |||
186 | } | |||
187 | } | |||
188 | ||||
189 | if (dmfine_kspfunc && !sred->ignore_kspcomputeoperators) { | |||
190 | using_kspcomputeoperators = PETSC_TRUE; | |||
191 | ||||
192 | if (PCTelescope_isActiveRank(sred)) { | |||
193 | /* sub ksp inherits dmksp_func and context provided by user */ | |||
194 | ierr = KSPSetComputeOperators(sred->ksp,dmfine_kspfunc,dmcoarse_kspctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),194,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
195 | /*ierr = PetscObjectCopyFortranFunctionPointers((PetscObject)dm,(PetscObject)ctx->dmrepart);CHKERRQ(ierr);*/ | |||
196 | ierr = KSPSetDMActive(sred->ksp,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),196,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
197 | } | |||
198 | } | |||
199 | } | |||
200 | ||||
201 | if (!has_perm && has_kspcomputeoperators && !using_kspcomputeoperators) SETERRQ(comm,PETSC_ERR_SUP,"No method to permute an operator was found on the parent DM. A method for KSPSetComputeOperators() was provided but it was requested to be ignored. Telescope setup cannot proceed")return PetscError(comm,201,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,56,PETSC_ERROR_INITIAL,"No method to permute an operator was found on the parent DM. A method for KSPSetComputeOperators() was provided but it was requested to be ignored. Telescope setup cannot proceed" ); | |||
202 | if (!has_perm && !has_kspcomputeoperators) SETERRQ(comm,PETSC_ERR_SUP,"No method to permute an operator was found on the parent DM. No method for KSPSetComputeOperators() was provided. Telescope setup cannot proceed")return PetscError(comm,202,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,56,PETSC_ERROR_INITIAL,"No method to permute an operator was found on the parent DM. No method for KSPSetComputeOperators() was provided. Telescope setup cannot proceed" ); | |||
203 | ||||
204 | { | |||
205 | char dmfine_method[PETSC_MAX_PATH_LEN4096]; | |||
206 | ||||
207 | ierr = PetscSNPrintf(dmfine_method,sizeof(dmfine_method),"PCTelescopeFieldScatter");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),207,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
208 | ierr = PetscObjectQueryFunction((PetscObject)ctx->dm_fine,dmfine_method,&ctx->fp_dm_field_scatter)PetscObjectQueryFunction_Private(((PetscObject)ctx->dm_fine ),(dmfine_method),(PetscVoidFunction*)(&ctx->fp_dm_field_scatter ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),208,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
209 | ||||
210 | ierr = PetscSNPrintf(dmfine_method,sizeof(dmfine_method),"PCTelescopeStateScatter");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),210,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
211 | ierr = PetscObjectQueryFunction((PetscObject)ctx->dm_fine,dmfine_method,&ctx->fp_dm_state_scatter)PetscObjectQueryFunction_Private(((PetscObject)ctx->dm_fine ),(dmfine_method),(PetscVoidFunction*)(&ctx->fp_dm_state_scatter ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),211,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
212 | } | |||
213 | ||||
214 | if (ctx->fp_dm_state_scatter) { | |||
215 | ierr = PetscInfo(pc,"PCTelescope: Found composed method PCTelescopeStateScatter from parent DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: Found composed method PCTelescopeStateScatter from parent DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),215,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
216 | } else { | |||
217 | ierr = PetscInfo(pc,"PCTelescope: Failed to find composed method PCTelescopeStateScatter from parent DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: Failed to find composed method PCTelescopeStateScatter from parent DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),217,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
218 | } | |||
219 | ||||
220 | if (ctx->fp_dm_field_scatter) { | |||
221 | ierr = PetscInfo(pc,"PCTelescope: Found composed method PCTelescopeFieldScatter from parent DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: Found composed method PCTelescopeFieldScatter from parent DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),221,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
222 | } else { | |||
223 | ierr = PetscInfo(pc,"PCTelescope: Failed to find composed method PCTelescopeFieldScatter from parent DM\n")PetscInfo_Private(__func__,pc,"PCTelescope: Failed to find composed method PCTelescopeFieldScatter from parent DM\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),223,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
224 | SETERRQ(comm,PETSC_ERR_SUP,"No method to scatter fields between the parent DM and coarse DM was found. Must call PetscObjectComposeFunction() with the parent DM. Telescope setup cannot proceed")return PetscError(comm,224,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,56,PETSC_ERROR_INITIAL,"No method to scatter fields between the parent DM and coarse DM was found. Must call PetscObjectComposeFunction() with the parent DM. Telescope setup cannot proceed" ); | |||
225 | } | |||
226 | ||||
227 | /*ierr = PCTelescopeSetUp_permutation_CoarseDM(pc,sred,ctx);CHKERRQ(ierr);*/ | |||
228 | ierr = PCTelescopeSetUp_scatters_CoarseDM(pc,sred,ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),228,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
229 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
230 | } | |||
231 | ||||
232 | PetscErrorCode PCApply_Telescope_CoarseDM(PC pc,Vec x,Vec y) | |||
233 | { | |||
234 | PC_Telescope sred = (PC_Telescope)pc->data; | |||
235 | PetscErrorCode ierr; | |||
236 | Vec xred,yred; | |||
237 | PC_Telescope_CoarseDMCtx *ctx; | |||
238 | ||||
239 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 239; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
240 | ctx = (PC_Telescope_CoarseDMCtx*)sred->dm_ctx; | |||
241 | xred = sred->xred; | |||
242 | yred = sred->yred; | |||
243 | ||||
244 | ierr = PetscCitationsRegister(citation,&cited);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),244,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
245 | ||||
246 | if (ctx->fp_dm_state_scatter) { | |||
247 | ierr = ctx->fp_dm_state_scatter(ctx->dm_fine,SCATTER_FORWARD,ctx->dm_coarse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),247,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
248 | } | |||
249 | ||||
250 | ierr = ctx->fp_dm_field_scatter(ctx->dm_fine,x,SCATTER_FORWARD,ctx->dm_coarse,xred);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),250,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
251 | ||||
252 | /* solve */ | |||
253 | if (PCTelescope_isActiveRank(sred)) { | |||
254 | ierr = KSPSolve(sred->ksp,xred,yred);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),254,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
255 | } | |||
256 | ||||
257 | ierr = ctx->fp_dm_field_scatter(ctx->dm_fine,y,SCATTER_REVERSE,ctx->dm_coarse,yred);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),257,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
258 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
259 | } | |||
260 | ||||
261 | PetscErrorCode PCTelescopeSubNullSpaceCreate_CoarseDM(PC pc,PC_Telescope sred,MatNullSpace nullspace,MatNullSpace *sub_nullspace) | |||
262 | { | |||
263 | PetscErrorCode ierr; | |||
264 | PetscBool has_const; | |||
265 | PetscInt k,n = 0; | |||
266 | const Vec *vecs; | |||
267 | Vec *sub_vecs = NULL((void*)0); | |||
268 | MPI_Comm subcomm; | |||
269 | PC_Telescope_CoarseDMCtx *ctx; | |||
270 | ||||
271 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 271; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
272 | ctx = (PC_Telescope_CoarseDMCtx*)sred->dm_ctx; | |||
273 | subcomm = sred->subcomm; | |||
274 | ierr = MatNullSpaceGetVecs(nullspace,&has_const,&n,&vecs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),274,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
275 | ||||
276 | if (PCTelescope_isActiveRank(sred)) { | |||
277 | /* create new vectors */ | |||
278 | if (n) { | |||
279 | ierr = VecDuplicateVecs(sred->xred,n,&sub_vecs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),279,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
280 | } | |||
281 | } | |||
282 | ||||
283 | /* copy entries */ | |||
284 | for (k=0; k<n; k++) { | |||
285 | ierr = ctx->fp_dm_field_scatter(ctx->dm_fine,vecs[k],SCATTER_FORWARD,ctx->dm_coarse,sub_vecs[k]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),285,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
| ||||
286 | } | |||
287 | ||||
288 | if (PCTelescope_isActiveRank(sred)) { | |||
289 | /* create new (near) nullspace for redundant object */ | |||
290 | ierr = MatNullSpaceCreate(subcomm,has_const,n,sub_vecs,sub_nullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),290,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
291 | ierr = VecDestroyVecs(n,&sub_vecs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),291,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
292 | } | |||
293 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
294 | } | |||
295 | ||||
296 | PetscErrorCode PCTelescopeMatNullSpaceCreate_CoarseDM(PC pc,PC_Telescope sred,Mat sub_mat) | |||
297 | { | |||
298 | PetscErrorCode ierr; | |||
299 | Mat B; | |||
300 | PC_Telescope_CoarseDMCtx *ctx; | |||
301 | ||||
302 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 302; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
303 | ctx = (PC_Telescope_CoarseDMCtx*)sred->dm_ctx; | |||
304 | ierr = PCGetOperators(pc,NULL((void*)0),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),304,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
305 | { | |||
306 | MatNullSpace nullspace,sub_nullspace; | |||
307 | ierr = MatGetNullSpace(B,&nullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),307,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
308 | if (nullspace) { | |||
| ||||
309 | ierr = PetscInfo(pc,"PCTelescope: generating nullspace (CoarseDM)\n")PetscInfo_Private(__func__,pc,"PCTelescope: generating nullspace (CoarseDM)\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),309,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
310 | ierr = PCTelescopeSubNullSpaceCreate_CoarseDM(pc,sred,nullspace,&sub_nullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),310,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
311 | ||||
312 | /* attach any user nullspace removal methods and contexts */ | |||
313 | if (PCTelescope_isActiveRank(sred)) { | |||
314 | void *context = NULL((void*)0); | |||
315 | if (nullspace->remove && !nullspace->rmctx){ | |||
316 | ierr = MatNullSpaceSetFunction(sub_nullspace,nullspace->remove,context);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),316,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
317 | } else if (nullspace->remove && nullspace->rmctx) { | |||
318 | char dmcoarse_method[PETSC_MAX_PATH_LEN4096]; | |||
319 | PetscErrorCode (*fp_get_coarsedm_context)(DM,void**) = NULL((void*)0); | |||
320 | ||||
321 | ierr = PetscSNPrintf(dmcoarse_method,sizeof(dmcoarse_method),"PCTelescopeGetCoarseDMNullSpaceUserContext");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),321,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
322 | ierr = PetscObjectQueryFunction((PetscObject)ctx->dm_coarse,dmcoarse_method,&fp_get_coarsedm_context)PetscObjectQueryFunction_Private(((PetscObject)ctx->dm_coarse ),(dmcoarse_method),(PetscVoidFunction*)(&fp_get_coarsedm_context ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),322,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
323 | if (!context) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Propagation of user null-space removal method with non-NULL context requires the coarse DM be composed with a function named \"%s\"",dmcoarse_method)return PetscError(((MPI_Comm)0x44000001),323,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,56,PETSC_ERROR_INITIAL,"Propagation of user null-space removal method with non-NULL context requires the coarse DM be composed with a function named \"%s\"" ,dmcoarse_method); | |||
324 | ierr = MatNullSpaceSetFunction(sub_nullspace,nullspace->remove,context);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),324,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
325 | } | |||
326 | } | |||
327 | ||||
328 | if (PCTelescope_isActiveRank(sred)) { | |||
329 | ierr = MatSetNullSpace(sub_mat,sub_nullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),329,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
330 | ierr = MatNullSpaceDestroy(&sub_nullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),330,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
331 | } | |||
332 | } | |||
333 | } | |||
334 | { | |||
335 | MatNullSpace nearnullspace,sub_nearnullspace; | |||
336 | ierr = MatGetNearNullSpace(B,&nearnullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),336,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
337 | if (nearnullspace) { | |||
338 | ierr = PetscInfo(pc,"PCTelescope: generating near nullspace (CoarseDM)\n")PetscInfo_Private(__func__,pc,"PCTelescope: generating near nullspace (CoarseDM)\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),338,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
339 | ierr = PCTelescopeSubNullSpaceCreate_CoarseDM(pc,sred,nearnullspace,&sub_nearnullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),339,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
340 | ||||
341 | /* attach any user nullspace removal methods and contexts */ | |||
342 | if (PCTelescope_isActiveRank(sred)) { | |||
343 | void *context = NULL((void*)0); | |||
344 | if (nearnullspace->remove && !nearnullspace->rmctx){ | |||
345 | ierr = MatNullSpaceSetFunction(sub_nearnullspace,nearnullspace->remove,context);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),345,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
346 | } else if (nearnullspace->remove && nearnullspace->rmctx) { | |||
347 | char dmcoarse_method[PETSC_MAX_PATH_LEN4096]; | |||
348 | PetscErrorCode (*fp_get_coarsedm_context)(DM,void**) = NULL((void*)0); | |||
349 | ||||
350 | ierr = PetscSNPrintf(dmcoarse_method,sizeof(dmcoarse_method),"PCTelescopeGetCoarseDMNearNullSpaceUserContext");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),350,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
351 | ierr = PetscObjectQueryFunction((PetscObject)ctx->dm_coarse,dmcoarse_method,&fp_get_coarsedm_context)PetscObjectQueryFunction_Private(((PetscObject)ctx->dm_coarse ),(dmcoarse_method),(PetscVoidFunction*)(&fp_get_coarsedm_context ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),351,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
352 | if (!context) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Propagation of user near null-space removal method with non-NULL context requires the coarse DM be composed with a function named \"%s\"",dmcoarse_method)return PetscError(((MPI_Comm)0x44000001),352,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,56,PETSC_ERROR_INITIAL,"Propagation of user near null-space removal method with non-NULL context requires the coarse DM be composed with a function named \"%s\"" ,dmcoarse_method); | |||
353 | ierr = MatNullSpaceSetFunction(sub_nearnullspace,nearnullspace->remove,context);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),353,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
354 | } | |||
355 | } | |||
356 | ||||
357 | if (PCTelescope_isActiveRank(sred)) { | |||
358 | ierr = MatSetNearNullSpace(sub_mat,sub_nearnullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),358,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
359 | ierr = MatNullSpaceDestroy(&sub_nearnullspace);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),359,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
360 | } | |||
361 | } | |||
362 | } | |||
363 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
364 | } | |||
365 | ||||
366 | PetscErrorCode PCReset_Telescope_CoarseDM(PC pc) | |||
367 | { | |||
368 | PetscErrorCode ierr; | |||
369 | PC_Telescope sred = (PC_Telescope)pc->data; | |||
370 | PC_Telescope_CoarseDMCtx *ctx; | |||
371 | ||||
372 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 372; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
373 | ctx = (PC_Telescope_CoarseDMCtx*)sred->dm_ctx; | |||
374 | ctx->dm_fine = NULL((void*)0); /* since I did not increment the ref counter we set these to NULL */ | |||
375 | ctx->dm_coarse = NULL((void*)0); /* since I did not increment the ref counter we set these to NULL */ | |||
376 | ctx->permutation = NULL((void*)0); /* this will be fetched from the dm so no need to call destroy */ | |||
377 | ierr = VecDestroy(&ctx->xp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),377,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
378 | ctx->fp_dm_field_scatter = NULL((void*)0); | |||
379 | ctx->fp_dm_state_scatter = NULL((void*)0); | |||
380 | ctx->dmksp_context_determined = NULL((void*)0); | |||
381 | ctx->dmksp_context_user = NULL((void*)0); | |||
382 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
383 | } | |||
384 | ||||
385 | PetscErrorCode PCApplyRichardson_Telescope_CoarseDM(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt its,PetscBool zeroguess,PetscInt *outits,PCRichardsonConvergedReason *reason) | |||
386 | { | |||
387 | PC_Telescope sred = (PC_Telescope)pc->data; | |||
388 | PetscErrorCode ierr; | |||
389 | Vec yred = NULL((void*)0); | |||
390 | PetscBool default_init_guess_value = PETSC_FALSE; | |||
391 | PC_Telescope_CoarseDMCtx *ctx; | |||
392 | ||||
393 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ; petscstack->line[petscstack->currentsize] = 393; petscstack ->petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
394 | ctx = (PC_Telescope_CoarseDMCtx*)sred->dm_ctx; | |||
395 | yred = sred->yred; | |||
396 | ||||
397 | if (its > 1) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"PCApplyRichardson_Telescope_CoarseDM only supports max_it = 1")return PetscError(PetscObjectComm((PetscObject)pc),397,__func__ ,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,56,PETSC_ERROR_INITIAL,"PCApplyRichardson_Telescope_CoarseDM only supports max_it = 1" ); | |||
398 | *reason = (PCRichardsonConvergedReason)0; | |||
399 | ||||
400 | if (!zeroguess) { | |||
401 | ierr = PetscInfo(pc,"PCTelescopeCoarseDM: Scattering y for non-zero-initial guess\n")PetscInfo_Private(__func__,pc,"PCTelescopeCoarseDM: Scattering y for non-zero-initial guess\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),401,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
402 | ||||
403 | ierr = ctx->fp_dm_field_scatter(ctx->dm_fine,y,SCATTER_FORWARD,ctx->dm_coarse,yred);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),403,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
404 | } | |||
405 | ||||
406 | if (PCTelescope_isActiveRank(sred)) { | |||
407 | ierr = KSPGetInitialGuessNonzero(sred->ksp,&default_init_guess_value);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),407,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
408 | if (!zeroguess) ierr = KSPSetInitialGuessNonzero(sred->ksp,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),408,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
409 | } | |||
410 | ||||
411 | ierr = PCApply_Telescope_CoarseDM(pc,x,y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),411,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
412 | ||||
413 | if (PCTelescope_isActiveRank(sred)) { | |||
414 | ierr = KSPSetInitialGuessNonzero(sred->ksp,default_init_guess_value);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),414,__func__,"/sandbox/petsc/petsc.next-tmp/src/ksp/pc/impls/telescope/telescope_coarsedm.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
415 | } | |||
416 | ||||
417 | if (!*reason) *reason = PCRICHARDSON_CONVERGED_ITS; | |||
418 | *outits = 1; | |||
419 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
420 | } |