2013-07-25 87 views
3

我需要使用每個變量的值進行函數調用(wndspeed,xh,yh,A和B) 有沒有人有關於如何在不使用這些嵌套循環的情況下做到這一點的想法?有沒有辦法可以避免這些嵌套循環?

do i=1,windsteps 
    wndspeed =windinc*float(i-1)+windstart   

    write(*,*)i,wndspeed 

    do j=1,ixsteps 
     xh=xinc*float(j-1) 
     xh=xh/height 

     do k=1,iysteps 
      yh=10.*float(k-1)*1e3 
      yh=yinc*float(k-1)  
      yh=yh/height 

      do l=1,iasteps 
       A=(ainc*float(l-1)+50)*1e3  


       do m=1,ibsteps 
       B=binc*float(m-1)+1 



       Pdelt=wndspeed*wndspeed*rho*exp(1.)/B 

       call trackslopes(elevang,wndspeed,coxmkcor,skewpeak, 
1     numslops,slopary,tanumax,xh,yh,A,B,Pdelt,height,numchips, 
2     bkgrdwnd,antgain) 
       skewpeak=0 

       call trackconvolve(height,tanumax,numslops,slopary,numchips, 
1     stppchip,deadband,elevang,convary) 


enddo 
enddo 
enddo 
enddo 
+0

您需要找到更好的O(n^x)算法。這似乎是O(n^5)現在也許你可以找到獨立的,所以可以減少到n^4,但需要看到裏面的tracklopes。 –

+1

你看過[Elemental](http://fortranwiki.org/fortran/show/elemental)程序嗎? –

+0

@huseyintugrulbuyukisik我會嘗試。 –

回答

1

除非tracklopes/trackconvolve過程可以簡化爲簡單,否則無法(非平凡地)移除嵌套循環。

要看到這一點,最好的方法是每個子循環取決於其至少一個超級循環的值,這樣除非最內部的計算是整個過程可以用數學簡化,已經是最簡單的形式。

如果你只是不喜歡看那麼多層次的嵌套,你可以嘗試使用索引數組而不是5個不同的索引來壓縮5-D空間,然後你必須寫一個相當醜陋的一維循環檢查5個索引中每一個的邊界,然後適當地推進索引數組。