13
13
<a name="line3"> 3: </a> #include <A href="../../../src/mat/matimpl.h.html">src/mat/matimpl.h</A>
14
14
<a name="line4"> 4: </a> #include <A href="../../../src/ts/tsimpl.h.html">src/ts/tsimpl.h</A>
16
<a name="line6"> 6: </a><font color="#B22222">/*@C</font>
17
<a name="line7"> 7: </a><font color="#B22222"> <A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A> - Computes the Jacobian using</font>
18
<a name="line8"> 8: </a><font color="#B22222"> finite differences and coloring to exploit matrix sparsity. </font>
19
<a name="line9"> 9: </a><font color="#B22222"> </font>
20
<a name="line10"> 10: </a><font color="#B22222"> Collective on <A href="../../../docs/manualpages/TS/TS.html#TS">TS</A>, <A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> and <A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A></font>
22
<a name="line12"> 12: </a><font color="#B22222"> Input Parameters:</font>
23
<a name="line13"> 13: </a><font color="#B22222">+ ts - nonlinear solver object</font>
24
<a name="line14"> 14: </a><font color="#B22222">. t - current time</font>
25
<a name="line15"> 15: </a><font color="#B22222">. x1 - location at which to evaluate Jacobian</font>
26
<a name="line16"> 16: </a><font color="#B22222">- ctx - coloring context, where ctx must have type <A href="../../../docs/manualpages/Mat/MatFDColoring.html#MatFDColoring">MatFDColoring</A>, </font>
27
<a name="line17"> 17: </a><font color="#B22222"> as created via <A href="../../../docs/manualpages/MatFD/MatFDColoringCreate.html#MatFDColoringCreate">MatFDColoringCreate</A>()</font>
29
<a name="line19"> 19: </a><font color="#B22222"> Output Parameters:</font>
30
<a name="line20"> 20: </a><font color="#B22222">+ J - Jacobian matrix (not altered in this routine)</font>
31
<a name="line21"> 21: </a><font color="#B22222">. B - newly computed Jacobian matrix to use with preconditioner (generally the same as J)</font>
32
<a name="line22"> 22: </a><font color="#B22222">- flag - flag indicating whether the matrix sparsity structure has changed</font>
34
<a name="line24"> 24: </a><font color="#B22222"> Options Database Keys:</font>
35
<a name="line25"> 25: </a><font color="#B22222">$ -mat_fd_coloring_freq <freq> </font>
37
<a name="line27"> 27: </a><font color="#B22222"> Level: intermediate</font>
39
<a name="line29"> 29: </a><font color="#B22222">.keywords: <A href="../../../docs/manualpages/TS/TS.html#TS">TS</A>, finite differences, Jacobian, coloring, sparse</font>
41
<a name="line31"> 31: </a><font color="#B22222">.seealso: TSSetJacobian(), <A href="../../../docs/manualpages/MatFD/MatFDColoringCreate.html#MatFDColoringCreate">MatFDColoringCreate</A>(), <A href="../../../docs/manualpages/MatFD/MatFDColoringSetFunction.html#MatFDColoringSetFunction">MatFDColoringSetFunction</A>()</font>
42
<a name="line32"> 32: </a><font color="#B22222">@*/</font>
43
<a name="line33"> 33: </a><strong><font color="#4169E1"><a name="TSDefaultComputeJacobianColor"></a>int <A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>(<A href="../../../docs/manualpages/TS/TS.html#TS">TS</A> ts,PetscReal t,<A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> x1,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *J,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *B,<A href="../../../docs/manualpages/Mat/MatStructure.html#MatStructure">MatStructure</A> *flag,void *ctx)</font></strong>
44
<a name="line34"> 34: </a>{
45
<a name="line35"> 35: </a> <A href="../../../docs/manualpages/Mat/MatFDColoring.html#MatFDColoring">MatFDColoring</A> color = (<A href="../../../docs/manualpages/Mat/MatFDColoring.html#MatFDColoring">MatFDColoring</A>) ctx;
46
<a name="line36"> 36: </a> <A href="../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> snes;
47
<a name="line37"> 37: </a> int ierr,freq,it;
49
<a name="line40"> 40: </a> <font color="#B22222">/*</font>
50
<a name="line41"> 41: </a><font color="#B22222"> If we are not using <A href="../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> we have no way to know the current iteration.</font>
51
<a name="line42"> 42: </a><font color="#B22222"> */</font>
52
<a name="line43"> 43: </a> <A href="../../../docs/manualpages/TS/TSGetSNES.html#TSGetSNES">TSGetSNES</A>(ts,&snes);
53
<a name="line44"> 44: </a> <font color="#4169E1">if</font> (snes) {
54
<a name="line45"> 45: </a> <A href="../../../docs/manualpages/MatFD/MatFDColoringGetFrequency.html#MatFDColoringGetFrequency">MatFDColoringGetFrequency</A>(color,&freq);
55
<a name="line46"> 46: </a> <A href="../../../docs/manualpages/SNES/SNESGetIterationNumber.html#SNESGetIterationNumber">SNESGetIterationNumber</A>(snes,&it);
57
<a name="line48"> 48: </a> <font color="#4169E1">if</font> ((freq > 1) && ((it % freq) != 1)) {
58
<a name="line49"> 49: </a> <A href="../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(color,<font color="#666666">"<A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>:Skipping Jacobian, it %d, freq %dn"</font>,it,freq);
59
<a name="line50"> 50: </a> *flag = SAME_PRECONDITIONER;
60
<a name="line51"> 51: </a> <font color="#4169E1">return</font>(0);
61
<a name="line52"> 52: </a> } <font color="#4169E1">else</font> {
62
<a name="line53"> 53: </a> <A href="../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(color,<font color="#666666">"<A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>:Computing Jacobian, it %d, freq %dn"</font>,it,freq);
63
<a name="line54"> 54: </a> *flag = SAME_NONZERO_PATTERN;
64
<a name="line55"> 55: </a> }
65
<a name="line56"> 56: </a> }
66
<a name="line57"> 57: </a> <A href="../../../docs/manualpages/MatFD/MatFDColoringApplyTS.html#MatFDColoringApplyTS">MatFDColoringApplyTS</A>(*B,color,t,x1,flag,ts);
67
<a name="line58"> 58: </a> <font color="#4169E1">return</font>(0);
68
<a name="line59"> 59: </a>}
70
<a name="line61"> 61: </a><font color="#B22222">/*</font>
71
<a name="line62"> 62: </a><font color="#B22222"> TSDefaultComputeJacobian - Computes the Jacobian using finite differences.</font>
73
<a name="line64"> 64: </a><font color="#B22222"> Input Parameters:</font>
74
<a name="line65"> 65: </a><font color="#B22222">+ ts - <A href="../../../docs/manualpages/TS/TS.html#TS">TS</A> context</font>
75
<a name="line66"> 66: </a><font color="#B22222">. xx1 - compute Jacobian at this point</font>
76
<a name="line67"> 67: </a><font color="#B22222">- ctx - application's function context, as set with <A href="../../../docs/manualpages/SNES/SNESSetFunction.html#SNESSetFunction">SNESSetFunction</A>()</font>
78
<a name="line69"> 69: </a><font color="#B22222"> Output Parameters:</font>
79
<a name="line70"> 70: </a><font color="#B22222">+ J - Jacobian</font>
80
<a name="line71"> 71: </a><font color="#B22222">. B - preconditioner, same as Jacobian</font>
81
<a name="line72"> 72: </a><font color="#B22222">- flag - matrix flag</font>
83
<a name="line74"> 74: </a><font color="#B22222"> Notes:</font>
84
<a name="line75"> 75: </a><font color="#B22222"> This routine is slow and expensive, and is not optimized.</font>
86
<a name="line77"> 77: </a><font color="#B22222"> Sparse approximations using colorings are also available and</font>
87
<a name="line78"> 78: </a><font color="#B22222"> would be a much better alternative!</font>
89
<a name="line80"> 80: </a><font color="#B22222"> Level: intermediate</font>
91
<a name="line82"> 82: </a><font color="#B22222">.seealso: <A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>()</font>
92
<a name="line83"> 83: </a><font color="#B22222">*/</font>
93
<a name="line84"> 84: </a><strong><font color="#4169E1"><a name="TSDefaultComputeJacobian"></a>int TSDefaultComputeJacobian(<A href="../../../docs/manualpages/TS/TS.html#TS">TS</A> ts,PetscReal t,<A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> xx1,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *J,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *B,<A href="../../../docs/manualpages/Mat/MatStructure.html#MatStructure">MatStructure</A> *flag,void *ctx)</font></strong>
94
<a name="line85"> 85: </a>{
95
<a name="line86"> 86: </a> <A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> jj1,jj2,xx2;
96
<a name="line87"> 87: </a> int i,ierr,N,start,end,j;
97
<a name="line88"> 88: </a> <A href="../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> dx,mone = -1.0,*y,scale,*xx,wscale;
98
<a name="line89"> 89: </a> PetscReal amax,epsilon = PETSC_SQRT_MACHINE_EPSILON;
99
<a name="line90"> 90: </a> PetscReal dx_min = 1.e-16,dx_par = 1.e-1;
100
<a name="line91"> 91: </a> MPI_Comm <A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>;
102
<a name="line94"> 94: </a> <A href="../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(xx1,&jj1);
103
<a name="line95"> 95: </a> <A href="../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(xx1,&jj2);
104
<a name="line96"> 96: </a> <A href="../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(xx1,&xx2);
106
<a name="line98"> 98: </a> <A href="../../../docs/manualpages/Sys/PetscObjectGetComm.html#PetscObjectGetComm">PetscObjectGetComm</A>((<A href="../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)xx1,&<A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
107
<a name="line99"> 99: </a> <A href="../../../docs/manualpages/Mat/MatZeroEntries.html#MatZeroEntries">MatZeroEntries</A>(*J);
109
<a name="line101">101: </a> <A href="../../../docs/manualpages/Vec/VecGetSize.html#VecGetSize">VecGetSize</A>(xx1,&N);
110
<a name="line102">102: </a> <A href="../../../docs/manualpages/Vec/VecGetOwnershipRange.html#VecGetOwnershipRange">VecGetOwnershipRange</A>(xx1,&start,&end);
111
<a name="line103">103: </a> TSComputeRHSFunction(ts,ts->ptime,xx1,jj1);
113
<a name="line105">105: </a> <font color="#B22222">/* Compute Jacobian approximation, 1 column at a time.</font>
114
<a name="line106">106: </a><font color="#B22222"> xx1 = current iterate, jj1 = F(xx1)</font>
115
<a name="line107">107: </a><font color="#B22222"> xx2 = perturbed iterate, jj2 = F(xx2)</font>
116
<a name="line108">108: </a><font color="#B22222"> */</font>
117
<a name="line109">109: </a> <font color="#4169E1">for</font> (i=0; i<N; i++) {
118
<a name="line110">110: </a> <A href="../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(xx1,xx2);
119
<a name="line111">111: </a> <font color="#4169E1">if</font> (i>= start && i<end) {
120
<a name="line112">112: </a> <A href="../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(xx1,&xx);
121
<a name="line113">113: </a> dx = xx[i-start];
122
<a name="line114">114: </a> <A href="../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(xx1,&xx);
123
<a name="line115">115: </a><font color="#A020F0">#if !defined(PETSC_USE_COMPLEX)</font>
124
<a name="line116">116: </a> <font color="#4169E1">if</font> (dx < dx_min && dx >= 0.0) dx = dx_par;
125
<a name="line117">117: </a> <font color="#4169E1">else</font> <font color="#4169E1">if</font> (dx < 0.0 && dx > -dx_min) dx = -dx_par;
126
<a name="line118">118: </a><font color="#A020F0">#else</font>
127
<a name="line119">119: </a> <font color="#4169E1">if</font> (PetscAbsScalar(dx) < dx_min && PetscRealPart(dx) >= 0.0) dx = dx_par;
128
<a name="line120">120: </a> <font color="#4169E1">else</font> <font color="#4169E1">if</font> (PetscRealPart(dx) < 0.0 && PetscAbsScalar(dx) < dx_min) dx = -dx_par;
129
<a name="line121">121: </a><font color="#A020F0">#endif</font>
130
<a name="line122">122: </a> dx *= epsilon;
131
<a name="line123">123: </a> wscale = 1.0/dx;
132
<a name="line124">124: </a> <A href="../../../docs/manualpages/Vec/VecSetValues.html#VecSetValues">VecSetValues</A>(xx2,1,&i,&dx,ADD_VALUES);
133
<a name="line125">125: </a> } <font color="#4169E1">else</font> {
134
<a name="line126">126: </a> wscale = 0.0;
135
<a name="line127">127: </a> }
136
<a name="line128">128: </a> TSComputeRHSFunction(ts,t,xx2,jj2);
137
<a name="line129">129: </a> <A href="../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&mone,jj1,jj2);
138
<a name="line130">130: </a> <font color="#B22222">/* Communicate scale to all processors */</font>
139
<a name="line131">131: </a> <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allreduce.html#MPI_Allreduce">MPI_Allreduce</A>(&wscale,&scale,1,MPIU_SCALAR,PetscSum_Op,<A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
140
<a name="line132">132: </a> <A href="../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&scale,jj2);
141
<a name="line133">133: </a> <A href="../../../docs/manualpages/Vec/VecNorm.html#VecNorm">VecNorm</A>(jj2,NORM_INFINITY,&amax); amax *= 1.e-14;
142
<a name="line134">134: </a> <A href="../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(jj2,&y);
143
<a name="line135">135: </a> <font color="#4169E1">for</font> (j=start; j<end; j++) {
144
<a name="line136">136: </a> <font color="#4169E1">if</font> (PetscAbsScalar(y[j-start]) > amax) {
145
<a name="line137">137: </a> <A href="../../../docs/manualpages/Mat/MatSetValues.html#MatSetValues">MatSetValues</A>(*J,1,&j,1,&i,y+j-start,INSERT_VALUES);
146
<a name="line138">138: </a> }
147
<a name="line139">139: </a> }
148
<a name="line140">140: </a> <A href="../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(jj2,&y);
149
<a name="line141">141: </a> }
150
<a name="line142">142: </a> <A href="../../../docs/manualpages/Mat/MatAssemblyBegin.html#MatAssemblyBegin">MatAssemblyBegin</A>(*J,MAT_FINAL_ASSEMBLY);
151
<a name="line143">143: </a> <A href="../../../docs/manualpages/Mat/MatAssemblyEnd.html#MatAssemblyEnd">MatAssemblyEnd</A>(*J,MAT_FINAL_ASSEMBLY);
152
<a name="line144">144: </a> *flag = DIFFERENT_NONZERO_PATTERN;
154
<a name="line146">146: </a> <A href="../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(jj1);
155
<a name="line147">147: </a> <A href="../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(jj2);
156
<a name="line148">148: </a> <A href="../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(xx2);
158
<a name="line150">150: </a> <font color="#4169E1">return</font>(0);
159
<a name="line151">151: </a>}
16
<a name="line8"> 8: </a><font color="#B22222">/*@C</font>
17
<a name="line9"> 9: </a><font color="#B22222"> <A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A> - Computes the Jacobian using</font>
18
<a name="line10"> 10: </a><font color="#B22222"> finite differences and coloring to exploit matrix sparsity. </font>
19
<a name="line11"> 11: </a><font color="#B22222"> </font>
20
<a name="line12"> 12: </a><font color="#B22222"> Collective on <A href="../../../docs/manualpages/TS/TS.html#TS">TS</A>, <A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> and <A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A></font>
22
<a name="line14"> 14: </a><font color="#B22222"> Input Parameters:</font>
23
<a name="line15"> 15: </a><font color="#B22222">+ ts - nonlinear solver object</font>
24
<a name="line16"> 16: </a><font color="#B22222">. t - current time</font>
25
<a name="line17"> 17: </a><font color="#B22222">. x1 - location at which to evaluate Jacobian</font>
26
<a name="line18"> 18: </a><font color="#B22222">- ctx - coloring context, where ctx must have type <A href="../../../docs/manualpages/Mat/MatFDColoring.html#MatFDColoring">MatFDColoring</A>, </font>
27
<a name="line19"> 19: </a><font color="#B22222"> as created via <A href="../../../docs/manualpages/MatFD/MatFDColoringCreate.html#MatFDColoringCreate">MatFDColoringCreate</A>()</font>
29
<a name="line21"> 21: </a><font color="#B22222"> Output Parameters:</font>
30
<a name="line22"> 22: </a><font color="#B22222">+ J - Jacobian matrix (not altered in this routine)</font>
31
<a name="line23"> 23: </a><font color="#B22222">. B - newly computed Jacobian matrix to use with preconditioner (generally the same as J)</font>
32
<a name="line24"> 24: </a><font color="#B22222">- flag - flag indicating whether the matrix sparsity structure has changed</font>
34
<a name="line26"> 26: </a><font color="#B22222"> Options Database Keys:</font>
35
<a name="line27"> 27: </a><font color="#B22222">$ -mat_fd_coloring_freq <freq> </font>
37
<a name="line29"> 29: </a><font color="#B22222"> Level: intermediate</font>
39
<a name="line31"> 31: </a><font color="#B22222">.keywords: <A href="../../../docs/manualpages/TS/TS.html#TS">TS</A>, finite differences, Jacobian, coloring, sparse</font>
41
<a name="line33"> 33: </a><font color="#B22222">.seealso: TSSetJacobian(), <A href="../../../docs/manualpages/MatFD/MatFDColoringCreate.html#MatFDColoringCreate">MatFDColoringCreate</A>(), <A href="../../../docs/manualpages/MatFD/MatFDColoringSetFunction.html#MatFDColoringSetFunction">MatFDColoringSetFunction</A>()</font>
42
<a name="line34"> 34: </a><font color="#B22222">@*/</font>
43
<a name="line35"> 35: </a><strong><font color="#4169E1"><a name="TSDefaultComputeJacobianColor"></a>int <A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>(<A href="../../../docs/manualpages/TS/TS.html#TS">TS</A> ts,<A href="../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> t,<A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> x1,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *J,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *B,<A href="../../../docs/manualpages/Mat/MatStructure.html#MatStructure">MatStructure</A> *flag,void *ctx)</font></strong>
44
<a name="line36"> 36: </a>{
45
<a name="line37"> 37: </a> <A href="../../../docs/manualpages/Mat/MatFDColoring.html#MatFDColoring">MatFDColoring</A> color = (<A href="../../../docs/manualpages/Mat/MatFDColoring.html#MatFDColoring">MatFDColoring</A>) ctx;
46
<a name="line38"> 38: </a> <A href="../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> snes;
47
<a name="line39"> 39: </a> int ierr,freq,it;
49
<a name="line42"> 42: </a> <font color="#B22222">/*</font>
50
<a name="line43"> 43: </a><font color="#B22222"> If we are not using <A href="../../../docs/manualpages/SNES/SNES.html#SNES">SNES</A> we have no way to know the current iteration.</font>
51
<a name="line44"> 44: </a><font color="#B22222"> */</font>
52
<a name="line45"> 45: </a> <A href="../../../docs/manualpages/TS/TSGetSNES.html#TSGetSNES">TSGetSNES</A>(ts,&snes);
53
<a name="line46"> 46: </a> <font color="#4169E1">if</font> (snes) {
54
<a name="line47"> 47: </a> <A href="../../../docs/manualpages/MatFD/MatFDColoringGetFrequency.html#MatFDColoringGetFrequency">MatFDColoringGetFrequency</A>(color,&freq);
55
<a name="line48"> 48: </a> <A href="../../../docs/manualpages/SNES/SNESGetIterationNumber.html#SNESGetIterationNumber">SNESGetIterationNumber</A>(snes,&it);
57
<a name="line50"> 50: </a> <font color="#4169E1">if</font> ((freq > 1) && ((it % freq) != 1)) {
58
<a name="line51"> 51: </a> <A href="../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(color,<font color="#666666">"<A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>:Skipping Jacobian, it %d, freq %d\n"</font>,it,freq);
59
<a name="line52"> 52: </a> *flag = SAME_PRECONDITIONER;
60
<a name="line53"> 53: </a> <font color="#4169E1">return</font>(0);
61
<a name="line54"> 54: </a> } <font color="#4169E1">else</font> {
62
<a name="line55"> 55: </a> <A href="../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(color,<font color="#666666">"<A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>:Computing Jacobian, it %d, freq %d\n"</font>,it,freq);
63
<a name="line56"> 56: </a> *flag = SAME_NONZERO_PATTERN;
64
<a name="line57"> 57: </a> }
65
<a name="line58"> 58: </a> }
66
<a name="line59"> 59: </a> <A href="../../../docs/manualpages/MatFD/MatFDColoringApplyTS.html#MatFDColoringApplyTS">MatFDColoringApplyTS</A>(*B,color,t,x1,flag,ts);
67
<a name="line60"> 60: </a> <font color="#4169E1">return</font>(0);
68
<a name="line61"> 61: </a>}
70
<a name="line65"> 65: </a><font color="#B22222">/*</font>
71
<a name="line66"> 66: </a><font color="#B22222"> TSDefaultComputeJacobian - Computes the Jacobian using finite differences.</font>
73
<a name="line68"> 68: </a><font color="#B22222"> Input Parameters:</font>
74
<a name="line69"> 69: </a><font color="#B22222">+ ts - <A href="../../../docs/manualpages/TS/TS.html#TS">TS</A> context</font>
75
<a name="line70"> 70: </a><font color="#B22222">. xx1 - compute Jacobian at this point</font>
76
<a name="line71"> 71: </a><font color="#B22222">- ctx - application's function context, as set with <A href="../../../docs/manualpages/SNES/SNESSetFunction.html#SNESSetFunction">SNESSetFunction</A>()</font>
78
<a name="line73"> 73: </a><font color="#B22222"> Output Parameters:</font>
79
<a name="line74"> 74: </a><font color="#B22222">+ J - Jacobian</font>
80
<a name="line75"> 75: </a><font color="#B22222">. B - preconditioner, same as Jacobian</font>
81
<a name="line76"> 76: </a><font color="#B22222">- flag - matrix flag</font>
83
<a name="line78"> 78: </a><font color="#B22222"> Notes:</font>
84
<a name="line79"> 79: </a><font color="#B22222"> This routine is slow and expensive, and is not optimized.</font>
86
<a name="line81"> 81: </a><font color="#B22222"> Sparse approximations using colorings are also available and</font>
87
<a name="line82"> 82: </a><font color="#B22222"> would be a much better alternative!</font>
89
<a name="line84"> 84: </a><font color="#B22222"> Level: intermediate</font>
91
<a name="line86"> 86: </a><font color="#B22222">.seealso: <A href="../../../docs/manualpages/TS/TSDefaultComputeJacobianColor.html#TSDefaultComputeJacobianColor">TSDefaultComputeJacobianColor</A>()</font>
92
<a name="line87"> 87: </a><font color="#B22222">*/</font>
93
<a name="line88"> 88: </a><strong><font color="#4169E1"><a name="TSDefaultComputeJacobian"></a>int TSDefaultComputeJacobian(<A href="../../../docs/manualpages/TS/TS.html#TS">TS</A> ts,<A href="../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> t,<A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> xx1,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *J,<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *B,<A href="../../../docs/manualpages/Mat/MatStructure.html#MatStructure">MatStructure</A> *flag,void *ctx)</font></strong>
94
<a name="line89"> 89: </a>{
95
<a name="line90"> 90: </a> <A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> jj1,jj2,xx2;
96
<a name="line91"> 91: </a> int i,ierr,N,start,end,j;
97
<a name="line92"> 92: </a> <A href="../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> dx,mone = -1.0,*y,scale,*xx,wscale;
98
<a name="line93"> 93: </a> <A href="../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> amax,epsilon = PETSC_SQRT_MACHINE_EPSILON;
99
<a name="line94"> 94: </a> <A href="../../../docs/manualpages/Sys/PetscReal.html#PetscReal">PetscReal</A> dx_min = 1.e-16,dx_par = 1.e-1;
100
<a name="line95"> 95: </a> <A href="../../../docs/manualpages/Sys/MPI_Comm.html#MPI_Comm">MPI_Comm</A> <A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>;
102
<a name="line98"> 98: </a> <A href="../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(xx1,&jj1);
103
<a name="line99"> 99: </a> <A href="../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(xx1,&jj2);
104
<a name="line100">100: </a> <A href="../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(xx1,&xx2);
106
<a name="line102">102: </a> <A href="../../../docs/manualpages/Sys/PetscObjectGetComm.html#PetscObjectGetComm">PetscObjectGetComm</A>((<A href="../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)xx1,&<A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
107
<a name="line103">103: </a> <A href="../../../docs/manualpages/Mat/MatZeroEntries.html#MatZeroEntries">MatZeroEntries</A>(*J);
109
<a name="line105">105: </a> <A href="../../../docs/manualpages/Vec/VecGetSize.html#VecGetSize">VecGetSize</A>(xx1,&N);
110
<a name="line106">106: </a> <A href="../../../docs/manualpages/Vec/VecGetOwnershipRange.html#VecGetOwnershipRange">VecGetOwnershipRange</A>(xx1,&start,&end);
111
<a name="line107">107: </a> TSComputeRHSFunction(ts,ts->ptime,xx1,jj1);
113
<a name="line109">109: </a> <font color="#B22222">/* Compute Jacobian approximation, 1 column at a time.</font>
114
<a name="line110">110: </a><font color="#B22222"> xx1 = current iterate, jj1 = F(xx1)</font>
115
<a name="line111">111: </a><font color="#B22222"> xx2 = perturbed iterate, jj2 = F(xx2)</font>
116
<a name="line112">112: </a><font color="#B22222"> */</font>
117
<a name="line113">113: </a> <font color="#4169E1">for</font> (i=0; i<N; i++) {
118
<a name="line114">114: </a> <A href="../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(xx1,xx2);
119
<a name="line115">115: </a> <font color="#4169E1">if</font> (i>= start && i<end) {
120
<a name="line116">116: </a> <A href="../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(xx1,&xx);
121
<a name="line117">117: </a> dx = xx[i-start];
122
<a name="line118">118: </a> <A href="../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(xx1,&xx);
123
<a name="line119">119: </a><font color="#A020F0">#if !defined(PETSC_USE_COMPLEX)</font>
124
<a name="line120">120: </a> <font color="#4169E1">if</font> (dx < dx_min && dx >= 0.0) dx = dx_par;
125
<a name="line121">121: </a> <font color="#4169E1">else</font> <font color="#4169E1">if</font> (dx < 0.0 && dx > -dx_min) dx = -dx_par;
126
<a name="line122">122: </a><font color="#A020F0">#else</font>
127
<a name="line123">123: </a> <font color="#4169E1">if</font> (PetscAbsScalar(dx) < dx_min && PetscRealPart(dx) >= 0.0) dx = dx_par;
128
<a name="line124">124: </a> <font color="#4169E1">else</font> <font color="#4169E1">if</font> (PetscRealPart(dx) < 0.0 && PetscAbsScalar(dx) < dx_min) dx = -dx_par;
129
<a name="line125">125: </a><font color="#A020F0">#endif</font>
130
<a name="line126">126: </a> dx *= epsilon;
131
<a name="line127">127: </a> wscale = 1.0/dx;
132
<a name="line128">128: </a> <A href="../../../docs/manualpages/Vec/VecSetValues.html#VecSetValues">VecSetValues</A>(xx2,1,&i,&dx,ADD_VALUES);
133
<a name="line129">129: </a> } <font color="#4169E1">else</font> {
134
<a name="line130">130: </a> wscale = 0.0;
135
<a name="line131">131: </a> }
136
<a name="line132">132: </a> TSComputeRHSFunction(ts,t,xx2,jj2);
137
<a name="line133">133: </a> <A href="../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&mone,jj1,jj2);
138
<a name="line134">134: </a> <font color="#B22222">/* Communicate scale to all processors */</font>
139
<a name="line135">135: </a> <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allreduce.html#MPI_Allreduce">MPI_Allreduce</A>(&wscale,&scale,1,MPIU_SCALAR,PetscSum_Op,<A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
140
<a name="line136">136: </a> <A href="../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&scale,jj2);
141
<a name="line137">137: </a> <A href="../../../docs/manualpages/Vec/VecNorm.html#VecNorm">VecNorm</A>(jj2,NORM_INFINITY,&amax); amax *= 1.e-14;
142
<a name="line138">138: </a> <A href="../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(jj2,&y);
143
<a name="line139">139: </a> <font color="#4169E1">for</font> (j=start; j<end; j++) {
144
<a name="line140">140: </a> <font color="#4169E1">if</font> (PetscAbsScalar(y[j-start]) > amax) {
145
<a name="line141">141: </a> <A href="../../../docs/manualpages/Mat/MatSetValues.html#MatSetValues">MatSetValues</A>(*J,1,&j,1,&i,y+j-start,INSERT_VALUES);
146
<a name="line142">142: </a> }
147
<a name="line143">143: </a> }
148
<a name="line144">144: </a> <A href="../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(jj2,&y);
149
<a name="line145">145: </a> }
150
<a name="line146">146: </a> <A href="../../../docs/manualpages/Mat/MatAssemblyBegin.html#MatAssemblyBegin">MatAssemblyBegin</A>(*J,MAT_FINAL_ASSEMBLY);
151
<a name="line147">147: </a> <A href="../../../docs/manualpages/Mat/MatAssemblyEnd.html#MatAssemblyEnd">MatAssemblyEnd</A>(*J,MAT_FINAL_ASSEMBLY);
152
<a name="line148">148: </a> *flag = DIFFERENT_NONZERO_PATTERN;
154
<a name="line150">150: </a> <A href="../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(jj1);
155
<a name="line151">151: </a> <A href="../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(jj2);
156
<a name="line152">152: </a> <A href="../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(xx2);
158
<a name="line154">154: </a> <font color="#4169E1">return</font>(0);
159
<a name="line155">155: </a>}