<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://funyday-k.github.io/lingyuxia/feed.xml" rel="self" type="application/atom+xml" /><link href="https://funyday-k.github.io/lingyuxia/" rel="alternate" type="text/html" /><updated>2026-03-24T01:29:00-07:00</updated><id>https://funyday-k.github.io/lingyuxia/feed.xml</id><title type="html">Lingyu Xia / 夏凌羽</title><subtitle>Hello, I&apos;m Xia lingyu(夏凌羽). Very glad to meet  you!</subtitle><author><name>Lingyu Xia</name><email>lingyuxia@link.cuhk.edu.hk</email></author><entry><title type="html">My Bachelor Thesis</title><link href="https://funyday-k.github.io/lingyuxia/posts/2025/06/blog-post-4/" rel="alternate" type="text/html" title="My Bachelor Thesis" /><published>2025-06-15T00:00:00-07:00</published><updated>2025-06-15T00:00:00-07:00</updated><id>https://funyday-k.github.io/lingyuxia/posts/2025/06/blog</id><content type="html" xml:base="https://funyday-k.github.io/lingyuxia/posts/2025/06/blog-post-4/"><![CDATA[<p>Here is my bachelor thesis <a href="/lingyuxia/files/Thesis.pdf">PDF</a></p>]]></content><author><name>Lingyu Xia</name><email>lingyuxia@link.cuhk.edu.hk</email></author><category term="2025" /><category term="Fall" /><summary type="html"><![CDATA[Here is my bachelor thesis PDF]]></summary></entry><entry><title type="html">从经典场论走向弯曲时空</title><link href="https://funyday-k.github.io/lingyuxia/posts/2022/08/blog-post-2/" rel="alternate" type="text/html" title="从经典场论走向弯曲时空" /><published>2022-08-14T00:00:00-07:00</published><updated>2022-08-14T00:00:00-07:00</updated><id>https://funyday-k.github.io/lingyuxia/posts/2022/08/blog</id><content type="html" xml:base="https://funyday-k.github.io/lingyuxia/posts/2022/08/blog-post-2/"><![CDATA[<h1 id="从经典场论走向弯曲时空">从经典场论走向弯曲时空</h1>

<p>Prof: Hong Zhang</p>

<p>Year: 2022, Fall</p>

<p>type: Paper</p>

<p>此文是对于目前学习广义相对论的一个小总结，从场论的视角来总结如何从经典场论到爱因斯坦场论，当然，若说是经典场论也不完全，这种过渡更是从平直时空到弯曲时空的过程</p>

<hr />

<h2 id="1-走在平直的路"><strong>1. 走在平直的路</strong></h2>

<p>对于场论，最基本的就是<strong>作用量</strong> S 和<strong>拉格朗日量</strong> L ，如果是最基本对于一个质点的运动，其表达为</p>

\[\begin{align*} S=\int dt \,L(q,\dot{q}) \end{align*}\]

<p>对于质点的拉格朗日量其表达式为$L=T−V$</p>

<p>我们可以根据最小作用量原理推得欧拉-拉格朗日方程</p>

\[\frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q_i}}\right)-\frac{\partial L}{\partial q_i} \]

<p>同样的，我们研究场的性质和上边的是类似的，对于场的拉格朗日量与一个关于时空坐标的场分布函数 $\Phi^{i}(x^{\mu})$有关，而这个场可以标量场，也可以是矢量场或者张量场</p>

<p>加上场的导数$\partial _{\mu}\Phi^{i}$ 来表示拉格朗日量（这里先考虑不含时的场），那么拉格朗日量可以表示成以下形式</p>

\[ L=\int d^{3}x \mathcal{L}(\Phi^{i},\partial_{\mu} \Phi^{i}) \]

<p>其中$\mathcal{L}(\Phi^{i},\partial_{\mu} \Phi^{i})$我们称之为<strong>拉格朗日量密度</strong>，毕竟一个场是弥漫在整个空间的，因此我们需要得到密度再积分整个空间，那么作用量的表达式为</p>

\[ S=\int dt \, L=\int d^{4}x\, \mathcal{L}(\Phi^{i},\partial _{\mu}\Phi^{i})\]

<p>为了求出场的等效的欧拉-拉格朗日方程，我们同样利用最小作用原理，先给场一个微小的变化</p>

\[\begin{cases} \Phi^{i}\rightarrow \Phi^{i}+\delta \Phi^{i}\\ \partial _{\mu}\Phi^{i}\rightarrow \partial _{\mu}\Phi^{i}+\delta(\partial _{\mu}\Phi^{i})= \partial _{\mu}\Phi^{i}+\partial _{\mu}(\delta\Phi^{i}) \end{cases}\]

<p>那么，相应的拉格朗日密度有</p>

\[\begin{align*} \mathcal{L}(\Phi^{i},\partial _{\mu}\Phi^{i})\rightarrow &amp;\mathcal{L}(\Phi^{i}+\delta\Phi^{i},\partial _{\mu}\Phi^{i}+\partial _{\mu}(\delta \Phi^{i}))\\ &amp;=\mathcal{L}(\Phi^{i},\partial _{\mu}\Phi^{i})+\frac{\partial \mathcal{L}}{\partial \Phi^{i}}\delta \Phi^{i}+\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\partial _{\mu}(\delta \Phi^{i}) \end{align*}\]

<p>而对于真实的场分布其作用量变分为零，将拉格朗日密度代入</p>

