ฉันเป็นนักวิจัยวิทยาศาสตร์ดาวเคราะห์และอีกหนึ่งโครงการที่ฉันกำลังทำอยู่คือการจำลองแบบN -body เกี่ยวกับวงแหวนของดาวเสาร์ เป้าหมายของการศึกษาครั้งนี้คือการจับก้อนกอเข้าด้วยกันภายใต้แรงโน้มถ่วงของตัวเองและวัดมวลรวมของกลุ่มกับความเร็วเฉลี่ยของอนุภาคทั้งหมดในเซลล์ เรากำลังพยายามหาว่าสิ่งนี้สามารถอธิบายการสังเกตการณ์บางอย่างที่ทำโดยยานแคสสินีในช่วงฤดูร้อนดาวเสาร์เมื่อสิ่งมีชีวิตขนาดใหญ่เห็นโครงสร้างเงาขนาดใหญ่บนวงแหวนที่เกือบจะเป็นขอบ ด้านล่างนี้เป็นภาพหน้าจอของเวลาที่กำหนดใด ๆ ที่ดูเหมือน (แต่ละอนุภาคมีเส้นผ่านศูนย์กลาง 2 เมตรและเซลล์จำลองเองนั้นมีความยาวประมาณ 700 เมตร)
รหัสที่ฉันใช้อยู่นั้นได้กระจายความเร็วเฉลี่ยในทุกการประทับเวลาแล้ว สิ่งที่ฉันต้องทำคือหาวิธีที่จะกำหนดมวลของอนุภาคในกอและไม่ใช่อนุภาคที่หลงทางระหว่างพวกมัน ฉันรู้ว่าทุกตำแหน่งของอนุภาคมวลขนาดและอื่น ๆ แต่ฉันไม่รู้ว่ามันง่ายขนาดนั้นอนุภาค 30,000-40,000 พร้อมกับ 102,000-105,000 ประกอบเป็นเส้นเดียวต่อสายตามนุษย์ชัดเจน
ดังนั้นอัลกอริทึมที่ฉันต้องเขียนจะต้องเป็นรหัสที่มีพารามิเตอร์ที่ผู้ใช้ป้อนน้อยที่สุดเท่าที่จะเป็นไปได้ (สำหรับการทำซ้ำและความเที่ยงธรรม) ที่จะผ่านตำแหน่งอนุภาคทั้งหมดแล้วคำนวณว่าอนุภาคใดเป็นกระจุก มวล. มันจะดีถ้ามันสามารถทำได้สำหรับ "แต่ละ" กลุ่ม / สาระเมื่อเทียบกับทุกสิ่งที่อยู่ในเซลล์ แต่ฉันไม่คิดว่าจริง ๆ แล้วฉันต้องการแยกมันออก
สิ่งเดียวที่ฉันคิดคือทำการคำนวณระยะทางN 2โดยที่ฉันคำนวณระยะห่างระหว่างทุกอนุภาคและถ้าบอกว่า 100 อนุภาคที่อยู่ใกล้ที่สุดนั้นอยู่ในระยะทางที่กำหนดจากนั้นอนุภาคนั้นจะถูกพิจารณาเป็นส่วนหนึ่งของ กลุ่ม แต่ดูเหมือนว่าจะเลอะเทอะมากและฉันหวังว่าคุณ CS คนและโปรแกรมเมอร์อาจจะรู้วิธีการแก้ปัญหาที่สง่างามมากขึ้น?
แก้ไขได้ด้วยโซลูชั่นของฉัน: อะไรที่ฉันไม่ได้ที่จะใช้การจัดเรียงของที่ใกล้ที่สุดเพื่อนบ้าน / วิธีการคลัสเตอร์และทำอย่างรวดเร็ว-N-สกปรกN 2ดำเนินการครั้งแรก ดังนั้นเอาทุกอนุภาคคำนวณระยะทางไปยังอนุภาคอื่นทั้งหมดและเกณฑ์สำหรับในกลุ่มหรือไม่ก็คือว่ามีอนุภาคNอยู่ภายในระยะทางdหรือไม่(พารามิเตอร์สองตัวที่ต้องตั้งค่านิรนัยโชคไม่ดี คำตอบ / ความคิดเห็นฉันจะไม่หนีไปโดยที่ไม่มีบางคน)
จากนั้นฉันเร่งความเร็วโดยไม่เรียงลำดับระยะทาง แต่เพียงแค่ทำการค้นหาคำสั่งNและเพิ่มเคาน์เตอร์สำหรับอนุภาคภายในdและเร่งความเร็วของสิ่งต่าง ๆ ด้วยปัจจัย 6 จากนั้นฉันเพิ่มต้นไม้ "โปรแกรมเมอร์ของโง่" (เพราะฉันรู้ ถัดจากโค้ดเกี่ยวกับต้นไม้) ฉันแบ่งเซลล์จำลองเป็นจำนวนกริดที่กำหนดไว้ (ผลลัพธ์ที่ดีที่สุดเมื่อขนาดกริด≈7 d ) โดยที่กริดหลักเข้าแถวกับเซลล์หนึ่งกริดถูกชดเชยครึ่งหนึ่งในxและyและอีกสองอันถูกชดเชยด้วย 1/4 ± xและ± Y รหัสจะแบ่งอนุภาคออกเป็นกริดจากนั้นแต่ละอนุภาคNจะต้องมีระยะทางคำนวณจากอนุภาคอื่น ๆ ในเซลล์นั้น
ตามทฤษฎีแล้วถ้านี่เป็นต้นไม้จริงฉันควรสั่งN * log ( N ) แทนความเร็วN 2 ฉันได้ที่ไหนสักแห่งระหว่างสองที่ซึ่งชุดย่อย 50,000 ชุดฉันมีความเร็วเพิ่มขึ้น 17x และสำหรับเซลล์ 150,000 อนุภาคฉันได้รับความเร็วเพิ่มขึ้น 38 เท่า 12 วินาทีสำหรับครั้งแรก 53 วินาทีสำหรับวินาที 460 วินาทีสำหรับเซลล์ 500,000 อนุภาค สิ่งเหล่านี้คือความเร็วเทียบเคียงกับระยะเวลาที่โค้ดใช้ในการรันการจำลอง 1 การจับเวลาล่วงหน้าไปข้างหน้า โอ้ - และมันเต็มไปด้วยเธรดดังนั้นมันจะใช้โปรเซสเซอร์มากเท่าที่ฉันสามารถโยนได้