Các chiến lược cho sàng lọc lưới thích ứng cục bộ (AMR cục bộ) trên các lưới không có cấu trúc là gì?


8

Tôi quan tâm đến AMR địa phương trên các mắt lưới không có cấu trúc. Hiện tại, tôi đang làm việc với thư viện OpenFOAM - nó hỗ trợ AMR cục bộ hoàn toàn không có cấu trúc:

  • tiêu chí sàng lọc tế bào xác định danh sách các ô bị cắt
  • các ô được chọn được tinh chỉnh: toàn bộ lưới được xây dựng lại
  • một bản đồ được tạo từ lưới cũ sang lưới mới
  • kết nối được tính toán lại (các ô mặt, các cạnh cạnh, v.v.)
  • các trường được ánh xạ lên lưới mới

Do các cấu trúc dữ liệu liên quan về cơ bản là các vectơ C ++, nên lưới bị thổi phồng, sao chép.

Tôi cần tìm hiểu về các phương pháp thay thế có thể được xây dựng dựa trên lưới sử dụng các cấu trúc dữ liệu tĩnh. Một trong số đó là AMR địa phương Octree song song, có mặt trong p4estDendro .

Ai đó có thể chỉ cho tôi một bài đánh giá gần đây về các chiến lược AMR thích ứng cục bộ cho lưới không có cấu trúc không?

Lời khuyên dựa trên kinh nghiệm sẽ còn tốt hơn nữa: công cụ AMR cục bộ nào là lựa chọn tối ưu cho lưới không cấu trúc dựa trên cấu trúc dữ liệu cố định?

Tôi cần một cái nhìn tổng quan trước khi đọc về việc cân bằng giao tiếp giữa các cây trên trang đầu tiên của bài báo. :)


Chính xác ý bạn là gì với "cấu trúc dữ liệu tĩnh"? Trong quá trình sàng lọc lưới, tất nhiên số lượng ô tăng lên, và do đó một số cấu trúc dữ liệu chắc chắn phải phát triển ("bị thổi phồng, sao chép"). Tôi chỉ không chắc chắn chính xác câu hỏi của bạn là gì, tôi sợ.
Wolfgang Bangerth

Chà, nếu lưới dựa trên std :: vector giống như cấu trúc dữ liệu, thì việc thêm ngay cả một ô duy nhất, sẽ tạo ra std :: vector mới (với kích thước tăng cho ô mới, các điểm và mặt của nó) và sao chép dữ liệu cũ chưa tinh chế đến các cấu trúc mới. Với Octree Forrest, nếu tôi hiểu chính xác, tôi sẽ không mở rộng cấu trúc dữ liệu xác định lưới của mình, Forree Octree sẽ chứa tất cả thông tin cần thiết để sàng lọc và octree là cấu trúc dữ liệu động theo nghĩa thay đổi một ô duy nhất không sao chép toàn bộ cây và mở rộng nó cho một phần tử.
tmaric

Một lưu ý khác: vì tôi tham gia vào hai luồng pha, ngay cả đối với dòng phân tán cao (rất nhiều bong bóng), tôi sẽ có thể có tới 25% tổng số tế bào cần được tinh chế, điều đó có nghĩa là đối với một cấu trúc hoàn toàn không có cấu trúc AMR cục bộ, mỗi khi tôi tinh chỉnh, tôi sao chép toàn bộ lưới chỉ cho 25% các tế bào đang hoạt động trong sàng lọc.
tmaric

2
Nếu bạn sử dụng cấu trúc dữ liệu tĩnh, thực sự không có cách nào hiệu quả để thêm dữ liệu mới mà không cần sao chép dữ liệu cũ vào một vectơ mới. Một thao tác chèn / xóa sau đó sẽ tốn một thao tác , trong đó là chiều dài của vectơ. Theo như tôi biết, nó chỉ có thể được thực hiện một cách hiệu quả nếu bạn sử dụng cấu trúc dữ liệu động (cây, biểu đồ, v.v.) mà gần như sử dụng các hoạt động . n Θ ( 1 )Θ(n)nΘ(1)
Paul

