在dem並行程式中,每個程序只迴圈該程序包含的顆粒,並且每個程序還有一層ghost cell,用來存放另乙個程序傳送過來的顆粒資訊。
下面新增一些**進行實驗。在calc_force_dem.f
這個檔案裡對顆粒做一次遍歷,且輸出顆粒的id和位置座標。需要注意的是,這裡用的兩個執行緒並行,且每個程序開啟乙個文字,將該程序的顆粒資訊輸出到自己的文字中,對於ghost cell內的顆粒,輸出的時候多輸出一句「is ghost:
」,並帶上三個判斷函式的輸出值(is_ghost(ll), is_entering_ghost(ll), is_exiting_ghost(ll)
)來看看是否分別為ghost cell內的顆粒、是否正在進入ghost cell以及是否正在離開ghost cell。遍歷完所有顆粒後,關閉檔案並停止執行。**如下:
0號程序輸出的顆粒id及位置座標:
1號程序輸出的顆粒id和位置座標:
可以看到每個程序的id都是從1開始,下面對顆粒資訊在excel中進行顯示。
通過對資料顯示,可以看到,proc 0(即0號程序)只包含位於左半邊網格(紅色實線)的顆粒,proc 1只包含位於右半邊網格(紅色實線)的顆粒。並且它們都有一層ghost cell(紅色虛線)用來存放另乙個程序copy過來的顆粒資訊。當涉及到程序邊界碰撞的時候,會利用ghost cell內的顆粒資訊進行碰撞計算,並行應該保證ghost cell內的顆粒與被copy的顆粒保持實時同步。
至此,大致分析了下mfix-dem**並行的顆粒迴圈機制,即會迴圈該程序內內的real partcle和ghost particle,在做顆粒資訊統計的時候,需要注意這些問題。例如在統計碰撞的時候,資料傳輸邊界處的碰撞計算了兩次。下面給出實際輸出結果。單執行緒的碰撞搜尋的流程可以參考這篇部落格-mfix-dem中的碰撞搜尋。
參照上面參考的那篇博文的思路,新增如下**,迴圈思路是一致的,都是兩層迴圈,先迴圈每個顆粒,然後內層迴圈該顆粒的neighbor。不同的是這裡用兩個執行緒平行計算,輸出的時候也分別輸出兩個程序各自的資料。**如下:
得到0號程序的輸出結果如下:
重點看最後幾行。可以看到,0號程序的最後乙個顆粒17與ghost cell中的第乙個顆粒18進行了一次碰撞檢索。
再看下面1號程序的輸出結果。可以看到,1號程序的第乙個顆粒1號除了和右邊的2號顆粒進行了一次碰撞檢索,還和左邊ghost cell中的17號顆粒進行了一次檢索。這兩次碰撞實際上為同乙個碰撞,只不過在兩個程序都進行了計算。
Ogre中的碰撞檢測
基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued事件中,進行射線查詢,設...
碰撞檢測中碰撞器與觸發器的區別
物體發生碰撞的必要條件 兩個物體都必須帶有碰撞器,其中乙個物體還必須帶有剛體。在unity中,碰撞檢測的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器。觸發資訊檢測 1.ontriggerenter collider collider 當進入觸發器 2.ontriggerexit collide...
Ogre中的碰撞檢測 1
基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued 事件中,進行射線查詢,...