~ubuntu-branches/ubuntu/warty/petsc/warty

« back to all changes in this revision

Viewing changes to src/mat/impls/adj/mpi/mpiadj.c.html

  • Committer: Bazaar Package Importer
  • Author(s): Adam C. Powell, IV
  • Date: 2004-06-07 13:41:43 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040607134143-92p586zrauvie0le
Tags: 2.2.0-2
* Upstream patch level 2.
* New PETSC_BOPT_EXTRA option for different BOPT and lib names, with _c++
  symlinks only for plain and single (closes: #249617).
* New DEBIAN_DIST=contrib option to link with hypre, parmetis (closes:
  #249619).
* Combined petsc-c and petsc-fortran substvars into petsc-compilers.
* Extra quote in -dev prerm eliminates "too many arguments" problem.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
<html>
4
4
<head>
5
5
<title></title>
6
 
<meta name="generator" content="c2html 0.9.1">
7
 
<meta name="date" content="2002-05-31T16:14:32+00:00">
 
6
<meta name="generator" content="c2html 0.9.4">
 
7
<meta name="date" content="2004-02-27T20:00:15+00:00">
8
8
</head>
9
9
 
10
10
<body bgcolor="#FFFFFF">
11
11
<pre width="80"><a name="line1">  1: </a><font color="#B22222">/*$Id: mpiadj.c,v 1.66 2001/08/07 03:02:59 balay Exp $*/</font>
12
12
 
13
13
<a name="line3">  3: </a><font color="#B22222">/*</font>
14
 
<a name="line4">  4: </a><font color="#B22222">    Defines the basic matrix operations for the ADJ adjacency list matrix data-structure.</font>
 
14
<a name="line4">  4: </a><font color="#B22222">    Defines the basic matrix operations for the ADJ adjacency list matrix data-structure. </font>
15
15
<a name="line5">  5: </a><font color="#B22222">*/</font>
16
16
<a name="line6"> 6: </a> #include <A href="../../../../../src/mat/impls/adj/mpi/mpiadj.h.html">src/mat/impls/adj/mpi/mpiadj.h</A>
17
17
<a name="line7"> 7: </a> #include <A href="../../../../../include/petscsys.h.html">petscsys.h</A>
18
18
 
19
 
<a name="line9">  9: </a><strong><font color="#4169E1"><a name="MatView_MPIAdj_ASCII"></a>int MatView_MPIAdj_ASCII(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Viewer/PetscViewer.html#PetscViewer">PetscViewer</A> viewer)</font></strong>
20
 
<a name="line10"> 10: </a>{
21
 
<a name="line11"> 11: </a>  Mat_MPIAdj        *a = (Mat_MPIAdj*)A-&gt;data;
22
 
<a name="line12"> 12: </a>  int               ierr,i,j,m = A-&gt;m;
23
 
<a name="line13"> 13: </a>  char              *name;
24
 
<a name="line14"> 14: </a>  <A href="../../../../../docs/manualpages/Viewer/PetscViewerFormat.html#PetscViewerFormat">PetscViewerFormat</A> format;
25
 
 
26
 
<a name="line17"> 17: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectGetName.html#PetscObjectGetName">PetscObjectGetName</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)A,&amp;name);
27
 
<a name="line18"> 18: </a>  PetscViewerGetFormat(viewer,&amp;format);
28
 
<a name="line19"> 19: </a>  <font color="#4169E1">if</font> (format == PETSC_VIEWER_ASCII_INFO) {
29
 
<a name="line20"> 20: </a>    <font color="#4169E1">return</font>(0);
30
 
<a name="line21"> 21: </a>  } <font color="#4169E1">else</font> <font color="#4169E1">if</font> (format == PETSC_VIEWER_ASCII_MATLAB) {
31
 
<a name="line22"> 22: </a>    <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_SUP,<font color="#666666">"Matlab format not supported"</font>);
32
 
<a name="line23"> 23: </a>  } <font color="#4169E1">else</font> {
33
 
<a name="line24"> 24: </a>    <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIIUseTabs.html#PetscViewerASCIIUseTabs">PetscViewerASCIIUseTabs</A>(viewer,PETSC_NO);
34
 
<a name="line25"> 25: </a>    <font color="#4169E1">for</font> (i=0; i&lt;m; i++) {
35
 
<a name="line26"> 26: </a>      PetscViewerASCIISynchronizedPrintf(viewer,<font color="#666666">"row %d:"</font>,i+a-&gt;rstart);
36
 
<a name="line27"> 27: </a>      <font color="#4169E1">for</font> (j=a-&gt;i[i]; j&lt;a-&gt;i[i+1]; j++) {
37
 
<a name="line28"> 28: </a>        PetscViewerASCIISynchronizedPrintf(viewer,<font color="#666666">" %d "</font>,a-&gt;j[j]);
38
 
<a name="line29"> 29: </a>      }
39
 
<a name="line30"> 30: </a>      PetscViewerASCIISynchronizedPrintf(viewer,<font color="#666666">"n"</font>);
40
 
<a name="line31"> 31: </a>    }
41
 
<a name="line32"> 32: </a>    <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIIUseTabs.html#PetscViewerASCIIUseTabs">PetscViewerASCIIUseTabs</A>(viewer,PETSC_YES);
42
 
<a name="line33"> 33: </a>  }
43
 
<a name="line34"> 34: </a>  <A href="../../../../../docs/manualpages/Viewer/PetscViewerFlush.html#PetscViewerFlush">PetscViewerFlush</A>(viewer);
44
 
<a name="line35"> 35: </a>  <font color="#4169E1">return</font>(0);
45
 
<a name="line36"> 36: </a>}
46
 
 
47
 
<a name="line38"> 38: </a><strong><font color="#4169E1"><a name="MatView_MPIAdj"></a>int MatView_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Viewer/PetscViewer.html#PetscViewer">PetscViewer</A> viewer)</font></strong>
48
 
<a name="line39"> 39: </a>{
49
 
<a name="line40"> 40: </a>  int        ierr;
50
 
<a name="line41"> 41: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> isascii;
51
 
 
52
 
<a name="line44"> 44: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTypeCompare.html#PetscTypeCompare">PetscTypeCompare</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)viewer,PETSC_VIEWER_ASCII,&amp;isascii);
53
 
<a name="line45"> 45: </a>  <font color="#4169E1">if</font> (isascii) {
54
 
<a name="line46"> 46: </a>    MatView_MPIAdj_ASCII(A,viewer);
55
 
<a name="line47"> 47: </a>  } <font color="#4169E1">else</font> {
56
 
<a name="line48"> 48: </a>    <A href="../../../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"Viewer type %s not supported by MPIAdj"</font>,((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)viewer)-&gt;type_name);
57
 
<a name="line49"> 49: </a>  }
58
 
<a name="line50"> 50: </a>  <font color="#4169E1">return</font>(0);
59
 
<a name="line51"> 51: </a>}
60
 
 
61
 
<a name="line53"> 53: </a><strong><font color="#4169E1"><a name="MatDestroy_MPIAdj"></a>int MatDestroy_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> mat)</font></strong>
62
 
<a name="line54"> 54: </a>{
63
 
<a name="line55"> 55: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)mat-&gt;data;
64
 
<a name="line56"> 56: </a>  int        ierr;
65
 
 
66
 
<a name="line59"> 59: </a><font color="#A020F0">#if defined(PETSC_USE_LOG)</font>
67
 
<a name="line60"> 60: </a>  PetscLogObjectState((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)mat,<font color="#666666">"Rows=%d, Cols=%d, NZ=%d"</font>,mat-&gt;m,mat-&gt;n,a-&gt;nz);
68
 
<a name="line61"> 61: </a><font color="#A020F0">#endif</font>
69
 
<a name="line62"> 62: </a>  <font color="#4169E1">if</font> (a-&gt;diag) {<A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;diag);}
70
 
<a name="line63"> 63: </a>  <font color="#4169E1">if</font> (a-&gt;freeaij) {
71
 
<a name="line64"> 64: </a>    <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;i);
72
 
<a name="line65"> 65: </a>    <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;j);
73
 
<a name="line66"> 66: </a>    <font color="#4169E1">if</font> (a-&gt;values) {<A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;values);}
74
 
<a name="line67"> 67: </a>  }
75
 
<a name="line68"> 68: </a>  <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;rowners);
76
 
<a name="line69"> 69: </a>  <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a);
77
 
<a name="line70"> 70: </a>  <font color="#4169E1">return</font>(0);
78
 
<a name="line71"> 71: </a>}
79
 
 
80
 
<a name="line73"> 73: </a><strong><font color="#4169E1"><a name="MatSetOption_MPIAdj"></a>int MatSetOption_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Mat/MatOption.html#MatOption">MatOption</A> op)</font></strong>
81
 
<a name="line74"> 74: </a>{
82
 
<a name="line75"> 75: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)A-&gt;data;
83
 
 
84
 
<a name="line78"> 78: </a>  <font color="#4169E1">switch</font> (op) {
85
 
<a name="line79"> 79: </a>  <font color="#4169E1">case</font> MAT_STRUCTURALLY_SYMMETRIC:
86
 
<a name="line80"> 80: </a>    a-&gt;symmetric = PETSC_TRUE;
87
 
<a name="line81"> 81: </a>    <font color="#4169E1">break</font>;
88
 
<a name="line82"> 82: </a>  <font color="#4169E1">case</font> MAT_USE_SINGLE_PRECISION_SOLVES:
89
 
<a name="line83"> 83: </a><strong><font color="#FF0000">  default:</font></strong>
90
 
<a name="line84"> 84: </a>    <A href="../../../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(A,<font color="#666666">"MatSetOption_MPIAdj:Option ignoredn"</font>);
91
 
<a name="line85"> 85: </a>    <font color="#4169E1">break</font>;
92
 
<a name="line86"> 86: </a>  }
93
 
<a name="line87"> 87: </a>  <font color="#4169E1">return</font>(0);
94
 
<a name="line88"> 88: </a>}
95
 
 
96
 
 
97
 
<a name="line91"> 91: </a><font color="#B22222">/*</font>
98
 
<a name="line92"> 92: </a><font color="#B22222">     Adds diagonal pointers to sparse matrix structure.</font>
99
 
<a name="line93"> 93: </a><font color="#B22222">*/</font>
100
 
 
101
 
<a name="line95"> 95: </a><strong><font color="#4169E1"><a name="MatMarkDiagonal_MPIAdj"></a>int MatMarkDiagonal_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A)</font></strong>
102
 
<a name="line96"> 96: </a>{
103
 
<a name="line97"> 97: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)A-&gt;data;
104
 
<a name="line98"> 98: </a>  int        i,j,*diag,m = A-&gt;m,ierr;
105
 
 
106
 
<a name="line101">101: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((m+1)*<font color="#4169E1">sizeof</font>(int),&amp;diag);
107
 
<a name="line102">102: </a>  PetscLogObjectMemory(A,(m+1)*<font color="#4169E1">sizeof</font>(int));
108
 
<a name="line103">103: </a>  <font color="#4169E1">for</font> (i=0; i&lt;A-&gt;m; i++) {
109
 
<a name="line104">104: </a>    <font color="#4169E1">for</font> (j=a-&gt;i[i]; j&lt;a-&gt;i[i+1]; j++) {
110
 
<a name="line105">105: </a>      <font color="#4169E1">if</font> (a-&gt;j[j] == i) {
111
 
<a name="line106">106: </a>        diag[i] = j;
112
 
<a name="line107">107: </a>        <font color="#4169E1">break</font>;
113
 
<a name="line108">108: </a>      }
114
 
<a name="line109">109: </a>    }
115
 
<a name="line110">110: </a>  }
116
 
