⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmatrixa.h

📁 ARPACK is a collection of Fortran77 subroutines designed to solve large scale eigenvalue problems.
💻 H
字号:
/*   ARPACK++ v1.0 8/1/1997   c++ interface to ARPACK code.   MODULE CMatrixA.h   Class template for the nx*nx by nx*nx block tridiagonal matrix                              | T -I          |                              |-I  T -I       |                         OP = |   -I  T       |                              |        ...  -I|                              |           -I T|   derived from the standard central difference discretization   of the 2 dimensional convection-diffusion operator                       (Laplacian u) + rho*(du/dx)    on a unit square with zero boundary condition.   T is a nx by nx tridiagonal matrix with DD on the diagonal,   DL on the subdiagonal, and DU on the superdiagonal.   ARPACK Authors      Richard Lehoucq      Danny Sorensen      Chao Yang      Dept. of Computational & Applied Mathematics      Rice University      Houston, Texas*/#ifndef CMATRIXA_H#define CMATRIXA_H#include "arcomp.h"#include "blas1c.h"#include "arcomp.h"#include "matprod.h"template<class T>class CompMatrixA: public MatrixWithProduct<arcomplex<T> > { private:  int nx;  void MultTv(arcomplex<T>* x, arcomplex<T>* y); public:  void MultMv(arcomplex<T>* v, arcomplex<T>* w);  CompMatrixA(int nxval);}; // CompMatrixA.template<class T>void CompMatrixA<T>::MultTv(arcomplex<T>* x, arcomplex<T>* y)/*  Computes the matrix vector multiplication y <- T*x  where T is a nx by nx tridiagonal matrix with DD on the  diagonal, DL on the subdiagonal, and DU on the superdiagonal.*/{  int          j;  arcomplex<T> h, h2, dd, dl, du;  const arcomplex<T> half(0.5,0.0);  const arcomplex<T> one(1.0,0.0);  const arcomplex<T> four(4.0,0.0);  const arcomplex<T> rho(1.0e2,0.0);  h   = one/arcomplex<T>(nx+1,0);  h2  = h*h;  dd  = four/h2;  dl  = -one/h2 - half*rho/h;  du  = -one/h2 + half*rho/h;  y[0] = dd*x[0] + du*x[1];  for (j = 1; j<nx-1; j++) {    y[j] = dl*x[j-1] + dd*x[j] + du*x[j+1];  }  y[nx-1] =  dl*x[nx-2] + dd*x[nx-1];  return;} // MultTvtemplate<class T>void CompMatrixA<T>::MultMv(arcomplex<T>* v, arcomplex<T>* w)/*  Matrix-vector subroutine. Computes w <- M*v.*/{  int          j, lo;  arcomplex<T> h2;  const arcomplex<T> one(1.0,0.0);  h2 = one/arcomplex<T>((nx+1)*(nx+1),0.0);  MultTv(v,w);  axpy(nx, -one/h2, &v[nx], 1, w, 1);  for (j = 2; j<=nx-1; j++) {    lo = (j-1)*nx;    MultTv(&v[lo], &w[lo]);    axpy(nx, -one/h2, &v[lo-nx], 1, &w[lo], 1);    axpy(nx, -one/h2, &v[lo+nx], 1, &w[lo], 1);  }  lo = (nx-1)*nx;  MultTv(&v[lo], &w[lo]);  axpy(nx, -one/h2, &v[lo-nx], 1, &w[lo], 1);  return;} //  MultMvtemplate<class T>CompMatrixA<T>::CompMatrixA(int nxval):  MatrixWithProduct<arcomplex<T> >(nxval*nxval)/*  Constructor.*/{  nx = nxval;} // constructor.#endif // CMATRIXA_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -