/*
* Copyright (c) 2009 湖南师范大学数计院 一心飞翔项目组
* All Right Reserved
*
* 文件名:mgmres.cpp
* 摘 要:MGMRES类的函数定义
*
* 作 者:刘 庆
* 完成日期:2009年4月28日
*
*/
#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <time.h>
#include "mgmres.h"
#include "EvalFile.h"
using namespace std;
MGMRES::MGMRES()
{
max_outer_itr = 1;
resultOk = 0;
}
MGMRES::~MGMRES()
{
if(resultOk!=NULL)
delete[] resultOk;
resultOk = NULL;
}
/* 替算法所涉及的矩阵赋初始值,所有数据在fileName的文件中 */
void MGMRES::SetMatrixsValue(const char* fileName)
{
EvalFile file = EvalFile(fileName);
file.SetWithSub(A); /* 替系数矩阵赋值 */
file.SetWithoutSub(b); /* 替右端向量赋值 n*1 */
if(A.GetTotal_col()<A.GetTotal_ln())
{
A.SetTotal_col(A.GetTotal_ln());
b.PosSetValue(A.GetTotal_col()-1, 0, 0);
}
if(A.GetTotal_col()>A.GetTotal_ln())
{
A.PosSetValue(A.GetTotal_col()-1,0,0);
b.PosSetValue(A.GetTotal_col()-1,0,0);
}
x = Matrix::GetE(A.GetTotal_col()); /* 将x的各个值初始化为0 */
// A.DisplayAsMatrix("A", 1);
}
/* A*B、A+B运算中A都会发生变化,B不会 */
Matrix& MGMRES::MGMRESCode()
{
Double mu=0, residue=0, h=0;
Double *c = new Double[A.GetTotal_ln()+1], *s =