วิธีการแก้ไขที่มีประสิทธิภาพสำหรับกริดที่ไม่มีโครงสร้าง?


12

ฉันต้องการทราบวิธีการที่ดีสำหรับการแก้ไขข้อมูลระหว่างกริดที่ไม่มีโครงสร้างสองตารางโดยที่หนึ่งตารางเป็นเวอร์ชันที่หยาบกว่าอีกอันหนึ่ง

ประสิทธิภาพเป็นสิ่งสำคัญมากสำหรับฉันเนื่องจากฉันแก้ปัญหา PDE ชั่วคราวที่ฉันต้องการถ่ายโอนข้อมูลระหว่างกริดในทุกขั้นตอนของการแก้ปัญหา

ฉันคิดเกี่ยวกับการใช้ kd-tree เพื่อค้นหาโหนดที่ใกล้ที่สุดของจุดที่กำหนดจากนั้นฉันจะใช้ฟังก์ชั่นรูปร่างขององค์ประกอบนั้น (การจำลองแบบ FEM) เพื่อแก้ไขข้อมูล นี่เป็นทางออกที่ดีใช่ไหม มีคนที่ดีกว่านี้ไหม

คุณรู้หรือไม่ว่าห้องสมุดที่มีประสิทธิภาพและเชื่อถือได้ใน C / C ++ สำหรับงานนี้หรือไม่?

* ฉันรู้ว่ามีคำถามที่คล้ายกัน แต่มันขอวิธีที่แม่นยำที่สุดในตารางที่มีโครงสร้าง


ดูคำถาม & คำตอบนี้ฉันได้รวบรวมวิธีการโอเพนซอร์ซจำนวนมากสำหรับเรื่องนี้: scicomp.stackexchange.com/questions/19137//
denfromufa

คำตอบ:


6

กริดที่ไม่มีโครงสร้างมีสถานที่ของพวกเขา

คุณอาจต้องการดู Earth Framework Modeling Framework (ESMF) พวกเขามีโค้ดสำหรับการ re-gridding - โดยเฉพาะสำหรับจุดประสงค์นี้และพวกเขาได้ทำสิ่งที่ดีด้วยรหัสคู่ขนานเช่นกัน ระบบทั้งหมดได้รับการออกแบบมาสำหรับรุ่นคู่ดังนั้นอาจมีสิ่งอื่นที่มีประโยชน์เช่นกัน

หมายเหตุอื่น ๆ :

"ไม่มีทางทำสิ่งนี้ได้อย่างมีประสิทธิภาพสำหรับจำนวนคะแนนที่มีนัยสำคัญ"

ดีมีประสิทธิภาพเป็นสิ่งที่เกี่ยวข้อง - เมื่อคุณมีตารางในโครงสร้างต้นไม้คุณสามารถค้นหาได้ใน O (logn) ซึ่งสามารถสาปแช่งอย่างรวดเร็วแม้ว่าจะไม่ใช่ O (1) เป็นการค้นหาตารางปกติ คือ.

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

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

"ฉันคิดถึงการใช้ kd-tree เพื่อค้นหาโหนดที่ใกล้ที่สุดของจุดที่กำหนดจากนั้นฉันจะใช้ฟังก์ชันรูปร่างขององค์ประกอบนั้น"

โปรดจำไว้ว่าโหนดที่ใกล้ที่สุดไม่ได้รับองค์ประกอบคุณ - ดังนั้นคุณจะต้องทำอีกเล็กน้อยเพื่อหาองค์ประกอบที่คุณต้องการ ตัวเลือกหนึ่งคือใช้ rtree แทนซึ่งเก็บ / ค้นหาด้วยกล่องที่มีขอบเขต - คุณจะได้รับองค์ประกอบมากกว่าหนึ่งรายการในการค้นหาแต่ละครั้ง แต่คุณสามารถตรวจสอบว่ารายการใดถูกต้องโดยตรง


มันดูดีนะ ฉันไม่จำเป็นต้องดัดแปลงตาข่ายดังนั้นการแมปจากตารางหนึ่งไปอีกอันจะทำเพียงครั้งเดียว ขอบคุณสำหรับคำแนะนำเกี่ยวกับโครงสร้างข้อมูล r-tree
เบอร์นาร์โด MR

1
O(N)O(logN)

7

ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณต้องการเติมค่าของกริดที่ดีขึ้นโดยการสอดแทรกในกริด coarser วิธีหนึ่งในการแก้ไขเชิงเส้นบนกริดที่ไม่มีโครงสร้างคือด้วย Delaunay triangulations (นี่คือวิธีที่คำสั่ง griddata และ TriScatteredInterp ของ Matlab นำมาใช้) หลังจากสร้างสมการของจุดกริดของคุณแล้วการประมาณค่าจะลดลงเพื่อหาตำแหน่งสามเหลี่ยมที่มีจุดเป้าหมายการคำนวณพิกัด barycentric และใช้ค่าฟังก์ชันที่จุดยอดเพื่อคำนวณค่าการประมาณค่า CGALสามารถสร้างสมการสามมิติ n (สำหรับขนาดกลาง n) และยังมีโมดูลการแก้ไข 2dในตัว


ใช่. แต่ฉันยังต้องการที่จะ "แทรก" ค่าจากกริดที่ดีลงในกริดหยาบเช่นกันนั่นคือเหตุผลที่ฉันบอกว่าการถ่ายโอน
เบอร์นาร์โด MR

3

นี่คือสิ่งที่ฉันทำในขณะนี้ยกเว้นฉันกำลังถ่ายโอนค่าฟังก์ชันที่จุดพื้นที่รูปสี่เหลี่ยมไม่ใช่โหนด ฉันใช้เทคนิคที่อธิบายไว้ในคำตอบที่เลือกสำหรับคำถามของฉันที่นี่: ค้นหาจุดสามเหลี่ยมใด

ABAB

  1. BpiA
  2. pi
  3. AA
  4. Ap1p2p3A

NMAO(NM)O(max(N,M))


2

นี่เป็นงานประเภทที่คุณต้องการหลีกเลี่ยงตาข่ายที่ไม่มีโครงสร้างเนื่องจากคุณไม่สามารถทำสิ่งนี้ได้อย่างมีประสิทธิภาพสำหรับจำนวนคะแนนที่มีนัยสำคัญ คุณควรพิจารณาใช้ meshes อย่างน้อยก็เกี่ยวข้องกับแต่ละอย่าง ตัวอย่างเช่นหากทั้งคู่ได้มาจากการปรับแต่งแบบลำดับชั้นของตาข่ายแบบหยาบคุณจะสามารถค้นหาได้อย่างง่ายดายและมีประสิทธิภาพว่าจุดการแก้ไขของตาข่ายหนึ่งอยู่ที่ตาข่ายอื่น


ฉันคิดว่าอาจเป็นตัวเลือกที่ดีที่สุด (ลำดับชั้นของกริด) หากเป็นกรณีนี้คุณรู้จักโครงสร้างข้อมูลที่ดีหรือวิธีการเฉพาะที่จะใช้หรือไม่?
เบอร์นาร์โด MR

ใช่ตาข่ายแบบลำดับชั้นจะถูกเก็บไว้เป็น quad / oct-trees (ถ้าเริ่มจากเซลล์หยาบเดียว) หรือ forest ของต้นไม้ดังกล่าว (ถ้า mesh แบบหยาบมีเซลล์มากกว่าหนึ่งเซลล์)
Wolfgang Bangerth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.