Пример #1
0
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;
}
Пример #2
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;
}