# TLUSTY 208 - 非局部热动力平衡(Non-LTE)恒星大气模型程序 TLUSTY是一个通用的恒星大气和吸积盘非局部热动力平衡(Non-LTE)模型计算程序。该程序基于FORTRAN语言开发,可用于计算恒星大气和吸积盘的物理特性和辐射场。 ## 程序概述 TLUSTY是一种用于计算恒星大气和吸积盘模型的通用代码。程序使用混合的完全线性化/加速Lambda迭代(CL/ALI)方法来求解辐射转移和统计平衡方程组。 ## 主要源文件结构 ### 主程序文件:tlusty208.f 这是程序的主要源代码文件,包含程序入口点和主要计算流程。主要模块包括: - `PROGRAM TLUSTY`: 主程序入口点,实现主要计算流程控制 - 输入:读取基本参数 - 初始化:调用START和初始化例程 - 迭代循环:交替调用RESOLV(形式解)和SOLVE/SOLVES/RYBSOL(线性方程求解) - 输出:计算完成后输出结果 - `SUBROUTINE START`: 一般输入和初始化过程 - 读取主要输入参数 - 调用INITIA进行详细初始化 - 调用COMSET设置公共变量 - 调用PRDINI初始化部分辐射场 - `SUBROUTINE INITIA`: 输入和初始化驱动程序 - 读取基本输入参数(温度、重力等) - 设置频率点和权重 - 初始化湍流速度 - 调用STATE读取原子参数 - 设置显式离子、能级和跃迁参数 - `SUBROUTINE RESOLV`: 辐射转移方程的形式解 - 执行形式解步骤,计算辐射场 - 计算辐射转移和相关导数 - 处理连续辐射和谱线辐射 - 更新粒子数密度和温度 - `SUBROUTINE ACCEL2`: 用于加速收敛的程序 - 实现Ng加速或其他收敛加速技术 - 加速迭代过程的收敛速度 - `SUBROUTINE SOLVE`/`SOLVES`: 线性化方程的解法 - 求解统计平衡方程和辐射转移方程 - 计算能级布居数的修正值 - 大矩阵方法(SOLVE)和小矩阵方法(SOLVES) - `SUBROUTINE RYBSOL`: 替代解法 - 提供另一种线性方程组求解方法 - 适用于特定条件下的计算 - `BLOCK DATA`: 初始化氢原子振子强度数据 - 为所有可能的氢原子跃迁提供振子强度值 - 数据存储在`OSH`数组中供程序使用 - `SUBROUTINE STATE`: 原子和离子状态数据读取 - 读取原子质量、丰度等参数 - 设置元素的电离状态信息 - 计算原子占据概率和布居数 - `SUBROUTINE COMSET`: 设置通用参数 - 初始化各种通用变量和数组 - 设置各种物理过程的控制参数 - 为计算过程准备必要的公共数据 - `SUBROUTINE TABINI`: 不透明度表初始化 - 读取预先计算的不透明度数据 - 设置不透明度表的温度和密度网格 - 准备插值所需的参数 - `SUBROUTINE INPDIS`: 吸积盘特定参数输入 - 读取吸积盘特定的物理参数 - 设置盘几何形状和物理条件 - 计算初始的盘结构模型 ### 包含文件 这些文件定义了程序中使用的公共变量、数组和参数: #### IMPLIC.FOR 包含基本的变量类型定义: ```fortran IMPLICIT REAL*8 (A-H,O-Z), LOGICAL*1 (L) ``` 所有的变量默认为双精度实数,逻辑变量为单字节。 #### BASICS.FOR 定义程序中使用的基本参数和常量: - 数组维度的最大值参数: - `MATOM` (99): 显式原子的最大数量 - `MION` (170): 显式离子的最大数量 - `MLEVEL` (1134): 显式能级的最大数量 - `MDEPTH` (100): 深度点的最大数量 - `MFREQ` (135000): 频率点的最大数量 - 物理常数: - `H` (6.6256D-27): Planck常数 - `BOLK` (1.38054D-16): Boltzmann常数 - `EH` (2.17853041D-11): 氢原子电离能 - `CAS` (2.997925D18): 光速(Å/s) - 主要公共变量块: - `/BASNUM/`: 基本数值参数(原子数、离子数、能级数等) - `/INPPAR/`: 输入参数(有效温度、重力等) - `/RUNKEY/`: 运行控制参数 - `/CONKEY/`: 收敛控制参数 - `/PRINTS/`: 打印控制参数 - `/OPCKEY/`: 不透明度计算控制 - `/OPCPAR/`: 额外不透明度参数 - `/ANGLES/`: 角度点和权重 - `/COMPTN/`: 康普顿散射相关参数 - `/MLCONS/`: 混合长度对流参数 #### ITERAT.FOR 包含与迭代过程相关的参数和变量: - 迭代参数(最大迭代次数、Lambda迭代控制) - `MITER` (200): 最大迭代次数 - `MLAMBD` (100): 最大Lambda迭代次数 - 迭代控制公共变量块: - `/LAMBDA/`: Lambda迭代参数 - `/CHNMAT/`: 矩阵变化参数 - `/ACCEL/`: 加速方法控制 - `/ACCLP/`: 加速参数 - `/ACCLT/`: 温度加速控制 - `/CHNAD/`: 变化大小监控 #### ALIPAR.FOR 包含加速Lambda迭代(ALI)方法的参数: - `/FIXALP/`: 固定ALI参数 - `ABSO`, `EMIS`, `SCAT`: 吸收、发射和散射系数 - `REIT`, `REIN`, `REIM`: 辐射场相关导数 - `REIP`: 能级布居数相关导数 - `HEIT`, `HEIN`, `HEIM`: 预处理算子 - `APT`, `APN`: 近似Lambda算子 - `APP`: 近似算子矩阵 - 与加速Lambda迭代相关的其他变量 #### ATOMIC.FOR 包含原子数据和参数: - `/ATOPAR/`: 原子参数 - `AMASS`: 原子质量 - `ABUND`: 元素丰度 - `NUMAT`: 原子数量 - `N0A`, `NKA`: 能级索引 - `/IONPAR/`: 离子参数 - `FF`: 能级因子 - `CHARG2`: 电荷平方 - `NFIRST`, `NLAST`: 能级索引范围 - `IZ`: 离子电荷 - `IUPSUM`: 上能级总和控制 - `/LEVPAR/`: 能级参数 - `ENION`: 电离能 - `G`: 统计权重 - `NQUANT`: 量子数 - `IATM`, `IEL`: 原子和电离属性 - `ILK`: 能级耦合 - `/TRAPAR/`: 跃迁参数 - `FR0`: 跃迁频率 - `OSC0`: 振子强度 - `CPAR`: 碰撞参数 - `ILOW`, `IUP`: 下能级和上能级 - `ITRA`: 跃迁索引 - `/OSCHYD/`: 氢原子振子强度数据 - `OSH`: 氢原子振子强度表 #### MODELQ.FOR 包含模型物理量和状态变量: - `/MODPAR/`: 模型参数 - `DM`: 柱质量 - `TEMP`: 温度 - `ELEC`: 电子密度 - `DENS`: 总密度 - `ZD`: 深度 - `THETAV`: 粘滞温度参数 - `VISCD`: 粘滞系数 - `/LEVPOP/`: 能级布居数 - `POPUL`: 能级布居数 - `BFAC`: 偏离因子 - `POPINV`: 逆布居数 - `POP`: 临时布居数 - `USUM`: 分配函数 - `/TURBUL/`: 湍流速度 - `VTURB`: 湍流速度 - `VTURBS`: 湍流速度(表面值) - `VTB`: 全局湍流速度参数 - `/TOTRAD/`: 总辐射场 - `RAD`: 平均辐射场 - `FHD`: 辐射通量 - `FAK`: 角因子 - `EXTRAD`: 外部辐射 - `/FRQALL/`: 频率点和权重 - `FREQ`: 频率点 - `W`: 频率权重 - `PROF`: 轮廓函数 - `WCH`: 频率通道 - `/HYDPRF/`: 氢原子Stark加宽 - `PRFHYD`: 氢轮廓数据 - `WLHYD`: 波长点 - `XTLEM`: 温度网格 - `XNELEM`: 电子密度网格 #### ODFPAR.FOR 包含不透明度分布函数(ODF)参数: - ODF参数维度定义: - `MFODF` (180): ODF频率点最大数 - `MHOD` (3): ODF函数最大数 - `MKULEV` (7000): Kurucz能级最大数 - `MLINE` (1140000): 谱线最大数 - `/ODFION/`: ODF离子参数 - `INODF1`, `INODF2`: ODF单元号 - `INBFCS`: 连续谱截面单元号 - `IKOBS`: ODF观测值 - `/ODFCTR/`: ODF控制参数 - `FRODF`: ODF频率 - `NFRODF`: 频率数量 - `INDODF`: 能级索引 - `/SPLCOM/`: 样条插值参数 - `SIGFE`: 铁谱线数据 - `FRS1`, `FRS2`: 频率范围 - `DXNU`: 频率步长 #### ARRAY1.FOR 包含主要工作数组的定义: - 线性方程组系数矩阵: - `A`, `B`, `C`, `E`: 线性方程组系数矩阵 - `VECL`, `Y1`, `Y2`: 向量和解向量 - `PSI0`, `PSIM`, `PSIP`: 状态向量 - 辐射场数组: - `RAD0`, `RADM`, `RADP`: 辐射场 - `FK0`, `FKM`, `FKP`: 角矩 - `ABSO0`, `ABSOM`, `ABSOP`: 吸收系数 - `EMIS0`, `EMISM`, `EMISP`: 发射系数 - `SCAT0`, `SCATM`, `SCATP`: 散射系数 - 导数数组: - `DABT0`, `DABTM`, `DABTP`: 吸收温度导数 - `DEMN0`, `DEMNM`, `DEMNP`: 发射数密度导数 - `DRCH0`, `DRCHM`, `DRCHP`: 色散关系温度导数 ## 输入参数 READ(IBUFF,*) TEFF,GRAV READ(IBUFF,*) XMSTAR,XMDOT,RSTAR,RELDST READ(IBUFF,*) LTE,LTGREY READ(IBUFF,*) FINSTD READ(IBUFF,*) NFREAD READ(IBUFF,*,END=20,ERR=20) IATII,IZII,NLEVSI,ILASTI,ILVLIN,NONSTD,TYPIOI,FILEI READ(IBUFF,*) IUPSUM(ION),ICUP(ION),MODEFF,NFF READ(IBUFF,*) INODF1(ION),INODF2(ION),FIODF1(ION),FIODF2(ION),FIBFCS(ION) READ(IBUFF,*) (ALBE(I),I=1,NFREQ) READ(IBUFF,*) (ALBE(I),I=1,NFREQ) READ(IBUFF,*) ALCON0,ALCHE2,ALLIN0 READ(IBUFF,*) NUMMOD READ(IBUFF,*) IJ1,IJ2,ALB read(ibuff,'(a80)') dum READ(IBUFF,*) MA,ABN,MODPF0 READ(IBUFF,*) (ABNDD(I,ID),ID=1,ND) READ(IBUFF,*) IOLD,MODE,NXTOLD,ISINEW,ISIOLD,NXTSIO,REL READ(IBUFF,*) TAU1,TAU2,TAUL READ(IBUFF,*) (TAU0(I),I=1,ND) READ(IBUFF,*,ERR=90) IL1,IU1,IM1,IP1 READ(IBUFF,*,ERR=100) ALLIM1 READ(IBUFF,*,ERR=190) IL1,IU1,IM1,IP1 READ(IBUFF,*,ERR=200,END=200) ABLIM1,ABLIM2,ABLIM3 READ(IBUFF,*) TAU1 READ(IBUFF,*) TDIV READ(IBUFF,*) TAU0(ND) READ(IBUFF,*) TDIV READ(IBUFF,*) TAU0(1),TAU0(ND) ## 关键计算模块详解 ### 光谱线处理模块 - **谱线形成**: - `SUBROUTINE LINEOP`: 计算谱线不透明度 - 输入:频率、温度、电子密度、能级布居数 - 计算:谱线轮廓函数、吸收系数、发射系数 - 输出:谱线贡献到总不透明度 - `SUBROUTINE LTEOPA`: 处理LTE情况下的谱线不透明度 - 使用玻尔兹曼分布计算能级布居数 - 计算基于LTE条件的谱线吸收系数 - **谱线轮廓**: - `SUBROUTINE VOIGT`: 计算Voigt轮廓函数 - 输入:阻尼参数、离线心距离 - 计算:Voigt函数值 - 考虑自然加宽、碰撞加宽和Doppler加宽 - `SUBROUTINE STARK`: 计算Stark加宽轮廓 - 处理电场对谱线的影响 - 计算氢谱线的Stark加宽 ### 连续谱处理模块 - **连续不透明度**: - `SUBROUTINE OPASUM`: 计算总连续不透明度 - 汇总各种连续吸收过程 - 计算散射贡献 - 组合谱线和连续谱不透明度 - `SUBROUTINE HYDCON`: 计算氢连续不透明度 - 考虑氢原子的光电离和自由-自由吸收 - 处理负氢离子的贡献 - **散射过程**: - `SUBROUTINE ELSCET`: 计算电子散射 - 计算汤姆逊散射截面 - 考虑电子速度分布的影响 - `SUBROUTINE RAYSET`: 计算瑞利散射 - 处理中性氢和氦的瑞利散射 - 计算频率依赖的散射截面 ### 辐射转移求解模块 - **形式解**: - `SUBROUTINE FEAUT`: 短特征法求解 - 沿特征线积分辐射转移方程 - 计算平均辐射场和辐射通量 - 处理各向异性辐射场 - `SUBROUTINE ELIMIN`: 消去法求解 - 进行前向消去和后向替代 - 解带状矩阵系统 - **Lambda迭代**: - `SUBROUTINE LAMBDA`: 执行Lambda操作 - 将源函数转换为平均辐射场 - 应用近似Lambda算子加速收敛 - 处理多频率点的耦合 ### 统计平衡求解模块 - **能级布居数计算**: - `SUBROUTINE NLTEBS`: 计算非LTE布居数 - 组装统计平衡方程 - 考虑所有辐射和碰撞过程 - 求解非线性方程组 - `SUBROUTINE LTEPOP`: 计算LTE布居数 - 基于Saha-Boltzmann方程 - 考虑分配函数 - 计算电离分数 - **线性化求解**: - `SUBROUTINE MATRIX`: 组装线性方程组 - 建立统计平衡方程的线性化版本 - 包含辐射转移方程的贡献 - 处理温度、电子密度和布居数的线性关系 - `SUBROUTINE GAUSSJ`: 高斯-约当消元法 - 求解大型线性方程组 - 执行矩阵求逆操作 - 计算布居数的修正值 ### 物理过程计算模块 - **碰撞过程**: - `SUBROUTINE COLRAT`: 计算碰撞速率 - 考虑电子碰撞激发 - 处理电子碰撞电离 - 计算温度依赖的碰撞截面 - `SUBROUTINE COLCHG`: 更新碰撞速率 - 响应温度或电子密度的变化 - 重新计算碰撞系数 - **辐射过程**: - `SUBROUTINE RADTRS`: 计算辐射跃迁速率 - 计算吸收和受激发射速率 - 处理自发发射 - 考虑光电离和复合过程 - `SUBROUTINE PHOTCS`: 计算光电离截面 - 基于原子数据计算截面 - 处理频率依赖关系 - 考虑共振结构 ### 吸积盘特性模块 - **盘结构**: - `SUBROUTINE VERTST`: 计算垂直结构 - 处理流体静力学平衡 - 考虑辐射压力 - 计算垂直温度和密度分布 - `SUBROUTINE VISCUS`: 处理粘滞加热 - 计算α粘滞参数的影响 - 考虑粘滞加热对温度的贡献 - 计算能量平衡 - **盘辐射**: - `SUBROUTINE DISKRT`: 盘辐射转移 - 考虑盘几何形状对辐射场的影响 - 处理中心辐射源的贡献 - 计算盘表面辐射通量 ## 主要计算流程 1. **初始化阶段**: - 读取输入参数(有效温度、重力加速度等) - 设置频率点和权重 - 读取原子数据和初始化原子参数 - 初始化深度点和物理状态变量 - 初始化辐射场 2. **主迭代循环**: - 形式解步骤(`RESOLV`): - 解辐射转移方程 - 计算辐射场 - 更新物理条件(温度、电子密度等) - 加速收敛(`ACCEL2`): - 应用加速技术提高收敛速度 - 线性化方程求解(`SOLVE`/`SOLVES`/`RYBSOL`): - 组装线性方程组 - 求解统计平衡方程 - 更新能级布居数 - 检查收敛条件 3. **结果输出**: - 输出最终的模型大气结构(温度、密度、电子密度等) - 输出各原子和离子的能级布居数 - 输出辐射场和谱线强度 - 输出最终的恒星光谱或吸积盘谱 ## 物理处理详情 ### 非LTE处理 - **统计平衡方程**: - 考虑所有辐射跃迁和碰撞跃迁 - 包括连续谱跃迁(光电离、复合)和谱线跃迁 - 考虑碰撞电离和复合过程 - **能级布居数计算**: - 使用线性化方法求解统计平衡方程 - 考虑所有相关的跃迁过程 - 包括复杂原子模型的多能级系统 ### 辐射转移处理 - **连续谱辐射转移**: - 考虑光电离和自由-自由吸收 - 包括散射过程(电子散射、Rayleigh散射等) - 考虑负氢离子的吸收和发射 - **谱线辐射转移**: - 详细的谱线轮廓(Voigt轮廓、Stark加宽等) - 考虑线重叠效应 - 使用部分再分配函数(PRD)处理共振线 - **加速Lambda迭代**: - 提高辐射转移方程求解的收敛速度 - 使用算子分裂技术 - 使用近似Lambda算子 ### 原子物理处理 - **原子数据**: - 能级能量和统计权重 - 辐射跃迁概率和振子强度 - 光电离截面 - 碰撞截面和速率 - **线轮廓**: - Doppler加宽(热运动和微湍流) - 自然加宽 - Stark加宽(电场效应) - van der Waals加宽(中性粒子碰撞) ### 吸积盘模型特性 - **垂直结构**: - 基于α-粘滞盘模型 - 考虑辐射压力和自引力 - 计算垂直于盘平面的结构 - **辐射场**: - 考虑盘内部的辐射和中心辐射源的贡献 - 处理非各向同性辐射场 - 考虑盘的几何形状对辐射场的影响 ## 输入参数 对于恒星大气: - `TEFF`: 有效温度,定义恒星的总辐射通量 - `GRAV`: 重力加速度(log g),定义恒星表面引力强度 对于吸积盘: - `XMSTAR`: 中心天体质量,通常以太阳质量为单位 - `XMDOT`: 吸积率,定义物质流入率 - `RSTAR`: 恒星半径 - `RELDST`: 相对于中心天体的距离 物理模型控制参数: - `LTE`: 局部热动力平衡标志(0表示非LTE,1表示LTE) - `LTGREY`: 灰大气标志(控制是否使用灰大气近似) - `NFREAD`: 读取的连续谱频率点数量 - `VTB`: 微湍流速度,影响谱线宽度 原子和离子参数: - `IATII`, `IZII`: 原子序数和离子电荷 - `NLEVSI`: 能级数量 - `ILASTI`: 最后一个能级的标识 - `ILVLIN`: 跃迁上限 ## 输出结果 程序输出恒星大气或吸积盘的详细模型,包括: - **物理结构**: - 温度分布:`TEMP(ID)` 在各深度点的温度 - 密度分布:`DENS(ID)` 在各深度点的密度 - 电子密度分布:`ELEC(ID)` 在各深度点的电子密度 - 气体和辐射压力:`PTOTAL`, `PRADT` - **原子过程**: - 各种原子和离子的能级布居数:`POPUL(I,ID)` - 离子化分数 - 原子和分子密度 - **辐射场**: - 平均辐射场:`RAD(IJ,ID)` - 辐射通量:`FLUX(IJ)` - 各向异性因子 - **谱线特性**: - 谱线轮廓 - 等值宽度 - 谱线吸收系数 ## 程序文件依赖关系 ``` tlusty208.f | ├── IMPLIC.FOR - 包含变量类型定义 | ├── BASICS.FOR - 基本参数和常量定义 | ├── ITERAT.FOR - 迭代控制参数 | ├── ALIPAR.FOR - ALI方法参数 | ├── ATOMIC.FOR - 原子数据参数 | ├── MODELQ.FOR - 模型物理量参数 | ├── ODFPAR.FOR - ODF参数 | └── ARRAY1.FOR - 工作数组定义 ``` ## 运行说明 要运行TLUSTY,需要准备适当的输入文件,然后执行编译后的可执行文件。 ### 编译程序 程序使用FORTRAN77/90编译器编译,编译命令类似: ``` gfortran -o tlusty.exe tlusty208.f ``` ### 准备输入文件 需要准备以下输入文件: 1. 主要控制文件:包含模型参数、计算控制参数 2. 原子数据文件:包含能级和跃迁数据 3. 不透明度数据文件(如果使用) ### 运行程序 执行编译后的程序: ``` ./tlusty.exe < input_file ``` ### 注意事项 - 确保输入参数在程序定义的范围内 - 对于复杂原子的非LTE计算,收敛可能较困难 - 复杂模型的计算可能需要较长时间 ## 理论背景 TLUSTY基于以下理论框架: - 辐射转移理论 - 统计平衡原理 - 非LTE原子物理学 - 恒星大气和吸积盘物理 程序通过求解耦合的辐射转移和统计平衡方程组来计算自洽的恒星大气或吸积盘模型,考虑了详细的原子物理过程、辐射场和各种物理条件的相互作用。