11@inline ∂ (a,I:: CartesianIndex{d} ,f:: AbstractArray{T,d} ) where {T,d} = @inbounds f[I]- f[I- δ (a,I)]
22@inline ∂ (a,I:: CartesianIndex{m} ,u:: AbstractArray{T,n} ) where {T,n,m} = @inbounds u[I+ δ (a,I),a]- u[I,a]
3- @inline ϕ (a,I,f) = @inbounds (f[I]+ f[I- δ (a,I)])* 0.5
3+ @inline ϕ (a,I,f) = @inbounds (f[I]+ f[I- δ (a,I)])/ 2
44@fastmath quick (u,c,d) = median ((5 c+ 2 d- u)/ 6 ,c,median (10 c- 9 u,c,d))
55@fastmath vanLeer (u,c,d) = (c≤ min (u,d) || c≥ max (u,d)) ? c : c+ (d- c)* (c- u)/ (d- u)
6+ @fastmath cds (u,c,d) = (c+ d)/ 2
67@inline ϕu (a,I,f,u,λ= quick) = @inbounds u> 0 ? u* λ (f[I- 2 δ (a,I)],f[I- δ (a,I)],f[I]) : u* λ (f[I+ δ (a,I)],f[I],f[I- δ (a,I)])
78@inline ϕuP (a,Ip,I,f,u,λ= quick) = @inbounds u> 0 ? u* λ (f[Ip],f[I- δ (a,I)],f[I]) : u* λ (f[I+ δ (a,I)],f[I],f[I- δ (a,I)])
89@inline ϕuL (a,I,f,u,λ= quick) = @inbounds u> 0 ? u* ϕ (a,I,f) : u* λ (f[I+ δ (a,I)],f[I],f[I- δ (a,I)])
@@ -33,31 +34,31 @@ function median(a,b,c)
3334 return a
3435end
3536
36- function conv_diff! (r,u,Φ;ν= 0.1 ,perdir= ())
37+ function conv_diff! (r,u,Φ;ν= 0.1 ,λ = quick, perdir= ())
3738 r .= 0.
3839 N,n = size_u (u)
3940 for i ∈ 1 : n, j ∈ 1 : n
4041 # if it is periodic direction
4142 tagper = (j in perdir)
4243 # treatment for bottom boundary with BCs
43- lowerBoundary! (r,u,Φ,ν,i,j,N,Val {tagper} ())
44+ lowerBoundary! (r,u,Φ,ν,i,j,N,λ, Val {tagper} ())
4445 # inner cells
45- @loop (Φ[I] = ϕu (j,CI (I,i),u,ϕ (i,CI (I,j),u)) - ν* ∂ (j,CI (I,i),u);
46+ @loop (Φ[I] = ϕu (j,CI (I,i),u,ϕ (i,CI (I,j),u),λ ) - ν* ∂ (j,CI (I,i),u);
4647 r[I,i] += Φ[I]) over I ∈ inside_u (N,j)
4748 @loop r[I- δ (j,I),i] -= Φ[I] over I ∈ inside_u (N,j)
4849 # treatment for upper boundary with BCs
49- upperBoundary! (r,u,Φ,ν,i,j,N,Val {tagper} ())
50+ upperBoundary! (r,u,Φ,ν,i,j,N,λ, Val {tagper} ())
5051 end
5152end
5253
5354# Neumann BC Building block
54- lowerBoundary! (r,u,Φ,ν,i,j,N,:: Val{false} ) = @loop r[I,i] += ϕuL (j,CI (I,i),u,ϕ (i,CI (I,j),u)) - ν* ∂ (j,CI (I,i),u) over I ∈ slice (N,2 ,j,2 )
55- upperBoundary! (r,u,Φ,ν,i,j,N,:: Val{false} ) = @loop r[I- δ (j,I),i] += - ϕuR (j,CI (I,i),u,ϕ (i,CI (I,j),u)) + ν* ∂ (j,CI (I,i),u) over I ∈ slice (N,N[j],j,2 )
55+ lowerBoundary! (r,u,Φ,ν,i,j,N,λ, :: Val{false} ) = @loop r[I,i] += ϕuL (j,CI (I,i),u,ϕ (i,CI (I,j),u),λ ) - ν* ∂ (j,CI (I,i),u) over I ∈ slice (N,2 ,j,2 )
56+ upperBoundary! (r,u,Φ,ν,i,j,N,λ, :: Val{false} ) = @loop r[I- δ (j,I),i] += - ϕuR (j,CI (I,i),u,ϕ (i,CI (I,j),u),λ ) + ν* ∂ (j,CI (I,i),u) over I ∈ slice (N,N[j],j,2 )
5657
5758# Periodic BC Building block
58- lowerBoundary! (r,u,Φ,ν,i,j,N,:: Val{true} ) = @loop (
59- Φ[I] = ϕuP (j,CIj (j,CI (I,i),N[j]- 2 ),CI (I,i),u,ϕ (i,CI (I,j),u)) - ν* ∂ (j,CI (I,i),u); r[I,i] += Φ[I]) over I ∈ slice (N,2 ,j,2 )
60- upperBoundary! (r,u,Φ,ν,i,j,N,:: Val{true} ) = @loop r[I- δ (j,I),i] -= Φ[CIj (j,I,2 )] over I ∈ slice (N,N[j],j,2 )
59+ lowerBoundary! (r,u,Φ,ν,i,j,N,λ, :: Val{true} ) = @loop (
60+ Φ[I] = ϕuP (j,CIj (j,CI (I,i),N[j]- 2 ),CI (I,i),u,ϕ (i,CI (I,j),u),λ ) - ν* ∂ (j,CI (I,i),u); r[I,i] += Φ[I]) over I ∈ slice (N,2 ,j,2 )
61+ upperBoundary! (r,u,Φ,ν,i,j,N,λ, :: Val{true} ) = @loop r[I- δ (j,I),i] -= Φ[CIj (j,I,2 )] over I ∈ slice (N,N[j],j,2 )
6162
6263"""
6364 accelerate!(r,t,g,U)
@@ -94,11 +95,12 @@ struct Flow{D, T, Sf<:AbstractArray{T}, Vf<:AbstractArray{T}, Tf<:AbstractArray{
9495 U :: Union{NTuple{D,Number},Function} # domain boundary values
9596 Δt:: Vector{T} # time step (stored in CPU memory)
9697 ν :: T # kinematic viscosity
98+ λ :: Function # kinematic viscosity
9799 g :: Union{Function,Nothing} # (possibly time-varying) uniform acceleration field
98100 exitBC :: Bool # Convection exit
99101 perdir :: NTuple # tuple of periodic direction
100102 function Flow (N:: NTuple{D} , U; f= Array, Δt= 0.25 , ν= 0. , g= nothing ,
101- uλ:: Function = (i, x) -> 0. , perdir= (), exitBC= false , T= Float32) where D
103+ uλ:: Function = (i, x) -> 0. , λ = quick, perdir= (), exitBC= false , T= Float32) where D
102104 Ng = N .+ 2
103105 Nd = (Ng... , D)
104106 u = Array {T} (undef, Nd... ) |> f; apply! (uλ, u);
@@ -107,7 +109,7 @@ struct Flow{D, T, Sf<:AbstractArray{T}, Vf<:AbstractArray{T}, Tf<:AbstractArray{
107109 fv, p, σ = zeros (T, Nd) |> f, zeros (T, Ng) |> f, zeros (T, Ng) |> f
108110 V, μ₀, μ₁ = zeros (T, Nd) |> f, ones (T, Nd) |> f, zeros (T, Ng... , D, D) |> f
109111 BC! (μ₀,ntuple (zero, D),false ,perdir)
110- new {D,T,typeof(p),typeof(u),typeof(μ₁)} (u,u⁰,fv,p,σ,V,μ₀,μ₁,U,T[Δt],ν,g,exitBC,perdir)
112+ new {D,T,typeof(p),typeof(u),typeof(μ₁)} (u,u⁰,fv,p,σ,V,μ₀,μ₁,U,T[Δt],ν,λ, g,exitBC,perdir)
111113 end
112114end
113115
@@ -144,15 +146,15 @@ and the `AbstractPoisson` pressure solver to project the velocity onto an incomp
144146 a. u⁰ .= a. u; scale_u! (a,0 ); t₁ = sum (a. Δt); t₀ = t₁- a. Δt[end ]
145147 # predictor u → u'
146148 @log " p"
147- conv_diff! (a. f,a. u⁰,a. σ,ν= a. ν,perdir= a. perdir)
149+ conv_diff! (a. f,a. u⁰,a. σ,ν= a. ν,λ = a . λ, perdir= a. perdir)
148150 udf! (a,udf,t₀; kwargs... )
149151 accelerate! (a. f,t₀,a. g,a. U)
150152 BDIM! (a); BC! (a. u,a. U,a. exitBC,a. perdir,t₁) # BC MUST be at t₁
151153 a. exitBC && exitBC! (a. u,a. u⁰,a. Δt[end ]) # convective exit
152154 project! (a,b); BC! (a. u,a. U,a. exitBC,a. perdir,t₁)
153155 # corrector u → u¹
154156 @log " c"
155- conv_diff! (a. f,a. u,a. σ,ν= a. ν,perdir= a. perdir)
157+ conv_diff! (a. f,a. u,a. σ,ν= a. ν,λ = a . λ, perdir= a. perdir)
156158 udf! (a,udf,t₁; kwargs... )
157159 accelerate! (a. f,t₁,a. g,a. U)
158160 BDIM! (a); scale_u! (a,0.5 ); BC! (a. u,a. U,a. exitBC,a. perdir,t₁)
0 commit comments