<a name="line111">111: </a>  a-&gt;diag = diag;
117
 
<a name="line112">112: </a>  <font color="#4169E1">return</font>(0);
118
 
<a name="line113">113: </a>}
119
 
 
120
 
<a name="line115">115: </a><strong><font color="#4169E1"><a name="MatGetRow_MPIAdj"></a>int MatGetRow_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int row,int *nz,int **idx,<A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> **v)</font></strong>
121
 
<a name="line116">116: </a>{
122
 
<a name="line117">117: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)A-&gt;data;
123
 
<a name="line118">118: </a>  int        *itmp;
124
 
 
125
 
<a name="line121">121: </a>  row -= a-&gt;rstart;
126
 
 
127
 
<a name="line123">123: </a>  <font color="#4169E1">if</font> (row &lt; 0 || row &gt;= A-&gt;m) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_ARG_OUTOFRANGE,<font color="#666666">"Row out of range"</font>);
128
 
 
129
 
<a name="line125">125: </a>  *nz = a-&gt;i[row+1] - a-&gt;i[row];
130
 
<a name="line126">126: </a>  <font color="#4169E1">if</font> (v) *v = PETSC_NULL;
131
 
<a name="line127">127: </a>  <font color="#4169E1">if</font> (idx) {
132
 
<a name="line128">128: </a>    itmp = a-&gt;j + a-&gt;i[row];
133
 
<a name="line129">129: </a>    <font color="#4169E1">if</font> (*nz) {
134
 
<a name="line130">130: </a>      *idx = itmp;
135
 
<a name="line131">131: </a>    }
136
 
<a name="line132">132: </a>    <font color="#4169E1">else</font> *idx = 0;
137
 
<a name="line133">133: </a>  }
138
 
<a name="line134">134: </a>  <font color="#4169E1">return</font>(0);
139
 
<a name="line135">135: </a>}
140
 
 
141
 
<a name="line137">137: </a><strong><font color="#4169E1"><a name="MatRestoreRow_MPIAdj"></a>int MatRestoreRow_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int row,int *nz,int **idx,<A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> **v)</font></strong>
142
 
<a name="line138">138: </a>{
143
 
<a name="line140">140: </a>  <font color="#4169E1">return</font>(0);
144
 
<a name="line141">141: </a>}
145
 
 
146
 
<a name="line143">143: </a><strong><font color="#4169E1"><a name="MatGetBlockSize_MPIAdj"></a>int MatGetBlockSize_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int *bs)</font></strong>
147
 
<a name="line144">144: </a>{
148
 
<a name="line146">146: </a>  *bs = 1;
149
 
<a name="line147">147: </a>  <font color="#4169E1">return</font>(0);
150
 
<a name="line148">148: </a>}
151
 
 
152
 
 
153
 
<a name="line151">151: </a><strong><font color="#4169E1"><a name="MatEqual_MPIAdj"></a>int MatEqual_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A>* flg)</font></strong>
154
 
<a name="line152">152: </a>{
155
 
<a name="line153">153: </a>  Mat_MPIAdj *a = (Mat_MPIAdj *)A-&gt;data,*b = (Mat_MPIAdj *)B-&gt;data;
156
 
<a name="line154">154: </a>  int         ierr;
157
 
<a name="line155">155: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A>  flag;
158
 
 
159
 
<a name="line158">158: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTypeCompare.html#PetscTypeCompare">PetscTypeCompare</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)B,MATMPIADJ,&amp;flag);
160
 
<a name="line159">159: </a>  <font color="#4169E1">if</font> (!flag) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_ARG_INCOMP,<font color="#666666">"Matrices must be same type"</font>);
161
 
 
162
 
<a name="line161">161: </a>  <font color="#B22222">/* If the  matrix dimensions are not equal,or no of nonzeros */</font>
163
 
<a name="line162">162: </a>  <font color="#4169E1">if</font> ((A-&gt;m != B-&gt;m) ||(a-&gt;nz != b-&gt;nz)) {
164
 
<a name="line163">163: </a>    flag = PETSC_FALSE;
165
 
<a name="line164">164: </a>  }
166
 
<a name="line165">165: </a>
167
 
<a name="line166">166: </a>  <font color="#B22222">/* if the a-&gt;i are the same */</font>
168
 
<a name="line167">167: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMemcmp.html#PetscMemcmp">PetscMemcmp</A>(a-&gt;i,b-&gt;i,(A-&gt;m+1)*<font color="#4169E1">sizeof</font>(int),&amp;flag);
169
 
<a name="line168">168: </a>
170
 
<a name="line169">169: </a>  <font color="#B22222">/* if a-&gt;j are the same */</font>
171
 
<a name="line170">170: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMemcmp.html#PetscMemcmp">PetscMemcmp</A>(a-&gt;j,b-&gt;j,(a-&gt;nz)*<font color="#4169E1">sizeof</font>(int),&amp;flag);
172
 
 
173
 
<a name="line172">172: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allreduce.html#MPI_Allreduce">MPI_Allreduce</A>(&amp;flag,flg,1,MPI_INT,MPI_LAND,A-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
174
 
<a name="line173">173: </a>  <font color="#4169E1">return</font>(0);
175
 
<a name="line174">174: </a>}
176
 
 
177
 
<a name="line176">176: </a><strong><font color="#4169E1"><a name="MatGetRowIJ_MPIAdj"></a>int MatGetRowIJ_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int oshift,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> symmetric,int *m,int **ia,int **ja,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> *done)</font></strong>
178
 
<a name="line177">177: </a>{
179
 
<a name="line178">178: </a>  int        ierr,<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>,i;
180
 
<a name="line179">179: </a>  Mat_MPIAdj *a = (Mat_MPIAdj *)A-&gt;data;
181
 
 
182
 
<a name="line182">182: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Comm_size.html#MPI_Comm_size">MPI_Comm_size</A>(A-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,&amp;<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>);
183
 
<a name="line183">183: </a>  <font color="#4169E1">if</font> (<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A> &gt; 1) {*done = PETSC_FALSE; <font color="#4169E1">return</font>(0);}
184
 
<a name="line184">184: </a>  *m    = A-&gt;m;
185
 
<a name="line185">185: </a>  *ia   = a-&gt;i;
186
 
<a name="line186">186: </a>  *ja   = a-&gt;j;
187
 
<a name="line187">187: </a>  *done = PETSC_TRUE;
188
 
<a name="line188">188: </a>  <font color="#4169E1">if</font> (oshift) {
189
 
<a name="line189">189: </a>    <font color="#4169E1">for</font> (i=0; i&lt;(*ia)[*m]; i++) {
190
 
<a name="line190">190: </a>      (*ja)[i]++;
191
 
<a name="line191">191: </a>    }
192
 
<a name="line192">192: </a>    <font color="#4169E1">for</font> (i=0; i&lt;=(*m); i++) (*ia)[i]++;
193
 
<a name="line193">193: </a>  }
194
 
<a name="line194">194: </a>  <font color="#4169E1">return</font>(0);
195
 
<a name="line195">195: </a>}
196
 
 
197
 
<a name="line197">197: </a><strong><font color="#4169E1"><a name="MatRestoreRowIJ_MPIAdj"></a>int MatRestoreRowIJ_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int oshift,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> symmetric,int *m,int **ia,int **ja,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> *done)</font></strong>
198
 
