Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

56 lines
2.2 KiB

/*
* Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
* NTESS, the U.S. Government retains certain rights in this software.
*
* See packages/seacas/LICENSE for details
*/
#include "defs.h"
#include <stdio.h> // for NULL
/* Assemble eigenvectors, return bounds, etc. */
void mkeigvecs(struct scanlink *scanlist, /* linked list of fields to do with min ritz vals */
double *lambda, /* ritz approximation to eigenvals of A */
double *bound, /* on ritz pair approximations to eig pairs of A */
int *index, /* the Ritz index of an eigenpair */
double *bj, /* beta(j)*(last el. of corr. eigvec s of T) */
int d, /* problem dimension = number of eigvecs to find */
double *Sres_max, /* Max value of Sres */
double *alpha, /* vector of Lanczos scalars */
double *beta, /* vector of Lanczos scalars */
int j, /* number of Lanczos iterations taken */
double *s, /* approximate eigenvector of T */
double **y, /* columns of y are eigenvectors of A */
int n, /* problem size */
double **q /* columns of q are Lanczos basis vectors */
)
{
int i, k; /* indcies */
double Sres; /* how well Tevec calculated eigvec s */
struct scanlink *curlnk; /* for traversing the scanlist */
/* Scan for some data which is used here or later */
i = d;
curlnk = scanlist;
while (curlnk != NULL) {
lambda[i] = curlnk->val;
bound[i] = bj[curlnk->indx];
index[i] = curlnk->indx;
curlnk = curlnk->pntr;
i--;
}
/* Assemble the evecs from the Lanczos basis */
for (i = 1; i <= d; i++) {
Sres = Tevec(alpha, beta - 1, j, lambda[i], s);
if (Sres > *Sres_max) {
*Sres_max = Sres;
}
setvec(y[i], 1, n, 0.0);
for (k = 1; k <= j; k++) {
scadd(y[i], 1, n, s[k], q[k]);
}
}
}