2
Tôi không biết những thư viện khác sử dụng nhưng trong deal.II, chúng tôi có sự kết hợp của cấu trúc dữ liệu tĩnh và động: chúng tôi có một std :: vector cho mỗi cấp của lưới phân cấp. Nếu các ô bị bỏ đi, chúng ta đánh dấu các phần tử của vectơ là không sử dụng. Nếu các ô được tinh chỉnh, các em được đưa vào std :: vector của cấp độ tiếp theo, đầu tiên vào các phần tử không được sử dụng, sau đó được thêm vào cuối. Khi việc tái phân bổ là cần thiết bởi vì các yếu tố được thêm vào, trước tiên chúng tôi sẽ đếm xem có bao nhiêu yếu tố mới mà chúng tôi sẽ cần trong quá trình sàng lọc và thực hiện một phân bổ duy nhất. Trong sơ đồ này, chi phí phân bổ / sao chép là không đáng kể.
Wolfgang Bangerth

Câu trả lời:


4

Từ các ý kiến ​​trên, tôi hiểu rằng bạn muốn tránh sao chép vectơ khi bạn thêm nhiều ô. Cách tiếp cận đơn giản nhất là dự trữ không gian cho số lượng ô tối đa mà bạn có thể muốn có:

std::vector<YourCellType> myVectorOfCells;
vectorOfCells.reserve(maxNoCells);

Vectơ của bạn đã phân bổ không gian để tạo các ô maxNoCells nhưng chưa có ô nào được tạo. Bây giờ bạn có thể thêm maxNoCells vào vector của mình, từng thao tác trong O(1)thời gian mà không cần sao chép vector. Tuy nhiên, Tiêu chuẩn C ++ yêu cầu thao tác Push_back được khấu hao theo O(1) thời gian. Nếu bạn thêm nhiều hơn maxNoCells, vectơ sẽ tự sao chép, dự trữ không gian cho số lần nhiều lần như trước đây (triển khai điển hình chọn ak trong khoảng từ 1,4 đến 2), để bạn có thể tiếp tục thêm các ô vào vectơ O(1)kịp thời. Thao tác thay đổi kích thước này là không O(1) .

Chiến lược AMR yêu cầu cấu trúc dữ liệu động, như danh sách các ô được liên kết hỗ trợ chèn / xóa O(1). Tuy nhiên, một danh sách được liên kết chậm hơn nhiều so với vectơ vì di chuyển ngang qua nó đòi hỏi phải nhảy ngẫu nhiên trong bộ nhớ từ ô này sang ô khác, tạo ra rất nhiều lỗi nhớ cache: trong các bộ xử lý hiện đại, việc chuyển đổi phần tử của vectơ sẽ nhanh hơn để chèn một phần tử hơn so với phần tử của danh sách được liên kết. Vì vậy, trong thực tế, vectơ là con đường để đi: chúng có thể tùy chỉnh (bạn có thể cung cấp cho chúng bộ cấp phát của riêng bạn), các ô của bạn được căn chỉnh trong bộ nhớ, bạn có các điểm ngẫu nhiên trongn / 2n/2n/2O(1)thời gian ... khi bạn dự trữ bộ nhớ trước, bạn cũng có thể thêm các yếu tố trong thời gian O (1)! Như giáo sư Bangerth đã đề cập ở trên, các cấu trúc dữ liệu phân cấp như cây cũng sử dụng các vectơ bên trong để lưu trữ dữ liệu của chúng.

Tuy nhiên, tôi nghĩ sẽ tốt hơn nếu phân bổ bộ nhớ khi bắt đầu mô phỏng. Bạn phải biết có bao nhiêu ô bạn có thể cần để kiểm tra xem bạn có đủ bộ nhớ không. Bạn không muốn mô phỏng của mình trong 200.000 bộ xử lý phải phân bổ lại cấu trúc dữ liệu của bạn hoặc hết bộ nhớ và phải trao đổi vào đĩa. Trong trường hợp điều đó xảy ra, ý kiến ​​của tôi là chương trình của bạn sẽ bị lỗi lớn do lỗi đầu vào của người dùng.


Cảm ơn bạn! :) Tôi sẽ kiểm tra chức năng của hoạt động dự trữ cho cấu trúc dữ liệu vectơ động trong OpenFOAM ... Tôi nghĩ rằng hoạt động này bây giờ chạy dựa trên dữ liệu lưới được đọc từ đĩa, điền vào cấu trúc dữ liệu đến cuối .
tmaric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.