IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 能带计算Slater-Koster方法的面向对象C++实现 -> 正文阅读

[C++知识库]能带计算Slater-Koster方法的面向对象C++实现

BandStruct.h? (沿着高对称线计算能带数据)

namespace TightBinding
{

	class BandStructure
	{
	public:
		BandStructure();

		Materials materials;
		SymmetryPoints symmetryPoints;

		std::vector<std::vector<double>> results;
		std::vector<unsigned int> symmetryPointsPositions;

		void Initialize(std::vector<std::string> path, unsigned int nrPoints = 600);
		std::vector<std::vector<double>> Compute(const Material& material, unsigned int startPoint, unsigned int endPoint, std::atomic_bool& terminate);

		unsigned int GetPointsNumber() const { return static_cast<unsigned int>(kpoints.size()); }

		const std::vector<std::string>& GetPath() const { return m_path; }
	private:
		std::vector<std::string> m_path;

		std::vector<Vector3D<double>> kpoints;
	};

}

BandStruct.h?

namespace TightBinding
{

	BandStructure::BandStructure()
	{
	}




	void BandStructure::Initialize(std::vector<std::string> path, unsigned int nrPoints)
	{
		kpoints.clear();
		results.clear();

		kpoints.reserve(nrPoints);
		results.reserve(nrPoints);

		m_path.swap(path);

		kpoints = symmetryPoints.GeneratePoints(m_path, nrPoints, symmetryPointsPositions);
	}


	std::vector<std::vector<double>> BandStructure::Compute(const Material& material, unsigned int startPoint, unsigned int endPoint, std::atomic_bool& terminate)
	{	
		std::vector<std::vector<double>> res;

		Hamiltonian hamiltonian(material);

		for (unsigned int i = startPoint; i < endPoint && !terminate; ++i)
		{
			hamiltonian.SetMatrix(kpoints[i]);
			hamiltonian.Diagonalize();

			const Eigen::VectorXd& eigenvals = hamiltonian.eigenvalues();

			res.emplace_back();
			res.back().reserve(eigenvals.rows());

			for (unsigned int level = 0; level < eigenvals.rows(); ++level)
				res.back().push_back(eigenvals(level));
		}

		return std::move(res);
	}

}

Hamiltonian.h??

namespace TightBinding
{


	class Hamiltonian
	{
	public:
		Hamiltonian(const Material& material);

		void SetMatrix(const Vector3D<double>& k);
		void Diagonalize();

		const Eigen::VectorXd& eigenvalues() const { return solver.eigenvalues(); }
	protected:
		inline static std::complex<double> g0(const Vector3D<double>& k);
		inline static std::complex<double> g1(const Vector3D<double>& k);
		inline static std::complex<double> g2(const Vector3D<double>& k);
		inline static std::complex<double> g3(const Vector3D<double>& k);

		const Material& m_material;

		Eigen::Matrix<std::complex<double>, 10, 10> matrix;

		Eigen::SelfAdjointEigenSolver<Eigen::MatrixXcd> solver;
	};

}

这里Hamiltonian的参数通过material这个对象传进去。这个对象定义了包含常见s,p轨道的hopping参数。

namespace TightBinding
{

	class Material
	{
	public:
		Material() : m_Esa(0), m_Epa(0), m_Esc(0), m_Epc(0), m_Esstara(0), m_Esstarc(0), m_Vss(0), m_Vxx(0), m_Vxy(0), m_Vsapc(0), m_Vscpa(0), m_Vsstarapc(0), m_Vpasstarc(0) {}

		Material(const std::string& Name, double Esa, double Epa, double Esc, double Epc, double Esstara, double Esstarc, double Vss, double Vxx, double Vxy, double Vsapc, double Vscpa, double Vsstarapc, double Vpasstarc);

		std::string name;


		// initialized with values from table 1 in P. Vogl et al.

		// a - anion, c - cation, s, p, sstar - the s, p and excited s orbitals, respectively
		double m_Esa;
		double m_Epa;
		double m_Esc;
		double m_Epc;
		double m_Esstara;
		double m_Esstarc;

		double m_Vss;
		double m_Vxx;
		double m_Vxy;
		double m_Vsapc;
		double m_Vscpa;
		double m_Vsstarapc;
		double m_Vpasstarc;
	};


	class Materials
	{
	public:
		Materials();

		std::map<std::string, Material> materials;
	};

}

SymmetryPoint.h 记录了一系列高对称点。

namespace TightBinding
{

	class SymmetryPoint
	{
	public:
		SymmetryPoint() {}

		SymmetryPoint(const std::string& Name, const Vector3D<double> pos) : name(Name), position(pos) {}

		SymmetryPoint(const SymmetryPoint& sym)
			: name(sym.name), position(sym.position)
		{
		}

		SymmetryPoint& operator=(const SymmetryPoint& sym)
		{
			name = sym.name;
			position = sym.position;

			return *this;
		}

		std::string name;
		Vector3D<double> position;
	};


	class SymmetryPoints
	{
	public:
		SymmetryPoints();

		std::map<std::string, SymmetryPoint> symmetryPoints;


		std::vector<Vector3D<double>> GeneratePoints(const std::vector<std::string>& path, unsigned int nrPoints, std::vector<unsigned int>& symmetryPointsPositions);
	};

}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 12:49:03  更:2021-10-29 12:49:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:56:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码