int main(int argc, char** argv) { int i, j, N, flag; Matrix A=NULL, Q=NULL; Vector b, grid, e, lambda=NULL; double time, sum, h, tol=1e-4; if (argc < 3) { printf("need two parameters, N and flag [and tolerance]\n"); printf(" - N is the problem size (in each direction\n"); printf(" - flag = 1 -> Dense LU\n"); printf(" - flag = 2 -> Dense Cholesky\n"); printf(" - flag = 3 -> Full Gauss-Jacobi iterations\n"); printf(" - flag = 4 -> Full Gauss-Jacobi iterations using BLAS\n"); printf(" - flag = 5 -> Full Gauss-Seidel iterations\n"); printf(" - flag = 6 -> Full Gauss-Seidel iterations using BLAS\n"); printf(" - flag = 7 -> Full CG iterations\n"); printf(" - flag = 8 -> Matrix-less Gauss-Jacobi iterations\n"); printf(" - flag = 9 -> Matrix-less Gauss-Seidel iterations\n"); printf(" - flag = 10 -> Matrix-less Red-Black Gauss-Seidel iterations\n"); printf(" - flag = 11 -> Diagonalization\n"); printf(" - flag = 12 -> Diagonalization - FST\n"); printf(" - flag = 13 -> Matrix-less CG iterations\n"); return 1; } N=atoi(argv[1]); flag=atoi(argv[2]); if (argc > 3) tol = atof(argv[3]); if (N < 0) { printf("invalid problem size given\n"); return 2; } if (flag < 0 || flag > 13) { printf("invalid flag given\n"); return 3; } if (flag == 10 && (N-1)%2 != 0) { printf("need an even size for red-black iterations\n"); return 4; } if (flag == 12 && (N & (N-1)) != 0) { printf("need a power-of-two for fst-based diagonalization\n"); return 5; } h = 1.0/N; grid = equidistantMesh(0.0, 1.0, N); b = createVector(N-1); e = createVector(N-1); evalMeshInternal(b, grid, source); evalMeshInternal(e, grid, exact); scaleVector(b, pow(h, 2)); axpy(b, e, alpha); if (flag < 8) { A = createMatrix(N-1,N-1); diag(A, -1, -1.0); diag(A, 0, 2.0+alpha); diag(A, 1, -1.0); } if (flag >= 11 && flag < 13) lambda = generateEigenValuesP1D(N-1); if (flag == 11) Q = generateEigenMatrixP1D(N-1); time = WallTime(); if (flag == 1) { int* ipiv=NULL; lusolve(A, b, &ipiv); free(ipiv); } else if (flag == 2) llsolve(A,b,0); else if (flag == 3) printf("Gauss-Jacobi used %i iterations\n", GaussJacobi(A, b, tol, 10000000)); else if (flag == 4) printf("Gauss-Jacobi used %i iterations\n", GaussJacobiBlas(A, b, tol, 10000000)); else if (flag == 5) printf("Gauss-Seidel used %i iterations\n", GaussSeidel(A, b, tol, 10000000)); else if (flag == 6) printf("Gauss-Seidel used %i iterations\n", GaussSeidelBlas(A, b, tol, 10000000)); else if (flag == 7) printf("CG used %i iterations\n", cg(A, b, 1e-8)); else if (flag == 8) printf("Gauss-Jacobi used %i iterations\n", GaussJacobiPoisson1D(b, tol, 10000000)); else if (flag == 9) printf("Gauss-Jacobi used %i iterations\n", GaussSeidelPoisson1D(b, tol, 10000000)); else if (flag == 10) printf("Gauss-Jacobi used %i iterations\n", GaussSeidelPoisson1Drb(b, tol, 10000000)); else if (flag == 11) DiagonalizationPoisson1D(b,lambda,Q); else if (flag == 12) DiagonalizationPoisson1Dfst(b,lambda); else if (flag == 13) printf("CG used %i iterations\n", cgMatrixFree(Poisson1D, b, tol)); printf("elapsed: %f\n", WallTime()-time); evalMeshInternal(e, grid, exact); axpy(b,e,-1.0); printf("max error: %e\n", maxNorm(b)); if (A) freeMatrix(A); if (Q) freeMatrix(Q); freeVector(grid); freeVector(b); freeVector(e); if (lambda) freeVector(lambda); return 0; }
/* ///////////////////////////////////////////////////////////////////////////////////////////////// // Funcao main ///////////////////////////////////////////////////////////////////////////////////////////////// */ int main(int argc,char *argv[]) { int n; /* / Numero de Equacoes */ double **A; /* / Matriz dos Coeficientes */ double *b; /* / Vetor b */ double *x0; /* / Vetor x0 */ double tol; /* / Tolerancia admitida */ int nmaxite; /* / Numero maximo de iteracoes */ double *x; /* / Vetor solucao */ int i; /* / Indexadores da matriz*/ int nite; /* / Numero total de iteracoes*/ FILE *fpin; /* / Ponteiro para o arquivo de dados*/ /* // Inicializa o MPI*/ MPI_Init(&argc,&argv); /* //inicia a contagem do tempo total de execução*/ Time.t_total = MPI_Wtime(); fpin = fopen(argv[1],"r"); if (fpin==NULL){ fprintf(stdout,"Erro ao tentar abrir o arquivo de dados\n"); fflush(stdout); } /* // Leitura do arquivo de dados */ n = readDataFile(fpin, &A, &b, &x0, &x, &nmaxite, &tol); /* //inicia a contagem do tempo de processamento */ Time.t_proc = MPI_Wtime() ; /* // Chama a funçao que gerencia os processos */ GaussJacobi(n,A,b,x0,nmaxite,tol,x,&nite); /* //finaliza a contagem do tempo de processamento */ Time.t_proc = MPI_Wtime() - Time.t_proc ; /* // Impressao da solucao do sistema */ fprintf(stdout,"A solucao do encontrada apos %d iteracoes foi:\n",nite); fprintf(stdout,"X[%d] = %f\n",0,x[0]); fprintf(stdout,"X[%d] = %f\n",n-1,x[n-1]); fflush(stdout); /* // Fecha os arquivos de entrada e saida */ fclose(fpin); /* // Libera memoria alocada */ for(i=0;i<n;i++) if (A[i]!=NULL) free(A[i]); if (A!=NULL) free(A); if (b!=NULL) free(b); if (x0!=NULL) free(x0); if (x!=NULL)free(x); /* //finaliza a contagem do tempo total de execução*/ Time.t_total = MPI_Wtime() -Time.t_total; /* //impressão dos tempos */ printf(" \n\nFIM DA EXECUCAO : "); printf( " \n\nNome do Executavel:%s",argv[0]); printf("\nArquivo de Entrada:%s",argv[1]); printf("\n\nTempo de Alocacao:%f",Time.t_aloc); printf("\nTempo de Leitura:%f",Time.t_leit); printf("\nTempo de Processamento:%f",Time.t_proc); printf("\nTempo total:%f\n\n",Time.t_total); /* // Finaliza o MPI em todos os processos */ MPI_Finalize(); return 0; }