<a name="line198">198: </a>{
199
 
<a name="line199">199: </a>  int        i;
200
 
<a name="line200">200: </a>  Mat_MPIAdj *a = (Mat_MPIAdj *)A-&gt;data;
201
 
 
202
 
<a name="line203">203: </a>  <font color="#4169E1">if</font> (ia &amp;&amp; a-&gt;i != *ia) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(1,<font color="#666666">"ia passed back is not one obtained with <A href="../../../../../docs/manualpages/Mat/MatGetRowIJ.html#MatGetRowIJ">MatGetRowIJ</A>()"</font>);
203
 
<a name="line204">204: </a>  <font color="#4169E1">if</font> (ja &amp;&amp; a-&gt;j != *ja) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(1,<font color="#666666">"ja passed back is not one obtained with <A href="../../../../../docs/manualpages/Mat/MatGetRowIJ.html#MatGetRowIJ">MatGetRowIJ</A>()"</font>);
204
 
<a name="line205">205: </a>  <font color="#4169E1">if</font> (oshift) {
205
 
<a name="line206">206: </a>    <font color="#4169E1">for</font> (i=0; i&lt;=(*m); i++) (*ia)[i]--;
206
 
<a name="line207">207: </a>    <font color="#4169E1">for</font> (i=0; i&lt;(*ia)[*m]; i++) {
207
 
<a name="line208">208: </a>      (*ja)[i]--;
208
 
<a name="line209">209: </a>    }
209
 
<a name="line210">210: </a>  }
210
 
<a name="line211">211: </a>  <font color="#4169E1">return</font>(0);
211
 
<a name="line212">212: </a>}
212
 
 
213
 
<a name="line214">214: </a><font color="#B22222">/* -------------------------------------------------------------------*/</font>
214
 
<a name="line215">215: </a>static <font color="#4169E1">struct _MatOps</font> MatOps_Values = {0,
215
 
<a name="line216">216: </a>       MatGetRow_MPIAdj,
216
 
<a name="line217">217: </a>       MatRestoreRow_MPIAdj,
217
 
<a name="line218">218: </a>       0,
218
 
<a name="line219">219: </a>       0,
219
 
<a name="line220">220: </a>       0,
220
 
<a name="line221">221: </a>       0,
221
 
<a name="line222">222: </a>       0,
222
 
<a name="line223">223: </a>       0,
223
 
<a name="line224">224: </a>       0,
224
 
<a name="line225">225: </a>       0,
225
 
<a name="line226">226: </a>       0,
226
 
<a name="line227">227: </a>       0,
227
 
<a name="line228">228: </a>       0,
228
 
<a name="line229">229: </a>       0,
229
 
<a name="line230">230: </a>       0,
230
 
<a name="line231">231: </a>       MatEqual_MPIAdj,
231
 
<a name="line232">232: </a>       0,
232
 
<a name="line233">233: </a>       0,
233
 
<a name="line234">234: </a>       0,
234
 
<a name="line235">235: </a>       0,
235
 
<a name="line236">236: </a>       0,
236
 
<a name="line237">237: </a>       0,
237
 
<a name="line238">238: </a>       MatSetOption_MPIAdj,
238
 
<a name="line239">239: </a>       0,
239
 
<a name="line240">240: </a>       0,
240
 
<a name="line241">241: </a>       0,
241
 
<a name="line242">242: </a>       0,
242
 
<a name="line243">243: </a>       0,
243
 
<a name="line244">244: </a>       0,
244
 
<a name="line245">245: </a>       0,
 
19
<a name="line11"> 11: </a><strong><font color="#4169E1"><a name="MatView_MPIAdj_ASCII"></a>int MatView_MPIAdj_ASCII(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Viewer/PetscViewer.html#PetscViewer">PetscViewer</A> viewer)</font></strong>
 
20
<a name="line12"> 12: </a>{
 
21
<a name="line13"> 13: </a>  Mat_MPIAdj        *a = (Mat_MPIAdj*)A-&gt;data;
 
22
<a name="line14"> 14: </a>  int               ierr,i,j,m = A-&gt;m;
 
23
<a name="line15"> 15: </a>  char              *name;
 
24
<a name="line16"> 16: </a>  <A href="../../../../../docs/manualpages/Viewer/PetscViewerFormat.html#PetscViewerFormat">PetscViewerFormat</A> format;
 
25
 
 
26
<a name="line19"> 19: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectGetName.html#PetscObjectGetName">PetscObjectGetName</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)A,&amp;name);
 
27
<a name="line20"> 20: </a>  PetscViewerGetFormat(viewer,&amp;format);
 
28
<a name="line21"> 21: </a>  <font color="#4169E1">if</font> (format == PETSC_VIEWER_ASCII_INFO) {
 
29
<a name="line22"> 22: </a>    <font color="#4169E1">return</font>(0);
 
30
<a name="line23"> 23: </a>  } <font color="#4169E1">else</font> <font color="#4169E1">if</font> (format == PETSC_VIEWER_ASCII_MATLAB) {
 
31
<a name="line24"> 24: </a>    <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_SUP,<font color="#666666">"Matlab format not supported"</font>);
 
32
<a name="line25"> 25: </a>  } <font color="#4169E1">else</font> {
 
33
<a name="line26"> 26: </a>    <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIIUseTabs.html#PetscViewerASCIIUseTabs">PetscViewerASCIIUseTabs</A>(viewer,PETSC_NO);
 
34
<a name="line27"> 27: </a>    <font color="#4169E1">for</font> (i=0; i&lt;m; i++) {
 
35
<a name="line28"> 28: </a>      <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIISynchronizedPrintf.html#PetscViewerASCIISynchronizedPrintf">PetscViewerASCIISynchronizedPrintf</A>(viewer,<font color="#666666">"row %d:"</font>,i+a-&gt;rstart);
 
36
<a name="line29"> 29: </a>      <font color="#4169E1">for</font> (j=a-&gt;i[i]; j&lt;a-&gt;i[i+1]; j++) {
 
37
<a name="line30"> 30: </a>        <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIISynchronizedPrintf.html#PetscViewerASCIISynchronizedPrintf">PetscViewerASCIISynchronizedPrintf</A>(viewer,<font color="#666666">" %d "</font>,a-&gt;j[j]);
 
38
<a name="line31"> 31: </a>      }
 
39
<a name="line32"> 32: </a>      <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIISynchronizedPrintf.html#PetscViewerASCIISynchronizedPrintf">PetscViewerASCIISynchronizedPrintf</A>(viewer,<font color="#666666">"\n"</font>);
 
40
<a name="line33"> 33: </a>    }
 
41
<a name="line34"> 34: </a>    <A href="../../../../../docs/manualpages/Viewer/PetscViewerASCIIUseTabs.html#PetscViewerASCIIUseTabs">PetscViewerASCIIUseTabs</A>(viewer,PETSC_YES);
 
42
<a name="line35"> 35: </a>  }
 
43
<a name="line36"> 36: </a>  <A href="../../../../../docs/manualpages/Viewer/PetscViewerFlush.html#PetscViewerFlush">PetscViewerFlush</A>(viewer);
 
44
<a name="line37"> 37: </a>  <font color="#4169E1">return</font>(0);
 
45
<a name="line38"> 38: </a>}
 
46
 
 
47
<a name="line42"> 42: </a><strong><font color="#4169E1"><a name="MatView_MPIAdj"></a>int MatView_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Viewer/PetscViewer.html#PetscViewer">PetscViewer</A> viewer)</font></strong>
 
48
<a name="line43"> 43: </a>{
 
49
<a name="line44"> 44: </a>  int        ierr;
 
50
<a name="line45"> 45: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> isascii;
 
51
 
 
52
<a name="line48"> 48: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTypeCompare.html#PetscTypeCompare">PetscTypeCompare</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)viewer,PETSC_VIEWER_ASCII,&amp;isascii);
 
53
<a name="line49"> 49: </a>  <font color="#4169E1">if</font> (isascii) {
 
54
<a name="line50"> 50: </a>    MatView_MPIAdj_ASCII(A,viewer);
 
55
<a name="line51"> 51: </a>  } <font color="#4169E1">else</font> {
 
56
<a name="line52"> 52: </a>    <A href="../../../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"Viewer type %s not supported by MPIAdj"</font>,((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)viewer)-&gt;type_name);
 
57
<a name="line53"> 53: </a>  }
 
58
<a name="line54"> 54: </a>  <font color="#4169E1">return</font>(0);
 
59
<a name="line55"> 55: </a>}
 
60
 
 
61
<a name="line59"> 59: </a><strong><font color="#4169E1"><a name="MatDestroy_MPIAdj"></a>int MatDestroy_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> mat)</font></strong>
 
62
<a name="line60"> 60: </a>{
 
63
<a name="line61"> 61: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)mat-&gt;data;
 
64
<a name="line62"> 62: </a>  int        ierr;
 
65
 
 
66
<a name="line65"> 65: </a><font color="#A020F0">#if defined(PETSC_USE_LOG)</font>
 
67
<a name="line66"> 66: </a>  PetscLogObjectState((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)mat,<font color="#666666">"Rows=%d, Cols=%d, NZ=%d"</font>,mat-&gt;m,mat-&gt;n,a-&gt;nz);
 
68
<a name="line67"> 67: </a><font color="#A020F0">#endif</font>
 
69
<a name="line68"> 68: </a>  <font color="#4169E1">if</font> (a-&gt;diag) {<A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;diag);}
 
70
<a name="line69"> 69: </a>  <font color="#4169E1">if</font> (a-&gt;freeaij) {
 
71
<a name="line70"> 70: </a>    <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;i);
 
72
<a name="line71"> 71: </a>    <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;j);
 
73
<a name="line72"> 72: </a>    <font color="#4169E1">if</font> (a-&gt;values) {<A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;values);}
 
74
<a name="line73"> 73: </a>  }
 
75
<a name="line74"> 74: </a>  <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a-&gt;rowners);
 
76
<a name="line75"> 75: </a>  <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(a);
 
77
<a name="line76"> 76: </a>  <font color="#4169E1">return</font>(0);
 
78
<a name="line77"> 77: </a>}
 
79
 
 
80
<a name="line81"> 81: </a><strong><font color="#4169E1"><a name="MatSetOption_MPIAdj"></a>int MatSetOption_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Mat/MatOption.html#MatOption">MatOption</A> op)</font></strong>
 
81
<a name="line82"> 82: </a>{
 
82
<a name="line83"> 83: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)A-&gt;data;
 
83
 
 
84
<a name="line86"> 86: </a>  <font color="#4169E1">switch</font> (op) {
 
85
<a name="line87"> 87: </a>  <font color="#4169E1">case</font> MAT_SYMMETRIC:
 
86
<a name="line88"> 88: </a>  <font color="#4169E1">case</font> MAT_STRUCTURALLY_SYMMETRIC:
 
87
<a name="line89"> 89: </a>  <font color="#4169E1">case</font> MAT_HERMITIAN:
 
88
<a name="line90"> 90: </a>    a-&gt;symmetric = PETSC_TRUE;
 
89
<a name="line91"> 91: </a>    <font color="#4169E1">break</font>;
 
90
<a name="line92"> 92: </a>  <font color="#4169E1">case</font> MAT_NOT_SYMMETRIC:
 
91
<a name="line93"> 93: </a>  <font color="#4169E1">case</font> MAT_NOT_STRUCTURALLY_SYMMETRIC:
 
92
<a name="line94"> 94: </a>  <font color="#4169E1">case</font> MAT_NOT_HERMITIAN:
 
93
<a name="line95"> 95: </a>    a-&gt;symmetric = PETSC_FALSE;
 
94
<a name="line96"> 96: </a>    <font color="#4169E1">break</font>;
 
95
<a name="line97"> 97: </a>  <font color="#4169E1">case</font> MAT_SYMMETRY_ETERNAL:
 
96
<a name="line98"> 98: </a>  <font color="#4169E1">case</font> MAT_NOT_SYMMETRY_ETERNAL:
 
97
<a name="line99"> 99: </a>    <font color="#4169E1">break</font>;
 
98
<a name="line100">100: </a><strong><font color="#FF0000">  default:</font></strong>
 
99
<a name="line101">101: </a>    <A href="../../../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(A,<font color="#666666">"MatSetOption_MPIAdj:Option ignored\n"</font>);
 
100
<a name="line102">102: </a>    <font color="#4169E1">break</font>;
 
101
<a name="line103">103: </a>  }
 
102
<a name="line104">104: </a>  <font color="#4169E1">return</font>(0);
 
103
<a name="line105">105: </a>}
 
104
 
 
105
 
 
106
<a name="line108">108: </a><font color="#B22222">/*</font>
 
107
<a name="line109">109: </a><font color="#B22222">     Adds diagonal pointers to sparse matrix structure.</font>
 
108
<a name="line110">110: </a><font color="#B22222">*/</font>
 
109
 
 
110
<a name="line114">114: </a><strong><font color="#4169E1"><a name="MatMarkDiagonal_MPIAdj"></a>int MatMarkDiagonal_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A)</font></strong>
 
111
<a name="line115">115: </a>{
 
112
<a name="line116">116: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)A-&gt;data;
 
113
<a name="line117">117: </a>  int        i,j,*diag,m = A-&gt;m,ierr;
 
114
 
 
115
<a name="line120">120: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((m+1)*<font color="#4169E1">sizeof</font>(int),&amp;diag);
 
116
<a name="line121">121: </a>  PetscLogObjectMemory(A,(m+1)*<font color="#4169E1">sizeof</font>(int));
 
117
<a name="line122">122: </a>  <font color="#4169E1">for</font> (i=0; i&lt;A-&gt;m; i++) {
 
118
<a name="line123">123: </a>    <font color="#4169E1">for</font> (j=a-&gt;i[i]; j&lt;a-&gt;i[i+1]; j++) {
 
119
<a name="line124">124: </a>      <font color="#4169E1">if</font> (a-&gt;j[j] == i) {
 
120
<a name="line125">125: </a>        diag[i] = j;
 
121
<a name="line126">126: </a>        <font color="#4169E1">break</font>;
 
122
<a name="line127">127: </a>      }
 
123
<a name="line128">128: </a>    }
 
124
<a name="line129">129: </a>  }
 
125
<a name="line130">130: </a>  a-&gt;diag = diag;
 
126
<a name="line131">131: </a>  <font color="#4169E1">return</font>(0);
 
127
<a name="line132">132: </a>}
 
128
 
 
129
<a name="line136">136: </a><strong><font color="#4169E1"><a name="MatGetRow_MPIAdj"></a>int MatGetRow_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int row,int *nz,int **idx,<A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> **v)</font></strong>
 
130
<a name="line137">137: </a>{
 
131
<a name="line138">138: </a>  Mat_MPIAdj *a = (Mat_MPIAdj*)A-&gt;data;
 
132
<a name="line139">139: </a>  int        *itmp;
 
133
 
 
134
<a name="line142">142: </a>  row -= a-&gt;rstart;
 
135
 
 
136
<a name="line144">144: </a>  <font color="#4169E1">if</font> (row &lt; 0 || row &gt;= A-&gt;m) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_ARG_OUTOFRANGE,<font color="#666666">"Row out of range"</font>);
 
