| 查看: 2203 | 回复: 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 |
» 猜你喜欢
805600专硕材料与化工348分求调剂
已经有6人回复
重庆大学材料与化工085600,初试370+,求求调剂建议
已经有5人回复
309求调剂
已经有3人回复
一志愿北交大材料工程,总分358
已经有4人回复
302求调剂一志愿北航070300,本科郑大化学
已经有11人回复
化学工程专硕324分,一志愿中国矿业大学求调剂
已经有7人回复
材料求调剂
已经有11人回复
【求调剂】新能源材料本科,一志愿211,初试321
已经有4人回复
336求调剂
已经有5人回复
材料求调剂
已经有8人回复

3楼2017-04-25 13:51:45

2楼2017-04-25 13:47:35
4楼2018-06-07 09:32:54














回复此楼
10