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

📄 nrutil.h

📁 Schrodinger Equation 数值计算中的方程
💻 H
字号:

#pragma once
#include<string>
#include<cmath>
#include<complex>
//#include<iostream>
#include "assert.h"
//using namespace std;

typedef double DP;

    template<class T>
		inline const T SQR(const T &a){return a*a;}
	
	template<class T>
		inline const T MAX(const T &a,const T &b)
	{return b>a?(b):(a);}
	inline float MAX(const double &a,const float &b)
	{return b>a?float(b):(a);}
	inline float MAX(const float &a,const double &b)
	{return b>a?float(b):(a);}

	template<class T>
		inline const T MIN(const T &a,const T &b)
	{return b<a ? (b):(a);}
	inline float MIN(const double &a,const float &b)
	{return b<a ? (b):float(a);}
	inline float MIN(const float &a,const double &b)
	{return b<a ? float(b):(a);}

	template<class T>
		inline const T SIGN(const T &a, const T &b)
	{
		return b>=0 ? (a>=0 ? a:-a):(a>=0 ? -a:a);
	}
	inline float SIGN(const float &a,const double &b)
	{
		return b>=0 ? (a>=0 ? a:-a):(a>=0 ?-a:a);
	}
    inline float SIGN(const double &a,const float &b)
	{
		return b>=0 ? (a>=0 ?a:-a):(a>=0 ? -a:a);
	}

	template<class T>
		inline void SWAP(T &a,T &b)
	{
		T dum=a;a=b;b=dum;
	}

    namespace NR
	{
		//inline void nrerror(const string error_text)
		//{
			//std::cerr<<"Numerical Recipes run-time error..."<<endl;
			//std::cerr<<error_text<<endl;
			//std::cerr<<"...now exiting to system..."<<endl;
		//	exit(1);
		//}
	}
//////////////////////////////////////////////////////////////
template<class T>
class NRVec  
{
private:
	int nn;//size of array. upper index is nn-1
	T *v;

public:
	NRVec();
	explicit NRVec(int n);
	NRVec(const T &a, int n);
	NRVec(const T *a, int n);
	NRVec(const NRVec &rhs);
	NRVec &operator=(const NRVec &rhs);
	NRVec &operator=(const T &a);
    inline T & operator [](const int i)
	{
	return v[i];
	}
	inline const T & operator[](const int i) const
	{
	return v[i];
	}


	inline int size() const
	{
	return nn;
	}

	~NRVec();
};
//////////////////////////////////////////////////////////////
template<class T>
NRVec<T>::NRVec():nn(0),v(0){}

template<class T>
NRVec<T>::NRVec(int n):nn(n),v(new T[n]){}

template<class T>
NRVec<T>::NRVec(const T& a, int n):nn(n),v(new T[n])
{
	for(int i=0;i<n;i++)
		v[i]=a;
}


template<class T>
NRVec<T>::NRVec(const T *a, int n):nn(n),v(new T[n])
{
	for(int i=0;i<nn;i++)
		v[i]=*a++;
}

template<class T>
NRVec<T>::NRVec(const NRVec<T> &rhs):nn(rhs.nn),v(new T[nn])
{
	for(int i=0;i<nn;i++)
		v[i]=rhs[i];
}

template<class T>
NRVec<T> & NRVec<T>::operator =(const NRVec<T> &rhs)
{
	if(this !=&rhs)
	{
		if(nn!=rhs.nn){
			if(v!=0)delete [](v);
			nn=rhs.nn;
			v=new T[nn];
		}
		for(int i=0;i<nn;i++)
			v[i]=rhs[i];
	}
	return *this;
}

template <class T>
NRVec<T> & NRVec<T>::operator =(const T &a)
{
	for(int i=0;i<nn;i++)
		v[i]=a;
	return *this;
}

template <class T>
NRVec<T>::~NRVec()
{
	if(v!=0)
		delete [] (v);
}

//////////////////////////////////////////////////////
template<class T>
class NRMat  
{
private:
	int nn;
	int mm;
	T **v;
public:
	NRMat();
	NRMat(int n, int m);
	NRMat(const T &a, int n, int m);
	NRMat(const T *a, int n, int m);
	NRMat(const NRMat &rhs);
	NRMat & operator=(const NRMat &rhs);
	NRMat & operator=(const T &a);
    inline T* operator [](const int i)
		{return v[i];}
	inline const T* operator [](const int i) const
		{return v[i];}
	inline int nrows() const
	{return nn;}
	inline int ncols() const
		{return mm;}
	~NRMat();

};
//////////////////////////////////////////////////////
template<class T>
NRMat<T>::NRMat():nn(0),mm(0),v(0){}

template <class T>
NRMat<T>::NRMat(int n,int m):nn(n),mm(m),v(new T*[n])
//n--row;m--bollow;
{
	v[0]=new T[m*n];//the start point of pointer;
	
	for(int i=1;i<n;i++)
		v[i]=v[i-1]+m;
	//v[0],which is the 0-th row,  has m elements.
	//v[1],which is the 1-th row,  also has m elements consisting of
	// a row.
}

template <class T>
NRMat<T>::NRMat(const T &a, int n, int m):nn(n),mm(m),v(new T*[n])
{
	int i,j;
	v[0]=new T[m*n];
	for(i=1;i<n;i++)
		v[i]=v[i-1]+m;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			v[i][j]=a;
}

template <class T>
NRMat<T>::NRMat(const T*a, int n, int m):nn(n),mm(m),v(new T*[n])
{
	int i,j;
	v[0]=new T[m*n];
	for(i=1;i<n;i++)
		v[i]=v[i-1]+m;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			v[i][j]=*a++;
}

template<class T>
NRMat<T>::NRMat(const NRMat &rhs):nn(rhs.nn),mm(rhs.mm),v(new T*[nn])
{
	int i,j;
	v[0]=new T[mm*nn];
	for(i=1;i<nn;i++)
		v[i]=v[i-1]+mm;
	for(i=0;i<nn;i++)
		for(j=0;j<mm;j++)
			v[i][j]=rhs[i][j];
}

template <class T>
NRMat<T> & NRMat<T>::operator =(const NRMat<T> &rhs)
{
	if(this !=&rhs){
		int i,j;
		if(nn!=rhs.nn||mm!=rhs.mm){
			if(v!=0){
				delete[](v[0]);
				delete[] (v);
			}
			nn=rhs.nn;
			mm=rhs.mm;
			v=new T*[nn];
			v[0]=new T[mm*nn];
		}
		for(i=1;i<nn;i++)
			v[i]=v[i-1]+mm;
		for(i=0;i<nn;i++)
			for(j=0;j<mm;j++)
				v[i][j]=rhs[i][j];
	}
	return *this;
}

template <class T>
NRMat<T> & NRMat<T>::operator =(const T &a)
{
	for(int i=0;i<nn;i++)
		for(int j=0;j<mm;j++)
			v[i][j]=a;
		return *this;
}


template <class T>
NRMat<T>::~NRMat()
{
	if(v!=0){
		delete [](v[0]);
		delete [](v);
	}
}

⌨️ 快捷键说明

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