Lanczos method implementation class.
More...
#include "stdafx.h"
#include "KNLanczosMethod.h"
#include "KNTimeMeasurement.h"
#include <math.h>
#include <string.h>
#include <algorithm>
#include "CKNGlobal.h"
#include "KNIPCCUtility.h"
#include "KNMPIManager.h"
#include "mkl.h"
#include <sys/stat.h>
#include <sys/types.h>
#include "XeonPhi_header.h"
Go to the source code of this file.
|
| void | thomas_alg (double **T, double *initguess, double *app_evc, int iter) |
| |
| void | inverse_iter (double *alpha, double *beta, double *app_evc, int iter, double app_eva) |
| |
| #define SET_RESULT_TO_PARAMETER |
( |
|
pResultValue, |
|
|
|
pResultVector, |
|
|
|
nResultCount |
|
) |
| |
Value:pCalcuResult_Value = pResultValue; \
pCalcuResult_Vector = pResultVector; \
nCalculatedEigenValueCount = nResultCount
Definition at line 858 of file KNLanczosMethod.cpp.
| void inverse_iter |
( |
double * |
alpha, |
|
|
double * |
beta, |
|
|
double * |
app_evc, |
|
|
int |
iter, |
|
|
double |
app_eva |
|
) |
| |
Definition at line 790 of file KNLanczosMethod.cpp.
References thomas_alg().
Referenced by CKNLanczosMethod::DoEigenValueSolving().
792 int i, j, k, iteration = 20;
793 double temp = 0, err, etol = 1e-13;
795 double *initguess = (
double *)malloc(
sizeof(
double)*iter);
796 double **T = (
double **)malloc(
sizeof(
double)* 2);
798 for (i = 0; i<2; i++)
799 T[i] = (
double *)malloc(
sizeof(
double)*iter);
801 for (i = 0; i<iter; i++)
802 initguess[i] = 1 / sqrt((
double)iter);
804 for (k = 0; k<iteration; k++)
806 for (i = 0; i<2; i++)
810 for (j = 0; j<iter; j++)
811 T[i][j] = alpha[j] - app_eva;
816 for (j = 0; j<iter; j++)
824 for (i = 0; i<iter; i++)
825 temp += app_evc[i] * app_evc[i];
827 for (i = 0; i<iter; i++)
828 app_evc[i] = app_evc[i] / sqrt(temp);
831 for (i = 0; i<iter; i++)
834 temp += app_evc[i] * (alpha[i] * app_evc[i] + beta[i] * app_evc[i + 1]);
835 else if (i == iter - 1)
836 temp += app_evc[i] * (beta[i - 1] * app_evc[i - 1] + alpha[i] * app_evc[i]);
838 temp += app_evc[i] * (beta[i - 1] * app_evc[i - 1] + alpha[i] * app_evc[i] + beta[i] * app_evc[i + 1]);
841 err = app_eva - temp;
842 if (fabs(err) < etol)
847 for (i = 0; i<iter; i++)
848 initguess[i] = app_evc[i];
852 for (i = 0; i<2; i++)
void thomas_alg(double **T, double *initguess, double *app_evc, int iter)
| void thomas_alg |
( |
double ** |
T, |
|
|
double * |
initguess, |
|
|
double * |
app_evc, |
|
|
int |
iter |
|
) |
| |
Definition at line 725 of file KNLanczosMethod.cpp.
Referenced by inverse_iter().
729 double temp, tbeta = T[0][0];
731 double *P = (
double *)malloc(
sizeof(
double)*iter);
734 for (i = 0; i<iter - 1; i++)
736 if (fabs(T[1][i])>fabs(tbeta))
738 initguess[i + 1] -= initguess[i] * tbeta / T[1][i];
739 T[1][i + 1] -= T[0][i] * tbeta / T[1][i];
745 temp = initguess[i + 1];
746 initguess[i + 1] = initguess[i];
750 T[1][i + 1] = T[0][i];
753 initguess[i + 1] -= initguess[i] * T[1][i] / tbeta;
755 T[1][i + 1] -= T[0][i] * T[1][i] / tbeta;
760 T[0][i + 1] = -P[i] * T[1][i] / tbeta;
771 for (i = iter - 1; i>-1; i--)
774 app_evc[i] = initguess[i] / T[1][i];
775 else if (i == iter - 2)
777 app_evc[i] = initguess[i] - app_evc[i + 1] * T[0][i];
778 app_evc[i] = app_evc[i] / T[1][i];
782 app_evc[i] = initguess[i] - app_evc[i + 1] * T[0][i] - app_evc[i + 2] * P[i];
783 app_evc[i] = app_evc[i] / T[1][i];