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?
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;
}
d_b
usuario12029