\[ \delta S=\int d^{4}x\left[\frac{\partial \mathcal{L}}{\partial \Phi^{i}}\delta \Phi^{i}+\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\partial _{\mu}(\delta \Phi^{i})\right] \]

<p>和常规的处理方式一样，将第二项利用分部积分处理，会得到一个积分项以及一个全微分项，对于全微分项的大小完全取决于所谓的初始条件，我们可以把它扔掉</p>

\[ \int d^{4}x\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\partial _{\mu}(\delta \Phi^{i})=-\int d^{4}x\partial _{\mu}\left(\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\right)\delta \Phi^{i}\\+\underset{ {\huge{\uparrow扔了}}}{\int d^{4}x\partial _{\mu}\left(\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\delta \Phi^{i}\right)}\]

<p>剩下的可以得到作用量的变分的表达式</p>

\[ \delta S =\int d^{4}x\left[\frac{\partial \mathcal{L}}{\partial \Phi^{i}}-\partial _{\mu}\left(\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\right)\right]\delta \Phi^{i} \]

<p>令 δS=0 ，可以得到对于场的<strong>欧拉-拉格朗日方程</strong></p>

\[\frac{\partial \mathcal{L}}{\partial \Phi^{i}}-\partial _{\mu}\left(\frac{\partial \mathcal{L}}{\partial (\partial _{\mu}\Phi^{i})}\right)=0 \]

<p>我们以最简单的标量场来具体展示，对于四维时空，标量场本质就是时空坐标到 R 的映射</p>

<p>显然，四维时空的标量场需要遵守洛伦兹不变性，因此我们以此构造出拉格朗日方程</p>

\[\mathcal{L}=-\frac{1}{2}\eta^{\mu\nu}(\partial _{\mu}\phi)(\partial _{\nu}\phi)-V(\phi) \]

<p>很显然，该拉格朗日密度满足洛伦兹不变性，则有关系</p>

\[ \begin{cases} \dfrac{\partial \mathcal{L}}{\partial \phi}=-\dfrac{d V}{d \phi}\\ \dfrac{\partial \mathcal{L}}{\partial (\partial _{\mu}\phi)}=-\eta^{\mu\nu}\partial _{\nu}\phi \end{cases}\]

<p>我们将上式子代入到欧拉-拉格朗日方程，就可以得到</p>

\[\Box \phi-\frac{d V}{d \phi}=0\]

<p>其中$\Box\equiv \eta^{\mu\nu}\partial _{\mu}\partial _{\nu}$，被称为达朗贝尔算符，显然在闵可夫斯基度规下</p>

\[\Box \phi= \eta^{\mu\nu}\partial _{\mu}\partial _{\nu} \phi=\ddot{\phi}-\nabla ^{2}\phi\]

<h2 id="2-走向弯曲前的准备"><strong>2. 走向弯曲前的准备</strong></h2>

<p>当我们考虑在弯曲时空下的场的时候，事情变得更加复杂了，由于空间的弯曲，时空中每一处的度规会发生改变，相应的我们原来运算部分就需要修正了</p>

<p>首先需要修正的是算符，之所以需要修正，主要因为之前所使用的偏导算符是依赖于坐标系的选定的，但是我们希望得到坐标无关的算符来描述更为一般的流形的性质，因此我们需要引入<strong>协变算符$\nabla_{\mu}$</strong>，其定义为 $\nabla : \mathscr{F}<em>{M}(k,l)\rightarrow\mathscr{F}</em>{M}(k,l+1)$，其满足以下性质</p>

<ul>
  <li>线性性：$\nabla <em>{\mu}(a\mathbf{T}+b\mathbf{S})=a \nabla</em>{\mu} \mathbf{T}+b \nabla_{\mu} \mathbf{S}$</li>
  <li>莱布尼兹律： $\nabla <em>{\mu}(\mathbf{T}\otimes\mathbf{S})=( \nabla</em>{\mu} \mathbf{T})\otimes\mathbf{S}+(\nabla_{\mu} \mathbf{S})\otimes\mathbf{T}$</li>
</ul>

<p>如果我们想要进行坐标变换，显然会有</p>

\[\nabla _{\mu'}V^{\nu'}=\frac{\partial x^{\mu}}{\partial x^{\mu'}}\frac{\partial x^{\nu'}}{\partial x^{\nu}}\nabla _{\mu}V^{\nu} \]

<p>而其对于偏导算符的差别（作用于一个矢量）可以表达为</p>

\[\nabla _{\mu}V^{\nu}=\partial _{\mu}V^{\nu}+\Gamma_{\mu\lambda }^{\nu}V^{\lambda } \]

<p>其中，$\Gamma_{\mu \lambda }^{\nu}$称之为<strong>克里斯托弗符号</strong>，之所以称之为所谓的“符号”是因为其不具备坐标变换不变性，不能称之为张量，其也称之为<strong>联络系数</strong>，是用来描述曲面的性质的量，其满足以下性质</p>

<ul>
  <li>无挠性：$\Gamma_{\mu \lambda }^{\nu}=\Gamma_{\lambda \mu}^{\nu}$</li>
  <li>度规相容性： $\nabla <em>{\rho}g</em>{\mu\nu}=0$</li>
</ul>

<p>而从度规相容性出发，我们可以得到联络和度规的关系</p>

\[\Gamma_{\mu\nu}^{\sigma}=\frac{1}{2}g^{\sigma\rho}(g_{\nu\rho,\mu}+g_{\rho\mu,\nu}-g_{\mu\nu,\rho})\]

