1 | /*! \file VecTranspose.cpp
|
---|
2 | * \brief: transpose of a petsc vector
|
---|
3 | */
|
---|
4 |
|
---|
5 | #include "./petscpatches.h"
|
---|
6 | #include "../../../shared/shared.h"
|
---|
7 |
|
---|
8 | int VecTranspose(Vec* ptvector,Vec vector){
|
---|
9 |
|
---|
10 | int i;
|
---|
11 | int size;
|
---|
12 | int lower_row,upper_row,range;
|
---|
13 |
|
---|
14 | int* idxm=NULL;
|
---|
15 | double* values=NULL;
|
---|
16 |
|
---|
17 | int* tidxm=NULL;
|
---|
18 | double* tvalues=NULL;
|
---|
19 |
|
---|
20 | /*output: */
|
---|
21 | Vec tvector=NULL;
|
---|
22 |
|
---|
23 | /*Get size of input vector: */
|
---|
24 | VecGetSize(vector,&size);
|
---|
25 |
|
---|
26 | /*Create new vector of same size: */
|
---|
27 | tvector=NewVec(size);
|
---|
28 |
|
---|
29 | /*Extract values locally from input vector: */
|
---|
30 | VecGetOwnershipRange(vector,&lower_row,&upper_row);
|
---|
31 | upper_row--;
|
---|
32 | range=upper_row-lower_row+1;
|
---|
33 |
|
---|
34 | if (range){
|
---|
35 | idxm=xNew<int>(range);
|
---|
36 | tidxm=xNew<int>(range);
|
---|
37 | for (i=0;i<range;i++){
|
---|
38 | *(idxm+i)=lower_row+i;
|
---|
39 | }
|
---|
40 | values=xNew<double>(range);
|
---|
41 | tvalues=xNew<double>(range);
|
---|
42 |
|
---|
43 | VecGetValues(vector,range,idxm,values);
|
---|
44 |
|
---|
45 | /*Transfer values into tidxm, and idxm into tvalues: */
|
---|
46 | for (i=0;i<range;i++){
|
---|
47 | tidxm[i]=(int)values[i];
|
---|
48 | tvalues[i]=(double)idxm[i];
|
---|
49 | }
|
---|
50 | VecSetValues(tvector,range,tidxm,tvalues,INSERT_VALUES);
|
---|
51 | }
|
---|
52 |
|
---|
53 | /*Assemble: */
|
---|
54 | VecAssemblyBegin(tvector);
|
---|
55 | VecAssemblyEnd(tvector);
|
---|
56 |
|
---|
57 | /*Free ressources: */
|
---|
58 | xDelete<int>(idxm);
|
---|
59 | xDelete<double>(values);
|
---|
60 | xDelete<int>(tidxm);
|
---|
61 | xDelete<double>(tvalues);
|
---|
62 |
|
---|
63 | /*Assign output pointers: */
|
---|
64 | *ptvector=tvector;
|
---|
65 | return 1;
|
---|
66 | }
|
---|