Модель Изинга Моделирование методом Монте-Карло в 4D и 5D

Я собираюсь смоделировать модель Изинга в 4D и выше, чтобы рассчитать спин-спиновые корреляции и критические показатели, и мне интересно, как решить это алгоритмически.

Например, в 1D используйте массив для хранения спинов. В 2D используйте матрицу. В 3D используйте 2D-матрицу или трехкортежность. Один из способов, которым я думаю об этом, заключается в том, что в любом измерении N вы можете вернуться к 3-му измерению, чтобы помочь понять термины ближайшего соседа.

Например, в 2D спины, следующие за определенным спином в центре, являются просто двумя ближайшими одномерными соседями. В 3D спины рядом с конкретным спином в центре — это всего лишь 2 ближайших соседа в 2D (т. е. плоскости, перпендикулярные друг другу).

Могу ли я думать об этом в 4D как о двух ближайших соседях 3D? Точно так же, как я могу думать о 5D алгоритмически?

Или мне следует воздержаться от использования стандартных классов контейнеров и везде использовать кортежи?

В 3d есть 3 перпендикулярные плоскости 2d ближайших соседей. В 4d было бы 4 куба 3d ближайших соседей. И так далее.
Чтобы доказать утверждение пользователя 37496, рассмотрите возможность выбора трех осей из набора четырех осей. Три определяют объем, поэтому количество (N-1)-гиперплоскостей, взаимно перпендикулярных, проходящих через точку, равно Н выбирать Н 1 , то есть, Н .

Ответы (1)

Лучшим способом их хранения может быть использование одномерного массива и использование отдельного списка связей, который отслеживает связи между сайтами. В этом подходе все, что вам нужно сделать, чтобы изменить код с 1D на 2D и на 3D, — это изменить массив bonds.

Например, в 2D у вас может быть список значений спина, который spins[N]в 2D называется 2N «связей» (каждый сайт связан с четырьмя другими, но мы должны разделить на 2, чтобы избежать пересчета). В этом сегменте кода C++ мы строим массив bonds (при условии, что у нас уже есть пустой массив:bonds[2*N][2]

for (int i = 0; i < nsites; i++) {
        //calculate the x and y coordinates of site i
        int xi = i % lx; 
        int yi = i/lx;
        //x direction bonds are even numbered
        bonds[0][2*i] = i;
        bonds[1][2*i] = yi*lx + ((xi+1) %lx);
        //y direction bonds are odd numbered
        bonds[0][2*i+1] = i; // same
        bonds[1][2*i+1] = ((yi+1)%ly)*lx + xi; 
    }