PetscErrorCode KSPComputeEigenvalues_CG(KSP ksp,PetscInt nmax,PetscReal *r,PetscReal *c,PetscInt *neig) { KSP_CG *cgP = (KSP_CG*)ksp->data; PetscScalar *d,*e; PetscReal *ee; PetscErrorCode ierr; PetscInt j,n = ksp->its; PetscFunctionBegin; if (nmax < n) SETERRQ(PetscObjectComm((PetscObject)ksp),PETSC_ERR_ARG_SIZ,"Not enough room in work space r and c for eigenvalues"); *neig = n; ierr = PetscMemzero(c,nmax*sizeof(PetscReal));CHKERRQ(ierr); if (!n) { PetscFunctionReturn(0); } d = cgP->d; e = cgP->e; ee = cgP->ee; /* copy tridiagonal matrix to work space */ for (j=0; j<n; j++) { r[j] = PetscRealPart(d[j]); ee[j] = PetscRealPart(e[j]); } LINPACKcgtql1(&n,r,ee,&j); if (j != 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from tql1(); eispack eigenvalue routine"); ierr = PetscSortReal(n,r);CHKERRQ(ierr); PetscFunctionReturn(0); }
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(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;i<nconv;i++) exact[i] = evals[i]; ierr = PetscFree(evals);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ PetscSortRemoveDupsReal - Sorts an array of doubles in place in increasing order removes all duplicate entries Not Collective Input Parameters: + n - number of values - v - array of doubles Output Parameter: . n - number of non-redundant values Level: intermediate Concepts: sorting^doubles .seealso: PetscSortReal(), PetscSortRemoveDupsInt() @*/ PetscErrorCode PetscSortRemoveDupsReal(PetscInt *n,PetscReal v[]) { PetscErrorCode ierr; PetscInt i,s = 0,N = *n, b = 0; PetscFunctionBegin; ierr = PetscSortReal(N,v);CHKERRQ(ierr); for (i=0; i<N-1; i++) { if (v[b+s+1] != v[b]) { v[b+1] = v[b+s+1]; b++; } else s++; } *n = N - s; PetscFunctionReturn(0); }
void PETSC_STDCALL petscsortreal_(PetscInt *n,PetscReal v[], int *__ierr ){ *__ierr = PetscSortReal(*n,v); }