fortran - Fortran 蛙跳算法的 N 体仿真
问题描述
我正在使用一个简单的“跨越式”算法,我的目标是模拟地球的轨道,即木星围绕太阳的轨道。尽管相当确定数学是正确的,但我无法将它们送入轨道。似乎重力每周都在起作用,行星只是漂浮在远离太阳的地方,有趣的是,如果我通过将重力项引起的牛顿加速度乘以 rad2 来调整它,我发现该系统确实产生了相当稳定的轨道,但也有很多大半径。
program physim
Implicit none
integer :: i,j,n,day ! Integer variables
doubleprecision :: G , r(1:3,1:10) , a(1:3, 1:10) , v(1:3, 1:10) , m(1:3), dt, Au, dr(1:3),
rad2(1:3), t, tcount, tend, tout
! constants
day = 86400
tout = 10*day
tend = 20*day
Au = 15e11
n = 3
G = 6.67e-11
!n = 2
dt = 100
!sun
r(1,1) = 0.
r(2,1) = 0.
r(3,1) = 0.
v(1,1) = 0.
v(2,1) = 0.
v(3,1) = 0.
m(1) = 1.9898e30
!earth
r(1,2) = Au
r(2,2) = 0.
r(3,2) = 0.
v(1,2) = 0.
v(2,2) = 30000
v(3,2) = 0.
m(2) = 6e24
!jupiter
r(1,3) = 5.2*Au
r(2,3) = 0.
r(3,3) = 0.
v(1,3) = 0.
v(2,3) = 13070
v(3,3) = 0.
m(3) = 2e27
do
a = 0
tcount = 0
do i = 1, n
do j = 1, n
!calculating acceleration
if (i==j)cycle
dr(1:3) = r(1:3, j) - r(1:3, i)
rad2 = dr(1)**2 + dr(2)**2 + dr(3)**2
a(1:3, i) = a(1:3, i) + G*m(j)*dr(1:3)/(rad2*sqrt(rad2))
end do
end do
do i = 1, n
r(1:3 ,i) = r(1:3, i) + v(1:3, i)*dt
v(1:3, i) = v(1:3, i) + a(1:3, i)*dt
end do
t = t + dt
tcount = t + dt
if(tcount>tout) then
!write(6,*) a(1,2)
!write(6,*) rad2
write(6,*) a(1,1) , a(2,1), a(3, 2)
end if
end do
end program
解决方案
推荐阅读
- javascript - Express.js 搜索表单未从 api 返回响应
- ios - 如何在 iOS 主屏幕小部件中显示 WkWebView 屏幕截图?
- python - 将数据框的列附加到列表中
- bash - 我使用“-print0”选项来处理带空格的文件名,但出现错误
- javascript - 如何修复字符串保存为代码到单词?
- c++ - 将函数指针 reinterpret_cast 与 void(*)() 进行比较是未定义的行为吗?
- c++ - 乘法期间的 C++ 运算顺序
- java - 将对象的arrayList 转换为同一对象的数组时,为什么会出现 ClassCastException?
- python-3.x - 使用带有 Python 的 swagger codegen 插件生成 API 客户端库
- javascript - 带有 Chrome 可执行文件的 Puppeteer 中的外部资源无法加载 (net::ERR_EMPTY_RESPONSE)