diff --git a/pyquda_io/_field_utils.py b/pyquda_io/_field_utils.py index 4ff5a58..024dac6 100644 --- a/pyquda_io/_field_utils.py +++ b/pyquda_io/_field_utils.py @@ -174,7 +174,7 @@ def gaugeEvenShiftBackward(latt_size: List[int], grid_size: List[int], gauge: nu # DP for Dirac-Pauli, DR for DeGrand-Rossi # \psi(DP) = _DR_TO_DP \psi(DR) # \psi(DR) = _DP_TO_DR \psi(DP) -_DP_TO_DR = numpy.array( +_FROM_DIRAC_PAULI = numpy.array( [ [0, 1, 0, -1], [-1, 0, 1, 0], @@ -182,7 +182,7 @@ def gaugeEvenShiftBackward(latt_size: List[int], grid_size: List[int], gauge: nu [-1, 0, -1, 0], ] ) -_DR_TO_DP = numpy.array( +_TO_DIRAC_PAULI = numpy.array( [ [0, -1, 0, -1], [1, 0, 1, 0], @@ -192,15 +192,44 @@ def gaugeEvenShiftBackward(latt_size: List[int], grid_size: List[int], gauge: nu ) -def propagatorDeGrandRossiToDiracPauli(propagator: numpy.ndarray): - P = _DR_TO_DP - Pinv = _DP_TO_DR / 2 +def propagatorFromDiracPauli(propagator: numpy.ndarray): + P = _FROM_DIRAC_PAULI + Pinv = _TO_DIRAC_PAULI / 2 return numpy.ascontiguousarray(numpy.einsum("ij,tzyxjkab,kl->tzyxilab", P, propagator.data, Pinv, optimize=True)) -def propagatorDiracPauliToDeGrandRossi(propagator: numpy.ndarray): - P = _DP_TO_DR - Pinv = _DR_TO_DP / 2 +def propagatorToDiracPauli(propagator: numpy.ndarray): + P = _TO_DIRAC_PAULI + Pinv = _FROM_DIRAC_PAULI / 2 return numpy.ascontiguousarray(numpy.einsum("ij,tzyxjkab,kl->tzyxilab", P, propagator.data, Pinv, optimize=True)) + + +def spinMatrixFromDiracPauli(dirac_pauli: numpy.ndarray): + P = _FROM_DIRAC_PAULI + degrand_rossi = numpy.zeros_like(dirac_pauli) + for i in range(4): + for j in range(4): + for i_ in range((i + 1) % 2, 4, 2): + for j_ in range((j + 1) % 2, 4, 2): + if P[i, i_] * P[j, j_] == 1: + degrand_rossi[i, j] += dirac_pauli[i_, j_] + elif P[i, i_] * P[j, j_] == -1: + degrand_rossi[i, j] -= dirac_pauli[i_, j_] + return degrand_rossi.transpose(2, 3, 4, 5, 0, 1, 6, 7) / 2 + + +def spinMatrixToDiracPauli(degrand_rossi: numpy.ndarray): + P = _TO_DIRAC_PAULI + degrand_rossi = degrand_rossi.transpose(4, 5, 0, 1, 2, 3, 6, 7) / 2 + dirac_pauli = numpy.zeros_like(degrand_rossi) + for i in range(4): + for j in range(4): + for i_ in range((i + 1) % 2, 4, 2): + for j_ in range((j + 1) % 2, 4, 2): + if P[i, i_] * P[j, j_] == 1: + dirac_pauli[i, j] += degrand_rossi[i_, j_] + elif P[i, i_] * P[j, j_] == -1: + dirac_pauli[i, j] -= degrand_rossi[i_, j_] + return dirac_pauli diff --git a/pyquda_io/kyu.py b/pyquda_io/kyu.py index 4412e4c..edc66fe 100644 --- a/pyquda_io/kyu.py +++ b/pyquda_io/kyu.py @@ -4,7 +4,7 @@ import numpy from ._mpi_file import getSublatticeSize, readMPIFile, writeMPIFile -from ._field_utils import propagatorDiracPauliToDeGrandRossi, propagatorDeGrandRossiToDiracPauli +from ._field_utils import spinMatrixFromDiracPauli, spinMatrixToDiracPauli Nd, Ns, Nc = 4, 4, 3 @@ -43,13 +43,13 @@ def readPropagator(filename: str, latt_size: List[int], grid_size: List[int]): propagator = readMPIFile(filename, dtype, offset, (Ns, Nc, 2, Ns, Nc, Lt, Lz, Ly, Lx), (8, 7, 6, 5), grid_size) propagator = ( - propagator.transpose(5, 6, 7, 8, 3, 0, 4, 1, 2) + propagator.transpose(3, 0, 5, 6, 7, 8, 4, 1, 2) .astype("