137
 
 
138
<a name="line146">146: </a>  *nz = a-&gt;i[row+1] - a-&gt;i[row];
 
139
<a name="line147">147: </a>  <font color="#4169E1">if</font> (v) *v = <A href="../../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>;
 
140
<a name="line148">148: </a>  <font color="#4169E1">if</font> (idx) {
 
141
<a name="line149">149: </a>    itmp = a-&gt;j + a-&gt;i[row];
 
142
<a name="line150">150: </a>    <font color="#4169E1">if</font> (*nz) {
 
143
<a name="line151">151: </a>      *idx = itmp;
 
144
<a name="line152">152: </a>    }
 
145
<a name="line153">153: </a>    <font color="#4169E1">else</font> *idx = 0;
 
146
<a name="line154">154: </a>  }
 
147
<a name="line155">155: </a>  <font color="#4169E1">return</font>(0);
 
148
<a name="line156">156: </a>}
 
149
 
 
150
<a name="line160">160: </a><strong><font color="#4169E1"><a name="MatRestoreRow_MPIAdj"></a>int MatRestoreRow_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int row,int *nz,int **idx,<A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> **v)</font></strong>
 
151
<a name="line161">161: </a>{
 
152
<a name="line163">163: </a>  <font color="#4169E1">return</font>(0);
 
153
<a name="line164">164: </a>}
 
154
 
 
155
<a name="line168">168: </a><strong><font color="#4169E1"><a name="MatGetBlockSize_MPIAdj"></a>int MatGetBlockSize_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int *bs)</font></strong>
 
156
<a name="line169">169: </a>{
 
157
<a name="line171">171: </a>  *bs = 1;
 
158
<a name="line172">172: </a>  <font color="#4169E1">return</font>(0);
 
159
<a name="line173">173: </a>}
 
160
 
 
161
 
 
162
<a name="line178">178: </a><strong><font color="#4169E1"><a name="MatEqual_MPIAdj"></a>int MatEqual_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A>* flg)</font></strong>
 
163
<a name="line179">179: </a>{
 
164
<a name="line180">180: </a>  Mat_MPIAdj *a = (Mat_MPIAdj *)A-&gt;data,*b = (Mat_MPIAdj *)B-&gt;data;
 
165
<a name="line181">181: </a>  int         ierr;
 
166
<a name="line182">182: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A>  flag;
 
167
 
 
168
<a name="line185">185: </a>  <font color="#B22222">/* If the  matrix dimensions are not equal,or no of nonzeros */</font>
 
169
<a name="line186">186: </a>  <font color="#4169E1">if</font> ((A-&gt;m != B-&gt;m) ||(a-&gt;nz != b-&gt;nz)) {
 
170
<a name="line187">187: </a>    flag = PETSC_FALSE;
 
171
<a name="line188">188: </a>  }
 
172
<a name="line189">189: </a>
 
173
<a name="line190">190: </a>  <font color="#B22222">/* if the a-&gt;i are the same */</font>
 
174
<a name="line191">191: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMemcmp.html#PetscMemcmp">PetscMemcmp</A>(a-&gt;i,b-&gt;i,(A-&gt;m+1)*<font color="#4169E1">sizeof</font>(int),&amp;flag);
 
175
<a name="line192">192: </a>
 
176
<a name="line193">193: </a>  <font color="#B22222">/* if a-&gt;j are the same */</font>
 
177
<a name="line194">194: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMemcmp.html#PetscMemcmp">PetscMemcmp</A>(a-&gt;j,b-&gt;j,(a-&gt;nz)*<font color="#4169E1">sizeof</font>(int),&amp;flag);
 
178
 
 
179
<a name="line196">196: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allreduce.html#MPI_Allreduce">MPI_Allreduce</A>(&amp;flag,flg,1,MPI_INT,MPI_LAND,A-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
 
180
<a name="line197">197: </a>  <font color="#4169E1">return</font>(0);
 
181
<a name="line198">198: </a>}
 
182
 
 
183
<a name="line202">202: </a><strong><font color="#4169E1"><a name="MatGetRowIJ_MPIAdj"></a>int MatGetRowIJ_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int oshift,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> symmetric,int *m,int *ia[],int *ja[],<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> *done)</font></strong>
 
184
<a name="line203">203: </a>{
 
185
<a name="line204">204: </a>  int        ierr,<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>,i;
 
186
<a name="line205">205: </a>  Mat_MPIAdj *a = (Mat_MPIAdj *)A-&gt;data;
 
187
 
 
188
<a name="line208">208: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Comm_size.html#MPI_Comm_size">MPI_Comm_size</A>(A-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,&amp;<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>);
 
189
<a name="line209">209: </a>  <font color="#4169E1">if</font> (<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A> &gt; 1) {*done = PETSC_FALSE; <font color="#4169E1">return</font>(0);}
 
190
<a name="line210">210: </a>  *m    = A-&gt;m;
 
191
<a name="line211">211: </a>  *ia   = a-&gt;i;
 
192
<a name="line212">212: </a>  *ja   = a-&gt;j;
 
193
<a name="line213">213: </a>  *done = PETSC_TRUE;
 
194
<a name="line214">214: </a>  <font color="#4169E1">if</font> (oshift) {
 
195
<a name="line215">215: </a>    <font color="#4169E1">for</font> (i=0; i&lt;(*ia)[*m]; i++) {
 
196
<a name="line216">216: </a>      (*ja)[i]++;
 
197
<a name="line217">217: </a>    }
 
198
<a name="line218">218: </a>    <font color="#4169E1">for</font> (i=0; i&lt;=(*m); i++) (*ia)[i]++;
 
199
<a name="line219">219: </a>  }
 
200
<a name="line220">220: </a>  <font color="#4169E1">return</font>(0);
 
201
<a name="line221">221: </a>}
 
202
 
 
203
<a name="line225">225: </a><strong><font color="#4169E1"><a name="MatRestoreRowIJ_MPIAdj"></a>int MatRestoreRowIJ_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,int oshift,<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> symmetric,int *m,int *ia[],int *ja[],<A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> *done)</font></strong>
 
204
<a name="line226">226: </a>{
 
205
<a name="line227">227: </a>  int        i;
 
206
<a name="line228">228: </a>  Mat_MPIAdj *a = (Mat_MPIAdj *)A-&gt;data;
 
207
 
 
208
<a name="line231">231: </a>  <font color="#4169E1">if</font> (ia &amp;&amp; a-&gt;i != *ia) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(1,<font color="#666666">"ia passed back is not one obtained with <A href="../../../../../docs/manualpages/Mat/MatGetRowIJ.html#MatGetRowIJ">MatGetRowIJ</A>()"</font>);
 
209
<a name="line232">232: </a>  <font color="#4169E1">if</font> (ja &amp;&amp; a-&gt;j != *ja) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(1,<font color="#666666">"ja passed back is not one obtained with <A href="../../../../../docs/manualpages/Mat/MatGetRowIJ.html#MatGetRowIJ">MatGetRowIJ</A>()"</font>);
 
210
<a name="line233">233: </a>  <font color="#4169E1">if</font> (oshift) {
 
211
<a name="line234">234: </a>    <font color="#4169E1">for</font> (i=0; i&lt;=(*m); i++) (*ia)[i]--;
 
212
<a name="line235">235: </a>    <font color="#4169E1">for</font> (i=0; i&lt;(*ia)[*m]; i++) {
 
213
<a name="line236">236: </a>      (*ja)[i]--;
 
214
<a name="line237">237: </a>    }
 
215
<a name="line238">238: </a>  }
 
216
<a name="line239">239: </a>  <font color="#4169E1">return</font>(0);
 
217
<a name="line240">240: </a>}
 
218
 
 
219
<a name="line242">242: </a><font color="#B22222">/* -------------------------------------------------------------------*/</font>
 
220
<a name="line243">243: </a>static <font color="#4169E1">struct _MatOps</font> MatOps_Values = {0,
 
221
<a name="line244">244: </a>       MatGetRow_MPIAdj,
 
222
<a name="line245">245: </a>       MatRestoreRow_MPIAdj,
245
223
<a name="line246">246: </a>       0,
246
 
<a name="line247">247: </a>       0,
 
224
<a name="line247">247: </a><font color="#B22222">/* 4*/</font> 0,
247
225
<a name="line248">248: </a>       0,
248
226
<a name="line249">249: </a>       0,
249
227
<a name="line250">250: </a>       0,
250
228
<a name="line251">251: </a>       0,
251
229
<a name="line252">252: </a>       0,
252
 
<a name="line253">253: </a>       0,
 
230
<a name="line253">253: </a><font color="#B22222">/*10*/</font> 0,
253
231
<a name="line254">254: </a>       0,
254
232
<a name="line255">255: </a>       0,
255
233
<a name="line256">256: </a>       0,
256
234
<a name="line257">257: </a>       0,
257
 
<a name="line258">258: </a>       0,
258
 
<a name="line259">259: </a>       0,
 
235
<a name="line258">258: </a><font color="#B22222">/*15*/</font> 0,
 
236
<a name="line259">259: </a>       MatEqual_MPIAdj,
259
237
<a name="line260">260: </a>       0,
260
238
<a name="line261">261: </a>       0,
261
239
<a name="line262">262: </a>       0,
262
 
<a name="line263">263: </a>       0,
 
240
<a name="line263">263: </a><font color="#B22222">/*20*/</font> 0,
263
241
<a name="line264">264: </a>       0,
264
 
<a name="line265">265: </a>       MatGetBlockSize_MPIAdj,
265
 
<a name="line266">266: </a>       MatGetRowIJ_MPIAdj,
266
 
<a name="line267">267: </a>       MatRestoreRowIJ_MPIAdj,
267
 
<a name="line268">268: </a>       0,
 
242
<a name="line265">265: </a>       0,
 
243
<a name="line266">266: </a>       MatSetOption_MPIAdj,
 
244
<a name="line267">267: </a>       0,
 
245
<a name="line268">268: </a><font color="#B22222">/*25*/</font> 0,
268
246
<a name="line269">269: </a>       0,
269
247
<a name="line270">270: </a>       0,
270
248
<a name="line271">271: </a>       0,
271
249
<a name="line272">272: </a>       0,
272
 
<a name="line273">273: </a>       0,
 
250
<a name="line273">273: </a><font color="#B22222">/*30*/</font> 0,
273
251
<a name="line274">274: </a>       0,
274
252
<a name="line275">275: </a>       0,
275
 
<a name="line276">276: </a>       MatDestroy_MPIAdj,
276
 
<a name="line277">277: </a>       MatView_MPIAdj,
277
 
<a name="line278">278: </a>       MatGetPetscMaps_Petsc};
278
 
 
279
 
 
280
 
<a name="line281">281: </a><strong><font color="#4169E1"><a name="MatCreate_MPIAdj"></a>EXTERN_C_BEGIN</font></strong>
281
 
<a name="line282">282: </a><strong><font color="#4169E1">int MatCreate_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B)</font></strong>
282
 
<a name="line283">283: </a>{
283
 
<a name="line284">284: </a>  Mat_MPIAdj *b;
284
 
<a name="line285">285: </a>  int        ii,ierr,<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>,<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>;
285
 
 
286
 
<a name="line288">288: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Comm_size.html#MPI_Comm_size">MPI_Comm_size</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,&amp;<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>);
287
 
<a name="line289">289: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Comm_rank.html#MPI_Comm_rank">MPI_Comm_rank</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,&amp;<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>);
288
 
 
289
 
<a name="line291">291: </a>  ierr                = <A href="../../../../../docs/manualpages/Sys/PetscNew.html#PetscNew">PetscNew</A>(Mat_MPIAdj,&amp;b);
290
 
<a name="line292">292: </a>  B-&gt;data             = (void*)b;
291
 
<a name="line293">293: </a>  ierr                = <A href="../../../../../docs/manualpages/Sys/PetscMemzero.html#PetscMemzero">PetscMemzero</A>(b,<font color="#4169E1">sizeof</font>(Mat_MPIAdj));
292
 
<a name="line294">294: </a>  ierr                = <A href="../../../../../docs/manualpages/Sys/PetscMemcpy.html#PetscMemcpy">PetscMemcpy</A>(B-&gt;ops,&amp;MatOps_Values,<font color="#4169E1">sizeof</font>(<font color="#4169E1">struct _MatOps</font>));
293
 
<a name="line295">295: </a>  B-&gt;factor           = 0;
294
 
<a name="line296">296: </a>  B-&gt;lupivotthreshold = 1.0;
295
 
<a name="line297">297: </a>  B-&gt;mapping          = 0;
296
 
<a name="line298">298: </a>  B-&gt;assembled        = PETSC_FALSE;
297
 
<a name="line299">299: </a>
298
 
<a name="line300">300: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allreduce.html#MPI_Allreduce">MPI_Allreduce</A>(&amp;B-&gt;m,&amp;B-&gt;<A href="../../../../../docs/manualpages/Vec/M.html#M">M</A>,1,MPI_INT,MPI_SUM,B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
299
 
<a name="line301">301: </a>  B-&gt;n = B-&gt;N;
300
 
 
301
 
<a name="line303">303: </a>  <font color="#B22222">/* the information in the maps duplicates the information computed below, eventually </font>
302
 
<a name="line304">304: </a><font color="#B22222">     we should remove the duplicate information that is not contained in the maps */</font>
303
 
<a name="line305">305: </a>  <A href="../../../../../docs/manualpages/Vec/PetscMapCreateMPI.html#PetscMapCreateMPI">PetscMapCreateMPI</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,B-&gt;m,B-&gt;<A href="../../../../../docs/manualpages/Vec/M.html#M">M</A>,&amp;B-&gt;rmap);
304
 
<a name="line306">306: </a>  <font color="#B22222">/* we don't know the "local columns" so just use the row information :-(*/</font>
305
 
<a name="line307">307: </a>  <A href="../../../../../docs/manualpages/Vec/PetscMapCreateMPI.html#PetscMapCreateMPI">PetscMapCreateMPI</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,B-&gt;m,B-&gt;<A href="../../../../../docs/manualpages/Vec/M.html#M">M</A>,&amp;B-&gt;cmap);
306
 
 
307
 
