56 COMPLEX(KIND=dp),
INTENT(IN) :: u_mu(:, :), u_nu_at_mu(:, :), &
57 u_mu_at_nu(:, :), u_nu(:, :)
58 COMPLEX(KIND=dp),
INTENT(OUT) :: p(:, :)
60 p(:, :) = matmul(matmul(u_mu, u_nu_at_mu), matmul(conjg(transpose(u_mu_at_nu)), conjg(transpose(u_nu))))
73 COMPLEX(KIND=dp),
INTENT(IN) :: plaquettes(:, :, :)
74 INTEGER,
INTENT(IN) :: ndim
75 REAL(kind=
dp),
INTENT(IN) :: phase_limit
76 REAL(kind=
dp),
INTENT(OUT) ::
value, maximum
77 INTEGER,
INTENT(OUT) :: status
79 COMPLEX(KIND=dp),
ALLOCATABLE :: a(:, :), e(:), f(:, :, :), term(:, :), &
81 INTEGER :: i, j, n, np, sdim
82 LOGICAL,
ALLOCATABLE :: bwork(:)
83 REAL(kind=
dp) :: determinant_phase
84 REAL(kind=
dp),
ALLOCATABLE :: phase(:), rwork(:)
89 IF (ndim /= 2 .AND. ndim /= 4)
RETURN
90 IF (.NOT. ieee_is_finite(phase_limit))
RETURN
91 IF (phase_limit <= 0.0_dp .OR. phase_limit >= pi)
RETURN
92 n =
SIZE(plaquettes, 1)
93 np = ndim*(ndim - 1)/2
94 IF (n < 1 .OR.
SIZE(plaquettes, 2) /= n .OR.
SIZE(plaquettes, 3) /= np)
RETURN
95 IF (.NOT. all(ieee_is_finite(real(plaquettes,
dp))))
RETURN
96 IF (.NOT. all(ieee_is_finite(aimag(plaquettes))))
RETURN
97 ALLOCATE (a(n, n), v(n, n), e(n), work(4*n), rwork(n), phase(n), bwork(n), f(n, n, np), term(n, n))
99 a(:, :) = plaquettes(:, :, j)
100 term(:, :) = matmul(conjg(transpose(a)), a)
102 term(i, i) = term(i, i) - 1.0_dp
104 IF (maxval(abs(term)) > unitary_tol)
THEN
108 CALL zgees(
'V',
'N', select_none, n, a, n, sdim, e, v, n, work,
SIZE(work), rwork, bwork, status)
109 IF (status /= 0)
RETURN
110 phase(:) = atan2(aimag(e), real(e,
dp))
112 determinant_phase = atan2(sin(sum(phase)), cos(sum(phase)))
113 maximum = abs(determinant_phase)
114 value = -determinant_phase/(2.0_dp*pi)
116 maximum = max(maximum, maxval(abs(phase)))
119 a(:, i) = cmplx(0.0_dp, phase(i),
dp)*v(:, i)
121 f(:, :, j) = matmul(a, conjg(transpose(v)))
123 IF (maximum >= phase_limit)
THEN
129 term(:, :) = matmul(f(:, :, 1), f(:, :, 6)) - matmul(f(:, :, 2), f(:, :, 5)) + matmul(f(:, :, 3), f(:, :, 4))
131 value =
value - real(term(i, i),
dp)/(4.0_dp*pi*pi)