#include "bicgstab.h"
#include "ui_bicgstab.h"
BiCGStab::BiCGStab(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::BiCGStab)
{
ui->setupUi(this);
QPixmap qpixmap("imagens/teste2.png");
ui->label->setPixmap(qpixmap);
}
BiCGStab::~BiCGStab()
{
delete ui;
}
void BiCGStab::executar(QMainWindow *pai)
{
ui->lineEdit->clear();
ui->lineEditErroRel->setText("0.00001");
ui->lineEdit_2->clear();
ui->lineEdit_3->setText(QDir::currentPath());
ui->lineEditNomeArqSai->setText("RESULTADO_BiCGStab.txt");
this->retorno = pai;
this->show();
}
void BiCGStab::on_pushButtonSair_clicked()
{
QString msg = "Tem certeza que deseja sair do programa?";
if(!QMessageBox::question(this, "Confirmar Saída", msg, "OK", "Cancelar"))
{
this->close();
this->retorno->close();
}
}
void BiCGStab::on_pushButtonVoltar_clicked()
{
retorno->setVisible(true);
this->close();
}
void BiCGStab::on_pushButtonProcurar_clicked()
{
QString path;
path = QDir::currentPath();
QString file = QFileDialog::getOpenFileName(this, tr("Open File"), path,
tr("Arquivos Texto (*.txt)"));
if(!file.isEmpty())
{
ui->lineEdit->setText(file);
}
}
void BiCGStab::on_pushButtonProcurar_2_clicked()
{
QString path;
path = QDir::currentPath();
QString file = QFileDialog::getOpenFileName(this, tr("Open File"), path,
tr("Arquivos Texto (*.txt)"));
if(!file.isEmpty())
{
ui->lineEdit_2->setText(file);
}
}
void BiCGStab::on_pushButtonProcurar_3_clicked()
{
QString path = QDir::currentPath();
QString dir = QFileDialog::getExistingDirectory(this, tr("Diretório"), path);
if (!dir.isEmpty())
{
ui->lineEdit_3->setText(dir);
}
}
void BiCGStab::on_commandLinkButton_clicked()
{
if(!ui->lineEdit->text().isEmpty() && !ui->lineEdit_2->text().isEmpty() && !ui->lineEditErroRel->text().isEmpty() && !ui->lineEdit_3->text().isEmpty())
{
try
{
this->realizaOperacoes();
QMessageBox::warning(this, tr("Sucesso!"), "A operação foi executada com sucesso! Confira os dados no arquivo " + ui->lineEditNomeArqSai->text() + " gerado no diretório escolhido.");
retorno->setVisible(true);
this->close();
}
catch(string erro)
{
QString descricao = QString::fromStdString(erro);
QMessageBox::warning(this, tr("Erro"), descricao);
}
}
else
{
QMessageBox::warning(this, tr("Atenção!"), "Favor preencher todos os campos antes de executar.");
}
}
void BiCGStab::realizaOperacoes()
{
try
{
string nomeArquivo, linha, dados;
int cont = 0, qtdlinhas, qtdcolunas;
float erro = ui->lineEditErroRel->text().toFloat();
nIteracoes = 4000;
//float aux;
nomeArquivo = ui->lineEdit->text().toStdString();
ifstream arquivo;
arquivo.open(nomeArquivo.c_str());
// verificando erro de abertura do arquivo de entrada
if(!arquivo.is_open())
{
string a = "ERRO - Arquivo nao existe ou nao se encontra no mesmo diretorio do executavel!";
throw a;
}
//qtdlinhas = 0;
//qtdcolunas = 0;
arquivo>> qtdlinhas;
arquivo>> qtdcolunas;
//getline(arquivo, linha);
dados = "";
/*
while(!arquivo.eof()) //repeticao para destrinchar os dados da matriz
{
//qtdlinhas++;
dados += linha + " ";
getline(arquivo, linha);
while(linha == "" || linha[0] == ' ') //le do arquivo ate encontrar uma linha que nao seja vazia
{
getline(arquivo, linha);
if(arquivo.eof())
break;
}
}
if(linha != "") //se a ultima linha lida do arquivo nao for vazia, entao 'dados' recebe linha para ficar completo com a ultima linha da matriz
{
//qtdlinhas++;
dados += linha + " ";
}
*/
for(cont = 0; cont < (qtdlinhas * qtdcolunas); cont++)
{
arquivo>> linha;
dados += linha + " ";
}
arquivo.close();
matrizA = new Matriz(qtdlinhas, qtdcolunas, dados);
if(matrizA->getQuantidadeColunas() == 0)
{
string erro = "ESTE ARQUIVO NAO CONTEM DADOS!\n\n\n";
throw erro;
}
/////////////////////////////////////////////////////////////////
// abrindo um arquivo de entrada - leitura do vetor b
nomeArquivo = ui->lineEdit_2->text().toStdString();
ifstream arquivo2;
arquivo2.open(nomeArquivo.c_str());
// verificando erro de abertura do arquivo de entrada
if(!arquivo2.is_open())
{
string a = "ERRO - Arquivo nao existe ou nao se encontra no mesmo diretorio do executavel!";
throw a;
}
qtdlinhas = 0;
qtdcolunas = 1; //o vetor b sempre tera apenas uma coluna
/*
getline(arquivo2, linha); //faz a leitura da primeira linha na variavel 'linha'
while(linha == "" || linha[0] == ' ') //le do arquivo ate encontrar uma linha que nao seja vazia
{
getline(arquivo2, linha);
if(arquivo2.eof())
break;
}
dados = "";
while(!arquivo2.eof()) //repeticao para destrinchar os dados da matriz
{
qtdlinhas++;
dados += linha + " ";
getline(arquivo2, linha);
while(linha == "" || linha[0] == ' ') //le do arquivo ate encontrar uma linha que nao seja vazia
{
getline(arquivo2, linha);
if(arquivo2.eof())
break;
}
}
if(linha != "") //se a ultima linha lida do arquivo nao for vazia, entao 'dados' recebe linha ficar completo com a ultima linha da matriz
{
qtdlinhas++;
dados += linha + " ";
}
*/
dados = "";
arquivo2>> linha;
while(!arquivo2.eof())
{
dados += linha + " ";
qtdlinhas++;
arquivo2>> linha;
}
dados += linha + " ";
qtdlinhas++;
arquivo2.close();
if(matrizA->getQuantidadeLinhas() == qtdlinhas) //a quantidade de linhas da matriz A sempre deve ser igual a quantidade de linhas do vetor b
{
matrizB = new Matriz(qtdlinhas, qtdcolunas, dados);
matrizX = new Matriz(matrizA->getQuantidadeColunas(), 1);
//clock_t start, end;
QString msg = "Se esta máquina possui uma placa gráfica da NVidia, ao clicar em 'Sim', "
"o método será executado em paralelo pela GPU existente na placa. Dessa forma, poderá haver um grande aumento de desempenho no tempo de execução.\n\n"
"Deseja ativar o processamento paralelo?";
if(!QMessageBox::question(this, "Confirmar Saída", msg, "Sim", "Não"))
{
matrizX = bicgstab_kernel(matrizA, matrizB, nIteracoes, erro, tempoExec); //executa no device
}
else
{
//start = clock();
matrizX = matrizA->BiCGStab(matrizB, nIteracoes, erro, tempoExec);
//matrizX = matrizA->BiCGStab((*matrizB), nIteracoes, erro);
//end = clock();
//tempoExec = ((double)(end - start) / ((double)CLOCKS_PER_SEC));
}
ofstream arquivoSaida;
dados = ui->lineEdit_3->text().toStdString();
dados += "/" + ui->lineEditNomeArqSai->text().toStdString();
arquivoSaida.open(dados.c_str());
if(!arquivoSaida.is_open())
{
string a = "ERRO NA ABERTURA DO ARQUIVO dados.txt";
throw a;
}
arquivoSaida<< "Quantidade Iterações: " << nIteracoes;
arquivoSaida<< "\nResíduo: " << erro;
arquivoSaida<< "\nTempo de execução do método: " << setw(10) << setfill('0') << setprecision(10) << tempoExec << " segundos";
arquivoSaida<< "\n\nvetor x:\n\n";
matrizX->imprimeVetor(arquivoSaida); //esse metodo imprime os dados no arquivo passado no parametro
arquivoSaida<< "\n\nMatriz A:\n\n";
matrizA->imprimeMatriz(arquivoSaida);
arquivoSaida<< "\n\nvetor b:\n\n";
matrizB->imprimeMatriz(arquivoSaida);
arquivoSaida.close();
}
else
{
string erro = "IMPOSSIVEL RESOLVER ESTE SISTEMA! A QUANTIDADE DE LINHAS DA MATRIZ 'A' DEVE SER IGUAL A "
"QUANTIDADE DE LINHAS DO VETOR 'b'. POR FAVOR, CORRIJA OS DADOS NOS ARQUIVOS!";
throw erro;
}
delete matrizA;
delete matrizB;
delete matrizX;
}
catch(string erro)
{
throw erro;
}
}