<a name="line309">309: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>+1)*<font color="#4169E1">sizeof</font>(int),&amp;b-&gt;rowners);
308
 
<a name="line310">310: </a>  PetscLogObjectMemory(B,(<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>+2)*<font color="#4169E1">sizeof</font>(int)+<font color="#4169E1">sizeof</font>(<font color="#4169E1">struct _p_Mat</font>)+<font color="#4169E1">sizeof</font>(Mat_MPIAdj));
309
 
<a name="line311">311: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allgather.html#MPI_Allgather">MPI_Allgather</A>(&amp;B-&gt;m,1,MPI_INT,b-&gt;rowners+1,1,MPI_INT,B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
310
 
<a name="line312">312: </a>  b-&gt;rowners[0] = 0;
311
 
<a name="line313">313: </a>  <font color="#4169E1">for</font> (ii=2; ii&lt;=<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>; ii++) {
312
 
<a name="line314">314: </a>    b-&gt;rowners[ii] += b-&gt;rowners[ii-1];
313
 
<a name="line315">315: </a>  }
314
 
<a name="line316">316: </a>  b-&gt;rstart = b-&gt;rowners[<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>];
315
 
<a name="line317">317: </a>  b-&gt;rend   = b-&gt;rowners[<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>+1];
316
 
 
317
 
<a name="line319">319: </a>  <font color="#4169E1">return</font>(0);
318
 
<a name="line320">320: </a>}
319
 
<a name="line321">321: </a><strong><font color="#4169E1"><a name="MatMPIAdjSetPreallocation"></a>EXTERN_C_END</font></strong>
320
 
 
321
 
<a name="line323">323: </a><strong><font color="#4169E1">int MatMPIAdjSetPreallocation(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B,int *i,int *j,int *values)</font></strong>
322
 
<a name="line324">324: </a>{
323
 
<a name="line325">325: </a>  Mat_MPIAdj *b = (Mat_MPIAdj *)B-&gt;data;
324
 
<a name="line326">326: </a>  int        ierr;
325
 
<a name="line327">327: </a><font color="#A020F0">#if defined(PETSC_USE_BOPT_g)</font>
326
 
<a name="line328">328: </a>  int        ii;
327
 
<a name="line329">329: </a><font color="#A020F0">#endif</font>
328
 
 
329
 
<a name="line332">332: </a>  B-&gt;preallocated = PETSC_TRUE;
330
 
<a name="line333">333: </a><font color="#A020F0">#if defined(PETSC_USE_BOPT_g)</font>
331
 
<a name="line334">334: </a>  <font color="#4169E1">if</font> (i[0] != 0) <A href="../../../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"First i[] index must be zero, instead it is %dn"</font>,i[0]);
332
 
<a name="line335">335: </a>  <font color="#4169E1">for</font> (ii=1; ii&lt;B-&gt;m; ii++) {
333
 
<a name="line336">336: </a>    <font color="#4169E1">if</font> (i[ii] &lt; 0 || i[ii] &lt; i[ii-1]) {
334
 
<a name="line337">337: </a>      SETERRQ4(1,<font color="#666666">"i[%d]=%d index is out of range: i[%d]=%d"</font>,ii,i[ii],ii-1,i[ii-1]);
335
 
<a name="line338">338: </a>    }
336
 
<a name="line339">339: </a>  }
337
 
<a name="line340">340: </a>  <font color="#4169E1">for</font> (ii=0; ii&lt;i[B-&gt;m]; ii++) {
338
 
<a name="line341">341: </a>    <font color="#4169E1">if</font> (j[ii] &lt; 0 || j[ii] &gt;= B-&gt;N) {
339
 
<a name="line342">342: </a>      <A href="../../../../../docs/manualpages/Sys/SETERRQ2.html#SETERRQ2">SETERRQ2</A>(1,<font color="#666666">"Column index %d out of range %dn"</font>,ii,j[ii]);
340
 
<a name="line343">343: </a>    }
341
 
<a name="line344">344: </a>  }
342
 
<a name="line345">345: </a><font color="#A020F0">#endif</font>
343
 
 
344
 
<a name="line347">347: </a>  b-&gt;j      = j;
345
 
<a name="line348">348: </a>  b-&gt;i      = i;
346
 
<a name="line349">349: </a>  b-&gt;values = values;
347
 
 
348
 
<a name="line351">351: </a>  b-&gt;nz               = i[B-&gt;m];
349
 
<a name="line352">352: </a>  b-&gt;diag             = 0;
350
 
<a name="line353">353: </a>  b-&gt;symmetric        = PETSC_FALSE;
351
 
<a name="line354">354: </a>  b-&gt;freeaij          = PETSC_TRUE;
352
 
 
353
 
<a name="line356">356: </a>  <A href="../../../../../docs/manualpages/Mat/MatAssemblyBegin.html#MatAssemblyBegin">MatAssemblyBegin</A>(B,MAT_FINAL_ASSEMBLY);
354
 
<a name="line357">357: </a>  <A href="../../../../../docs/manualpages/Mat/MatAssemblyEnd.html#MatAssemblyEnd">MatAssemblyEnd</A>(B,MAT_FINAL_ASSEMBLY);
355
 
<a name="line358">358: </a>  <font color="#4169E1">return</font>(0);
356
 
<a name="line359">359: </a>}
357
 
 
358
 
<a name="line361">361: </a><font color="#B22222">/*@C</font>
359
 
<a name="line362">362: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A> - Creates a sparse matrix representing an adjacency list.</font>
360
 
<a name="line363">363: </a><font color="#B22222">   The matrix does not have numerical values associated with it, but is</font>
361
 
<a name="line364">364: </a><font color="#B22222">   intended for ordering (to reduce bandwidth etc) and partitioning.</font>
362
 
 
363
 
<a name="line366">366: </a><font color="#B22222">   Collective on MPI_Comm</font>
364
 
 
365
 
<a name="line368">368: </a><font color="#B22222">   Input Parameters:</font>
366
 
<a name="line369">369: </a><font color="#B22222">+  <A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A> - MPI communicator</font>
367
 
<a name="line370">370: </a><font color="#B22222">.  m - number of local rows</font>
368
 
<a name="line371">371: </a><font color="#B22222">.  n - number of columns</font>
369
 
<a name="line372">372: </a><font color="#B22222">.  i - the indices into j for the start of each row</font>
370
 
<a name="line373">373: </a><font color="#B22222">.  j - the column indices for each row (sorted for each row).</font>
371
 
<a name="line374">374: </a><font color="#B22222">       The indices in i and j start with zero (NOT with one).</font>
372
 
<a name="line375">375: </a><font color="#B22222">-  values -[optional] edge weights</font>
373
 
 
374
 
<a name="line377">377: </a><font color="#B22222">   Output Parameter:</font>
375
 
<a name="line378">378: </a><font color="#B22222">.  A - the matrix </font>
376
 
 
377
 
<a name="line380">380: </a><font color="#B22222">   Level: intermediate</font>
378
 
 
379
 
<a name="line382">382: </a><font color="#B22222">   Notes: This matrix object does not support most matrix operations, include</font>
380
 
<a name="line383">383: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/Mat/MatSetValues.html#MatSetValues">MatSetValues</A>().</font>
381
 
<a name="line384">384: </a><font color="#B22222">   You must NOT free the ii, values and jj arrays yourself. PETSc will free them</font>
382
 
<a name="line385">385: </a><font color="#B22222">   when the matrix is destroyed. And you must allocate them with <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>(). If you </font>
383
 
<a name="line386">386: </a><font color="#B22222">    call from Fortran you need not create the arrays with <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>().</font>
384
 
<a name="line387">387: </a><font color="#B22222">   Should not include the matrix diagonals.</font>
385
 
 
386
 
<a name="line389">389: </a><font color="#B22222">   Possible values for <A href="../../../../../docs/manualpages/Mat/MatSetOption.html#MatSetOption">MatSetOption</A>() - MAT_STRUCTURALLY_SYMMETRIC</font>
387
 
 
388
 
<a name="line391">391: </a><font color="#B22222">.seealso: <A href="../../../../../docs/manualpages/Mat/MatCreate.html#MatCreate">MatCreate</A>(), MatCreateSeqAdj(), <A href="../../../../../docs/manualpages/MatOrderings/MatGetOrdering.html#MatGetOrdering">MatGetOrdering</A>()</font>
389
 
<a name="line392">392: </a><font color="#B22222">@*/</font>
390
 
