มีชนิดข้อมูลที่ดีอะไรบ้างสำหรับรหัส FVM CFD ที่ไม่มีโครงสร้างของเซลล์


12

ฉันสนใจคำแนะนำสำหรับโครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับการเรียกดูเซลล์ใน CFD ปริมาณ จำกัด บนพื้นฐานของเซลล์

ตัวอย่างหนึ่งที่ฉันพบ (ในรหัสdolfyn cfd ) เป็นเช่นนี้ (ฉันจะแสดงเซ็กเมนต์ที่เกี่ยวข้อง) ดังนั้นเราจึงมีอาร์เรย์ NFaces ซึ่งจำนวนใบหน้าสำหรับแต่ละเซลล์ถูกเก็บไว้ จากนั้น CFace array ซึ่งจับคู่หมายเลขโลคอลโลคอลกับหมายเลขใบหน้าทั่วโลก

\begin{listing}do ip=1,Ncel         ...         do j=1,NFaces(ip)           k   = CFace(ip,j)           ipp = Face(k)%cell1           inn = Face(k)%cell2           if( inn > 0 )then             ! internal\end{listing}

รหัสเป็นแบบ Face ดังนั้นจึงมีชนิดข้อมูลใบหน้าที่เก็บหมายเลขซีเรียลของสองเซลล์ที่อยู่ระหว่าง Face (k)% cell1 และ Face (k)% cell2

ความคิดเห็นใด ๆ เกี่ยวกับสิ่งนี้หรือคำแนะนำสำหรับแนวทางอื่นยินดีต้อนรับ

คำตอบ:


9

โครงสร้างที่คุณแสดงเป็นตัวเลือกที่ใช้กันทั่วไปและเทียบเท่ากับการจัดเก็บ adjacencies หน้าเซลล์ในรูปแบบเมทริกซ์ CSR โดยมีเซลล์ผีขอบเขตในสถานที่พิเศษ อย่างไรก็ตามโปรดทราบว่าวิธีการ FV ยังสามารถกำหนดให้มีการแวะผ่านใบหน้าทั้งหมดหรือเกือบทั้งหมดที่ใบหน้าแต่ละหน้าเข้าเยี่ยมชมเพียงครั้งเดียว (สร้างหน้าเซนทรอยด์ / การสร้างพื้นที่สี่เหลี่ยมจัตุรัสจากทั้งสองด้านแก้ปัญหา Riemann แจกจ่ายฟลักซ์กลับเข้าไปในเซลล์ ) คุณสามารถ "ปลอม" โดยใช้การข้ามผ่านเซลล์และข้ามเซลล์สองเซลล์ใด ๆ ที่อยู่ต่ำกว่า "เส้นทแยงมุม" ในเมทริกซ์เบาบาง แต่ทางเลือกยอดนิยมคือการจัดเก็บ(leftCell, rightCell) = support(face)ในกรณีนี้ใบหน้ากลายเป็นเอนทิตีชั้นหนึ่ง สิ่งนี้มีประโยชน์เพราะโดยทั่วไปคุณต้องมีที่สำหรับเก็บคะแนนพื้นที่รูปสี่เหลี่ยม (centroids), ใบหน้าปกติ คุณยังสามารถใส่ชิ้นส่วนที่สร้างใหม่ (เช่นสี่เหลี่ยมจัตุรัสน้อยที่สุด) ลงในโครงสร้างข้อมูลแบบอิงใบหน้า ดูเหมือนว่าการเคลื่อนผ่านใบหน้านั้นเป็นมิตรกับการทำให้เป็นเวกเตอร์เพราะทุกขนาดเป็นปกติ แต่ในทางกลับกันจะมีเอาต์พุตที่ทับซ้อนกันดังนั้นคุณต้องจัดระเบียบเส้นทางข้ามเพื่อหลีกเลี่ยงการใส่ในวงใน ด้วยโครงสร้างข้อมูลที่เน้นใบหน้ามากกว่านี้จึงเป็นเรื่องปกติที่จะเรียงลำดับหมายเลขใบหน้าเพื่อให้แต่ละประเภทเงื่อนไขขอบเขตสามารถนำไปใช้โดยใช้การข้ามผ่านใบหน้าที่ต่อเนื่องกัน

หากคุณเลือกโครงสร้างข้อมูลนี้อย่าลืมจัดเรียงใบหน้าเพื่อให้การสำรวจเส้นทางใช้ข้อมูลเซลล์ในแคชให้มากที่สุด ดูเอกสาร PETSc-FUN3D ใด ๆ สำหรับการวิเคราะห์ประสิทธิภาพของการสั่งซื้อใบหน้าและการเพิ่มประสิทธิภาพที่เกี่ยวข้อง


