diff --git a/src/DyCore/InitDriver.jl b/src/DyCore/InitDriver.jl index 6523eb0..3fbb807 100644 --- a/src/DyCore/InitDriver.jl +++ b/src/DyCore/InitDriver.jl @@ -8,7 +8,7 @@ function InitSphere(backend,FT,OrdPoly,OrdPolyZ,nz,nPanel,H,GridType,Topography, ParallelCom.ProcNumber = ProcNumber TimeStepper = TimeStepperStruct{FT}(backend) - Grid = Grids.GridStruct{FT}(backend,nz,Topography) +# Grid = Grids.GridStruct{FT}(backend,nz,Topography) if GridType == "HealPix" # Grid=CGDycore.InputGridH("Grid/mesh_H12_no_pp.nc", @@ -19,7 +19,7 @@ function InitSphere(backend,FT,OrdPoly,OrdPolyZ,nz,nPanel,H,GridType,Topography, elseif GridType == "Msh" Grid = Grids.InputGridMsh("Grid/Quad.msh",OrientFaceSphere,RadEarth,Grid) elseif GridType == "CubedSphere" - Grid = Grids.CubedGrid(nPanel,Grids.OrientFaceSphere,RadEarth,Grid) + Grid = Grids.CubedGrid(backend,FT,nPanel,Grids.OrientFaceSphere,RadEarth,nz,Topography) elseif GridType == "TriangularSphere" IcosahedronGrid = Grids.CreateIcosahedronGrid() RefineLevel = 0 diff --git a/src/Grids/CubedGrid.jl b/src/Grids/CubedGrid.jl index 7ef4c97..d774872 100644 --- a/src/Grids/CubedGrid.jl +++ b/src/Grids/CubedGrid.jl @@ -1,11 +1,12 @@ -function CubedGrid(n,OrientFace,Rad,Grid) - Grid.nBar=[ 0 1 0 1 - -1 0 -1 0]; - Grid.Dim=3; - Grid.Type="Quad"; - Grid.Rad=Rad; - Grid.Form="Sphere"; +function CubedGrid(backend,FT,n,OrientFace,Rad,nz,Topography) + nBar=[ 0 1 0 1 + -1 0 -1 0]; + Dim=3; + Type="Quad"; + Rad=Rad; + Form="Sphere"; dd=2.0e0/n; + NumNodes=(6*(n-1)*(n-1)+12*(n-1)+8); Nodes = map(1:NumNodes) do i Node() @@ -19,7 +20,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) z=0.0; @inbounds for k=1:n-1 @inbounds for j=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,j,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,j,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end end @@ -30,7 +31,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) z=0.0; @inbounds for k=1:n-1 @inbounds for j=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,j,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,j,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end end @@ -41,7 +42,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) z=0.0; @inbounds for k=1:n-1 @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,-1,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,-1,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end end @@ -52,7 +53,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) z=0.0; @inbounds for k=1:n-1 @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,-1,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,-1,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end end @@ -63,7 +64,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) z=-1.0; @inbounds for j=1:n-1 @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,j,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,j,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end end @@ -74,7 +75,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) z=1.0; @inbounds for j=1:n-1 @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,j,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,j,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end end @@ -85,7 +86,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=-1.0; z=-1.0; @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end NodeNumberWEpm=NodeNumber; @@ -93,7 +94,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=1.0; z=-1.0; @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end NodeNumberWEmp=NodeNumber; @@ -101,7 +102,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=-1.0; z=1.0; @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end NodeNumberWEpp=NodeNumber; @@ -109,7 +110,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=1.0; z=1.0; @inbounds for i=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(i,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end # South North @@ -118,7 +119,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=0.0; z=-1.0; @inbounds for j=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end NodeNumberSNpm=NodeNumber; @@ -126,7 +127,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=0.0; z=-1.0; @inbounds for j=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end NodeNumberSNmp=NodeNumber; @@ -134,7 +135,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=0.0; z=1.0; @inbounds for j=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end NodeNumberSNpp=NodeNumber; @@ -142,7 +143,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=0.0; z=1.0; @inbounds for j=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,j,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end # Bottom Top @@ -151,7 +152,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=-1.0; z=0.0; @inbounds for k=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end @@ -160,7 +161,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=-1.0; z=0.0; @inbounds for k=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end @@ -169,7 +170,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=1.0; z=0.0; @inbounds for k=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end @@ -178,7 +179,7 @@ function CubedGrid(n,OrientFace,Rad,Grid) y=1.0; z=0.0; @inbounds for k=1:n-1 - Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,k,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; end # Nodes @@ -186,109 +187,106 @@ function CubedGrid(n,OrientFace,Rad,Grid) x=-1.0e0; y=-1.0e0; z=-1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumberpmm=NodeNumber; x=1.0e0; y=-1.0e0; z=-1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumbermpm=NodeNumber; x=-1.0e0; y=1.0e0; z=-1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumberppm=NodeNumber; x=1.0e0; y=1.0e0; z=-1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumbermmp=NodeNumber; x=-1.0e0; y=-1.0e0; z=1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumberpmp=NodeNumber; x=1.0e0; y=-1.0e0; z=1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumbermpp=NodeNumber; x=-1.0e0; y=1.0e0; z=1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; NodeNumberppp=NodeNumber; x=1.0e0; y=1.0e0; z=1.0e0; - Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Grid.Rad),NodeNumber); + Nodes[NodeNumber]=Node(CubePoint(-1,-1,-1,n,x,y,z,Rad),NodeNumber); NodeNumber=NodeNumber+1; - Grid.Nodes=Nodes; NumEdges=12*(n-1)*n+12*n; NumEdgesI=12*(n-1)*n+12*n; Edges = map(1:NumEdges) do i - Edge([1,2],Grid,0,0,"",0); + Edge([1,2],Nodes,0,0,"",0); end EdgeNumber=1; # West (Edges,EdgeNumber,EdgeNumberW1,EdgeNumberW2)=InsertFaceEdge(n,EdgeNumber,NodeNumberW ,NodeNumberBTmm,NodeNumberBTmp ,NodeNumberSNmm,NodeNumberSNmp - ,Edges,Grid); + ,Edges,Nodes); # East (Edges,EdgeNumber,EdgeNumberE1,EdgeNumberE2)=InsertFaceEdge(n,EdgeNumber,NodeNumberE ,NodeNumberBTpm,NodeNumberBTpp ,NodeNumberSNpm,NodeNumberSNpp - ,Edges,Grid); + ,Edges,Nodes); # South (Edges,EdgeNumber,EdgeNumberS1,EdgeNumberS2)=InsertFaceEdge(n,EdgeNumber,NodeNumberS ,NodeNumberBTmm,NodeNumberBTpm ,NodeNumberWEmm,NodeNumberWEmp - ,Edges,Grid); + ,Edges,Nodes); # North (Edges,EdgeNumber,EdgeNumberN1,EdgeNumberN2)=InsertFaceEdge(n,EdgeNumber,NodeNumberN ,NodeNumberBTmp,NodeNumberBTpp ,NodeNumberWEpm,NodeNumberWEpp - ,Edges,Grid); + ,Edges,Nodes); # Bottom (Edges,EdgeNumber,EdgeNumberB1,EdgeNumberB2)=InsertFaceEdge(n,EdgeNumber,NodeNumberB ,NodeNumberSNmm,NodeNumberSNpm ,NodeNumberWEmm,NodeNumberWEpm - ,Edges,Grid); - # Top - (Edges,EdgeNumber,EdgeNumberT1,EdgeNumberT2)=InsertFaceEdge(n,EdgeNumber,NodeNumberT + ,Edges,Nodes); + # Top + (Edges,EdgeNumber,EdgeNumberT1,EdgeNumberT2)=InsertFaceEdge(n,EdgeNumber,NodeNumberT ,NodeNumberSNmp,NodeNumberSNpp ,NodeNumberWEmp,NodeNumberWEpp - ,Edges,Grid); + ,Edges,Nodes); # Edges #West East - (Edges,EdgeNumber,EdgeNumberWEmm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEmm,NodeNumbermmm,NodeNumberpmm,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberWEpm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEpm,NodeNumbermpm,NodeNumberppm,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberWEmp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEmp,NodeNumbermmp,NodeNumberpmp,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberWEpp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEpp,NodeNumbermpp,NodeNumberppp,Edges,Grid); + (Edges,EdgeNumber,EdgeNumberWEmm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEmm,NodeNumbermmm,NodeNumberpmm,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberWEpm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEpm,NodeNumbermpm,NodeNumberppm,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberWEmp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEmp,NodeNumbermmp,NodeNumberpmp,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberWEpp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberWEpp,NodeNumbermpp,NodeNumberppp,Edges,Nodes); # South North - (Edges,EdgeNumber,EdgeNumberSNmm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNmm,NodeNumbermmm,NodeNumbermpm,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberSNpm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNpm,NodeNumberpmm,NodeNumberppm,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberSNmp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNmp,NodeNumbermmp,NodeNumbermpp,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberSNpp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNpp,NodeNumberpmp,NodeNumberppp,Edges,Grid); + (Edges,EdgeNumber,EdgeNumberSNmm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNmm,NodeNumbermmm,NodeNumbermpm,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberSNpm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNpm,NodeNumberpmm,NodeNumberppm,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberSNmp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNmp,NodeNumbermmp,NodeNumbermpp,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberSNpp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberSNpp,NodeNumberpmp,NodeNumberppp,Edges,Nodes); # Bottom Top - (Edges,EdgeNumber,EdgeNumberBTmm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTmm,NodeNumbermmm,NodeNumbermmp,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberBTpm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTpm,NodeNumberpmm,NodeNumberpmp,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberBTmp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTmp,NodeNumbermpm,NodeNumbermpp,Edges,Grid); - (Edges,EdgeNumber,EdgeNumberBTpp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTpp,NodeNumberppm,NodeNumberppp,Edges,Grid); - - Grid.Edges=Edges; + (Edges,EdgeNumber,EdgeNumberBTmm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTmm,NodeNumbermmm,NodeNumbermmp,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberBTpm)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTpm,NodeNumberpmm,NodeNumberpmp,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberBTmp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTmp,NodeNumbermpm,NodeNumbermpp,Edges,Nodes); + (Edges,EdgeNumber,EdgeNumberBTpp)=InsertEdgeEdge(n,EdgeNumber,NodeNumberBTpp,NodeNumberppm,NodeNumberppp,Edges,Nodes); NumFaces=6*n*n; Faces = map(1:NumFaces) do i @@ -298,58 +296,96 @@ function CubedGrid(n,OrientFace,Rad,Grid) FaceNumber=1; # Faces # West - (Faces,FaceNumber,Grid)=InsertFaceFace(n,FaceNumber,"W",EdgeNumberW1,EdgeNumberW2 + (Faces,FaceNumber,Edges)=InsertFaceFace(n,FaceNumber,"W",EdgeNumberW1,EdgeNumberW2 ,EdgeNumberSNmm,EdgeNumberSNmp - ,EdgeNumberBTmm,EdgeNumberBTmp,Grid,Faces,OrientFace); + ,EdgeNumberBTmm,EdgeNumberBTmp,Nodes,Edges,Faces,OrientFace); # East - (Faces,FaceNumber,Grid)=InsertFaceFace(n,FaceNumber,"E",EdgeNumberE1,EdgeNumberE2 + (Faces,FaceNumber,Edges)=InsertFaceFace(n,FaceNumber,"E",EdgeNumberE1,EdgeNumberE2 ,EdgeNumberSNpm,EdgeNumberSNpp - ,EdgeNumberBTpm,EdgeNumberBTpp,Grid,Faces,OrientFace); + ,EdgeNumberBTpm,EdgeNumberBTpp,Nodes,Edges,Faces,OrientFace); # South - (Faces,FaceNumber,Grid)=InsertFaceFace(n,FaceNumber,"S",EdgeNumberS1,EdgeNumberS2 + (Faces,FaceNumber,Edges)=InsertFaceFace(n,FaceNumber,"S",EdgeNumberS1,EdgeNumberS2 ,EdgeNumberWEmm,EdgeNumberWEmp - ,EdgeNumberBTmm,EdgeNumberBTpm,Grid,Faces,OrientFace); + ,EdgeNumberBTmm,EdgeNumberBTpm,Nodes,Edges,Faces,OrientFace); # North - (Faces,FaceNumber,Grid)=InsertFaceFace(n,FaceNumber,"N",EdgeNumberN1,EdgeNumberN2 + (Faces,FaceNumber,Edges)=InsertFaceFace(n,FaceNumber,"N",EdgeNumberN1,EdgeNumberN2 ,EdgeNumberWEpm,EdgeNumberWEpp - ,EdgeNumberBTmp,EdgeNumberBTpp,Grid,Faces,OrientFace); + ,EdgeNumberBTmp,EdgeNumberBTpp,Nodes,Edges,Faces,OrientFace); # Bottom - (Faces,FaceNumber,Grid)=InsertFaceFace(n,FaceNumber,"B",EdgeNumberB1,EdgeNumberB2 + (Faces,FaceNumber,Edges)=InsertFaceFace(n,FaceNumber,"B",EdgeNumberB1,EdgeNumberB2 ,EdgeNumberWEmm,EdgeNumberWEpm - ,EdgeNumberSNmm,EdgeNumberSNpm,Grid,Faces,OrientFace); + ,EdgeNumberSNmm,EdgeNumberSNpm,Nodes,Edges,Faces,OrientFace); # Top - (Faces,FaceNumber,Grid)=InsertFaceFace(n,FaceNumber,"T",EdgeNumberT1,EdgeNumberT2 + (Faces,FaceNumber,Edges)=InsertFaceFace(n,FaceNumber,"T",EdgeNumberT1,EdgeNumberT2 ,EdgeNumberWEmp,EdgeNumberWEpp - ,EdgeNumberSNmp,EdgeNumberSNpp,Grid,Faces,OrientFace); - - Grid.Faces=Faces; - - Grid.NumNodes=size(Grid.Nodes,1); - Grid.NumEdges=size(Grid.Edges,1); - Grid.NumEdgesI=size(Grid.Edges,1); - Grid.NumEdgesB=0; - Grid.NumFaces=size(Grid.Faces,1); - Grid.Dim=3; - Grid=Orientation(Grid); - Grid=Renumbering(Grid); - Grid=FacesInNodes(Grid); + ,EdgeNumberSNmp,EdgeNumberSNpp,Nodes,Edges,Faces,OrientFace); + NumNodes=size(Nodes,1); + NumEdges=size(Edges,1); + NumEdgesI=size(Edges,1); + NumEdgesB=0; + NumFaces=size(Faces,1); + Dim=3; + Orientation!(Edges,Faces); + Renumbering!(Edges,Faces); + FacesInNodes!(Nodes,Faces) #Boundary/Interior faces - BoundaryFaces = zeros(Int,0) - @inbounds for iE = 1 : Grid.NumEdges - if Grid.Edges[iE].F[1] == 0 || Grid.Edges[iE].F[2] == 0 - @inbounds for iN in Grid.Edges[iE].N - @inbounds for iF in Grid.Nodes[iN].F - push!(BoundaryFaces,iF) + BoundaryFacesLoc = zeros(Int,0) + @inbounds for iE = 1 : NumEdges + if Edges[iE].F[1] == 0 || Edges[iE].F[2] == 0 + @inbounds for iN in Edges[iE].N + @inbounds for iF in Nodes[iN].F + push!(BoundaryFacesLoc,iF) end end end end - BoundaryFaces = unique(BoundaryFaces) - Grid.BoundaryFaces = BoundaryFaces - Grid.InteriorFaces = setdiff(collect(UnitRange(1,Grid.NumFaces)),Grid.BoundaryFaces) - return Grid + BoundaryFacesLoc = unique(BoundaryFacesLoc) + BoundaryFaces = KernelAbstractions.zeros(backend,Int,size(BoundaryFacesLoc)) + copyto!(BoundaryFaces,BoundaryFacesLoc) + InteriorFacesLoc = setdiff(collect(UnitRange(1,NumFaces)),BoundaryFacesLoc) + InteriorFaces = KernelAbstractions.zeros(backend,Int,size(InteriorFacesLoc)) + copyto!(InteriorFaces,InteriorFacesLoc) + + zP=zeros(nz) + z=KernelAbstractions.zeros(backend,FT,nz+1) + dzeta=zeros(nz) + H=0.0 + colors=[[]] + Spline_2d = Spline2D(zeros(0),zeros(0),zeros(0),0,0,0.0) + NumGhostFaces = 0 + nBar3 = zeros(0,0) + nBar = zeros(0,0) + return GridStruct{FT, + typeof(z), + typeof(BoundaryFaces)}( + nz, + zP, + z, + dzeta, + H, + NumFaces, + NumGhostFaces, + Faces, + NumEdges, + Edges, + NumNodes, + Nodes, + Form, + Type, + Dim, + Rad, + NumEdgesI, + NumEdgesB, + nBar3, + nBar, + Topography, + colors, + Spline_2d, + BoundaryFaces, + InteriorFaces, + ) end function CubePoint(i1,i2,i3,n,x,y,z,Rad) @@ -370,7 +406,7 @@ end function InsertFaceEdge(n,EdgeNumber,NodeNumberStart, NodeNumberE1Start1,NodeNumberE2Start1, - NodeNumberE1Start2,NodeNumberE2Start2,Edges,Grid) + NodeNumberE1Start2,NodeNumberE2Start2,Edges,Nodes) NodeNumber=NodeNumberStart; NodeNumberE1=NodeNumberE1Start1; @@ -389,7 +425,7 @@ function InsertFaceEdge(n,EdgeNumber,NodeNumberStart, NodeNumberE2=NodeNumberE2+1; NodeNumber=NodeNumber-1; end - Edges[EdgeNumber]=Edge([N1,N2],Grid,EdgeNumber,EdgeNumber,"X",EdgeNumber); + Edges[EdgeNumber]=Edge([N1,N2],Nodes,EdgeNumber,EdgeNumber,"X",EdgeNumber); EdgeNumber=EdgeNumber+1; NodeNumber=NodeNumber+1; end @@ -410,7 +446,7 @@ function InsertFaceEdge(n,EdgeNumber,NodeNumberStart, N2=NodeNumberE2; NodeNumberE2=NodeNumberE2+1; end - Edges[EdgeNumber]=Edge([N1,N2],Grid,EdgeNumber,EdgeNumber,"X",EdgeNumber); + Edges[EdgeNumber]=Edge([N1,N2],Nodes,EdgeNumber,EdgeNumber,"X",EdgeNumber); EdgeNumber=EdgeNumber+1; NodeNumber=NodeNumber+1; end @@ -420,7 +456,7 @@ end function InsertEdgeEdge(n,EdgeNumber, NodeNumberStart,NodeNumberE1,NodeNumberE2, - Edges,Grid) + Edges,Nodes) NodeNumber=NodeNumberStart; EdgeNumberStart=EdgeNumber; @inbounds for i=1:n @@ -432,7 +468,7 @@ function InsertEdgeEdge(n,EdgeNumber, if i==n N2=NodeNumberE2; end - Edges[EdgeNumber]=Edge([N1,N2],Grid,EdgeNumber,EdgeNumber,"X",EdgeNumber); + Edges[EdgeNumber]=Edge([N1,N2],Nodes,EdgeNumber,EdgeNumber,"X",EdgeNumber); EdgeNumber=EdgeNumber+1; NodeNumber=NodeNumber+1; end @@ -442,7 +478,7 @@ end function InsertFaceFace(n,FaceNumber,Type,EdgeNumberStart1,EdgeNumberStart2, EdgeNumberStartEW1,EdgeNumberStartEW2, EdgeNumberStartSN1,EdgeNumberStartSN2, - Grid,Faces,OrientFace) + Nodes,Edges,Faces,OrientFace) EdgeNumber1=EdgeNumberStart1; @@ -483,9 +519,9 @@ function InsertFaceFace(n,FaceNumber,Type,EdgeNumberStart1,EdgeNumberStart2, end EdgeNumber1=EdgeNumber1+1; EdgeNumber2=EdgeNumber2+1; - (Faces[FaceNumber],Grid)=Face([E1,E2,E3,E4],Grid,FaceNumber,Type,OrientFace;P=zeros(Float64,0,0)); + (Faces[FaceNumber],Edges)=Face([E1,E2,E3,E4],Nodes,Edges,FaceNumber,Type,OrientFace;P=zeros(Float64,0,0)); FaceNumber=FaceNumber+1; end end - return (Faces,FaceNumber,Grid) + return (Faces,FaceNumber,Edges) end diff --git a/src/Grids/CubedGrid1.jl b/src/Grids/CubedGrid1.jl new file mode 100644 index 0000000..e9661fd --- /dev/null +++ b/src/Grids/CubedGrid1.jl @@ -0,0 +1,56 @@ +function CubedGrid(backend,FT,n,OrientFace,Rad,nz,Topography) + + zP=zeros(nz) + z=KernelAbstractions.zeros(backend,FT,nz+1) + dzeta=zeros(nz) + H=0.0 + NumFaces=0 + NumGhostFaces=0 + Faces=Array{Face}(undef, 0) + NumEdges=0 + Edges=Array{Edge}(undef, 0) + NumNodes=0 + Nodes=Array{Node}(undef, 0) + Form="" + Type="" + Dim=0 + Rad=0.0 + NumEdgesI=0 + NumEdgesB=0 + nBar3=zeros(0,0) + nBar=zeros(0,0) + colors=[[]] + Spline_2d = Spline2D(zeros(0),zeros(0),zeros(0),0,0,0.0) + BoundaryFaces = KernelAbstractions.zeros(backend,Int,0) + InteriorFaces = KernelAbstractions.zeros(backend,Int,0) +return GridStruct{FT, + typeof(z), + typeof(BoundaryFaces)}( + nz, + zP, + z, + dzeta, + H, + NumFaces, + NumGhostFaces, + Faces, + NumEdges, + Edges, + NumNodes, + Nodes, + Form, + Type, + Dim, + Rad, + NumEdgesI, + NumEdgesB, + nBar3, + nBar, + Topography, + colors, + Spline_2d, + BoundaryFaces, + InteriorFaces, + ) +end + diff --git a/src/Grids/Edge.jl b/src/Grids/Edge.jl index 0724de5..3c7f46d 100644 --- a/src/Grids/Edge.jl +++ b/src/Grids/Edge.jl @@ -51,7 +51,7 @@ function Edge() ) end -function Edge(Nodes,Grid,PosG,PosI,Type,PosT=nothing) +function Edge(NodesE,Nodes,PosG,PosI,Type,PosT=nothing) E = Edge() E.E=PosG; E.EI=PosI; @@ -60,11 +60,11 @@ function Edge(Nodes,Grid,PosG,PosI,Type,PosT=nothing) else E.ET=0; end - E.N=Nodes; - E.t=Grid.Nodes[E.N[2]].P-Grid.Nodes[E.N[1]].P; + E.N=NodesE; + E.t=Nodes[E.N[2]].P-Nodes[E.N[1]].P; E.a=norm(E.t); E.t=E.t/E.a; - E.Mid=0.5*(Grid.Nodes[E.N[1]].P+Grid.Nodes[E.N[2]].P); + E.Mid=0.5*(Nodes[E.N[1]].P+Nodes[E.N[2]].P); E.Type=Type; return E end diff --git a/src/Grids/Face.jl b/src/Grids/Face.jl index 236cb8e..d3d354d 100644 --- a/src/Grids/Face.jl +++ b/src/Grids/Face.jl @@ -39,55 +39,55 @@ function Face() ) end -function Face(Edges::Array{Int, 1},Grid,Pos,Type,OrientFace;P::Array{Float64,2}=[]) +function Face(EdgesF::Array{Int, 1},Nodes,Edges,Pos,Type,OrientFace;P::Array{Float64,2}=[]) F = Face() - if Edges[1]==0 - return (F,Grid) + if EdgesF[1]==0 + return (F,Edges) end - nE=size(Edges,1); + nE=size(EdgesF,1); F.F=Pos; F.Type=Type # TODO: check translation @inbounds for iE=1:nE - Grid.Edges[Edges[iE]].NumF +=1 - Grid.Edges[Edges[iE]].F[Grid.Edges[Edges[iE]].NumF]=Pos; + Edges[EdgesF[iE]].NumF +=1 + Edges[EdgesF[iE]].F[Edges[EdgesF[iE]].NumF]=Pos; end #Sort edges F.E=zeros(Int,nE); - F.E[1]=Edges[1]; - N2=Grid.Edges[F.E[1]].N[2]; + F.E[1]=EdgesF[1]; + N2=Edges[F.E[1]].N[2]; @inbounds for iE=2:nE @inbounds for iE1=iE:nE - if N2==Grid.Edges[Edges[iE1]].N[1] - F.E[iE]=Edges[iE1]; - N2=Grid.Edges[Edges[iE1]].N[2]; - Edges[iE1]=Edges[iE]; - Edges[iE]=F.E[iE]; + if N2==Edges[EdgesF[iE1]].N[1] + F.E[iE]=EdgesF[iE1]; + N2=Edges[EdgesF[iE1]].N[2]; + EdgesF[iE1]=EdgesF[iE]; + EdgesF[iE]=F.E[iE]; break - elseif N2==Grid.Edges[Edges[iE1]].N[2] - F.E[iE]=Edges[iE1]; - N2=Grid.Edges[Edges[iE1]].N[1]; - Edges[iE1]=Edges[iE]; - Edges[iE]=F.E[iE]; + elseif N2==Edges[EdgesF[iE1]].N[2] + F.E[iE]=EdgesF[iE1]; + N2=Edges[EdgesF[iE1]].N[1]; + EdgesF[iE1]=EdgesF[iE]; + EdgesF[iE]=F.E[iE]; break end end end F.a=0; F.N=zeros(Int,nE); - F.N[1:2]=Grid.Edges[F.E[1]].N; + F.N[1:2]=Edges[F.E[1]].N; @inbounds for iE=2:nE-1 - if F.N[iE]==Grid.Edges[F.E[iE]].N[1] - F.N[iE+1]=Grid.Edges[F.E[iE]].N[2]; + if F.N[iE]==Edges[F.E[iE]].N[1] + F.N[iE+1]=Edges[F.E[iE]].N[2]; else - F.N[iE+1]=Grid.Edges[F.E[iE]].N[1]; + F.N[iE+1]=Edges[F.E[iE]].N[1]; end end if P == zeros(Float64,0,0) F.P=Array{Point}(undef, size(F.N,1)) @inbounds for i=1:size(F.N,1) - F.P[i]=Grid.Nodes[F.N[i]].P; + F.P[i]=Nodes[F.N[i]].P; end else F.P=Array{Point}(undef, size(F.N,1)) @@ -106,7 +106,7 @@ function Face(Edges::Array{Int, 1},Grid,Pos,Type,OrientFace;P::Array{Float64,2}= end F.Mid=F.Mid/Float64(nE); - NumE=size(Edges,1); + NumE=size(EdgesF,1); F.n=cross(F.P[NumE],F.P[1]); @inbounds for i=1:NumE-1 F.n=F.n+cross(F.P[i],F.P[i+1]); @@ -126,5 +126,5 @@ function Face(Edges::Array{Int, 1},Grid,Pos,Type,OrientFace;P::Array{Float64,2}= end F.n=-F.n; end - return (F,Grid) + return (F,Edges) end diff --git a/src/Grids/FacesInNodes.jl b/src/Grids/FacesInNodes.jl index ff63188..fda325b 100644 --- a/src/Grids/FacesInNodes.jl +++ b/src/Grids/FacesInNodes.jl @@ -1,22 +1,23 @@ -function FacesInNodes(Grid) -NumFacesPerNode=zeros(Int,Grid.NumNodes,1); -for iF=1:Grid.NumFaces - Face=Grid.Faces[iF]; - for iN=1:size(Face.N,1) - NumFacesPerNode[Face.N[iN]]=NumFacesPerNode[Face.N[iN]]+1; +function FacesInNodes!(Nodes,Faces) + NumNodes = size(Nodes,1) + NumFaces = size(Faces,1) + NumFacesPerNode = zeros(Int,NumNodes,1) + for iF = 1 : NumFaces + Face = Faces[iF] + for iN = 1 : size(Face.N,1) + NumFacesPerNode[Face.N[iN]]=NumFacesPerNode[Face.N[iN]]+1 + end end -end -FacesPerNode=zeros(Int,Grid.NumNodes,maximum(NumFacesPerNode)); -NumFacesPerNode=zeros(Int,Grid.NumNodes,1); -for iF=1:Grid.NumFaces - Face=Grid.Faces[iF]; - for iN=1:size(Face.N,1) - NumFacesPerNode[Face.N[iN]]=NumFacesPerNode[Face.N[iN]]+1; - FacesPerNode[Face.N[iN],NumFacesPerNode[Face.N[iN]]]=iF; + FacesPerNode = zeros(Int,NumNodes,maximum(NumFacesPerNode)) + NumFacesPerNode = zeros(Int,NumNodes,1) + for iF = 1 : NumFaces + Face = Faces[iF] + for iN = 1 : size(Face.N,1) + NumFacesPerNode[Face.N[iN]] = NumFacesPerNode[Face.N[iN]]+1 + FacesPerNode[Face.N[iN],NumFacesPerNode[Face.N[iN]]] = iF + end + end + for iN = 1 : NumNodes + Nodes[iN].F = FacesPerNode[iN,1:NumFacesPerNode[iN]] end -end -for iN=1:Grid.NumNodes - Grid.Nodes[iN].F=FacesPerNode[iN,1:NumFacesPerNode[iN]]; -end -return Grid end diff --git a/src/Grids/GridStruct.jl b/src/Grids/GridStruct.jl index cec4648..540debc 100644 --- a/src/Grids/GridStruct.jl +++ b/src/Grids/GridStruct.jl @@ -15,7 +15,8 @@ function Boundary() end mutable struct GridStruct{FT<:AbstractFloat, - AT1<:AbstractArray} + AT1<:AbstractArray, + IT1<:AbstractArray} nz::Int zP::Array{FT, 1} z::AT1 @@ -39,8 +40,8 @@ mutable struct GridStruct{FT<:AbstractFloat, Topography::NamedTuple colors::Array{Array{Int, 1}, 1} Spline_2d::Dierckx.Spline2D - BoundaryFaces::Array{Int,1} - InteriorFaces::Array{Int,1} + BoundaryFaces::IT1 + InteriorFaces::IT1 end function GridStruct{FT}(backend,nz,Topography) where FT <: AbstractFloat zP=zeros(nz) @@ -64,10 +65,11 @@ function GridStruct{FT}(backend,nz,Topography) where FT <: AbstractFloat nBar=zeros(0,0) colors=[[]] Spline_2d = Spline2D(zeros(0),zeros(0),zeros(0),0,0,0.0) - BoundaryFaces = zeros(Int,0) - InteriorFaces = zeros(Int,0) + BoundaryFaces = KernelAbstractions.zeros(backend,Int,0) + InteriorFaces = KernelAbstractions.zeros(backend,Int,0) return GridStruct{FT, - typeof(z)}( + typeof(z), + typeof(BoundaryFaces)}( nz, zP, z, diff --git a/src/Grids/Grids.jl b/src/Grids/Grids.jl index 2e174e4..1f0dfee 100644 --- a/src/Grids/Grids.jl +++ b/src/Grids/Grids.jl @@ -19,9 +19,9 @@ include("Node.jl") include("Edge.jl") include("Face.jl") include("GridStruct.jl") +include("CubedGrid.jl") include("AddVerticalGrid.jl") include("CartGrid.jl") -include("CubedGrid.jl") include("FacesInNodes.jl") include("JacobiDG3.jl") include("JacobiDG3GPU.jl") diff --git a/src/Grids/Orientation.jl b/src/Grids/Orientation.jl index 18676a5..cb4a6aa 100644 --- a/src/Grids/Orientation.jl +++ b/src/Grids/Orientation.jl @@ -1,79 +1,78 @@ -function Orientation(Grid) - NumEdges=size(Grid.Edges,1); +function Orientation!(Edges,Faces) + NumEdges=size(Edges,1); VisitE=zeros(Int, NumEdges); OrientationE=zeros(Int, NumEdges); o=1; for iE=1:NumEdges - (VisitE,OrientationE,o,Grid)=Orient(iE,o,VisitE,OrientationE,Grid); + (VisitE,OrientationE,o,Edges,Faces)=Orient(iE,o,VisitE,OrientationE,Edges,Faces); end - return Grid end -function Orient(iE,o,VisitE,OrientationE,Grid) - if VisitE[iE]==1 || size(Grid.Edges[iE].F,2)==0 +function Orient(iE,o,VisitE,OrientationE,Edges,Faces) + if VisitE[iE]==1 || size(Edges[iE].F,2)==0 # if OrientationE[iE] ≠ o # error("Möbius Band") # end else VisitE[iE]=1; - iF1=Grid.Edges[iE].F[1]; - if size(Grid.Edges[iE].F,2)==2 - iFEnd=Grid.Edges[iE].F[2]; + iF1=Edges[iE].F[1]; + if size(Edges[iE].F,2)==2 + iFEnd=Edges[iE].F[2]; else iFEnd=0; end local iE1 for iE1_local=1:4 iE1 = iE1_local - if iE==Grid.Faces[iF1].E[iE1] + if iE==Faces[iF1].E[iE1] break end end - NF=[Grid.Faces[iF1].N...,Grid.Faces[iF1].N[1]]; - o=EdgeDirection(NF[iE1],NF[iE1+1],Grid.Edges[iE].N); + NF=[Faces[iF1].N...,Faces[iF1].N[1]]; + o=EdgeDirection(NF[iE1],NF[iE1+1],Edges[iE].N); OrientationE[iE]=o; iLoop=0; - while (iF1≠iFEnd && size(Grid.Edges[iE].F,2)==2) || iLoop==0 + while (iF1≠iFEnd && size(Edges[iE].F,2)==2) || iLoop==0 iLoop=iLoop+1; - NF=[Grid.Faces[iF1].N...,Grid.Faces[iF1].N[1]]; - o=EdgeDirection(NF[iE1],NF[iE1+1],Grid.Edges[iE].N); + NF=[Faces[iF1].N...,Faces[iF1].N[1]]; + o=EdgeDirection(NF[iE1],NF[iE1+1],Edges[iE].N); iEP1=Shift(iE1,2); - iEP=Grid.Faces[iF1].E[iEP1]; - if EdgeDirection(NF[iEP1],NF[iEP1+1],Grid.Edges[iEP].N)==o + iEP=Faces[iF1].E[iEP1]; + if EdgeDirection(NF[iEP1],NF[iEP1+1],Edges[iEP].N)==o if o==-1 - Grid.Edges[iEP].N[1]=NF[iEP1]; - Grid.Edges[iEP].N[2]=NF[iEP1+1]; + Edges[iEP].N[1]=NF[iEP1]; + Edges[iEP].N[2]=NF[iEP1+1]; else - Grid.Edges[iEP].N[1]=NF[iEP1+1]; - Grid.Edges[iEP].N[2]=NF[iEP1]; + Edges[iEP].N[1]=NF[iEP1+1]; + Edges[iEP].N[2]=NF[iEP1]; end end iE=iEP; VisitE[iE]=1; OrientationE[iE]=o; - if size(Grid.Edges[iE].F,2)>1 - if iF1==Grid.Edges[iE].F[1] - iF1=Grid.Edges[iE].F[2]; + if size(Edges[iE].F,2)>1 + if iF1==Edges[iE].F[1] + iF1=Edges[iE].F[2]; else - iF1=Grid.Edges[iE].F[1]; + iF1=Edges[iE].F[1]; end else - iF1=Grid.Edges[iE].F[1]; + iF1=Edges[iE].F[1]; end for iE1_local=1:4 iE1 = iE1_local - if iE==Grid.Faces[iF1].E[iE1] + if iE==Faces[iF1].E[iE1] break end end end if iF1==iFEnd - NF=[Grid.Faces[iF1].N...,Grid.Faces[iF1].N[1]]; - o=EdgeDirection(NF[iE1],NF[iE1+1],Grid.Edges[iE].N); + NF=[Faces[iF1].N...,Faces[iF1].N[1]]; + o=EdgeDirection(NF[iE1],NF[iE1+1],Edges[iE].N); iEP1=Shift(iE1,2); - iEP=Grid.Faces[iF1].E[iEP1]; - oP=EdgeDirection(NF[iEP1],NF[iEP1+1],Grid.Edges[iEP].N); - if iEP==Grid.Edges[iEP].E + iEP=Faces[iF1].E[iEP1]; + oP=EdgeDirection(NF[iEP1],NF[iEP1+1],Edges[iEP].N); + if iEP==Edges[iEP].E if o==oP error("Möbius Band") end @@ -84,7 +83,7 @@ function Orient(iE,o,VisitE,OrientationE,Grid) end end end - return VisitE,OrientationE,o,Grid + return VisitE,OrientationE,o,Edges,Faces end diff --git a/src/Grids/Renumbering.jl b/src/Grids/Renumbering.jl index 9e3c1b2..149680c 100644 --- a/src/Grids/Renumbering.jl +++ b/src/Grids/Renumbering.jl @@ -6,23 +6,23 @@ function Reordering!(Grid) NodeOrderNew=zeros(Int,Grid.NumNodes) end -function Renumbering(Grid) -for iF=1:Grid.NumFaces - Grid.Faces[iF]=RenumberingFace4(Grid.Faces[iF],Grid); -end -for iE=1:Grid.NumEdges - Grid.Edges[iE]=PosEdgeInFace(Grid.Edges[iE],Grid); -end -return Grid + +function Renumbering!(Edges,Faces) + for iF = 1 : size(Faces,1) + RenumberingFace4!(Faces[iF],Edges); + end + for iE = 1 : size(Edges,1) + PosEdgeInFace!(Edges[iE],Edges,Faces); + end end -function PosEdgeInFace(Edge,Grid) +function PosEdgeInFace!(Edge,Edges,Faces) Edge.FE=zeros(2) for i=1:size(Edge.F,1) iF=Edge.F[i]; if iF > 0 for iE=1:4 - if Edge.EI==Grid.Edges[Grid.Faces[iF].E[iE]].EI + if Edge.EI==Edges[Faces[iF].E[iE]].EI Edge.FE[i]=iE; break end @@ -44,14 +44,15 @@ if size(Edge.F,1)>1 end return Edge end -function RenumberingFace4(Face,Grid) + +function RenumberingFace4!(Face,Edges) local iN for iN_in=1:length(Face.N) iN = iN_in N=Face.N[iN]; num=0; for iE=1:length(Face.E) - if N==Grid.Edges[Face.E[iE]].N[1] + if N==Edges[Face.E[iE]].N[1] num=num+1; end if num==2 @@ -80,13 +81,12 @@ if length(Face.N) == 4 OrientL[4]=-1; Face.OrientE = Vector{Int}(undef, 0) for i=1:4 - if Grid.Edges[Face.E[i]].N[1]==Face.N[i] + if Edges[Face.E[i]].N[1]==Face.N[i] push!(Face.OrientE, 1*OrientL[i]); else push!(Face.OrientE, -1*OrientL[i]); end end end -return Face end diff --git a/src/Grids/SubGrid.jl b/src/Grids/SubGrid.jl index dd99983..06261fa 100644 --- a/src/Grids/SubGrid.jl +++ b/src/Grids/SubGrid.jl @@ -1,7 +1,6 @@ function ConstructSubGrid(GlobalGrid,Proc,ProcNumber) backend = get_backend(GlobalGrid.z) FT = eltype(GlobalGrid.z) - SubGrid = GridStruct{FT}(backend,GlobalGrid.nz,GlobalGrid.Topography) # Number of faces DictF = Dict() @@ -102,13 +101,6 @@ function ConstructSubGrid(GlobalGrid,Proc,ProcNumber) Faces[i].E[j] = GlobalGrid.Edges[Faces[i].E[j]].E Faces[i].N[j] = GlobalGrid.Nodes[Faces[i].N[j]].N end -# Faces[i].E[2] = GlobalGrid.Edges[Faces[i].E[2]].E -# Faces[i].E[3] = GlobalGrid.Edges[Faces[i].E[3]].E -# Faces[i].E[4] = GlobalGrid.Edges[Faces[i].E[4]].E -# Faces[i].N[1] = GlobalGrid.Nodes[Faces[i].N[1]].N -# Faces[i].N[2] = GlobalGrid.Nodes[Faces[i].N[2]].N -# Faces[i].N[3] = GlobalGrid.Nodes[Faces[i].N[3]].N -# Faces[i].N[4] = GlobalGrid.Nodes[Faces[i].N[4]].N end # Physischer Rand und Prozessor Rand @inbounds for i = 1:NumEdges @@ -128,44 +120,40 @@ function ConstructSubGrid(GlobalGrid,Proc,ProcNumber) end end - SubGrid.NumFaces = NumFaces - SubGrid.NumGhostFaces = NumGhostFaces - SubGrid.Faces = Faces - SubGrid.NumEdges = NumEdges - SubGrid.Edges = Edges - SubGrid.NumNodes = NumNodes - SubGrid.Nodes = Nodes + Dim=3; + Renumbering!(Edges,Faces); + FacesInNodes!(Nodes,Faces) - SubGrid.Dim=3; - SubGrid=Renumbering(SubGrid); - SubGrid=FacesInNodes(SubGrid); - SubGrid.Form = GlobalGrid.Form + Form = GlobalGrid.Form #Boundary/Interior faces - BoundaryFaces = zeros(Int,0) - @inbounds for iE = 1 : SubGrid.NumEdges - if SubGrid.Edges[iE].F[1] == 0 || SubGrid.Edges[iE].F[2] == 0 - @inbounds for iN in SubGrid.Edges[iE].N - @inbounds for iF in SubGrid.Nodes[iN].F - push!(BoundaryFaces,iF) + BoundaryFacesLoc = zeros(Int,0) + @inbounds for iE = 1 : NumEdges + if Edges[iE].F[1] == 0 || Edges[iE].F[2] == 0 + @inbounds for iN in Edges[iE].N + @inbounds for iF in Nodes[iN].F + push!(BoundaryFacesLoc,iF) end end end end - BoundaryFaces = unique(BoundaryFaces) - SubGrid.BoundaryFaces = BoundaryFaces - SubGrid.InteriorFaces = setdiff(collect(UnitRange(1,SubGrid.NumFaces)),SubGrid.BoundaryFaces) + BoundaryFacesLoc = unique(BoundaryFacesLoc) + BoundaryFaces = KernelAbstractions.zeros(backend,Int,size(BoundaryFacesLoc)) + copyto!(BoundaryFaces,BoundaryFacesLoc) + InteriorFacesLoc = setdiff(collect(UnitRange(1,NumFaces)),BoundaryFacesLoc) + InteriorFaces = KernelAbstractions.zeros(backend,Int,size(InteriorFacesLoc)) + copyto!(InteriorFaces,InteriorFacesLoc) - SubGrid.Rad = GlobalGrid.Rad + Rad = GlobalGrid.Rad # Stencil - @inbounds for iF=1:SubGrid.NumFaces + @inbounds for iF=1:NumFaces StencilLoc=zeros(Int, 16,1); StencilLoc[:] .= iF; iS=0; - @inbounds for i=1:length(SubGrid.Faces[iF].N) - iN=SubGrid.Faces[iF].N[i]; - @inbounds for j=1:size(SubGrid.Nodes[iN].F,1) - jF=SubGrid.Nodes[iN].F[j]; + @inbounds for i=1:length(Faces[iF].N) + iN=Faces[iF].N[i]; + @inbounds for j=1:size(Nodes[iN].F,1) + jF=Nodes[iN].F[j]; inside=false; @inbounds for jS=1:iS if StencilLoc[jS]==jF @@ -179,8 +167,8 @@ function ConstructSubGrid(GlobalGrid,Proc,ProcNumber) end end end - SubGrid.Faces[iF].Stencil = zeros(Int,iS) - SubGrid.Faces[iF].Stencil .= StencilLoc[1:iS] + Faces[iF].Stencil = zeros(Int,iS) + Faces[iF].Stencil .= StencilLoc[1:iS] end # Add Ghost Faces @@ -190,17 +178,48 @@ function ConstructSubGrid(GlobalGrid,Proc,ProcNumber) push!(Nodes[i].F,DictF[Nodes[i].FG[j]]) end end -# if ProcNumber == 1 -# for iF = 1 : SubGrid.NumFaces -# @show SubGrid.Faces[iF].F -# @show SubGrid.Faces[iF].FG -# @show SubGrid.Faces[iF].E -# @show SubGrid.Faces[iF].N -# end -# end - - - return SubGrid + nz = GlobalGrid.nz + zP=zeros(nz) + z=KernelAbstractions.zeros(backend,FT,nz+1) + dzeta=zeros(nz) + H = GlobalGrid.H + NumEdgesI=size(Edges,1); + NumEdgesB=0; + Topography = GlobalGrid.Topography + colors=[[]] + Spline_2d = Spline2D(zeros(0),zeros(0),zeros(0),0,0,0.0) + nBar3=zeros(0,0) + nBar=zeros(0,0) + Type = GlobalGrid.Type + return GridStruct{FT, + typeof(z), + typeof(BoundaryFaces)}( + nz, + zP, + z, + dzeta, + H, + NumFaces, + NumGhostFaces, + Faces, + NumEdges, + Edges, + NumNodes, + Nodes, + Form, + Type, + Dim, + Rad, + NumEdgesI, + NumEdgesB, + nBar3, + nBar, + Topography, + colors, + Spline_2d, + BoundaryFaces, + InteriorFaces, + ) end function Decompose(Grid,NumProc) diff --git a/src/Integration/SchurSolve.jl b/src/Integration/SchurSolve.jl index e7837ee..8a94afb 100644 --- a/src/Integration/SchurSolve.jl +++ b/src/Integration/SchurSolve.jl @@ -120,7 +120,7 @@ function SchurSolveGPU!(k,v,J,fac,Cache,Global) NumVTr = size(k,3) # group = (1024) - group = (12) + group = (64) ndrange = (NumG) if J.CompTri