File: | snes/utils/convest.c |
Warning: | line 351, column 12 2nd function call argument is an uninitialized value |
[?] Use j/k keys for keyboard navigation
1 | #include <petscconvest.h> /*I "petscconvest.h" I*/ | |||
2 | #include <petscdmplex.h> | |||
3 | #include <petscds.h> | |||
4 | ||||
5 | #include <petsc/private/petscconvestimpl.h> | |||
6 | ||||
7 | static PetscErrorCode zero_private(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) | |||
8 | { | |||
9 | PetscInt c; | |||
10 | for (c = 0; c < Nc; ++c) u[c] = 0.0; | |||
11 | return 0; | |||
12 | } | |||
13 | ||||
14 | ||||
15 | /*@ | |||
16 | PetscConvEstCreate - Create a PetscConvEst object | |||
17 | ||||
18 | Collective | |||
19 | ||||
20 | Input Parameter: | |||
21 | . comm - The communicator for the PetscConvEst object | |||
22 | ||||
23 | Output Parameter: | |||
24 | . ce - The PetscConvEst object | |||
25 | ||||
26 | Level: beginner | |||
27 | ||||
28 | .seealso: PetscConvEstDestroy(), PetscConvEstGetConvRate() | |||
29 | @*/ | |||
30 | PetscErrorCode PetscConvEstCreate(MPI_Comm comm, PetscConvEst *ce) | |||
31 | { | |||
32 | PetscErrorCode ierr; | |||
33 | ||||
34 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 34; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
35 | PetscValidPointer(ce, 2)do { if (!ce) return PetscError(((MPI_Comm)0x44000001),35,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",85,PETSC_ERROR_INITIAL ,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(ce ,PETSC_CHAR)) return PetscError(((MPI_Comm)0x44000001),35,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",68,PETSC_ERROR_INITIAL ,"Invalid Pointer: Parameter # %d",2); } while (0); | |||
36 | ierr = PetscSysInitializePackage();CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),36,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
37 | ierr = PetscHeaderCreate(*ce, PETSC_OBJECT_CLASSID, "PetscConvEst", "ConvergenceEstimator", "SNES", comm, PetscConvEstDestroy, PetscConvEstView)(PetscMallocA(1,PETSC_TRUE,37,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,(size_t)(1)*sizeof(**((&(*ce)))),((&(*ce)))) || PetscHeaderCreate_Private ((PetscObject)*ce,PETSC_OBJECT_CLASSID,"PetscConvEst","ConvergenceEstimator" ,"SNES",comm,(PetscObjectDestroyFunction)PetscConvEstDestroy, (PetscObjectViewFunction)PetscConvEstView) || ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(*ce)) : 0) || PetscLogObjectMemory ((PetscObject)*ce,sizeof(*(*ce))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),37,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
38 | (*ce)->monitor = PETSC_FALSE; | |||
39 | (*ce)->Nr = 4; | |||
40 | 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); | |||
41 | } | |||
42 | ||||
43 | /*@ | |||
44 | PetscConvEstDestroy - Destroys a PetscConvEst object | |||
45 | ||||
46 | Collective on PetscConvEst | |||
47 | ||||
48 | Input Parameter: | |||
49 | . ce - The PetscConvEst object | |||
50 | ||||
51 | Level: beginner | |||
52 | ||||
53 | .seealso: PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
54 | @*/ | |||
55 | PetscErrorCode PetscConvEstDestroy(PetscConvEst *ce) | |||
56 | { | |||
57 | PetscErrorCode ierr; | |||
58 | ||||
59 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 59; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
60 | if (!*ce) 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); | |||
61 | PetscValidHeaderSpecific((*ce),PETSC_OBJECT_CLASSID,1)do { if (!(*ce)) return PetscError(((MPI_Comm)0x44000001),61, __func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",1); if ( !PetscCheckPointer((*ce),PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),61,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)((*ce)))->classid != PETSC_OBJECT_CLASSID ) { if (((PetscObject)((*ce)))->classid == -1) return PetscError (((MPI_Comm)0x44000001),61,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),61,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
62 | if (--((PetscObject)(*ce))->refct > 0) { | |||
63 | *ce = NULL((void*)0); | |||
64 | 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); | |||
65 | } | |||
66 | ierr = PetscFree3((*ce)->initGuess, (*ce)->exactSol, (*ce)->ctxs)PetscFreeA(3,66,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,&((*ce)->initGuess),&((*ce)->exactSol),&(( *ce)->ctxs));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),66,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
67 | ierr = PetscFree((*ce)->errors)((*PetscTrFree)((void*)((*ce)->errors),67,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ) || (((*ce)->errors) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),67,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
68 | ierr = PetscHeaderDestroy(ce)(PetscHeaderDestroy_Private((PetscObject)(*ce)) || ((*PetscTrFree )((void*)(*ce),68,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ) || ((*ce) = 0,0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),68,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
69 | 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); | |||
70 | } | |||
71 | ||||
72 | /*@ | |||
73 | PetscConvEstSetFromOptions - Sets a PetscConvEst object from options | |||
74 | ||||
75 | Collective on PetscConvEst | |||
76 | ||||
77 | Input Parameters: | |||
78 | . ce - The PetscConvEst object | |||
79 | ||||
80 | Level: beginner | |||
81 | ||||
82 | .seealso: PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
83 | @*/ | |||
84 | PetscErrorCode PetscConvEstSetFromOptions(PetscConvEst ce) | |||
85 | { | |||
86 | PetscErrorCode ierr; | |||
87 | ||||
88 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 88; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
89 | ierr = PetscOptionsBegin(PetscObjectComm((PetscObject) ce), "", "Convergence Estimator Options", "PetscConvEst")0; do { PetscOptionItems PetscOptionsObjectBase; PetscOptionItems *PetscOptionsObject = &PetscOptionsObjectBase; PetscMemzero (PetscOptionsObject,sizeof(PetscOptionItems)); for (PetscOptionsObject ->count=(PetscOptionsPublish?-1:1); PetscOptionsObject-> count<2; PetscOptionsObject->count++) { PetscErrorCode _5_ierr = PetscOptionsBegin_Private(PetscOptionsObject,PetscObjectComm ((PetscObject) ce),"","Convergence Estimator Options","PetscConvEst" );do {if (__builtin_expect(!!(_5_ierr),0)) return PetscError( ((MPI_Comm)0x44000001),89,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,_5_ierr,PETSC_ERROR_REPEAT," ");} while (0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),89,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
90 | ierr = PetscOptionsInt("-convest_num_refine", "The number of refinements for the convergence check", "PetscConvEst", ce->Nr, &ce->Nr, NULL)PetscOptionsInt_Private(PetscOptionsObject,"-convest_num_refine" ,"The number of refinements for the convergence check","PetscConvEst" ,ce->Nr,&ce->Nr,((void*)0),(-2147483647 - 1),2147483647 );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),90,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
91 | ierr = PetscOptionsBool("-convest_monitor", "Monitor the error for each convergence check", "PetscConvEst", ce->monitor, &ce->monitor, NULL)PetscOptionsBool_Private(PetscOptionsObject,"-convest_monitor" ,"Monitor the error for each convergence check","PetscConvEst" ,ce->monitor,&ce->monitor,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),91,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
92 | ierr = PetscOptionsEnd()_5_ierr = PetscOptionsEnd_Private(PetscOptionsObject);do {if ( __builtin_expect(!!(_5_ierr),0)) return PetscError(((MPI_Comm )0x44000001),92,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,_5_ierr,PETSC_ERROR_REPEAT," ");} while (0);}} while (0); | |||
93 | 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); | |||
94 | } | |||
95 | ||||
96 | /*@ | |||
97 | PetscConvEstView - Views a PetscConvEst object | |||
98 | ||||
99 | Collective on PetscConvEst | |||
100 | ||||
101 | Input Parameters: | |||
102 | + ce - The PetscConvEst object | |||
103 | - viewer - The PetscViewer object | |||
104 | ||||
105 | Level: beginner | |||
106 | ||||
107 | .seealso: PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
108 | @*/ | |||
109 | PetscErrorCode PetscConvEstView(PetscConvEst ce, PetscViewer viewer) | |||
110 | { | |||
111 | PetscErrorCode ierr; | |||
112 | ||||
113 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 113; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
114 | ierr = PetscObjectPrintClassNamePrefixType((PetscObject) ce, viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),114,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
115 | ierr = PetscViewerASCIIPrintf(viewer, "ConvEst with %D levels\n", ce->Nr+1);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),115,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
116 | 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); | |||
117 | } | |||
118 | ||||
119 | /*@ | |||
120 | PetscConvEstGetSolver - Gets the solver used to produce discrete solutions | |||
121 | ||||
122 | Not collective | |||
123 | ||||
124 | Input Parameter: | |||
125 | . ce - The PetscConvEst object | |||
126 | ||||
127 | Output Parameter: | |||
128 | . snes - The solver | |||
129 | ||||
130 | Level: intermediate | |||
131 | ||||
132 | .seealso: PetscConvEstSetSolver(), PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
133 | @*/ | |||
134 | PetscErrorCode PetscConvEstGetSolver(PetscConvEst ce, SNES *snes) | |||
135 | { | |||
136 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 136; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
137 | PetscValidHeaderSpecific(ce, PETSC_OBJECT_CLASSID, 1)do { if (!ce) return PetscError(((MPI_Comm)0x44000001),137,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(ce, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),137,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",64,PETSC_ERROR_INITIAL ,"Invalid Pointer to Object: Parameter # %d",1); if (((PetscObject )(ce))->classid != PETSC_OBJECT_CLASSID) { if (((PetscObject )(ce))->classid == -1) return PetscError(((MPI_Comm)0x44000001 ),137,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),137,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
138 | PetscValidPointer(snes, 2)do { if (!snes) return PetscError(((MPI_Comm)0x44000001),138, __func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(snes,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),138,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",2); } while (0); | |||
139 | *snes = ce->snes; | |||
140 | 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); | |||
141 | } | |||
142 | ||||
143 | /*@ | |||
144 | PetscConvEstSetSolver - Sets the solver used to produce discrete solutions | |||
145 | ||||
146 | Not collective | |||
147 | ||||
148 | Input Parameters: | |||
149 | + ce - The PetscConvEst object | |||
150 | - snes - The solver | |||
151 | ||||
152 | Level: intermediate | |||
153 | ||||
154 | Note: The solver MUST have an attached DM/DS, so that we know the exact solution | |||
155 | ||||
156 | .seealso: PetscConvEstGetSolver(), PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
157 | @*/ | |||
158 | PetscErrorCode PetscConvEstSetSolver(PetscConvEst ce, SNES snes) | |||
159 | { | |||
160 | PetscErrorCode ierr; | |||
161 | ||||
162 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 162; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
163 | PetscValidHeaderSpecific(ce, PETSC_OBJECT_CLASSID, 1)do { if (!ce) return PetscError(((MPI_Comm)0x44000001),163,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(ce, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),163,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",64,PETSC_ERROR_INITIAL ,"Invalid Pointer to Object: Parameter # %d",1); if (((PetscObject )(ce))->classid != PETSC_OBJECT_CLASSID) { if (((PetscObject )(ce))->classid == -1) return PetscError(((MPI_Comm)0x44000001 ),163,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),163,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
164 | PetscValidHeaderSpecific(snes, SNES_CLASSID, 2)do { if (!snes) return PetscError(((MPI_Comm)0x44000001),164, __func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,85,PETSC_ERROR_INITIAL,"Null Object: Parameter # %d",2); if ( !PetscCheckPointer(snes,PETSC_OBJECT)) return PetscError(((MPI_Comm )0x44000001),164,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,2); if (((PetscObject)(snes))->classid != SNES_CLASSID) { if (((PetscObject)(snes))->classid == -1) return PetscError (((MPI_Comm)0x44000001),164,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,2); else return PetscError(((MPI_Comm)0x44000001),164,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",2); } } while (0); | |||
165 | ce->snes = snes; | |||
166 | ierr = SNESGetDM(ce->snes, &ce->idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),166,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
167 | 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); | |||
168 | } | |||
169 | ||||
170 | /*@ | |||
171 | PetscConvEstSetUp - After the solver is specified, we create structures for estimating convergence | |||
172 | ||||
173 | Collective on PetscConvEst | |||
174 | ||||
175 | Input Parameters: | |||
176 | . ce - The PetscConvEst object | |||
177 | ||||
178 | Level: beginner | |||
179 | ||||
180 | .seealso: PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
181 | @*/ | |||
182 | PetscErrorCode PetscConvEstSetUp(PetscConvEst ce) | |||
183 | { | |||
184 | PetscDS prob; | |||
185 | PetscInt f; | |||
186 | PetscErrorCode ierr; | |||
187 | ||||
188 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 188; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
189 | ierr = DMGetDS(ce->idm, &prob);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),189,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
190 | ierr = PetscDSGetNumFields(prob, &ce->Nf);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),190,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
191 | ierr = PetscMalloc1((ce->Nr+1)*ce->Nf, &ce->errors)PetscMallocA(1,PETSC_FALSE,191,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,(size_t)((ce->Nr+1)*ce->Nf)*sizeof(**(&ce->errors )),(&ce->errors));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),191,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
192 | ierr = PetscMalloc3(ce->Nf, &ce->initGuess, ce->Nf, &ce->exactSol, ce->Nf, &ce->ctxs)PetscMallocA(3,PETSC_FALSE,192,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,(size_t)(ce->Nf)*sizeof(**(&ce->initGuess)),(& ce->initGuess),(size_t)(ce->Nf)*sizeof(**(&ce->exactSol )),(&ce->exactSol),(size_t)(ce->Nf)*sizeof(**(& ce->ctxs)),(&ce->ctxs));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),192,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
193 | for (f = 0; f < ce->Nf; ++f) ce->initGuess[f] = zero_private; | |||
194 | for (f = 0; f < ce->Nf; ++f) { | |||
195 | ierr = PetscDSGetExactSolution(prob, f, &ce->exactSol[f], &ce->ctxs[f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),195,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
196 | if (!ce->exactSol[f]) SETERRQ1(PetscObjectComm((PetscObject) ce), PETSC_ERR_ARG_WRONG, "DS must contain exact solution functions in order to estimate convergence, missing for field %D", f)return PetscError(PetscObjectComm((PetscObject) ce),196,__func__ ,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c",62,PETSC_ERROR_INITIAL ,"DS must contain exact solution functions in order to estimate convergence, missing for field %D" ,f); | |||
197 | } | |||
198 | 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); | |||
199 | } | |||
200 | ||||
201 | /*@ | |||
202 | PetscConvEstGetConvRate - Returns an estimate of the convergence rate for the discretization | |||
203 | ||||
204 | Not collective | |||
205 | ||||
206 | Input Parameter: | |||
207 | . ce - The PetscConvEst object | |||
208 | ||||
209 | Output Parameter: | |||
210 | . alpha - The convergence rate for each field | |||
211 | ||||
212 | Note: The convergence rate alpha is defined by | |||
213 | $ || u_h - u_exact || < C h^alpha | |||
214 | where u_h is the discrete solution, and h is a measure of the discretization size. | |||
215 | ||||
216 | We solve a series of problems on refined meshes, calculate an error based upon the exact solution in the DS, | |||
217 | and then fit the result to our model above using linear regression. | |||
218 | ||||
219 | Options database keys: | |||
220 | . -snes_convergence_estimate : Execute convergence estimation and print out the rate | |||
221 | ||||
222 | Level: intermediate | |||
223 | ||||
224 | .seealso: PetscConvEstSetSolver(), PetscConvEstCreate(), PetscConvEstGetConvRate() | |||
225 | @*/ | |||
226 | PetscErrorCode PetscConvEstGetConvRate(PetscConvEst ce, PetscReal alpha[]) | |||
227 | { | |||
228 | DM *dm; | |||
229 | PetscObject disc; | |||
230 | MPI_Comm comm; | |||
231 | const char *uname, *dmname; | |||
232 | void *ctx; | |||
233 | Vec u; | |||
234 | PetscReal t = 0.0, *x, *y, slope, intercept; | |||
235 | PetscInt *dof, dim, Nr = ce->Nr, r, f, oldlevel, oldnlev; | |||
| ||||
236 | PetscLogEvent event; | |||
237 | PetscErrorCode ierr; | |||
238 | ||||
239 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.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 | ierr = PetscObjectGetComm((PetscObject) ce, &comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),240,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
241 | ierr = DMGetDimension(ce->idm, &dim);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),241,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
242 | ierr = DMGetApplicationContext(ce->idm, &ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),242,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
243 | ierr = DMPlexSetRefinementUniform(ce->idm, PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),243,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
244 | ierr = DMGetRefineLevel(ce->idm, &oldlevel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),244,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
245 | ierr = PetscMalloc2((Nr+1), &dm, (Nr+1)*ce->Nf, &dof)PetscMallocA(2,PETSC_FALSE,245,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,(size_t)((Nr+1))*sizeof(**(&dm)),(&dm),(size_t)((Nr+ 1)*ce->Nf)*sizeof(**(&dof)),(&dof));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),245,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
246 | dm[0] = ce->idm; | |||
247 | for (f = 0; f < ce->Nf; ++f) alpha[f] = 0.0; | |||
248 | /* Loop over meshes */ | |||
249 | ierr = PetscLogEventRegister("ConvEst Error", PETSC_OBJECT_CLASSID, &event);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),249,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
250 | for (r = 0; r <= Nr; ++r) { | |||
251 | PetscLogStage stage; | |||
252 | char stageName[PETSC_MAX_PATH_LEN4096]; | |||
253 | ||||
254 | ierr = PetscSNPrintf(stageName, PETSC_MAX_PATH_LEN4096-1, "ConvEst Refinement Level %D", r);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),254,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
255 | ierr = PetscLogStageRegister(stageName, &stage);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),255,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
256 | ierr = PetscLogStagePush(stage);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),256,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
257 | if (r > 0) { | |||
258 | ierr = DMRefine(dm[r-1], MPI_COMM_NULL((MPI_Comm)0x04000000), &dm[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),258,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
259 | ierr = DMSetCoarseDM(dm[r], dm[r-1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),259,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
260 | ierr = DMCopyDisc(ce->idm, dm[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),260,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
261 | ierr = DMCopyTransform(ce->idm, dm[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),261,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
262 | ierr = PetscObjectGetName((PetscObject) dm[r-1], &dmname);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),262,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
263 | ierr = PetscObjectSetName((PetscObject) dm[r], dmname);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),263,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
264 | for (f = 0; f <= ce->Nf; ++f) { | |||
265 | PetscErrorCode (*nspconstr)(DM, PetscInt, MatNullSpace *); | |||
266 | ierr = DMGetNullSpaceConstructor(dm[r-1], f, &nspconstr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),266,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
267 | ierr = DMSetNullSpaceConstructor(dm[r], f, nspconstr);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),267,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
268 | } | |||
269 | } | |||
270 | ierr = DMViewFromOptions(dm[r], NULL((void*)0), "-conv_dm_view");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),270,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
271 | /* Create solution */ | |||
272 | ierr = DMCreateGlobalVector(dm[r], &u);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),272,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
273 | ierr = DMGetField(dm[r], 0, NULL((void*)0), &disc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),273,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
274 | ierr = PetscObjectGetName(disc, &uname);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),274,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
275 | ierr = PetscObjectSetName((PetscObject) u, uname);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),275,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
276 | /* Setup solver */ | |||
277 | ierr = SNESReset(ce->snes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),277,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
278 | ierr = SNESSetDM(ce->snes, dm[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),278,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
279 | ierr = DMPlexSetSNESLocalFEM(dm[r], ctx, ctx, ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),279,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
280 | ierr = SNESSetFromOptions(ce->snes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),280,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
281 | /* Create initial guess */ | |||
282 | ierr = DMProjectFunction(dm[r], t, ce->initGuess, ce->ctxs, INSERT_VALUES, u);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),282,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
283 | ierr = SNESSolve(ce->snes, NULL((void*)0), u);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),283,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
284 | ierr = PetscLogEventBegin(event, ce, 0, 0, 0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [event].active) ? (*PetscLogPLB)((event),0,(PetscObject)(ce), (PetscObject)(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),284,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
285 | ierr = DMComputeL2FieldDiff(dm[r], t, ce->exactSol, ce->ctxs, u, &ce->errors[r*ce->Nf]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),285,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
286 | ierr = PetscLogEventEnd(event, ce, 0, 0, 0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [event].active) ? (*PetscLogPLE)((event),0,(PetscObject)(ce), (PetscObject)(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),286,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
287 | for (f = 0; f < ce->Nf; ++f) { | |||
288 | PetscSection s, fs; | |||
289 | PetscInt lsize; | |||
290 | ||||
291 | /* Could use DMGetOutputDM() to add in Dirichlet dofs */ | |||
292 | ierr = DMGetLocalSection(dm[r], &s);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),292,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
293 | ierr = PetscSectionGetField(s, f, &fs);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),293,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
294 | ierr = PetscSectionGetConstrainedStorageSize(fs, &lsize);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),294,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
295 | ierr = MPI_Allreduce(&lsize, &dof[r*ce->Nf+f], 1, MPIU_INT, MPI_SUM, PetscObjectComm((PetscObject) ce->snes))((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject) ce->snes))),0) || MPI_Allreduce((&lsize ),(&dof[r*ce->Nf+f]),(1),(((MPI_Datatype)0x4c000405)), ((MPI_Op)(0x58000003)),(PetscObjectComm((PetscObject) ce-> snes))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),295,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
296 | ierr = PetscLogEventSetDof(event, f, dof[r*ce->Nf+f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),296,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
297 | ierr = PetscLogEventSetError(event, f, ce->errors[r*ce->Nf+f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),297,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
298 | } | |||
299 | /* Monitor */ | |||
300 | if (ce->monitor) { | |||
301 | PetscReal *errors = &ce->errors[r*ce->Nf]; | |||
302 | ||||
303 | ierr = PetscPrintf(comm, "L_2 Error: ");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),303,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
304 | if (ce->Nf > 1) {ierr = PetscPrintf(comm, "[");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),304,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
305 | for (f = 0; f < ce->Nf; ++f) { | |||
306 | if (f > 0) {ierr = PetscPrintf(comm, ", ");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),306,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
307 | if (errors[f] < 1.0e-11) {ierr = PetscPrintf(comm, "< 1e-11");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),307,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
308 | else {ierr = PetscPrintf(comm, "%g", (double)errors[f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),308,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
309 | } | |||
310 | if (ce->Nf > 1) {ierr = PetscPrintf(comm, "]");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),310,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
311 | ierr = PetscPrintf(comm, "\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),311,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
312 | } | |||
313 | if (!r) { | |||
314 | /* PCReset() does not wipe out the level structure */ | |||
315 | KSP ksp; | |||
316 | PC pc; | |||
317 | ||||
318 | ierr = SNESGetKSP(ce->snes, &ksp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),318,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
319 | ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),319,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
320 | ierr = PCMGGetLevels(pc, &oldnlev);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),320,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
321 | } | |||
322 | /* Cleanup */ | |||
323 | ierr = VecDestroy(&u);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),323,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
324 | ierr = PetscLogStagePop();CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),324,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
325 | } | |||
326 | for (r = 1; r <= Nr; ++r) { | |||
327 | ierr = DMDestroy(&dm[r]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),327,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
328 | } | |||
329 | /* Fit convergence rate */ | |||
330 | ierr = PetscMalloc2(Nr+1, &x, Nr+1, &y)PetscMallocA(2,PETSC_FALSE,330,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,(size_t)(Nr+1)*sizeof(**(&x)),(&x),(size_t)(Nr+1)*sizeof (**(&y)),(&y));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),330,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
331 | for (f = 0; f < ce->Nf; ++f) { | |||
332 | for (r = 0; r <= Nr; ++r) { | |||
333 | x[r] = PetscLog10Real(dof[r*ce->Nf+f])log10(dof[r*ce->Nf+f]); | |||
334 | y[r] = PetscLog10Real(ce->errors[r*ce->Nf+f])log10(ce->errors[r*ce->Nf+f]); | |||
335 | } | |||
336 | ierr = PetscLinearRegression(Nr+1, x, y, &slope, &intercept);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),336,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
337 | /* Since h^{-dim} = N, lg err = s lg N + b = -s dim lg h + b */ | |||
338 | alpha[f] = -slope * dim; | |||
339 | } | |||
340 | ierr = PetscFree2(x, y)PetscFreeA(2,340,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,&(x),&(y));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),340,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
341 | ierr = PetscFree2(dm, dof)PetscFreeA(2,341,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,&(dm),&(dof));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),341,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
342 | /* Restore solver */ | |||
343 | ierr = SNESReset(ce->snes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),343,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
344 | { | |||
345 | /* PCReset() does not wipe out the level structure */ | |||
346 | KSP ksp; | |||
347 | PC pc; | |||
348 | ||||
349 | ierr = SNESGetKSP(ce->snes, &ksp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),349,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
350 | ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),350,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
351 | ierr = PCMGSetLevels(pc, oldnlev, NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),351,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
| ||||
352 | ierr = DMSetRefineLevel(ce->idm, oldlevel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),352,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* The damn DMCoarsen() calls in PCMG can reset this */ | |||
353 | } | |||
354 | ierr = SNESSetDM(ce->snes, ce->idm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),354,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
355 | ierr = DMPlexSetSNESLocalFEM(ce->idm, ctx, ctx, ctx);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),355,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
356 | ierr = SNESSetFromOptions(ce->snes);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),356,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
357 | 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); | |||
358 | } | |||
359 | ||||
360 | /*@ | |||
361 | PetscConvEstRateView - Displays the convergence rate to a viewer | |||
362 | ||||
363 | Collective on SNES | |||
364 | ||||
365 | Parameter: | |||
366 | + snes - iterative context obtained from SNESCreate() | |||
367 | . alpha - the convergence rate for each field | |||
368 | - viewer - the viewer to display the reason | |||
369 | ||||
370 | Options Database Keys: | |||
371 | . -snes_convergence_estimate - print the convergence rate | |||
372 | ||||
373 | Level: developer | |||
374 | ||||
375 | .seealso: PetscConvEstGetRate() | |||
376 | @*/ | |||
377 | PetscErrorCode PetscConvEstRateView(PetscConvEst ce, const PetscReal alpha[], PetscViewer viewer) | |||
378 | { | |||
379 | PetscBool isAscii; | |||
380 | PetscErrorCode ierr; | |||
381 | ||||
382 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/snes/utils/convest.c"; petscstack ->line[petscstack->currentsize] = 382; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
383 | ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII"ascii", &isAscii);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),383,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
384 | if (isAscii) { | |||
385 | DM dm; | |||
386 | PetscInt Nf, f; | |||
387 | ||||
388 | ierr = SNESGetDM(ce->snes, &dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),388,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
389 | ierr = DMGetNumFields(dm, &Nf);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),389,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
390 | ierr = PetscViewerASCIIAddTab(viewer, ((PetscObject) ce)->tablevel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),390,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
391 | ierr = PetscViewerASCIIPrintf(viewer, "L_2 convergence rate: ");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),391,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
392 | if (Nf > 1) {ierr = PetscViewerASCIIPrintf(viewer, "[");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),392,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
393 | for (f = 0; f < Nf; ++f) { | |||
394 | if (f > 0) {ierr = PetscViewerASCIIPrintf(viewer, ", ");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),394,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
395 | ierr = PetscViewerASCIIPrintf(viewer, "%#.2g", (double) alpha[f]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),395,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
396 | } | |||
397 | if (Nf > 1) {ierr = PetscViewerASCIIPrintf(viewer, "]");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),397,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
398 | ierr = PetscViewerASCIIPrintf(viewer, "\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),398,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
399 | ierr = PetscViewerASCIISubtractTab(viewer, ((PetscObject) ce)->tablevel);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),399,__func__,"/sandbox/petsc/petsc.next/src/snes/utils/convest.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
400 | } | |||
401 | 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); | |||
402 | } |