Anasazi Version of the Day
Loading...
Searching...
No Matches
singularCoarse.cpp
1// @HEADER
2// *****************************************************************************
3// Anasazi: Block Eigensolvers Package
4//
5// Copyright 2004 NTESS and the Anasazi contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9#include "singularCoarse.h"
10
11namespace singularCoarse {
12
13 void setNullSpace(double *V, int row, int col, double *VtV, const Epetra_Comm *_Comm) {
14
15 Qcoarse = V;
16 rowQcoarse = row;
17 colQcoarse = col;
18 QcoarseTQcoarse = VtV;
19 commCoarse = _Comm;
20
21 }
22
23 void projection(double *z, int *options, int *proc_config, double *params,
24 AZ_MATRIX_STRUCT *Amat, AZ_PREC_STRUCT *prec) {
25
26 Epetra_BLAS callBLAS;
27 Epetra_LAPACK callLAPACK;
28
29// // Do one Jacobi step
30// if (Amat->data_org[AZ_matrix_type] == AZ_MSR_MATRIX) {
31// if (commCoarse->MyPID() == 0)
32// cout << " Do ONE JACOBI STEP " << endl;
33// for (int i = 0; i < rowQcoarse; ++i)
34// z[i] /= Amat->val[i];
35// }
36
37 double *tmp = new double[2*colQcoarse];
38 memset(tmp, 0, 2*colQcoarse*sizeof(double));
39
40 int info = 0;
41
42 for (int i = 0; i < 2; ++i) {
43 if (rowQcoarse > 0) {
44 callBLAS.GEMV('T',rowQcoarse,colQcoarse,1.0,Qcoarse,rowQcoarse,z,0.0,tmp+colQcoarse);
45 }
46 commCoarse->SumAll(tmp + colQcoarse, tmp, colQcoarse);
47 if (rowQcoarse > 0) {
48 callLAPACK.POTRS('U', colQcoarse, 1, QcoarseTQcoarse, colQcoarse, tmp, colQcoarse, &info);
49 callBLAS.GEMV('N', rowQcoarse, colQcoarse, -1.0, Qcoarse, rowQcoarse, tmp, 1.0, z);
50 }
51 }
52
53 delete[] tmp;
54
55 }
56
57}
58
59