| 查看: 2129 | 回复: 3 | ||
[求助]
怎样把用Fortran编写的程序改写为并行程序已有2人参与
|
|
有没懂Fortran并行编程的,目前我面临的一个问题:用Fortran 编写的程序在服务器上跑了几天就不出结果,想把它改成并行的用多核计算,但没学过并行的,所以很头疼,需要一位大神帮帮我。或者是优化一下程序的算法,下面一段程序,用单核计算跑的太久,怎样改进一下算法: subroutine initial_condition() use global implicit none real :: r1, p1 = 0.5 do i = 1,n call random_number(r1) if(r1 < p1)then s(i) = 1.0 else s(i) = -1.0 end if sum1 = sum1 + s(i) end do return end subroutine mcs() use global implicit none integer :: ii real :: r2, r3, sum2 = 0.0 real :: ws(n) do ii = 1,n sum2 = 0.0 call random_number(r2) i = n*r2 + 1 sum1 = sum1 - s(i) do j = 1,n if(ad(i,j) == 1)then sum2 = sum2 + s(j) end if end do if(sum2<0)then ws(i) = (1-(1-2*q)*s(i)*(-1.0))/2 else if(sum2>0)then ws(i) = (1-(1-2*q)*s(i)*(1.0))/2 else ws(i) = 0.5 end if call random_number(r3) if(r3 <= ws(i))then s(i) = -s(i) else s(i) = s(i) end if sum1 = sum1 + s(i) end do return end !**************************Ising dynamics******************************* subroutine dynamics() use global implicit none integer :: mm, t = 0 real :: sum3 = 0.0, sum4 = 0.0, sum5 = 0.0 real :: m(time) do mm = 1,n1 q = q + 0.005 call initial_condition() do while(t < time) call mcs() t = t + 1 m(t) = abs(sum1/n) if(t>200000)then sum3 = sum3 + m(t)**4 sum4 = sum4 + m(t)**2 sum5 = sum5 + m(t) end if end do MNq(mm) = sum5/(time-200000) UNq(mm) = 1 - (sum3/(time-200000))/(3*((sum4/(time-200000))**2)) t = 0 sum1 = 0.0 sum3 = 0.0 sum4 = 0.0 sum5 = 0.0 end do return end |
» 猜你喜欢
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
AI论文写作工具:是科研加速器还是学术作弊器?
已经有3人回复
孩子确诊有中度注意力缺陷
已经有6人回复
2026博士申请-功能高分子,水凝胶方向
已经有6人回复
论文投稿,期刊推荐
已经有4人回复
硕士和导师闹得不愉快
已经有13人回复
请问2026国家基金面上项目会启动申2停1吗
已经有5人回复
同一篇文章,用不同账号投稿对编辑决定是否送审有没有影响?
已经有3人回复
ACS Applied Polymer Materials投稿
已经有10人回复
RSC ADV状态问题
已经有4人回复

2楼2017-04-25 13:47:35

3楼2017-04-25 13:51:45
4楼2018-06-07 09:32:54













回复此楼