<p>其中$g_{\nu\rho,\mu}=\partial <em>{\mu}g</em>{\nu\rho}$，根据这个表达式我们可以很明显得到，当度规是闵可夫斯基度规的时候，克里斯托弗符号为零，则此时协变算符和偏导算符等价</p>

<p>而从协变导数出发，我们还可以得到几个典型的张量；首先是黎曼张量，其由协变导数的交换子得出</p>

\[[\nabla _{\mu},\nabla _{\nu}]V^{\rho}=R_{\sigma\mu\nu}^{\rho}V^{\sigma}\]

<p>其中 $R_{\sigma\mu\nu}^{\rho}$称之为<strong>黎曼张量</strong>，利用协变导数的性质展开得到</p>

\[R_{\sigma\mu\nu}^{\rho}=\partial _{\mu}\Gamma_{\nu\sigma}^{\rho}-\partial _{\nu}\Gamma_{\mu\sigma}^{\rho}+\Gamma_{\mu \lambda }^{\rho}\Gamma_{\nu\sigma}^{\lambda }-\Gamma_{\nu \lambda }^{\rho}\Gamma_{\mu \sigma}^{\lambda }\]

<p>其性质我们直接罗列出来，首先用度规降指标得到一个新的张量，则有性质</p>

\[R_{\rho\sigma\mu\nu}=g_{\rho \lambda }R_{\sigma\mu\nu}^{\rho}\]

<ul>
  <li>反对称性：$R_{[\rho\sigma\mu\nu]}=0$</li>
  <li><strong>毕安基恒等式</strong>： $\nabla <em>{[\lambda }R</em>{\rho\sigma]\mu\nu}=0$</li>
</ul>

<p>如果我们令黎曼张量进行一次缩并，则可以得到<strong>里奇张量</strong></p>

<p>Rμν=Rμλνλ</p>

<p>显然，进行缩并所得到的张量可以理解为黎曼张量的对称部分，则有性质</p>

<p>Rμν=Rνμ</p>

<p>而里奇张量求迹，可得到<strong>里奇标量</strong></p>

\[R_{\mu\nu}=R_{\mu \lambda \nu}^{\lambda }\]

<p>另外对于黎曼张量的无迹部分，可以由<strong>外尔张量</strong>表征</p>

\[C_{\rho\sigma\mu\nu}=R_{\rho\sigma\mu\nu}-\frac{2}{n-2}(g_{\rho[\mu}R_{\nu]\sigma}-g_{\sigma[\mu}R_{\nu]\rho})+\frac{2}{(n-1)(n-2)}g_{\rho[\mu}g_{\nu]\sigma}R\]

<p>最后，我们还可以定义<strong>爱因斯坦张量</strong></p>

\[G_{\mu\nu}=R_{\mu\nu}-\frac{1}{2}Rg_{\mu\nu}\]

<p>根据毕安基恒等式，爱因斯坦张量显然满足</p>

\[\nabla ^{\mu}G_{\mu\nu}=0\]

<p>而有了这个性质，才为之后的爱因斯坦场方程做了铺垫（即使当时爱因斯坦一开始不知道毕安基恒等式，而凑出来的这个方程）</p>

<h2 id="3-走到弯曲的路"><strong>3. 走到弯曲的路</strong></h2>

<p>有了之前的各种描述弯曲时空的张量的铺垫，我们便可以放心大胆的走向弯曲的道路了</p>

<p>那么首先，对于弯曲时空的作用量和拉格朗日量会有所修正，我们不妨先从最简单的标量场开始，即我们应当用$\Phi^{i}$和其协变导数 $\nabla _{\mu}\Phi^{i}$来描述，则有表达式</p>

\[S=\int\mathcal{L}(\Phi^{i},\nabla _{\mu}\Phi^{i})d^{n}x \]

<p>我们对于拉格朗日密度做出一个修正</p>

\[\mathcal{L}=\sqrt{-g}\widehat{\mathcal{L}}\]

<p>其中$\sqrt{-g}=\sqrt{-\text{det}\,g}$,那么欧拉-拉格朗日方程</p>

\[ \frac{\partial \widehat{\mathcal{L}}}{\partial \Phi}-\nabla _{\mu}\left(\frac{\partial \widehat{\mathcal{L}}}{\partial (\nabla _{\mu}\Phi)}\right)=0 \]

<p>显然这对于一般的场是显然的，也会推出我们之前得到的结论</p>

\[\Box \phi-\frac{d V}{d \phi}=0 \]

<p>其中 $\Box=g^{\mu\nu}\nabla _{\mu }\nabla _{\nu}$</p>

<p>而对于一般的弯曲时空的作用量我们又该如何描述呢，此时的变量由一般的标量场变为了度规的变化，这时候我们联系到了之前的里奇标量，这是我们熟悉的唯一的由黎曼张量构造的标量，我们不妨将其表示出作用量</p>

\[S_{H}=\int \sqrt{-g}R\,d^{\,n}x \]

<p>这就是<strong>希尔伯特作用量</strong>， 我们将会使用最小作用量来验证其正确性</p>

<p>首先，作为变量的度规，我们写出其微分形式</p>

\[\delta g_{\mu\nu}=-g_{\mu\rho}g_{\nu\sigma}\delta g^{\rho\sigma}\]

<p>那么作用量的微分由三部分组成</p>

