# Turbulence modeling example
# (k-epsilon model)
from manta import *
# unused: scale = 0.2
# solver params
res = 64
gs = vec3(res,res/2,res/2)
s = Solver(name='main', gridSize = gs)
s.timestep = 0.5
timings = Timings()
velInflow = vec3(0.52,0,0)
# prepare grids
flags = s.create(FlagGrid)
pressure = s.create(RealGrid, show=False)
vel = s.create(MACGrid)
k = s.create(RealGrid)
eps = s.create(RealGrid)
prod = s.create(RealGrid)
nuT= s.create(RealGrid)
strain= s.create(RealGrid)
vc=s.create(MACGrid)
temp=s.create(RealGrid)
# noise field
noise = s.create(NoiseField)
noise.timeAnim = 0
# turbulence particles
turb = s.create(TurbulenceParticleSystem, noise=noise)
flags.initDomain()
flags.fillGrid()
# obstacle grid
for i in range(4):
for j in range(4):
obs = Sphere( parent=s , center=gs*vec3(0.2,(i+1)/5.0,(j+1)/5.0), radius=res*0.025)
obs.applyToGrid(grid=flags,value=FlagObstacle)
sdfgrad = obstacleGradient(flags)
sdf = obstacleLevelset(flags)
bgr = s.create(Mesh)
sdf.createMesh(bgr)
# particle inflow
box = Box( parent=s, center = gs*vec3(0.05,0.43,0.6), size=gs*vec3(0.02,0.005,0.07))
# turbulence parameters
L0 = 0.01
mult = 0.1
intensity = 0.1
nu = 0.1
prodMult = 2.5
enableDiffuse = True
if (GUI):
gui = Gui()
gui.setBackgroundMesh(bgr)
gui.show()
# unused: sliderL0 = gui.addControl(Slider, text='turbulent lengthscale', val=L0, min=0.001, max=0.5)
sliderMult = gui.addControl(Slider, text='turbulent mult', val=mult, min=0, max=1)
sliderProd = gui.addControl(Slider, text='production mult', val=prodMult, min=0.1, max=5)
checkDiff = gui.addControl(Checkbox, text='enable RANS', val=enableDiffuse)
KEpsilonBcs(flags=flags,k=k,eps=eps,intensity=intensity,nu=nu,fillArea=True)
#main loop
for t in range(10000):
mantaMsg('\nFrame %i, simulation time %f' % (s.frame, s.timeTotal))
if (GUI):
mult = sliderMult.get()
# unused: K0 = sliderL0.get()
enableDiffuse = checkDiff.get()
prodMult = sliderProd.get()
turb.seed(box,500)
turb.advectInGrid(flags=flags, vel=vel, integrationMode=IntRK4)
turb.synthesize(flags=flags, octaves=1, k=k, switchLength=5, L0=L0, scale=mult, inflowBias=velInflow)
#turb.projectOutside(sdfgrad)
turb.deleteInObstacle(flags)
KEpsilonBcs(flags=flags,k=k,eps=eps,intensity=intensity,nu=nu,fillArea=False)
advectSemiLagrange(flags=flags, vel=vel, grid=k, order=1)
advectSemiLagrange(flags=flags, vel=vel, grid=eps, order=1)
KEpsilonBcs(flags=flags,k=k,eps=eps,intensity=intensity,nu=nu,fillArea=False)
KEpsilonComputeProduction(vel=vel, k=k, eps=eps, prod=prod, nuT=nuT, strain=strain, pscale=prodMult)
KEpsilonSources(k=k, eps=eps, prod=prod)
if enableDiffuse:
KEpsilonGradientDiffusion(k=k, eps=eps, vel=vel, nuT=nuT, sigmaU=10.0);
# base solver
advectSemiLagrange(flags=flags, vel=vel, grid=vel, order=2)
setWallBcs(flags=flags, vel=vel)
setInflowBcs(vel=vel,dir='xXyYzZ',value=velInflow)
solvePressure(flags=flags, vel=vel, pressure=pressure, cgMaxIterFac=0.5)
setWallBcs(flags=flags, vel=vel)
setInflowBcs(vel=vel,dir='xXyYzZ',value=velInflow)
timings.display()
s.step()