From 8bd55fe316b6c69d54830cd593d1bcd7378fffdf Mon Sep 17 00:00:00 2001 From: Martin Bauer <martin.bauer@fau.de> Date: Mon, 30 Jan 2017 09:53:24 +0100 Subject: [PATCH] fixed compressible bug --- boundaries/boundaryconditions.py | 5 ++++ creationfunctions.py | 8 ++++++- methods/conservedquantitycomputation.py | 31 ++++++++++++++++++++----- serialscenario.py | 11 +++++---- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/boundaries/boundaryconditions.py b/boundaries/boundaryconditions.py index 35b3709e..9650abdc 100644 --- a/boundaries/boundaryconditions.py +++ b/boundaries/boundaryconditions.py @@ -20,6 +20,11 @@ def ubb(pdfField, direction, lbMethod, velocity): neighbor = offsetFromDir(direction, lbMethod.dim) 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) return [sp.Eq(pdfField[neighbor](inverseDir), pdfField(direction) - velTerm)] diff --git a/creationfunctions.py b/creationfunctions.py index 1409f05b..89e59848 100644 --- a/creationfunctions.py +++ b/creationfunctions.py @@ -26,7 +26,7 @@ def _getParams(params, optParams): defaultOptimizationDescription = { 'doCseInOpposingDirections': False, 'doOverallCse': False, - 'split': True, + 'split': False, 'fieldSize': None, 'fieldLayout': 'reverseNumpy', # can be 'numpy' (='c'), 'reverseNumpy' (='f'), 'fzyx', 'zyxf' @@ -80,6 +80,7 @@ def createLatticeBoltzmannAst(updateRule=None, optimizationParams={}, **kwargs): if params['target'] == 'cpu': from pystencils.cpu import createKernel if 'splitGroups' in updateRule.simplificationHints: + print("splitting!") splitGroups = updateRule.simplificationHints['splitGroups'] else: splitGroups = () @@ -91,6 +92,11 @@ def createLatticeBoltzmannAst(updateRule=None, optimizationParams={}, **kwargs): return ValueError("'target' has to be either 'cpu' or 'gpu'") 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 diff --git a/methods/conservedquantitycomputation.py b/methods/conservedquantitycomputation.py index 5e07c2aa..2cd989ba 100644 --- a/methods/conservedquantitycomputation.py +++ b/methods/conservedquantitycomputation.py @@ -1,4 +1,6 @@ import abc +from collections import OrderedDict + import sympy as sp from pystencils.equationcollection import EquationCollection @@ -139,8 +141,6 @@ class DensityVelocityComputation(AbstractConservedQuantityComputation): def outputEquationsFromPdfs(self, pdfs, outputQuantityNamesToSymbols): dim = len(self._stencil[0]) - symbolsToExtract = set() - eqColl = getEquationsForZerothAndFirstOrderMoment(self._stencil, pdfs, self._symbolOrder0, self._symbolsOrder1) if self._compressible: @@ -151,14 +151,22 @@ class DensityVelocityComputation(AbstractConservedQuantityComputation): eqColl = applyForceModelShift('macroscopicVelocityShift', dim, eqColl, self._forceModel, self._compressible) mainEquations = [] + eqs = OrderedDict([(eq.lhs, eq.rhs) for eq in eqColl.allEquations]) + if 'density' in outputQuantityNamesToSymbols: densityOutputSymbol = outputQuantityNamesToSymbols['density'] - mainEquations.append(sp.Eq(densityOutputSymbol, self._symbolOrder0)) - symbolsToExtract.add(densityOutputSymbol) + if densityOutputSymbol != self._symbolOrder0: + 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: velOutputSymbols = outputQuantityNamesToSymbols['velocity'] - mainEquations += [sp.Eq(a, b) for a, b in zip(velOutputSymbols, self._symbolsOrder1)] - symbolsToExtract.update(velOutputSymbols) + if tuple(velOutputSymbols) != tuple(self._symbolsOrder1): + mainEquations += [sp.Eq(a, b) for a, b in zip(velOutputSymbols, self._symbolsOrder1)] + else: + # TODO + pass eqColl = eqColl.copy(mainEquations, eqColl.allEquations) return eqColl.newWithoutUnusedSubexpressions() @@ -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 diff --git a/serialscenario.py b/serialscenario.py index 1bb25fc8..96fd5fac 100644 --- a/serialscenario.py +++ b/serialscenario.py @@ -18,6 +18,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio # Create kernel lbmKernel = createLatticeBoltzmannFunction(**methodParameters, optimizationParams=optimizationParameters) method = lbmKernel.method + assert D == method.dim, "Domain size and stencil do not match" Q = len(method.stencil) @@ -38,7 +39,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio densityArr = np.zeros(domainSizeWithGhostLayer) velocityArr = np.zeros(domainSizeWithGhostLayer + (D,)) 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) # Run simulation @@ -50,6 +51,7 @@ def runScenario(domainSize, boundarySetupFunction, methodParameters, optimizatio if boundaryHandling is not None: boundaryHandling(pdfs=pdfSrc) lbmKernel(src=pdfSrc, dst=pdfDst) + pdfSrc, pdfDst = pdfDst, pdfSrc getMacroscopic(pdfs=pdfSrc, density=densityArr, velocity=velocityArr) return pdfSrc, densityArr, velocityArr @@ -64,6 +66,7 @@ def runLidDrivenCavity(domainSize, lidVelocity=0.005, optimizationParameters={}, boundaryHandling.setBoundary(myUbb, sliceFromDirection('N', method.dim)) for direction in ('W', 'E', 'S') if method.dim == 2 else ('W', 'E', 'S', 'T', 'B'): boundaryHandling.setBoundary(noSlip, sliceFromDirection(direction, method.dim)) + return runScenario(domainSize, boundarySetupFunction, kwargs, optimizationParameters) @@ -74,11 +77,11 @@ def runForceDrivenChannel(dim, force, domainSize=None, radius=None, length=None, if radius is not None: assert length is not None if dim == 3: - domainSize = (length, 2*radius+1, 2*radius+1) + domainSize = (length, 2 * radius + 1, 2 * radius + 1) roundChannel = True else: if domainSize is None: - domainSize = (length, 2*radius) + domainSize = (length, 2 * radius) else: roundChannel = False @@ -108,5 +111,3 @@ def runForceDrivenChannel(dim, force, domainSize=None, radius=None, length=None, return runScenario(domainSize, boundarySetupFunction, kwargs, optimizationParameters, preUpdateFunctions=[periodicity]) - - -- GitLab