\[\delta S_{H}=\underset{1\bf{部分}}{\int d^{\,n}x \sqrt{-g}g^{\mu\nu}\delta R_{\mu\nu}}+\underset{2\bf{部分}}{\int d^{\,n}x \sqrt{-g}R_{\mu\nu}\delta g^{\mu\nu}}+\underset{3\bf{部分}}{\int d^{\,n}x R\delta \sqrt{-g}} \]

<p>对于第一部分，黎曼张量和克里斯托弗符号的微分形式可以表示为（具体计算过程略）</p>

\[\delta R_{\mu\lambda \nu}^{\rho}=\nabla _{\lambda }(\delta \Gamma_{\nu\mu}^{\rho})-\nabla _{\nu}(\delta \Gamma_{\lambda \mu}^{\rho})\\ \delta \Gamma_{\mu\nu}^{\sigma}=-\frac{1}{2}\left[g_{\lambda \mu}\nabla _{\nu}(\delta g^{\lambda \sigma})+g_{\lambda \nu}\nabla _{\mu}(\delta g^{\lambda \sigma})-g_{ \mu \alpha}g_{\nu \beta}\nabla ^{\sigma}(\delta g^{\alpha \beta})\right]\]

<p>则第一部分可写为</p>

\[ (\delta S_{H})_{1}=\int d^{n}x\sqrt{-g}\nabla _{\sigma}[g_{\mu\nu}\nabla ^{\sigma}(\delta g^{\mu\nu})-\nabla _{\lambda }(\delta g^{\sigma \lambda })] \]

<p>对于第三部分，要对其行列式求微分，我们有关系</p>

\[\begin{align*} &amp;\ln (\text{det} g )=\text{Tr }(\ln g)\\ \implies &amp;\frac{1}{\text{det}g}\delta (\text{det}g)=\text{Tr }(g^{-1}\delta g)\\ \implies&amp;\delta g=-g(g_{\mu\nu}\delta g^{\mu\nu})\\ \implies&amp;\delta \sqrt{-g}=-\frac{1}{2}\sqrt{-g}g_{\mu\nu}\delta g^{\mu\nu} \end{align*}\]

<p>最后我们整理得到</p>

\[\delta S =\int d^{n}x\sqrt{-g}\left[R_{\mu\nu}-\frac{ 1}{2}Rg_{\mu\nu}\right]\delta g_{\mu\nu} \]

<p>令$\delta S=0$可得到</p>

\[\frac{1}{\sqrt{-g}}\frac{\delta S_{H}}{\delta g^{\mu\nu}}=R_{\mu\nu}-\frac{1}{2}Rg_{\mu\nu}=0\]

<p>于是我们就得到了在真空中的爱因斯坦场方程了，如果要考虑由非真空的场方程，我们因此需要给作用量添加物质项，于是完整的作用量表达式为</p>

\[S=\frac{ 1}{16\pi G}S_{H}+S_{M} \]

<p>同样的，利用最小作用量原理得到</p>

\[\frac{1}{\sqrt{-g}}\frac{\delta S_{H}}{\delta g^{\mu\nu}}=\frac{1}{16\pi G}\left(R_{\mu\nu}-\frac{1}{2}Rg_{\mu\nu}\right)+\frac{1}{\sqrt{-g}}\frac{\delta S_{M}}{\delta g^{\mu\nu}}=0 \]

<p>我们设  $T_{\mu\nu}=-\frac{2}{\sqrt{-g}}\frac{\delta S_{M}}{\delta g^{\mu\nu}}$ ，称之为<strong>能量动量张量</strong></p>

<p>于是我们就得到了著名的爱因斯坦场方程的表达式了</p>

\[R_{\mu\nu}-\frac{ 1}{2}Rg_{\mu\nu}=8\pi GT_{\mu\nu}\]

<p>这就是我们从经典场论走到弯曲时空的一个大致的历程，当然其中忽略了很多细节，因此本文只是作为在学习广相的过程中做的一个小总结，当然推得爱因斯坦场方程的方式不止这样的一种，很多书都会去介绍我们如何去“凑”出来这个方程，当然爱因斯坦一开始也是“凑”出来的，但如何凑的想法体现出了比较明显的物理图像的。</p>]]></content><author><name>Lingyu Xia</name><email>lingyuxia@link.cuhk.edu.hk</email></author><category term="2022" /><category term="Fall" /><summary type="html"><![CDATA[从经典场论走向弯曲时空]]></summary></entry><entry><title type="html">Athena++</title><link href="https://funyday-k.github.io/lingyuxia/posts/2022/08/blog-post-1/" rel="alternate" type="text/html" title="Athena++" /><published>2022-08-14T00:00:00-07:00</published><updated>2022-08-14T00:00:00-07:00</updated><id>https://funyday-k.github.io/lingyuxia/posts/2022/08/blog-post-3/Athena++</id><content type="html" xml:base="https://funyday-k.github.io/lingyuxia/posts/2022/08/blog-post-1/"><![CDATA[<h1 id="athena">Athena++</h1>

<p>Prof: Suoqing Ji
Year: 2022, Fall
type: Paper</p>

<p>经过一个暑假的学习与实践，大概的对利用Athena++进行数值模拟有了一个初步的认识，所以，通过这个文档来总结一下所学所为，当然，毕竟是初步的学习，所以了解有限。</p>

<hr />

<h2 id="0简单的list"><strong>0.简单的List</strong></h2>

<p>我觉得有必要List一下这个假期我干了什么…</p>

<ul>
  <li>学习使用athena++，包括编译、配置输入文件的参数、利用Vislt和yt读取生成的HDF5文件</li>
  <li>选择Jet项目进行了模拟，分别用Vislt和yt可视化工具做出了图像，并初步的学习了有关的流体力学的知识，并简单的分析了Jet的发展的结构。</li>
  <li>简陋的了解了一点流体力学的知识。</li>
  <li>学习《黑洞系统的吸积与喷流》一书，大概了解了黑洞的吸积的原理，以及如何提取黑洞的能量并将其转化为喷流的能量的机制</li>
</ul>

<p>除此之外，在之后我应该干的事情也应该列举一下，否则不知应该怎么努力</p>

<ul>
  <li>继续学习《黑洞系统的吸积与喷流》一书，对于活动星系核有一个比较general的理解，之后才能更具体地去了解怎样做数值模拟地工作</li>
  <li>继续学习流体力学的知识，这是数值模拟最根本的理论基础</li>
  <li>学会如何使用yt去分析进行数值分析</li>
  <li>学会如何利用python将HDF5产生的可视化的图片制作成视频而不依靠Vislt</li>
</ul>

<hr />

<h2 id="1数值模拟工具athena"><strong>1.数值模拟工具——athena++</strong></h2>

<p><img src="/lingyuxia/images/posts/athena/athena_logo_temporary.png" alt="Athena++的logo" /></p>

<p>Athena++的logo</p>

<h3 id="11-一个初步的介绍"><strong>1.1 一个初步的介绍</strong></h3>

<p>Athena是一个由Stone教授于2008年基于C语言开发的高阶数值模拟程序，其更侧重于MHD问题的数值模拟。而Athena++又是重新利用C++开发的新一代数值模拟代码，与早期版本相比，Athena++ 代码具有</p>

<ol>
  <li>更灵活的坐标和网格选项，包括自适应网格细化</li>
  <li>包括广义相对论在内的新物理学</li>
  <li>显着提高了性能和可扩展性</li>
  <li>提高了源代码清晰度和模块化</li>
</ol>

<h3 id="12-如何使用athena代码"><strong>1.2 如何使用Athena++代码</strong></h3>

<p>首先直接搜索Athena++是有一个链接的<a href="https://www.athena-astro.app/">网址</a></p>

<p><img src="/lingyuxia/images/posts/athena/4.jpg" alt="4.jpg" /></p>

<p>在Documentation一栏会跳转到<a href="https://github.com/PrincetonUniversity/athena/wiki">Github上的项目</a>, 这便是一个大概的教程吧, 当然我个人觉得其中有些讲得并不详细,让我在前期造成了很大困难</p>

<p><img src="/lingyuxia/images/posts/athena/5.jpg" alt="5.jpg" /></p>

<p>第一步是，我们要获取代码。</p>

<blockquote>
  <p>这里我们建议使用Linux系统或者MacOS，当然个人目前是使用的MacOS系统，因为相比Linux系统配置更加方便</p>

</blockquote>

<p>这里我们先以MacOS为例，当我们拿到一台Mac时，一无所有，我们需要下载一个好用的编辑器<a href="https://code.visualstudio.com/">VScode</a>（Pycharm也可，如果直接用Vim也不是问题…）</p>

<p>然后，打开终端</p>

<p><img src="/lingyuxia/images/posts/athena/v2-22ce87b25f2d12f586a920a030a05af0_1440w.png" alt="这，就是终端！" /></p>

<p>这，就是终端！</p>

<p>我们先要安装一个非常实用的包管理器<a href="https://brew.sh/index_zh-cn">Homebrew</a>，网站会告诉你如何安装</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/bin/bash <span class="nt">-c</span> <span class="s2">"</span><span class="si">$(</span>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh<span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>

<p>当你安装好之后，就可以使用Homebrew去安装你想要的东西了，而使用Homebrew安装的方式是</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>xxxx
</code></pre></div></div>

<p>当你安装好一个东西后，它会统一放在固定的目录 <strong>/usr/local</strong></p>

<p>如果你想查看你目前都安装了些什么稀奇古怪的东西，可以使用指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew list
</code></pre></div></div>

<p><img src="/lingyuxia/images/posts/athena/v2-7c1116fcb5b3e15bdedf0942cd4e1222_1440w.png" alt="由于我使用的是zsh的终端，所以看起来可能不太一样" /></p>

<p>由于我使用的是zsh的终端，所以看起来可能不太一样</p>

<p>接下来，我们需要确认电脑是否安装了Git</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git <span class="nt">--version</span>
</code></pre></div></div>

<p>如果安装了Git，就会有</p>

<p><img src="/lingyuxia/images/posts/athena/v2-40d08382f9fa950456032d03b87818a2_1440w.png" alt="v2-40d08382f9fa950456032d03b87818a2_1440w.png" /></p>

<p>如果没有安装Git就按照之上的brew的方法去安装Git（如果安装失败，可以试试科学上网或者更换国内的镜像源）</p>

<p>现在，我们已经安装好了Git和Homebrew了，可以开始下载我们需要的东西了</p>

<p>首先就是代码本身了，我们需要回到Github的那个项目上去，然后点击Code一栏</p>

<p><img src="/lingyuxia/images/posts/athena/v2-855596cb07d5d8d4b8a0dcbc54ee553a_1440w.png" alt="v2-855596cb07d5d8d4b8a0dcbc54ee553a_1440w.png" /></p>

