示例#1
0
void Poisson1DPre(Vector u, Vector v)
{
  Vector tmp = collectBeforePre(v);
  if (A1D) {
    llsolve(A1D, tmp, A1Dfactored);
    A1Dfactored = 1;
  } else
    cgMatrixFree(Poisson1Dnoborder, tmp, 1e-10);
  collectAfterPre(u, tmp);
  freeVector(tmp);
}
示例#2
0
int main(int argc, char** argv)
{
  int rank, size;
  init_app(argc, argv, &rank, &size);

  if (argc < 2) {
    printf("usage: %s <N> [L]\n",argv[0]);
    close_app();
    return 1;
  }

  /* the total number of grid points in each spatial direction is (N+1) */
  /* the total number of degrees-of-freedom in each spatial direction is (N-1) */
  int N  = atoi(argv[1]);
  int M  = N-1;
  double L=1.0;
  if (argc > 2)
    L = atof(argv[2]);

  double h = L/N;

  Matrix A = createPoisson2D(M, 0.0);

  Vector grid = createVector(M);
  for (int i=0;i<M;++i)
    grid->data[i] = (i+1)*h;

  Vector u = createVector(M*M);
  evalMesh(u, grid, grid, poisson_source);
  scaleVector(u, h*h);

  double time = WallTime();
  llsolve(A, u);

  evalMesh2(u, grid, grid, exact_solution, -1.0);
  double max = maxNorm(u);

  if (rank == 0) {
    printf("elapsed: %f\n", WallTime()-time);
    printf("max: %f\n", max);
  }

  freeVector(u);
  freeVector(grid);
  freeMatrix(A);

  close_app();
  return 0;
}
示例#3
0
文件: poisson1D.c 项目: akva2/tma4280
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;
}