Modelo Ising Simulaciones de Montecarlo en 4D y 5D

Voy a simular el modelo Ising en 4D y superior para calcular las correlaciones de espín-espín y los exponentes críticos y me pregunto cómo abordar esto algorítmicamente.

Por ejemplo, en 1D, use una matriz para almacenar giros. En 2D, utilice una matriz. En 3D, use una matriz 2D o una tupla triple. Una forma en que lo pienso es que en cualquier dimensión N, puede retroceder hasta la tercera dimensión para ayudar a comprender los términos del vecino más cercano.

Por ejemplo, en 2D, los giros siguientes a un giro particular en el centro son solo 2 vecinos más cercanos de 1D. En 3D, los giros al lado de un giro particular en el centro son solo 2 vecinos más cercanos en 2D (es decir, los planos perpendiculares entre sí).

En 4D, ¿puedo considerarlo como los 2 vecinos más cercanos en 3D? Del mismo modo, ¿cómo puedo pensar algorítmicamente en la 5D?

¿O debería abstenerme de usar las clases de contenedor estándar y solo usar tuplas en todas partes?

En 3d hay 3 planos perpendiculares de 2d vecinos más cercanos. En 4d, habría 4 cubos de vecinos más cercanos en 3d. Etcétera.
Para probar la declaración del usuario 37496, considere elegir tres ejes de su conjunto de cuatro ejes. Tres define un volumen, por lo que el número de hiperplanos (N-1) mutuamente perpendiculares que pasan por un punto es norte elegir norte 1 , eso es, norte .

Respuestas (1)

La mejor manera de almacenarlos puede ser usar una matriz 1D y usar una lista separada de enlaces que realiza un seguimiento de las conexiones entre los sitios. En el enfoque, todo lo que necesita hacer para cambiar su código de 1D a 2D a 3D es modificar la matriz de enlaces.

Como ejemplo, en 2D, podría tener una lista de los valores de giro llamados spins[N]en 2D, hay 2N 'enlaces' (cada sitio está conectado a otros cuatro, pero tenemos que dividir por 2 para evitar el conteo excesivo). En este segmento de código C++, construimos la matriz de bonos (suponiendo que ya tenemos una matriz vacía: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; 
    }