Source code for lettuce.equilibrium

import torch

__all__ = ["Equilibrium", "QuadraticEquilibrium", "IncompressibleQuadraticEquilibrium",
           "QuadraticEquilibrium_LessMemory"]


[docs]class Equilibrium: pass
[docs]class QuadraticEquilibrium(Equilibrium): def __init__(self, lattice): self.lattice = lattice def __call__(self, rho, u, *args): exu = torch.tensordot(self.lattice.e, u, dims=1) uxu = self.lattice.einsum("d,d->", [u, u]) feq = self.lattice.einsum( "q,q->q", [self.lattice.w, rho * ((2 * exu - uxu) / (2 * self.lattice.cs ** 2) + 0.5 * (exu / (self.lattice.cs ** 2)) ** 2 + 1)] ) return feq
[docs]class QuadraticEquilibrium_LessMemory(QuadraticEquilibrium): """does the same as the normal equilibrium, how ever it uses somewhere around 20% less RAM, but runs about 2% slower on GPU and 11% on CPU Use this by setting lattice.equilibrium = QuadraticEquilibrium_LessMemory(lattice) before starting your simulation """ def __call__(self, rho, u, *args): return self.lattice.einsum( "q,q->q", [self.lattice.w, rho * ((2 * torch.tensordot(self.lattice.e, u, dims=1) - self.lattice.einsum("d,d->", [u, u])) / (2 * self.lattice.cs ** 2) + 0.5 * (torch.tensordot(self.lattice.e, u, dims=1) / (self.lattice.cs ** 2)) ** 2 + 1)] )
[docs]class IncompressibleQuadraticEquilibrium(Equilibrium): def __init__(self, lattice, rho0=1.0): self.lattice = lattice self.rho0 = rho0 def __call__(self, rho, u, *args): exu = self.lattice.einsum("qd,d->q", [self.lattice.e, u]) uxu = self.lattice.einsum("d,d->", [u, u]) feq = self.lattice.einsum( "q,q->q", [self.lattice.w, rho + self.rho0 * ((2 * exu - uxu) / (2 * self.lattice.cs ** 2) + 0.5 * (exu / (self.lattice.cs ** 2)) ** 2)] ) return feq