From 741acefabf7e244d0839b8b43719e5359f9ddf64 Mon Sep 17 00:00:00 2001 From: OsKnoth <50015520+OsKnoth@users.noreply.github.com> Date: Wed, 3 Jan 2024 08:54:50 +0100 Subject: [PATCH] Hyperdiffusion W --- GlobInd | Bin 115200 -> 172800 bytes Jobs/NHSphere/JobNHHeldSuarezMoistSphere | 10 +-- Project.toml | 1 + src/FiniteElements/FiniteElements.jl | 15 ++++ src/GPU/FcnGPU.jl | 21 ++++- src/GPU/OperatorKernel.jl | 106 +++++++++++++++++++++++ 6 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 src/FiniteElements/FiniteElements.jl diff --git a/GlobInd b/GlobInd index 8591054e7b15790539903f6686658a3493814e62..db6df9fd0a78a32a29611f7f46769867fc2963cf 100644 GIT binary patch literal 172800 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 Yv9;IbP7nK@*hZc^dB4c}LZ1Ks0xZZidH?_b diff --git a/Jobs/NHSphere/JobNHHeldSuarezMoistSphere b/Jobs/NHSphere/JobNHHeldSuarezMoistSphere index aef14ef..f0ef6e1 100755 --- a/Jobs/NHSphere/JobNHHeldSuarezMoistSphere +++ b/Jobs/NHSphere/JobNHHeldSuarezMoistSphere @@ -1,4 +1,4 @@ -mpirun -n 6 julia --project Examples/testNHSphere.jl \ +mpirun -n 4 julia --project Examples/testNHSphere.jl \ --Problem="HeldSuarezMoistSphere" \ --Device="CPU" \ --GPUType="Metal" \ @@ -14,13 +14,13 @@ mpirun -n 6 julia --project Examples/testNHSphere.jl \ --Forcing=true \ --Curl=false \ --ModelType="VectorInvariant" \ - --VerticalDiffusion=true \ - --SurfaceFlux=true \ + --VerticalDiffusion=false \ + --SurfaceFlux=false \ --Coriolis=true \ --Upwind=true \ - --HorLimit=true \ + --HorLimit=false \ --Equation=CompressibleMoist \ - --Microphysics=true \ + --Microphysics=false \ --TypeMicrophysics="SimpleMicrophysics" \ --Buoyancy=true \ --Damping=true \ diff --git a/Project.toml b/Project.toml index 29d0ada..d20129a 100644 --- a/Project.toml +++ b/Project.toml @@ -23,6 +23,7 @@ NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" NearestNeighbors = "b8a86587-4115-5ab1-83bc-aa920d37bbce" NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9" PairedLinkedLists = "7a42b37b-ed3b-477a-9848-3661f53bb718" +Polynomials = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" ProfileCanvas = "efd6af41-a80b-495e-886c-e51b0c7d77a3" Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" diff --git a/src/FiniteElements/FiniteElements.jl b/src/FiniteElements/FiniteElements.jl new file mode 100644 index 0000000..1f3f637 --- /dev/null +++ b/src/FiniteElements/FiniteElements.jl @@ -0,0 +1,15 @@ +module FiniteElements + +using Polynomials + +abstract type FiniteElement end + +struct NodalElement <: FiniteElement + NumBases::Int + NodalBases::Array{Polynomial,1} + NodalPoints::Array{Float64,2} + Diff1Matrix::Array{Float64,2} +end + + +end diff --git a/src/GPU/FcnGPU.jl b/src/GPU/FcnGPU.jl index 8516129..0c852b3 100644 --- a/src/GPU/FcnGPU.jl +++ b/src/GPU/FcnGPU.jl @@ -104,13 +104,13 @@ end function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) - @show sum(abs.(U)) backend = get_backend(F) FT = eltype(F) Glob = FE.Glob DS = FE.DS DW = FE.DW M = FE.M + MW = FE.MW dXdxI = Metric.dXdxI X = Metric.X J = Metric.J @@ -128,7 +128,6 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) lat = Metric.lat dz = Metric.dz zP = Metric.zP - @show size(zP) DoF = FE.DoF N = size(FE.DS,1) Nz = size(F,1) @@ -157,7 +156,8 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) @views FRhoTr = F[:,:,5] # Cache @views CacheF = Temp1[:,:,1:6] - @views CacheFF = Temp1[:,:,1:6+NumTr] + @views CacheFF = Temp1[:,:,1:6+NumTr+1] + @views Cachew = Temp1[:,:,6 + 1 + NumTr] @views p = Cache.AuxG[:,:,1] KV = Cache.KV TSurf = Cache.TSurf @@ -182,6 +182,10 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) NDoFG = min(div(NumberThreadGPU,Nz),NDoF) groupG = (Nz, NDoFG) ndrangeG = (Nz, NDoF) + NzG = min(div(NumberThreadGPU,N*N),Nz-1) + groupw = (N, N, NzG, 1) + ndrangewB = (Nz-1, NBF) + ndrangewI = (Nz-1, NF-NBF) KRhoGradKinKernel! = RhoGradKinKernel!(backend,group) KGradKernel! = GradKernel!(backend,group) @@ -195,6 +199,8 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) end KHyperViscTracerKernel! = HyperViscTracerKernel!(backend, groupTr) KHyperViscTracerKoeffKernel! = HyperViscTracerKoeffKernel!(backend, groupTr) + KHyperViscWKernel! = HyperViscWKernel!(backend, groupTr) + KHyperViscWKoeffKernel! = HyperViscWKoeffKernel!(backend, groupTr) KDivRhoTrUpwind3Kernel! = DivRhoTrUpwind3Kernel!(backend, groupTr) if Global.Model.SurfaceFlux NFG = min(div(NumberThreadGPU,N*N),NF) @@ -218,6 +224,8 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) @views KHyperViscTracerKernel!(CacheTr,U[:,:,iT+NumV],Rho,DS,DW,dXdxI,J,M,Glob,ndrange=ndrangeB) KernelAbstractions.synchronize(backend) end + @views KHyperViscWKernel!(Cachew,U[:,:,4],DS,DW,dXdxI,J,MW,Glob,ndrange=ndrangeB) + KernelAbstractions.synchronize(backend) Parallels.ExchangeData3DSendGPU(CacheFF,Exchange) KHyperViscKernel!(CacheF,MRho,U,DS,DW,dXdxI_I,J_I,M,Glob_I,ndrange=ndrangeI) @@ -227,6 +235,8 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) @views KHyperViscTracerKernel!(CacheTr,U[:,:,iT+NumV],Rho,DS,DW,dXdxI_I,J_I,M,Glob_I,ndrange=ndrangeI) KernelAbstractions.synchronize(backend) end + @views KHyperViscWKernel!(Cachew,U[:,:,4],DS,DW,dXdxI_I,J_I,MW,Glob_I,ndrange=ndrangeB) + KernelAbstractions.synchronize(backend) Parallels.ExchangeData3DRecvGPU!(CacheFF,Exchange) KernelAbstractions.synchronize(backend) @@ -244,6 +254,8 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) KoeffDiv,ndrange=ndrangeB) KernelAbstractions.synchronize(backend) end + @views KHyperViscWKoeffKernel!(F[:,:,4],Cachew,DS,DW,dXdxI,J,MW,Glob,KoeffDiv,ndrange=ndrangeB) + KernelAbstractions.synchronize(backend) KGradKernel!(F,U,p,DS,dXdxI,J,M,MRho,Glob,Phys,ndrange=ndrangeB) KernelAbstractions.synchronize(backend) if Global.Model.Coriolis @@ -286,6 +298,8 @@ function FcnGPU!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) KoeffDiv,ndrange=ndrangeI) KernelAbstractions.synchronize(backend) end + @views KHyperViscWKoeffKernel!(F[:,:,4],Cachew,DS,DW,dXdxI_I,J_I,MW,Glob,KoeffDiv,ndrange=ndrangeI) + KernelAbstractions.synchronize(backend) KGradKernel!(F,U,p,DS,dXdxI_I,J_I,M,MRho,Glob_I,Phys,ndrange=ndrangeI) KernelAbstractions.synchronize(backend) if Global.Model.Coriolis @@ -351,6 +365,7 @@ function FcnGPUAMD!(F,U,FE,Metric,Phys,Cache,Exchange,Global,Param,DiscType) DS = FE.DS DW = FE.DW M = FE.M + MW = FE.MW dXdxI = Metric.dXdxI X = Metric.X J = Metric.J diff --git a/src/GPU/OperatorKernel.jl b/src/GPU/OperatorKernel.jl index e7b213d..2b992ca 100644 --- a/src/GPU/OperatorKernel.jl +++ b/src/GPU/OperatorKernel.jl @@ -557,6 +557,59 @@ end end end +@kernel function HyperViscWKernel!(Fw,@Const(w),@Const(D),@Const(DW),@Const(dXdxI), + @Const(JJ),@Const(MW),@Const(Glob)) + + I, J, iz = @index(Local, NTuple) + _,_,Iz,IF = @index(Global, NTuple) + + ColumnTilesDim = @uniform @groupsize()[3] + N = @uniform @groupsize()[1] + Nz = @uniform @ndrange()[3] + NF = @uniform @ndrange()[4] + + ID = I + (J - 1) * N + @inbounds ind = Glob[ID,IF] + + wCol = @localmem eltype(Fw) (N,N, ColumnTilesDim) + wCxCol = @localmem eltype(Fw) (N,N, ColumnTilesDim) + wCyCol = @localmem eltype(Fw) (N,N, ColumnTilesDim) + if Iz <= Nz && IF <= NF + @inbounds wCol[I,J,iz] = w[Iz,ind] + end + @synchronize + + ID = I + (J - 1) * N + @inbounds ind = Glob[ID,IF] + + if Iz <= Nz && IF <= NF + @inbounds Dxc = D[I,1] * wCol[1,J,iz] + @inbounds Dyc = D[J,1] * wCol[I,1,iz] + for k = 2 : N + @inbounds Dxc += D[I,k] * wCol[k,J,iz] + @inbounds Dyc += D[J,k] * wCol[I,k,iz] + end + @views @inbounds (GradDx, GradDy) = Grad12(Dxc,Dyc,dXdxI[1:2,1:2,:,ID,Iz,IF],JJ[ID,:,Iz,IF]) + @views @inbounds (tempx, tempy) = Contra12(GradDx,GradDy,dXdxI[1:2,1:2,:,ID,Iz,IF]) + @inbounds wCxCol[I,J,iz] = tempx + @inbounds wCyCol[I,J,iz] = tempy + end + + @synchronize + + ID = I + (J - 1) * N + @inbounds ind = Glob[ID,IF] + if Iz <= Nz && IF <= NF + @inbounds Divw = DW[I,1] * wCxCol[1,J,iz] + DW[J,1] * wCyCol[I,1,iz] + for k = 2 : N + @inbounds Divw += DW[I,k] * wCxCol[k,J,iz] + DW[J,k] * wCyCol[I,k,iz] + end + if Iz < Nz + @inbounds @atomic Fw[Iz+1,ind] += Divw / MW[Iz,ind] + end + end +end + @kernel function HyperViscKoeffKernel!(F,@Const(U),@Const(Cache),@Const(D),@Const(DW),@Const(dXdxI), @Const(JJ),@Const(M),@Const(Glob),KoeffCurl,KoeffGrad,KoeffDiv) @@ -692,6 +745,59 @@ end end end +@kernel function HyperViscWKoeffKernel!(Fw,@Const(w),@Const(D),@Const(DW),@Const(dXdxI), + @Const(JJ),@Const(MW),@Const(Glob),KoeffDivW) + + I, J, iz = @index(Local, NTuple) + _,_,Iz,IF = @index(Global, NTuple) + + ColumnTilesDim = @uniform @groupsize()[3] + N = @uniform @groupsize()[1] + Nz = @uniform @ndrange()[3] + NF = @uniform @ndrange()[4] + + ID = I + (J - 1) * N + @inbounds ind = Glob[ID,IF] + + wCol = @localmem eltype(Fw) (N,N, ColumnTilesDim) + wCxCol = @localmem eltype(Fw) (N,N, ColumnTilesDim) + wCyCol = @localmem eltype(Fw) (N,N, ColumnTilesDim) + if Iz <= Nz && IF <= NF + @inbounds wCol[I,J,iz] = w[Iz,ind] + end + @synchronize + + ID = I + (J - 1) * N + @inbounds ind = Glob[ID,IF] + + if Iz <= Nz && IF <= NF + @inbounds Dxc = D[I,1] * wCol[1,J,iz] + @inbounds Dyc = D[J,1] * wCol[I,1,iz] + for k = 2 : N + @inbounds Dxc += D[I,k] * wCol[k,J,iz] + @inbounds Dyc += D[J,k] * wCol[I,k,iz] + end + @views @inbounds (GradDx, GradDy) = Grad12(Dxc,Dyc,dXdxI[1:2,1:2,:,ID,Iz,IF],JJ[ID,:,Iz,IF]) + @views @inbounds (tempx, tempy) = Contra12(GradDx,GradDy,dXdxI[1:2,1:2,:,ID,Iz,IF]) + @inbounds wCxCol[I,J,iz] = tempx + @inbounds wCyCol[I,J,iz] = tempy + end + + @synchronize + + ID = I + (J - 1) * N + @inbounds ind = Glob[ID,IF] + if Iz <= Nz && IF <= NF + @inbounds Divw = DW[I,1] * wCxCol[1,J,iz] + DW[J,1] * wCyCol[I,1,iz] + for k = 2 : N + @inbounds Divw += DW[I,k] * wCxCol[k,J,iz] + DW[J,k] * wCyCol[I,k,iz] + end + if Iz < Nz + @inbounds @atomic Fw[Iz,ind] += -KoeffDivW * Divw / MW[Iz,ind] + end + end +end + @kernel function DivRhoTrCentralKernel!(F,@Const(c),@Const(uC),@Const(vC),@Const(w), @Const(D),@Const(dXdxI), @Const(JJ),@Const(M),@Const(Glob))