<p>然后，我们就能看见这整一个代码的文件了</p>

<p><img src="/lingyuxia/images/posts/athena/v2-933f02aefa05140417f6ab3110a8d3cf_1440w.jpeg" alt="v2-933f02aefa05140417f6ab3110a8d3cf_1440w.jpeg" /></p>

<p>那我们怎么获取整个代码项目呢？我们先点击绿色的 Code 里面就会有一个链接</p>

<p><img src="https://picx.zhimg.com/80/v2-7356b35b47b262f21304d4dca7262b26_1440w.jpeg?source=d16d100b" alt="https://picx.zhimg.com/80/v2-7356b35b47b262f21304d4dca7262b26_1440w.jpeg?source=d16d100b" /></p>

<p>有了这个链接我们就可以将这个项目利用Git下载下来了，具体的指令是</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/PrincetonUniversity/athena.git
</code></pre></div></div>

<p>同时，如果我们需要更新这个代码，可以直接输入以下指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git pull
</code></pre></div></div>

<p>这时候，我们在终端输入List指令，即可查看到Athena的文件夹</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span>
</code></pre></div></div>

<p><img src="/lingyuxia/images/posts/athena/v2-4429859070148a30e9b70e94502e908a_1440w.png" alt="v2-4429859070148a30e9b70e94502e908a_1440w.png" /></p>

<p>为了查看这个文件夹里的文件，我们可以选择转到这个文件里，即cd指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>athena
</code></pre></div></div>

<p>然后再使用ls指令就可以查看到athena文件夹里的文件了</p>

<p><img src="/lingyuxia/images/posts/athena/v2-9ce9f9c242439409b88d16772c87fd05_1440w.png" alt="v2-9ce9f9c242439409b88d16772c87fd05_1440w.png" /></p>

<p>好了，我们现在已经把Athena项目下载好了，那我们该下载相关的环境了</p>

<p>首先需要确认的是python环境，使用指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-v</span>
</code></pre></div></div>

<p>来确认是否安装了python以及python的版本，如果安装了会显示</p>

<p><img src="/lingyuxia/images/posts/athena/v2-167b004621febb39950b7b3595943774_1440w.png" alt="v2-167b004621febb39950b7b3595943774_1440w.png" /></p>

<p>同时我们也进入了python的交互式的界面（就是那个»&gt;），可以按Ctrl+D退出交互式界面</p>

<p>我们要求的python版本需要大于3.6即可</p>

<p>之后我们输入以下指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>gcc open-mpi hdf5-mpi
</code></pre></div></div>

<p>这是安装的三个东西分别是</p>

<ul>
  <li>gcc 编译器</li>
  <li>open-mpi 并行计算库</li>
  <li>HDF5 一种存储计算结果的格式的库（注意要安装—mpi版本即并行计算版本）</li>
</ul>

<p>这是三个最基本的环境</p>

<p>首先，我们需要进行测试，来知道我们的环境是否满足运行athena++，输入指令来跳转到有测试文件的文件夹</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>tst/regression
</code></pre></div></div>

<p>然后运行python文件（由于版本问题，运行python文件的时候需要输入python3而不是python）</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 run_tests.py
</code></pre></div></div>

<p>而对于初上手的电脑，大概是要报错的，因为这些python文件时需要很多库才可以运行的，比如numpy、h5py等</p>

<p>因此我们需要根据报错内容来安装相应的库（这里找不到报错的示例了…）对于python3的库我推荐使用pip包管理工具，我们需要先确认是否有pip，输入指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip3 <span class="nt">-V</span>
</code></pre></div></div>

<p>如果安装了pip3终端会显示其版本，如果没有安装pip3终端会显示一条指令让你先安装pip3</p>

<p>当我们安装好pip3之后，输入以下指令来安装需要的python库</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip3 <span class="nb">install </span>xxxx
</code></pre></div></div>

<p>其实和brew一样的，也可以输入list来查看我们都安装了哪些库</p>

<p>这里我们大概的列一下运行代码需要的python库</p>

<ul>
  <li>h5py</li>
  <li>matplotlib</li>
  <li>mpmath</li>
  <li>numpy</li>
  <li>pandas</li>
  <li>Pillow</li>
  <li>scipy</li>
  <li>yt(这个库不是运行必须的但后续的数据分析会需要它)</li>
</ul>

<p>当我们安装好以上的python库之后，再运行一下测试文件看是否报错，如果没有报错就万事大吉了，如果有报错还是看看报错的提示再处理</p>

<p>接下来我们就可以运行程序了，对于Athena++这个代码，想要解决一个问题的大致的操作流程是</p>

<ul>
  <li>设置编译的初始条件
    <ol>
      <li>指定问题生成器（这个之后会细讲）</li>
      <li>是否考虑狭相、广相条件；是否使用HDF5格式输出…</li>
      <li>开始编译，并生成二进制的编译文件</li>
      <li>指定输入文件（其中包括问题的具体初始条件）</li>
      <li>开始计算、得到计算文件</li>
    </ol>
  </li>
</ul>

<p>接下来我们一步一步的进行讲解</p>

<p>设置编译的初始条件：这一步骤是由一个python文件configure.py实现，我们首先可以输入以下指令来知道初始的编译条件都有哪些</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 configure.py -h
</code></pre></div></div>

<p>我们会得到如下列表</p>

<p><img src="/lingyuxia/images/posts/athena/v2-bef3af2fa9da27b9da07f64f3beb0bc9_1440w.jpeg" alt="v2-bef3af2fa9da27b9da07f64f3beb0bc9_1440w.jpeg" /></p>

