在bash脚本中编码旋转

时间:2017-04-20 14:43:10

标签: bash

我正在尝试研究各种配置下两种苯分子之间的范德瓦尔斯相互作用。要做到这一点,我已经编写了一个bash脚本来旋转包含那些位置的文件中的两个分子中的一个(现在只围绕x轴)。代码似乎没有错误运行但是给出了完全错误的结果。我已经检查了很多次,我没有发现任何“数学”错误,所以也许我在某处做了语法错误? 我是bash(和linux)的初学者,所以任何帮助将不胜感激:)! 这是代码:

#!/bin/bash

echo "Angle of rotation (in rad:"
read angle
echo "File or path to file :"
read fichier
echo "Your file:"
cat $fichier
echo "Give the line numbers which contain the atoms you want to rotate :"
read ligneDebut
read ligneFin

# creation of an associative array playing the role of the rotation matrix
declare -A Rx 
Rx=([1,1]=1 [1,2]=0 [1,3]=0 [2,1]=0 [2,2]=`echo "c($angle)" | bc -l` [2,3]=`echo "-s($angle)" | bc -l` [3,1]=0 [3,2]=`echo "s($angle)" | bc -l` [3,3]=`echo "c($angle)" | bc -l`)

#storage of the atomic positions in an array
declare -A posAtomes
for((i=$ligneDebut; i<=$ligneFin; i++)) do
    for((j=1; j<4; j++)) do
        posAtomes[$i,$j]=`awk -v ligne=$i -v colonne=$j '{if(NR==ligne) print $(colonne+1)}' $fichier` 
    done
done

#computation of the new positions after rotation
declare -A newPos
for((i=$ligneDebut; i<=$ligneFin; i++)) do
    for((j=1; j<4; j++)) do
        newPos[$i,$j]=`echo "${posAtomes[$i,1]} * ${Rx[$j,1]} + ${posAtomes[$i,2]} * ${Rx[$j,2]} + ${posAtomes[$i,3]} * ${Rx[$j,3]}" | bc -l`
    done
done

#writing the new positions in the original file
for ((i=$ligneDebut; i<=$ligneFin; i++)) do
    for ((j=1;j<4;j++)) do
        awk -v ligne=$i -v colonne=$j -v val=${newPos[$i,$j]} '{if(NR==ligne) {$(colonne+1)=val; print $0} else print $0}' $fichier > tmp && mv tmp $fichier
    done
done

位置文件看起来像这样(这里只有一个分子):

C 0.00000000000000000E+00 1.39600002765655495E+00 12.25
C 1.20899999141693093E+00 6.98000013828277699E-01 12.25
C 1.20899999141693093E+00 -6.98000013828277699E-01 12.25
C 0.00000000000000000E+00 -1.39600002765655495E+00 12.25
C -1.20899999141693093E+00 -6.98000013828277699E-01 12.25
C -1.20899999141693093E+00 6.98000013828277699E-01 12.25
H 0.00000000000000000E+00 2.47900009155273393E+00 12.25
H 2.14700007438659712E+00 1.24000000953674294E+00 12.25
H 2.14700007438659712E+00 -1.24000000953674294E+00 12.25
H 0.00000000000000000E+00 -2.47900009155273393E+00 12.25
H -2.14700007438659712E+00 -1.24000000953674294E+00 12.25
H -2.14700007438659712E+00 1.24000000953674294E+00 12.25

如果你知道我做错了什么......提前谢谢!

2 个答案:

答案 0 :(得分:0)

我可以提供一些基本的故障排除步骤,但我不熟悉精确的计算方法。

0)要获得更详细的帮助,请尝试发布输入的示例输入(旋转角度和线数),您期望的结果以及您看到的结果。此外,添加您尝试实施的公式可能会有所帮助。

1)尝试添加许多简单的echo语句来查看各个步骤的进度:调试语句。例如:

echo "Angle of rotation (in rad:"
read angle
echo "OK, operating with angle: "${angle}

echo "File or path to file :"
read fichier
echo "OK, input file is: "${fichier}

在我看来,这两个步骤在你的程序中是正确的。但是,希望这种方法可以为您建议进一步的调试步骤。在整个代码中添加这些调试echo语句,以输出中间值并验证它们是否按预期工作。

快乐的黑客攻击。另外,有什么特别的原因你用bash实现这个吗?也许另一种语言,例如具有内置矢量数学库(Python,R,Matlab ......)的语言,会更合适。

答案 1 :(得分:0)

感谢回复!我以为我已经完成了#34;无处不在的回声&#34;事情,但我没有做好。我发现了一个错误:bc无法处理科学记数法(对于有点蹩脚u_u的计算器)所以必须使用sed或awk来重新计算所有E + 01乘以10 ^ 01。该死的我失去了这么多时间!下次我将使用Python哈哈