<a name="line393">393: </a><strong><font color="#4169E1"><a name="MatCreateMPIAdj"></a>int <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A>(MPI_Comm <A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,int m,int n,int *i,int *j,int *values,<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *A)</font></strong>
391
 
<a name="line394">394: </a>{
392
 
<a name="line395">395: </a>  int        ierr;
393
 
 
394
 
<a name="line398">398: </a>  <A href="../../../../../docs/manualpages/Mat/MatCreate.html#MatCreate">MatCreate</A>(<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,m,n,PETSC_DETERMINE,n,A);
395
 
<a name="line399">399: </a>  <A href="../../../../../docs/manualpages/Mat/MatSetType.html#MatSetType">MatSetType</A>(*A,MATMPIADJ);
396
 
<a name="line400">400: </a>  MatMPIAdjSetPreallocation(*A,i,j,values);
397
 
<a name="line401">401: </a>  <font color="#4169E1">return</font>(0);
398
 
<a name="line402">402: </a>}
399
 
 
400
 
<a name="line404">404: </a><strong><font color="#4169E1"><a name="MatConvertTo_MPIAdj"></a>EXTERN_C_BEGIN</font></strong>
401
 
<a name="line405">405: </a><strong><font color="#4169E1">int MatConvertTo_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Mat/MatType.html#MatType">MatType</A> type,<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *B)</font></strong>
402
 
<a name="line406">406: </a>{
403
 
<a name="line407">407: </a>  int          i,ierr,m,N,nzeros = 0,*ia,*ja,*rj,len,rstart,cnt,j,*a;
404
 
<a name="line408">408: </a>  <A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A>  *ra;
405
 
<a name="line409">409: </a>  MPI_Comm     <A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>;
406
 
 
407
 
<a name="line412">412: </a>  <A href="../../../../../docs/manualpages/Mat/MatGetSize.html#MatGetSize">MatGetSize</A>(A,PETSC_NULL,&amp;N);
408
 
<a name="line413">413: </a>  <A href="../../../../../docs/manualpages/Mat/MatGetLocalSize.html#MatGetLocalSize">MatGetLocalSize</A>(A,&amp;m,PETSC_NULL);
409
 
<a name="line414">414: </a>  <A href="../../../../../docs/manualpages/Mat/MatGetOwnershipRange.html#MatGetOwnershipRange">MatGetOwnershipRange</A>(A,&amp;rstart,PETSC_NULL);
410
 
<a name="line415">415: </a>
411
 
<a name="line416">416: </a>  <font color="#B22222">/* count the number of nonzeros per row */</font>
412
 
<a name="line417">417: </a>  <font color="#4169E1">for</font> (i=0; i&lt;m; i++) {
413
 
<a name="line418">418: </a>    ierr   = <A href="../../../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(A,i+rstart,&amp;len,&amp;rj,PETSC_NULL);
414
 
<a name="line419">419: </a>    <font color="#4169E1">for</font> (j=0; j&lt;len; j++) {
415
 
<a name="line420">420: </a>      <font color="#4169E1">if</font> (rj[j] == i+rstart) {len--; <font color="#4169E1">break</font>;}    <font color="#B22222">/* don't count diagonal */</font>
416
 
<a name="line421">421: </a>    }
417
 
<a name="line422">422: </a>    ierr   = <A href="../../../../../docs/manualpages/Mat/MatRestoreRow.html#MatRestoreRow">MatRestoreRow</A>(A,i+rstart,&amp;len,&amp;rj,PETSC_NULL);
418
 
<a name="line423">423: </a>    nzeros += len;
419
 
<a name="line424">424: </a>  }
420
 
 
421
 
<a name="line426">426: </a>  <font color="#B22222">/* malloc space for nonzeros */</font>
422
 
<a name="line427">427: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((nzeros+1)*<font color="#4169E1">sizeof</font>(int),&amp;a);
423
 
<a name="line428">428: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((N+1)*<font color="#4169E1">sizeof</font>(int),&amp;ia);
424
 
<a name="line429">429: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((nzeros+1)*<font color="#4169E1">sizeof</font>(int),&amp;ja);
425
 
 
426
 
<a name="line431">431: </a>  nzeros = 0;
427
 
<a name="line432">432: </a>  ia[0]  = 0;
428
 
<a name="line433">433: </a>  <font color="#4169E1">for</font> (i=0; i&lt;m; i++) {
429
 
<a name="line434">434: </a>    ierr    = <A href="../../../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(A,i+rstart,&amp;len,&amp;rj,&amp;ra);
430
 
<a name="line435">435: </a>    cnt     = 0;
431
 
<a name="line436">436: </a>    <font color="#4169E1">for</font> (j=0; j&lt;len; j++) {
432
 
<a name="line437">437: </a>      <font color="#4169E1">if</font> (rj[j] != i+rstart) { <font color="#B22222">/* if not diagonal */</font>
433
 
<a name="line438">438: </a>        a[nzeros+cnt]    = (int) PetscAbsScalar(ra[j]);
434
 
<a name="line439">439: </a>        ja[nzeros+cnt++] = rj[j];
435
 
<a name="line440">440: </a>      }
436
 
<a name="line441">441: </a>    }
437
 
<a name="line442">442: </a>    ierr    = <A href="../../../../../docs/manualpages/Mat/MatRestoreRow.html#MatRestoreRow">MatRestoreRow</A>(A,i+rstart,&amp;len,&amp;rj,&amp;ra);
438
 
<a name="line443">443: </a>    nzeros += cnt;
439
 
<a name="line444">444: </a>    ia[i+1] = nzeros;
440
 
<a name="line445">445: </a>  }
441
 
 
442
 
<a name="line447">447: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectGetComm.html#PetscObjectGetComm">PetscObjectGetComm</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)A,&amp;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
443
 
<a name="line448">448: </a>  <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A>(<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,m,N,ia,ja,a,B);
444
 
 
445
 
<a name="line450">450: </a>  <font color="#4169E1">return</font>(0);
446
 
<a name="line451">451: </a>}
447
 
<a name="line452">452: </a>EXTERN_C_END
 
253
<a name="line276">276: </a>       0,
 
254
<a name="line277">277: </a>       0,
 
255
<a name="line278">278: </a><font color="#B22222">/*35*/</font> 0,
 
256
<a name="line279">279: </a>       0,
 
257
<a name="line280">280: </a>       0,
 
258
<a name="line281">281: </a>       0,
 
259
<a name="line282">282: </a>       0,
 
260
<a name="line283">283: </a><font color="#B22222">/*40*/</font> 0,
 
261
<a name="line284">284: </a>       0,
 
262
<a name="line285">285: </a>       0,
 
263
<a name="line286">286: </a>       0,
 
264
<a name="line287">287: </a>       0,
 
265
<a name="line288">288: </a><font color="#B22222">/*45*/</font> 0,
 
266
<a name="line289">289: </a>       0,
 
267
<a name="line290">290: </a>       0,
 
268
<a name="line291">291: </a>       0,
 
269
<a name="line292">292: </a>       0,
 
270
<a name="line293">293: </a><font color="#B22222">/*50*/</font> MatGetBlockSize_MPIAdj,
 
271
<a name="line294">294: </a>       MatGetRowIJ_MPIAdj,
 
272
<a name="line295">295: </a>       MatRestoreRowIJ_MPIAdj,
 
273
<a name="line296">296: </a>       0,
 
274
<a name="line297">297: </a>       0,
 
275
<a name="line298">298: </a><font color="#B22222">/*55*/</font> 0,
 
276
<a name="line299">299: </a>       0,
 
277
<a name="line300">300: </a>       0,
 
278
<a name="line301">301: </a>       0,
 
279
<a name="line302">302: </a>       0,
 
280
<a name="line303">303: </a><font color="#B22222">/*60*/</font> 0,
 
281
<a name="line304">304: </a>       MatDestroy_MPIAdj,
 
282
<a name="line305">305: </a>       MatView_MPIAdj,
 
283
<a name="line306">306: </a>       MatGetPetscMaps_Petsc,
 
284
<a name="line307">307: </a>       0,
 
285
<a name="line308">308: </a><font color="#B22222">/*65*/</font> 0,
 
286
<a name="line309">309: </a>       0,
 
287
<a name="line310">310: </a>       0,
 
288
<a name="line311">311: </a>       0,
 
289
<a name="line312">312: </a>       0,
 
290
<a name="line313">313: </a><font color="#B22222">/*70*/</font> 0,
 
291
<a name="line314">314: </a>       0,
 
292
<a name="line315">315: </a>       0,
 
293
<a name="line316">316: </a>       0,
 
294
<a name="line317">317: </a>       0,
 
295
<a name="line318">318: </a><font color="#B22222">/*75*/</font> 0,
 
296
<a name="line319">319: </a>       0,
 
297
<a name="line320">320: </a>       0,
 
298
<a name="line321">321: </a>       0,
 
299
<a name="line322">322: </a>       0,
 
300
<a name="line323">323: </a><font color="#B22222">/*80*/</font> 0,
 
301
<a name="line324">324: </a>       0,
 
302
<a name="line325">325: </a>       0,
 
303
<a name="line326">326: </a>       0,
 
304
<a name="line327">327: </a><font color="#B22222">/*85*/</font> 0
 
305
<a name="line328">328: </a>};
 
306
 
 
307
<a name="line330">330: </a>EXTERN_C_BEGIN
 
308
<a name="line333">333: </a><strong><font color="#4169E1"><a name="MatMPIAdjSetPreallocation_MPIAdj"></a>int MatMPIAdjSetPreallocation_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B,int *i,int *j,int *values)</font></strong>
 
309
<a name="line334">334: </a>{
 
310
<a name="line335">335: </a>  Mat_MPIAdj *b = (Mat_MPIAdj *)B-&gt;data;
 
311
<a name="line336">336: </a>  int        ierr;
 
312
<a name="line337">337: </a><font color="#A020F0">#if defined(PETSC_USE_BOPT_g)</font>
 
313
<a name="line338">338: </a>  int        ii;
 
314
<a name="line339">339: </a><font color="#A020F0">#endif</font>
 
315
 
 
316
<a name="line342">342: </a>  B-&gt;preallocated = PETSC_TRUE;
 
317
<a name="line343">343: </a><font color="#A020F0">#if defined(PETSC_USE_BOPT_g)</font>
 
318
<a name="line344">344: </a>  <font color="#4169E1">if</font> (i[0] != 0) <A href="../../../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"First i[] index must be zero, instead it is %d\n"</font>,i[0]);
 
319
<a name="line345">345: </a>  <font color="#4169E1">for</font> (ii=1; ii&lt;B-&gt;m; ii++) {
 
320
<a name="line346">346: </a>    <font color="#4169E1">if</font> (i[ii] &lt; 0 || i[ii] &lt; i[ii-1]) {
 
321
<a name="line347">347: </a>      SETERRQ4(1,<font color="#666666">"i[%d]=%d index is out of range: i[%d]=%d"</font>,ii,i[ii],ii-1,i[ii-1]);
 
322
<a name="line348">348: </a>    }
 
323
<a name="line349">349: </a>  }
 
324
<a name="line350">350: </a>  <font color="#4169E1">for</font> (ii=0; ii&lt;i[B-&gt;m]; ii++) {
 
325
<a name="line351">351: </a>    <font color="#4169E1">if</font> (j[ii] &lt; 0 || j[ii] &gt;= B-&gt;N) {
 
326
<a name="line352">352: </a>      <A href="../../../../../docs/manualpages/Sys/SETERRQ2.html#SETERRQ2">SETERRQ2</A>(1,<font color="#666666">"Column index %d out of range %d\n"</font>,ii,j[ii]);
 
327
<a name="line353">353: </a>    }
 
328
<a name="line354">354: </a>  }
 
329
<a name="line355">355: </a><font color="#A020F0">#endif</font>
 
330
 
 
331
<a name="line357">357: </a>  b-&gt;j      = j;
 
332
<a name="line358">358: </a>  b-&gt;i      = i;
 
333
<a name="line359">359: </a>  b-&gt;values = values;
 
334
 
 
335
<a name="line361">361: </a>  b-&gt;nz               = i[B-&gt;m];
 
336
<a name="line362">362: </a>  b-&gt;diag             = 0;
 
337
<a name="line363">363: </a>  b-&gt;symmetric        = PETSC_FALSE;
 
338
<a name="line364">364: </a>  b-&gt;freeaij          = PETSC_TRUE;
 
339
 
 
340
<a name="line366">366: </a>  <A href="../../../../../docs/manualpages/Mat/MatAssemblyBegin.html#MatAssemblyBegin">MatAssemblyBegin</A>(B,MAT_FINAL_ASSEMBLY);
 
341
<a name="line367">367: </a>  <A href="../../../../../docs/manualpages/Mat/MatAssemblyEnd.html#MatAssemblyEnd">MatAssemblyEnd</A>(B,MAT_FINAL_ASSEMBLY);
 
342
<a name="line368">368: </a>  <font color="#4169E1">return</font>(0);
 
343
<a name="line369">369: </a>}
 
