Quick actions

cmd+k|ctrl+k

Navigation

Languages

biggstab

Snippet info

Language

C

Visibility

public

Author

adm.unifacs1

Created

2020-07-26T15:52:55Z

Updated

2020-07-26T15:54:14Z

#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;
    }
}

INFO