48
48
<a name="line38"> 38: </a><strong><font color="#4169E1">extern int FormFunction1(<A href="../../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A>,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A>,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A>,void*),FormInitialGuess1(AppCtx*,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A>)</font></strong>;
50
<a name="line40"> 40: </a><strong><font color="#4169E1"><a name="main"></a>int main(int argc,char **argv)</font></strong>
51
<a name="line41"> 41: </a>{
52
<a name="line42"> 42: </a> <A href="../../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> snes; <font color="#B22222">/* nonlinear solver */</font>
53
<a name="line43"> 43: </a> <A href="../../../../docs/manualpages/SLES/SLES.html#SLES">SLES</A> sles; <font color="#B22222">/* linear solver */</font>
54
<a name="line44"> 44: </a> <A href="../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc; <font color="#B22222">/* preconditioner */</font>
55
<a name="line45"> 45: </a> <A href="../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> J; <font color="#B22222">/* Jacobian matrix */</font>
56
<a name="line46"> 46: </a> AppCtx user; <font color="#B22222">/* user-defined application context */</font>
57
<a name="line47"> 47: </a> <A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> x,r; <font color="#B22222">/* vectors */</font>
58
<a name="line48"> 48: </a> <A href="../../../../docs/manualpages/DA/DAStencilType.html#DAStencilType">DAStencilType</A> stencil = DA_STENCIL_BOX;
59
<a name="line49"> 49: </a> int ierr,its;
60
<a name="line50"> 50: </a> <A href="../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> flg;
61
<a name="line51"> 51: </a> int Nx = PETSC_DECIDE,Ny = PETSC_DECIDE,Nz = PETSC_DECIDE;
62
<a name="line52"> 52: </a> PetscReal bratu_lambda_max = 6.81,bratu_lambda_min = 0.;
64
<a name="line54"> 54: </a> <A href="../../../../docs/manualpages/Sys/PetscInitialize.html#PetscInitialize">PetscInitialize</A>(&argc,&argv,(char *)0,help);
65
<a name="line55"> 55: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsHasName.html#PetscOptionsHasName">PetscOptionsHasName</A>(PETSC_NULL,<font color="#666666">"-star"</font>,&flg);
66
<a name="line56"> 56: </a> <font color="#4169E1">if</font> (flg) stencil = DA_STENCIL_STAR;
68
<a name="line58"> 58: </a> user.mx = 4;
69
<a name="line59"> 59: </a> user.my = 4;
70
<a name="line60"> 60: </a> user.mz = 4;
71
<a name="line61"> 61: </a> user.param = 6.0;
72
<a name="line62"> 62: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(PETSC_NULL,<font color="#666666">"-mx"</font>,&user.mx,PETSC_NULL);
73
<a name="line63"> 63: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(PETSC_NULL,<font color="#666666">"-my"</font>,&user.my,PETSC_NULL);
74
<a name="line64"> 64: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(PETSC_NULL,<font color="#666666">"-mz"</font>,&user.mz,PETSC_NULL);
75
<a name="line65"> 65: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(PETSC_NULL,<font color="#666666">"-Nx"</font>,&Nx,PETSC_NULL);
76
<a name="line66"> 66: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(PETSC_NULL,<font color="#666666">"-Ny"</font>,&Ny,PETSC_NULL);
77
<a name="line67"> 67: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(PETSC_NULL,<font color="#666666">"-Nz"</font>,&Nz,PETSC_NULL);
78
<a name="line68"> 68: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetReal.html#PetscOptionsGetReal">PetscOptionsGetReal</A>(PETSC_NULL,<font color="#666666">"-par"</font>,&user.param,PETSC_NULL);
79
<a name="line69"> 69: </a> <font color="#4169E1">if</font> (user.param >= bratu_lambda_max || user.param <= bratu_lambda_min) {
80
<a name="line70"> 70: </a> <A href="../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(1,<font color="#666666">"Lambda is out of range"</font>);
81
<a name="line71"> 71: </a> }
82
<a name="line72"> 72: </a>
83
<a name="line73"> 73: </a> <font color="#B22222">/* Set up distributed array */</font>
84
<a name="line74"> 74: </a> <A href="../../../../docs/manualpages/DA/DACreate3d.html#DACreate3d">DACreate3d</A>(PETSC_COMM_WORLD,DA_NONPERIODIC,stencil,user.mx,user.my,user.mz,
85
<a name="line75"> 75: </a> Nx,Ny,Nz,1,1,PETSC_NULL,PETSC_NULL,PETSC_NULL,&user.da);
86
<a name="line76"> 76: </a> <A href="../../../../docs/manualpages/DA/DACreateGlobalVector.html#DACreateGlobalVector">DACreateGlobalVector</A>(user.da,&x);
87
<a name="line77"> 77: </a> <A href="../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(x,&r);
88
<a name="line78"> 78: </a> <A href="../../../../docs/manualpages/DA/DACreateLocalVector.html#DACreateLocalVector">DACreateLocalVector</A>(user.da,&user.localX);
89
<a name="line79"> 79: </a> <A href="../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(user.localX,&user.localF);
91
<a name="line81"> 81: </a> <font color="#B22222">/* Create nonlinear solver */</font>
92
<a name="line82"> 82: </a> <A href="../../../../docs/manualpages/SNES/SNESCreate.html#SNESCreate">SNESCreate</A>(PETSC_COMM_WORLD,&snes);
93
<a name="line83"> 83: </a> <font color="#B22222">/* Set various routines and options */</font>
94
<a name="line84"> 84: </a> <A href="../../../../docs/manualpages/SNES/SNESSetFunction.html#SNESSetFunction">SNESSetFunction</A>(snes,r,FormFunction1,(void *)&user);
95
<a name="line85"> 85: </a> <A href="../../../../docs/manualpages/SNESMF/MatCreateSNESMF.html#MatCreateSNESMF">MatCreateSNESMF</A>(snes,x,&J);
96
<a name="line86"> 86: </a> <A href="../../../../docs/manualpages/SNES/SNESSetJacobian.html#SNESSetJacobian">SNESSetJacobian</A>(snes,J,J,MatSNESMFComputeJacobian,&user);
97
<a name="line87"> 87: </a> <A href="../../../../docs/manualpages/SNES/SNESSetFromOptions.html#SNESSetFromOptions">SNESSetFromOptions</A>(snes);
99
<a name="line89"> 89: </a> <font color="#B22222">/* Force no preconditioning to be used. Note that this overrides whatever</font>
100
<a name="line90"> 90: </a><font color="#B22222"> choices may have been specified in the options database. */</font>
101
<a name="line91"> 91: </a> <A href="../../../../docs/manualpages/SNES/SNESGetSLES.html#SNESGetSLES">SNESGetSLES</A>(snes,&sles);
102
<a name="line92"> 92: </a> <A href="../../../../docs/manualpages/SLES/SLESGetPC.html#SLESGetPC">SLESGetPC</A>(sles,&pc);
103
<a name="line93"> 93: </a> <A href="../../../../docs/manualpages/PC/PCSetType.html#PCSetType">PCSetType</A>(pc,PCNONE);
105
<a name="line95"> 95: </a> <font color="#B22222">/* Solve nonlinear system */</font>
106
<a name="line96"> 96: </a> FormInitialGuess1(&user,x);
107
<a name="line97"> 97: </a> <A href="../../../../docs/manualpages/SNES/SNESSolve.html#SNESSolve">SNESSolve</A>(snes,x,&its);
108
<a name="line98"> 98: </a> <A href="../../../../docs/manualpages/Sys/PetscPrintf.html#PetscPrintf">PetscPrintf</A>(PETSC_COMM_WORLD,<font color="#666666">"Number of Newton iterations = %dn"</font>,its);
110
<a name="line100">100: </a> <font color="#B22222">/* Free data structures */</font>
111
<a name="line101">101: </a> <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(user.localX);
112
<a name="line102">102: </a> <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(user.localF);
113
<a name="line103">103: </a> <A href="../../../../docs/manualpages/DA/DADestroy.html#DADestroy">DADestroy</A>(user.da);
114
<a name="line104">104: </a> <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(x); <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(r);
115
<a name="line105">105: </a> <A href="../../../../docs/manualpages/Mat/MatDestroy.html#MatDestroy">MatDestroy</A>(J); <A href="../../../../docs/manualpages/SNES/SNESDestroy.html#SNESDestroy">SNESDestroy</A>(snes);
117
<a name="line107">107: </a> <A href="../../../../docs/manualpages/Sys/PetscFinalize.html#PetscFinalize">PetscFinalize</A>();
118
<a name="line108">108: </a> <font color="#4169E1">return</font> 0;
119
<a name="line109">109: </a>}<font color="#B22222">/* -------------------- Form initial approximation ----------------- */</font>
120
<a name="line110">110: </a><strong><font color="#4169E1"><a name="FormInitialGuess1"></a>int FormInitialGuess1(AppCtx *user,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> X)</font></strong>
121
<a name="line111">111: </a>{
122
<a name="line112">112: </a> int i,j,k,loc,mx,my,mz,ierr,xs,ys,zs,xm,ym,zm,Xm,Ym,Zm,Xs,Ys,Zs,base1;
123
<a name="line113">113: </a> PetscReal one = 1.0,lambda,temp1,temp,Hx,Hy;
124
<a name="line114">114: </a> <A href="../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> *x;
125
<a name="line115">115: </a> <A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> localX = user->localX;
127
<a name="line117">117: </a> mx = user->mx; my = user->my; mz = user->mz; lambda = user->param;
128
<a name="line118">118: </a> Hx = one / (PetscReal)(mx-1); Hy = one / (PetscReal)(my-1);
130
<a name="line120">120: </a> ierr = <A href="../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(localX,&x);
131
<a name="line121">121: </a> temp1 = lambda/(lambda + one);
132
<a name="line122">122: </a> ierr = <A href="../../../../docs/manualpages/DA/DAGetCorners.html#DAGetCorners">DAGetCorners</A>(user->da,&xs,&ys,&zs,&xm,&ym,&zm);
133
<a name="line123">123: </a> ierr = <A href="../../../../docs/manualpages/DA/DAGetGhostCorners.html#DAGetGhostCorners">DAGetGhostCorners</A>(user->da,&Xs,&Ys,&Zs,&Xm,&Ym,&Zm);
134
<a name="line124">124: </a>
135
<a name="line125">125: </a> <font color="#4169E1">for</font> (k=zs; k<zs+zm; k++) {
136
<a name="line126">126: </a> base1 = (Xm*Ym)*(k-Zs);
137
<a name="line127">127: </a> <font color="#4169E1">for</font> (j=ys; j<ys+ym; j++) {
138
<a name="line128">128: </a> temp = (PetscReal)(PetscMin(j,my-j-1))*Hy;
139
<a name="line129">129: </a> <font color="#4169E1">for</font> (i=xs; i<xs+xm; i++) {
140
<a name="line130">130: </a> loc = base1 + i-Xs + (j-Ys)*Xm;
141
<a name="line131">131: </a> <font color="#4169E1">if</font> (i == 0 || j == 0 || k == 0 || i==mx-1 || j==my-1 || k==mz-1) {
142
<a name="line132">132: </a> x[loc] = 0.0;
143
<a name="line133">133: </a> <font color="#4169E1">continue</font>;
144
<a name="line134">134: </a> }
145
<a name="line135">135: </a> x[loc] = temp1*sqrt(PetscMin((PetscReal)(PetscMin(i,mx-i-1))*Hx,temp));
146
<a name="line136">136: </a> }
147
<a name="line137">137: </a> }
148
<a name="line138">138: </a> }
150
<a name="line140">140: </a> <A href="../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(localX,&x);
151
<a name="line141">141: </a> <font color="#B22222">/* stick values into global vector */</font>
152
<a name="line142">142: </a> <A href="../../../../docs/manualpages/DA/DALocalToGlobal.html#DALocalToGlobal">DALocalToGlobal</A>(user->da,localX,INSERT_VALUES,X);
153
<a name="line143">143: </a> <font color="#4169E1">return</font> 0;
154
<a name="line144">144: </a>}<font color="#B22222">/* -------------------- Evaluate Function F(x) --------------------- */</font>
155
<a name="line145">145: </a><strong><font color="#4169E1"><a name="FormFunction1"></a>int FormFunction1(<A href="../../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> snes,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> X,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> F,void *ptr)</font></strong>
156
<a name="line146">146: </a>{
157
<a name="line147">147: </a> AppCtx *user = (AppCtx*)ptr;
158
<a name="line148">148: </a> int ierr,i,j,k,loc,mx,my,mz,xs,ys,zs,xm,ym,zm,Xs,Ys,Zs,Xm,Ym,Zm;
159
<a name="line149">149: </a> int base1,base2;
160
<a name="line150">150: </a> PetscReal two = 2.0,one = 1.0,lambda,Hx,Hy,Hz,HxHzdHy,HyHzdHx,HxHydHz;
161
<a name="line151">151: </a> <A href="../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> u,uxx,uyy,sc,*x,*f,uzz;
162
<a name="line152">152: </a> <A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> localX = user->localX,localF = user->localF;
164
<a name="line154">154: </a> mx = user->mx; my = user->my; mz = user->mz; lambda = user->param;
165
<a name="line155">155: </a> Hx = one / (PetscReal)(mx-1);
166
<a name="line156">156: </a> Hy = one / (PetscReal)(my-1);
167
<a name="line157">157: </a> Hz = one / (PetscReal)(mz-1);
168
<a name="line158">158: </a> sc = Hx*Hy*Hz*lambda; HxHzdHy = Hx*Hz/Hy; HyHzdHx = Hy*Hz/Hx;
169
<a name="line159">159: </a> HxHydHz = Hx*Hy/Hz;
171
<a name="line161">161: </a> <A href="../../../../docs/manualpages/DA/DAGlobalToLocalBegin.html#DAGlobalToLocalBegin">DAGlobalToLocalBegin</A>(user->da,X,INSERT_VALUES,localX);
172
<a name="line162">162: </a> <A href="../../../../docs/manualpages/DA/DAGlobalToLocalEnd.html#DAGlobalToLocalEnd">DAGlobalToLocalEnd</A>(user->da,X,INSERT_VALUES,localX);
173
<a name="line163">163: </a> <A href="../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(localX,&x);
174
<a name="line164">164: </a> <A href="../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(localF,&f);
176
<a name="line166">166: </a> <A href="../../../../docs/manualpages/DA/DAGetCorners.html#DAGetCorners">DAGetCorners</A>(user->da,&xs,&ys,&zs,&xm,&ym,&zm);
177
<a name="line167">167: </a> <A href="../../../../docs/manualpages/DA/DAGetGhostCorners.html#DAGetGhostCorners">DAGetGhostCorners</A>(user->da,&Xs,&Ys,&Zs,&Xm,&Ym,&Zm);
179
<a name="line169">169: </a> <font color="#4169E1">for</font> (k=zs; k<zs+zm; k++) {
180
<a name="line170">170: </a> base1 = (Xm*Ym)*(k-Zs);
181
<a name="line171">171: </a> <font color="#4169E1">for</font> (j=ys; j<ys+ym; j++) {
182
<a name="line172">172: </a> base2 = base1 + (j-Ys)*Xm;
183
<a name="line173">173: </a> <font color="#4169E1">for</font> (i=xs; i<xs+xm; i++) {
184
<a name="line174">174: </a> loc = base2 + (i-Xs);
185
<a name="line175">175: </a> <font color="#4169E1">if</font> (i == 0 || j == 0 || k== 0 || i == mx-1 || j == my-1 || k == mz-1) {
186
<a name="line176">176: </a> f[loc] = x[loc];
187
<a name="line177">177: </a> }
188
<a name="line178">178: </a> <font color="#4169E1">else</font> {
189
<a name="line179">179: </a> u = x[loc];
190
<a name="line180">180: </a> uxx = (two*u - x[loc-1] - x[loc+1])*HyHzdHx;
191
<a name="line181">181: </a> uyy = (two*u - x[loc-Xm] - x[loc+Xm])*HxHzdHy;
192
<a name="line182">182: </a> uzz = (two*u - x[loc-Xm*Ym] - x[loc+Xm*Ym])*HxHydHz;
193
<a name="line183">183: </a> f[loc] = uxx + uyy + uzz - sc*PetscExpScalar(u);
50
<a name="line42"> 42: </a><strong><font color="#4169E1"><a name="main"></a>int main(int argc,char **argv)</font></strong>
51
<a name="line43"> 43: </a>{
52
<a name="line44"> 44: </a> <A href="../../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> snes; <font color="#B22222">/* nonlinear solver */</font>
53
<a name="line45"> 45: </a> <A href="../../../../docs/manualpages/KSP/KSP.html#KSP">KSP</A> ksp; <font color="#B22222">/* linear solver */</font>
54
<a name="line46"> 46: </a> <A href="../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc; <font color="#B22222">/* preconditioner */</font>
55
<a name="line47"> 47: </a> <A href="../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> J; <font color="#B22222">/* Jacobian matrix */</font>
56
<a name="line48"> 48: </a> AppCtx user; <font color="#B22222">/* user-defined application context */</font>
57
<a name="line49"> 49: </a> <A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> x,r; <font color="#B22222">/* vectors */</font>
58
<a name="line50"> 50: </a> <A href="../../../../docs/manualpages/DA/DAStencilType.html#DAStencilType">DAStencilType</A> stencil = DA_STENCIL_BOX;
59
<a name="line51"> 51: </a> int ierr,its;
60
<a name="line52"> 52: </a> <A href="../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> flg;
61
<a name="line53"> 53: </a> int Nx = <A href="../../../../docs/manualpages/Sys/PETSC_DECIDE.html#PETSC_DECIDE">PETSC_DECIDE</A>,Ny = <A href="../../../../docs/manualpages/Sys/PETSC_DECIDE.html#PETSC_DECIDE">PETSC_DECIDE</A>,Nz = <A href="../../../../docs/manualpages/Sys/PETSC_DECIDE.html#PETSC_DECIDE">PETSC_DECIDE</A>;
62
<a name="line54"> 54: </a> <A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> bratu_lambda_max = 6.81,bratu_lambda_min = 0.;
64
<a name="line56"> 56: </a> <A href="../../../../docs/manualpages/Sys/PetscInitialize.html#PetscInitialize">PetscInitialize</A>(&argc,&argv,(char *)0,help);
65
<a name="line57"> 57: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsHasName.html#PetscOptionsHasName">PetscOptionsHasName</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-star"</font>,&flg);
66
<a name="line58"> 58: </a> <font color="#4169E1">if</font> (flg) stencil = DA_STENCIL_STAR;
68
<a name="line60"> 60: </a> user.mx = 4;
69
<a name="line61"> 61: </a> user.my = 4;
70
<a name="line62"> 62: </a> user.mz = 4;
71
<a name="line63"> 63: </a> user.param = 6.0;
72
<a name="line64"> 64: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-mx"</font>,&user.mx,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
73
<a name="line65"> 65: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-my"</font>,&user.my,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
74
<a name="line66"> 66: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-mz"</font>,&user.mz,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
75
<a name="line67"> 67: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-Nx"</font>,&Nx,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
76
<a name="line68"> 68: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-Ny"</font>,&Ny,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
77
<a name="line69"> 69: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetInt.html#PetscOptionsGetInt">PetscOptionsGetInt</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-Nz"</font>,&Nz,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
78
<a name="line70"> 70: </a> <A href="../../../../docs/manualpages/Sys/PetscOptionsGetReal.html#PetscOptionsGetReal">PetscOptionsGetReal</A>(<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<font color="#666666">"-par"</font>,&user.param,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
79
<a name="line71"> 71: </a> <font color="#4169E1">if</font> (user.param >= bratu_lambda_max || user.param <= bratu_lambda_min) {
80
<a name="line72"> 72: </a> <A href="../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(1,<font color="#666666">"Lambda is out of range"</font>);
81
<a name="line73"> 73: </a> }
82
<a name="line74"> 74: </a>
83
<a name="line75"> 75: </a> <font color="#B22222">/* Set up distributed array */</font>
84
<a name="line76"> 76: </a> <A href="../../../../docs/manualpages/DA/DACreate3d.html#DACreate3d">DACreate3d</A>(<A href="../../../../docs/manualpages/Sys/PETSC_COMM_WORLD.html#PETSC_COMM_WORLD">PETSC_COMM_WORLD</A>,DA_NONPERIODIC,stencil,user.mx,user.my,user.mz,
85
<a name="line77"> 77: </a> Nx,Ny,Nz,1,1,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,<A href="../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,&user.da);
86
<a name="line78"> 78: </a> <A href="../../../../docs/manualpages/DA/DACreateGlobalVector.html#DACreateGlobalVector">DACreateGlobalVector</A>(user.da,&x);
87
<a name="line79"> 79: </a> <A href="../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(x,&r);
88
<a name="line80"> 80: </a> <A href="../../../../docs/manualpages/DA/DACreateLocalVector.html#DACreateLocalVector">DACreateLocalVector</A>(user.da,&user.localX);
89
<a name="line81"> 81: </a> <A href="../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(user.localX,&user.localF);
91
<a name="line83"> 83: </a> <font color="#B22222">/* Create nonlinear solver */</font>
92
<a name="line84"> 84: </a> <A href="../../../../docs/manualpages/SNES/SNESCreate.html#SNESCreate">SNESCreate</A>(<A href="../../../../docs/manualpages/Sys/PETSC_COMM_WORLD.html#PETSC_COMM_WORLD">PETSC_COMM_WORLD</A>,&snes);
93
<a name="line85"> 85: </a> <font color="#B22222">/* Set various routines and options */</font>
94
<a name="line86"> 86: </a> <A href="../../../../docs/manualpages/SNES/SNESSetFunction.html#SNESSetFunction">SNESSetFunction</A>(snes,r,FormFunction1,(void *)&user);
95
<a name="line87"> 87: </a> <A href="../../../../docs/manualpages/SNESMF/MatCreateSNESMF.html#MatCreateSNESMF">MatCreateSNESMF</A>(snes,x,&J);
96
<a name="line88"> 88: </a> <A href="../../../../docs/manualpages/SNES/SNESSetJacobian.html#SNESSetJacobian">SNESSetJacobian</A>(snes,J,J,MatSNESMFComputeJacobian,&user);
97
<a name="line89"> 89: </a> <A href="../../../../docs/manualpages/SNES/SNESSetFromOptions.html#SNESSetFromOptions">SNESSetFromOptions</A>(snes);
99
<a name="line91"> 91: </a> <font color="#B22222">/* Force no preconditioning to be used. Note that this overrides whatever</font>
100
<a name="line92"> 92: </a><font color="#B22222"> choices may have been specified in the options database. */</font>
101
<a name="line93"> 93: </a> <A href="../../../../docs/manualpages/SNES/SNESGetKSP.html#SNESGetKSP">SNESGetKSP</A>(snes,&ksp);
102
<a name="line94"> 94: </a> <A href="../../../../docs/manualpages/KSP/KSPGetPC.html#KSPGetPC">KSPGetPC</A>(ksp,&pc);
103
<a name="line95"> 95: </a> <A href="../../../../docs/manualpages/PC/PCSetType.html#PCSetType">PCSetType</A>(pc,PCNONE);
105
<a name="line97"> 97: </a> <font color="#B22222">/* Solve nonlinear system */</font>
106
<a name="line98"> 98: </a> FormInitialGuess1(&user,x);
107
<a name="line99"> 99: </a> <A href="../../../../docs/manualpages/SNES/SNESSolve.html#SNESSolve">SNESSolve</A>(snes,x);
108
<a name="line100">100: </a> <A href="../../../../docs/manualpages/SNES/SNESGetIterationNumber.html#SNESGetIterationNumber">SNESGetIterationNumber</A>(snes,&its);
109
<a name="line101">101: </a> <A href="../../../../docs/manualpages/Sys/PetscPrintf.html#PetscPrintf">PetscPrintf</A>(<A href="../../../../docs/manualpages/Sys/PETSC_COMM_WORLD.html#PETSC_COMM_WORLD">PETSC_COMM_WORLD</A>,<font color="#666666">"Number of Newton iterations = %d\n"</font>,its);
111
<a name="line103">103: </a> <font color="#B22222">/* Free data structures */</font>
112
<a name="line104">104: </a> <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(user.localX);
113
<a name="line105">105: </a> <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(user.localF);
114
<a name="line106">106: </a> <A href="../../../../docs/manualpages/DA/DADestroy.html#DADestroy">DADestroy</A>(user.da);
115
<a name="line107">107: </a> <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(x); <A href="../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(r);
116
<a name="line108">108: </a> <A href="../../../../docs/manualpages/Mat/MatDestroy.html#MatDestroy">MatDestroy</A>(J); <A href="../../../../docs/manualpages/SNES/SNESDestroy.html#SNESDestroy">SNESDestroy</A>(snes);
118
<a name="line110">110: </a> <A href="../../../../docs/manualpages/Sys/PetscFinalize.html#PetscFinalize">PetscFinalize</A>();
119
<a name="line111">111: </a> <font color="#4169E1">return</font> 0;
120
<a name="line112">112: </a>}<font color="#B22222">/* -------------------- Form initial approximation ----------------- */</font>
121
<a name="line115">115: </a><strong><font color="#4169E1"><a name="FormInitialGuess1"></a>int FormInitialGuess1(AppCtx *user,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> X)</font></strong>
122
<a name="line116">116: </a>{
123
<a name="line117">117: </a> int i,j,k,loc,mx,my,mz,ierr,xs,ys,zs,xm,ym,zm,Xm,Ym,Zm,Xs,Ys,Zs,base1;
124
<a name="line118">118: </a> <A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> one = 1.0,lambda,temp1,temp,Hx,Hy;
125
<a name="line119">119: </a> <A href="../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> *x;
126
<a name="line120">120: </a> <A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> localX = user->localX;
128
<a name="line122">122: </a> mx = user->mx; my = user->my; mz = user->mz; lambda = user->param;
129
<a name="line123">123: </a> Hx = one / (<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(mx-1); Hy = one / (<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(my-1);
131
<a name="line125">125: </a> <A href="../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(localX,&x);
132
<a name="line126">126: </a> temp1 = lambda/(lambda + one);
133
<a name="line127">127: </a> <A href="../../../../docs/manualpages/DA/DAGetCorners.html#DAGetCorners">DAGetCorners</A>(user->da,&xs,&ys,&zs,&xm,&ym,&zm);
134
<a name="line128">128: </a> <A href="../../../../docs/manualpages/DA/DAGetGhostCorners.html#DAGetGhostCorners">DAGetGhostCorners</A>(user->da,&Xs,&Ys,&Zs,&Xm,&Ym,&Zm);
135
<a name="line129">129: </a>
136
<a name="line130">130: </a> <font color="#4169E1">for</font> (k=zs; k<zs+zm; k++) {
137
<a name="line131">131: </a> base1 = (Xm*Ym)*(k-Zs);
138
<a name="line132">132: </a> <font color="#4169E1">for</font> (j=ys; j<ys+ym; j++) {
139
<a name="line133">133: </a> temp = (<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(<A href="../../../../docs/manualpages/Sys/PetscMin.html#PetscMin">PetscMin</A>(j,my-j-1))*Hy;
140
<a name="line134">134: </a> <font color="#4169E1">for</font> (i=xs; i<xs+xm; i++) {
141
<a name="line135">135: </a> loc = base1 + i-Xs + (j-Ys)*Xm;
142
<a name="line136">136: </a> <font color="#4169E1">if</font> (i == 0 || j == 0 || k == 0 || i==mx-1 || j==my-1 || k==mz-1) {
143
<a name="line137">137: </a> x[loc] = 0.0;
144
<a name="line138">138: </a> <font color="#4169E1">continue</font>;
145
<a name="line139">139: </a> }
146
<a name="line140">140: </a> x[loc] = temp1*sqrt(<A href="../../../../docs/manualpages/Sys/PetscMin.html#PetscMin">PetscMin</A>((<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(<A href="../../../../docs/manualpages/Sys/PetscMin.html#PetscMin">PetscMin</A>(i,mx-i-1))*Hx,temp));
147
<a name="line141">141: </a> }
148
<a name="line142">142: </a> }
149
<a name="line143">143: </a> }
151
<a name="line145">145: </a> <A href="../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(localX,&x);
152
<a name="line146">146: </a> <font color="#B22222">/* stick values into global vector */</font>
153
<a name="line147">147: </a> <A href="../../../../docs/manualpages/DA/DALocalToGlobal.html#DALocalToGlobal">DALocalToGlobal</A>(user->da,localX,INSERT_VALUES,X);
154
<a name="line148">148: </a> <font color="#4169E1">return</font> 0;
155
<a name="line149">149: </a>}<font color="#B22222">/* -------------------- Evaluate Function F(x) --------------------- */</font>
156
<a name="line152">152: </a><strong><font color="#4169E1"><a name="FormFunction1"></a>int FormFunction1(<A href="../../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> snes,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> X,<A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> F,void *ptr)</font></strong>
157
<a name="line153">153: </a>{
158
<a name="line154">154: </a> AppCtx *user = (AppCtx*)ptr;
159
<a name="line155">155: </a> int ierr,i,j,k,loc,mx,my,mz,xs,ys,zs,xm,ym,zm,Xs,Ys,Zs,Xm,Ym,Zm;
160
<a name="line156">156: </a> int base1,base2;
161
<a name="line157">157: </a> <A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> two = 2.0,one = 1.0,lambda,Hx,Hy,Hz,HxHzdHy,HyHzdHx,HxHydHz;
162
<a name="line158">158: </a> <A href="../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> u,uxx,uyy,sc,*x,*f,uzz;
163
<a name="line159">159: </a> <A href="../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> localX = user->localX,localF = user->localF;
165
<a name="line161">161: </a> mx = user->mx; my = user->my; mz = user->mz; lambda = user->param;
166
<a name="line162">162: </a> Hx = one / (<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(mx-1);
167
<a name="line163">163: </a> Hy = one / (<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(my-1);
168
<a name="line164">164: </a> Hz = one / (<A href="../../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A>)(mz-1);
169
<a name="line165">165: </a> sc = Hx*Hy*Hz*lambda; HxHzdHy = Hx*Hz/Hy; HyHzdHx = Hy*Hz/Hx;
170
<a name="line166">166: </a> HxHydHz = Hx*Hy/Hz;
172
<a name="line168">168: </a> <A href="../../../../docs/manualpages/DA/DAGlobalToLocalBegin.html#DAGlobalToLocalBegin">DAGlobalToLocalBegin</A>(user->da,X,INSERT_VALUES,localX);
173
<a name="line169">169: </a> <A href="../../../../docs/manualpages/DA/DAGlobalToLocalEnd.html#DAGlobalToLocalEnd">DAGlobalToLocalEnd</A>(user->da,X,INSERT_VALUES,localX);
174
<a name="line170">170: </a> <A href="../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(localX,&x);
175
<a name="line171">171: </a> <A href="../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(localF,&f);
177
<a name="line173">173: </a> <A href="../../../../docs/manualpages/DA/DAGetCorners.html#DAGetCorners">DAGetCorners</A>(user->da,&xs,&ys,&zs,&xm,&ym,&zm);
178
<a name="line174">174: </a> <A href="../../../../docs/manualpages/DA/DAGetGhostCorners.html#DAGetGhostCorners">DAGetGhostCorners</A>(user->da,&Xs,&Ys,&Zs,&Xm,&Ym,&Zm);
180
<a name="line176">176: </a> <font color="#4169E1">for</font> (k=zs; k<zs+zm; k++) {
181
<a name="line177">177: </a> base1 = (Xm*Ym)*(k-Zs);
182
<a name="line178">178: </a> <font color="#4169E1">for</font> (j=ys; j<ys+ym; j++) {
183
<a name="line179">179: </a> base2 = base1 + (j-Ys)*Xm;
184
<a name="line180">180: </a> <font color="#4169E1">for</font> (i=xs; i<xs+xm; i++) {
185
<a name="line181">181: </a> loc = base2 + (i-Xs);
186
<a name="line182">182: </a> <font color="#4169E1">if</font> (i == 0 || j == 0 || k== 0 || i == mx-1 || j == my-1 || k == mz-1) {
187
<a name="line183">183: </a> f[loc] = x[loc];
194
188
<a name="line184">184: </a> }
195
<a name="line185">185: </a> }
196
<a name="line186">186: </a> }
197
<a name="line187">187: </a> }
198
<a name="line188">188: </a> <A href="../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(localX,&x);
199
<a name="line189">189: </a> <A href="../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(localF,&f);
200
<a name="line190">190: </a> <font color="#B22222">/* stick values into global vector */</font>
201
<a name="line191">191: </a> <A href="../../../../docs/manualpages/DA/DALocalToGlobal.html#DALocalToGlobal">DALocalToGlobal</A>(user->da,localF,INSERT_VALUES,F);
202
<a name="line192">192: </a> <A href="../../../../docs/manualpages/Profiling/PetscLogFlops.html#PetscLogFlops">PetscLogFlops</A>(11*ym*xm*zm);
203
<a name="line193">193: </a> <font color="#4169E1">return</font> 0;
204
<a name="line194">194: </a>}
205
<a name="line195">195: </a>
210
<a name="line200">200: </a>
189
<a name="line185">185: </a> <font color="#4169E1">else</font> {
190
<a name="line186">186: </a> u = x[loc];
191
<a name="line187">187: </a> uxx = (two*u - x[loc-1] - x[loc+1])*HyHzdHx;
192
<a name="line188">188: </a> uyy = (two*u - x[loc-Xm] - x[loc+Xm])*HxHzdHy;
193
<a name="line189">189: </a> uzz = (two*u - x[loc-Xm*Ym] - x[loc+Xm*Ym])*HxHydHz;
194
<a name="line190">190: </a> f[loc] = uxx + uyy + uzz - sc*PetscExpScalar(u);
195
<a name="line191">191: </a> }
196
<a name="line192">192: </a> }
197
<a name="line193">193: </a> }
198
<a name="line194">194: </a> }
199
<a name="line195">195: </a> <A href="../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(localX,&x);
200
<a name="line196">196: </a> <A href="../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(localF,&f);
201
<a name="line197">197: </a> <font color="#B22222">/* stick values into global vector */</font>
202
<a name="line198">198: </a> <A href="../../../../docs/manualpages/DA/DALocalToGlobal.html#DALocalToGlobal">DALocalToGlobal</A>(user->da,localF,INSERT_VALUES,F);
203
<a name="line199">199: </a> <A href="../../../../docs/manualpages/Profiling/PetscLogFlops.html#PetscLogFlops">PetscLogFlops</A>(11*ym*xm*zm);
204
<a name="line200">200: </a> <font color="#4169E1">return</font> 0;
205
<a name="line201">201: </a>}
206
<a name="line202">202: </a>
211
<a name="line207">207: </a>