13
13
<a name="line3"> 3: </a> #include <A href="../../../src/mat/matimpl.h.html">src/mat/matimpl.h</A>
15
<a name="line5"> 5: </a><font color="#B22222">/*@</font>
16
<a name="line6"> 6: </a><font color="#B22222"> <A href="../../../docs/manualpages/Mat/MatGetColumnVector.html#MatGetColumnVector">MatGetColumnVector</A> - Gets the values from a given column of a matrix.</font>
18
<a name="line8"> 8: </a><font color="#B22222"> Not Collective</font>
20
<a name="line10"> 10: </a><font color="#B22222"> Input Parameters:</font>
21
<a name="line11"> 11: </a><font color="#B22222">+ A - the matrix</font>
22
<a name="line12"> 12: </a><font color="#B22222">. yy - the vector</font>
23
<a name="line13"> 13: </a><font color="#B22222">- c - the column requested (in global numbering)</font>
25
<a name="line15"> 15: </a><font color="#B22222"> Level: advanced</font>
27
<a name="line17"> 17: </a><font color="#B22222"> Notes:</font>
28
<a name="line18"> 18: </a><font color="#B22222"> Each processor for which this is called gets the values for its rows.</font>
30
<a name="line20"> 20: </a><font color="#B22222"> Since PETSc matrices are usually stored in compressed row format, this routine</font>
31
<a name="line21"> 21: </a><font color="#B22222"> will generally be slow.</font>
33
<a name="line23"> 23: </a><font color="#B22222"> The vector must have the same parallel row layout as the matrix.</font>
35
<a name="line25"> 25: </a><font color="#B22222"> Contributed by: Denis Vanderstraeten</font>
37
<a name="line27"> 27: </a><font color="#B22222">.keywords: matrix, column, get </font>
39
<a name="line29"> 29: </a><font color="#B22222">.seealso: <A href="../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(), <A href="../../../docs/manualpages/Mat/MatGetDiagonal.html#MatGetDiagonal">MatGetDiagonal</A>()</font>
41
<a name="line31"> 31: </a><font color="#B22222">@*/</font>
42
<a name="line32"> 32: </a><strong><font color="#4169E1"><a name="MatGetColumnVector"></a>int <A href="../../../docs/manualpages/Mat/MatGetColumnVector.html#MatGetColumnVector">MatGetColumnVector</A>(<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> yy,int col)</font></strong>
43
<a name="line33"> 33: </a>{
44
<a name="line34"> 34: </a> <A href="../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> *y,*v,zero = 0.0;
45
<a name="line35"> 35: </a> int ierr,i,j,nz,*idx,N,Rs,Re,rs,re;
46
<a name="line36"> 36: </a> MPI_Comm <A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>;
47
<a name="line37"> 37: </a>
49
<a name="line42"> 42: </a> <font color="#4169E1">if</font> (col < 0) <A href="../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"Requested negative column: %d"</font>,col);
50
<a name="line43"> 43: </a> <A href="../../../docs/manualpages/Mat/MatGetSize.html#MatGetSize">MatGetSize</A>(A,PETSC_NULL,&N);
51
<a name="line44"> 44: </a> <font color="#4169E1">if</font> (col >= N) <A href="../../../docs/manualpages/Sys/SETERRQ2.html#SETERRQ2">SETERRQ2</A>(1,<font color="#666666">"Requested column %d larger than number columns in matrix %d"</font>,col,N);
53
<a name="line46"> 46: </a> <A href="../../../docs/manualpages/Mat/MatGetOwnershipRange.html#MatGetOwnershipRange">MatGetOwnershipRange</A>(A,&Rs,&Re);
55
<a name="line48"> 48: </a> <A href="../../../docs/manualpages/Sys/PetscObjectGetComm.html#PetscObjectGetComm">PetscObjectGetComm</A>((<A href="../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)yy,&<A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
56
<a name="line49"> 49: </a> <A href="../../../docs/manualpages/Vec/VecGetOwnershipRange.html#VecGetOwnershipRange">VecGetOwnershipRange</A>(yy,&rs,&re);
57
<a name="line50"> 50: </a> <font color="#4169E1">if</font> (Rs != rs || Re != re) SETERRQ4(1,<font color="#666666">"Matrix %d %d does not have same ownership range (<A href="../../../docs/manualpages/Sys/size.html#size">size</A>) as vector %d %d"</font>,Rs,Re,rs,re);
59
<a name="line52"> 52: </a> <A href="../../../docs/manualpages/Vec/VecSet.html#VecSet">VecSet</A>(&zero,yy);
60
<a name="line53"> 53: </a> <A href="../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(yy,&y);
62
<a name="line55"> 55: </a> <font color="#4169E1">for</font> (i=Rs; i<Re; i++) {
63
<a name="line56"> 56: </a> <A href="../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(A,i,&nz,&idx,&v);
64
<a name="line57"> 57: </a> <font color="#4169E1">if</font> (nz && idx[0] <= col) {
65
<a name="line58"> 58: </a> <font color="#B22222">/*</font>
66
<a name="line59"> 59: </a><font color="#B22222"> Should use faster search here </font>
67
<a name="line60"> 60: </a><font color="#B22222"> */</font>
68
<a name="line61"> 61: </a> <font color="#4169E1">for</font> (j=0; j<nz; j++) {
69
<a name="line62"> 62: </a> <font color="#4169E1">if</font> (idx[j] >= col) {
70
<a name="line63"> 63: </a> <font color="#4169E1">if</font> (idx[j] == col) y[i-rs] = v[j];
71
<a name="line64"> 64: </a> <font color="#4169E1">break</font>;
72
<a name="line65"> 65: </a> }
73
<a name="line66"> 66: </a> }
74
<a name="line67"> 67: </a> }
75
<a name="line68"> 68: </a> <A href="../../../docs/manualpages/Mat/MatRestoreRow.html#MatRestoreRow">MatRestoreRow</A>(A,i,&nz,&idx,&v);
76
<a name="line69"> 69: </a> }
78
<a name="line71"> 71: </a> <A href="../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(yy,&y);
79
<a name="line72"> 72: </a> <font color="#4169E1">return</font>(0);
80
<a name="line73"> 73: </a>}
15
<a name="line7"> 7: </a><font color="#B22222">/*@</font>
16
<a name="line8"> 8: </a><font color="#B22222"> <A href="../../../docs/manualpages/Mat/MatGetColumnVector.html#MatGetColumnVector">MatGetColumnVector</A> - Gets the values from a given column of a matrix.</font>
18
<a name="line10"> 10: </a><font color="#B22222"> Not Collective</font>
20
<a name="line12"> 12: </a><font color="#B22222"> Input Parameters:</font>
21
<a name="line13"> 13: </a><font color="#B22222">+ A - the matrix</font>
22
<a name="line14"> 14: </a><font color="#B22222">. yy - the vector</font>
23
<a name="line15"> 15: </a><font color="#B22222">- c - the column requested (in global numbering)</font>
25
<a name="line17"> 17: </a><font color="#B22222"> Level: advanced</font>
27
<a name="line19"> 19: </a><font color="#B22222"> Notes:</font>
28
<a name="line20"> 20: </a><font color="#B22222"> Each processor for which this is called gets the values for its rows.</font>
30
<a name="line22"> 22: </a><font color="#B22222"> Since PETSc matrices are usually stored in compressed row format, this routine</font>
31
<a name="line23"> 23: </a><font color="#B22222"> will generally be slow.</font>
33
<a name="line25"> 25: </a><font color="#B22222"> The vector must have the same parallel row layout as the matrix.</font>
35
<a name="line27"> 27: </a><font color="#B22222"> Contributed by: Denis Vanderstraeten</font>
37
<a name="line29"> 29: </a><font color="#B22222">.keywords: matrix, column, get </font>
39
<a name="line31"> 31: </a><font color="#B22222">.seealso: <A href="../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(), <A href="../../../docs/manualpages/Mat/MatGetDiagonal.html#MatGetDiagonal">MatGetDiagonal</A>()</font>
41
<a name="line33"> 33: </a><font color="#B22222">@*/</font>
42
<a name="line34"> 34: </a><strong><font color="#4169E1"><a name="MatGetColumnVector"></a>int <A href="../../../docs/manualpages/Mat/MatGetColumnVector.html#MatGetColumnVector">MatGetColumnVector</A>(<A href="../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> A,<A href="../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> yy,int col)</font></strong>
43
<a name="line35"> 35: </a>{
44
<a name="line36"> 36: </a> <A href="../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> *y,*v,zero = 0.0;
45
<a name="line37"> 37: </a> int ierr,i,j,nz,*idx,N,Rs,Re,rs,re;
46
<a name="line38"> 38: </a> <A href="../../../docs/manualpages/Sys/MPI_Comm.html#MPI_Comm">MPI_Comm</A> <A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>;
47
<a name="line39"> 39: </a>
49
<a name="line44"> 44: </a> <font color="#4169E1">if</font> (col < 0) <A href="../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"Requested negative column: %d"</font>,col);
50
<a name="line45"> 45: </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>,&N);
51
<a name="line46"> 46: </a> <font color="#4169E1">if</font> (col >= N) <A href="../../../docs/manualpages/Sys/SETERRQ2.html#SETERRQ2">SETERRQ2</A>(1,<font color="#666666">"Requested column %d larger than number columns in matrix %d"</font>,col,N);
53
<a name="line48"> 48: </a> <A href="../../../docs/manualpages/Mat/MatGetOwnershipRange.html#MatGetOwnershipRange">MatGetOwnershipRange</A>(A,&Rs,&Re);
55
<a name="line50"> 50: </a> <A href="../../../docs/manualpages/Sys/PetscObjectGetComm.html#PetscObjectGetComm">PetscObjectGetComm</A>((<A href="../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)yy,&<A href="../../../docs/manualpages/Sys/comm.html#comm">comm</A>);
56
<a name="line51"> 51: </a> <A href="../../../docs/manualpages/Vec/VecGetOwnershipRange.html#VecGetOwnershipRange">VecGetOwnershipRange</A>(yy,&rs,&re);
57
<a name="line52"> 52: </a> <font color="#4169E1">if</font> (Rs != rs || Re != re) SETERRQ4(1,<font color="#666666">"Matrix %d %d does not have same ownership range (<A href="../../../docs/manualpages/Sys/size.html#size">size</A>) as vector %d %d"</font>,Rs,Re,rs,re);
59
<a name="line54"> 54: </a> <A href="../../../docs/manualpages/Vec/VecSet.html#VecSet">VecSet</A>(&zero,yy);
60
<a name="line55"> 55: </a> <A href="../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(yy,&y);
62
<a name="line57"> 57: </a> <font color="#4169E1">for</font> (i=Rs; i<Re; i++) {
63
<a name="line58"> 58: </a> <A href="../../../docs/manualpages/Mat/MatGetRow.html#MatGetRow">MatGetRow</A>(A,i,&nz,&idx,&v);
64
<a name="line59"> 59: </a> <font color="#4169E1">if</font> (nz && idx[0] <= col) {
65
<a name="line60"> 60: </a> <font color="#B22222">/*</font>
66
<a name="line61"> 61: </a><font color="#B22222"> Should use faster search here </font>
67
<a name="line62"> 62: </a><font color="#B22222"> */</font>
68
<a name="line63"> 63: </a> <font color="#4169E1">for</font> (j=0; j<nz; j++) {
69
<a name="line64"> 64: </a> <font color="#4169E1">if</font> (idx[j] >= col) {
70
<a name="line65"> 65: </a> <font color="#4169E1">if</font> (idx[j] == col) y[i-rs] = v[j];
71
<a name="line66"> 66: </a> <font color="#4169E1">break</font>;
72
<a name="line67"> 67: </a> }
73
<a name="line68"> 68: </a> }
74
<a name="line69"> 69: </a> }
75
<a name="line70"> 70: </a> <A href="../../../docs/manualpages/Mat/MatRestoreRow.html#MatRestoreRow">MatRestoreRow</A>(A,i,&nz,&idx,&v);
76
<a name="line71"> 71: </a> }
78
<a name="line73"> 73: </a> <A href="../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(yy,&y);
79
<a name="line74"> 74: </a> <font color="#4169E1">return</font>(0);
80
<a name="line75"> 75: </a>}