<p>其中必不可少的选项是指定问题生成器，即在编译的时候需要加如下后缀</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 configure.py --prob xxxx
</code></pre></div></div>

<ul>
  <li>-prob之后的xxxx是问题产生器的名称，那什么是问题产生器呢？其是这个项目会给你提供一些典型的流体力学、MHD等物理情景来供你进行测试，而你可以利用给你提供的既定的物理情景进行修改来去解决你想要解决的问题，或者你也可以自己编写问题产生器来解决特殊情景的问题</li>
</ul>

<p>目前我们只需要了解如何使用既定的问题产生器即可，其都统一存放在了地址<strong>/src/pgen</strong>中</p>

<p><img src="https://picx.zhimg.com/80/v2-7f7fd1ed3c3331cb4e06fde329eb2375_1440w.png?source=d16d100b" alt="https://picx.zhimg.com/80/v2-7f7fd1ed3c3331cb4e06fde329eb2375_1440w.png?source=d16d100b" /></p>

<p>这些文件都是给定的问题产生器，至于是什么物理情景，我们可以点进去查看其描述，这里以jet.cpp为例，我们使用VScode打开这个文件来查看（其实在VScode中打开athena文件夹进行操作也可）</p>

<p><img src="/lingyuxia/images/posts/athena/v2-d337456df6bf2b0d3df8e05892140fc1_1440w.png" alt="v2-d337456df6bf2b0d3df8e05892140fc1_1440w.png" /></p>

<p>于是我们就可以在注释里知道</p>

<blockquote>
  <p>Sets up a nonrelativistic jet introduced through L-x1 boundary(left edge)</p>

</blockquote>

<p>即设置了一个从左边界引入的一个非相对论射流，接下来我们就用这个物理情景来模拟一下射流</p>

<p>首先我们要回到athena文件下，输入指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ..
</code></pre></div></div>

<p>即退回到上一级文件夹，当回到athena文件夹后，开始进行设置编译环境，输入如下指令</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 configure.py <span class="nt">--prob</span> jet <span class="nt">-mpi</span> <span class="nt">-hdf5</span>
</code></pre></div></div>

<p>按一下回车，即可完成设置编译条件，并显示你当前的设置，这里需要提前说明一下，有些时候直接输入-hdf5的时候，在接下来编译的时候很有可能会显示没有找到HDF5库，这里我们需要指定HDF5库的安装位置，即</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 configure.py <span class="nt">--prob</span> jet <span class="nt">-mpi</span> <span class="nt">-hdf5</span> <span class="nt">--hdf5_path</span><span class="o">=</span>xxxx
</code></pre></div></div>

<p>至于安装地址，可以利用</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew list hdf5-mpi
</code></pre></div></div>

<p>来查询hdf5-mpi的安装位置</p>

<p><img src="/lingyuxia/images/posts/athena/v2-e5d63d91f63efdee2b2a1bc7625ebd4c_1440w.png" alt="v2-e5d63d91f63efdee2b2a1bc7625ebd4c_1440w.png" /></p>

<p>接下来我们开始编译，先输入</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make clean
</code></pre></div></div>

<p>如果这里说没有下载make工具可以按照提示的指令进行按照，然后再重复上述步骤</p>

<p><img src="/lingyuxia/images/posts/athena/v2-82a64b94e2cd7fde409cea822d915d13_1440w.png" alt="这里是删除之前的编译文件" /></p>

<p>这里是删除之前的编译文件</p>

<p>接下来就可以进行编译了，输入</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>make <span class="nt">-j</span>
</code></pre></div></div>

<p>这里的-j是指利用多核编译，默认是单核，所以-j速度会快</p>

<p>于是就开始进行编译了</p>

<p><img src="/lingyuxia/images/posts/athena/v2-5d113941d6e98c66db820ac86553f65e_1440w.png" alt="v2-5d113941d6e98c66db820ac86553f65e_1440w.png" /></p>

<p>上图就是编译成功了，这样在地址<strong>/bin</strong>中会生成一个二进制的可执行的文件<strong>/bin/athena</strong></p>

<p>这个时候，我们就需要输入文件了，而与给定的问题生成器对应的输入文件都存放在地址<strong>/inputs</strong>中，而目前我们需要的输入文件是<strong>/inputs/hydro/athinput.jet</strong>而这个文件我们也是可以查看的</p>

<p><img src="/lingyuxia/images/posts/athena/v2-985299952405b522a69d1e3d4c520900_1440w.png" alt="v2-985299952405b522a69d1e3d4c520900_1440w.png" /></p>

<p><img src="/lingyuxia/images/posts/athena/v2-469893a6fda11839873a62cb042f937f_1440w.png" alt="v2-469893a6fda11839873a62cb042f937f_1440w.png" /></p>

<p>这些就是输入文件的内容，其中在<output2>中的file_type我们需要改成hdf5格式，否则是默认vtk格式，而对于不同的格式有什么特点，这里简单的列一下</output2></p>

