Skip to content
Snippets Groups Projects
Commit 8bd55fe3 authored by Martin Bauer's avatar Martin Bauer
Browse files

fixed compressible bug

parent fb46dd1b
No related branches found
No related tags found
No related merge requests found
...@@ -20,6 +20,11 @@ def ubb(pdfField, direction, lbMethod, velocity): ...@@ -20,6 +20,11 @@ def ubb(pdfField, direction, lbMethod, velocity):
neighbor = offsetFromDir(direction, lbMethod.dim) neighbor = offsetFromDir(direction, lbMethod.dim)
inverseDir = invDir(direction) inverseDir = invDir(direction)
# TODO adapt velocity to force
# TODO compute density
densitySymbol = lbMethod.conservedQuantityComputation.definedSymbols()['density']
velTerm = 6 * sum([d_i * v_i for d_i, v_i in zip(neighbor, velocity)]) * weightOfDirection(direction) velTerm = 6 * sum([d_i * v_i for d_i, v_i in zip(neighbor, velocity)]) * weightOfDirection(direction)
return [sp.Eq(pdfField[neighbor](inverseDir), return [sp.Eq(pdfField[neighbor](inverseDir),
pdfField(direction) - velTerm)] pdfField(direction) - velTerm)]
......
...@@ -26,7 +26,7 @@ def _getParams(params, optParams): ...@@ -26,7 +26,7 @@ def _getParams(params, optParams):
defaultOptimizationDescription = { defaultOptimizationDescription = {
'doCseInOpposingDirections': False, 'doCseInOpposingDirections': False,
'doOverallCse': False, 'doOverallCse': False,
'split': True, 'split': False,
'fieldSize': None, 'fieldSize': None,
'fieldLayout': 'reverseNumpy', # can be 'numpy' (='c'), 'reverseNumpy' (='f'), 'fzyx', 'zyxf' 'fieldLayout': 'reverseNumpy', # can be 'numpy' (='c'), 'reverseNumpy' (='f'), 'fzyx', 'zyxf'
...@@ -80,6 +80,7 @@ def createLatticeBoltzmannAst(updateRule=None, optimizationParams={}, **kwargs): ...@@ -80,6 +80,7 @@ def createLatticeBoltzmannAst(updateRule=None, optimizationParams={}, **kwargs):
if params['target'] == 'cpu': if params['target'] == 'cpu':
from pystencils.cpu import createKernel from pystencils.cpu import createKernel
if 'splitGroups' in updateRule.simplificationHints: if 'splitGroups' in updateRule.simplificationHints:
print("splitting!")
splitGroups = updateRule.simplificationHints['splitGroups'] splitGroups = updateRule.simplificationHints['splitGroups']
else: else:
splitGroups = () splitGroups = ()
...@@ -91,6 +92,11 @@ def createLatticeBoltzmannAst(updateRule=None, optimizationParams={}, **kwargs): ...@@ -91,6 +92,11 @@ def createLatticeBoltzmannAst(updateRule=None, optimizationParams={}, **kwargs):
return ValueError("'target' has to be either 'cpu' or 'gpu'") return ValueError("'target' has to be either 'cpu' or 'gpu'")
res.method = updateRule.method res.method = updateRule.method
#TODO debug begin
from pystencils.cpu import generateC
from pystencils.display_utils import highlightCpp
print(generateC(res))
#TODO debug end
return res return res
......
import abc import abc
from collections import OrderedDict
import sympy as sp import sympy as sp
from pystencils.equationcollection import EquationCollection from pystencils.equationcollection import EquationCollection
...@@ -139,8 +141,6 @@ class DensityVelocityComputation(AbstractConservedQuantityComputation): ...@@ -139,8 +141,6 @@ class DensityVelocityComputation(AbstractConservedQuantityComputation):
def outputEquationsFromPdfs(self, pdfs, outputQuantityNamesToSymbols): def outputEquationsFromPdfs(self, pdfs, outputQuantityNamesToSymbols):
dim = len(self._stencil[0]) dim = len(self._stencil[0])
symbolsToExtract = set()
eqColl = getEquationsForZerothAndFirstOrderMoment(self._stencil, pdfs, self._symbolOrder0, self._symbolsOrder1) eqColl = getEquationsForZerothAndFirstOrderMoment(self._stencil, pdfs, self._symbolOrder0, self._symbolsOrder1)
if self._compressible: if self._compressible:
...@@ -151,14 +151,22 @@ class DensityVelocityComputation(AbstractConservedQuantityComputation): ...@@ -151,14 +151,22 @@ class DensityVelocityComputation(AbstractConservedQuantityComputation):
eqColl = applyForceModelShift('macroscopicVelocityShift', dim, eqColl, self._forceModel, self._compressible) eqColl = applyForceModelShift('macroscopicVelocityShift', dim, eqColl, self._forceModel, self._compressible)
mainEquations = [] mainEquations = []
eqs = OrderedDict([(eq.lhs, eq.rhs) for eq in eqColl.allEquations])
if 'density' in outputQuantityNamesToSymbols: if 'density' in outputQuantityNamesToSymbols:
densityOutputSymbol = outputQuantityNamesToSymbols['density'] densityOutputSymbol = outputQuantityNamesToSymbols['density']
mainEquations.append(sp.Eq(densityOutputSymbol, self._symbolOrder0)) if densityOutputSymbol != self._symbolOrder0:
symbolsToExtract.add(densityOutputSymbol) mainEquations.append(sp.Eq(densityOutputSymbol, self._symbolOrder0))
else:
mainEquations.append(sp.Eq(self._symbolOrder0, eqs[self._symbolOrder0]))
del eqs[self._symbolOrder0]
if 'velocity' in outputQuantityNamesToSymbols: if 'velocity' in outputQuantityNamesToSymbols:
velOutputSymbols = outputQuantityNamesToSymbols['velocity'] velOutputSymbols = outputQuantityNamesToSymbols['velocity']
mainEquations += [sp.Eq(a, b) for a, b in zip(velOutputSymbols, self._symbolsOrder1)] if tuple(velOutputSymbols) != tuple(self._symbolsOrder1):
symbolsToExtract.update(velOutputSymbols) mainEquations += [sp.Eq(a, b) for a, b in zip(velOutputSymbols, self._symbolsOrder1)]
else:
# TODO
pass
eqColl = eqColl.copy(mainEquations, eqColl.allEquations) eqColl = eqColl.copy(mainEquations, eqColl.allEquations)
return eqColl.newWithoutUnusedSubexpressions() return eqColl.newWithoutUnusedSubexpressions()
...@@ -271,3 +279,14 @@ def applyForceModelShift(shiftMemberName, dim, equationCollection, forceModel, c ...@@ -271,3 +279,14 @@ def applyForceModelShift(shiftMemberName, dim, equationCollection, forceModel, c
if __name__ == '__main__':
from lbmpy.creationfunctions import createLatticeBoltzmannMethod
from lbmpy.simplificationfactory import createSimplificationStrategy
from lbmpy.stencils import getStencil
from lbmpy_old.lbmgenerator import createStreamCollideUpdateRule
from lbmpy_old.latticemodel import makeSRT
import sympy as sp
methodNew = createLatticeBoltzmannMethod(compressible=True)
newSimp = createSimplificationStrategy(methodNew)
cqc = methodNew.conservedQuantityComputation
cqc.outputEquationsFromPdfs(sp.symbols("f_:9"), {'density': sp.Symbol("rho_out")})
\ No newline at end of file
...@@ -18,6 +18,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio ...@@ -18,6 +18,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio
# Create kernel # Create kernel
lbmKernel = createLatticeBoltzmannFunction(**methodParameters, optimizationParams=optimizationParameters) lbmKernel = createLatticeBoltzmannFunction(**methodParameters, optimizationParams=optimizationParameters)
method = lbmKernel.method method = lbmKernel.method
assert D == method.dim, "Domain size and stencil do not match" assert D == method.dim, "Domain size and stencil do not match"
Q = len(method.stencil) Q = len(method.stencil)
...@@ -38,7 +39,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio ...@@ -38,7 +39,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio
densityArr = np.zeros(domainSizeWithGhostLayer) densityArr = np.zeros(domainSizeWithGhostLayer)
velocityArr = np.zeros(domainSizeWithGhostLayer + (D,)) velocityArr = np.zeros(domainSizeWithGhostLayer + (D,))
getMacroscopic = compileMacroscopicValuesGetter(method, ['density', 'velocity'], pdfArr=pdfSrc) getMacroscopic = compileMacroscopicValuesGetter(method, ['density', 'velocity'], pdfArr=pdfSrc)
setMacroscopic = compileMacroscopicValuesSetter(method, {'density': 1.0, 'velocity': [0]*D}, pdfArr=pdfSrc) setMacroscopic = compileMacroscopicValuesSetter(method, {'density': 1.0, 'velocity': [0] * D}, pdfArr=pdfSrc)
setMacroscopic(pdfs=pdfSrc) setMacroscopic(pdfs=pdfSrc)
# Run simulation # Run simulation
...@@ -50,6 +51,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio ...@@ -50,6 +51,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio
if boundaryHandling is not None: if boundaryHandling is not None:
boundaryHandling(pdfs=pdfSrc) boundaryHandling(pdfs=pdfSrc)
lbmKernel(src=pdfSrc, dst=pdfDst) lbmKernel(src=pdfSrc, dst=pdfDst)
pdfSrc, pdfDst = pdfDst, pdfSrc pdfSrc, pdfDst = pdfDst, pdfSrc
getMacroscopic(pdfs=pdfSrc, density=densityArr, velocity=velocityArr) getMacroscopic(pdfs=pdfSrc, density=densityArr, velocity=velocityArr)
return pdfSrc, densityArr, velocityArr return pdfSrc, densityArr, velocityArr
...@@ -64,6 +66,7 @@ def runLidDrivenCavity(domainSize, lidVelocity=0.005, optimizationParameters={}, ...@@ -64,6 +66,7 @@ def runLidDrivenCavity(domainSize, lidVelocity=0.005, optimizationParameters={},
boundaryHandling.setBoundary(myUbb, sliceFromDirection('N', method.dim)) boundaryHandling.setBoundary(myUbb, sliceFromDirection('N', method.dim))
for direction in ('W', 'E', 'S') if method.dim == 2 else ('W', 'E', 'S', 'T', 'B'): for direction in ('W', 'E', 'S') if method.dim == 2 else ('W', 'E', 'S', 'T', 'B'):
boundaryHandling.setBoundary(noSlip, sliceFromDirection(direction, method.dim)) boundaryHandling.setBoundary(noSlip, sliceFromDirection(direction, method.dim))
return runScenario(domainSize, boundarySetupFunction, kwargs, optimizationParameters) return runScenario(domainSize, boundarySetupFunction, kwargs, optimizationParameters)
...@@ -74,11 +77,11 @@ def runForceDrivenChannel(dim, force, domainSize=None, radius=None, length=None, ...@@ -74,11 +77,11 @@ def runForceDrivenChannel(dim, force, domainSize=None, radius=None, length=None,
if radius is not None: if radius is not None:
assert length is not None assert length is not None
if dim == 3: if dim == 3:
domainSize = (length, 2*radius+1, 2*radius+1) domainSize = (length, 2 * radius + 1, 2 * radius + 1)
roundChannel = True roundChannel = True
else: else:
if domainSize is None: if domainSize is None:
domainSize = (length, 2*radius) domainSize = (length, 2 * radius)
else: else:
roundChannel = False roundChannel = False
...@@ -108,5 +111,3 @@ def runForceDrivenChannel(dim, force, domainSize=None, radius=None, length=None, ...@@ -108,5 +111,3 @@ def runForceDrivenChannel(dim, force, domainSize=None, radius=None, length=None,
return runScenario(domainSize, boundarySetupFunction, kwargs, optimizationParameters, return runScenario(domainSize, boundarySetupFunction, kwargs, optimizationParameters,
preUpdateFunctions=[periodicity]) preUpdateFunctions=[periodicity])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment