You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量修改POSCAR文件中的3×3矩阵(含d值循环)

批量修改POSCAR文件3×3矩阵的脚本完善方案

我有一个名为POSCAR的文件,内容如下:

Pt-FCC
3.975
3.975000 0.000000 0.000000
0.000000 3.975000 0.000000
0.000000 0.000000 3.975000

需要多次修改其中的3×3矩阵,d取值范围为0.005到0.025,步长0.005,修改后的矩阵格式要求:

Pt-FCC
3.975
1+d      0.000000 0.000000
0.000000 1-d      0.000000
0.000000 0.000000 1/(1-d^2)

例如d=0.005时的效果:

Pt-FCC
3.975
1.005000 0.000000 0.000000
0.000000 0.995000 0.000000
0.000000 0.000000 1.000025

由于仿真程序不识别文件内变量及计算表达式,我尝试用循环遍历d值,复制原文件后用perl、sed或awk修改矩阵并保持格式,现有部分脚本如下,寻求完善方法(我是新手):

for i in $(seq 0.005 0.005 0.025)
do
        cp POSCAR POSCAR_pure_shear/POSCAR_pure_$i
        perl -pi .................. POSCAR_pure_$i
done

完善方案(推荐用awk实现)

直接在循环中用awk完成计算和行替换,无需先复制再修改,步骤更简洁高效:

# 先确保目标目录存在,避免报错
mkdir -p POSCAR_pure_shear

for d in $(seq 0.005 0.005 0.025)
do
    # 计算三个矩阵元素,保留6位小数匹配原文件格式
    val1=$(printf "%.6f" $(echo "1 + $d" | bc -l))
    val2=$(printf "%.6f" $(echo "1 - $d" | bc -l))
    val3=$(printf "%.6f" $(echo "1 / (1 - $d * $d)" | bc -l))
    
    # 用awk读取原文件,替换第3-5行的矩阵内容,输出到目标文件
    awk -v v1="$val1" -v v2="$val2" -v v3="$val3" '
        NR == 3 {print v1 " 0.000000 0.000000"}
        NR == 4 {print "0.000000 " v2 " 0.000000"}
        NR == 5 {print "0.000000 0.000000 " v3}
        NR != 3 && NR !=4 && NR !=5 {print $0}
    ' POSCAR > POSCAR_pure_shear/POSCAR_pure_$d
done

脚本说明

  1. mkdir -p POSCAR_pure_shear:自动创建目标目录,即使目录已存在也不会报错。
  2. bc -l用于高精度浮点计算,printf "%.6f"确保结果保留6位小数,和原文件格式完全一致。
  3. awk通过-v参数传入计算好的数值,根据行号(NR)精准替换第3、4、5行,其他行原样输出。

Perl实现版本

如果坚持使用Perl,可修改脚本如下:

mkdir -p POSCAR_pure_shear

for d in $(seq 0.005 0.005 0.025)
do
    val1=$(printf "%.6f" $(echo "1 + $d" | bc -l))
    val2=$(printf "%.6f" $(echo "1 - $d" | bc -l))
    val3=$(printf "%.6f" $(echo "1 / (1 - $d * $d)" | bc -l))
    
    perl -pi -e '
        BEGIN {
            $v1 = shift; $v2 = shift; $v3 = shift;
            $line_count = 0;
        }
        $line_count++;
        if ($line_count == 3) { print "$v1 0.000000 0.000000\n"; next; }
        if ($line_count == 4) { print "0.000000 $v2 0.000000\n"; next; }
        if ($line_count == 5) { print "0.000000 0.000000 $v3\n"; next; }
        print;
    ' "$val1" "$val2" "$val3" POSCAR_pure_shear/POSCAR_pure_$d
done

注意事项

  • 确保系统安装了bc工具(多数Linux发行版默认自带),用于处理浮点计算。
  • 生成的文件名会保留d的小数形式(如POSCAR_pure_0.005),方便对应参数识别。

内容的提问来源于stack exchange,提问作者user19619903

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:45:31