Tôi biết câu hỏi này đã được trả lời, nhưng đây là bộ lưu trữ vòng lặp dựa trên một mặt tương tự được triển khai trong thư viện OpenFOAM C ++:
Mỗi ô có một chỉ mục (ID) trong một ô. Hai danh sách được xác định cho tất cả các khuôn mặt: "chủ sở hữu nội bộ" và "hàng xóm đối mặt". Độ dài của cả hai danh sách khuôn mặt tương ứng với số lượng khuôn mặt bên trong lưới. Chủ sở hữu khuôn mặt sẽ là ô có ID thấp hơn trong ô Danh sách (đối diện với hàng xóm khuôn mặt). Các mặt ranh giới được viết sau cùng và chúng có các quy tắc hướng ra bên ngoài (từ miền giải pháp), và tất nhiên, chỉ có một ô chủ sở hữu. Vùng mặt bình thường được định hướng sao cho nó nhìn ra ngoài từ ô chủ sang ô bên cạnh.
Điều này hoạt động tốt cho ví dụ tính toán thông lượng. Thông lượng được đánh giá một lần trên mỗi mặt và nó được thêm vào tổng số mặt cho các ô chủ sở hữu và được khấu trừ từ các ô lân cận (tính tổng / khấu trừ được quyết định dựa trên hướng của diện tích mặt bình thường). Các mặt biên được sắp xếp và lưu trữ ở dưới cùng của danh sách mặt, cho phép các điều kiện biên được xác định là các lát của danh sách mặt (nhãn bắt đầu, nhãn cuối của miếng vá ranh giới), do đó cũng đơn giản hóa việc thực hiện các điều kiện biên như hiệu quả của quá trình cập nhật cho các điều kiện biên, vì nó dựa vào giải pháp được cung cấp bởi các hoạt động trên các mặt bên trong.
Do các mặt biên được kết tụ thành các bản vá, nên giao tiếp giữa các quá trình được xác định cho các bản vá (bộ xử lý) được ghép nối và được xác định trước. Điều này có nghĩa là ngay khi có một vòng lặp trên lưới ranh giới, các hàm truy cập cấp cao nhất sẽ thực hiện các cuộc gọi MPI được bao bọc, làm cho mã đó "tự động" song song, nếu nó phụ thuộc vào kết nối dựa trên khuôn mặt được giải thích ở trên.