Я знаю, що на це питання вже відповіли, але ось схожий циклічний накопичувач на основі однієї особи, який реалізований у бібліотеці OpenFOAM C ++:
Кожна комірка має індекс (ID) у списку комірок. Для всіх облич визначено два списки: "обличчя внутрішнього власника" та "обличчя сусіда". Довжина обох списків обличчя відповідає кількості внутрішніх граней у сітці. Власником обличчя буде клітинка з нижчим ідентифікатором у клітинному списку (навпаки для сусіда обличчя). Межі обличчя написані останніми, і вони мають орієнтовані назовні нормали (з області рішення), і, звичайно, лише одну власну клітинку. Область обличчя нормальна орієнтована таким чином, що вона виглядає назовні від клітини власника до сусідньої клітини.
Це добре працює, наприклад, для розрахунку потоку. Потік оцінюється один раз на обличчя, і він додається до суми загальних граней для власницьких клітин і віднімається з сусідніх клітин (підсумовування / дедукція визначається виходячи з орієнтації області обличчя на нормальну). Прикордонні грані сортуються та зберігаються в нижній частині списку обличчя, що дозволяє визначати граничні умови як фрагменти списку обличчя (початкова мітка, кінцева мітка граничного патча), спрощуючи таким чином реалізацію граничних умов, а також як підвищення ефективності процесу оновлення для граничних умов, оскільки він спирається на рішення, що надається операціями на внутрішніх гранях.
Оскільки граничні грані агломеровані в патчі, міжпроцесовий зв'язок визначається для зв'язаних (процесорних) патчів і попередньо визначених. Це означає, що як тільки відбувається цикл через прикордонну сітку, функції доступу верхнього рівня викликають загорнуті MPI-дзвінки, роблячи такий код "автоматично" паралельним, якщо він покладається на вищеописане пояснення на основі обличчя.