หากคุณวนซ้ำใบหน้าคุณจะต้องได้รับข้อมูลจาก leftCell และ rightCell เพื่อคำนวณฟลักซ์กล่าวว่า face 1 มี leftCell 1 และ rightCell 10, face 2 มี leftCell 6 และ rightCell 31, ... ดังนั้นจึงกระโดดผ่านหน่วยความจำ . เวกเตอร์นั้นจะเป็นมิตรได้อย่างไร?
Chris

ตามที่กล่าวไว้ข้างต้น (และกล่าวถึงในเอกสาร PETSc-FUN3D) คุณสั่งให้ใบหน้าใช้แคชซ้ำ ผลลัพธ์จะเหมือนกับการข้ามผ่านเซลล์ "ด้านเดียว" ซึ่งการเข้าชมแต่ละหน้าเพียงครั้งเดียว
Jed Brown

3

ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่นี่เป็นพื้นที่จัดเก็บแบบวนซ้ำที่ใช้ใบหน้าเดียวที่คล้ายกันซึ่งถูกนำไปใช้ในไลบรารี OpenFOAM C ++:

แต่ละเซลล์มีดัชนี (ID) ในรายการเซลล์ มีการกำหนดรายการสองรายการสำหรับใบหน้าทั้งหมด: "เจ้าของภายในใบหน้า" และ "ใบหน้าเพื่อนบ้าน" ความยาวของรายการใบหน้าทั้งสองสอดคล้องกับจำนวนใบหน้าภายในในตาข่าย เจ้าของใบหน้าจะเป็นเซลล์ที่มี ID ต่ำกว่าใน cellList (ตรงข้ามกับเพื่อนบ้าน) ขอบเขตใบหน้าถูกเขียนครั้งสุดท้ายและพวกเขามีบรรทัดฐานที่มุ่งเน้นภายนอก (จากโดเมนโซลูชัน) และแน่นอนเซลล์เดียวเท่านั้น บริเวณใบหน้าปกติเป็นแนวเพื่อให้มองออกไปจากเซลล์เจ้าของไปยังเซลล์เพื่อนบ้าน

มันใช้งานได้ดีสำหรับการคำนวณฟลักซ์ ฟลักซ์จะถูกประเมินหนึ่งครั้งต่อหน้าและจะถูกเพิ่มไปยังผลรวมของใบหน้าทั้งหมดสำหรับเซลล์เจ้าของและหักออกจากเซลล์เพื่อนบ้าน (การสรุป / การหักจะถูกตัดสินใจตามการวางแนวของพื้นที่ใบหน้าปกติ) ขอบเขตของใบหน้าจะถูกจัดเรียงและเก็บไว้ที่ด้านล่างของรายการใบหน้าทำให้สามารถกำหนดเงื่อนไขขอบเขตเป็นส่วนของรายการใบหน้า (เริ่มต้นป้ายชื่อ, ป้ายสิ้นสุดของแพทช์ขอบเขต) ทำให้การดำเนินการของเงื่อนไขขอบเขตง่ายขึ้นเช่นกัน เพื่อเพิ่มประสิทธิภาพของกระบวนการอัพเดตสำหรับขอบเขตของขอบเขตเนื่องจากอาศัยโซลูชั่นที่ได้รับจากการดำเนินการบนใบหน้าภายใน

เนื่องจากใบหน้าของขอบเขตถูกรวมตัวกันเป็นแพตช์การสื่อสารระหว่างกระบวนการจึงถูกกำหนดไว้สำหรับแพตช์คู่ (โปรเซสเซอร์) และกำหนดไว้ล่วงหน้า ซึ่งหมายความว่าทันทีที่มีการวนลูปผ่านขอบเขตของขอบเขตฟังก์ชันการเข้าถึงระดับสูงสุดจะเรียกใช้การเรียก MPI ที่ล้อมรอบทำให้รหัสดังกล่าว "โดยอัตโนมัติ" ขนานกันถ้าใช้การเชื่อมต่อแบบอิงกับใบหน้า


ไม่มีปัญหาฉันดีใจที่เห็นว่าคำอธิบายนี้มีประโยชน์กับใครบางคน .. :) คุณทำงานกับ OpenFOAM เช่นกันหรือไม่?
tmaric

ก่อนหน้านี้ฉันเคยเป็นเพียงเล็กน้อย โดยทั่วไปฉันมักจะอยู่ห่างจากแนวโน้มที่ยอมรับและพยายามที่จะบูรณาการล้อ นั่นคือเต่าของฉัน
Johntra Volta

1
เต่าของคุณตรงข้ามกับวิทยาศาสตร์คอมพิวเตอร์ Tao: "ไม่ต้องคิดค้นวงล้อใหม่" แต่ฉันเข้าใจได้มันน่าสนใจที่จะทำอะไรตั้งแต่เริ่มแรก! :)
tmaric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.