1 | /*!\file: Reducematrixfromgton
|
---|
2 | * \brief
|
---|
3 | */
|
---|
4 |
|
---|
5 | #ifdef HAVE_CONFIG_H
|
---|
6 | #include "config.h"
|
---|
7 | #else
|
---|
8 | #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
|
---|
9 | #endif
|
---|
10 |
|
---|
11 | #undef __FUNCT__
|
---|
12 | #define __FUNCT__ "Reducematrixfromgton"
|
---|
13 |
|
---|
14 | #include "../toolkits/toolkits.h"
|
---|
15 |
|
---|
16 |
|
---|
17 | void Reducematrixfromgton(Mat* pKnn,Mat Kgg,Mat Gmn,double* pv_m,int msize, double* pv_n,int nsize,int flag){
|
---|
18 |
|
---|
19 |
|
---|
20 | /*output: */
|
---|
21 | Mat Knn=NULL;
|
---|
22 |
|
---|
23 | /*intermediary: */
|
---|
24 | Mat Kmm=NULL;
|
---|
25 | Mat Kmn=NULL;
|
---|
26 | Mat Knm=NULL;
|
---|
27 | Mat KnmGmn=NULL;
|
---|
28 | Mat KmmGmn=NULL;
|
---|
29 | Mat tGmn=NULL;
|
---|
30 | Mat tGmnKmn=NULL;
|
---|
31 | PetscScalar a=1;
|
---|
32 |
|
---|
33 | if (msize){
|
---|
34 |
|
---|
35 | /*Partition K_gg*/
|
---|
36 | MatPartition(&Kmm, Kgg, pv_m,msize,pv_m,msize);
|
---|
37 | MatPartition(&Kmn, Kgg, pv_m,msize,pv_n,nsize);
|
---|
38 | MatPartition(&Knm, Kgg, pv_n,nsize,pv_m,msize);
|
---|
39 | MatPartition(&Knn, Kgg, pv_n,nsize,pv_n,nsize);
|
---|
40 |
|
---|
41 | /*Reduce K_gg to K_nn*/
|
---|
42 | //K_nn = K_nn + K_nm * G_mn;
|
---|
43 | MatMatMult(Knm,Gmn,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&KnmGmn);
|
---|
44 | MatAXPY(Knn,a,KnmGmn,DIFFERENT_NONZERO_PATTERN);
|
---|
45 |
|
---|
46 | if (flag!=1){
|
---|
47 | //K_mn = K_mn + K_mm * G_mn;
|
---|
48 | MatMatMult(Kmm,Gmn,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&KmmGmn);
|
---|
49 | MatAXPY(Kmn,a,KmmGmn,DIFFERENT_NONZERO_PATTERN);
|
---|
50 |
|
---|
51 | //K_nn = K_nn + G_mn' * K_mn;
|
---|
52 | #if _PETSC_VERSION_ == 2
|
---|
53 | MatTranspose(Gmn,&tGmn);
|
---|
54 | #else
|
---|
55 | MatTranspose(Gmn,MAT_INITIAL_MATRIX,&tGmn);
|
---|
56 | #endif
|
---|
57 | MatMatMult(tGmn,Kmn,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&tGmnKmn);
|
---|
58 | MatAXPY(Knn,a,tGmnKmn,DIFFERENT_NONZERO_PATTERN);
|
---|
59 | }
|
---|
60 | }
|
---|
61 | else{
|
---|
62 | /*msize=0 just return input*/
|
---|
63 | MatDuplicate(Kgg,MAT_COPY_VALUES,&Knn);
|
---|
64 | }
|
---|
65 |
|
---|
66 | /*Free ressources:*/
|
---|
67 | MatFree(&Kmm);
|
---|
68 | MatFree(&Kmn);
|
---|
69 | MatFree(&Knm);
|
---|
70 | MatFree(&KnmGmn);
|
---|
71 | MatFree(&KmmGmn);
|
---|
72 | MatFree(&tGmn);
|
---|
73 | MatFree(&tGmnKmn);
|
---|
74 |
|
---|
75 | /*Assign output pointers:*/
|
---|
76 | *pKnn=Knn;
|
---|
77 | }
|
---|