@@ -62,11 +62,65 @@ cmake --install .
62
62
63
63
## C++ 调用 QDPXX
64
64
65
- 我们现在可以通过 C++ 来调用 QDPXX 中定义的各种类和基础线性代数操作。我们将使用 CMake 配置项目。
65
+ 我们现在可以通过 C++ 来调用 QDPXX 中定义的各种类和基础线性代数操作。我们将使用 CMake 配置项目。直接通过 C++ 调用 QDPXX 能完成的任务有限,通常用于处理我们编写 Chroma 扩展的时候需要的一些简单操作。
66
+
67
+ 首先,需要通过 ` CMakeLists.txt ` 文件找到之前编译完成的 QDPXX,通常将 ` CMAKE_INSTALL_PREFIX ` 设置为之前使用的值即可。
68
+
69
+ ``` CMake
70
+ cmake_minimum_required(VERSION 3.0)
71
+ set(CMAKE_INSTALL_PREFIX "~/.local")
72
+ project(test_qdpxx LANGUAGES C CXX)
73
+
74
+ find_package(QDPXX REQUIRED)
75
+ add_executable(main main.cc)
76
+ target_link_libraries(main QPDXX::qdp)
77
+ ```
78
+
79
+ 这样,你就可以在 ` main.cc ` 文件中通过 ` #include <qdp.h> ` 来使用 QDPXX 中的各种功能。例如我们可以在其中定义随机的格点规范场 $U_ \mu(x)$ 和费米子场 $F(x)$,并计算 $\sum_ \mu U_ \mu(x)F(x+\hat\mu)$。
66
80
67
81
``` C++
82
+ #include < qdp.h>
83
+
84
+ using namespace QDP ;
85
+
86
+ int main (int argc, char * argv[ ] ) {
87
+ // 初始化 QDPXX
88
+ QDP_initialize(&argc, &argv);
89
+
90
+ // 设置格点规模,并创建 Layout
91
+ const int latdims[Nd] = {4, 4, 4, 8};
92
+ multi1d<int> nrow(Nd);
93
+ nrow = latdims;
94
+ Layout::setLattSize(nrow);
95
+ Layout::create();
96
+
97
+ // 创建规范场 U 并随机初始化
98
+ multi1d<LatticeColorMatrix> U(Nd);
99
+ for (int dir = 0; dir < Nd; ++dir) {
100
+ random(U[dir]);
101
+ }
102
+
103
+ // 创建费米子场 F 并随机初始化
104
+ LatticeFermion F;
105
+ random(F);
106
+
107
+ // 创建费米子场 UF 并置 0
108
+ LatticeFermion UF = zero;
109
+
110
+ // UF = \sum_\mu U_\mu(x) F(x+\hat\mu)
111
+ for (int dir = 0; dir < Nd; ++dir) {
112
+ UF += U[dir] * shift(F, FORWARD, dir);
113
+ }
114
+
115
+ // 结束 QDPXX
116
+ QDP_finalize();
117
+
118
+ return 0;
119
+ }
68
120
```
69
121
122
+ 这样,再额外添加一些与 Gamma 矩阵相关的操作就可以简单地实现 Dslash。
123
+
70
124
## Chroma
71
125
72
126
[Chroma](https://github.com/JeffersonLab/chroma) 是一个由 USQCD 合作组开发的,基于 QDPXX API 的格点 QCD 算法工具集,目前托管在 Jefferson 国家实验室。这是目前使用较为广泛的格点 QCD 软件,它通过 XML 文件描述计算流程,方便了不熟悉编程的初学者进行格点 QCD 计算。另外我们也可以直接使用 C++ 调用 Chroma 中定义的各种类和函数,定制我们需要的功能。
0 commit comments