<ul>
  <li>VTK（Visualization Tool Kit）是数值模拟中常用的标准数据格式。可以使用各种可视化软件轻松可视化，例如<a href="https://visit.llnl.gov/">VisIt</a>和<a href="http://www.paraview.org/">ParaView</a>。文件扩展名为.vtk</li>
  <li>Athena++ 可以输出根据 HDF5（分层数据格式）标准格式化的文件。这种格式最适合用于网格细化的模拟。它还具有使用并行 IO 的优势，这意味着多个进程可以写入单个文件，在与 GPFS 等并行文件系统一起使用时可以很好地扩展。此输出在每个输出时间步生成两个文件：.athdf和.athdf.xdmf.该.athdf文件是 HDF5 并包含数据。(.athdf.xdmfeXtensible Data Model and Format) 文件是一个辅助文件，其中包含对存储在.athdf文件中的数据结构的描述。当使用 VisIt 或 ParaView 可视化结果时使用此文件。此外，<a href="http://yt-project.org/">yt</a>还支持 Athena++ HDF5 输出。</li>
</ul>

<p>我们再来简单地看一下输入文件的内容</p>

<p>首先对于<mesh>一栏就是网格的设置，比如：</mesh></p>

<ul>
  <li>nx1：x1维的网格数量</li>
  <li>x1max&amp;x1min：x1维的最大值和最小值</li>
  <li>ix1_bc &amp; ox1_bc:x1的两边的边界条件其中user是指自定义的边界条件 outflow是指流出 reflecting是指反射</li>
</ul>

<p>这里注意到nx3=1时，就是二维问题</p>

<p>对于<hydro>一栏就是流体的性质，这里给出的参数是泊松比</hydro></p>

<p>对于<problem>就是和user密切相关了，比如</problem></p>

<ul>
  <li>djet：喷流的直径</li>
  <li>pjet：喷流的压强</li>
  <li>vxjet：喷流初始的x方向的速度</li>
  <li>bx:初始x方向的磁场</li>
</ul>

<p>知道了初始条件后，我们就可以进行运算了，我们不妨先新建一个文件夹在这存放生成的HDF5文件</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir </span>prob
<span class="nb">cd </span>prob
</code></pre></div></div>

<p>接下来就可以进行运算了</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/athena/bin/athena <span class="nt">-i</span> ~/athena/inputs/hydro/athinput.jet
</code></pre></div></div>

<p>于是就开始了漫长的计算过程了（这里略）</p>

<p>当我们计算完成后，就会得到HDF5的计算文件，接下来我们就需要对其进行可视化了，这里我们有好几个方法，比如使用Vislt软件，Vislt是比较方便的，但是上限不高，对于之后的数据分析的需求很难满足；所以这里更推荐使用python的库yt</p>

<p><img src="/lingyuxia/images/posts/athena/9.jpg" alt="9.jpg" /></p>

<p>关于相关的教程，你可以从官网的文档里学习到，这里我们用一个简单的代码展示一下</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">yt</span>

<span class="n">ds</span> <span class="o">=</span> <span class="n">yt</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="s">"xxxxxxx"</span><span class="p">)</span><span class="c1">#你想要可视化的HDF5文件
</span><span class="n">p</span> <span class="o">=</span> <span class="n">yt</span><span class="p">.</span><span class="n">ProjectionPlot</span><span class="p">(</span><span class="n">ds</span><span class="p">,</span> <span class="s">"z"</span><span class="p">,</span> <span class="s">"density"</span><span class="p">)</span><span class="c1">#z是你所在观察轴；density是显示密度的图像
</span><span class="n">p</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>
</code></pre></div></div>

<p>这样，我们就可以得到由yt生成的图像，当然我们也可以加上矢量图</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">yt</span>

<span class="n">ds</span> <span class="o">=</span> <span class="n">yt</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="s">"xxxxxxx"</span><span class="p">)</span><span class="c1">#你想要可视化的HDF5文件
</span><span class="n">p</span> <span class="o">=</span> <span class="n">yt</span><span class="p">.</span><span class="n">ProjectionPlot</span><span class="p">(</span><span class="n">ds</span><span class="p">,</span> <span class="s">"z"</span><span class="p">,</span> <span class="s">"density"</span><span class="p">)</span><span class="c1">#z是你所在观察轴；density是显示密度的图像
</span><span class="n">p</span><span class="p">.</span><span class="n">annotate_velocity</span><span class="p">()</span>
<span class="n">p</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>

</code></pre></div></div>

<p>我们就可以得到了一张漂亮的图像</p>

<p><img src="/lingyuxia/images/posts/athena/v2-beeca23962068d17aa1040f67a33aa25_1440w.png" alt="v2-beeca23962068d17aa1040f67a33aa25_1440w.png" /></p>

<p><img src="/lingyuxia/images/posts/athena/v2-93a16e8887006695a9a29a048c9e3379_1440w.png" alt="这是一个考虑狭义相对论的喷流" /></p>

<p>这是一个考虑狭义相对论的喷流</p>

<p>同时也可以写一个循环，把所有的HDF5文件利用yt生成出来，然后制作成movie</p>

<p>当然对于简单的测试，我们可以利用Vislt，直接选择一系列的HDF5文件来直接得到动画和图片</p>

<p><img src="/lingyuxia/images/posts/athena/F4B3EFB1-E73D-E363-7B61-3876574B5163.png" alt="{F4B3EFB1-E73D-E363-7B61-3876574B5163}.png" /></p>

<p>喷流的模拟</p>

<hr />

<p>这大概是整个上手Athena++的一个流程吧</p>]]></content><author><name>Lingyu Xia</name><email>lingyuxia@link.cuhk.edu.hk</email></author><category term="2022" /><category term="Fall" /><summary type="html"><![CDATA[Athena++]]></summary></entry></feed>