diff --git a/docs/make.jl b/docs/make.jl index 60b7af4..d1856c2 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -10,5 +10,6 @@ makedocs(sitename="LatticeGPU", modules=[LatticeGPU], doctest=true, "Space-time" => "space.md", "Groups and algebras" => "groups.md", "Fields" => "fields.md" + "Dirac" => "dirac.md" ], repo = "https://igit.ific.uv.es/alramos/latticegpu.jl") diff --git a/docs/src/dirac.md b/docs/src/dirac.md new file mode 100644 index 0000000..b911ab8 --- /dev/null +++ b/docs/src/dirac.md @@ -0,0 +1,103 @@ + +# Dirac operator + +The module `Dirac` has the necessary stuctures and function +to simulate non-dynamical 4-dimensional Wilson fermions. + +There are two main data structures in this module, the structure [`DiracParam`](@ref) + +```@docs +DiracParam +``` + +and the workspace [`DiracWorkspace`](@ref) + +```@docs +DiracWorkspace +``` + +The workspace stores four fermion fields, namely `.sr`, `.sp`, `.sAp` and `.st`, used +for different purposes. If the representation is either `SU2fund` of `SU3fund`, an extra +field with values in `U2alg`/`U3alg` is created to store the clover, used for the improvent. + +## Functions + +The functions [`Dw!`](@ref), [`g5Dw!`](@ref) and [`DwdagDw!`](@ref) are all related to the +Wilson-Dirac operator. + +The action of the Dirac operator `Dw!` is the following: + +```math +D\psi (\vec{x} = x_1,x_2,x_3,x_4) = (4 + m_0)psi(\vec{x}) +``` +```math + - \frac{1}{2}\sum_{\mu = 1}^4 \theta (\mu) (1-\gamma_\mu) U_\mu(\vec{x}) \psi(\vec{x} + \hat{\mu}) +``` +```math + + \theta^* (\mu) (1 + \gamma_\mu) U^{-1}_\mu(\vec{x} - \hat{\mu}) \psi(\vec{x} - \hat{\mu}) +``` + +where $$m_0$$ and $$\theta$$ are respectively the values `.m0` and `.th` of [`DiracParam`](@ref). +Note that $$|\theta(i)|=1$$ is not built into the code, so it should be imposed explicitly. + +Additionally, if |`dpar.csw`| > 1.0E-10, the clover term is assumed to be stored in `ymws.csw`, which +can be done via the [`Csw`](@ref) function. In this case we have an extra term in `Dw!`: + +```math + \frac{i}{2}C_{sw} \sum_{\pi = 1}^6 F^{cl}_\pi \sigma_\pi \psi(\vec{x}) +``` +where the $$\sigma$$ matrices are those described in the `Spinors` module and the index $$\pi$$ runs +as specified in `lp.plidx`. + +If the boudary conditions, defined in `lp`, are either `BC_SF_ORBI,D` or `BC_SF_AFWB`, the +improvement term + +```math + (c_t -1) (\delta_{x_4,a} \psi(\vec{x}) + \delta_{x_4,T-a} \psi(\vec{x})) +``` +is added. Since the time-slice $$t=T$$ is not stored, this accounts to modifying the second +and last time-slice. + +Note that the Dirac operator for SF boundary conditions assumes that the value of the field +in the first time-slice is zero. To enforce this, we have the function + +```@docs +SF_bndfix! +``` + +The function [`Csw`](@ref) is used to store the clover in `dws.csw`. It is computed +according to the expression + +```math +F_{\mu,\nu} = \frac{1}{8} (Q_{\mu \nu} - Q_{\nu \mu}) +``` + +where +```math +Q_{\mu\nu} = U_\mu(\vec{x})U_{\nu}(x+\mu)U_{\mu}^{-1}(\vec{x}+\nu)U_{\nu}(\vec{x}) + ++ U_{\nu}^{-1}(\vec{x}-\nu) U_\mu (\vec{x}-\nu) U_{\nu}(\vec{x} +\mu - \nu) U^{-1}_{\mu}(\vec{x}) + ++ U^{-1}_{\mu}(x-\mu)U_\nu^{-1}(\vec{x} - \mu - \nu)U_\mu(\vec{x} - \mu - \nu)U_\nu^{-1}(x-\nu) + ++ U_{\nu}(\vec{x})U_{\mu}^{-1}(\vec{x} + \nu - \mu)U^{-1}_{\nu}(\vec{x} - \mu)U_\mu(\vec{x}-\mu) + +``` + +The correspondence between the tensor field and the GPU-Array is the following: +```math +F[b,1,r] \to F_{41}(b,r) ,\quad F[b,2,r] \to F_{42}(b,r) ,\quad F[b,3,r] \to F_{43}(b,r) +``` +```math +F[b,4,r] \to F_{31}(b,r) ,\quad F[b,5,r] \to F_{32}(b,r) ,\quad F[b,6,r] \to F_{21}(b,r) +``` +where $$(b,r)$$ labels the lattice points as explained in the module `Space` + +The function [`pfrandomize!`](@ref), userfull for stochastic sources, is also present. + +The generic interface of these functions reads + +```@docs +Dw! +g5Dw! +DwdagDw! +Csw! +pfrandomize! +```