344
<a name="line370">370: </a>EXTERN_C_END
 
345
 
 
346
<a name="line372">372: </a><font color="#B22222">/*MC</font>
 
347
<a name="line373">373: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/Mat/MATMPIADJ.html#MATMPIADJ">MATMPIADJ</A> - <A href="../../../../../docs/manualpages/Mat/MATMPIADJ.html#MATMPIADJ">MATMPIADJ</A> = "mpiadj" - A matrix type to be used for distributed adjacency matrices,</font>
 
348
<a name="line374">374: </a><font color="#B22222">   intended for use constructing orderings and partitionings.</font>
 
349
 
 
350
<a name="line376">376: </a><font color="#B22222">  Level: beginner</font>
 
351
 
 
352
<a name="line378">378: </a><font color="#B22222">.seealso: <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A></font>
 
353
<a name="line379">379: </a><font color="#B22222">M*/</font>
 
354
 
 
355
<a name="line381">381: </a>EXTERN_C_BEGIN
 
356
<a name="line384">384: </a><strong><font color="#4169E1"><a name="MatCreate_MPIAdj"></a>int MatCreate_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B)</font></strong>
 
357
<a name="line385">385: </a>{
 
358
<a name="line386">386: </a>  Mat_MPIAdj *b;
 
359
<a name="line387">387: </a>  int        ii,ierr,<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>,<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>;
 
360
 
 
361
<a name="line390">390: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Comm_size.html#MPI_Comm_size">MPI_Comm_size</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,&amp;<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>);
 
362
<a name="line391">391: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Comm_rank.html#MPI_Comm_rank">MPI_Comm_rank</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,&amp;<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>);
 
363
 
 
364
<a name="line393">393: </a>  <A href="../../../../../docs/manualpages/Sys/PetscNew.html#PetscNew">PetscNew</A>(Mat_MPIAdj,&amp;b);
 
365
<a name="line394">394: </a>  B-&gt;data             = (void*)b;
 
366
<a name="line395">395: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMemzero.html#PetscMemzero">PetscMemzero</A>(b,<font color="#4169E1">sizeof</font>(Mat_MPIAdj));
 
367
<a name="line396">396: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMemcpy.html#PetscMemcpy">PetscMemcpy</A>(B-&gt;ops,&amp;MatOps_Values,<font color="#4169E1">sizeof</font>(<font color="#4169E1">struct _MatOps</font>));
 
368
<a name="line397">397: </a>  B-&gt;factor           = 0;
 
369
<a name="line398">398: </a>  B-&gt;lupivotthreshold = 1.0;
 
370
<a name="line399">399: </a>  B-&gt;mapping          = 0;
 
371
<a name="line400">400: </a>  B-&gt;assembled        = PETSC_FALSE;
 
372
<a name="line401">401: </a>
 
373
<a name="line402">402: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allreduce.html#MPI_Allreduce">MPI_Allreduce</A>(&amp;B-&gt;m,&amp;B-&gt;M,1,MPI_INT,MPI_SUM,B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
 
374
<a name="line403">403: </a>  B-&gt;n = B-&gt;N;
 
375
 
 
376
<a name="line405">405: </a>  <font color="#B22222">/* the information in the maps duplicates the information computed below, eventually </font>
 
377
<a name="line406">406: </a><font color="#B22222">     we should remove the duplicate information that is not contained in the maps */</font>
 
378
<a name="line407">407: </a>  <A href="../../../../../docs/manualpages/Vec/PetscMapCreateMPI.html#PetscMapCreateMPI">PetscMapCreateMPI</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,B-&gt;m,B-&gt;M,&amp;B-&gt;rmap);
 
379
<a name="line408">408: </a>  <font color="#B22222">/* we don't know the "local columns" so just use the row information :-(*/</font>
 
380
<a name="line409">409: </a>  <A href="../../../../../docs/manualpages/Vec/PetscMapCreateMPI.html#PetscMapCreateMPI">PetscMapCreateMPI</A>(B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,B-&gt;m,B-&gt;M,&amp;B-&gt;cmap);
 
381
 
 
382
<a name="line411">411: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>+1)*<font color="#4169E1">sizeof</font>(int),&amp;b-&gt;rowners);
 
383
<a name="line412">412: </a>  PetscLogObjectMemory(B,(<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>+2)*<font color="#4169E1">sizeof</font>(int)+<font color="#4169E1">sizeof</font>(<font color="#4169E1">struct _p_Mat</font>)+<font color="#4169E1">sizeof</font>(Mat_MPIAdj));
 
384
<a name="line413">413: </a>  <A href="http://www.mcs.anl.gov/mpi/www/www3/MPI_Allgather.html#MPI_Allgather">MPI_Allgather</A>(&amp;B-&gt;m,1,MPI_INT,b-&gt;rowners+1,1,MPI_INT,B-&gt;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
 
385
<a name="line414">414: </a>  b-&gt;rowners[0] = 0;
 
386
<a name="line415">415: </a>  <font color="#4169E1">for</font> (ii=2; ii&lt;=<A href="../../../../../docs/manualpages/Sys/size.html#size">size</A>; ii++) {
 
387
<a name="line416">416: </a>    b-&gt;rowners[ii] += b-&gt;rowners[ii-1];
 
388
<a name="line417">417: </a>  }
 
389
<a name="line418">418: </a>  b-&gt;rstart = b-&gt;rowners[<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>];
 
390
<a name="line419">419: </a>  b-&gt;rend   = b-&gt;rowners[<A href="../../../../../docs/manualpages/Sys/rank.html#rank">rank</A>+1];
 
391
<a name="line420">420: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectComposeFunctionDynamic.html#PetscObjectComposeFunctionDynamic">PetscObjectComposeFunctionDynamic</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)B,<font color="#666666">"MatMPIAdjSetPreallocation_C"</font>,
 
392
<a name="line421">421: </a>                                    <font color="#666666">"MatMPIAdjSetPreallocation_MPIAdj"</font>,
 
393
<a name="line422">422: </a>                                     MatMPIAdjSetPreallocation_MPIAdj);
 
394
<a name="line423">423: </a>  <font color="#4169E1">return</font>(0);
 
395
<a name="line424">424: </a>}
 
396
<a name="line425">425: </a>EXTERN_C_END
 
397
 
 
398
<a name="line429">429: </a><font color="#B22222">/*@C</font>
 
399
<a name="line430">430: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/Mat/MatMPIAdjSetPreallocation.html#MatMPIAdjSetPreallocation">MatMPIAdjSetPreallocation</A> - Sets the array used for storing the matrix elements</font>
 
400
 
 
401
<a name="line432">432: </a><font color="#B22222">   Collective on <A href="../../../../../docs/manualpages/Sys/MPI_Comm.html#MPI_Comm">MPI_Comm</A></font>
 
402
 
 
403
<a name="line434">434: </a><font color="#B22222">   Input Parameters:</font>
 
404
<a name="line435">435: </a><font color="#B22222">+  A - the matrix</font>
 
405
<a name="line436">436: </a><font color="#B22222">.  i - the indices into j for the start of each row</font>
 
406
<a name="line437">437: </a><font color="#B22222">.  j - the column indices for each row (sorted for each row).</font>
 
407
<a name="line438">438: </a><font color="#B22222">       The indices in i and j start with zero (NOT with one).</font>
 
408
<a name="line439">439: </a><font color="#B22222">-  values - [optional] edge weights</font>
 
409
 
 
410
<a name="line441">441: </a><font color="#B22222">   Level: intermediate</font>
 
411
 
 
412
<a name="line443">443: </a><font color="#B22222">.seealso: <A href="../../../../../docs/manualpages/Mat/MatCreate.html#MatCreate">MatCreate</A>(), <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A>(), <A href="../../../../../docs/manualpages/Mat/MatSetValues.html#MatSetValues">MatSetValues</A>()</font>
 
413
<a name="line444">444: </a><font color="#B22222">@*/</font>
 
414
<a name="line445">445: </a><strong><font color="#4169E1"><a name="MatMPIAdjSetPreallocation"></a>int <A href="../../../../../docs/manualpages/Mat/MatMPIAdjSetPreallocation.html#MatMPIAdjSetPreallocation">MatMPIAdjSetPreallocation</A>(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> B,int *i,int *j,int *values)</font></strong>
 
415
<a name="line446">446: </a>{
 
416
<a name="line447">447: </a>  int ierr,(*f)(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A>,int*,int*,int*);
 
417
 
 
418
<a name="line450">450: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectQueryFunction.html#PetscObjectQueryFunction">PetscObjectQueryFunction</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)B,<font color="#666666">"MatMPIAdjSetPreallocation_C"</font>,(void (**)(void))&amp;f);
 
419
<a name="line451">451: </a>  <font color="#4169E1">if</font> (f) {
 
420
<a name="line452">452: </a>    (*f)(B,i,j,values);
 
421
<a name="line453">453: </a>  }
 
422
<a name="line454">454: </a>  <font color="#4169E1">return</font>(0);
 
423
<a name="line455">455: </a>}
 
