/*
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SLEPc - Scalable Library for Eigenvalue Problem Computations
Copyright (c) 2002-2016, Universitat Politecnica de Valencia, Spain
This file is part of SLEPc.
SLEPc is free software: you can redistribute it and/or modify it under the
terms of version 3 of the GNU Lesser General Public License as published by
the Free Software Foundation.
SLEPc is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with SLEPc. If not, see .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
static char help[] = "Standard symmetric eigenproblem for the 3-D Laplacian built with the DM interface.\n\n"
"Use -seed to modify the random initial vector.\n"
"Use -da_grid_x etc. to change the problem size.\n\n";
#include
#include
#include
#undef __FUNCT__
#define __FUNCT__ "GetExactEigenvalues"
PetscErrorCode GetExactEigenvalues(PetscInt M,PetscInt N,PetscInt P,PetscInt nconv,PetscReal *exact)
{
PetscInt n,i,j,k,l;
PetscReal *evals,ax,ay,az,sx,sy,sz;
PetscErrorCode ierr;
PetscFunctionBeginUser;
ax = PETSC_PI/2/(M+1);
ay = PETSC_PI/2/(N+1);
az = PETSC_PI/2/(P+1);
n = PetscCeilReal(PetscPowReal((PetscReal)nconv,0.33333)+1);
ierr = PetscMalloc1(n*n*n,&evals);CHKERRQ(ierr);
l = 0;
for (i=1;i<=n;i++) {
sx = PetscSinReal(ax*i);
for (j=1;j<=n;j++) {
sy = PetscSinReal(ay*j);
for (k=1;k<=n;k++) {
sz = PetscSinReal(az*k);
evals[l++] = 4.0*(sx*sx+sy*sy+sz*sz);
}
}
}
ierr = PetscSortReal(n*n*n,evals);CHKERRQ(ierr);
for (i=0;i0) { v[idx]=-1.0; col[idx].i=i; col[idx].j=j; col[idx].k=k-1; idx++; }
if (j>0) { v[idx]=-1.0; col[idx].i=i; col[idx].j=j-1; col[idx].k=k; idx++; }
if (i>0) { v[idx]=-1.0; col[idx].i=i-1; col[idx].j=j; col[idx].k=k; idx++; }
ierr = MatSetValuesStencil(A,1,&row,idx,col,v,INSERT_VALUES);CHKERRQ(ierr);
}
}
}
// test for rotation boundary condition
for (k=zs;k=0");
ierr = MatCreateVecs(A,&v0,NULL);CHKERRQ(ierr);
ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rctx);CHKERRQ(ierr);
ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr);
for (i=0;i0) {
ierr = PetscMalloc1(nconv,&exact);CHKERRQ(ierr);
ierr = GetExactEigenvalues(M,N,P,nconv,exact);CHKERRQ(ierr);
/*
Display eigenvalues and relative errors
*/
ierr = PetscPrintf(PETSC_COMM_WORLD,
" k ||Ax-kx||/||kx|| Eigenvalue Error \n"
" ----------------- ------------------ ------------------\n");CHKERRQ(ierr);
for (i=0;i