424
 
 
425
<a name="line459">459: </a><font color="#B22222">/*@C</font>
 
426
<a name="line460">460: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A> - Creates a sparse matrix representing an adjacency list.</font>
 
427
<a name="line461">461: </a><font color="#B22222">   The matrix does not have numerical values associated with it, but is</font>
 
428
<a name="line462">462: </a><font color="#B22222">   intended for ordering (to reduce bandwidth etc) and partitioning.</font>
 
429
 
 
430
<a name="line464">464: </a><font color="#B22222">   Collective on <A href="../../../../../docs/manualpages/Sys/MPI_Comm.html#MPI_Comm">MPI_Comm</A></font>
 
431
 
 
432
<a name="line466">466: </a><font color="#B22222">   Input Parameters:</font>
 
433
<a name="line467">467: </a><font color="#B22222">+  <A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A> - MPI communicator</font>
 
434
<a name="line468">468: </a><font color="#B22222">.  m - number of local rows</font>
 
435
<a name="line469">469: </a><font color="#B22222">.  n - number of columns</font>
 
436
<a name="line470">470: </a><font color="#B22222">.  i - the indices into j for the start of each row</font>
 
437
<a name="line471">471: </a><font color="#B22222">.  j - the column indices for each row (sorted for each row).</font>
 
438
<a name="line472">472: </a><font color="#B22222">       The indices in i and j start with zero (NOT with one).</font>
 
439
<a name="line473">473: </a><font color="#B22222">-  values -[optional] edge weights</font>
 
440
 
 
441
<a name="line475">475: </a><font color="#B22222">   Output Parameter:</font>
 
442
<a name="line476">476: </a><font color="#B22222">.  A - the matrix </font>
 
443
 
 
444
<a name="line478">478: </a><font color="#B22222">   Level: intermediate</font>
 
445
 
 
446
<a name="line480">480: </a><font color="#B22222">   Notes: This matrix object does not support most matrix operations, include</font>
 
447
<a name="line481">481: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/Mat/MatSetValues.html#MatSetValues">MatSetValues</A>().</font>
 
448
<a name="line482">482: </a><font color="#B22222">   You must NOT free the ii, values and jj arrays yourself. PETSc will free them</font>
 
449
<a name="line483">483: </a><font color="#B22222">   when the matrix is destroyed; you must allocate them with <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>(). If you </font>
 
450
<a name="line484">484: </a><font color="#B22222">    call from Fortran you need not create the arrays with <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>().</font>
 
451
<a name="line485">485: </a><font color="#B22222">   Should not include the matrix diagonals.</font>
 
452
 
 
453
<a name="line487">487: </a><font color="#B22222">   If you already have a matrix, you can create its adjacency matrix by a call</font>
 
454
<a name="line488">488: </a><font color="#B22222">   to <A href="../../../../../docs/manualpages/Mat/MatConvert.html#MatConvert">MatConvert</A>, specifying a type of <A href="../../../../../docs/manualpages/Mat/MATMPIADJ.html#MATMPIADJ">MATMPIADJ</A>.</font>
 
455
 
 
456
<a name="line490">490: </a><font color="#B22222">   Possible values for <A href="../../../../../docs/manualpages/Mat/MatSetOption.html#MatSetOption">MatSetOption</A>() - MAT_STRUCTURALLY_SYMMETRIC</font>
 
457
 
 
458
<a name="line492">492: </a><font color="#B22222">.seealso: <A href="../../../../../docs/manualpages/Mat/MatCreate.html#MatCreate">MatCreate</A>(), <A href="../../../../../docs/manualpages/Mat/MatConvert.html#MatConvert">MatConvert</A>(), <A href="../../../../../docs/manualpages/MatOrderings/MatGetOrdering.html#MatGetOrdering">MatGetOrdering</A>()</font>
 
459
<a name="line493">493: </a><font color="#B22222">@*/</font>
 
460
<a name="line494">494: </a><strong><font color="#4169E1"><a name="MatCreateMPIAdj"></a>int <A href="../../../../../docs/manualpages/Mat/MatCreateMPIAdj.html#MatCreateMPIAdj">MatCreateMPIAdj</A>(<A href="../../../../../docs/manualpages/Sys/MPI_Comm.html#MPI_Comm">MPI_Comm</A> <A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,int m,int n,int *i,int *j,int *values,<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *A)</font></strong>
 
461
<a name="line495">495: </a>{
 
462
<a name="line496">496: </a>  int        ierr;
 
463
 
 
464
<a name="line499">499: </a>  <A href="../../../../../docs/manualpages/Mat/MatCreate.html#MatCreate">MatCreate</A>(<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,m,n,<A href="../../../../../docs/manualpages/Sys/PETSC_DETERMINE.html#PETSC_DETERMINE">PETSC_DETERMINE</A>,n,A);
 
465
<a name="line500">500: </a>  <A href="../../../../../docs/manualpages/Mat/MatSetType.html#MatSetType">MatSetType</A>(*A,<A href="../../../../../docs/manualpages/Mat/MATMPIADJ.html#MATMPIADJ">MATMPIADJ</A>);
 
466
<a name="line501">501: </a>  <A href="../../../../../docs/manualpages/Mat/MatMPIAdjSetPreallocation.html#MatMPIAdjSetPreallocation">MatMPIAdjSetPreallocation</A>(*A,i,j,values);
 
467
<a name="line502">502: </a>  <font color="#4169E1">return</font>(0);
 
468
<a name="line503">503: </a>}
 
469
 
 
470
<a name="line505">505: </a>EXTERN_C_BEGIN
 
471
<a name="line508">508: </a><strong><font color="#4169E1"><a name="MatConvertTo_MPIAdj"></a>int MatConvertTo_MPIAdj(<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../../../docs/manualpages/Mat/MatType.html#MatType">MatType</A> type,<A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> *newmat)</font></strong> {
 
472
<a name="line509">509: </a>  <A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A>          B;
 
473
<a name="line510">510: </a>  int          i,ierr,m,N,nzeros = 0,*ia,*ja,*rj,len,rstart,cnt,j,*a;
 
474
<a name="line511">511: </a>  <A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A>  *ra;
 
475
<a name="line512">512: </a>  <A href="../../../../../docs/manualpages/Sys/MPI_Comm.html#MPI_Comm">MPI_Comm</A>     <A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>;
 
476
 
 
477
<a name="line515">515: </a>  <A href="../../../../../docs/manualpages/Mat/MatGetSize.html#MatGetSize">MatGetSize</A>(A,<A href="../../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>,&amp;N);
 
478
<a name="line516">516: </a>  <A href="../../../../../docs/manualpages/Mat/MatGetLocalSize.html#MatGetLocalSize">MatGetLocalSize</A>(A,&amp;m,<A href="../../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
 
479
<a name="line517">517: </a>  <A href="../../../../../docs/manualpages/Mat/MatGetOwnershipRange.html#MatGetOwnershipRange">MatGetOwnershipRange</A>(A,&amp;rstart,<A href="../../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
 
480
<a name="line518">518: </a>
 
481
<a name="line519">519: </a>  <font color="#B22222">/* count the number of nonzeros per row */</font>
 
482
<a name="line520">520: </a>  <font color="#4169E1">for</font> (i=0; i&lt;m; i++) {
 
483
<a name="line521">521: </a>    <A href="../../../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(A,i+rstart,&amp;len,&amp;rj,<A href="../../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
 
484
<a name="line522">522: </a>    <font color="#4169E1">for</font> (j=0; j&lt;len; j++) {
 
485
<a name="line523">523: </a>      <font color="#4169E1">if</font> (rj[j] == i+rstart) {len--; <font color="#4169E1">break</font>;}    <font color="#B22222">/* don't count diagonal */</font>
 
486
<a name="line524">524: </a>    }
 
487
<a name="line525">525: </a>    <A href="../../../../../docs/manualpages/Mat/MatRestoreRow.html#MatRestoreRow">MatRestoreRow</A>(A,i+rstart,&amp;len,&amp;rj,<A href="../../../../../docs/manualpages/Sys/PETSC_NULL.html#PETSC_NULL">PETSC_NULL</A>);
 
488
<a name="line526">526: </a>    nzeros += len;
 
489
<a name="line527">527: </a>  }
 
490
 
 
491
<a name="line529">529: </a>  <font color="#B22222">/* malloc space for nonzeros */</font>
 
492
<a name="line530">530: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((nzeros+1)*<font color="#4169E1">sizeof</font>(int),&amp;a);
 
493
<a name="line531">531: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((N+1)*<font color="#4169E1">sizeof</font>(int),&amp;ia);
 
494
<a name="line532">532: </a>  <A href="../../../../../docs/manualpages/Sys/PetscMalloc.html#PetscMalloc">PetscMalloc</A>((nzeros+1)*<font color="#4169E1">sizeof</font>(int),&amp;ja);
 
495
 
 
496
<a name="line534">534: </a>  nzeros = 0;
 
497
<a name="line535">535: </a>  ia[0]  = 0;
 
498
<a name="line536">536: </a>  <font color="#4169E1">for</font> (i=0; i&lt;m; i++) {
 
499
<a name="line537">537: </a>    <A href="../../../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(A,i+rstart,&amp;len,&amp;rj,&amp;ra);
 
500
<a name="line538">538: </a>    cnt     = 0;
 
501
<a name="line539">539: </a>    <font color="#4169E1">for</font> (j=0; j&lt;len; j++) {
 
502
<a name="line540">540: </a>      <font color="#4169E1">if</font> (rj[j] != i+rstart) { <font color="#B22222">/* if not diagonal */</font>
 
503
<a name="line541">541: </a>        a[nzeros+cnt]    = (int) PetscAbsScalar(ra[j]);
 
504
<a name="line542">542: </a>        ja[nzeros+cnt++] = rj[j];
 
505
<a name="line543">543: </a>      }
 
506
<a name="line544">544: </a>    }
 
507
<a name="line545">545: </a>    <A href="../../../../../docs/manualpages/Mat/MatRestoreRow.html#MatRestoreRow">MatRestoreRow</A>(A,i+rstart,&amp;len,&amp;rj,&amp;ra);
 
508
<a name="line546">546: </a>    nzeros += cnt;
 
509
<a name="line547">547: </a>    ia[i+1] = nzeros;
 
510
<a name="line548">548: </a>  }
 
511
 
 
512
<a name="line550">550: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectGetComm.html#PetscObjectGetComm">PetscObjectGetComm</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)A,&amp;<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
 
513
<a name="line551">551: </a>  <A href="../../../../../docs/manualpages/Mat/MatCreate.html#MatCreate">MatCreate</A>(<A href="../../../../../docs/manualpages/Sys/comm.html#comm">comm</A>,m,N,<A href="../../../../../docs/manualpages/Sys/PETSC_DETERMINE.html#PETSC_DETERMINE">PETSC_DETERMINE</A>,N,&amp;B);
 
514
<a name="line552">552: </a>  <A href="../../../../../docs/manualpages/Mat/MatSetType.html#MatSetType">MatSetType</A>(B,type);
 
515
<a name="line553">553: </a>  <A href="../../../../../docs/manualpages/Mat/MatMPIAdjSetPreallocation.html#MatMPIAdjSetPreallocation">MatMPIAdjSetPreallocation</A>(B,ia,ja,a);
 
516
 
 
517
<a name="line555">555: </a>  <font color="#B22222">/* Fake support for "inplace" convert. */</font>
 
518
<a name="line556">556: </a>  <font color="#4169E1">if</font> (*newmat == A) {
 
519
<a name="line557">557: </a>    <A href="../../../../../docs/manualpages/Mat/MatDestroy.html#MatDestroy">MatDestroy</A>(A);
 
520
<a name="line558">558: </a>  }
 
521
<a name="line559">559: </a>  *newmat = B;
 
522
<a name="line560">560: </a>  <font color="#4169E1">return</font>(0);
 
523
<a name="line561">561: </a>}
 
524
<a name="line562">562: </a>EXTERN_C_END
448
525
 
449
526
 
450
527