From e4a5f431107ed0d74d6f390bca13629f0b15af53 Mon Sep 17 00:00:00 2001 From: rajexplo Date: Wed, 7 Dec 2016 15:33:27 -0600 Subject: [PATCH] Add files via upload --- BuildBCMaps2D.m | 23 + BuildCurvedOPS2D.m | 81 + BuildHNonCon2D.m | 96 + BuildMaps2D.m | 45 + BuildNonCon2D.m | 96 + BuildPNonCon2D.m | 150 ++ BuildPeriodicMaps2D.m | 88 + Connect2D.m | 43 + Cubature2D.m | 31 + CubatureData2D.m | 1796 ++++++++++++++ CubatureVolumeMesh2D.m | 32 + Curl2D.m | 16 + CurvedPoissonIPDG2D.m | 95 + CurvedPoissonIPDGDriver2D.m | 50 + CurvedPoissonIPDGbc2D.m | 51 + CutOffFilter2D.m | 22 + Div2D.m | 10 + Dmatrices2D.m | 9 + EquiNodes2D.m | 21 + Euler01.neu | 1066 +++++++++ Filter2D.m | 23 + FindLocalCoords2D.m | 22 + GaussFaceMesh2D.m | 75 + GeometricFactors2D.m | 9 + Globals2D.m | 37 + Grad2D.m | 10 + GradJacobiP.m | 13 + GradSimplex2DP.m | 31 + GradVandermonde2D.m | 19 + Hrefine2D.m | 64 + InterpMatrix2D.m | 16 + JacobiGL.m | 13 + JacobiGQ.m | 23 + JacobiP.m | 37 + Lift2D.m | 29 + MakeCylinder2D.m | 85 + Maxwell00625.neu | 3778 ++++++++++++++++++++++++++++++ Maxwell0125.neu | 959 ++++++++ Maxwell025.neu | 268 +++ Maxwell05.neu | 100 + Maxwell1.neu | 35 + Maxwell2.neu | 24 + Maxwell2D.m | 36 + MaxwellCurved2D.m | 48 + MaxwellCurvedDriver2D.m | 37 + MaxwellCurvedRHS2D.m | 50 + MaxwellHNonCon2D.m | 51 + MaxwellHNonConDriver2D.m | 40 + MaxwellHNonConRHS2D.m | 44 + MaxwellPNonCon2D.m | 42 + MaxwellPNonConDriver2D.m | 34 + MaxwellPNonConRHS2D.m | 78 + MeshReaderGambit2D.m | 46 + MeshReaderGambitBC2D.m | 80 + Nodes2D.m | 45 + Normals2D.m | 27 + PhysDmatrices2D.m | 15 + PlotContour2D.m | 45 + PlotMesh2D.m | 27 + Poisson2D.m | 21 + PoissonDriver2D.m | 38 + PoissonIPDG2D.m | 80 + PoissonIPDGbc2D.m | 46 + PoissonRHS2D.m | 35 + Sample2D.m | 23 + Simplex2DP.m | 9 + Vandermonde1D.m | 10 + Vandermonde2D.m | 19 + Warpfactor.m | 25 + bump025.neu | 222 ++ circA01.neu | 113 + dtscale2D.m | 25 + edgeDirection.m | 11 + edgeLength.m | 5 + edgePointCoord.m | 14 + meshAdaptiveRefine.asv | 177 ++ meshAdaptiveRefine.m | 176 ++ meshBaryCenter.m | 14 + meshConstructEdgeData.m | 91 + meshDisp.m | 53 + meshMarkForRefine.m | 54 + meshPlot.m | 18 + meshPlotPrimalDual.m | 15 + meshPlotWithIndices.m | 98 + meshPlotWithSubdomains.m | 28 + meshUniformRefineQuadrilateral.m | 145 ++ meshUniformRefineTriangular.asv | 135 ++ meshUniformRefineTriangular.m | 134 ++ rstoab.m | 13 + setRectDomBE.m | 28 + setRectDomP.m | 13 + setRectDomPJiggle.m | 22 + tiConnect2D.m | 33 + trgArea.m | 24 + trgAreaGradLambda.m | 35 + trgCscTheta.m | 18 + trgPointCoord.m | 21 + trgVecNormal.m | 29 + trgVecTangent.m | 30 + xytors.m | 11 + 100 files changed, 12347 insertions(+) create mode 100644 BuildBCMaps2D.m create mode 100644 BuildCurvedOPS2D.m create mode 100644 BuildHNonCon2D.m create mode 100644 BuildMaps2D.m create mode 100644 BuildNonCon2D.m create mode 100644 BuildPNonCon2D.m create mode 100644 BuildPeriodicMaps2D.m create mode 100644 Connect2D.m create mode 100644 Cubature2D.m create mode 100644 CubatureData2D.m create mode 100644 CubatureVolumeMesh2D.m create mode 100644 Curl2D.m create mode 100644 CurvedPoissonIPDG2D.m create mode 100644 CurvedPoissonIPDGDriver2D.m create mode 100644 CurvedPoissonIPDGbc2D.m create mode 100644 CutOffFilter2D.m create mode 100644 Div2D.m create mode 100644 Dmatrices2D.m create mode 100644 EquiNodes2D.m create mode 100644 Euler01.neu create mode 100644 Filter2D.m create mode 100644 FindLocalCoords2D.m create mode 100644 GaussFaceMesh2D.m create mode 100644 GeometricFactors2D.m create mode 100644 Globals2D.m create mode 100644 Grad2D.m create mode 100644 GradJacobiP.m create mode 100644 GradSimplex2DP.m create mode 100644 GradVandermonde2D.m create mode 100644 Hrefine2D.m create mode 100644 InterpMatrix2D.m create mode 100644 JacobiGL.m create mode 100644 JacobiGQ.m create mode 100644 JacobiP.m create mode 100644 Lift2D.m create mode 100644 MakeCylinder2D.m create mode 100644 Maxwell00625.neu create mode 100644 Maxwell0125.neu create mode 100644 Maxwell025.neu create mode 100644 Maxwell05.neu create mode 100644 Maxwell1.neu create mode 100644 Maxwell2.neu create mode 100644 Maxwell2D.m create mode 100644 MaxwellCurved2D.m create mode 100644 MaxwellCurvedDriver2D.m create mode 100644 MaxwellCurvedRHS2D.m create mode 100644 MaxwellHNonCon2D.m create mode 100644 MaxwellHNonConDriver2D.m create mode 100644 MaxwellHNonConRHS2D.m create mode 100644 MaxwellPNonCon2D.m create mode 100644 MaxwellPNonConDriver2D.m create mode 100644 MaxwellPNonConRHS2D.m create mode 100644 MeshReaderGambit2D.m create mode 100644 MeshReaderGambitBC2D.m create mode 100644 Nodes2D.m create mode 100644 Normals2D.m create mode 100644 PhysDmatrices2D.m create mode 100644 PlotContour2D.m create mode 100644 PlotMesh2D.m create mode 100644 Poisson2D.m create mode 100644 PoissonDriver2D.m create mode 100644 PoissonIPDG2D.m create mode 100644 PoissonIPDGbc2D.m create mode 100644 PoissonRHS2D.m create mode 100644 Sample2D.m create mode 100644 Simplex2DP.m create mode 100644 Vandermonde1D.m create mode 100644 Vandermonde2D.m create mode 100644 Warpfactor.m create mode 100644 bump025.neu create mode 100644 circA01.neu create mode 100644 dtscale2D.m create mode 100644 edgeDirection.m create mode 100644 edgeLength.m create mode 100644 edgePointCoord.m create mode 100644 meshAdaptiveRefine.asv create mode 100644 meshAdaptiveRefine.m create mode 100644 meshBaryCenter.m create mode 100644 meshConstructEdgeData.m create mode 100644 meshDisp.m create mode 100644 meshMarkForRefine.m create mode 100644 meshPlot.m create mode 100644 meshPlotPrimalDual.m create mode 100644 meshPlotWithIndices.m create mode 100644 meshPlotWithSubdomains.m create mode 100644 meshUniformRefineQuadrilateral.m create mode 100644 meshUniformRefineTriangular.asv create mode 100644 meshUniformRefineTriangular.m create mode 100644 rstoab.m create mode 100644 setRectDomBE.m create mode 100644 setRectDomP.m create mode 100644 setRectDomPJiggle.m create mode 100644 tiConnect2D.m create mode 100644 trgArea.m create mode 100644 trgAreaGradLambda.m create mode 100644 trgCscTheta.m create mode 100644 trgPointCoord.m create mode 100644 trgVecNormal.m create mode 100644 trgVecTangent.m create mode 100644 xytors.m diff --git a/BuildBCMaps2D.m b/BuildBCMaps2D.m new file mode 100644 index 0000000..52ad74a --- /dev/null +++ b/BuildBCMaps2D.m @@ -0,0 +1,23 @@ +function BuildBCMaps2D() + +% function BuildMaps2DBC +% Purpose: Build specialized nodal maps for various types of +% boundary conditions, specified in BCType. + +Globals2D; + +% create label of face nodes with boundary types from BCType +bct = BCType'; +bnodes = ones(Nfp, 1)*bct(:)'; +bnodes = bnodes(:); + +% find location of boundary nodes in face and volume node lists +mapI = find(bnodes==In); vmapI = vmapM(mapI); +mapO = find(bnodes==Out); vmapO = vmapM(mapO); +mapW = find(bnodes==Wall); vmapW = vmapM(mapW); +mapF = find(bnodes==Far); vmapF = vmapM(mapF); +mapC = find(bnodes==Cyl); vmapC = vmapM(mapC); +mapD = find(bnodes==Dirichlet); vmapD = vmapM(mapD); +mapN = find(bnodes==Neuman); vmapN = vmapM(mapN); +mapS = find(bnodes==Slip); vmapS = vmapM(mapS); +return; diff --git a/BuildCurvedOPS2D.m b/BuildCurvedOPS2D.m new file mode 100644 index 0000000..b18ea15 --- /dev/null +++ b/BuildCurvedOPS2D.m @@ -0,0 +1,81 @@ +function [cinfo] = BuildCurvedOPS2D(intN) + +% function [cinfo] = BuildCurvedOPS2D(intN) +% Purpose: build curved info for curvilinear elements + +Globals2D; + +% 1. Create cubature information + +% 1.1 Extract cubature nodes and weights +[cR,cS,cW,Ncub] = Cubature2D(intN); + +% 1.1. Build interpolation matrix (nodes->cubature nodes) +cV = InterpMatrix2D(cR, cS); + +% 1.2 Evaluate derivatives of Lagrange interpolants at cubature nodes +[cDr,cDs] = Dmatrices2D(N, cR, cS, V); + +% 2. Create surface quadrature information + +% 2.1 Compute Gauss nodes and weights for 1D integrals +[gz, gw] = JacobiGQ(0, 0, intN); + +% 2.2 Build Gauss nodes running counter-clockwise on element faces +gR = [gz, -gz, -ones(size(gz))]; +gS = [-ones(size(gz)), gz, -gz]; + +% 2.3 For each face +for f1=1:Nfaces + % 2.3.1 build nodes->Gauss quadrature interpolation and differentiation matrices + gV(:,:,f1) = InterpMatrix2D(gR(:,f1), gS(:,f1)); + [gDr(:,:,f1),gDs(:,:,f1)] = Dmatrices2D(N, gR(:,f1), gS(:,f1), V); +end + +% 3. For each curved element, evaluate custom operator matrices +Ncurved = length(curved); + +% 3.1 Store custom information in array of Matlab structs +cinfo = []; +for c=1:Ncurved + % find next curved element and the coordinates of its nodes + k1 = curved(c); x1 = x(:,k1); y1 = y(:,k1); cinfo(c).elmt = k1; + + % compute geometric factors + [crx,csx,cry,csy,cJ] = GeometricFactors2D(x1,y1,cDr,cDs); + + % build mass matrix + cMM = cV'*diag(cJ.*cW)*cV; cinfo(c).MM = cMM; + + % build physical derivative matrices + cinfo(c).Dx = cMM\(cV'*diag(cW.*cJ)*(diag(crx)*cDr + diag(csx)*cDs)); + cinfo(c).Dy = cMM\(cV'*diag(cW.*cJ)*(diag(cry)*cDr + diag(csy)*cDs)); + + % build individual lift matrices at each face + for f1=1:Nfaces + k2 = EToE(k1,f1); f2 = EToF(k1,f1); + + % compute geometric factors + [grx,gsx,gry,gsy,gJ] = GeometricFactors2D(x1,y1,gDr(:,:,f1),gDs(:,:,f1)); + + % compute normals and surface Jacobian at Gauss points on face f1 + if(f1==1) gnx = -gsx; gny = -gsy; end; + if(f1==2) gnx = grx+gsx; gny = gry+gsy; end; + if(f1==3) gnx = -grx; gny = -gry; end; + + gsJ = sqrt(gnx.*gnx+gny.*gny); + gnx = gnx./gsJ; gny = gny./gsJ; gsJ = gsJ.*gJ; + + % store normals and coordinates at Gauss nodes + cinfo(c).gnx(:,f1) = gnx; cinfo(c).gx(:,f1) = gV(:,:,f1)*x1; + cinfo(c).gny(:,f1) = gny; cinfo(c).gy(:,f1) = gV(:,:,f1)*y1; + + % store Vandermondes for '-' and '+' traces + cinfo(c).gVM(:,:,f1) = gV(:,:,f1); + cinfo(c).gVP(:,:,f1) = gV(end:-1:1,:,f2); + + % compute and store matrix to lift Gauss node data + cinfo(c).glift(:,:,f1) = cMM\(gV(:,:,f1)'*diag(gw.*gsJ)); + end +end +return diff --git a/BuildHNonCon2D.m b/BuildHNonCon2D.m new file mode 100644 index 0000000..465d093 --- /dev/null +++ b/BuildHNonCon2D.m @@ -0,0 +1,96 @@ +function [neighbors] = BuildHNonCon2D(NGauss, tol) + +% function [neighbors] = BuildHNonCon2D(NGauss, tol) +% Purpose: find element to element connections through non-conforming interfaces +% (** elements assumed straight sided **) + +Globals2D; + +% 1. Build Gauss nodes +[gz, gw] = JacobiGQ(0, 0, NGauss-1); + +% 1.1 Find location of vertices of boundary faces +vx1 = VX(EToV(:,[1,2,3])); vx2 = VX(EToV(:,[2,3,1])); +vy1 = VY(EToV(:,[1,2,3])); vy2 = VY(EToV(:,[2,3,1])); + +idB = find(EToE==((1:K)'*ones(1,Nfaces))); +x1 = vx1(idB)'; y1 = vy1(idB)'; +x2 = vx2(idB)'; y2 = vy2(idB)'; + +% 1.2 Find those element-faces that are on boundary faces +[elmtsB,facesB] = find(EToE==((1:K)'*ones(1,Nfaces))); +Nbc = length(elmtsB); + +sk = 1; +% 2.1 For each boundary face +for b1=1:Nbc + % 2.2 Find element and face of this boundary face + k1 = elmtsB(b1); f1 = facesB(b1); + + % 2.3 Find end coordinates of b1'th boundary face + x11 = x1(b1); y11 = y1(b1); x12 = x2(b1); y12 = y2(b1); + + % 2.4 Compute areas, lengths and face coordinates used in intersection + % tests comparing b1'th boundary face with all boundary faces + area1 = abs((x12-x11)*(y1-y11) - (y12-y11)*(x1-x11)); %scale + area2 = abs((x12-x11)*(y2-y11) - (y12-y11)*(x2-x11)); + L = (x12-x11)^2 + (y12-y11)^2 ; + r21 = ((2*x1-x11-x12)*(x12-x11) + (2*y1-y11-y12)*(y12-y11))/L; + r22 = ((2*x2-x11-x12)*(x12-x11) + (2*y2-y11-y12)*(y12-y11))/L; + + % 2.5 Find range of local face coordinate (bracketed between -1 and 1) + r1 = max(-1,min(r21,r22)); r2 = min(1,max(r21,r22)); + + % 2.6 Compute flag for overlap of b1 face with all other boundary faces + flag = area1+area2+(r1<= -1 & r2<= -1)+(r1>=1 & r2>=1)+(r2-r10) + % 3.1 Find matches + r1 = r1(matches); r2 = r2(matches); + + % 3.2 Find end points of boundary-boundary intersections + xy11 = 0.5*[x11;y11]*(1-r1) + 0.5*[x12;y12]*(1+r1); + xy12 = 0.5*[x11;y11]*(1-r2) + 0.5*[x12;y12]*(1+r2); + + % 3.3 For each face-face match + for n=1:Nmatches + + % 3.4 Store which elements intersect + k2 = elmtsB(matches(n)); f2 = facesB(matches(n)); + neighbors{sk}.elmtM = k1; neighbors{sk}.faceM = f1; + neighbors{sk}.elmtP = k2; neighbors{sk}.faceP = f2; + + % 3.5 Build physical Gauss nodes on face fragment + xg = 0.5*(1-gz)*xy11(1,n) + 0.5*(1+gz)*xy12(1,n); + yg = 0.5*(1-gz)*xy11(2,n) + 0.5*(1+gz)*xy12(2,n); + + % 3.6 Find local coordinates of Gauss nodes + [rg1,sg1] = FindLocalCoords2D(k1, xg, yg); + [rg2,sg2] = FindLocalCoords2D(k2, xg, yg); + + % 3.7 Build interpolation matrices for volume nodes ->Gauss nodes + gVM = InterpMatrix2D(rg1,sg1); neighbors{sk}.gVM = gVM; + gVP = InterpMatrix2D(rg2,sg2); neighbors{sk}.gVP = gVP; + + % 3.8 Find face normal + neighbors{sk}.nx = nx(1+(f1-1)*Nfp,k1); + neighbors{sk}.ny = ny(1+(f1-1)*Nfp,k1); + + % 4.0 Build partial face data lift operator + + % 4.1 Compute weights for lifting + partsJ = sqrt( (xy11(1,n)-xy12(1,n))^2 + (xy11(2,n)-xy12(2,n))^2 )/2; + dgw = gw*partsJ/J(1,k1); + + % 4.2 Build matrix to lift Gauss data to volume data + neighbors{sk}.lift = V*V'*(gVM')*diag(dgw); + + sk = sk+1; + end + end +end +return diff --git a/BuildMaps2D.m b/BuildMaps2D.m new file mode 100644 index 0000000..068f9b1 --- /dev/null +++ b/BuildMaps2D.m @@ -0,0 +1,45 @@ +function [mapM, mapP, vmapM, vmapP, vmapB, mapB] = BuildMaps2D() + +% function [mapM, mapP, vmapM, vmapP, vmapB, mapB] = BuildMaps2D +% Purpose: Connectivity and boundary tables in the K # of Np elements + +Globals2D; + +% number volume nodes consecutively +nodeids = reshape(1:K*Np, Np, K); +vmapM = zeros(Nfp, Nfaces, K); vmapP = zeros(Nfp, Nfaces, K); +mapM = (1:K*Nfp*Nfaces)'; mapP = reshape(mapM, Nfp, Nfaces, K); + +% find index of face nodes with respect to volume node ordering +for k1=1:K + for f1=1:Nfaces + vmapM(:,f1,k1) = nodeids(Fmask(:,f1), k1); + end +end + +one = ones(1, Nfp); +for k1=1:K + for f1=1:Nfaces + % find neighbor + k2 = EToE(k1,f1); f2 = EToF(k1,f1); + + % reference length of edge + v1 = EToV(k1,f1); v2 = EToV(k1, 1+mod(f1,Nfaces)); + refd = sqrt( (VX(v1)-VX(v2))^2 + (VY(v1)-VY(v2))^2 ); + + % find find volume node numbers of left and right nodes + vidM = vmapM(:,f1,k1); vidP = vmapM(:,f2,k2); + x1 = x(vidM); y1 = y(vidM); x2 = x(vidP); y2 = y(vidP); + x1 = x1*one; y1 = y1*one; x2 = x2*one; y2 = y2*one; + + % Compute distance matrix + D = (x1 -x2').^2 + (y1-y2').^2; + [idM, idP] = find(sqrt(abs(D))=1 & r2>=1)+(r2-r10) + % 3.1 Find matches + r1 = r1(matches); r2 = r2(matches); + + % 3.2 Find end points of boundary-boundary intersections + xy11 = 0.5*[x11;y11]*(1-r1) + 0.5*[x12;y12]*(1+r1); + xy12 = 0.5*[x11;y11]*(1-r2) + 0.5*[x12;y12]*(1+r2); + + % 3.3 For each face-face match + for n=1:Nmatches + + % 3.4 Store which elements intersect + k2 = elmtsB(matches(n)); f2 = facesB(matches(n)); + neighbors{sk}.elmtM = k1; neighbors{sk}.faceM = f1; + neighbors{sk}.elmtP = k2; neighbors{sk}.faceP = f2; + + % 3.5 Build physical Gauss nodes on face fragment + xg = 0.5*(1-gz)*xy11(1,n) + 0.5*(1+gz)*xy12(1,n); + yg = 0.5*(1-gz)*xy11(2,n) + 0.5*(1+gz)*xy12(2,n); + + % 3.6 Find local coordinates of Gauss nodes + [rg1,sg1] = FindLocalCoords2D(k1, xg, yg); + [rg2,sg2] = FindLocalCoords2D(k2, xg, yg); + + % 3.7 Build interpolation matrices for volume nodes ->Gauss nodes + gVM = InterpMatrix2D(rg1,sg1); neighbors{sk}.gVM = gVM; + gVP = InterpMatrix2D(rg2,sg2); neighbors{sk}.gVP = gVP; + + % 3.8 Find face normal + neighbors{sk}.nx = nx(1+(f1-1)*Nfp,k1); + neighbors{sk}.ny = ny(1+(f1-1)*Nfp,k1); + + % 4.0 Build partial face data lift operator + + % 4.1 Compute weights for lifting + partsJ = sqrt( (xy11(1,n)-xy12(1,n))^2 + (xy11(2,n)-xy12(2,n))^2 )/2; + dgw = gw*partsJ/J(1,k1); + + % 4.2 Build matrix to lift Gauss data to volume data + neighbors{sk}.lift = V*V'*(gVM')*diag(dgw); + + sk = sk+1; + end + end +end +return diff --git a/BuildPNonCon2D.m b/BuildPNonCon2D.m new file mode 100644 index 0000000..78b7b1b --- /dev/null +++ b/BuildPNonCon2D.m @@ -0,0 +1,150 @@ +function pinfo = BuildPNonCon2D(Norder, pK, pVX, pVY, pEToV, pBCType) + +% function pinfo = BuildPNonCon2D(Norder, pK, pVX, pVY, pEToV, pBCType) +% Purpose: construct info necessary for DGTD on P-nonconforming meshes + +Globals2D; + +% Find maximum requested polynomial order +Nmax = max(Norder); + +% Mesh details +Nfaces = 3; NODETOL = 1e-12; VX = pVX; VY = pVY; + +kmap = zeros(pK,2); +sk = 1; + +% Perform a mini StartUp2D for the elements of each order +for N=1:Nmax + + % load N'th order polynomial nodes + Np = (N+1)*(N+2)/2; Nfp = N+1; + [r,s] = Nodes2D(N); [r,s] = xytors(r,s); + + % Find list of N'th order nodes on each face of the reference element + ids1 = find(abs(1+s)0) + + % Use the subset of elements of order N + EToV = pEToV(ksN,:); BCType = pBCType(ksN,:); + kmap(ksN,1) = 1:K; kmap(ksN,2) = N; + + % Build coordinates of all the nodes + va = EToV(:,1)'; vb = EToV(:,2)'; vc = EToV(:,3)'; + x = 0.5*(-(r+s)*VX(va)+(1+r)*VX(vb)+(1+s)*VX(vc)); + y = 0.5*(-(r+s)*VY(va)+(1+r)*VY(vb)+(1+s)*VY(vc)); + + % Calculate geometric factors + [rx,sx,ry,sy,J] = GeometricFactors2D(x,y,Dr,Ds); + [nx, ny, sJ] = Normals2D(); + Fscale = sJ./(J(Fmask,:)); + + % Calculate element connections on this mesh + [EToE, EToF] = tiConnect2D(EToV); + [mapM, mapP, vmapM, vmapP, vmapB, mapB] = BuildMaps2D(); + BuildBCMaps2D(); + pinfo(N).mapW = mapW; + + % Compute triangulation of N'th order nodes on mesh + triN = delaunay(r, s); + alltri = []; + for k=1:K + alltri = [alltri; triN+(k-1)*Np]; + end + + % Store geometric inforatmion in pinfo struct + pinfo(N).rx = rx; pinfo(N).sx = sx; pinfo(N).ry = ry; pinfo(N).sy = sy; + pinfo(N).nx = nx; pinfo(N).ny = ny; pinfo(N).sJ = sJ; pinfo(N).J = J; + pinfo(N).x = x; pinfo(N).y = y; pinfo(N).Fscale = Fscale; + + pinfo(N).K = K; pinfo(N).ks = ksN; pinfo(N).tri = alltri; + + % Store location of the N'th order nodes in a global vector + pinfo(N).ids = reshape(sk:sk+K*Np-1, Np, K); + sk = sk+K*Np; + end +end + +% For each possible order +for N1=1:Nmax + % generate face L2projection matrices (from order N2 to order N1 face space) + for N2=1:Nmax + + % Set up sufficient Gauss quadrature to exactly perform surface integrals + [gz, gw] = JacobiGQ(0, 0, max(N1,N2)); + + % All edges have same distribution (note special Fmask) + rM = pinfo(N1).r(pinfo(N1).Fmask(:,1)); + rP = pinfo(N2).r(pinfo(N2).Fmask(:,1)); + + % Build N2 to N1 projection matrices for '+' trace data + interpM = Vandermonde1D(N1, gz)/Vandermonde1D(N1, rM); + interpP = Vandermonde1D(N2, gz(end:-1:1))/Vandermonde1D(N2, rP); + + % Face mass matrix used in projection + mmM = interpM'*diag(gw)*interpM; + + pinfo(N1).interpP{N2} = mmM\(interpM'*diag(gw)*interpP); + end +end + +% Generate neighbor information for all faces +[EToE, EToF] = tiConnect2D(pEToV); + +% For each possible polynomial order +for N1=1:Nmax + + % Create a set of indexing arrays, one for each possible neighbor order + pinfo(N1).fmapM = cell(Nmax,1); + pinfo(N1).vmapP = cell(Nmax,1); + + for N2=1:Nmax + pinfo(N1).fmapM{N2} = []; + pinfo(N1).vmapP{N2} = []; + end + + % Loop through all elements of order N1 + for k1=1:pinfo(N1).K + + % Find element in original mesh + k1orig = pinfo(N1).ks(k1); + + % Check all it's faces + for f1=1:Nfaces + % Find neighboring element (i.e. it's order and location in N2 mesh) + k2orig = EToE(k1orig,f1); + f2 = EToF(k1orig,f1); + k2 = kmap(k2orig,1); + N2 = kmap(k2orig,2); + + % Compute location of face nodes of '-' trace + idsM = (k1-1)*pinfo(N1).Nfp*Nfaces + (f1-1)*pinfo(N1).Nfp; + idsM = idsM+1:idsM+pinfo(N1).Nfp; + + % Find location of volume nodes on '+' trace of (k1orig,f1) + idsP = pinfo(N2).ids(pinfo(N2).Fmask(:,f2), k2); + + % Store node locations in cell arrays + pinfo(N1).fmapM{N2} = [pinfo(N1).fmapM{N2}, idsM]; + pinfo(N1).vmapP{N2} = [pinfo(N1).vmapP{N2}, idsP]; + + end + end +end +return; diff --git a/BuildPeriodicMaps2D.m b/BuildPeriodicMaps2D.m new file mode 100644 index 0000000..0aa0e03 --- /dev/null +++ b/BuildPeriodicMaps2D.m @@ -0,0 +1,88 @@ +function BuildPeriodicMaps2D(xperiod, yperiod) + +% function [] = BuildPeriodicMaps2D(xperiod, yperiod); +% Purpose: Connectivity and boundary tables for with all maps returned +% in Globals2D assuming periodicity + +Globals2D; + +% Find node to node connectivity +vmapM = zeros(K*Nfaces*Nfp,1); vmapP = zeros(K*Nfaces*Nfp,1); + +for k1=1:K + for f1=1:Nfaces + k2 = EToE(k1,f1); f2 = EToF(k1,f1); + + vidL = Fmask(:,f1) + (k1-1)*Np; vidR = Fmask(:,f2) + (k2-1)*Np; + + fidL = (1:Nfp) + (f1-1)*Nfp + (k1-1)*Nfp*Nfaces; + fidR = (1:Nfp) + (f2-1)*Nfp + (k2-1)*Nfp*Nfaces; + + vmapM(fidL) = vidL; vmapP(fidL) = vidL; + + x1 = Fx(fidL')*ones(1,Nfp); y1 = Fy(fidL')*ones(1,Nfp); + x2 = Fx(fidR')*ones(1,Nfp); y2 = Fy(fidR')*ones(1,Nfp); + + % Compute distance matrix + D = (x1-x2').^2+(y1-y2').^2; + + [idL, idR] = find(abs(D) Gauss node interpolation matrix + gVM = gauss.finterp(:,:,f1); + gVP = gauss.finterp(:,:,f2); gVP = gVP(NGauss:-1:1,:); + + % Evaluate spatial derivatives of Lagrange basis function at Gauss nodes + [gDxM, gDyM] = PhysDmatrices2D(x(:,k1), y(:,k1),gVM); + [gDxP, gDyP] = PhysDmatrices2D(x(:,k2), y(:,k2),gVP); + + % Evaluate normals at Gauss nodes on face + gnx = spdiags(gauss.nx(idsM, k1), 0, NGauss, NGauss); + gny = spdiags(gauss.ny(idsM, k1), 0, NGauss, NGauss); + gw = spdiags(gauss.W(idsM, k1), 0, NGauss, NGauss); + + % Compute normal derivatives of Lagrange basis functions at Gauss nodes + gDnM = gnx*gDxM + gny*gDyM; + gDnP = gnx*gDxP + gny*gDyP; + + % Locate global numbers of Lagrange nodes in neighboring element + cols2 = ones(Np,1)*((k2-1)*Np+1:k2*Np); + + % Find minimum height of two elements sharing this face + hinv = max(Fscale( 1 + (f1-1)*Nfp, k1), Fscale( 1 + (f2-1)*Nfp, k2)); + + % Set penalty scaling + gtau = 20*(N+1)*(N+1)*hinv; + + % Determine type of face + switch(BCType(k1,f1)) + case {Dirichlet} + % Dirichlet boundary face variational terms + OP11 = OP11 + ( gVM'*gw*gtau*gVM - gVM'*gw*gDnM - gDnM'*gw*gVM); + + case {Neuman} + % Do nothing + otherwise + % Interior face variational terms for stiffness matrix + OP11 = OP11 + 0.5*( gVM'*gw*gtau*gVM - gVM'*gw*gDnM - gDnM'*gw*gVM ); + + OP12 = - 0.5*( gVM'*gw*gtau*gVP + gVM'*gw*gDnP - gDnM'*gw*gVP ); + + % Store self-neighbor interaction term in global stiffness matrix + OP(entries(:), :) = [rows1(:), cols2(:), OP12(:)]; + entries = entries + Np*Np; + end + end + + % Store k1'th self-self interaction term in global stiffness matrix + OP(entries(:), :) = [rows1(:), cols1(:), OP11(:)]; + MM(entriesMM(:), :) = [rows1(:), cols1(:), locmm(:)]; + entries = entries + Np*Np; entriesMM = entriesMM + Np*Np; +end + +% Convert OP and MM from coordinate storage format to Matlab's intrinsic sparse matrix format +OP = OP(1:max(entries)-Np*Np,:); +OP = myspconvert(OP, Np*K, Np*K, 1e-15); MM = myspconvert(MM, Np*K, Np*K, 1e-15); +return diff --git a/CurvedPoissonIPDGDriver2D.m b/CurvedPoissonIPDGDriver2D.m new file mode 100644 index 0000000..dc68904 --- /dev/null +++ b/CurvedPoissonIPDGDriver2D.m @@ -0,0 +1,50 @@ +% Driver script for solving the 2D Poisson equation on curvilinear domains +Globals2D; + +% Polynomial order used for approximation +N = 6; + +% Read in Mesh +[Nv, VX, VY, K, EToV] = MeshReaderGambitBC2D('circA01.neu'); + +% Initialize solver and construct grid and metric +StartUp2D; + +% hard coded for all Dirichlet boundaries to be on cylinder +[k,f] = find(BCType==Dirichlet); +if(~isempty(k)) + cylfaces = [k,f]; + curved = sort(unique(k)); straight = setdiff(1:K, curved); + MakeCylinder2D(cylfaces, 1, 0, 0); +end + +% choose order to integrate exactly +Nint = ceil(2*N/2); + +% build cubature nodes for all elements +CubatureOrder = 2*(Nint+1); cub = CubatureVolumeMesh2D(CubatureOrder); + +% build Gauss node data for all element faces +NGauss = (Nint+1); gauss = GaussFaceMesh2D(NGauss); + +% build weak Poisson operator matrices +[A, M] = CurvedPoissonIPDG2D(); +Abc = CurvedPoissonIPDGbc2D(); + +% set up right hand side +f = (-2*pi^2-1)*sin(pi*x).*sin(pi*y); + +% set up boundary condition +ubc = zeros(gauss.NGauss*Nfaces*K,1); +xbc = gauss.x(gauss.mapD); ybc = gauss.y(gauss.mapD); +ubc(gauss.mapD) = sin(pi*xbc).*sin(pi*ybc); +xbc = gauss.x(gauss.mapN); ybc = gauss.y(gauss.mapN); +ubc(gauss.mapN) = ... + gauss.nx(gauss.mapN).*(pi*cos(pi*xbc).*sin(pi*ybc)) + ... + gauss.ny(gauss.mapN).*(pi*sin(pi*xbc).*cos(pi*ybc)); + +ubc = Abc*ubc; + +% solve linear system +solvec = (A+M)\(M*(-f(:)) + ubc); +u = reshape(solvec, Np, K); diff --git a/CurvedPoissonIPDGbc2D.m b/CurvedPoissonIPDGbc2D.m new file mode 100644 index 0000000..ca0f424 --- /dev/null +++ b/CurvedPoissonIPDGbc2D.m @@ -0,0 +1,51 @@ +function [BOP] = CurvedPoisson2DIPDGbc2D() + +% function [BOP] = CurvedPoissonIPDGbc2D() +% Purpose: Set up the discrete Poisson matrix directly +% using LDG. The operator is set up in the weak form +Globals2D; + +NGauss = gauss.NGauss; +% build DG derivative matrices +BOP = zeros(K*Np*Np*(1+Nfaces), 3); + +% global node numbering +entries = (1:Np*NGauss)'; cols1 = ones(Np,1)*(1:NGauss); +for k1=1:K + if(~mod(k1,200)) k1, end; + rows1 = ((k1-1)*Np+1:k1*Np)'*ones(1,NGauss); + + % Build element-to-element parts of operator + for f1=1:Nfaces + if(BCType(k1,f1)) + idsM = (f1-1)*NGauss+1:f1*NGauss; + + VM = gauss.finterp(:,:,f1); + [dVdxM, dVdyM] = PhysDmatrices2D(x(:,k1), y(:,k1),VM); + gnx = spdiags(gauss.nx(idsM, k1), 0, NGauss, NGauss); + gny = spdiags(gauss.ny(idsM, k1), 0, NGauss, NGauss); + gw = spdiags(gauss.W(idsM, k1), 0, NGauss, NGauss); + + DnM = gnx*dVdxM + gny*dVdyM; + + hinv = Fscale( 1 + (f1-1)*Nfp, k1); + + BOP11 = zeros(Np,Nfp); + + gtau = 20*(N+1)*(N+1)*hinv; % set penalty scaling + switch(BCType(k1,f1)) + case {Dirichlet} + BOP11 = ( VM'*gw*gtau - DnM'*gw ); + case {Neuman} + BOP11 = ( VM'*gw ); % recent sign change + end + + BOP(entries(:), :) = [rows1(:), cols1(:), BOP11(:)]; entries = entries + Np*NGauss; + end + cols1 = cols1 + NGauss; + end +end +Nentries = max(max(entries))-Np*NGauss; +BOP = BOP(1:Nentries,:); +BOP = myspconvert(BOP, Np*K, NGauss*Nfaces*K, 1e-15); +return diff --git a/CutOffFilter2D.m b/CutOffFilter2D.m new file mode 100644 index 0000000..2937699 --- /dev/null +++ b/CutOffFilter2D.m @@ -0,0 +1,22 @@ +function [F] = CutOffFilter2D(Nc,frac) + +% function [F] = CutOffFilter2D(Nc,frac) +% Purpose : Initialize 2D cut off filter matrix of order Norderin + +Globals2D; + +filterdiag = ones(Np,1); + +% build exponential filter +sk = 1; +for i=0:N + for j=0:N-i + if (i+j>=Nc) + filterdiag(sk) = frac; + end + sk = sk+1; + end +end + +F = V*diag(filterdiag)*invV; +return; diff --git a/Div2D.m b/Div2D.m new file mode 100644 index 0000000..9f5260a --- /dev/null +++ b/Div2D.m @@ -0,0 +1,10 @@ +function [divu] = Div2D(u,v); + +% function [divu] = Div2D(u,v); +% Purpose: Compute the 2D divergence of the vectorfield (u,v) + +Globals2D; + +ur = Dr*u; us = Ds*u; vr = Dr*v; vs = Ds*v; +divu = rx.*ur + sx.*us + ry.*vr + sy.*vs; +return; diff --git a/Dmatrices2D.m b/Dmatrices2D.m new file mode 100644 index 0000000..95c6537 --- /dev/null +++ b/Dmatrices2D.m @@ -0,0 +1,9 @@ +function [Dr,Ds] = Dmatrices2D(N,r,s,V) + +% function [Dr,Ds] = Dmatrices2D(N,r,s,V) +% Purpose : Initialize the (r,s) differentiation matrices +% on the simplex, evaluated at (r,s) at order N + +[Vr, Vs] = GradVandermonde2D(N, r, s); +Dr = Vr/V; Ds = Vs/V; +return; diff --git a/EquiNodes2D.m b/EquiNodes2D.m new file mode 100644 index 0000000..7409559 --- /dev/null +++ b/EquiNodes2D.m @@ -0,0 +1,21 @@ +function [x,y] = EquiNodes2D(N); + +% function [x,y] = EquiNodes2D(N); +% Purpose : Compute (x,y) nodes in equilateral triangle for polynomial of order N + +% total number of nodes +Np = (N+1)*(N+2)/2; + +% Create equidistributed nodes on equilateral triangle +L1 = zeros(Np,1); L2 = zeros(Np,1); L3 = zeros(Np,1); +sk = 1; +for n=1:N+1 + for m=1:N+2-n + L1(sk) = (n-1)/N; L3(sk) = (m-1)/N; + sk = sk+1; + end +end +L2 = 1.0-L1-L3; + +x = -L2+L3; y = (-L2-L3+2*L1)/sqrt(3.0); +return diff --git a/Euler01.neu b/Euler01.neu new file mode 100644 index 0000000..9c48579 --- /dev/null +++ b/Euler01.neu @@ -0,0 +1,1066 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:53:26 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 328 574 1 3 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 6.00000000000e-01 2.00000000000e-01 + 2 3.00000000000e+00 2.00000000000e-01 + 3 7.00000000000e-01 2.00000000000e-01 + 4 8.00000000000e-01 2.00000000000e-01 + 5 9.00000000000e-01 2.00000000000e-01 + 6 1.00000000000e+00 2.00000000000e-01 + 7 1.10000000000e+00 2.00000000000e-01 + 8 1.20000000000e+00 2.00000000000e-01 + 9 1.30000000000e+00 2.00000000000e-01 + 10 1.40000000000e+00 2.00000000000e-01 + 11 1.50000000000e+00 2.00000000000e-01 + 12 1.60000000000e+00 2.00000000000e-01 + 13 1.70000000000e+00 2.00000000000e-01 + 14 1.80000000000e+00 2.00000000000e-01 + 15 1.90000000000e+00 2.00000000000e-01 + 16 2.00000000000e+00 2.00000000000e-01 + 17 2.10000000000e+00 2.00000000000e-01 + 18 2.20000000000e+00 2.00000000000e-01 + 19 2.30000000000e+00 2.00000000000e-01 + 20 2.40000000000e+00 2.00000000000e-01 + 21 2.50000000000e+00 2.00000000000e-01 + 22 2.60000000000e+00 2.00000000000e-01 + 23 2.70000000000e+00 2.00000000000e-01 + 24 2.80000000000e+00 2.00000000000e-01 + 25 2.90000000000e+00 2.00000000000e-01 + 26 3.00000000000e+00 1.00000000000e+00 + 27 3.00000000000e+00 3.00000000000e-01 + 28 3.00000000000e+00 4.00000000000e-01 + 29 3.00000000000e+00 5.00000000000e-01 + 30 3.00000000000e+00 6.00000000000e-01 + 31 3.00000000000e+00 7.00000000000e-01 + 32 3.00000000000e+00 8.00000000000e-01 + 33 3.00000000000e+00 9.00000000000e-01 + 34 0.00000000000e+00 1.00000000000e+00 + 35 2.90000000000e+00 1.00000000000e+00 + 36 2.80000000000e+00 1.00000000000e+00 + 37 2.70000000000e+00 1.00000000000e+00 + 38 2.60000000000e+00 1.00000000000e+00 + 39 2.50000000000e+00 1.00000000000e+00 + 40 2.40000000000e+00 1.00000000000e+00 + 41 2.30000000000e+00 1.00000000000e+00 + 42 2.20000000000e+00 1.00000000000e+00 + 43 2.10000000000e+00 1.00000000000e+00 + 44 2.00000000000e+00 1.00000000000e+00 + 45 1.90000000000e+00 1.00000000000e+00 + 46 1.80000000000e+00 1.00000000000e+00 + 47 1.70000000000e+00 1.00000000000e+00 + 48 1.60000000000e+00 1.00000000000e+00 + 49 1.50000000000e+00 1.00000000000e+00 + 50 1.40000000000e+00 1.00000000000e+00 + 51 1.30000000000e+00 1.00000000000e+00 + 52 1.20000000000e+00 1.00000000000e+00 + 53 1.10000000000e+00 1.00000000000e+00 + 54 1.00000000000e+00 1.00000000000e+00 + 55 9.00000000000e-01 1.00000000000e+00 + 56 8.00000000000e-01 1.00000000000e+00 + 57 7.00000000000e-01 1.00000000000e+00 + 58 6.00000000000e-01 1.00000000000e+00 + 59 5.00000000000e-01 1.00000000000e+00 + 60 4.00000000000e-01 1.00000000000e+00 + 61 3.00000000000e-01 1.00000000000e+00 + 62 2.00000000000e-01 1.00000000000e+00 + 63 1.00000000000e-01 1.00000000000e+00 + 64 0.00000000000e+00 0.00000000000e+00 + 65 0.00000000000e+00 9.00000000000e-01 + 66 0.00000000000e+00 8.00000000000e-01 + 67 0.00000000000e+00 7.00000000000e-01 + 68 0.00000000000e+00 6.00000000000e-01 + 69 0.00000000000e+00 5.00000000000e-01 + 70 0.00000000000e+00 4.00000000000e-01 + 71 0.00000000000e+00 3.00000000000e-01 + 72 0.00000000000e+00 2.00000000000e-01 + 73 0.00000000000e+00 1.00000000000e-01 + 74 6.00000000000e-01 0.00000000000e+00 + 75 1.00000000000e-01 0.00000000000e+00 + 76 2.00000000000e-01 0.00000000000e+00 + 77 3.00000000000e-01 0.00000000000e+00 + 78 4.00000000000e-01 0.00000000000e+00 + 79 5.00000000000e-01 0.00000000000e+00 + 80 6.00000000000e-01 1.00000000000e-01 + 81 2.92999755901e+00 2.70337143289e-01 + 82 2.93678854373e+00 6.49377871561e-01 + 83 2.93049417576e+00 9.29113957166e-01 + 84 6.99304299326e-02 6.99668351832e-02 + 85 7.01550219299e-02 9.29946830199e-01 + 86 5.32356127771e-01 7.03337932211e-02 + 87 2.84532635591e+00 9.15092212449e-01 + 88 2.84426680190e+00 2.83683184006e-01 + 89 5.10680360304e-01 1.64332298916e-01 + 90 9.61175403073e-02 1.62211916555e-01 + 91 1.55597557203e-01 8.28356669481e-02 + 92 1.56067777330e-01 9.16880866105e-01 + 93 4.49013397803e-01 8.27964979012e-02 + 94 2.90406384786e+00 3.63124002239e-01 + 95 9.66028886614e-02 8.37665032098e-01 + 96 2.90584997596e+00 8.35338763371e-01 + 97 8.47813433726e-02 7.33796588990e-01 + 98 2.92198836565e+00 7.32589295437e-01 + 99 3.51976362430e-01 8.61301974081e-02 + 100 2.91744899933e+00 4.66999713495e-01 + 101 2.53576547728e-01 8.63745127935e-02 + 102 8.33755089677e-02 2.66067169059e-01 + 103 2.54417619078e-01 9.12615238993e-01 + 104 2.74747802163e+00 9.10309038779e-01 + 105 2.74610983630e+00 2.87811606055e-01 + 106 2.64809370104e+00 9.09297543054e-01 + 107 2.64647877141e+00 2.89049791988e-01 + 108 2.92158493317e+00 5.65699226265e-01 + 109 8.01165651091e-02 3.65080114162e-01 + 110 3.53958782787e-01 9.10774705422e-01 + 111 8.43137369052e-02 6.33318052972e-01 + 112 6.50601351523e-02 4.49309419509e-01 + 113 8.05818681695e-02 5.33324734105e-01 + 114 4.54145836099e-01 9.10616569521e-01 + 115 1.55919889168e+00 9.27487967147e-01 + 116 2.54819052567e+00 9.11245915748e-01 + 117 2.54573841679e+00 2.89246403116e-01 + 118 2.44508335559e+00 2.90443214430e-01 + 119 2.44869271374e+00 9.13411482625e-01 + 120 5.54235315506e-01 9.10470652955e-01 + 121 2.34456036456e+00 2.91286423442e-01 + 122 2.34939805540e+00 9.14402910877e-01 + 123 6.54275718136e-01 9.10433178078e-01 + 124 7.54316336844e-01 9.10515036937e-01 + 125 2.25031238920e+00 9.13909346957e-01 + 126 2.24385748948e+00 2.91049051967e-01 + 127 2.15114509347e+00 9.12935991335e-01 + 128 2.14308339636e+00 2.90363624264e-01 + 129 8.54346990541e-01 9.10635188111e-01 + 130 9.54371820358e-01 9.10713818524e-01 + 131 2.05159837522e+00 9.12232326015e-01 + 132 2.04249723765e+00 2.89797811511e-01 + 133 1.94214939707e+00 2.89431791984e-01 + 134 1.95155568097e+00 9.11876067919e-01 + 135 1.05437596226e+00 9.10703448587e-01 + 136 1.84200550864e+00 2.89176816304e-01 + 137 1.85098952424e+00 9.11885400851e-01 + 138 1.15449811277e+00 9.10506979279e-01 + 139 1.25517664984e+00 9.09879371953e-01 + 140 1.35816662856e+00 9.07803814014e-01 + 141 1.74202786761e+00 2.88935057243e-01 + 142 1.64215755323e+00 2.88680516876e-01 + 143 1.74984837769e+00 9.12510032516e-01 + 144 1.64915466591e+00 9.15161114240e-01 + 145 1.54235171771e+00 2.88444728219e-01 + 146 1.47077830058e+00 8.99029213640e-01 + 147 1.44257720557e+00 2.88307214442e-01 + 148 2.39512845302e+00 6.72560986548e-01 + 149 1.34279942213e+00 2.88298242814e-01 + 150 1.24299719696e+00 2.88360739883e-01 + 151 1.14309586013e+00 2.88433823397e-01 + 152 1.04301249245e+00 2.88453514788e-01 + 153 9.42624390287e-01 2.88357871790e-01 + 154 8.41708785548e-01 2.88022891932e-01 + 155 7.39938435462e-01 2.87146783441e-01 + 156 6.36891096934e-01 2.84440806319e-01 + 157 5.33984198220e-01 2.72738152644e-01 + 158 2.79486347044e+00 3.73391029212e-01 + 159 2.83886089563e+00 4.43304771915e-01 + 160 2.83673228936e+00 5.35609218256e-01 + 161 2.69495458775e+00 3.79435667303e-01 + 162 2.59316916776e+00 3.76955602441e-01 + 163 2.49195813491e+00 3.79205478561e-01 + 164 2.39103133060e+00 3.82622552790e-01 + 165 2.28938667282e+00 3.82879219994e-01 + 166 2.18738024513e+00 3.81269188861e-01 + 167 2.08589552196e+00 3.79943025851e-01 + 168 1.98496651205e+00 3.79121523174e-01 + 169 1.88447133060e+00 3.78618681810e-01 + 170 1.78432440104e+00 3.78203447473e-01 + 171 1.68445302064e+00 3.77709069541e-01 + 172 1.58476346265e+00 3.77158709268e-01 + 173 1.48516187283e+00 3.76735049579e-01 + 174 1.38559179784e+00 3.76591660847e-01 + 175 1.28600342306e+00 3.76680318547e-01 + 176 1.18629673637e+00 3.76844895141e-01 + 177 1.08633704673e+00 3.76930920315e-01 + 178 9.85943960355e-01 3.76833932887e-01 + 179 8.84882826964e-01 3.76421920649e-01 + 180 7.82648807949e-01 3.75418437658e-01 + 181 6.78195820048e-01 3.73086839088e-01 + 182 2.79804156851e+00 8.23259755619e-01 + 183 2.84458600256e+00 7.50451904205e-01 + 184 2.84986097964e+00 6.48851847251e-01 + 185 2.69768585440e+00 8.16271817615e-01 + 186 2.59557953724e+00 8.19967600033e-01 + 187 2.49632723514e+00 8.24930117624e-01 + 188 2.39820330571e+00 8.29076425379e-01 + 189 2.30068819772e+00 8.28879301756e-01 + 190 2.20305351701e+00 8.26544925881e-01 + 191 2.10430085256e+00 8.24828060268e-01 + 192 2.00454766795e+00 8.23902927176e-01 + 193 1.90387957447e+00 8.23618735493e-01 + 194 1.80190774299e+00 8.24069264222e-01 + 195 1.69702279365e+00 8.26064154797e-01 + 196 1.58281810111e+00 8.33750066338e-01 + 197 2.06183414655e-01 8.28265313706e-01 + 198 1.63335974963e-01 7.59267219463e-01 + 199 1.69888136173e-01 6.69138648518e-01 + 200 1.67344346202e-01 5.63506490917e-01 + 201 3.06445357500e-01 8.20960993043e-01 + 202 4.07805085346e-01 8.21442187498e-01 + 203 5.08054963586e-01 8.20966262828e-01 + 204 6.08196610853e-01 8.20742585601e-01 + 205 7.08375805419e-01 8.20833966701e-01 + 206 8.08582998489e-01 8.21085643504e-01 + 207 9.08728391758e-01 8.21323779095e-01 + 208 1.00876442261e+00 8.21431214929e-01 + 209 1.10869736142e+00 8.21309880373e-01 + 210 1.20858717374e+00 8.20786344065e-01 + 211 1.30842973446e+00 8.19373900980e-01 + 212 1.40722282315e+00 8.15507391278e-01 + 213 2.05569992582e-01 1.70984115226e-01 + 214 1.62228617820e-01 2.40931760936e-01 + 215 1.65970377299e-01 3.32912874870e-01 + 216 1.54609537665e-01 4.47810607089e-01 + 217 4.05976036180e-01 1.69599008955e-01 + 218 1.49516807037e+00 8.03192444893e-01 + 219 4.52617734192e-01 2.47691689414e-01 + 220 2.74588719757e+00 4.79331523499e-01 + 221 2.75291804645e+00 7.15697085083e-01 + 222 2.56384623614e-01 7.24689648151e-01 + 223 3.62077260673e-01 7.33096890139e-01 + 224 4.61527791607e-01 7.31551444247e-01 + 225 5.61547606896e-01 7.30928141432e-01 + 226 6.61951227045e-01 7.30921185698e-01 + 227 7.62529113380e-01 7.31337616952e-01 + 228 8.63036059409e-01 7.31810939150e-01 + 229 9.63311362477e-01 7.32119998825e-01 + 230 1.06331182244e+00 7.32170268530e-01 + 231 1.16299503609e+00 7.31854765960e-01 + 232 1.26224608788e+00 7.30960741182e-01 + 233 1.36058309119e+00 7.29013235149e-01 + 234 2.63999191463e+00 4.64130214643e-01 + 235 2.54077323915e+00 4.63083678638e-01 + 236 2.44086351707e+00 4.73427116373e-01 + 237 2.33767310107e+00 4.76570924565e-01 + 238 2.23301079604e+00 4.72843618184e-01 + 239 2.13016535706e+00 4.70342857413e-01 + 240 2.02851415577e+00 4.68938009349e-01 + 241 1.92753953294e+00 4.68193560804e-01 + 242 1.82702320142e+00 4.67729245547e-01 + 243 1.72695470279e+00 4.67148301477e-01 + 244 1.62727012584e+00 4.66261522392e-01 + 245 1.52779629935e+00 4.65341093400e-01 + 246 1.42840665358e+00 4.64851505719e-01 + 247 1.32906279503e+00 4.64910956070e-01 + 248 1.22962306212e+00 4.65215666979e-01 + 249 1.12990956749e+00 4.65442667991e-01 + 250 1.02976615033e+00 4.65446029677e-01 + 251 9.29007034640e-01 4.65120744590e-01 + 252 8.27363141094e-01 4.64300043010e-01 + 253 7.24399355500e-01 4.62683118308e-01 + 254 2.64179515400e+00 7.27396128750e-01 + 255 2.54071988684e+00 7.31797971037e-01 + 256 2.44440368753e+00 7.43475018406e-01 + 257 2.35042658067e+00 7.46367460186e-01 + 258 2.25641866703e+00 7.41013756570e-01 + 259 2.15876720020e+00 7.37779004092e-01 + 260 2.05930676399e+00 7.36057352115e-01 + 261 1.95885467546e+00 7.35298016818e-01 + 262 1.85753142256e+00 7.35292242110e-01 + 263 1.75507821075e+00 7.36099510098e-01 + 264 1.65152969427e+00 7.37579514534e-01 + 265 3.06001353332e-01 1.76432567518e-01 + 266 2.56260692234e-01 2.73930729043e-01 + 267 2.55121800465e-01 6.08802309900e-01 + 268 5.68578573713e-01 3.67493566262e-01 + 269 2.49871240790e-01 3.89347488672e-01 + 270 3.27697575449e-01 6.50990138224e-01 + 271 1.45686475694e+00 7.25723345021e-01 + 272 1.55366122565e+00 7.30960761995e-01 + 273 4.14512213384e-01 6.41930801557e-01 + 274 5.13912251082e-01 6.41021155861e-01 + 275 6.14626625548e-01 6.40657840158e-01 + 276 7.15921277400e-01 6.41341053884e-01 + 277 8.17132283195e-01 6.42175769841e-01 + 278 9.17952678597e-01 6.42782366288e-01 + 279 1.01831136209e+00 6.43058080144e-01 + 280 1.11821508477e+00 6.42981047610e-01 + 281 1.21765437256e+00 6.42491010030e-01 + 282 1.31656402813e+00 6.41511728652e-01 + 283 3.65942450276e-01 2.62841450398e-01 + 284 3.33539984140e-01 3.43753387496e-01 + 285 4.43552762772e-01 3.57524022908e-01 + 286 2.54337501324e-01 4.98974700205e-01 + 287 6.19666358424e-01 4.59862883850e-01 + 288 2.75720464886e+00 5.97289509846e-01 + 289 2.66704755675e+00 5.58188340451e-01 + 290 2.68057376567e+00 6.46914832099e-01 + 291 2.58608298175e+00 5.35950291898e-01 + 292 2.58377123243e+00 6.31069668564e-01 + 293 2.50111144520e+00 5.56288229353e-01 + 294 2.47788051964e+00 6.50224234307e-01 + 295 2.39187741810e+00 5.76457418220e-01 + 296 2.27893577959e+00 5.65177355573e-01 + 297 1.61193176951e+00 6.44497778385e-01 + 298 2.17455212794e+00 5.60829670909e-01 + 299 2.07251417203e+00 5.58724966588e-01 + 300 1.97124520361e+00 5.57700320755e-01 + 301 1.87030453519e+00 5.57257978184e-01 + 302 1.76969309537e+00 5.56947924784e-01 + 303 1.66975690040e+00 5.56005247387e-01 + 304 1.57037447854e+00 5.54346650730e-01 + 305 1.47117018190e+00 5.53035424065e-01 + 306 1.37214791588e+00 5.52906370312e-01 + 307 1.27310347473e+00 5.53477546801e-01 + 308 1.17371585745e+00 5.53962479731e-01 + 309 1.07388859136e+00 5.54157079926e-01 + 310 9.73544986922e-01 5.54007026813e-01 + 311 8.72572424678e-01 5.53461989637e-01 + 312 7.70847646773e-01 5.52434325342e-01 + 313 2.31413671433e+00 6.56816081911e-01 + 314 2.21638752277e+00 6.51141590209e-01 + 315 2.11618909117e+00 6.48377521022e-01 + 316 2.01545530479e+00 6.47010638098e-01 + 317 1.91443403807e+00 6.46484064698e-01 + 318 1.81315334598e+00 6.46514678323e-01 + 319 1.71196810659e+00 6.46592108835e-01 + 320 1.41500035499e+00 6.40293683487e-01 + 321 6.68351643520e-01 5.50948287331e-01 + 322 1.51356294594e+00 6.41217917096e-01 + 323 3.43893257228e-01 4.35322259944e-01 + 324 4.23539493711e-01 4.68544828683e-01 + 325 3.53730287599e-01 5.49982459358e-01 + 326 5.14148061067e-01 4.56875983122e-01 + 327 4.63767827421e-01 5.51878679451e-01 + 328 5.65542983858e-01 5.49747629986e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 25 2 81 + 2 3 3 81 2 27 + 3 3 3 26 35 83 + 4 3 3 26 83 33 + 5 3 3 73 64 84 + 6 3 3 84 64 75 + 7 3 3 34 65 85 + 8 3 3 34 85 63 + 9 3 3 79 74 86 + 10 3 3 86 74 80 + 11 3 3 83 35 87 + 12 3 3 87 35 36 + 13 3 3 25 81 88 + 14 3 3 25 88 24 + 15 3 3 86 80 89 + 16 3 3 89 80 1 + 17 3 3 73 84 90 + 18 3 3 73 90 72 + 19 3 3 84 75 91 + 20 3 3 91 75 76 + 21 3 3 63 85 92 + 22 3 3 63 92 62 + 23 3 3 79 86 93 + 24 3 3 79 93 78 + 25 3 3 81 27 94 + 26 3 3 94 27 28 + 27 3 3 85 65 95 + 28 3 3 95 65 66 + 29 3 3 33 83 96 + 30 3 3 33 96 32 + 31 3 3 95 66 97 + 32 3 3 97 66 67 + 33 3 3 32 96 98 + 34 3 3 32 98 31 + 35 3 3 78 93 99 + 36 3 3 78 99 77 + 37 3 3 94 28 100 + 38 3 3 100 28 29 + 39 3 3 91 76 101 + 40 3 3 101 76 77 + 41 3 3 72 90 102 + 42 3 3 72 102 71 + 43 3 3 62 92 103 + 44 3 3 62 103 61 + 45 3 3 87 36 104 + 46 3 3 104 36 37 + 47 3 3 24 88 105 + 48 3 3 24 105 23 + 49 3 3 104 37 106 + 50 3 3 106 37 38 + 51 3 3 23 105 107 + 52 3 3 23 107 22 + 53 3 3 100 29 108 + 54 3 3 108 29 30 + 55 3 3 71 102 109 + 56 3 3 71 109 70 + 57 3 3 61 103 110 + 58 3 3 61 110 60 + 59 3 3 31 98 82 + 60 3 3 31 82 30 + 61 3 3 97 67 111 + 62 3 3 111 67 68 + 63 3 3 111 68 113 + 64 3 3 113 68 69 + 65 3 3 70 109 112 + 66 3 3 70 112 69 + 67 3 3 60 110 114 + 68 3 3 60 114 59 + 69 3 3 106 38 116 + 70 3 3 116 38 39 + 71 3 3 22 107 117 + 72 3 3 22 117 21 + 73 3 3 21 117 118 + 74 3 3 21 118 20 + 75 3 3 116 39 119 + 76 3 3 119 39 40 + 77 3 3 59 114 120 + 78 3 3 59 120 58 + 79 3 3 20 118 121 + 80 3 3 20 121 19 + 81 3 3 119 40 122 + 82 3 3 122 40 41 + 83 3 3 58 120 123 + 84 3 3 58 123 57 + 85 3 3 57 123 124 + 86 3 3 57 124 56 + 87 3 3 122 41 125 + 88 3 3 125 41 42 + 89 3 3 19 121 126 + 90 3 3 19 126 18 + 91 3 3 125 42 127 + 92 3 3 127 42 43 + 93 3 3 18 126 128 + 94 3 3 18 128 17 + 95 3 3 56 124 129 + 96 3 3 56 129 55 + 97 3 3 55 129 130 + 98 3 3 55 130 54 + 99 3 3 127 43 131 + 100 3 3 131 43 44 + 101 3 3 17 128 132 + 102 3 3 17 132 16 + 103 3 3 16 132 133 + 104 3 3 16 133 15 + 105 3 3 131 44 134 + 106 3 3 134 44 45 + 107 3 3 54 130 135 + 108 3 3 54 135 53 + 109 3 3 15 133 136 + 110 3 3 15 136 14 + 111 3 3 134 45 137 + 112 3 3 137 45 46 + 113 3 3 53 135 138 + 114 3 3 53 138 52 + 115 3 3 52 138 139 + 116 3 3 52 139 51 + 117 3 3 51 139 140 + 118 3 3 51 140 50 + 119 3 3 14 136 141 + 120 3 3 14 141 13 + 121 3 3 13 141 142 + 122 3 3 13 142 12 + 123 3 3 137 46 143 + 124 3 3 143 46 47 + 125 3 3 143 47 144 + 126 3 3 144 47 48 + 127 3 3 12 142 145 + 128 3 3 12 145 11 + 129 3 3 50 140 146 + 130 3 3 50 146 49 + 131 3 3 144 48 115 + 132 3 3 115 48 49 + 133 3 3 11 145 147 + 134 3 3 11 147 10 + 135 3 3 10 147 149 + 136 3 3 10 149 9 + 137 3 3 9 149 150 + 138 3 3 9 150 8 + 139 3 3 8 150 151 + 140 3 3 8 151 7 + 141 3 3 7 151 152 + 142 3 3 7 152 6 + 143 3 3 6 152 153 + 144 3 3 6 153 5 + 145 3 3 5 153 154 + 146 3 3 5 154 4 + 147 3 3 4 154 155 + 148 3 3 4 155 3 + 149 3 3 3 155 156 + 150 3 3 3 156 1 + 151 3 3 101 77 99 + 152 3 3 108 30 82 + 153 3 3 113 69 112 + 154 3 3 49 146 115 + 155 3 3 85 95 92 + 156 3 3 90 84 91 + 157 3 3 83 87 96 + 158 3 3 88 81 94 + 159 3 3 93 86 89 + 160 3 3 1 156 157 + 161 3 3 1 157 89 + 162 3 3 105 88 158 + 163 3 3 158 88 94 + 164 3 3 94 100 159 + 165 3 3 94 159 158 + 166 3 3 100 108 160 + 167 3 3 100 160 159 + 168 3 3 107 105 161 + 169 3 3 161 105 158 + 170 3 3 117 107 162 + 171 3 3 162 107 161 + 172 3 3 118 117 163 + 173 3 3 163 117 162 + 174 3 3 121 118 164 + 175 3 3 164 118 163 + 176 3 3 126 121 165 + 177 3 3 165 121 164 + 178 3 3 128 126 166 + 179 3 3 166 126 165 + 180 3 3 132 128 167 + 181 3 3 167 128 166 + 182 3 3 133 132 168 + 183 3 3 168 132 167 + 184 3 3 136 133 169 + 185 3 3 169 133 168 + 186 3 3 141 136 170 + 187 3 3 170 136 169 + 188 3 3 142 141 171 + 189 3 3 171 141 170 + 190 3 3 145 142 172 + 191 3 3 172 142 171 + 192 3 3 147 145 173 + 193 3 3 173 145 172 + 194 3 3 149 147 174 + 195 3 3 174 147 173 + 196 3 3 150 149 175 + 197 3 3 175 149 174 + 198 3 3 151 150 176 + 199 3 3 176 150 175 + 200 3 3 152 151 177 + 201 3 3 177 151 176 + 202 3 3 153 152 178 + 203 3 3 178 152 177 + 204 3 3 154 153 179 + 205 3 3 179 153 178 + 206 3 3 155 154 180 + 207 3 3 180 154 179 + 208 3 3 156 155 181 + 209 3 3 181 155 180 + 210 3 3 87 104 182 + 211 3 3 87 182 96 + 212 3 3 98 96 183 + 213 3 3 183 96 182 + 214 3 3 82 98 184 + 215 3 3 184 98 183 + 216 3 3 104 106 185 + 217 3 3 104 185 182 + 218 3 3 106 116 186 + 219 3 3 106 186 185 + 220 3 3 116 119 187 + 221 3 3 116 187 186 + 222 3 3 119 122 188 + 223 3 3 119 188 187 + 224 3 3 122 125 189 + 225 3 3 122 189 188 + 226 3 3 125 127 190 + 227 3 3 125 190 189 + 228 3 3 127 131 191 + 229 3 3 127 191 190 + 230 3 3 131 134 192 + 231 3 3 131 192 191 + 232 3 3 134 137 193 + 233 3 3 134 193 192 + 234 3 3 137 143 194 + 235 3 3 137 194 193 + 236 3 3 143 144 195 + 237 3 3 143 195 194 + 238 3 3 144 115 196 + 239 3 3 144 196 195 + 240 3 3 103 92 197 + 241 3 3 197 92 95 + 242 3 3 95 97 198 + 243 3 3 95 198 197 + 244 3 3 97 111 199 + 245 3 3 97 199 198 + 246 3 3 111 113 200 + 247 3 3 111 200 199 + 248 3 3 110 103 201 + 249 3 3 201 103 197 + 250 3 3 114 110 202 + 251 3 3 202 110 201 + 252 3 3 120 114 203 + 253 3 3 203 114 202 + 254 3 3 123 120 204 + 255 3 3 204 120 203 + 256 3 3 124 123 205 + 257 3 3 205 123 204 + 258 3 3 129 124 206 + 259 3 3 206 124 205 + 260 3 3 130 129 207 + 261 3 3 207 129 206 + 262 3 3 135 130 208 + 263 3 3 208 130 207 + 264 3 3 138 135 209 + 265 3 3 209 135 208 + 266 3 3 139 138 210 + 267 3 3 210 138 209 + 268 3 3 140 139 211 + 269 3 3 211 139 210 + 270 3 3 146 140 212 + 271 3 3 212 140 211 + 272 3 3 91 101 213 + 273 3 3 91 213 90 + 274 3 3 102 90 214 + 275 3 3 214 90 213 + 276 3 3 109 102 215 + 277 3 3 215 102 214 + 278 3 3 112 109 216 + 279 3 3 216 109 215 + 280 3 3 99 93 217 + 281 3 3 217 93 89 + 282 3 3 82 184 108 + 283 3 3 160 108 184 + 284 3 3 113 112 216 + 285 3 3 200 113 216 + 286 3 3 115 146 196 + 287 3 3 146 212 218 + 288 3 3 146 218 196 + 289 3 3 89 157 219 + 290 3 3 89 219 217 + 291 3 3 161 158 220 + 292 3 3 220 158 159 + 293 3 3 159 160 220 + 294 3 3 183 182 221 + 295 3 3 221 182 185 + 296 3 3 184 183 221 + 297 3 3 201 197 222 + 298 3 3 222 197 198 + 299 3 3 198 199 222 + 300 3 3 202 201 223 + 301 3 3 223 201 222 + 302 3 3 203 202 224 + 303 3 3 224 202 223 + 304 3 3 204 203 225 + 305 3 3 225 203 224 + 306 3 3 205 204 226 + 307 3 3 226 204 225 + 308 3 3 206 205 227 + 309 3 3 227 205 226 + 310 3 3 207 206 228 + 311 3 3 228 206 227 + 312 3 3 208 207 229 + 313 3 3 229 207 228 + 314 3 3 209 208 230 + 315 3 3 230 208 229 + 316 3 3 210 209 231 + 317 3 3 231 209 230 + 318 3 3 211 210 232 + 319 3 3 232 210 231 + 320 3 3 212 211 233 + 321 3 3 233 211 232 + 322 3 3 162 161 234 + 323 3 3 234 161 220 + 324 3 3 163 162 235 + 325 3 3 235 162 234 + 326 3 3 164 163 236 + 327 3 3 236 163 235 + 328 3 3 165 164 237 + 329 3 3 237 164 236 + 330 3 3 166 165 238 + 331 3 3 238 165 237 + 332 3 3 167 166 239 + 333 3 3 239 166 238 + 334 3 3 168 167 240 + 335 3 3 240 167 239 + 336 3 3 169 168 241 + 337 3 3 241 168 240 + 338 3 3 170 169 242 + 339 3 3 242 169 241 + 340 3 3 171 170 243 + 341 3 3 243 170 242 + 342 3 3 172 171 244 + 343 3 3 244 171 243 + 344 3 3 173 172 245 + 345 3 3 245 172 244 + 346 3 3 174 173 246 + 347 3 3 246 173 245 + 348 3 3 175 174 247 + 349 3 3 247 174 246 + 350 3 3 176 175 248 + 351 3 3 248 175 247 + 352 3 3 177 176 249 + 353 3 3 249 176 248 + 354 3 3 178 177 250 + 355 3 3 250 177 249 + 356 3 3 179 178 251 + 357 3 3 251 178 250 + 358 3 3 180 179 252 + 359 3 3 252 179 251 + 360 3 3 181 180 253 + 361 3 3 253 180 252 + 362 3 3 185 186 254 + 363 3 3 185 254 221 + 364 3 3 186 187 255 + 365 3 3 186 255 254 + 366 3 3 187 188 256 + 367 3 3 187 256 255 + 368 3 3 188 189 257 + 369 3 3 188 257 256 + 370 3 3 189 190 258 + 371 3 3 189 258 257 + 372 3 3 190 191 259 + 373 3 3 190 259 258 + 374 3 3 191 192 260 + 375 3 3 191 260 259 + 376 3 3 192 193 261 + 377 3 3 192 261 260 + 378 3 3 193 194 262 + 379 3 3 193 262 261 + 380 3 3 194 195 263 + 381 3 3 194 263 262 + 382 3 3 195 196 264 + 383 3 3 195 264 263 + 384 3 3 101 99 265 + 385 3 3 265 99 217 + 386 3 3 213 101 265 + 387 3 3 214 213 266 + 388 3 3 266 213 265 + 389 3 3 215 214 266 + 390 3 3 199 200 267 + 391 3 3 199 267 222 + 392 3 3 156 181 268 + 393 3 3 156 268 157 + 394 3 3 216 215 269 + 395 3 3 269 215 266 + 396 3 3 222 267 270 + 397 3 3 222 270 223 + 398 3 3 218 212 271 + 399 3 3 271 212 233 + 400 3 3 196 218 272 + 401 3 3 196 272 264 + 402 3 3 224 223 273 + 403 3 3 273 223 270 + 404 3 3 225 224 274 + 405 3 3 274 224 273 + 406 3 3 226 225 275 + 407 3 3 275 225 274 + 408 3 3 227 226 276 + 409 3 3 276 226 275 + 410 3 3 228 227 277 + 411 3 3 277 227 276 + 412 3 3 229 228 278 + 413 3 3 278 228 277 + 414 3 3 230 229 279 + 415 3 3 279 229 278 + 416 3 3 231 230 280 + 417 3 3 280 230 279 + 418 3 3 232 231 281 + 419 3 3 281 231 280 + 420 3 3 233 232 282 + 421 3 3 282 232 281 + 422 3 3 266 265 283 + 423 3 3 283 265 217 + 424 3 3 217 219 283 + 425 3 3 269 266 284 + 426 3 3 284 266 283 + 427 3 3 219 157 285 + 428 3 3 285 157 268 + 429 3 3 200 216 286 + 430 3 3 286 216 269 + 431 3 3 267 200 286 + 432 3 3 181 253 287 + 433 3 3 181 287 268 + 434 3 3 160 184 288 + 435 3 3 288 184 221 + 436 3 3 220 160 288 + 437 3 3 234 220 289 + 438 3 3 289 220 288 + 439 3 3 221 254 290 + 440 3 3 221 290 288 + 441 3 3 235 234 291 + 442 3 3 291 234 289 + 443 3 3 254 255 292 + 444 3 3 254 292 290 + 445 3 3 236 235 293 + 446 3 3 293 235 291 + 447 3 3 255 256 294 + 448 3 3 255 294 292 + 449 3 3 237 236 295 + 450 3 3 295 236 293 + 451 3 3 256 257 148 + 452 3 3 256 148 294 + 453 3 3 238 237 296 + 454 3 3 296 237 295 + 455 3 3 239 238 298 + 456 3 3 298 238 296 + 457 3 3 240 239 299 + 458 3 3 299 239 298 + 459 3 3 241 240 300 + 460 3 3 300 240 299 + 461 3 3 242 241 301 + 462 3 3 301 241 300 + 463 3 3 243 242 302 + 464 3 3 302 242 301 + 465 3 3 244 243 303 + 466 3 3 303 243 302 + 467 3 3 245 244 304 + 468 3 3 304 244 303 + 469 3 3 246 245 305 + 470 3 3 305 245 304 + 471 3 3 247 246 306 + 472 3 3 306 246 305 + 473 3 3 248 247 307 + 474 3 3 307 247 306 + 475 3 3 249 248 308 + 476 3 3 308 248 307 + 477 3 3 250 249 309 + 478 3 3 309 249 308 + 479 3 3 251 250 310 + 480 3 3 310 250 309 + 481 3 3 252 251 311 + 482 3 3 311 251 310 + 483 3 3 253 252 312 + 484 3 3 312 252 311 + 485 3 3 257 258 313 + 486 3 3 257 313 148 + 487 3 3 258 259 314 + 488 3 3 258 314 313 + 489 3 3 259 260 315 + 490 3 3 259 315 314 + 491 3 3 260 261 316 + 492 3 3 260 316 315 + 493 3 3 261 262 317 + 494 3 3 261 317 316 + 495 3 3 262 263 318 + 496 3 3 262 318 317 + 497 3 3 263 264 319 + 498 3 3 263 319 318 + 499 3 3 288 290 289 + 500 3 3 218 271 272 + 501 3 3 290 292 289 + 502 3 3 291 289 292 + 503 3 3 233 282 320 + 504 3 3 233 320 271 + 505 3 3 292 294 293 + 506 3 3 292 293 291 + 507 3 3 295 293 294 + 508 3 3 294 148 295 + 509 3 3 148 313 295 + 510 3 3 296 295 313 + 511 3 3 313 314 296 + 512 3 3 298 296 314 + 513 3 3 314 315 298 + 514 3 3 299 298 315 + 515 3 3 315 316 299 + 516 3 3 300 299 316 + 517 3 3 316 317 300 + 518 3 3 301 300 317 + 519 3 3 317 318 301 + 520 3 3 302 301 318 + 521 3 3 318 319 302 + 522 3 3 303 302 319 + 523 3 3 219 285 283 + 524 3 3 284 283 285 + 525 3 3 304 303 297 + 526 3 3 297 303 319 + 527 3 3 319 264 297 + 528 3 3 264 272 297 + 529 3 3 253 312 321 + 530 3 3 253 321 287 + 531 3 3 305 304 322 + 532 3 3 322 304 297 + 533 3 3 269 284 323 + 534 3 3 269 323 286 + 535 3 3 267 286 325 + 536 3 3 325 286 323 + 537 3 3 270 267 325 + 538 3 3 273 270 325 + 539 3 3 285 268 326 + 540 3 3 326 268 287 + 541 3 3 306 305 320 + 542 3 3 320 305 322 + 543 3 3 274 273 327 + 544 3 3 327 273 325 + 545 3 3 275 274 328 + 546 3 3 328 274 327 + 547 3 3 276 275 321 + 548 3 3 321 275 328 + 549 3 3 277 276 312 + 550 3 3 312 276 321 + 551 3 3 312 311 277 + 552 3 3 278 277 311 + 553 3 3 311 310 278 + 554 3 3 279 278 310 + 555 3 3 310 309 279 + 556 3 3 280 279 309 + 557 3 3 309 308 280 + 558 3 3 281 280 308 + 559 3 3 308 307 281 + 560 3 3 282 281 307 + 561 3 3 307 306 282 + 562 3 3 306 320 282 + 563 3 3 321 328 287 + 564 3 3 320 322 271 + 565 3 3 272 271 322 + 566 3 3 297 272 322 + 567 3 3 326 287 328 + 568 3 3 328 327 326 + 569 3 3 323 284 285 + 570 3 3 285 326 324 + 571 3 3 285 324 323 + 572 3 3 325 323 324 + 573 3 3 327 325 324 + 574 3 3 327 324 326 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 574 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 + 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 + 161 162 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 + 241 242 243 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 325 326 327 328 329 330 + 331 332 333 334 335 336 337 338 339 340 + 341 342 343 344 345 346 347 348 349 350 + 351 352 353 354 355 356 357 358 359 360 + 361 362 363 364 365 366 367 368 369 370 + 371 372 373 374 375 376 377 378 379 380 + 381 382 383 384 385 386 387 388 389 390 + 391 392 393 394 395 396 397 398 399 400 + 401 402 403 404 405 406 407 408 409 410 + 411 412 413 414 415 416 417 418 419 420 + 421 422 423 424 425 426 427 428 429 430 + 431 432 433 434 435 436 437 438 439 440 + 441 442 443 444 445 446 447 448 449 450 + 451 452 453 454 455 456 457 458 459 460 + 461 462 463 464 465 466 467 468 469 470 + 471 472 473 474 475 476 477 478 479 480 + 481 482 483 484 485 486 487 488 489 490 + 491 492 493 494 495 496 497 498 499 500 + 501 502 503 504 505 506 507 508 509 510 + 511 512 513 514 515 516 517 518 519 520 + 521 522 523 524 525 526 527 528 529 530 + 531 532 533 534 535 536 537 538 539 540 + 541 542 543 544 545 546 547 548 549 550 + 551 552 553 554 555 556 557 558 559 560 + 561 562 563 564 565 566 567 568 569 570 + 571 572 573 574 +ENDOFSECTION + BOUNDARY CONDITIONS 2.2.30 + In 1 10 0 6 + 7 3 1 + 28 3 2 + 32 3 2 + 62 3 2 + 64 3 2 + 66 3 3 + 56 3 3 + 42 3 3 + 18 3 3 + 5 3 1 +ENDOFSECTION + BOUNDARY CONDITIONS 2.2.30 + Out 1 8 0 6 + 2 3 2 + 26 3 2 + 38 3 2 + 54 3 2 + 60 3 3 + 34 3 3 + 30 3 3 + 4 3 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.2.30 + Wall 1 62 0 6 + 150 3 3 + 148 3 3 + 146 3 3 + 144 3 3 + 142 3 3 + 140 3 3 + 138 3 3 + 136 3 3 + 134 3 3 + 128 3 3 + 122 3 3 + 120 3 3 + 110 3 3 + 104 3 3 + 102 3 3 + 94 3 3 + 90 3 3 + 80 3 3 + 74 3 3 + 72 3 3 + 52 3 3 + 48 3 3 + 14 3 3 + 1 3 1 + 10 3 2 + 16 3 2 + 3 3 1 + 12 3 2 + 46 3 2 + 50 3 2 + 70 3 2 + 76 3 2 + 82 3 2 + 88 3 2 + 92 3 2 + 100 3 2 + 106 3 2 + 112 3 2 + 124 3 2 + 126 3 2 + 132 3 2 + 130 3 3 + 118 3 3 + 116 3 3 + 114 3 3 + 108 3 3 + 98 3 3 + 96 3 3 + 86 3 3 + 84 3 3 + 78 3 3 + 68 3 3 + 58 3 3 + 44 3 3 + 22 3 3 + 8 3 3 + 6 3 2 + 20 3 2 + 40 3 2 + 36 3 3 + 24 3 3 + 9 3 1 +ENDOFSECTION diff --git a/Filter2D.m b/Filter2D.m new file mode 100644 index 0000000..33167e7 --- /dev/null +++ b/Filter2D.m @@ -0,0 +1,23 @@ +function [F] = Filter2D(Norder,Nc,sp) + +% function [F] = Filter2D(Norder,sp) +% Purpose : Initialize 2D filter matrix of order sp and cutoff Nc + +Globals2D; + +filterdiag = ones((Norder+1)*(Norder+2)/2,1); +alpha = -log(eps); + +% build exponential filter +sk = 1; +for i=0:Norder + for j=0:Norder-i + if (i+j>=Nc) + filterdiag(sk) = exp(-alpha*((i+j - Nc)/(Norder-Nc))^sp); + end + sk = sk+1; + end +end + +F = V*diag(filterdiag)*invV; +return; diff --git a/FindLocalCoords2D.m b/FindLocalCoords2D.m new file mode 100644 index 0000000..aca3457 --- /dev/null +++ b/FindLocalCoords2D.m @@ -0,0 +1,22 @@ +function [rOUT,sOUT] = FindLocalCoords2D(k, xout, yout) + +% function [rOUT,sOUT] = FindLocalCoords2D(k, xout, yout) +% Purpose: find local (r,s) coordinates in the k'th element of given coordinates +% [only works for straight sided triangles] + +Globals2D; + +v1 = EToV(k,1); v2 = EToV(k,2); v3 = EToV(k,3); +xy1 = [VX(v1);VY(v1)]; xy2 = [VX(v2);VY(v2)]; xy3 = [VX(v3);VY(v3)]; + +A(:,1) = xy2-xy1; A(:,2) = xy3-xy1; + +rOUT = zeros(size(xout)); sOUT = zeros(size(xout)); + +for i=1:length(xout(:)) + rhs = 2.0*[xout(i);yout(i)] -xy2 -xy3; + + tmp = A\rhs; + rOUT(i) = tmp(1); sOUT(i) = tmp(2); +end +return diff --git a/GaussFaceMesh2D.m b/GaussFaceMesh2D.m new file mode 100644 index 0000000..6c25332 --- /dev/null +++ b/GaussFaceMesh2D.m @@ -0,0 +1,75 @@ +function gauss = GaussFaceMesh2D(NGauss) + +% function: gauss = GaussFaceMesh2D(NGauss) +% Purpose: Compute Gauss nodes for face term integration, and interpolation matrices + +Globals2D; +gauss.NGauss = NGauss; + +[gauss.z, gauss.w] = JacobiGQ(0, 0, NGauss-1); +face1r = gauss.z; face2r = -gauss.z; face3r = -ones(NGauss, 1); +face1s = -ones(NGauss, 1); face2s = gauss.z; face3s = -gauss.z; + +gauss.finterp = zeros(NGauss,Np,Nfaces); +V1 = Vandermonde2D(N, face1r, face1s); gauss.finterp(:,:,1) = V1*invV; +V2 = Vandermonde2D(N, face2r, face2s); gauss.finterp(:,:,2) = V2*invV; +V3 = Vandermonde2D(N, face3r, face3s); gauss.finterp(:,:,3) = V3*invV; + +gauss.interp = [gauss.finterp(:,:,1); gauss.finterp(:,:,2); gauss.finterp(:,:,3)]; +gauss.mapM = reshape(1:NGauss*Nfaces*K, NGauss*Nfaces, K); +gauss.mapP = reshape(1:NGauss*Nfaces*K, NGauss*Nfaces, K); +gauss.mapI = []; gauss.mapO = []; gauss.mapW = []; gauss.mapB = []; +gauss.mapS = []; gauss.mapD = []; gauss.mapN = []; gauss.mapC = []; + +zer = zeros(NGauss*Nfaces,K); +gauss.nx = zer; gauss.ny = zer; gauss.rx = zer; gauss.ry = zer; gauss.sx = zer; gauss.sy = zer; gauss.J = zer; gauss.sJ = zer; +for f1=1:Nfaces + VM = gauss.finterp(:,:,f1); + dVMdr = VM*Dr; dVMds = VM*Ds; + ids1 = (f1-1)*NGauss+1:f1*NGauss; + for k1=1:K + % calculate geometric factors at Gauss points + [grx,gsx,gry,gsy,gJ] = ... + GeometricFactors2D(x(:,k1),y(:,k1),dVMdr,dVMds); + % compute normals at Gauss points + if(f1==1) gnx = -gsx; gny = -gsy; end; + if(f1==2) gnx = grx+gsx; gny = gry+gsy; end; + if(f1==3) gnx = -grx; gny = -gry; end; + + gsJ = sqrt(gnx.*gnx+gny.*gny); + gnx = gnx./gsJ; gny = gny./gsJ; gsJ = gsJ.*gJ; + + gauss.nx(ids1,k1) = gnx; gauss.ny(ids1,k1) = gny; gauss.sJ(ids1,k1) = gsJ; + gauss.rx(ids1,k1) = grx; gauss.ry(ids1,k1) = gry; gauss.J (ids1,k1) = gJ; + gauss.sx(ids1,k1) = gsx; gauss.sy(ids1,k1) = gsy; + + k2 = EToE(k1,f1); f2 = EToF(k1,f1); ids2 = f2*NGauss:-1:(f2-1)*NGauss+1; + if(k1~=k2) + gauss.mapP(ids1, k1) = gauss.mapM(ids2,k2); + else + gauss.mapP(ids1, k1) = gauss.mapM(ids1,k1); + gauss.mapB = [gauss.mapB;gauss.mapM(ids1,k1)]; + switch(BCType(k1,f1)) + case {Wall} + gauss.mapW = [gauss.mapW;gauss.mapM(ids1,k1)]; + case {In} + gauss.mapI = [gauss.mapI;gauss.mapM(ids1,k1)]; + case {Out} + gauss.mapO = [gauss.mapO;gauss.mapM(ids1,k1)]; + case {Slip} + gauss.mapS = [gauss.mapS;gauss.mapM(ids1,k1)]; + case {Dirichlet} + gauss.mapD = [gauss.mapD;gauss.mapM(ids1,k1)]; + case {Neuman} + gauss.mapN = [gauss.mapN;gauss.mapM(ids1,k1)]; + case {Cyl} + gauss.mapC = [gauss.mapC;gauss.mapM(ids1,k1)]; + end + end + end +end +gauss.x = gauss.interp*x; +gauss.y = gauss.interp*y; +gauss.W = [gauss.w;gauss.w;gauss.w]*ones(1,K); +gauss.W = gauss.W.*gauss.sJ; +return; diff --git a/GeometricFactors2D.m b/GeometricFactors2D.m new file mode 100644 index 0000000..5a7ac15 --- /dev/null +++ b/GeometricFactors2D.m @@ -0,0 +1,9 @@ +function [rx,sx,ry,sy,J] = GeometricFactors2D(x,y,Dr,Ds) + +% function [rx,sx,ry,sy,J] = GeometricFactors2D(x,y,Dr,Ds) +% Purpose : Compute the metric elements for the local mappings of the elements + +% Calculate geometric factors +xr = Dr*x; xs = Ds*x; yr = Dr*y; ys = Ds*y; J = -xs.*yr + xr.*ys; +rx = ys./J; sx =-yr./J; ry =-xs./J; sy = xr./J; +return; diff --git a/Globals2D.m b/Globals2D.m new file mode 100644 index 0000000..6597c7a --- /dev/null +++ b/Globals2D.m @@ -0,0 +1,37 @@ +% Purpose: declare global variables + +global Np Nfp N K +global r s +global Dr Ds LIFT Drw Dsw MassMatrix +global Fx Fy nx ny jac Fscale J +global vmapM vmapP vmapB mapB Fmask +global BCType mapI mapO mapW mapF mapC mapS mapM mapP mapD mapN +global vmapI vmapO vmapW vmapO vmapC vmapS vmapD vmapN +global rx ry sx sy J sJ +global rk4a rk4b rk4c +global Nfaces EToE EToF EToV +global V invV +global x y NODETOL VX VY + +% Some curved mesh and cubature quadrature specific data +global cub gauss straight curved + +In = 1; Out = 2; Wall = 3; Far = 4; Cyl = 5; Dirichlet = 6; Neuman = 7; Slip = 8; + +% Low storage Runge-Kutta coefficients +rk4a = [ 0.0 ... + -567301805773.0/1357537059087.0 ... + -2404267990393.0/2016746695238.0 ... + -3550918686646.0/2091501179385.0 ... + -1275806237668.0/842570457699.0]; +rk4b = [ 1432997174477.0/9575080441755.0 ... + 5161836677717.0/13612068292357.0 ... + 1720146321549.0/2090206949498.0 ... + 3134564353537.0/4481467310338.0 ... + 2277821191437.0/14882151754819.0]; +rk4c = [ 0.0 ... + 1432997174477.0/9575080441755.0 ... + 2526269341429.0/6820363962896.0 ... + 2006345519317.0/3224310063776.0 ... + 2802321613138.0/2924317926251.0]; + diff --git a/Grad2D.m b/Grad2D.m new file mode 100644 index 0000000..c8fe41a --- /dev/null +++ b/Grad2D.m @@ -0,0 +1,10 @@ +function [ux,uy] = Grad2D(u); + +% function [ux,uy] = Grad2D(u); +% Purpose: Compute 2D gradient field of scalar u + +Globals2D; + +ur = Dr*u; us = Ds*u; +ux = rx.*ur + sx.*us; uy = ry.*ur + sy.*us; +return diff --git a/GradJacobiP.m b/GradJacobiP.m new file mode 100644 index 0000000..aaa063d --- /dev/null +++ b/GradJacobiP.m @@ -0,0 +1,13 @@ +function [dP] = GradJacobiP(r, alpha, beta, N); + +% function [dP] = GradJacobiP(r, alpha, beta, N); +% Purpose: Evaluate the derivative of the Jacobi polynomial of type (alpha,beta)>-1, +% at points r for order N and returns dP[1:length(r))] + +dP = zeros(length(r), 1); +if(N == 0) + dP(:,:) = 0.0; +else + dP = sqrt(N*(N+alpha+beta+1))*JacobiP(r(:),alpha+1,beta+1, N-1); +end; +return diff --git a/GradSimplex2DP.m b/GradSimplex2DP.m new file mode 100644 index 0000000..81ff71b --- /dev/null +++ b/GradSimplex2DP.m @@ -0,0 +1,31 @@ +function [dmodedr, dmodeds] = GradSimplex2DP(a,b,id,jd) + +% function [dmodedr, dmodeds] = GradSimplex2DP(a,b,id,jd) +% Purpose: Return the derivatives of the modal basis (id,jd) on the 2D simplex at (a,b). + +fa = JacobiP(a, 0, 0, id); dfa = GradJacobiP(a, 0, 0, id); +gb = JacobiP(b, 2*id+1,0, jd); dgb = GradJacobiP(b, 2*id+1,0, jd); + +% r-derivative +% d/dr = da/dr d/da + db/dr d/db = (2/(1-s)) d/da = (2/(1-b)) d/da +dmodedr = dfa.*gb; +if(id>0) + dmodedr = dmodedr.*((0.5*(1-b)).^(id-1)); +end + +% s-derivative +% d/ds = ((1+a)/2)/((1-b)/2) d/da + d/db +dmodeds = dfa.*(gb.*(0.5*(1+a))); +if(id>0) + dmodeds = dmodeds.*((0.5*(1-b)).^(id-1)); +end + +tmp = dgb.*((0.5*(1-b)).^id); +if(id>0) + tmp = tmp-0.5*id*gb.*((0.5*(1-b)).^(id-1)); +end +dmodeds = dmodeds+fa.*tmp; + +% Normalize +dmodedr = 2^(id+0.5)*dmodedr; dmodeds = 2^(id+0.5)*dmodeds; +return; diff --git a/GradVandermonde2D.m b/GradVandermonde2D.m new file mode 100644 index 0000000..a6254b0 --- /dev/null +++ b/GradVandermonde2D.m @@ -0,0 +1,19 @@ +function [V2Dr,V2Ds] = GradVandermonde2D(N,r,s) + +% function [V2Dr,V2Ds] = GradVandermonde2D(N,r,s) +% Purpose : Initialize the gradient of the modal basis (i,j) at (r,s) at order N + +V2Dr = zeros(length(r),(N+1)*(N+2)/2); V2Ds = zeros(length(r),(N+1)*(N+2)/2); + +% find tensor-product coordinates +[a,b] = rstoab(r,s); + +% Initialize matrices +sk = 1; +for i=0:N + for j=0:N-i + [V2Dr(:,sk),V2Ds(:,sk)] = GradSimplex2DP(a,b,i,j); + sk = sk+1; + end +end +return; diff --git a/Hrefine2D.m b/Hrefine2D.m new file mode 100644 index 0000000..18d616b --- /dev/null +++ b/Hrefine2D.m @@ -0,0 +1,64 @@ +function Hrefine2D(refineflag) + +% function Hrefine2D(refineflag) +% purpose: apply non-conforming refinement to elements labelled in refineflag + +Globals2D; + +% 1.1 Count vertices +Nv = length(VX(:)); + +% 1.2 Find and count elements to be refined +ref = sort(find(refineflag)); +Nrefine = length(ref); + +% 1.3 Extract vertex numbers of elements to refine +v1 = EToV(ref, 1); v2 = EToV(ref, 2); v3 = EToV(ref, 3); + +% 1.4 Uniquely number all face centers +v4 = max( 1 + Nfaces*(0:K-1)', EToF(:,1) + Nfaces*(EToE(:,1)-1) ); +v5 = max( 2 + Nfaces*(0:K-1)', EToF(:,2) + Nfaces*(EToE(:,2)-1) ); +v6 = max( 3 + Nfaces*(0:K-1)', EToF(:,3) + Nfaces*(EToE(:,3)-1) ); + +% 2.0 Extract face center vertices for elements to refine +v4 = v4(ref); v5 = v5(ref); v6 = v6(ref); + +% 2.1 Renumber face centers contiguously from Nv+1 +ids = unique([v4;v5;v6]); +newids(ids) = (1:length(ids))'; +v4 = Nv+newids(v4)'; v5 = Nv+newids(v5)'; v6 = Nv+newids(v6)'; + +% 2.2 Replace original triangle with triangle connecting edge centers +EToV(ref,:) = [v4,v5,v6]; + +% 3.0 Add extra triangles to EToV +EToV(K+1:K+3*Nrefine,1) = [v1;v2;v3]; % first vertices of new elements +EToV(K+1:K+3*Nrefine,2) = [v4;v5;v6]; % second vertices of new elements +EToV(K+1:K+3*Nrefine,3) = [v6;v4;v5]; % third vertices of new elements + +% 3.1 Create boundary condition type for refined elements +bcsave = BCType(ref,:); +BCType(ref, :) = 0; % now internal faces + +BCType(K+1:K+Nrefine, 1) = bcsave(:, 1); +BCType(K+1:K+Nrefine, 3) = bcsave(:, 3); + +BCType(K+Nrefine+1:K+2*Nrefine, 1) = bcsave(:, 2); +BCType(K+Nrefine+1:K+2*Nrefine, 3) = bcsave(:, 1); + +BCType(K+2*Nrefine+1:K+3*Nrefine, 1) = bcsave(:, 3); +BCType(K+2*Nrefine+1:K+3*Nrefine, 3) = bcsave(:, 2); + +% 3.2 Find vertex locations of elements to be refined +x1 = VX(v1); x2 = VX(v2); x3 = VX(v3); +y1 = VY(v1); y2 = VY(v2); y3 = VY(v3); + +% 3.3 Add coordinates for refined edge centers +VX(v4) = 0.5*(x1+x2); VX(v5) = 0.5*(x2+x3); VX(v6) = 0.5*(x3+x1); +VY(v4) = 0.5*(y1+y2); VY(v5) = 0.5*(y2+y3); VY(v6) = 0.5*(y3+y1); + +% 3.4 Increase element count +K = K+3*Nrefine; +return; + + diff --git a/InterpMatrix2D.m b/InterpMatrix2D.m new file mode 100644 index 0000000..7bee8a0 --- /dev/null +++ b/InterpMatrix2D.m @@ -0,0 +1,16 @@ +function [IM] = InterpMatrix2D(rout, sout) + +% function [IM] = InterpMatrix2D(rout, sout) +% Purpose: Compute local elemental interpolation matrix + +Globals2D; + +% compute Vandermonde at (rout,sout) +Vout = Vandermonde2D(N, rout, sout); + +% build interpolation matrix +IM = Vout*invV; +return + + + diff --git a/JacobiGL.m b/JacobiGL.m new file mode 100644 index 0000000..29d639e --- /dev/null +++ b/JacobiGL.m @@ -0,0 +1,13 @@ +function [x] = JacobiGL(alpha,beta,N); + +% function [x] = JacobiGL(alpha,beta,N) +% Purpose: Compute the N'th order Gauss Lobatto quadrature +% points, x, associated with the Jacobi polynomial, +% of type (alpha,beta) > -1 ( <> -0.5). + +x = zeros(N+1,1); +if (N==1) x(1)=-1.0; x(2)=1.0; return; end; + +[xint,w] = JacobiGQ(alpha+1,beta+1,N-2); +x = [-1, xint', 1]'; +return; diff --git a/JacobiGQ.m b/JacobiGQ.m new file mode 100644 index 0000000..ea29353 --- /dev/null +++ b/JacobiGQ.m @@ -0,0 +1,23 @@ +function [x,w] = JacobiGQ(alpha,beta,N); + +% function [x,w] = JacobiGQ(alpha,beta,N) +% Purpose: Compute the N'th order Gauss quadrature points, x, +% and weights, w, associated with the Jacobi +% polynomial, of type (alpha,beta) > -1 ( <> -0.5). + +if (N==0) x(1)= -(alpha-beta)/(alpha+beta+2); w(1) = 2; return; end; + +% Form symmetric matrix from recurrence. +J = zeros(N+1); +h1 = 2*(0:N)+alpha+beta; +J = diag(-1/2*(alpha^2-beta^2)./(h1+2)./h1) + ... + diag(2./(h1(1:N)+2).*sqrt((1:N).*((1:N)+alpha+beta).*... + ((1:N)+alpha).*((1:N)+beta)./(h1(1:N)+1)./(h1(1:N)+3)),1); +if (alpha+beta<10*eps) J(1,1)=0.0;end; +J = J + J'; + +%Compute quadrature by eigenvalue solve +[V,D] = eig(J); x = diag(D); +w = (V(1,:)').^2*2^(alpha+beta+1)/(alpha+beta+1)*gamma(alpha+1)*... + gamma(beta+1)/gamma(alpha+beta+1); +return; diff --git a/JacobiP.m b/JacobiP.m new file mode 100644 index 0000000..9b4092b --- /dev/null +++ b/JacobiP.m @@ -0,0 +1,37 @@ +function [P] = JacobiP(x,alpha,beta,N); + +% function [P] = JacobiP(x,alpha,beta,N) +% Purpose: Evaluate Jacobi Polynomial of type (alpha,beta) > -1 +% (alpha+beta <> -1) at points x for order N and returns P[1:length(xp))] +% Note : They are normalized to be orthonormal. + +% Turn points into row if needed. +xp = x; dims = size(xp); +if (dims(2)==1) xp = xp'; end; + +PL = zeros(N+1,length(xp)); + +% Initial values P_0(x) and P_1(x) +gamma0 = 2^(alpha+beta+1)/(alpha+beta+1)*gamma(alpha+1)*... + gamma(beta+1)/gamma(alpha+beta+1); +PL(1,:) = 1.0/sqrt(gamma0); +if (N==0) P=PL'; return; end; +gamma1 = (alpha+1)*(beta+1)/(alpha+beta+3)*gamma0; +PL(2,:) = ((alpha+beta+2)*xp/2 + (alpha-beta)/2)/sqrt(gamma1); +if (N==1) P=PL(N+1,:)'; return; end; + +% Repeat value in recurrence. +aold = 2/(2+alpha+beta)*sqrt((alpha+1)*(beta+1)/(alpha+beta+3)); + +% Forward recurrence using the symmetry of the recurrence. +for i=1:N-1 + h1 = 2*i+alpha+beta; + anew = 2/(h1+2)*sqrt( (i+1)*(i+1+alpha+beta)*(i+1+alpha)*... + (i+1+beta)/(h1+1)/(h1+3)); + bnew = - (alpha^2-beta^2)/h1/(h1+2); + PL(i+2,:) = 1/anew*( -aold*PL(i,:) + (xp-bnew).*PL(i+1,:)); + aold =anew; +end; + +P = PL(N+1,:)'; +return \ No newline at end of file diff --git a/Lift2D.m b/Lift2D.m new file mode 100644 index 0000000..6943168 --- /dev/null +++ b/Lift2D.m @@ -0,0 +1,29 @@ +function [LIFT] = Lift2D() + +% function [LIFT] = Lift2D() +% Purpose : Compute surface to volume lift term for DG formulation + +Globals2D; +Emat = zeros(Np, Nfaces*Nfp); + +% face 1 +faceR = r(Fmask(:,1)); +V1D = Vandermonde1D(N, faceR); +massEdge1 = inv(V1D*V1D'); +Emat(Fmask(:,1),1:Nfp) = massEdge1; + +% face 2 +faceR = r(Fmask(:,2)); +V1D = Vandermonde1D(N, faceR); +massEdge2 = inv(V1D*V1D'); +Emat(Fmask(:,2),Nfp+1:2*Nfp) = massEdge2; + +% face 3 +faceS = s(Fmask(:,3)); +V1D = Vandermonde1D(N, faceS); +massEdge3 = inv(V1D*V1D'); +Emat(Fmask(:,3),2*Nfp+1:3*Nfp) = massEdge3; + +% inv(mass matrix)*\I_n (L_i,L_j)_{edge_n} +LIFT = V*(V'*Emat); +return diff --git a/MakeCylinder2D.m b/MakeCylinder2D.m new file mode 100644 index 0000000..338ce6d --- /dev/null +++ b/MakeCylinder2D.m @@ -0,0 +1,85 @@ +function MakeCylinder2D(faces, ra,xo,yo) + +% Function: MakeCylinder2D(faces, ra, xo, yo) +% Purpose: Use Gordon-Hall blending with an isoparametric map to modify a list +% of faces so they conform to a cylinder of radius r centered at (xo,yo) +Globals2D; + +NCurveFaces = size(faces,1); +vflag = zeros(size(VX)); +for n=1:NCurveFaces + + % move vertices of faces to be curved onto circle + k = faces(n,1); f = faces(n,2); + v1 = EToV(k, f); v2 = EToV(k, mod(f,Nfaces)+1); + + % compute polar angles of start and end face vertices relative to circle center + theta1 = atan2(VY(v1)-yo,VX(v1)-xo); + theta2 = atan2(VY(v2)-yo,VX(v2)-xo); + + % move vertices onto circle + newx1 = xo + ra*cos(theta1); newy1 = yo + ra*sin(theta1); + newx2 = xo + ra*cos(theta2); newy2 = yo + ra*sin(theta2); + + % update mesh vertex locations + VX(v1) = newx1; VX(v2) = newx2; VY(v1) = newy1; VY(v2) = newy2; + + % store modified vertex numbers + vflag(v1) = 1; vflag(v2) = 1; +end + +% map modified vertex flag to each element +vflag = vflag(EToV); + +% locate elements with at least one modified vertex +ks = find(sum(vflag,2)>0); + +% build coordinates of all the corrected nodes +va = EToV(ks,1)'; vb = EToV(ks,2)'; vc = EToV(ks,3)'; +x(:,ks) = 0.5*(-(r+s)*VX(va)+(1+r)*VX(vb)+(1+s)*VX(vc)); +y(:,ks) = 0.5*(-(r+s)*VY(va)+(1+r)*VY(vb)+(1+s)*VY(vc)); + +for n=1:NCurveFaces % deform specified faces + k = faces(n,1); f = faces(n,2); + + % find vertex locations for this face and tangential coordinate + if(f==1) v1 = EToV(k,1); v2 = EToV(k,2); vr = r; end + if(f==2) v1 = EToV(k,2); v2 = EToV(k,3); vr = s; end + if(f==3) v1 = EToV(k,1); v2 = EToV(k,3); vr = s; end + fr = vr(Fmask(:,f)); + x1 = VX(v1); y1 = VY(v1); x2 = VX(v2); y2 = VY(v2); + + % move vertices at end points of this face to the cylinder + theta1 = atan2(y1-yo, x1-xo); theta2 = atan2(y2-yo, x2-xo); + + % check to make sure they are in the same quadrant + if ((theta2 > 0) & (theta1 < 0)), theta1 = theta1 + 2*pi; end; + if ((theta1 > 0) & (theta2 < 0)), theta2 = theta2 + 2*pi; end; + + % distribute N+1 nodes by arc-length along edge + theta = 0.5*theta1*(1-fr) + 0.5*theta2*(1+fr); + + % evaluate deformation of coordinates + fdx = xo + ra*cos(theta)-x(Fmask(:,f),k); + fdy = yo + ra*sin(theta)-y(Fmask(:,f),k); + + % build 1D Vandermonde matrix for face nodes and volume nodes + Vface = Vandermonde1D(N, fr); Vvol = Vandermonde1D(N, vr); + % compute unblended volume deformations + vdx = Vvol*(Vface\fdx); vdy = Vvol*(Vface\fdy); + + % blend deformation and increment node coordinates + ids = find(abs(1-vr)>1e-7); % warp and blend + if(f==1) blend = -(r(ids)+s(ids))./(1-vr(ids)); end; + if(f==2) blend = +(r(ids)+1)./(1-vr(ids)); end; + if(f==3) blend = -(r(ids)+s(ids))./(1-vr(ids)); end; + + x(ids,k) = x(ids,k)+blend.*vdx(ids); + y(ids,k) = y(ids,k)+blend.*vdy(ids); +end + +% repair other coordinate dependent information +Fx = x(Fmask(:), :); Fy = y(Fmask(:), :); +[rx,sx,ry,sy,J] = GeometricFactors2D(x, y,Dr,Ds); +[nx, ny, sJ] = Normals2D(); Fscale = sJ./(J(Fmask,:)); +return diff --git a/Maxwell00625.neu b/Maxwell00625.neu new file mode 100644 index 0000000..ea5f8b6 --- /dev/null +++ b/Maxwell00625.neu @@ -0,0 +1,3778 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:48:10 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 1220 2310 1 0 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 -1.00000000000e+00 -1.00000000000e+00 + 2 1.00000000000e+00 -1.00000000000e+00 + 3 -9.37500000000e-01 -1.00000000000e+00 + 4 -8.75000000000e-01 -1.00000000000e+00 + 5 -8.12500000000e-01 -1.00000000000e+00 + 6 -7.50000000000e-01 -1.00000000000e+00 + 7 -6.87500000000e-01 -1.00000000000e+00 + 8 -6.25000000000e-01 -1.00000000000e+00 + 9 -5.62500000000e-01 -1.00000000000e+00 + 10 -5.00000000000e-01 -1.00000000000e+00 + 11 -4.37500000000e-01 -1.00000000000e+00 + 12 -3.75000000000e-01 -1.00000000000e+00 + 13 -3.12500000000e-01 -1.00000000000e+00 + 14 -2.50000000000e-01 -1.00000000000e+00 + 15 -1.87500000000e-01 -1.00000000000e+00 + 16 -1.25000000000e-01 -1.00000000000e+00 + 17 -6.25000000000e-02 -1.00000000000e+00 + 18 0.00000000000e+00 -1.00000000000e+00 + 19 6.25000000000e-02 -1.00000000000e+00 + 20 1.25000000000e-01 -1.00000000000e+00 + 21 1.87500000000e-01 -1.00000000000e+00 + 22 2.50000000000e-01 -1.00000000000e+00 + 23 3.12500000000e-01 -1.00000000000e+00 + 24 3.75000000000e-01 -1.00000000000e+00 + 25 4.37500000000e-01 -1.00000000000e+00 + 26 5.00000000000e-01 -1.00000000000e+00 + 27 5.62500000000e-01 -1.00000000000e+00 + 28 6.25000000000e-01 -1.00000000000e+00 + 29 6.87500000000e-01 -1.00000000000e+00 + 30 7.50000000000e-01 -1.00000000000e+00 + 31 8.12500000000e-01 -1.00000000000e+00 + 32 8.75000000000e-01 -1.00000000000e+00 + 33 9.37500000000e-01 -1.00000000000e+00 + 34 1.00000000000e+00 1.00000000000e+00 + 35 1.00000000000e+00 -9.37500000000e-01 + 36 1.00000000000e+00 -8.75000000000e-01 + 37 1.00000000000e+00 -8.12500000000e-01 + 38 1.00000000000e+00 -7.50000000000e-01 + 39 1.00000000000e+00 -6.87500000000e-01 + 40 1.00000000000e+00 -6.25000000000e-01 + 41 1.00000000000e+00 -5.62500000000e-01 + 42 1.00000000000e+00 -5.00000000000e-01 + 43 1.00000000000e+00 -4.37500000000e-01 + 44 1.00000000000e+00 -3.75000000000e-01 + 45 1.00000000000e+00 -3.12500000000e-01 + 46 1.00000000000e+00 -2.50000000000e-01 + 47 1.00000000000e+00 -1.87500000000e-01 + 48 1.00000000000e+00 -1.25000000000e-01 + 49 1.00000000000e+00 -6.25000000000e-02 + 50 1.00000000000e+00 0.00000000000e+00 + 51 1.00000000000e+00 6.25000000000e-02 + 52 1.00000000000e+00 1.25000000000e-01 + 53 1.00000000000e+00 1.87500000000e-01 + 54 1.00000000000e+00 2.50000000000e-01 + 55 1.00000000000e+00 3.12500000000e-01 + 56 1.00000000000e+00 3.75000000000e-01 + 57 1.00000000000e+00 4.37500000000e-01 + 58 1.00000000000e+00 5.00000000000e-01 + 59 1.00000000000e+00 5.62500000000e-01 + 60 1.00000000000e+00 6.25000000000e-01 + 61 1.00000000000e+00 6.87500000000e-01 + 62 1.00000000000e+00 7.50000000000e-01 + 63 1.00000000000e+00 8.12500000000e-01 + 64 1.00000000000e+00 8.75000000000e-01 + 65 1.00000000000e+00 9.37500000000e-01 + 66 -1.00000000000e+00 1.00000000000e+00 + 67 9.37500000000e-01 1.00000000000e+00 + 68 8.75000000000e-01 1.00000000000e+00 + 69 8.12500000000e-01 1.00000000000e+00 + 70 7.50000000000e-01 1.00000000000e+00 + 71 6.87500000000e-01 1.00000000000e+00 + 72 6.25000000000e-01 1.00000000000e+00 + 73 5.62500000000e-01 1.00000000000e+00 + 74 5.00000000000e-01 1.00000000000e+00 + 75 4.37500000000e-01 1.00000000000e+00 + 76 3.75000000000e-01 1.00000000000e+00 + 77 3.12500000000e-01 1.00000000000e+00 + 78 2.50000000000e-01 1.00000000000e+00 + 79 1.87500000000e-01 1.00000000000e+00 + 80 1.25000000000e-01 1.00000000000e+00 + 81 6.25000000000e-02 1.00000000000e+00 + 82 0.00000000000e+00 1.00000000000e+00 + 83 -6.25000000000e-02 1.00000000000e+00 + 84 -1.25000000000e-01 1.00000000000e+00 + 85 -1.87500000000e-01 1.00000000000e+00 + 86 -2.50000000000e-01 1.00000000000e+00 + 87 -3.12500000000e-01 1.00000000000e+00 + 88 -3.75000000000e-01 1.00000000000e+00 + 89 -4.37500000000e-01 1.00000000000e+00 + 90 -5.00000000000e-01 1.00000000000e+00 + 91 -5.62500000000e-01 1.00000000000e+00 + 92 -6.25000000000e-01 1.00000000000e+00 + 93 -6.87500000000e-01 1.00000000000e+00 + 94 -7.50000000000e-01 1.00000000000e+00 + 95 -8.12500000000e-01 1.00000000000e+00 + 96 -8.75000000000e-01 1.00000000000e+00 + 97 -9.37500000000e-01 1.00000000000e+00 + 98 -1.00000000000e+00 9.37500000000e-01 + 99 -1.00000000000e+00 8.75000000000e-01 + 100 -1.00000000000e+00 8.12500000000e-01 + 101 -1.00000000000e+00 7.50000000000e-01 + 102 -1.00000000000e+00 6.87500000000e-01 + 103 -1.00000000000e+00 6.25000000000e-01 + 104 -1.00000000000e+00 5.62500000000e-01 + 105 -1.00000000000e+00 5.00000000000e-01 + 106 -1.00000000000e+00 4.37500000000e-01 + 107 -1.00000000000e+00 3.75000000000e-01 + 108 -1.00000000000e+00 3.12500000000e-01 + 109 -1.00000000000e+00 2.50000000000e-01 + 110 -1.00000000000e+00 1.87500000000e-01 + 111 -1.00000000000e+00 1.25000000000e-01 + 112 -1.00000000000e+00 6.25000000000e-02 + 113 -1.00000000000e+00 0.00000000000e+00 + 114 -1.00000000000e+00 -6.25000000000e-02 + 115 -1.00000000000e+00 -1.25000000000e-01 + 116 -1.00000000000e+00 -1.87500000000e-01 + 117 -1.00000000000e+00 -2.50000000000e-01 + 118 -1.00000000000e+00 -3.12500000000e-01 + 119 -1.00000000000e+00 -3.75000000000e-01 + 120 -1.00000000000e+00 -4.37500000000e-01 + 121 -1.00000000000e+00 -5.00000000000e-01 + 122 -1.00000000000e+00 -5.62500000000e-01 + 123 -1.00000000000e+00 -6.25000000000e-01 + 124 -1.00000000000e+00 -6.87500000000e-01 + 125 -1.00000000000e+00 -7.50000000000e-01 + 126 -1.00000000000e+00 -8.12500000000e-01 + 127 -1.00000000000e+00 -8.75000000000e-01 + 128 -1.00000000000e+00 -9.37500000000e-01 + 129 -9.55918225900e-01 -9.56571630654e-01 + 130 -3.13361984654e-02 9.49225439729e-01 + 131 -3.61507686880e-02 6.89577214725e-01 + 132 9.55918193131e-01 -9.56572979145e-01 + 133 9.55918225900e-01 9.56571630654e-01 + 134 -9.55918193131e-01 9.56572979145e-01 + 135 -9.38966342139e-01 -8.99695757673e-01 + 136 9.01790702625e-01 -9.48615422289e-01 + 137 9.38972985822e-01 -8.99700489887e-01 + 138 9.38966342139e-01 8.99695757673e-01 + 139 9.01797037119e-01 9.48625507146e-01 + 140 -9.01797037119e-01 -9.48625507146e-01 + 141 -9.01790702625e-01 9.48615422289e-01 + 142 -9.38972985822e-01 8.99700489887e-01 + 143 -9.46289656063e-01 -8.35996060582e-01 + 144 9.46292890088e-01 -8.35996557384e-01 + 145 8.39681688372e-01 9.45797867409e-01 + 146 -8.39681688372e-01 -9.45797867409e-01 + 147 -8.39681862356e-01 9.45794999942e-01 + 148 8.39681862356e-01 -9.45794999942e-01 + 149 -9.46292890088e-01 8.35996557384e-01 + 150 9.46289656063e-01 8.35996060582e-01 + 151 -9.45836205372e-01 -7.74736579933e-01 + 152 7.76876476990e-01 9.44196735112e-01 + 153 9.45838516230e-01 -7.74735866153e-01 + 154 -7.76876476990e-01 -9.44196735112e-01 + 155 -7.76878104392e-01 9.44195153846e-01 + 156 7.76878104392e-01 -9.44195153846e-01 + 157 -9.45838516230e-01 7.74735866153e-01 + 158 9.45836205372e-01 7.74736579933e-01 + 159 -9.45225568720e-01 -7.12834841509e-01 + 160 7.13886508532e-01 9.43852810978e-01 + 161 9.45226997261e-01 -7.12833360526e-01 + 162 -7.13888512186e-01 9.43851550208e-01 + 163 -9.45226997261e-01 7.12833360526e-01 + 164 -7.13886508532e-01 -9.43852810978e-01 + 165 7.13888512186e-01 -9.43851550208e-01 + 166 9.45225568720e-01 7.12834841509e-01 + 167 -9.44551291566e-01 -6.50618487898e-01 + 168 6.51029045151e-01 9.43891734429e-01 + 169 9.44548629494e-01 -6.50613339718e-01 + 170 -6.51049910163e-01 9.43903266795e-01 + 171 -9.44548629494e-01 6.50613339718e-01 + 172 -6.51048258401e-01 -9.43904329958e-01 + 173 6.51031171545e-01 -9.43890829053e-01 + 174 9.44551291566e-01 6.50618487898e-01 + 175 5.88272641929e-01 9.44016198880e-01 + 176 -9.44041668666e-01 5.88226413552e-01 + 177 -5.88282527207e-01 -9.44027727834e-01 + 178 9.44041668666e-01 -5.88226413552e-01 + 179 -9.44052206124e-01 -5.88241009933e-01 + 180 5.88267876278e-01 -9.44012887408e-01 + 181 -5.88280128205e-01 9.44030528326e-01 + 182 9.44052206124e-01 5.88241009933e-01 + 183 5.25643856110e-01 9.44030405188e-01 + 184 -9.43749470493e-01 5.25727750597e-01 + 185 -5.25621195011e-01 -9.44036437819e-01 + 186 9.43749470493e-01 -5.25727750597e-01 + 187 -9.43771717946e-01 -5.25764294931e-01 + 188 5.25680168432e-01 -9.44045691900e-01 + 189 -5.25656569664e-01 9.44085766037e-01 + 190 9.43780238505e-01 5.25771792809e-01 + 191 -4.63056983136e-01 -9.43975471885e-01 + 192 -9.43670712126e-01 -4.63206799732e-01 + 193 4.63234464310e-01 -9.44021605019e-01 + 194 -4.63111737350e-01 9.44082560183e-01 + 195 9.43639662110e-01 -4.63128790476e-01 + 196 4.63113127040e-01 9.43969926801e-01 + 197 -9.43647815913e-01 4.63135966132e-01 + 198 9.43710316778e-01 4.63240253794e-01 + 199 4.00959543304e-01 -9.44038590800e-01 + 200 -4.00660014526e-01 9.44130404712e-01 + 201 -4.00541932652e-01 -9.43897807966e-01 + 202 9.43657741567e-01 -4.00411577171e-01 + 203 -9.43698725942e-01 4.00445973097e-01 + 204 -9.43708948374e-01 -4.00586422529e-01 + 205 4.00615199787e-01 9.43877351926e-01 + 206 9.43796075489e-01 4.00655661702e-01 + 207 -3.38060322582e-01 -9.43890227528e-01 + 208 -9.43855646880e-01 -3.37897585514e-01 + 209 3.38847510492e-01 -9.44144756363e-01 + 210 -3.38315817410e-01 9.44308771421e-01 + 211 9.43790521143e-01 -3.37547054059e-01 + 212 9.43982295347e-01 3.37990671226e-01 + 213 -9.43891474413e-01 3.37626056362e-01 + 214 3.38164907761e-01 9.43831012167e-01 + 215 -9.44100820901e-01 -2.75100682373e-01 + 216 -9.44248137511e-01 2.74590386935e-01 + 217 -2.76138880441e-01 9.44705437663e-01 + 218 9.44082931283e-01 -2.74472821382e-01 + 219 2.76941789053e-01 -9.44402387192e-01 + 220 9.44245066426e-01 2.75204786221e-01 + 221 -2.75561879441e-01 -9.44012592583e-01 + 222 2.75789244388e-01 9.43898853544e-01 + 223 -9.44461634468e-01 -2.12090585846e-01 + 224 -2.14224669202e-01 9.45445291703e-01 + 225 9.44647357791e-01 -2.11071263840e-01 + 226 2.13540907094e-01 9.44175879553e-01 + 227 9.44598254180e-01 2.12211755812e-01 + 228 2.15249604507e-01 -9.44852763595e-01 + 229 -9.44851043388e-01 2.11204789601e-01 + 230 -2.12969172532e-01 -9.44362665911e-01 + 231 9.45798972901e-01 -1.47293356554e-01 + 232 1.51554610792e-01 9.44827692629e-01 + 233 -9.45999100081e-01 1.47428942120e-01 + 234 -1.50272011641e-01 -9.45228328674e-01 + 235 1.53541924434e-01 -9.45343019620e-01 + 236 -9.45040508762e-01 -1.48727571451e-01 + 237 -1.52747469230e-01 9.46655720942e-01 + 238 9.45137868721e-01 1.48869550153e-01 + 239 9.00544436868e-02 9.46094999751e-01 + 240 -8.82019946682e-02 -9.47525766568e-01 + 241 9.48636346117e-01 -8.41538719960e-02 + 242 9.46174454506e-01 8.51143867910e-02 + 243 9.06533683192e-02 -9.44781101712e-01 + 244 -9.48792340622e-01 8.42957320588e-02 + 245 -9.19397897663e-02 9.48382605290e-01 + 246 -9.46151039539e-01 -8.49679300842e-02 + 247 2.92379037135e-02 9.48051216245e-01 + 248 -9.48866368318e-01 -2.18284158890e-02 + 249 9.48807305684e-01 2.19698713951e-02 + 250 2.22704582137e-02 -9.39228212671e-01 + 251 9.58581829947e-01 -3.11149714555e-02 + 252 -9.58679606099e-01 3.12347444473e-02 + 253 8.69441044754e-01 -8.94394723138e-01 + 254 -3.34497786884e-02 -9.55773418921e-01 + 255 -2.23253548419e-03 -1.78784918388e-01 + 256 8.96340330169e-01 -8.52693313596e-01 + 257 8.92014079831e-01 -7.99393591131e-01 + 258 8.91243620770e-01 -7.38469763970e-01 + 259 8.89702244833e-01 -6.76601991420e-01 + 260 8.88429064702e-01 -6.14306628720e-01 + 261 8.87632680339e-01 -5.51754881704e-01 + 262 8.87270340468e-01 -4.89025781357e-01 + 263 8.87228584908e-01 -4.26145059194e-01 + 264 8.87447123700e-01 -3.63082954745e-01 + 265 8.87939053453e-01 -2.99746853282e-01 + 266 8.88800134903e-01 -2.35911936006e-01 + 267 8.90328906379e-01 -1.71088216585e-01 + 268 8.93469732226e-01 -1.04050146179e-01 + 269 9.01854082477e-01 -3.08275783282e-02 + 270 8.05327010670e-01 -8.88923885659e-01 + 271 7.40964726359e-01 -8.87992917155e-01 + 272 6.77583056773e-01 -8.87849904136e-01 + 273 6.14431082581e-01 -8.88290267152e-01 + 274 5.51669814655e-01 -8.88389164960e-01 + 275 4.89195014274e-01 -8.88308411818e-01 + 276 4.26964361322e-01 -8.88215980718e-01 + 277 3.64978643032e-01 -8.88237067719e-01 + 278 3.03292578733e-01 -8.88476402863e-01 + 279 2.42039916467e-01 -8.89077561257e-01 + 280 1.81469042428e-01 -8.90165599273e-01 + 281 1.21840473601e-01 -8.91422537725e-01 + 282 6.32897049202e-02 -8.90227307766e-01 + 283 -8.69441044754e-01 8.94394723138e-01 + 284 -8.96340330169e-01 8.52693313596e-01 + 285 -8.92014079831e-01 7.99393591131e-01 + 286 -8.91243620770e-01 7.38469763970e-01 + 287 -8.89701965367e-01 6.76601814677e-01 + 288 -8.88426967777e-01 6.14305388344e-01 + 289 -8.87624839437e-01 5.51750561015e-01 + 290 -8.87268242329e-01 4.89031622199e-01 + 291 -8.87274143543e-01 4.26198039441e-01 + 292 -8.87590361568e-01 3.63214784789e-01 + 293 -8.88202305741e-01 2.99956080283e-01 + 294 -8.89163573151e-01 2.36177936980e-01 + 295 -8.90737455463e-01 1.71399063022e-01 + 296 -8.93834837099e-01 1.04387511949e-01 + 297 -9.02084663241e-01 3.11449588476e-02 + 298 -8.05327010670e-01 8.88923885659e-01 + 299 -7.40964726359e-01 8.87992917155e-01 + 300 -6.77600046648e-01 8.87860944525e-01 + 301 -6.14441528329e-01 8.88317153724e-01 + 302 -5.51618231658e-01 8.88446990881e-01 + 303 -4.88982108664e-01 8.88401960714e-01 + 304 -4.26469624663e-01 8.88363496728e-01 + 305 -3.64084016754e-01 8.88484547630e-01 + 306 -3.01876473299e-01 8.88931744766e-01 + 307 -2.39934663414e-01 8.89911436624e-01 + 308 -1.78502470330e-01 8.91666350783e-01 + 309 -1.18152481249e-01 8.94473965323e-01 + 310 -6.02727318018e-02 8.98733537928e-01 + 311 -8.69438361336e-01 -8.94397766555e-01 + 312 -8.96335914712e-01 -8.52693455201e-01 + 313 -8.92009885715e-01 -7.99394970654e-01 + 314 -8.91243630087e-01 -7.38474228040e-01 + 315 -8.89721247523e-01 -6.76620314280e-01 + 316 -8.88488258657e-01 -6.14355293280e-01 + 317 -8.87742950039e-01 -5.51850825152e-01 + 318 -8.87427646923e-01 -4.89196260304e-01 + 319 -8.87434117111e-01 -4.26465568277e-01 + 320 -8.87677124155e-01 -3.63669160481e-01 + 321 -8.88103510757e-01 -3.00749083119e-01 + 322 -8.88728698680e-01 -2.37561744579e-01 + 323 -8.89660272405e-01 -1.73856862155e-01 + 324 -8.91165581599e-01 -1.09122676115e-01 + 325 -8.94131893928e-01 -4.21368477955e-02 + 326 -8.05323793415e-01 -8.88926652918e-01 + 327 -7.40961392333e-01 -8.87995647840e-01 + 328 -6.77597882479e-01 -8.87864830979e-01 + 329 -6.14448124126e-01 -8.88318118928e-01 + 330 -5.51611301526e-01 -8.88404981205e-01 + 331 -4.88967002687e-01 -8.88270120191e-01 + 332 -4.26445714969e-01 -8.88077490303e-01 + 333 -3.63979985231e-01 -8.87957222977e-01 + 334 -3.01496099844e-01 -8.88022108674e-01 + 335 -2.38853271376e-01 -8.88394730619e-01 + 336 -1.75802107936e-01 -8.89366631036e-01 + 337 -1.11515910263e-01 -8.91690808669e-01 + 338 -4.24641081502e-02 -8.98158753281e-01 + 339 8.69438361336e-01 8.94397766555e-01 + 340 8.96335914712e-01 8.52693455201e-01 + 341 8.92009885715e-01 7.99394970654e-01 + 342 8.91243630087e-01 7.38474228040e-01 + 343 8.89721252825e-01 6.76620317466e-01 + 344 8.88488289186e-01 6.14355309043e-01 + 345 8.87760051370e-01 5.51866556221e-01 + 346 8.87497110678e-01 4.89258066505e-01 + 347 8.87575511369e-01 4.26585304128e-01 + 348 8.87884812541e-01 3.63838650240e-01 + 349 8.88361270215e-01 3.00971509164e-01 + 350 8.89000734273e-01 2.37846378143e-01 + 351 8.89883006187e-01 1.74181588443e-01 + 352 8.91260643307e-01 1.09468231072e-01 + 353 8.94050057427e-01 4.24892005382e-02 + 354 8.05323793415e-01 8.88926652918e-01 + 355 7.40961392333e-01 8.87995647840e-01 + 356 6.77580523588e-01 8.87853782424e-01 + 357 6.14432568078e-01 8.88297926552e-01 + 358 5.51635644667e-01 8.88388640347e-01 + 359 4.89025241605e-01 8.88248350812e-01 + 360 4.26495954927e-01 8.88013836675e-01 + 361 3.64008620631e-01 8.87807856338e-01 + 362 3.01576833909e-01 8.87747697925e-01 + 363 2.39217312056e-01 8.87951386005e-01 + 364 1.77080183169e-01 8.88678600971e-01 + 365 1.15463608141e-01 8.90343793565e-01 + 366 5.50392465615e-02 8.93463768541e-01 + 367 1.17758001270e-02 -8.81649827057e-01 + 368 -2.84687749070e-03 8.98373249217e-01 + 369 -8.36834351985e-01 8.32042894999e-01 + 370 8.36834351985e-01 -8.32042894999e-01 + 371 8.36830115802e-01 8.32045322846e-01 + 372 -8.36830115802e-01 -8.32045322846e-01 + 373 -7.68178098554e-01 -8.32958333045e-01 + 374 -7.04556239151e-01 -8.31232320513e-01 + 375 -6.40792670969e-01 -8.32958919917e-01 + 376 -5.77909417834e-01 -8.33246878033e-01 + 377 -5.15290795612e-01 -8.33040851359e-01 + 378 -4.52813280890e-01 -8.32655570382e-01 + 379 -3.90401883911e-01 -8.32318837016e-01 + 380 -3.27973699247e-01 -8.32193561247e-01 + 381 -2.65427269139e-01 -8.32392481844e-01 + 382 -2.02667883332e-01 -8.33058626213e-01 + 383 -1.39639570308e-01 -8.34551861426e-01 + 384 -7.68176179330e-01 8.32946017816e-01 + 385 -7.04545133191e-01 8.31206090874e-01 + 386 -6.40761152336e-01 8.32921816946e-01 + 387 -5.77850143570e-01 8.33231165640e-01 + 388 -5.15191097679e-01 8.33117907507e-01 + 389 -4.52627524657e-01 8.32882772923e-01 + 390 -3.90126656760e-01 8.32768788706e-01 + 391 -3.27704812038e-01 8.33004068035e-01 + 392 -2.65426173094e-01 8.33859937107e-01 + 393 -2.03393991828e-01 8.35697878715e-01 + 394 -1.41752229915e-01 8.38851935965e-01 + 395 7.68176179330e-01 -8.32946017816e-01 + 396 7.04536004785e-01 -8.31199537616e-01 + 397 6.40762125911e-01 -8.32893682418e-01 + 398 5.77926627413e-01 -8.33168099274e-01 + 399 5.15455705570e-01 -8.33006899299e-01 + 400 4.53220086344e-01 -8.32710667650e-01 + 401 3.91182420444e-01 -8.32485129314e-01 + 402 3.29370283069e-01 -8.32480762856e-01 + 403 2.67927390875e-01 -8.32900519959e-01 + 404 2.07202134371e-01 -8.34005633842e-01 + 405 1.48024083398e-01 -8.36144292351e-01 + 406 9.21214432366e-02 -8.39495558331e-01 + 407 7.68178098554e-01 8.32958333045e-01 + 408 7.04547048502e-01 8.31225985713e-01 + 409 6.40781448904e-01 8.32937851083e-01 + 410 5.77928565378e-01 8.33223020431e-01 + 411 5.15327872583e-01 8.33004194910e-01 + 412 4.52803341983e-01 8.32557857149e-01 + 413 3.90299430550e-01 8.32100512803e-01 + 414 3.27757779970e-01 8.31759961927e-01 + 415 2.65165294439e-01 8.31688249442e-01 + 416 2.02534281800e-01 8.32119433939e-01 + 417 1.39992334968e-01 8.33495800392e-01 + 418 7.79905043212e-02 8.36670805717e-01 + 419 -7.65944640525e-02 -8.37236384571e-01 + 420 -8.15367193413e-02 8.43753647398e-01 + 421 -8.38844880034e-01 -7.65554408831e-01 + 422 -8.35822897404e-01 -7.03587788549e-01 + 423 -8.33463978065e-01 -6.41235069905e-01 + 424 -8.31959093594e-01 -5.78540414568e-01 + 425 -8.31274099078e-01 -5.15665289684e-01 + 426 -8.31170914344e-01 -4.52762610453e-01 + 427 -8.31457771855e-01 -3.89849760975e-01 + 428 -8.31999942955e-01 -3.26882634767e-01 + 429 -8.32802789161e-01 -2.63768459203e-01 + 430 -8.33937301515e-01 -2.00298526502e-01 + 431 -8.35526524712e-01 -1.36093215851e-01 + 432 -8.37821495034e-01 -7.05901048387e-02 + 433 -8.38837792266e-01 7.65542741117e-01 + 434 -8.35769950599e-01 7.03541029310e-01 + 435 -8.33313445538e-01 6.41116846583e-01 + 436 -8.31671154098e-01 5.78321589413e-01 + 437 -8.30856985057e-01 5.15332647724e-01 + 438 -8.30698646725e-01 4.52291942541e-01 + 439 -8.31067971969e-01 3.89179720113e-01 + 440 -8.31847971176e-01 3.25892631388e-01 + 441 -8.33014756914e-01 2.62250272705e-01 + 442 -8.34693812143e-01 1.97921793781e-01 + 443 -8.37186548234e-01 1.32325496088e-01 + 444 -8.40781876343e-01 6.48048450978e-02 + 445 8.38837792266e-01 -7.65542741117e-01 + 446 8.35771423354e-01 -7.03542050601e-01 + 447 8.33323795094e-01 -6.41123658066e-01 + 448 8.31706675655e-01 -5.78343596914e-01 + 449 8.30910302062e-01 -5.15352991954e-01 + 450 8.30715007368e-01 -4.52257809435e-01 + 451 8.30974120326e-01 -3.89046766973e-01 + 452 8.31591803899e-01 -3.25649646532e-01 + 453 8.32577659991e-01 -2.61890767872e-01 + 454 8.34106824217e-01 -1.97441997725e-01 + 455 8.36554988094e-01 -1.31770486200e-01 + 456 8.40251434080e-01 -6.42303593213e-02 + 457 8.38844880034e-01 7.65554408831e-01 + 458 8.35823043148e-01 7.03587865842e-01 + 459 8.33464719408e-01 6.41235379651e-01 + 460 8.31984487633e-01 5.78564751910e-01 + 461 8.31359372423e-01 5.15746807659e-01 + 462 8.31331090256e-01 4.52910391748e-01 + 463 8.31701165619e-01 3.90074812995e-01 + 464 8.32330206225e-01 3.27217274510e-01 + 465 8.33190716236e-01 2.64219897836e-01 + 466 8.34313177193e-01 2.00834221393e-01 + 467 8.35772383200e-01 1.36687944221e-01 + 468 8.37823983906e-01 7.11878170510e-02 + 469 7.91420914841e-01 -7.86982977606e-01 + 470 -7.91420914841e-01 7.86982977606e-01 + 471 7.91434178500e-01 7.87004592473e-01 + 472 -7.91434178500e-01 -7.87004592473e-01 + 473 3.80266796036e-02 -8.37503355582e-01 + 474 -1.75607581502e-02 -8.36203778407e-01 + 475 -7.31875101789e-01 -7.70329676939e-01 + 476 7.31874590525e-01 7.70327199216e-01 + 477 7.31810436617e-01 -7.70239621149e-01 + 478 -7.31809399343e-01 7.70239881550e-01 + 479 -6.66296956391e-01 -7.78308489824e-01 + 480 6.66295177883e-01 7.78291469851e-01 + 481 6.66206166897e-01 -7.78160173683e-01 + 482 -6.66189495188e-01 7.78180424595e-01 + 483 -6.04223026959e-01 -7.78665219303e-01 + 484 6.04241028096e-01 7.78641158626e-01 + 485 6.04138539280e-01 -7.78473266881e-01 + 486 -6.04041690047e-01 7.78527348864e-01 + 487 -5.41986821086e-01 -7.78429830319e-01 + 488 5.42006276097e-01 7.78390825923e-01 + 489 5.41986305570e-01 -7.78260269013e-01 + 490 -5.41702635506e-01 7.78367183134e-01 + 491 -4.79702634544e-01 -7.77782315425e-01 + 492 4.79656479161e-01 7.77683523348e-01 + 493 4.79841977211e-01 -7.77688761346e-01 + 494 -4.79237162858e-01 7.77863686094e-01 + 495 -4.17399965847e-01 -7.77111356633e-01 + 496 4.17213038574e-01 7.76856507809e-01 + 497 4.17721731474e-01 -7.77086457139e-01 + 498 -4.16680747248e-01 7.77402491870e-01 + 499 -3.55056339832e-01 -7.76668929586e-01 + 500 3.54635300369e-01 7.76106651505e-01 + 501 3.55649897521e-01 -7.76683296089e-01 + 502 -3.54058804792e-01 7.77259568139e-01 + 503 -2.92625315567e-01 -7.76582773672e-01 + 504 2.91888295008e-01 7.75629452670e-01 + 505 2.93706790227e-01 -7.76713096671e-01 + 506 -2.91400301179e-01 7.77709176087e-01 + 507 2.28858141883e-01 7.75595794372e-01 + 508 -2.30046823770e-01 -7.76878565528e-01 + 509 2.32007712859e-01 -7.77446357942e-01 + 510 -2.28712212288e-01 7.79157621158e-01 + 511 1.65440015751e-01 7.76310254785e-01 + 512 -1.67324249731e-01 -7.77595586241e-01 + 513 1.70941297047e-01 -7.79387292858e-01 + 514 -1.65915544844e-01 7.82284251851e-01 + 515 1.01564704753e-01 7.78540507222e-01 + 516 1.11959841364e-01 -7.83587453126e-01 + 517 -1.04869584808e-01 -7.79007867200e-01 + 518 -1.01983689734e-01 7.87611889482e-01 + 519 -8.41057555454e-01 -3.12501791530e-03 + 520 8.40766821076e-01 3.69668132146e-03 + 521 -7.83205396247e-01 7.31905363778e-01 + 522 7.83209574181e-01 -7.31907826353e-01 + 523 7.83294986309e-01 7.31993840365e-01 + 524 -7.83293602392e-01 -7.31993933085e-01 + 525 -3.18477608420e-02 8.54591179692e-01 + 526 1.77398889453e-02 8.42589065898e-01 + 527 -7.79293803802e-01 -6.69468921390e-01 + 528 -7.76478801646e-01 -6.06295719949e-01 + 529 -7.75242041435e-01 -5.42865986480e-01 + 530 -7.74892829113e-01 -4.79598736363e-01 + 531 -7.75177754273e-01 -4.16453781795e-01 + 532 -7.75805676210e-01 -3.53420931712e-01 + 533 -7.76709836304e-01 -2.90439736930e-01 + 534 -7.77922755250e-01 -2.27359104786e-01 + 535 -7.79534123425e-01 -1.63949811485e-01 + 536 -7.81549957189e-01 -9.99278626968e-02 + 537 -7.79050932174e-01 6.69258872640e-01 + 538 -7.75987887648e-01 6.05900942439e-01 + 539 -7.74478202736e-01 5.42263586163e-01 + 540 -7.73956283551e-01 4.78785619590e-01 + 541 -7.74274524432e-01 4.15415021490e-01 + 542 -7.75138940211e-01 3.52075491752e-01 + 543 -7.76433686766e-01 2.88652462900e-01 + 544 -7.78173689850e-01 2.24953278771e-01 + 545 -7.80417703573e-01 1.60694304733e-01 + 546 -7.82965788439e-01 9.56927177458e-02 + 547 7.79076932480e-01 -6.69276161384e-01 + 548 7.76070816032e-01 -6.05955506316e-01 + 549 7.74622059628e-01 -5.42340397105e-01 + 550 7.74104910322e-01 -4.78824409043e-01 + 551 7.74348530365e-01 -4.15369786200e-01 + 552 7.75049685392e-01 -3.51911410750e-01 + 553 7.76081523506e-01 -2.88310477655e-01 + 554 7.77513423839e-01 -2.24407693077e-01 + 555 7.79510466227e-01 -1.59989081834e-01 + 556 7.82015007521e-01 -9.48981335515e-02 + 557 7.79298885776e-01 6.69469552012e-01 + 558 7.76513996728e-01 6.06324952421e-01 + 559 7.75333796584e-01 5.42952178248e-01 + 560 7.75055433432e-01 4.79752504802e-01 + 561 7.75434442427e-01 4.16710548425e-01 + 562 7.76171390157e-01 3.53829025812e-01 + 563 7.77182200367e-01 2.91014988693e-01 + 564 7.78480832623e-01 2.28107216303e-01 + 565 7.80068895570e-01 1.64817399547e-01 + 566 7.81838723658e-01 1.00801303671e-01 + 567 6.41605909145e-02 -7.94253289586e-01 + 568 3.70569843150e-02 7.84428850326e-01 + 569 -3.23737767968e-02 7.96031596434e-01 + 570 -4.36409644093e-02 -7.80561661942e-01 + 571 -7.84429998945e-01 3.03032429190e-02 + 572 -7.83698190774e-01 -3.50976330716e-02 + 573 7.83741790686e-01 -2.94891205571e-02 + 574 7.83505431660e-01 3.59247242619e-02 + 575 7.26911782277e-01 -7.00110833085e-01 + 576 6.84112604125e-01 -7.27789062636e-01 + 577 6.30053524802e-01 -7.24141128228e-01 + 578 5.68807796818e-01 -7.24254055788e-01 + 579 5.06934799280e-01 -7.23313001080e-01 + 580 4.44794917471e-01 -7.22211954696e-01 + 581 3.82517462385e-01 -7.21284725840e-01 + 582 3.20120220077e-01 -7.20780270321e-01 + 583 2.57552422582e-01 -7.20957004899e-01 + 584 1.94662247264e-01 -7.22252711756e-01 + 585 1.30743700830e-01 -7.25730266294e-01 + 586 7.20671827928e-01 -6.35425561978e-01 + 587 7.18548746112e-01 -5.70223026559e-01 + 588 7.17318008965e-01 -5.05955305145e-01 + 589 7.17505727592e-01 -4.42002887436e-01 + 590 7.18303177254e-01 -3.78343501504e-01 + 591 7.19430540188e-01 -3.14785723175e-01 + 592 7.20773713902e-01 -2.51266586072e-01 + 593 7.22470134624e-01 -1.87669984400e-01 + 594 7.24587267068e-01 -1.23950176358e-01 + 595 7.27173069208e-01 7.00365797796e-01 + 596 6.84335935302e-01 7.28054093225e-01 + 597 6.30346732585e-01 7.24483798633e-01 + 598 5.69099121636e-01 7.24611320270e-01 + 599 5.07150859964e-01 7.23574257849e-01 + 600 4.44876206802e-01 7.22245138050e-01 + 601 3.82389277225e-01 7.20951817269e-01 + 602 3.19650892301e-01 7.19945450382e-01 + 603 2.56509874902e-01 7.19359133643e-01 + 604 1.92766484225e-01 7.19349706446e-01 + 605 1.28074368239e-01 7.20235673321e-01 + 606 7.21237328228e-01 6.35942301624e-01 + 607 7.19522594212e-01 5.71082780797e-01 + 608 7.18680479300e-01 5.07231855065e-01 + 609 7.19097140717e-01 4.43759849619e-01 + 610 7.19939295323e-01 3.80722500924e-01 + 611 7.21033754178e-01 3.17979436306e-01 + 612 7.22396880590e-01 2.55472900463e-01 + 613 7.24173859688e-01 1.92988367793e-01 + 614 7.26130366056e-01 1.30256886813e-01 + 615 -7.26869256692e-01 7.00088855315e-01 + 616 -6.84065519067e-01 7.27785167959e-01 + 617 -6.29928617607e-01 7.24158930375e-01 + 618 -5.68512659540e-01 7.24318620852e-01 + 619 -5.06368130626e-01 7.23469509045e-01 + 620 -4.43889133519e-01 7.22574343477e-01 + 621 -3.81195634302e-01 7.21959175840e-01 + 622 -3.18257978134e-01 7.21856310371e-01 + 623 -2.55038872239e-01 7.22557414945e-01 + 624 -1.91642939961e-01 7.24666205881e-01 + 625 -1.28593438402e-01 7.29683328900e-01 + 626 -7.20539805202e-01 6.35346742616e-01 + 627 -7.18304105353e-01 5.70086131125e-01 + 628 -7.16988915473e-01 5.05802583502e-01 + 629 -7.17144078102e-01 4.41861906129e-01 + 630 -7.18045602407e-01 3.78285070521e-01 + 631 -7.19485450771e-01 3.14919661940e-01 + 632 -7.21311656734e-01 2.51655327133e-01 + 633 -7.23556224957e-01 1.88349720370e-01 + 634 -7.26049296430e-01 1.24890346887e-01 + 635 -7.27164015155e-01 -7.00368813140e-01 + 636 -6.84328029951e-01 -7.28066370277e-01 + 637 -6.30324855520e-01 -7.24500832690e-01 + 638 -5.69078411450e-01 -7.24633109936e-01 + 639 -5.07183609594e-01 -7.23642931509e-01 + 640 -4.45049364461e-01 -7.22494274922e-01 + 641 -3.82820729516e-01 -7.21555717613e-01 + 642 -3.20523909933e-01 -7.21059668041e-01 + 643 -2.58097489023e-01 -7.21062771342e-01 + 644 -1.95411825245e-01 -7.21357955339e-01 + 645 -1.32453402726e-01 -7.21606621134e-01 + 646 -7.21196757473e-01 -6.35917146819e-01 + 647 -7.19425879849e-01 -5.71002823469e-01 + 648 -7.18499444991e-01 -5.07075784134e-01 + 649 -7.18800029656e-01 -4.43482769962e-01 + 650 -7.19515950838e-01 -3.80287784798e-01 + 651 -7.20461504260e-01 -3.17354349835e-01 + 652 -7.21632247545e-01 -2.54607894745e-01 + 653 -7.23244201039e-01 -1.91912549139e-01 + 654 -7.25315831836e-01 -1.29066384570e-01 + 655 -6.99307914739e-02 -7.23055819291e-01 + 656 1.55458787186e-02 -7.83578507947e-01 + 657 6.24268314419e-02 -7.35035766033e-01 + 658 -6.55420813700e-02 7.36999479545e-01 + 659 6.22184529748e-02 7.22975124244e-01 + 660 -1.65958527712e-03 7.32906406180e-01 + 661 -6.63265734662e-01 6.68130423835e-01 + 662 6.63441426686e-01 -6.68187733944e-01 + 663 6.64019159223e-01 6.68771756822e-01 + 664 -6.63980772560e-01 -6.68759811960e-01 + 665 7.27645851253e-01 6.70880924467e-02 + 666 -7.27435471481e-01 -6.59023405261e-02 + 667 -7.28063358450e-01 6.12752493429e-02 + 668 -7.28660118135e-01 -2.43633608160e-03 + 669 7.26696384201e-01 -6.01831538042e-02 + 670 7.27965796800e-01 3.57609597901e-03 + 671 -6.64662375245e-01 -5.99707241679e-01 + 672 -6.61605432182e-01 -5.35290210087e-01 + 673 -6.62260207509e-01 -4.70770022675e-01 + 674 -6.63072854348e-01 -4.07376168763e-01 + 675 -6.64217066855e-01 -3.44371850958e-01 + 676 -6.65243168294e-01 -2.81864599241e-01 + 677 -6.66718345836e-01 -2.19650410073e-01 + 678 -6.68868940656e-01 -1.57610734229e-01 + 679 6.64775225296e-01 5.99783430487e-01 + 680 6.61839718282e-01 5.35457766523e-01 + 681 6.62644304852e-01 4.71056775127e-01 + 682 6.63602564610e-01 4.07788511941e-01 + 683 6.64903939666e-01 3.44927373708e-01 + 684 6.66126540518e-01 2.82610325656e-01 + 685 6.67900581272e-01 2.20709846559e-01 + 686 6.70349522142e-01 1.59095797021e-01 + 687 -6.63279412956e-01 5.98576940852e-01 + 688 -6.59520806223e-01 5.33560988240e-01 + 689 -6.59655568972e-01 4.68410531805e-01 + 690 -6.60497765990e-01 4.04419686976e-01 + 691 -6.62265149316e-01 3.40837990159e-01 + 692 -6.64197746254e-01 2.77739460491e-01 + 693 -6.66499601744e-01 2.14985947135e-01 + 694 -6.69169275880e-01 1.52504217895e-01 + 695 6.63614840898e-01 -5.98734576649e-01 + 696 6.60040977424e-01 -5.33813611540e-01 + 697 6.60362910588e-01 -4.68776356951e-01 + 698 6.61231144950e-01 -4.04812075316e-01 + 699 6.62731412636e-01 -3.41122352418e-01 + 700 6.64063087717e-01 -2.77777790222e-01 + 701 6.65525743716e-01 -2.14622333612e-01 + 702 6.67372353752e-01 -1.51631827865e-01 + 703 -5.97285034201e-01 -6.72266858104e-01 + 704 -5.35487396453e-01 -6.70497284029e-01 + 705 -4.73492267473e-01 -6.68706045621e-01 + 706 -4.11344272991e-01 -6.66987313416e-01 + 707 -3.49131987506e-01 -6.65823968165e-01 + 708 -2.86859715286e-01 -6.65465937586e-01 + 709 -2.24431252190e-01 -6.65757529356e-01 + 710 -1.61490984601e-01 -6.65934248321e-01 + 711 5.97336411746e-01 6.72287000828e-01 + 712 5.35527503528e-01 6.70485171476e-01 + 713 4.73448619687e-01 6.68526276210e-01 + 714 4.11112825048e-01 6.66472595014e-01 + 715 3.48487179676e-01 6.64716864593e-01 + 716 2.85475045729e-01 6.63477554842e-01 + 717 2.21901863091e-01 6.62828544391e-01 + 718 1.57391137473e-01 6.62772751619e-01 + 719 5.96649625225e-01 -6.71594694284e-01 + 720 5.34745513224e-01 -6.69807166430e-01 + 721 4.72590291850e-01 -6.68072508148e-01 + 722 4.10170084671e-01 -6.66436445702e-01 + 723 3.47472247061e-01 -6.65241391498e-01 + 724 2.84443680538e-01 -6.64737345495e-01 + 725 2.20920541595e-01 -6.65160744973e-01 + 726 1.56674876689e-01 -6.66977997711e-01 + 727 -5.96317979809e-01 6.71572226383e-01 + 728 -5.34208409439e-01 6.69906760856e-01 + 729 -4.71856905238e-01 6.68469132691e-01 + 730 -4.09209131827e-01 6.67280035725e-01 + 731 -3.46194023070e-01 6.66604591907e-01 + 732 -2.82702125205e-01 6.66547810457e-01 + 733 -2.18544008377e-01 6.67292309304e-01 + 734 -1.53759921518e-01 6.69661519679e-01 + 735 6.17947440575e-01 -6.23428112782e-01 + 736 6.19082811138e-01 6.24499340476e-01 + 737 -6.17541703507e-01 6.23308652052e-01 + 738 -6.18969537431e-01 -6.24428024817e-01 + 739 -9.73852915693e-02 -6.64329608848e-01 + 740 -6.01849283084e-01 -5.65241999524e-01 + 741 6.00056501974e-01 -5.63584637147e-01 + 742 -5.99431025068e-01 5.63364422928e-01 + 743 6.02118000310e-01 5.65393046570e-01 + 744 6.06554440783e-01 4.97787015957e-01 + 745 -6.06061314078e-01 -4.97521978612e-01 + 746 -6.02496028961e-01 4.94529312302e-01 + 747 6.03432505721e-01 -4.94984005669e-01 + 748 -6.05952902846e-01 -4.34470626496e-01 + 749 -6.01924804464e-01 4.30432124263e-01 + 750 6.03114607848e-01 -4.31094571862e-01 + 751 6.06658961721e-01 4.34819619655e-01 + 752 -6.48437712360e-03 -7.26794141994e-01 + 753 -9.17016224807e-02 6.78451296995e-01 + 754 -6.08295938276e-01 -3.71256078821e-01 + 755 -6.04898968297e-01 3.66263159057e-01 + 756 6.06067180439e-01 -3.67032550027e-01 + 757 6.09181872196e-01 3.71660980244e-01 + 758 9.16725714789e-02 -6.70935348458e-01 + 759 5.63257675167e-01 -6.17193231338e-01 + 760 -5.62693391843e-01 6.17180213787e-01 + 761 -5.64578762442e-01 -6.18382040130e-01 + 762 5.64742677169e-01 6.18441737821e-01 + 763 6.10019481909e-01 3.09464122268e-01 + 764 -6.08985551096e-01 -3.09025106911e-01 + 765 -6.06944501424e-01 3.03168018549e-01 + 766 6.07561909304e-01 -3.03825327364e-01 + 767 6.11237072642e-01 2.47763292909e-01 + 768 -6.09998333672e-01 -2.47122380191e-01 + 769 6.08842807036e-01 -2.40903132643e-01 + 770 -6.09251185265e-01 2.40609620831e-01 + 771 6.13832375610e-01 1.86715254033e-01 + 772 -6.11997820144e-01 -1.85433743498e-01 + 773 -6.12028538767e-01 1.78552340553e-01 + 774 6.10365215864e-01 -1.78186875061e-01 + 775 9.09907984186e-02 6.63295375466e-01 + 776 -6.71456308618e-01 -9.57288296075e-02 + 777 6.72608218032e-01 9.74366660214e-02 + 778 6.69620721559e-01 -8.89255775501e-02 + 779 -6.71858368525e-01 9.03043987465e-02 + 780 6.71923430303e-01 -2.65977328140e-02 + 781 -6.73637137782e-01 2.82340302647e-02 + 782 -5.02917906309e-01 -6.16118471136e-01 + 783 -4.40783438433e-01 -6.13270429714e-01 + 784 -3.78528374907e-01 -6.11024964192e-01 + 785 -3.16236958616e-01 -6.09948550188e-01 + 786 -2.53988314568e-01 -6.10138819024e-01 + 787 -5.00669340231e-01 6.15295009261e-01 + 788 -4.38107253854e-01 6.13290598266e-01 + 789 -3.75197625363e-01 6.11990750396e-01 + 790 -3.11827786594e-01 6.11354145095e-01 + 791 -2.47689477965e-01 6.11160400755e-01 + 792 5.01299515039e-01 -6.14960361889e-01 + 793 4.38749337271e-01 -6.12319310077e-01 + 794 3.75835226449e-01 -6.10211964338e-01 + 795 3.12544525780e-01 -6.08926932014e-01 + 796 2.48735447309e-01 -6.08538774867e-01 + 797 1.84201473380e-01 -6.09096217091e-01 + 798 5.03086843533e-01 6.16064674038e-01 + 799 4.40895094438e-01 6.12941132250e-01 + 800 3.78403222704e-01 6.10091567149e-01 + 801 3.15583323101e-01 6.07991987878e-01 + 802 2.52331352091e-01 6.06710393767e-01 + 803 1.88563983186e-01 6.06008344706e-01 + 804 -1.91846034485e-01 -6.11190394658e-01 + 805 -1.81920668064e-01 6.11363121178e-01 + 806 1.94950725401e-02 6.63973550543e-01 + 807 -3.52889121173e-02 -6.67948551891e-01 + 808 2.82752560289e-02 -6.73406872913e-01 + 809 5.24961169706e-01 6.69249165244e-02 + 810 1.18857744635e-01 -6.10650561336e-01 + 811 1.24206892840e-01 6.05570596128e-01 + 812 -6.14962011732e-01 -1.24221358655e-01 + 813 6.17618022761e-01 1.26516864442e-01 + 814 6.12383903362e-01 -1.15843561860e-01 + 815 -6.15273493810e-01 1.17178205305e-01 + 816 -6.73505278959e-01 -3.38634808569e-02 + 817 6.73300650424e-01 3.55558332743e-02 + 818 6.15175005505e-01 -5.42984503654e-02 + 819 -6.18645677861e-01 5.66715476711e-02 + 820 -1.29007782718e-01 -6.11349188154e-01 + 821 5.95024584800e-02 6.04549096569e-01 + 822 5.34391650515e-01 5.65698117443e-01 + 823 5.59097976264e-01 5.20016371964e-01 + 824 5.45559263987e-01 4.61667016143e-01 + 825 5.54785609786e-01 3.97360847494e-01 + 826 5.54702926262e-01 3.36196204465e-01 + 827 5.54650596296e-01 2.74677957062e-01 + 828 5.56276926449e-01 2.12988792165e-01 + 829 4.71985950574e-01 5.60880325931e-01 + 830 4.09495272332e-01 5.56360284757e-01 + 831 3.46775530710e-01 5.52925149822e-01 + 832 2.83643232407e-01 5.50917821075e-01 + 833 2.20187534657e-01 5.49759249556e-01 + 834 -5.30933478826e-01 5.63754579801e-01 + 835 -5.54600522370e-01 5.16835858036e-01 + 836 -5.38890672378e-01 4.56656758101e-01 + 837 -5.47984145682e-01 3.90563848604e-01 + 838 -5.49740540859e-01 3.28003406307e-01 + 839 -5.51930731387e-01 2.65534277055e-01 + 840 -5.54690660153e-01 2.03424696772e-01 + 841 -4.67960416721e-01 5.60121280295e-01 + 842 -4.05059019323e-01 5.57916236555e-01 + 843 -3.41937495138e-01 5.56853457794e-01 + 844 -2.78455691482e-01 5.56246408528e-01 + 845 -2.14548559122e-01 5.55359445017e-01 + 846 5.31627171366e-01 -5.63659632149e-01 + 847 5.55526970982e-01 -5.17087115284e-01 + 848 5.40313834138e-01 -4.57159837699e-01 + 849 5.49912721972e-01 -3.91591343820e-01 + 850 5.51479460327e-01 -3.29262843087e-01 + 851 5.52620757578e-01 -2.66702954396e-01 + 852 5.53753898154e-01 -2.04081037416e-01 + 853 4.68521896439e-01 -5.59253198765e-01 + 854 4.05285995827e-01 -5.55820278072e-01 + 855 3.41748424825e-01 -5.53558715499e-01 + 856 2.77804658988e-01 -5.52453440491e-01 + 857 2.13279197770e-01 -5.52238135817e-01 + 858 -5.34006248826e-01 -5.65606196615e-01 + 859 -5.58531158642e-01 -5.19820742102e-01 + 860 -5.44609849425e-01 -4.61424465531e-01 + 861 -5.53586446883e-01 -3.97105041370e-01 + 862 -5.53325031962e-01 -3.36047852589e-01 + 863 -5.53244360618e-01 -2.74681548214e-01 + 864 -5.54747037433e-01 -2.12918672639e-01 + 865 -4.71486823905e-01 -5.61006066723e-01 + 866 -4.08952687226e-01 -5.57005439406e-01 + 867 -3.46353220425e-01 -5.54535282425e-01 + 868 -2.83700196183e-01 -5.54139323177e-01 + 869 -2.21486587988e-01 -5.55502492016e-01 + 870 -1.11390676925e-01 6.12268847016e-01 + 871 5.60760202774e-01 1.52811786443e-01 + 872 -5.57716697907e-01 -1.51369949751e-01 + 873 -5.58126223076e-01 1.41951634100e-01 + 874 5.55363271860e-01 -1.41571317182e-01 + 875 -5.62365322020e-01 8.17234423193e-02 + 876 5.57629982878e-01 -7.95105018743e-02 + 877 -6.02028885490e-02 -6.01257220604e-01 + 878 5.04382117328e-01 5.10864336548e-01 + 879 -4.98630316357e-01 5.07933554995e-01 + 880 4.99534978316e-01 -5.07595670853e-01 + 881 -5.03543488804e-01 -5.10818872626e-01 + 882 5.39102599378e-02 -6.12896762030e-01 + 883 -4.62846864936e-02 6.38235873215e-01 + 884 -1.92827680241e-03 5.97635961213e-01 + 885 1.47686537243e-01 -5.52636360974e-01 + 886 1.56670891883e-01 5.48821446370e-01 + 887 6.18519701588e-01 6.23367694578e-03 + 888 6.20007117737e-01 6.65009803264e-02 + 889 -6.20207212373e-01 -3.53435989163e-03 + 890 -6.18471114441e-01 -6.38032244596e-02 + 891 9.34548804309e-02 5.47563716472e-01 + 892 -1.61052371893e-01 -5.58376314266e-01 + 893 -4.40847712065e-01 -5.04578742109e-01 + 894 -3.77748374403e-01 -4.99372042980e-01 + 895 -3.14203928676e-01 -4.97762114194e-01 + 896 -2.50416834287e-01 -4.98980577722e-01 + 897 -4.35619649021e-01 5.04207791975e-01 + 898 -3.72459595098e-01 5.02609553305e-01 + 899 -3.09286013330e-01 5.02278417785e-01 + 900 -2.46442744442e-01 5.01235108831e-01 + 901 4.36036740936e-01 -5.02324351401e-01 + 902 3.72047966265e-01 -4.98555761367e-01 + 903 3.07812139586e-01 -4.96737556727e-01 + 904 2.43505956093e-01 -4.96033305461e-01 + 905 4.41999244838e-01 5.04268041695e-01 + 906 3.79229838569e-01 4.98291286282e-01 + 907 3.15919991170e-01 4.95207345178e-01 + 908 2.52187721323e-01 4.93898812565e-01 + 909 -1.50368090821e-01 5.53548501615e-01 + 910 -5.04827559859e-01 -4.15639227524e-01 + 911 -4.75640815166e-01 -4.56440403743e-01 + 912 -4.99298019618e-01 -3.63172327019e-01 + 913 -4.96619868032e-01 -3.03290821650e-01 + 914 -4.97211060218e-01 -2.41031460508e-01 + 915 5.06389241176e-01 4.15756998791e-01 + 916 4.77151551020e-01 4.56391125629e-01 + 917 5.01235883328e-01 3.63172629332e-01 + 918 4.98664683052e-01 3.02977654707e-01 + 919 4.98891692538e-01 2.39987789964e-01 + 920 -4.95844407102e-01 4.07802215083e-01 + 921 -4.67613833690e-01 4.51447110592e-01 + 922 -4.92602096491e-01 3.52717773039e-01 + 923 -4.94641271608e-01 2.90389807016e-01 + 924 -4.97280275369e-01 2.27872183637e-01 + 925 4.98294596127e-01 -4.08489688803e-01 + 926 4.69135594115e-01 -4.50852111604e-01 + 927 4.95758680358e-01 -3.54132804521e-01 + 928 4.97108139069e-01 -2.92407103236e-01 + 929 4.97751690078e-01 -2.29925450180e-01 + 930 -5.65171207689e-02 5.87342731771e-01 + 931 -8.95005429362e-02 5.46056679214e-01 + 932 5.01230707097e-01 1.76234236504e-01 + 933 -4.99991749859e-01 -1.78351932383e-01 + 934 4.98874670219e-01 -1.67133907129e-01 + 935 -5.00724417585e-01 1.65768523266e-01 + 936 3.15317848933e-02 5.44732839174e-01 + 937 -5.05143674532e-01 1.04102164642e-01 + 938 5.00779112900e-01 -1.04210315859e-01 + 939 5.67641718053e-01 9.53612301621e-02 + 940 -5.62005149219e-01 -9.09397557886e-02 + 941 5.61833732146e-01 -1.92945607786e-02 + 942 -5.67643024377e-01 2.41305610271e-02 + 943 5.68093672461e-01 3.81691716969e-02 + 944 -2.14674509739e-03 -6.20773307270e-01 + 945 -5.67568210151e-01 -3.31512470730e-02 + 946 -1.06704527358e-01 -5.62305793978e-01 + 947 7.97527013808e-02 -5.53328298231e-01 + 948 1.78773064009e-01 -4.95933557705e-01 + 949 1.88736470691e-01 4.92722394016e-01 + 950 1.25681036028e-01 4.91400477856e-01 + 951 -1.87258862861e-01 -5.02107950166e-01 + 952 -1.83841658045e-01 4.98633829624e-01 + 953 -4.11330714925e-01 -4.45054004724e-01 + 954 -4.50043218772e-01 -3.98293803614e-01 + 955 -4.40326940151e-01 -3.36155133073e-01 + 956 -4.39415371381e-01 -2.71146761066e-01 + 957 -3.46700831290e-01 -4.40283655203e-01 + 958 -2.80724239896e-01 -4.42176566014e-01 + 959 -4.03352971000e-01 4.47511083563e-01 + 960 -4.34529001107e-01 3.86851831849e-01 + 961 -4.37697613449e-01 3.16782879516e-01 + 962 -4.39954299196e-01 2.52580671601e-01 + 963 -3.39367471781e-01 4.48799055019e-01 + 964 -2.77285892730e-01 4.48511968918e-01 + 965 4.03863142580e-01 -4.43645143677e-01 + 966 4.38471267685e-01 -3.86647293240e-01 + 967 4.43130980011e-01 -3.19233268178e-01 + 968 4.42607526150e-01 -2.56479881002e-01 + 969 3.38414951612e-01 -4.41203548921e-01 + 970 2.74062917367e-01 -4.40015883414e-01 + 971 4.13553502018e-01 4.44536224636e-01 + 972 4.52442320859e-01 3.98128126647e-01 + 973 4.43326976377e-01 3.35940872202e-01 + 974 4.42275161620e-01 2.70475569463e-01 + 975 3.49694206021e-01 4.38648435254e-01 + 976 2.84635360435e-01 4.38286522042e-01 + 977 -2.87646779345e-02 5.41260905240e-01 + 978 -5.04443648192e-01 -1.15936703492e-01 + 979 5.02817853431e-01 -4.09413215182e-02 + 980 -1.22152146302e-01 4.93768549171e-01 + 981 6.31948209990e-02 4.89662319319e-01 + 982 5.10954993798e-01 1.80559027137e-02 + 983 -5.10707895115e-01 -5.52944804027e-02 + 984 5.10452999752e-01 1.16560628773e-01 + 985 -5.11035287543e-01 4.39738565175e-02 + 986 4.43180019066e-01 2.04078581141e-01 + 987 -4.41651898874e-01 -2.06717369217e-01 + 988 -4.43082370986e-01 1.89861464459e-01 + 989 4.42953478079e-01 -1.93343878517e-01 + 990 4.44326777953e-01 -1.29839821258e-01 + 991 -4.47705508973e-01 1.27229596265e-01 + 992 -1.25340563150e-01 -5.09579650578e-01 + 993 1.13151498789e-01 -4.95735085425e-01 + 994 4.77315360643e-03 -5.55729660779e-01 + 995 -6.32266626735e-02 -5.29683129929e-01 + 996 2.09906585316e-01 -4.39914591751e-01 + 997 2.20810888704e-01 4.37094980194e-01 + 998 1.57554865880e-01 4.35710169163e-01 + 999 -2.15425920893e-01 -4.44725774996e-01 + 1000 -2.15993925318e-01 4.46266664905e-01 + 1001 -3.82664898493e-01 -3.77678298375e-01 + 1002 3.86374197950e-01 3.77086134052e-01 + 1003 3.68773230143e-01 -3.86240390808e-01 + 1004 3.94377426569e-01 -3.40142296459e-01 + 1005 3.88505891018e-01 -2.84217106962e-01 + 1006 3.04498692553e-01 -3.83267731003e-01 + 1007 -3.67450018532e-01 3.95765363936e-01 + 1008 -3.81861395760e-01 3.38458793374e-01 + 1009 -3.83300138741e-01 2.76769593447e-01 + 1010 -3.05473674230e-01 3.96409124725e-01 + 1011 3.16673701540e-01 3.83127177407e-01 + 1012 -3.11753190984e-01 -3.85501069184e-01 + 1013 3.86777370195e-01 3.03919138870e-01 + 1014 -3.82224266358e-01 -3.03743847038e-01 + 1015 3.40049521787e-01 3.32076897425e-01 + 1016 -3.34549269406e-01 -3.32675938036e-01 + 1017 -3.84985858139e-01 2.14122155486e-01 + 1018 -5.22732221663e-01 -5.41879303165e-03 + 1019 3.87713495322e-01 -2.20868431193e-01 + 1020 -3.89366896957e-01 1.51882346649e-01 + 1021 3.88271965927e-01 -1.56538815890e-01 + 1022 3.35042487758e-01 -3.22054815011e-01 + 1023 -3.30730481160e-01 3.53341782247e-01 + 1024 -3.27716640971e-01 3.01281147194e-01 + 1025 -6.06985224318e-02 4.89043054096e-01 + 1026 9.46840743479e-02 4.34203017106e-01 + 1027 -1.54586073486e-01 4.41070882238e-01 + 1028 4.60704490591e-02 -4.94313806651e-01 + 1029 -1.96981494388e-02 -4.84077947968e-01 + 1030 1.23414748532e-03 4.88024180027e-01 + 1031 -4.46553271351e-01 -1.42104594947e-01 + 1032 4.47184870301e-01 -6.61349909875e-02 + 1033 1.45988946605e-01 -4.39588290322e-01 + 1034 -1.49711542047e-01 -4.49807509111e-01 + 1035 2.40190689703e-01 -3.84213714695e-01 + 1036 -2.47212932625e-01 3.95273015791e-01 + 1037 2.52770340695e-01 3.81822182930e-01 + 1038 1.89444409005e-01 3.80425085784e-01 + 1039 -2.46120464279e-01 -3.87467858757e-01 + 1040 4.45096110466e-01 3.98947113189e-03 + 1041 -3.81681040627e-01 -2.36931853702e-01 + 1042 3.85340158863e-01 2.37642549420e-01 + 1043 -4.52813543028e-01 -7.66764741045e-02 + 1044 4.45043101315e-01 1.32061282572e-01 + 1045 -4.53638387193e-01 6.30812450608e-02 + 1046 -3.27575673914e-01 2.39523983017e-01 + 1047 4.72590172839e-01 6.76520996668e-02 + 1048 -4.63094418333e-01 -6.51003905703e-03 + 1049 -3.28773488494e-01 1.75533256221e-01 + 1050 3.89990369280e-01 -9.20241971589e-02 + 1051 3.97533193842e-01 -3.61081253105e-02 + 1052 1.26380936276e-01 3.78827520945e-01 + 1053 -3.95853042130e-01 8.92686897647e-02 + 1054 2.68685929104e-01 -3.28996325349e-01 + 1055 3.19737542624e-02 4.32900439355e-01 + 1056 8.22326867939e-02 -4.38177891897e-01 + 1057 1.93194878561e-02 -4.33064443770e-01 + 1058 -1.87458154222e-01 3.91994704174e-01 + 1059 2.84135869791e-01 3.26569941493e-01 + 1060 -2.77333802998e-01 -3.29655199425e-01 + 1061 -3.88056441939e-01 -1.70416221392e-01 + 1062 -8.49949736156e-02 -4.64049077176e-01 + 1063 -3.94500189715e-01 -1.04959765653e-01 + 1064 -2.74151626099e-01 3.36947903850e-01 + 1065 -9.32368496552e-02 4.35217883214e-01 + 1066 1.77199638496e-01 -3.84113749916e-01 + 1067 -1.79518631823e-01 -3.90649917203e-01 + 1068 2.21379816319e-01 3.25467590752e-01 + 1069 3.87866789411e-01 1.72343899695e-01 + 1070 3.23651336968e-01 2.70624443123e-01 + 1071 -3.16403448427e-01 -2.69294622475e-01 + 1072 3.33679787917e-01 -2.50863688965e-01 + 1073 3.32316914326e-01 -1.85535344729e-01 + 1074 -4.31437936393e-02 -4.21239662250e-01 + 1075 2.89095214210e-01 -2.77948987456e-01 + 1076 -1.27037101160e-01 3.81218619091e-01 + 1077 -3.09170401807e-02 4.32656242999e-01 + 1078 -3.37220520831e-01 1.14690607325e-01 + 1079 1.58332631576e-01 3.23830565786e-01 + 1080 2.06674364326e-01 -3.28877703929e-01 + 1081 1.15045551953e-01 -3.83355265478e-01 + 1082 5.40950790359e-02 -3.80882367220e-01 + 1083 3.34826782738e-01 -1.17934336035e-01 + 1084 -2.19031464231e-01 3.50952094293e-01 + 1085 -2.12999293075e-01 -3.33178866906e-01 + 1086 -1.08726036569e-01 -3.94566551996e-01 + 1087 -2.71933135525e-01 2.69418918568e-01 + 1088 -2.70544463299e-01 2.03408339724e-01 + 1089 -3.28336231492e-01 -1.97845424101e-01 + 1090 -3.36924202689e-01 -1.32403770081e-01 + 1091 3.31722408768e-01 2.01693572952e-01 + 1092 6.34018610703e-02 3.77442365853e-01 + 1093 2.53467173662e-01 2.70501664728e-01 + 1094 3.34634471346e-01 -4.45985767685e-02 + 1095 2.71232448064e-01 -2.16568941831e-01 + 1096 4.12035972794e-01 6.76183454596e-02 + 1097 3.73425166263e-01 1.53750180477e-02 + 1098 3.85534143001e-01 1.17055785190e-01 + 1099 -4.00471570056e-01 -3.95359591333e-02 + 1100 -4.01404801113e-01 2.50030085214e-02 + 1101 -2.17822043510e-01 2.99089138302e-01 + 1102 2.80825470320e-01 2.23574776957e-01 + 1103 2.34924989112e-01 -2.73505691394e-01 + 1104 3.46446058417e-01 7.54466589486e-02 + 1105 -1.66511494514e-01 3.34231583511e-01 + 1106 9.53156953988e-02 3.21883766414e-01 + 1107 -2.14585222379e-01 2.37203902495e-01 + 1108 -4.53644915011e-03 -3.75760733103e-01 + 1109 -5.67421014259e-02 -3.68993258545e-01 + 1110 3.32781867027e-01 1.37693412169e-01 + 1111 -6.44519526002e-02 3.76117302909e-01 + 1112 -3.45373488735e-01 5.38264092556e-02 + 1113 -3.44949580971e-01 -6.89390596845e-03 + 1114 -3.42241519207e-01 -6.89256824709e-02 + 1115 4.02480414733e-05 3.76835721992e-01 + 1116 1.45267637649e-01 -3.28752306623e-01 + 1117 8.48662588099e-02 -3.27932455671e-01 + 1118 1.90859274447e-01 2.69494724399e-01 + 1119 2.81813430709e-01 -1.49120545188e-01 + 1120 2.81474848292e-01 -8.51463810197e-02 + 1121 -1.48818864692e-01 -3.34719812897e-01 + 1122 -2.44565439773e-01 -2.75325520655e-01 + 1123 -2.66564847663e-01 -2.15668535649e-01 + 1124 -2.80023549653e-01 -1.55233655285e-01 + 1125 -2.69200685872e-01 1.32043573255e-01 + 1126 -8.99739155540e-02 -3.27861298672e-01 + 1127 1.73813285111e-01 -2.73968784308e-01 + 1128 1.13437792158e-01 -2.74338579860e-01 + 1129 -1.58843460310e-01 2.72803119491e-01 + 1130 2.56549120034e-02 -3.25604802243e-01 + 1131 1.27364455481e-01 2.67131185534e-01 + 1132 -1.01135135827e-01 3.14552553732e-01 + 1133 -2.96320209985e-01 7.87952570566e-02 + 1134 3.06660949687e-01 2.52369715391e-02 + 1135 2.65409523870e-01 -2.41497470051e-02 + 1136 -2.11838126138e-01 1.72381364481e-01 + 1137 3.22747513182e-02 3.20902142877e-01 + 1138 -2.90999842504e-01 2.47621103576e-02 + 1139 -2.87702392351e-01 -3.50667238462e-02 + 1140 -2.86649601240e-01 -9.51743928684e-02 + 1141 -3.22512613643e-02 -3.22590596595e-01 + 1142 2.76520594391e-01 1.65964010782e-01 + 1143 -1.81596748981e-01 -2.80321198042e-01 + 1144 -2.05026451562e-01 -2.24410978647e-01 + 1145 -2.19731712536e-01 -1.66559850491e-01 + 1146 2.20355254995e-01 2.07684017591e-01 + 1147 2.02328847654e-01 -2.19180832091e-01 + 1148 2.25010024217e-01 -1.65190186047e-01 + 1149 2.39997757157e-01 -1.15960397079e-01 + 1150 -2.37405570554e-01 -1.17754478122e-01 + 1151 -2.30971729893e-01 -6.44505338168e-02 + 1152 5.43369492832e-02 -2.74319923400e-01 + 1153 -2.32304768797e-01 -5.26759138368e-04 + 1154 -2.42607531101e-01 6.40470377681e-02 + 1155 -2.01646584957e-01 1.07846431011e-01 + 1156 2.22083228682e-01 -6.66949452047e-02 + 1157 -1.21838245007e-01 -2.75645551347e-01 + 1158 -3.16290010894e-02 3.21390499186e-01 + 1159 1.59962154488e-01 2.22183856826e-01 + 1160 1.40130148803e-01 -2.19989536509e-01 + 1161 1.64576319327e-01 -1.65935091024e-01 + 1162 1.88677019057e-01 -1.13832813640e-01 + 1163 -4.59689942735e-03 -2.72561594444e-01 + 1164 -1.52412208511e-01 -2.32709737270e-01 + 1165 -1.59284728115e-01 -1.77527288146e-01 + 1166 6.50403036575e-02 2.63784750018e-01 + 1167 2.78176080820e-01 9.45696543313e-02 + 1168 -1.56652774752e-01 2.08775882034e-01 + 1169 2.41538903161e-01 3.54851296379e-02 + 1170 -1.53015046411e-01 1.47440379858e-01 + 1171 1.99370540507e-01 -1.11576030900e-02 + 1172 8.09721233106e-02 -2.21299205348e-01 + 1173 1.04346526116e-01 -1.66085251874e-01 + 1174 1.28300210884e-01 -1.11003821985e-01 + 1175 -1.76030937260e-01 -1.08619976289e-01 + 1176 -6.43423680000e-02 -2.70302748486e-01 + 1177 -9.83015851295e-02 -2.09225050667e-01 + 1178 1.24999802796e-03 2.65225487757e-01 + 1179 -5.47702849058e-02 2.70386653327e-01 + 1180 -1.01527308799e-01 2.42666423212e-01 + 1181 2.39961098766e-02 -2.23560091905e-01 + 1182 1.00383554084e-01 2.02206174748e-01 + 1183 2.20070936312e-01 1.38582603209e-01 + 1184 1.61184670364e-01 1.67363775896e-01 + 1185 2.16791033436e-01 8.41351145140e-02 + 1186 -1.73855790152e-01 -3.42370020142e-02 + 1187 -1.75297342277e-01 3.96237553521e-02 + 1188 -1.48112553052e-01 9.31990118334e-02 + 1189 1.76131587821e-01 4.54809240459e-02 + 1190 -3.43849300581e-02 -2.19586654896e-01 + 1191 1.59629846583e-01 -5.87867621413e-02 + 1192 3.15026211518e-02 2.09399499970e-01 + 1193 4.70229977857e-02 -1.70252282639e-01 + 1194 6.47503652490e-02 -1.11495449804e-01 + 1195 -9.90914752562e-02 1.79149252682e-01 + 1196 1.63477712796e-01 1.05128233328e-01 + 1197 -1.08675451206e-01 -1.36098708968e-01 + 1198 -1.13968087963e-01 -6.82454833571e-02 + 1199 -3.80294733604e-02 2.09250285893e-01 + 1200 -1.16536560669e-01 -2.24653455585e-03 + 1201 -1.07678628928e-01 5.83749057733e-02 + 1202 -5.03599593084e-02 -1.59975096592e-01 + 1203 -5.07125199584e-02 -9.45422902760e-02 + 1204 4.85704107197e-03 1.54739149825e-01 + 1205 -5.44469480954e-02 -3.01772004722e-02 + 1206 1.03999612165e-01 1.29718749164e-01 + 1207 5.61723632031e-02 1.55696657309e-01 + 1208 4.16038147393e-03 -1.25246817988e-01 + 1209 -9.86627721517e-02 1.17037525397e-01 + 1210 -4.88218646433e-02 1.44106014931e-01 + 1211 1.32405503787e-01 -3.19481904323e-04 + 1212 9.23626769109e-02 -5.32838527052e-02 + 1213 1.64006335194e-02 -5.38482831674e-02 + 1214 -1.08562284931e-02 1.15061298627e-01 + 1215 -6.44298058220e-02 2.52908759105e-02 + 1216 -4.18296539877e-02 8.00796495653e-02 + 1217 1.10461488725e-01 6.33593497015e-02 + 1218 3.67904244746e-02 8.84260408520e-02 + 1219 -5.04521187549e-03 2.03352409669e-02 + 1220 6.27032608348e-02 1.11893358711e-02 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 128 1 129 + 2 3 3 129 1 3 + 3 3 3 33 2 132 + 4 3 3 132 2 35 + 5 3 3 65 34 133 + 6 3 3 133 34 67 + 7 3 3 97 66 134 + 8 3 3 134 66 98 + 9 3 3 128 129 135 + 10 3 3 128 135 127 + 11 3 3 33 132 136 + 12 3 3 33 136 32 + 13 3 3 132 35 137 + 14 3 3 137 35 36 + 15 3 3 65 133 138 + 16 3 3 65 138 64 + 17 3 3 133 67 139 + 18 3 3 139 67 68 + 19 3 3 129 3 140 + 20 3 3 140 3 4 + 21 3 3 97 134 141 + 22 3 3 97 141 96 + 23 3 3 134 98 142 + 24 3 3 142 98 99 + 25 3 3 127 135 143 + 26 3 3 127 143 126 + 27 3 3 137 36 144 + 28 3 3 144 36 37 + 29 3 3 139 68 145 + 30 3 3 145 68 69 + 31 3 3 140 4 146 + 32 3 3 146 4 5 + 33 3 3 96 141 147 + 34 3 3 96 147 95 + 35 3 3 32 136 148 + 36 3 3 32 148 31 + 37 3 3 142 99 149 + 38 3 3 149 99 100 + 39 3 3 64 138 150 + 40 3 3 64 150 63 + 41 3 3 126 143 151 + 42 3 3 126 151 125 + 43 3 3 145 69 152 + 44 3 3 152 69 70 + 45 3 3 144 37 153 + 46 3 3 153 37 38 + 47 3 3 146 5 154 + 48 3 3 154 5 6 + 49 3 3 95 147 155 + 50 3 3 95 155 94 + 51 3 3 31 148 156 + 52 3 3 31 156 30 + 53 3 3 149 100 157 + 54 3 3 157 100 101 + 55 3 3 63 150 158 + 56 3 3 63 158 62 + 57 3 3 125 151 159 + 58 3 3 125 159 124 + 59 3 3 152 70 160 + 60 3 3 160 70 71 + 61 3 3 153 38 161 + 62 3 3 161 38 39 + 63 3 3 94 155 162 + 64 3 3 94 162 93 + 65 3 3 157 101 163 + 66 3 3 163 101 102 + 67 3 3 154 6 164 + 68 3 3 164 6 7 + 69 3 3 30 156 165 + 70 3 3 30 165 29 + 71 3 3 62 158 166 + 72 3 3 62 166 61 + 73 3 3 124 159 167 + 74 3 3 124 167 123 + 75 3 3 160 71 168 + 76 3 3 168 71 72 + 77 3 3 161 39 169 + 78 3 3 169 39 40 + 79 3 3 93 162 170 + 80 3 3 93 170 92 + 81 3 3 163 102 171 + 82 3 3 171 102 103 + 83 3 3 164 7 172 + 84 3 3 172 7 8 + 85 3 3 29 165 173 + 86 3 3 29 173 28 + 87 3 3 61 166 174 + 88 3 3 61 174 60 + 89 3 3 168 72 175 + 90 3 3 175 72 73 + 91 3 3 171 103 176 + 92 3 3 176 103 104 + 93 3 3 172 8 177 + 94 3 3 177 8 9 + 95 3 3 169 40 178 + 96 3 3 178 40 41 + 97 3 3 123 167 179 + 98 3 3 123 179 122 + 99 3 3 28 173 180 + 100 3 3 28 180 27 + 101 3 3 92 170 181 + 102 3 3 92 181 91 + 103 3 3 60 174 182 + 104 3 3 60 182 59 + 105 3 3 175 73 183 + 106 3 3 183 73 74 + 107 3 3 176 104 184 + 108 3 3 184 104 105 + 109 3 3 177 9 185 + 110 3 3 185 9 10 + 111 3 3 178 41 186 + 112 3 3 186 41 42 + 113 3 3 122 179 187 + 114 3 3 122 187 121 + 115 3 3 27 180 188 + 116 3 3 27 188 26 + 117 3 3 91 181 189 + 118 3 3 91 189 90 + 119 3 3 59 182 190 + 120 3 3 59 190 58 + 121 3 3 185 10 191 + 122 3 3 191 10 11 + 123 3 3 121 187 192 + 124 3 3 121 192 120 + 125 3 3 26 188 193 + 126 3 3 26 193 25 + 127 3 3 90 189 194 + 128 3 3 90 194 89 + 129 3 3 186 42 195 + 130 3 3 195 42 43 + 131 3 3 183 74 196 + 132 3 3 196 74 75 + 133 3 3 184 105 197 + 134 3 3 197 105 106 + 135 3 3 58 190 198 + 136 3 3 58 198 57 + 137 3 3 25 193 199 + 138 3 3 25 199 24 + 139 3 3 89 194 200 + 140 3 3 89 200 88 + 141 3 3 191 11 201 + 142 3 3 201 11 12 + 143 3 3 195 43 202 + 144 3 3 202 43 44 + 145 3 3 197 106 203 + 146 3 3 203 106 107 + 147 3 3 120 192 204 + 148 3 3 120 204 119 + 149 3 3 196 75 205 + 150 3 3 205 75 76 + 151 3 3 57 198 206 + 152 3 3 57 206 56 + 153 3 3 201 12 207 + 154 3 3 207 12 13 + 155 3 3 119 204 208 + 156 3 3 119 208 118 + 157 3 3 24 199 209 + 158 3 3 24 209 23 + 159 3 3 88 200 210 + 160 3 3 88 210 87 + 161 3 3 202 44 211 + 162 3 3 211 44 45 + 163 3 3 56 206 212 + 164 3 3 56 212 55 + 165 3 3 203 107 213 + 166 3 3 213 107 108 + 167 3 3 205 76 214 + 168 3 3 214 76 77 + 169 3 3 118 208 215 + 170 3 3 118 215 117 + 171 3 3 213 108 216 + 172 3 3 216 108 109 + 173 3 3 87 210 217 + 174 3 3 87 217 86 + 175 3 3 211 45 218 + 176 3 3 218 45 46 + 177 3 3 23 209 219 + 178 3 3 23 219 22 + 179 3 3 55 212 220 + 180 3 3 55 220 54 + 181 3 3 207 13 221 + 182 3 3 221 13 14 + 183 3 3 214 77 222 + 184 3 3 222 77 78 + 185 3 3 117 215 223 + 186 3 3 117 223 116 + 187 3 3 86 217 224 + 188 3 3 86 224 85 + 189 3 3 218 46 225 + 190 3 3 225 46 47 + 191 3 3 222 78 226 + 192 3 3 226 78 79 + 193 3 3 54 220 227 + 194 3 3 54 227 53 + 195 3 3 22 219 228 + 196 3 3 22 228 21 + 197 3 3 216 109 229 + 198 3 3 229 109 110 + 199 3 3 221 14 230 + 200 3 3 230 14 15 + 201 3 3 225 47 231 + 202 3 3 231 47 48 + 203 3 3 226 79 232 + 204 3 3 232 79 80 + 205 3 3 229 110 233 + 206 3 3 233 110 111 + 207 3 3 230 15 234 + 208 3 3 234 15 16 + 209 3 3 21 228 235 + 210 3 3 21 235 20 + 211 3 3 116 223 236 + 212 3 3 116 236 115 + 213 3 3 85 224 237 + 214 3 3 85 237 84 + 215 3 3 53 227 238 + 216 3 3 53 238 52 + 217 3 3 232 80 239 + 218 3 3 239 80 81 + 219 3 3 234 16 240 + 220 3 3 240 16 17 + 221 3 3 231 48 241 + 222 3 3 241 48 49 + 223 3 3 52 238 242 + 224 3 3 52 242 51 + 225 3 3 20 235 243 + 226 3 3 20 243 19 + 227 3 3 233 111 244 + 228 3 3 244 111 112 + 229 3 3 84 237 245 + 230 3 3 84 245 83 + 231 3 3 115 236 246 + 232 3 3 115 246 114 + 233 3 3 239 81 247 + 234 3 3 247 81 82 + 235 3 3 114 246 248 + 236 3 3 114 248 113 + 237 3 3 51 242 249 + 238 3 3 51 249 50 + 239 3 3 83 245 130 + 240 3 3 83 130 82 + 241 3 3 241 49 251 + 242 3 3 251 49 50 + 243 3 3 19 243 250 + 244 3 3 19 250 18 + 245 3 3 244 112 252 + 246 3 3 252 112 113 + 247 3 3 240 17 254 + 248 3 3 254 17 18 + 249 3 3 82 130 247 + 250 3 3 252 113 248 + 251 3 3 18 250 254 + 252 3 3 50 249 251 + 253 3 3 132 137 136 + 254 3 3 129 140 135 + 255 3 3 138 133 139 + 256 3 3 134 142 141 + 257 3 3 148 136 253 + 258 3 3 253 136 137 + 259 3 3 137 144 256 + 260 3 3 137 256 253 + 261 3 3 144 153 257 + 262 3 3 144 257 256 + 263 3 3 153 161 258 + 264 3 3 153 258 257 + 265 3 3 161 169 259 + 266 3 3 161 259 258 + 267 3 3 169 178 260 + 268 3 3 169 260 259 + 269 3 3 178 186 261 + 270 3 3 178 261 260 + 271 3 3 186 195 262 + 272 3 3 186 262 261 + 273 3 3 195 202 263 + 274 3 3 195 263 262 + 275 3 3 202 211 264 + 276 3 3 202 264 263 + 277 3 3 211 218 265 + 278 3 3 211 265 264 + 279 3 3 218 225 266 + 280 3 3 218 266 265 + 281 3 3 225 231 267 + 282 3 3 225 267 266 + 283 3 3 231 241 268 + 284 3 3 231 268 267 + 285 3 3 241 251 269 + 286 3 3 241 269 268 + 287 3 3 156 148 270 + 288 3 3 270 148 253 + 289 3 3 165 156 271 + 290 3 3 271 156 270 + 291 3 3 173 165 272 + 292 3 3 272 165 271 + 293 3 3 180 173 273 + 294 3 3 273 173 272 + 295 3 3 188 180 274 + 296 3 3 274 180 273 + 297 3 3 193 188 275 + 298 3 3 275 188 274 + 299 3 3 199 193 276 + 300 3 3 276 193 275 + 301 3 3 209 199 277 + 302 3 3 277 199 276 + 303 3 3 219 209 278 + 304 3 3 278 209 277 + 305 3 3 228 219 279 + 306 3 3 279 219 278 + 307 3 3 235 228 280 + 308 3 3 280 228 279 + 309 3 3 243 235 281 + 310 3 3 281 235 280 + 311 3 3 250 243 282 + 312 3 3 282 243 281 + 313 3 3 147 141 283 + 314 3 3 283 141 142 + 315 3 3 142 149 284 + 316 3 3 142 284 283 + 317 3 3 149 157 285 + 318 3 3 149 285 284 + 319 3 3 157 163 286 + 320 3 3 157 286 285 + 321 3 3 163 171 287 + 322 3 3 163 287 286 + 323 3 3 171 176 288 + 324 3 3 171 288 287 + 325 3 3 176 184 289 + 326 3 3 176 289 288 + 327 3 3 184 197 290 + 328 3 3 184 290 289 + 329 3 3 197 203 291 + 330 3 3 197 291 290 + 331 3 3 203 213 292 + 332 3 3 203 292 291 + 333 3 3 213 216 293 + 334 3 3 213 293 292 + 335 3 3 216 229 294 + 336 3 3 216 294 293 + 337 3 3 229 233 295 + 338 3 3 229 295 294 + 339 3 3 233 244 296 + 340 3 3 233 296 295 + 341 3 3 244 252 297 + 342 3 3 244 297 296 + 343 3 3 155 147 298 + 344 3 3 298 147 283 + 345 3 3 162 155 299 + 346 3 3 299 155 298 + 347 3 3 170 162 300 + 348 3 3 300 162 299 + 349 3 3 181 170 301 + 350 3 3 301 170 300 + 351 3 3 189 181 302 + 352 3 3 302 181 301 + 353 3 3 194 189 303 + 354 3 3 303 189 302 + 355 3 3 200 194 304 + 356 3 3 304 194 303 + 357 3 3 210 200 305 + 358 3 3 305 200 304 + 359 3 3 217 210 306 + 360 3 3 306 210 305 + 361 3 3 224 217 307 + 362 3 3 307 217 306 + 363 3 3 237 224 308 + 364 3 3 308 224 307 + 365 3 3 245 237 309 + 366 3 3 309 237 308 + 367 3 3 130 245 310 + 368 3 3 310 245 309 + 369 3 3 140 146 311 + 370 3 3 140 311 135 + 371 3 3 143 135 312 + 372 3 3 312 135 311 + 373 3 3 151 143 313 + 374 3 3 313 143 312 + 375 3 3 159 151 314 + 376 3 3 314 151 313 + 377 3 3 167 159 315 + 378 3 3 315 159 314 + 379 3 3 179 167 316 + 380 3 3 316 167 315 + 381 3 3 187 179 317 + 382 3 3 317 179 316 + 383 3 3 192 187 318 + 384 3 3 318 187 317 + 385 3 3 204 192 319 + 386 3 3 319 192 318 + 387 3 3 208 204 320 + 388 3 3 320 204 319 + 389 3 3 215 208 321 + 390 3 3 321 208 320 + 391 3 3 223 215 322 + 392 3 3 322 215 321 + 393 3 3 236 223 323 + 394 3 3 323 223 322 + 395 3 3 246 236 324 + 396 3 3 324 236 323 + 397 3 3 248 246 325 + 398 3 3 325 246 324 + 399 3 3 146 154 326 + 400 3 3 146 326 311 + 401 3 3 154 164 327 + 402 3 3 154 327 326 + 403 3 3 164 172 328 + 404 3 3 164 328 327 + 405 3 3 172 177 329 + 406 3 3 172 329 328 + 407 3 3 177 185 330 + 408 3 3 177 330 329 + 409 3 3 185 191 331 + 410 3 3 185 331 330 + 411 3 3 191 201 332 + 412 3 3 191 332 331 + 413 3 3 201 207 333 + 414 3 3 201 333 332 + 415 3 3 207 221 334 + 416 3 3 207 334 333 + 417 3 3 221 230 335 + 418 3 3 221 335 334 + 419 3 3 230 234 336 + 420 3 3 230 336 335 + 421 3 3 234 240 337 + 422 3 3 234 337 336 + 423 3 3 240 254 338 + 424 3 3 240 338 337 + 425 3 3 139 145 339 + 426 3 3 139 339 138 + 427 3 3 150 138 340 + 428 3 3 340 138 339 + 429 3 3 158 150 341 + 430 3 3 341 150 340 + 431 3 3 166 158 342 + 432 3 3 342 158 341 + 433 3 3 174 166 343 + 434 3 3 343 166 342 + 435 3 3 182 174 344 + 436 3 3 344 174 343 + 437 3 3 190 182 345 + 438 3 3 345 182 344 + 439 3 3 198 190 346 + 440 3 3 346 190 345 + 441 3 3 206 198 347 + 442 3 3 347 198 346 + 443 3 3 212 206 348 + 444 3 3 348 206 347 + 445 3 3 220 212 349 + 446 3 3 349 212 348 + 447 3 3 227 220 350 + 448 3 3 350 220 349 + 449 3 3 238 227 351 + 450 3 3 351 227 350 + 451 3 3 242 238 352 + 452 3 3 352 238 351 + 453 3 3 249 242 353 + 454 3 3 353 242 352 + 455 3 3 145 152 354 + 456 3 3 145 354 339 + 457 3 3 152 160 355 + 458 3 3 152 355 354 + 459 3 3 160 168 356 + 460 3 3 160 356 355 + 461 3 3 168 175 357 + 462 3 3 168 357 356 + 463 3 3 175 183 358 + 464 3 3 175 358 357 + 465 3 3 183 196 359 + 466 3 3 183 359 358 + 467 3 3 196 205 360 + 468 3 3 196 360 359 + 469 3 3 205 214 361 + 470 3 3 205 361 360 + 471 3 3 214 222 362 + 472 3 3 214 362 361 + 473 3 3 222 226 363 + 474 3 3 222 363 362 + 475 3 3 226 232 364 + 476 3 3 226 364 363 + 477 3 3 232 239 365 + 478 3 3 232 365 364 + 479 3 3 239 247 366 + 480 3 3 239 366 365 + 481 3 3 269 251 249 + 482 3 3 249 353 269 + 483 3 3 252 248 297 + 484 3 3 248 325 297 + 485 3 3 254 250 338 + 486 3 3 250 282 367 + 487 3 3 250 367 338 + 488 3 3 130 310 368 + 489 3 3 130 368 247 + 490 3 3 366 247 368 + 491 3 3 298 283 369 + 492 3 3 369 283 284 + 493 3 3 284 285 369 + 494 3 3 270 253 370 + 495 3 3 370 253 256 + 496 3 3 256 257 370 + 497 3 3 339 354 371 + 498 3 3 339 371 340 + 499 3 3 341 340 371 + 500 3 3 312 311 372 + 501 3 3 372 311 326 + 502 3 3 313 312 372 + 503 3 3 326 327 373 + 504 3 3 326 373 372 + 505 3 3 327 328 374 + 506 3 3 327 374 373 + 507 3 3 328 329 375 + 508 3 3 328 375 374 + 509 3 3 329 330 376 + 510 3 3 329 376 375 + 511 3 3 330 331 377 + 512 3 3 330 377 376 + 513 3 3 331 332 378 + 514 3 3 331 378 377 + 515 3 3 332 333 379 + 516 3 3 332 379 378 + 517 3 3 333 334 380 + 518 3 3 333 380 379 + 519 3 3 334 335 381 + 520 3 3 334 381 380 + 521 3 3 335 336 382 + 522 3 3 335 382 381 + 523 3 3 336 337 383 + 524 3 3 336 383 382 + 525 3 3 299 298 384 + 526 3 3 384 298 369 + 527 3 3 300 299 385 + 528 3 3 385 299 384 + 529 3 3 301 300 386 + 530 3 3 386 300 385 + 531 3 3 302 301 387 + 532 3 3 387 301 386 + 533 3 3 303 302 388 + 534 3 3 388 302 387 + 535 3 3 304 303 389 + 536 3 3 389 303 388 + 537 3 3 305 304 390 + 538 3 3 390 304 389 + 539 3 3 306 305 391 + 540 3 3 391 305 390 + 541 3 3 307 306 392 + 542 3 3 392 306 391 + 543 3 3 308 307 393 + 544 3 3 393 307 392 + 545 3 3 309 308 394 + 546 3 3 394 308 393 + 547 3 3 271 270 395 + 548 3 3 395 270 370 + 549 3 3 272 271 396 + 550 3 3 396 271 395 + 551 3 3 273 272 397 + 552 3 3 397 272 396 + 553 3 3 274 273 398 + 554 3 3 398 273 397 + 555 3 3 275 274 399 + 556 3 3 399 274 398 + 557 3 3 276 275 400 + 558 3 3 400 275 399 + 559 3 3 277 276 401 + 560 3 3 401 276 400 + 561 3 3 278 277 402 + 562 3 3 402 277 401 + 563 3 3 279 278 403 + 564 3 3 403 278 402 + 565 3 3 280 279 404 + 566 3 3 404 279 403 + 567 3 3 281 280 405 + 568 3 3 405 280 404 + 569 3 3 282 281 406 + 570 3 3 406 281 405 + 571 3 3 354 355 407 + 572 3 3 354 407 371 + 573 3 3 355 356 408 + 574 3 3 355 408 407 + 575 3 3 356 357 409 + 576 3 3 356 409 408 + 577 3 3 357 358 410 + 578 3 3 357 410 409 + 579 3 3 358 359 411 + 580 3 3 358 411 410 + 581 3 3 359 360 412 + 582 3 3 359 412 411 + 583 3 3 360 361 413 + 584 3 3 360 413 412 + 585 3 3 361 362 414 + 586 3 3 361 414 413 + 587 3 3 362 363 415 + 588 3 3 362 415 414 + 589 3 3 363 364 416 + 590 3 3 363 416 415 + 591 3 3 364 365 417 + 592 3 3 364 417 416 + 593 3 3 365 366 418 + 594 3 3 365 418 417 + 595 3 3 337 338 419 + 596 3 3 337 419 383 + 597 3 3 310 309 420 + 598 3 3 420 309 394 + 599 3 3 314 313 421 + 600 3 3 421 313 372 + 601 3 3 315 314 422 + 602 3 3 422 314 421 + 603 3 3 316 315 423 + 604 3 3 423 315 422 + 605 3 3 317 316 424 + 606 3 3 424 316 423 + 607 3 3 318 317 425 + 608 3 3 425 317 424 + 609 3 3 319 318 426 + 610 3 3 426 318 425 + 611 3 3 320 319 427 + 612 3 3 427 319 426 + 613 3 3 321 320 428 + 614 3 3 428 320 427 + 615 3 3 322 321 429 + 616 3 3 429 321 428 + 617 3 3 323 322 430 + 618 3 3 430 322 429 + 619 3 3 324 323 431 + 620 3 3 431 323 430 + 621 3 3 325 324 432 + 622 3 3 432 324 431 + 623 3 3 285 286 433 + 624 3 3 285 433 369 + 625 3 3 286 287 434 + 626 3 3 286 434 433 + 627 3 3 287 288 435 + 628 3 3 287 435 434 + 629 3 3 288 289 436 + 630 3 3 288 436 435 + 631 3 3 289 290 437 + 632 3 3 289 437 436 + 633 3 3 290 291 438 + 634 3 3 290 438 437 + 635 3 3 291 292 439 + 636 3 3 291 439 438 + 637 3 3 292 293 440 + 638 3 3 292 440 439 + 639 3 3 293 294 441 + 640 3 3 293 441 440 + 641 3 3 294 295 442 + 642 3 3 294 442 441 + 643 3 3 295 296 443 + 644 3 3 295 443 442 + 645 3 3 296 297 444 + 646 3 3 296 444 443 + 647 3 3 257 258 445 + 648 3 3 257 445 370 + 649 3 3 258 259 446 + 650 3 3 258 446 445 + 651 3 3 259 260 447 + 652 3 3 259 447 446 + 653 3 3 260 261 448 + 654 3 3 260 448 447 + 655 3 3 261 262 449 + 656 3 3 261 449 448 + 657 3 3 262 263 450 + 658 3 3 262 450 449 + 659 3 3 263 264 451 + 660 3 3 263 451 450 + 661 3 3 264 265 452 + 662 3 3 264 452 451 + 663 3 3 265 266 453 + 664 3 3 265 453 452 + 665 3 3 266 267 454 + 666 3 3 266 454 453 + 667 3 3 267 268 455 + 668 3 3 267 455 454 + 669 3 3 268 269 456 + 670 3 3 268 456 455 + 671 3 3 342 341 457 + 672 3 3 457 341 371 + 673 3 3 343 342 458 + 674 3 3 458 342 457 + 675 3 3 344 343 459 + 676 3 3 459 343 458 + 677 3 3 345 344 460 + 678 3 3 460 344 459 + 679 3 3 346 345 461 + 680 3 3 461 345 460 + 681 3 3 347 346 462 + 682 3 3 462 346 461 + 683 3 3 348 347 463 + 684 3 3 463 347 462 + 685 3 3 349 348 464 + 686 3 3 464 348 463 + 687 3 3 350 349 465 + 688 3 3 465 349 464 + 689 3 3 351 350 466 + 690 3 3 466 350 465 + 691 3 3 352 351 467 + 692 3 3 467 351 466 + 693 3 3 353 352 468 + 694 3 3 468 352 467 + 695 3 3 370 445 469 + 696 3 3 370 469 395 + 697 3 3 369 433 470 + 698 3 3 369 470 384 + 699 3 3 371 407 471 + 700 3 3 371 471 457 + 701 3 3 372 373 472 + 702 3 3 372 472 421 + 703 3 3 367 282 473 + 704 3 3 473 282 406 + 705 3 3 338 367 474 + 706 3 3 338 474 419 + 707 3 3 373 374 475 + 708 3 3 373 475 472 + 709 3 3 407 408 476 + 710 3 3 407 476 471 + 711 3 3 396 395 477 + 712 3 3 477 395 469 + 713 3 3 385 384 478 + 714 3 3 478 384 470 + 715 3 3 374 375 479 + 716 3 3 374 479 475 + 717 3 3 408 409 480 + 718 3 3 408 480 476 + 719 3 3 397 396 481 + 720 3 3 481 396 477 + 721 3 3 386 385 482 + 722 3 3 482 385 478 + 723 3 3 375 376 483 + 724 3 3 375 483 479 + 725 3 3 409 410 484 + 726 3 3 409 484 480 + 727 3 3 398 397 485 + 728 3 3 485 397 481 + 729 3 3 387 386 486 + 730 3 3 486 386 482 + 731 3 3 376 377 487 + 732 3 3 376 487 483 + 733 3 3 410 411 488 + 734 3 3 410 488 484 + 735 3 3 399 398 489 + 736 3 3 489 398 485 + 737 3 3 388 387 490 + 738 3 3 490 387 486 + 739 3 3 377 378 491 + 740 3 3 377 491 487 + 741 3 3 411 412 492 + 742 3 3 411 492 488 + 743 3 3 400 399 493 + 744 3 3 493 399 489 + 745 3 3 389 388 494 + 746 3 3 494 388 490 + 747 3 3 378 379 495 + 748 3 3 378 495 491 + 749 3 3 412 413 496 + 750 3 3 412 496 492 + 751 3 3 401 400 497 + 752 3 3 497 400 493 + 753 3 3 390 389 498 + 754 3 3 498 389 494 + 755 3 3 379 380 499 + 756 3 3 379 499 495 + 757 3 3 413 414 500 + 758 3 3 413 500 496 + 759 3 3 402 401 501 + 760 3 3 501 401 497 + 761 3 3 391 390 502 + 762 3 3 502 390 498 + 763 3 3 380 381 503 + 764 3 3 380 503 499 + 765 3 3 414 415 504 + 766 3 3 414 504 500 + 767 3 3 403 402 505 + 768 3 3 505 402 501 + 769 3 3 392 391 506 + 770 3 3 506 391 502 + 771 3 3 415 416 507 + 772 3 3 415 507 504 + 773 3 3 381 382 508 + 774 3 3 381 508 503 + 775 3 3 404 403 509 + 776 3 3 509 403 505 + 777 3 3 393 392 510 + 778 3 3 510 392 506 + 779 3 3 416 417 511 + 780 3 3 416 511 507 + 781 3 3 382 383 512 + 782 3 3 382 512 508 + 783 3 3 405 404 513 + 784 3 3 513 404 509 + 785 3 3 394 393 514 + 786 3 3 514 393 510 + 787 3 3 417 418 515 + 788 3 3 417 515 511 + 789 3 3 406 405 516 + 790 3 3 516 405 513 + 791 3 3 383 419 517 + 792 3 3 383 517 512 + 793 3 3 420 394 518 + 794 3 3 518 394 514 + 795 3 3 297 325 519 + 796 3 3 297 519 444 + 797 3 3 325 432 519 + 798 3 3 269 353 520 + 799 3 3 269 520 456 + 800 3 3 353 468 520 + 801 3 3 433 434 521 + 802 3 3 433 521 470 + 803 3 3 445 446 522 + 804 3 3 445 522 469 + 805 3 3 458 457 523 + 806 3 3 523 457 471 + 807 3 3 422 421 524 + 808 3 3 524 421 472 + 809 3 3 368 310 525 + 810 3 3 525 310 420 + 811 3 3 366 368 526 + 812 3 3 526 368 525 + 813 3 3 418 366 526 + 814 3 3 423 422 527 + 815 3 3 527 422 524 + 816 3 3 424 423 528 + 817 3 3 528 423 527 + 818 3 3 425 424 529 + 819 3 3 529 424 528 + 820 3 3 426 425 530 + 821 3 3 530 425 529 + 822 3 3 427 426 531 + 823 3 3 531 426 530 + 824 3 3 428 427 532 + 825 3 3 532 427 531 + 826 3 3 429 428 533 + 827 3 3 533 428 532 + 828 3 3 430 429 534 + 829 3 3 534 429 533 + 830 3 3 431 430 535 + 831 3 3 535 430 534 + 832 3 3 432 431 536 + 833 3 3 536 431 535 + 834 3 3 434 435 537 + 835 3 3 434 537 521 + 836 3 3 435 436 538 + 837 3 3 435 538 537 + 838 3 3 436 437 539 + 839 3 3 436 539 538 + 840 3 3 437 438 540 + 841 3 3 437 540 539 + 842 3 3 438 439 541 + 843 3 3 438 541 540 + 844 3 3 439 440 542 + 845 3 3 439 542 541 + 846 3 3 440 441 543 + 847 3 3 440 543 542 + 848 3 3 441 442 544 + 849 3 3 441 544 543 + 850 3 3 442 443 545 + 851 3 3 442 545 544 + 852 3 3 443 444 546 + 853 3 3 443 546 545 + 854 3 3 446 447 547 + 855 3 3 446 547 522 + 856 3 3 447 448 548 + 857 3 3 447 548 547 + 858 3 3 448 449 549 + 859 3 3 448 549 548 + 860 3 3 449 450 550 + 861 3 3 449 550 549 + 862 3 3 450 451 551 + 863 3 3 450 551 550 + 864 3 3 451 452 552 + 865 3 3 451 552 551 + 866 3 3 452 453 553 + 867 3 3 452 553 552 + 868 3 3 453 454 554 + 869 3 3 453 554 553 + 870 3 3 454 455 555 + 871 3 3 454 555 554 + 872 3 3 455 456 556 + 873 3 3 455 556 555 + 874 3 3 459 458 557 + 875 3 3 557 458 523 + 876 3 3 460 459 558 + 877 3 3 558 459 557 + 878 3 3 461 460 559 + 879 3 3 559 460 558 + 880 3 3 462 461 560 + 881 3 3 560 461 559 + 882 3 3 463 462 561 + 883 3 3 561 462 560 + 884 3 3 464 463 562 + 885 3 3 562 463 561 + 886 3 3 465 464 563 + 887 3 3 563 464 562 + 888 3 3 466 465 564 + 889 3 3 564 465 563 + 890 3 3 467 466 565 + 891 3 3 565 466 564 + 892 3 3 468 467 566 + 893 3 3 566 467 565 + 894 3 3 367 473 474 + 895 3 3 478 470 521 + 896 3 3 523 471 476 + 897 3 3 469 522 477 + 898 3 3 524 472 475 + 899 3 3 473 406 567 + 900 3 3 567 406 516 + 901 3 3 418 526 568 + 902 3 3 418 568 515 + 903 3 3 526 525 569 + 904 3 3 526 569 568 + 905 3 3 525 420 569 + 906 3 3 420 518 569 + 907 3 3 517 419 570 + 908 3 3 570 419 474 + 909 3 3 546 444 571 + 910 3 3 571 444 519 + 911 3 3 519 432 572 + 912 3 3 519 572 571 + 913 3 3 432 536 572 + 914 3 3 556 456 573 + 915 3 3 573 456 520 + 916 3 3 520 468 574 + 917 3 3 520 574 573 + 918 3 3 468 566 574 + 919 3 3 522 547 575 + 920 3 3 522 575 477 + 921 3 3 481 477 576 + 922 3 3 576 477 575 + 923 3 3 485 481 577 + 924 3 3 577 481 576 + 925 3 3 489 485 578 + 926 3 3 578 485 577 + 927 3 3 493 489 579 + 928 3 3 579 489 578 + 929 3 3 497 493 580 + 930 3 3 580 493 579 + 931 3 3 501 497 581 + 932 3 3 581 497 580 + 933 3 3 505 501 582 + 934 3 3 582 501 581 + 935 3 3 509 505 583 + 936 3 3 583 505 582 + 937 3 3 513 509 584 + 938 3 3 584 509 583 + 939 3 3 516 513 585 + 940 3 3 585 513 584 + 941 3 3 547 548 586 + 942 3 3 547 586 575 + 943 3 3 548 549 587 + 944 3 3 548 587 586 + 945 3 3 549 550 588 + 946 3 3 549 588 587 + 947 3 3 550 551 589 + 948 3 3 550 589 588 + 949 3 3 551 552 590 + 950 3 3 551 590 589 + 951 3 3 552 553 591 + 952 3 3 552 591 590 + 953 3 3 553 554 592 + 954 3 3 553 592 591 + 955 3 3 554 555 593 + 956 3 3 554 593 592 + 957 3 3 555 556 594 + 958 3 3 555 594 593 + 959 3 3 557 523 595 + 960 3 3 595 523 476 + 961 3 3 476 480 596 + 962 3 3 476 596 595 + 963 3 3 480 484 597 + 964 3 3 480 597 596 + 965 3 3 484 488 598 + 966 3 3 484 598 597 + 967 3 3 488 492 599 + 968 3 3 488 599 598 + 969 3 3 492 496 600 + 970 3 3 492 600 599 + 971 3 3 496 500 601 + 972 3 3 496 601 600 + 973 3 3 500 504 602 + 974 3 3 500 602 601 + 975 3 3 504 507 603 + 976 3 3 504 603 602 + 977 3 3 507 511 604 + 978 3 3 507 604 603 + 979 3 3 511 515 605 + 980 3 3 511 605 604 + 981 3 3 558 557 606 + 982 3 3 606 557 595 + 983 3 3 559 558 607 + 984 3 3 607 558 606 + 985 3 3 560 559 608 + 986 3 3 608 559 607 + 987 3 3 561 560 609 + 988 3 3 609 560 608 + 989 3 3 562 561 610 + 990 3 3 610 561 609 + 991 3 3 563 562 611 + 992 3 3 611 562 610 + 993 3 3 564 563 612 + 994 3 3 612 563 611 + 995 3 3 565 564 613 + 996 3 3 613 564 612 + 997 3 3 566 565 614 + 998 3 3 614 565 613 + 999 3 3 521 537 615 + 1000 3 3 521 615 478 + 1001 3 3 482 478 616 + 1002 3 3 616 478 615 + 1003 3 3 486 482 617 + 1004 3 3 617 482 616 + 1005 3 3 490 486 618 + 1006 3 3 618 486 617 + 1007 3 3 494 490 619 + 1008 3 3 619 490 618 + 1009 3 3 498 494 620 + 1010 3 3 620 494 619 + 1011 3 3 502 498 621 + 1012 3 3 621 498 620 + 1013 3 3 506 502 622 + 1014 3 3 622 502 621 + 1015 3 3 510 506 623 + 1016 3 3 623 506 622 + 1017 3 3 514 510 624 + 1018 3 3 624 510 623 + 1019 3 3 518 514 625 + 1020 3 3 625 514 624 + 1021 3 3 537 538 626 + 1022 3 3 537 626 615 + 1023 3 3 538 539 627 + 1024 3 3 538 627 626 + 1025 3 3 539 540 628 + 1026 3 3 539 628 627 + 1027 3 3 540 541 629 + 1028 3 3 540 629 628 + 1029 3 3 541 542 630 + 1030 3 3 541 630 629 + 1031 3 3 542 543 631 + 1032 3 3 542 631 630 + 1033 3 3 543 544 632 + 1034 3 3 543 632 631 + 1035 3 3 544 545 633 + 1036 3 3 544 633 632 + 1037 3 3 545 546 634 + 1038 3 3 545 634 633 + 1039 3 3 527 524 635 + 1040 3 3 635 524 475 + 1041 3 3 475 479 636 + 1042 3 3 475 636 635 + 1043 3 3 479 483 637 + 1044 3 3 479 637 636 + 1045 3 3 483 487 638 + 1046 3 3 483 638 637 + 1047 3 3 487 491 639 + 1048 3 3 487 639 638 + 1049 3 3 491 495 640 + 1050 3 3 491 640 639 + 1051 3 3 495 499 641 + 1052 3 3 495 641 640 + 1053 3 3 499 503 642 + 1054 3 3 499 642 641 + 1055 3 3 503 508 643 + 1056 3 3 503 643 642 + 1057 3 3 508 512 644 + 1058 3 3 508 644 643 + 1059 3 3 512 517 645 + 1060 3 3 512 645 644 + 1061 3 3 528 527 646 + 1062 3 3 646 527 635 + 1063 3 3 529 528 647 + 1064 3 3 647 528 646 + 1065 3 3 530 529 648 + 1066 3 3 648 529 647 + 1067 3 3 531 530 649 + 1068 3 3 649 530 648 + 1069 3 3 532 531 650 + 1070 3 3 650 531 649 + 1071 3 3 533 532 651 + 1072 3 3 651 532 650 + 1073 3 3 534 533 652 + 1074 3 3 652 533 651 + 1075 3 3 535 534 653 + 1076 3 3 653 534 652 + 1077 3 3 536 535 654 + 1078 3 3 654 535 653 + 1079 3 3 517 570 655 + 1080 3 3 517 655 645 + 1081 3 3 570 474 656 + 1082 3 3 656 474 473 + 1083 3 3 473 567 656 + 1084 3 3 567 516 657 + 1085 3 3 657 516 585 + 1086 3 3 569 518 658 + 1087 3 3 658 518 625 + 1088 3 3 605 515 659 + 1089 3 3 659 515 568 + 1090 3 3 568 569 660 + 1091 3 3 568 660 659 + 1092 3 3 616 615 661 + 1093 3 3 661 615 626 + 1094 3 3 617 616 661 + 1095 3 3 576 575 662 + 1096 3 3 662 575 586 + 1097 3 3 577 576 662 + 1098 3 3 595 596 663 + 1099 3 3 595 663 606 + 1100 3 3 596 597 663 + 1101 3 3 635 636 664 + 1102 3 3 635 664 646 + 1103 3 3 636 637 664 + 1104 3 3 574 566 665 + 1105 3 3 665 566 614 + 1106 3 3 572 536 666 + 1107 3 3 666 536 654 + 1108 3 3 546 571 667 + 1109 3 3 546 667 634 + 1110 3 3 571 572 668 + 1111 3 3 571 668 667 + 1112 3 3 556 573 669 + 1113 3 3 556 669 594 + 1114 3 3 573 574 670 + 1115 3 3 573 670 669 + 1116 3 3 647 646 671 + 1117 3 3 671 646 664 + 1118 3 3 648 647 672 + 1119 3 3 672 647 671 + 1120 3 3 649 648 673 + 1121 3 3 673 648 672 + 1122 3 3 650 649 674 + 1123 3 3 674 649 673 + 1124 3 3 651 650 675 + 1125 3 3 675 650 674 + 1126 3 3 652 651 676 + 1127 3 3 676 651 675 + 1128 3 3 653 652 677 + 1129 3 3 677 652 676 + 1130 3 3 654 653 678 + 1131 3 3 678 653 677 + 1132 3 3 607 606 679 + 1133 3 3 679 606 663 + 1134 3 3 608 607 680 + 1135 3 3 680 607 679 + 1136 3 3 609 608 681 + 1137 3 3 681 608 680 + 1138 3 3 610 609 682 + 1139 3 3 682 609 681 + 1140 3 3 611 610 683 + 1141 3 3 683 610 682 + 1142 3 3 612 611 684 + 1143 3 3 684 611 683 + 1144 3 3 613 612 685 + 1145 3 3 685 612 684 + 1146 3 3 614 613 686 + 1147 3 3 686 613 685 + 1148 3 3 626 627 687 + 1149 3 3 626 687 661 + 1150 3 3 627 628 688 + 1151 3 3 627 688 687 + 1152 3 3 628 629 689 + 1153 3 3 628 689 688 + 1154 3 3 629 630 690 + 1155 3 3 629 690 689 + 1156 3 3 630 631 691 + 1157 3 3 630 691 690 + 1158 3 3 631 632 692 + 1159 3 3 631 692 691 + 1160 3 3 632 633 693 + 1161 3 3 632 693 692 + 1162 3 3 633 634 694 + 1163 3 3 633 694 693 + 1164 3 3 586 587 695 + 1165 3 3 586 695 662 + 1166 3 3 587 588 696 + 1167 3 3 587 696 695 + 1168 3 3 588 589 697 + 1169 3 3 588 697 696 + 1170 3 3 589 590 698 + 1171 3 3 589 698 697 + 1172 3 3 590 591 699 + 1173 3 3 590 699 698 + 1174 3 3 591 592 700 + 1175 3 3 591 700 699 + 1176 3 3 592 593 701 + 1177 3 3 592 701 700 + 1178 3 3 593 594 702 + 1179 3 3 593 702 701 + 1180 3 3 637 638 703 + 1181 3 3 637 703 664 + 1182 3 3 638 639 704 + 1183 3 3 638 704 703 + 1184 3 3 639 640 705 + 1185 3 3 639 705 704 + 1186 3 3 640 641 706 + 1187 3 3 640 706 705 + 1188 3 3 641 642 707 + 1189 3 3 641 707 706 + 1190 3 3 642 643 708 + 1191 3 3 642 708 707 + 1192 3 3 643 644 709 + 1193 3 3 643 709 708 + 1194 3 3 644 645 710 + 1195 3 3 644 710 709 + 1196 3 3 597 598 711 + 1197 3 3 597 711 663 + 1198 3 3 598 599 712 + 1199 3 3 598 712 711 + 1200 3 3 599 600 713 + 1201 3 3 599 713 712 + 1202 3 3 600 601 714 + 1203 3 3 600 714 713 + 1204 3 3 601 602 715 + 1205 3 3 601 715 714 + 1206 3 3 602 603 716 + 1207 3 3 602 716 715 + 1208 3 3 603 604 717 + 1209 3 3 603 717 716 + 1210 3 3 604 605 718 + 1211 3 3 604 718 717 + 1212 3 3 578 577 719 + 1213 3 3 719 577 662 + 1214 3 3 579 578 720 + 1215 3 3 720 578 719 + 1216 3 3 580 579 721 + 1217 3 3 721 579 720 + 1218 3 3 581 580 722 + 1219 3 3 722 580 721 + 1220 3 3 582 581 723 + 1221 3 3 723 581 722 + 1222 3 3 583 582 724 + 1223 3 3 724 582 723 + 1224 3 3 584 583 725 + 1225 3 3 725 583 724 + 1226 3 3 585 584 726 + 1227 3 3 726 584 725 + 1228 3 3 618 617 727 + 1229 3 3 727 617 661 + 1230 3 3 619 618 728 + 1231 3 3 728 618 727 + 1232 3 3 620 619 729 + 1233 3 3 729 619 728 + 1234 3 3 621 620 730 + 1235 3 3 730 620 729 + 1236 3 3 622 621 731 + 1237 3 3 731 621 730 + 1238 3 3 623 622 732 + 1239 3 3 732 622 731 + 1240 3 3 624 623 733 + 1241 3 3 733 623 732 + 1242 3 3 625 624 734 + 1243 3 3 734 624 733 + 1244 3 3 574 665 670 + 1245 3 3 572 666 668 + 1246 3 3 569 658 660 + 1247 3 3 719 662 735 + 1248 3 3 735 662 695 + 1249 3 3 679 663 736 + 1250 3 3 736 663 711 + 1251 3 3 727 661 737 + 1252 3 3 737 661 687 + 1253 3 3 671 664 738 + 1254 3 3 738 664 703 + 1255 3 3 656 567 657 + 1256 3 3 710 645 739 + 1257 3 3 739 645 655 + 1258 3 3 672 671 740 + 1259 3 3 740 671 738 + 1260 3 3 695 696 741 + 1261 3 3 695 741 735 + 1262 3 3 687 688 742 + 1263 3 3 687 742 737 + 1264 3 3 680 679 743 + 1265 3 3 743 679 736 + 1266 3 3 681 680 744 + 1267 3 3 744 680 743 + 1268 3 3 673 672 745 + 1269 3 3 745 672 740 + 1270 3 3 688 689 746 + 1271 3 3 688 746 742 + 1272 3 3 696 697 747 + 1273 3 3 696 747 741 + 1274 3 3 674 673 748 + 1275 3 3 748 673 745 + 1276 3 3 689 690 749 + 1277 3 3 689 749 746 + 1278 3 3 697 698 750 + 1279 3 3 697 750 747 + 1280 3 3 682 681 751 + 1281 3 3 751 681 744 + 1282 3 3 655 570 752 + 1283 3 3 752 570 656 + 1284 3 3 625 734 753 + 1285 3 3 625 753 658 + 1286 3 3 675 674 754 + 1287 3 3 754 674 748 + 1288 3 3 690 691 755 + 1289 3 3 690 755 749 + 1290 3 3 698 699 756 + 1291 3 3 698 756 750 + 1292 3 3 683 682 757 + 1293 3 3 757 682 751 + 1294 3 3 657 585 758 + 1295 3 3 758 585 726 + 1296 3 3 720 719 759 + 1297 3 3 759 719 735 + 1298 3 3 728 727 760 + 1299 3 3 760 727 737 + 1300 3 3 703 704 761 + 1301 3 3 703 761 738 + 1302 3 3 711 712 762 + 1303 3 3 711 762 736 + 1304 3 3 684 683 763 + 1305 3 3 763 683 757 + 1306 3 3 676 675 764 + 1307 3 3 764 675 754 + 1308 3 3 691 692 765 + 1309 3 3 691 765 755 + 1310 3 3 699 700 766 + 1311 3 3 699 766 756 + 1312 3 3 685 684 767 + 1313 3 3 767 684 763 + 1314 3 3 677 676 768 + 1315 3 3 768 676 764 + 1316 3 3 700 701 769 + 1317 3 3 700 769 766 + 1318 3 3 692 693 770 + 1319 3 3 692 770 765 + 1320 3 3 686 685 771 + 1321 3 3 771 685 767 + 1322 3 3 678 677 772 + 1323 3 3 772 677 768 + 1324 3 3 693 694 773 + 1325 3 3 693 773 770 + 1326 3 3 701 702 774 + 1327 3 3 701 774 769 + 1328 3 3 718 605 775 + 1329 3 3 775 605 659 + 1330 3 3 666 654 776 + 1331 3 3 776 654 678 + 1332 3 3 614 686 777 + 1333 3 3 614 777 665 + 1334 3 3 702 594 778 + 1335 3 3 778 594 669 + 1336 3 3 694 634 779 + 1337 3 3 779 634 667 + 1338 3 3 669 670 780 + 1339 3 3 669 780 778 + 1340 3 3 667 668 781 + 1341 3 3 667 781 779 + 1342 3 3 704 705 782 + 1343 3 3 704 782 761 + 1344 3 3 705 706 783 + 1345 3 3 705 783 782 + 1346 3 3 706 707 784 + 1347 3 3 706 784 783 + 1348 3 3 707 708 785 + 1349 3 3 707 785 784 + 1350 3 3 708 709 786 + 1351 3 3 708 786 785 + 1352 3 3 729 728 787 + 1353 3 3 787 728 760 + 1354 3 3 730 729 788 + 1355 3 3 788 729 787 + 1356 3 3 731 730 789 + 1357 3 3 789 730 788 + 1358 3 3 732 731 790 + 1359 3 3 790 731 789 + 1360 3 3 733 732 791 + 1361 3 3 791 732 790 + 1362 3 3 721 720 792 + 1363 3 3 792 720 759 + 1364 3 3 722 721 793 + 1365 3 3 793 721 792 + 1366 3 3 723 722 794 + 1367 3 3 794 722 793 + 1368 3 3 724 723 795 + 1369 3 3 795 723 794 + 1370 3 3 725 724 796 + 1371 3 3 796 724 795 + 1372 3 3 726 725 797 + 1373 3 3 797 725 796 + 1374 3 3 712 713 798 + 1375 3 3 712 798 762 + 1376 3 3 713 714 799 + 1377 3 3 713 799 798 + 1378 3 3 714 715 800 + 1379 3 3 714 800 799 + 1380 3 3 715 716 801 + 1381 3 3 715 801 800 + 1382 3 3 716 717 802 + 1383 3 3 716 802 801 + 1384 3 3 717 718 803 + 1385 3 3 717 803 802 + 1386 3 3 709 710 804 + 1387 3 3 709 804 786 + 1388 3 3 734 733 805 + 1389 3 3 805 733 791 + 1390 3 3 659 660 806 + 1391 3 3 659 806 775 + 1392 3 3 752 656 657 + 1393 3 3 736 762 743 + 1394 3 3 737 742 760 + 1395 3 3 735 741 759 + 1396 3 3 740 738 761 + 1397 3 3 739 655 807 + 1398 3 3 807 655 752 + 1399 3 3 660 658 131 + 1400 3 3 131 658 753 + 1401 3 3 806 660 131 + 1402 3 3 657 758 808 + 1403 3 3 657 808 752 + 1404 3 3 758 726 810 + 1405 3 3 810 726 797 + 1406 3 3 803 718 811 + 1407 3 3 811 718 775 + 1408 3 3 678 772 812 + 1409 3 3 678 812 776 + 1410 3 3 686 771 813 + 1411 3 3 686 813 777 + 1412 3 3 774 702 814 + 1413 3 3 814 702 778 + 1414 3 3 773 694 815 + 1415 3 3 815 694 779 + 1416 3 3 781 668 816 + 1417 3 3 816 668 666 + 1418 3 3 666 776 816 + 1419 3 3 780 670 817 + 1420 3 3 817 670 665 + 1421 3 3 665 777 817 + 1422 3 3 778 780 818 + 1423 3 3 778 818 814 + 1424 3 3 779 781 819 + 1425 3 3 779 819 815 + 1426 3 3 804 710 820 + 1427 3 3 820 710 739 + 1428 3 3 775 806 821 + 1429 3 3 775 821 811 + 1430 3 3 762 798 822 + 1431 3 3 762 822 743 + 1432 3 3 744 743 823 + 1433 3 3 823 743 822 + 1434 3 3 751 744 824 + 1435 3 3 824 744 823 + 1436 3 3 757 751 825 + 1437 3 3 825 751 824 + 1438 3 3 763 757 826 + 1439 3 3 826 757 825 + 1440 3 3 767 763 827 + 1441 3 3 827 763 826 + 1442 3 3 771 767 828 + 1443 3 3 828 767 827 + 1444 3 3 798 799 829 + 1445 3 3 798 829 822 + 1446 3 3 799 800 830 + 1447 3 3 799 830 829 + 1448 3 3 800 801 831 + 1449 3 3 800 831 830 + 1450 3 3 801 802 832 + 1451 3 3 801 832 831 + 1452 3 3 802 803 833 + 1453 3 3 802 833 832 + 1454 3 3 787 760 834 + 1455 3 3 834 760 742 + 1456 3 3 742 746 835 + 1457 3 3 742 835 834 + 1458 3 3 746 749 836 + 1459 3 3 746 836 835 + 1460 3 3 749 755 837 + 1461 3 3 749 837 836 + 1462 3 3 755 765 838 + 1463 3 3 755 838 837 + 1464 3 3 765 770 839 + 1465 3 3 765 839 838 + 1466 3 3 770 773 840 + 1467 3 3 770 840 839 + 1468 3 3 788 787 841 + 1469 3 3 841 787 834 + 1470 3 3 789 788 842 + 1471 3 3 842 788 841 + 1472 3 3 790 789 843 + 1473 3 3 843 789 842 + 1474 3 3 791 790 844 + 1475 3 3 844 790 843 + 1476 3 3 805 791 845 + 1477 3 3 845 791 844 + 1478 3 3 792 759 846 + 1479 3 3 846 759 741 + 1480 3 3 741 747 847 + 1481 3 3 741 847 846 + 1482 3 3 747 750 848 + 1483 3 3 747 848 847 + 1484 3 3 750 756 849 + 1485 3 3 750 849 848 + 1486 3 3 756 766 850 + 1487 3 3 756 850 849 + 1488 3 3 766 769 851 + 1489 3 3 766 851 850 + 1490 3 3 769 774 852 + 1491 3 3 769 852 851 + 1492 3 3 793 792 853 + 1493 3 3 853 792 846 + 1494 3 3 794 793 854 + 1495 3 3 854 793 853 + 1496 3 3 795 794 855 + 1497 3 3 855 794 854 + 1498 3 3 796 795 856 + 1499 3 3 856 795 855 + 1500 3 3 797 796 857 + 1501 3 3 857 796 856 + 1502 3 3 761 782 858 + 1503 3 3 761 858 740 + 1504 3 3 745 740 859 + 1505 3 3 859 740 858 + 1506 3 3 748 745 860 + 1507 3 3 860 745 859 + 1508 3 3 754 748 861 + 1509 3 3 861 748 860 + 1510 3 3 764 754 862 + 1511 3 3 862 754 861 + 1512 3 3 768 764 863 + 1513 3 3 863 764 862 + 1514 3 3 772 768 864 + 1515 3 3 864 768 863 + 1516 3 3 782 783 865 + 1517 3 3 782 865 858 + 1518 3 3 783 784 866 + 1519 3 3 783 866 865 + 1520 3 3 784 785 867 + 1521 3 3 784 867 866 + 1522 3 3 785 786 868 + 1523 3 3 785 868 867 + 1524 3 3 786 804 869 + 1525 3 3 786 869 868 + 1526 3 3 753 734 870 + 1527 3 3 870 734 805 + 1528 3 3 807 752 808 + 1529 3 3 813 771 871 + 1530 3 3 871 771 828 + 1531 3 3 772 864 872 + 1532 3 3 772 872 812 + 1533 3 3 773 815 873 + 1534 3 3 773 873 840 + 1535 3 3 852 774 874 + 1536 3 3 874 774 814 + 1537 3 3 815 819 875 + 1538 3 3 815 875 873 + 1539 3 3 814 818 876 + 1540 3 3 814 876 874 + 1541 3 3 739 807 877 + 1542 3 3 739 877 820 + 1543 3 3 823 822 878 + 1544 3 3 878 822 829 + 1545 3 3 824 823 878 + 1546 3 3 834 835 879 + 1547 3 3 834 879 841 + 1548 3 3 835 836 879 + 1549 3 3 846 847 880 + 1550 3 3 846 880 853 + 1551 3 3 847 848 880 + 1552 3 3 858 865 881 + 1553 3 3 858 881 859 + 1554 3 3 860 859 881 + 1555 3 3 808 758 882 + 1556 3 3 882 758 810 + 1557 3 3 131 753 883 + 1558 3 3 131 883 806 + 1559 3 3 753 870 883 + 1560 3 3 821 806 884 + 1561 3 3 884 806 883 + 1562 3 3 797 857 885 + 1563 3 3 797 885 810 + 1564 3 3 833 803 886 + 1565 3 3 886 803 811 + 1566 3 3 818 780 887 + 1567 3 3 887 780 817 + 1568 3 3 817 777 888 + 1569 3 3 817 888 887 + 1570 3 3 777 813 888 + 1571 3 3 781 816 889 + 1572 3 3 781 889 819 + 1573 3 3 816 776 890 + 1574 3 3 816 890 889 + 1575 3 3 776 812 890 + 1576 3 3 811 821 891 + 1577 3 3 811 891 886 + 1578 3 3 869 804 892 + 1579 3 3 892 804 820 + 1580 3 3 865 866 893 + 1581 3 3 865 893 881 + 1582 3 3 866 867 894 + 1583 3 3 866 894 893 + 1584 3 3 867 868 895 + 1585 3 3 867 895 894 + 1586 3 3 868 869 896 + 1587 3 3 868 896 895 + 1588 3 3 842 841 897 + 1589 3 3 897 841 879 + 1590 3 3 843 842 898 + 1591 3 3 898 842 897 + 1592 3 3 844 843 899 + 1593 3 3 899 843 898 + 1594 3 3 845 844 900 + 1595 3 3 900 844 899 + 1596 3 3 854 853 901 + 1597 3 3 901 853 880 + 1598 3 3 855 854 902 + 1599 3 3 902 854 901 + 1600 3 3 856 855 903 + 1601 3 3 903 855 902 + 1602 3 3 857 856 904 + 1603 3 3 904 856 903 + 1604 3 3 829 830 905 + 1605 3 3 829 905 878 + 1606 3 3 830 831 906 + 1607 3 3 830 906 905 + 1608 3 3 831 832 907 + 1609 3 3 831 907 906 + 1610 3 3 832 833 908 + 1611 3 3 832 908 907 + 1612 3 3 805 845 909 + 1613 3 3 805 909 870 + 1614 3 3 861 860 910 + 1615 3 3 910 860 911 + 1616 3 3 911 860 881 + 1617 3 3 862 861 912 + 1618 3 3 912 861 910 + 1619 3 3 863 862 913 + 1620 3 3 913 862 912 + 1621 3 3 864 863 914 + 1622 3 3 914 863 913 + 1623 3 3 825 824 915 + 1624 3 3 915 824 916 + 1625 3 3 916 824 878 + 1626 3 3 826 825 917 + 1627 3 3 917 825 915 + 1628 3 3 827 826 918 + 1629 3 3 918 826 917 + 1630 3 3 828 827 919 + 1631 3 3 919 827 918 + 1632 3 3 836 837 920 + 1633 3 3 836 920 921 + 1634 3 3 836 921 879 + 1635 3 3 837 838 922 + 1636 3 3 837 922 920 + 1637 3 3 838 839 923 + 1638 3 3 838 923 922 + 1639 3 3 839 840 924 + 1640 3 3 839 924 923 + 1641 3 3 848 849 925 + 1642 3 3 848 925 926 + 1643 3 3 848 926 880 + 1644 3 3 849 850 927 + 1645 3 3 849 927 925 + 1646 3 3 850 851 928 + 1647 3 3 850 928 927 + 1648 3 3 851 852 929 + 1649 3 3 851 929 928 + 1650 3 3 878 905 916 + 1651 3 3 879 921 897 + 1652 3 3 880 926 901 + 1653 3 3 911 881 893 + 1654 3 3 883 870 930 + 1655 3 3 883 930 884 + 1656 3 3 870 909 931 + 1657 3 3 870 931 930 + 1658 3 3 828 919 932 + 1659 3 3 828 932 871 + 1660 3 3 872 864 933 + 1661 3 3 933 864 914 + 1662 3 3 929 852 934 + 1663 3 3 934 852 874 + 1664 3 3 840 873 935 + 1665 3 3 840 935 924 + 1666 3 3 891 821 936 + 1667 3 3 936 821 884 + 1668 3 3 873 875 937 + 1669 3 3 873 937 935 + 1670 3 3 874 876 938 + 1671 3 3 874 938 934 + 1672 3 3 888 813 939 + 1673 3 3 939 813 871 + 1674 3 3 812 872 940 + 1675 3 3 812 940 890 + 1676 3 3 876 818 941 + 1677 3 3 941 818 887 + 1678 3 3 819 889 942 + 1679 3 3 819 942 875 + 1680 3 3 887 888 943 + 1681 3 3 887 943 941 + 1682 3 3 877 807 944 + 1683 3 3 944 807 808 + 1684 3 3 808 882 944 + 1685 3 3 889 890 945 + 1686 3 3 945 890 940 + 1687 3 3 820 877 946 + 1688 3 3 820 946 892 + 1689 3 3 882 810 947 + 1690 3 3 947 810 885 + 1691 3 3 857 904 948 + 1692 3 3 857 948 885 + 1693 3 3 833 886 949 + 1694 3 3 833 949 908 + 1695 3 3 886 891 950 + 1696 3 3 886 950 949 + 1697 3 3 869 892 951 + 1698 3 3 869 951 896 + 1699 3 3 845 900 952 + 1700 3 3 845 952 909 + 1701 3 3 893 894 953 + 1702 3 3 893 953 911 + 1703 3 3 910 911 954 + 1704 3 3 954 911 953 + 1705 3 3 912 910 954 + 1706 3 3 913 912 955 + 1707 3 3 955 912 954 + 1708 3 3 914 913 956 + 1709 3 3 956 913 955 + 1710 3 3 894 895 957 + 1711 3 3 894 957 953 + 1712 3 3 895 896 958 + 1713 3 3 895 958 957 + 1714 3 3 898 897 959 + 1715 3 3 959 897 921 + 1716 3 3 921 920 960 + 1717 3 3 921 960 959 + 1718 3 3 920 922 960 + 1719 3 3 922 923 961 + 1720 3 3 922 961 960 + 1721 3 3 923 924 962 + 1722 3 3 923 962 961 + 1723 3 3 899 898 963 + 1724 3 3 963 898 959 + 1725 3 3 900 899 964 + 1726 3 3 964 899 963 + 1727 3 3 902 901 965 + 1728 3 3 965 901 926 + 1729 3 3 926 925 966 + 1730 3 3 926 966 965 + 1731 3 3 925 927 966 + 1732 3 3 927 928 967 + 1733 3 3 927 967 966 + 1734 3 3 928 929 968 + 1735 3 3 928 968 967 + 1736 3 3 903 902 969 + 1737 3 3 969 902 965 + 1738 3 3 904 903 970 + 1739 3 3 970 903 969 + 1740 3 3 905 906 971 + 1741 3 3 905 971 916 + 1742 3 3 915 916 972 + 1743 3 3 972 916 971 + 1744 3 3 917 915 972 + 1745 3 3 918 917 973 + 1746 3 3 973 917 972 + 1747 3 3 919 918 974 + 1748 3 3 974 918 973 + 1749 3 3 906 907 975 + 1750 3 3 906 975 971 + 1751 3 3 907 908 976 + 1752 3 3 907 976 975 + 1753 3 3 942 889 945 + 1754 3 3 888 939 943 + 1755 3 3 884 930 977 + 1756 3 3 884 977 936 + 1757 3 3 930 931 977 + 1758 3 3 872 933 978 + 1759 3 3 872 978 940 + 1760 3 3 938 876 979 + 1761 3 3 979 876 941 + 1762 3 3 931 909 980 + 1763 3 3 980 909 952 + 1764 3 3 891 936 981 + 1765 3 3 891 981 950 + 1766 3 3 941 943 982 + 1767 3 3 941 982 979 + 1768 3 3 945 940 983 + 1769 3 3 983 940 978 + 1770 3 3 939 871 984 + 1771 3 3 984 871 932 + 1772 3 3 937 875 985 + 1773 3 3 985 875 942 + 1774 3 3 919 974 986 + 1775 3 3 919 986 932 + 1776 3 3 933 914 987 + 1777 3 3 987 914 956 + 1778 3 3 962 924 988 + 1779 3 3 988 924 935 + 1780 3 3 929 934 989 + 1781 3 3 929 989 968 + 1782 3 3 934 938 990 + 1783 3 3 934 990 989 + 1784 3 3 935 937 991 + 1785 3 3 935 991 988 + 1786 3 3 892 946 992 + 1787 3 3 892 992 951 + 1788 3 3 947 885 993 + 1789 3 3 993 885 948 + 1790 3 3 944 882 994 + 1791 3 3 994 882 947 + 1792 3 3 877 944 994 + 1793 3 3 946 877 995 + 1794 3 3 995 877 994 + 1795 3 3 904 970 996 + 1796 3 3 904 996 948 + 1797 3 3 976 908 997 + 1798 3 3 997 908 949 + 1799 3 3 949 950 998 + 1800 3 3 949 998 997 + 1801 3 3 896 951 999 + 1802 3 3 896 999 958 + 1803 3 3 952 900 1000 + 1804 3 3 1000 900 964 + 1805 3 3 954 953 1001 + 1806 3 3 1001 953 957 + 1807 3 3 955 954 1001 + 1808 3 3 972 971 1002 + 1809 3 3 1002 971 975 + 1810 3 3 973 972 1002 + 1811 3 3 969 965 1003 + 1812 3 3 1003 965 966 + 1813 3 3 966 967 1004 + 1814 3 3 966 1004 1003 + 1815 3 3 967 968 1005 + 1816 3 3 967 1005 1004 + 1817 3 3 970 969 1006 + 1818 3 3 1006 969 1003 + 1819 3 3 963 959 1007 + 1820 3 3 1007 959 960 + 1821 3 3 960 961 1008 + 1822 3 3 960 1008 1007 + 1823 3 3 961 962 1009 + 1824 3 3 961 1009 1008 + 1825 3 3 964 963 1010 + 1826 3 3 1010 963 1007 + 1827 3 3 975 976 1011 + 1828 3 3 975 1011 1002 + 1829 3 3 957 958 1012 + 1830 3 3 957 1012 1001 + 1831 3 3 974 973 1013 + 1832 3 3 1013 973 1002 + 1833 3 3 956 955 1014 + 1834 3 3 1014 955 1001 + 1835 3 3 946 995 992 + 1836 3 3 1013 1002 1015 + 1837 3 3 1015 1002 1011 + 1838 3 3 1014 1001 1016 + 1839 3 3 1016 1001 1012 + 1840 3 3 943 939 809 + 1841 3 3 809 939 984 + 1842 3 3 982 943 809 + 1843 3 3 942 945 1018 + 1844 3 3 942 1018 985 + 1845 3 3 945 983 1018 + 1846 3 3 962 988 1017 + 1847 3 3 962 1017 1009 + 1848 3 3 1005 968 1019 + 1849 3 3 1019 968 989 + 1850 3 3 988 991 1020 + 1851 3 3 988 1020 1017 + 1852 3 3 989 990 1021 + 1853 3 3 989 1021 1019 + 1854 3 3 1003 1004 1022 + 1855 3 3 1003 1022 1006 + 1856 3 3 1004 1005 1022 + 1857 3 3 1010 1007 1023 + 1858 3 3 1023 1007 1008 + 1859 3 3 1008 1009 1024 + 1860 3 3 1008 1024 1023 + 1861 3 3 931 980 1025 + 1862 3 3 931 1025 977 + 1863 3 3 998 950 1026 + 1864 3 3 1026 950 981 + 1865 3 3 980 952 1027 + 1866 3 3 1027 952 1000 + 1867 3 3 994 947 1028 + 1868 3 3 1028 947 993 + 1869 3 3 995 994 1029 + 1870 3 3 1029 994 1028 + 1871 3 3 936 977 1030 + 1872 3 3 936 1030 981 + 1873 3 3 978 933 1031 + 1874 3 3 1031 933 987 + 1875 3 3 938 979 1032 + 1876 3 3 938 1032 990 + 1877 3 3 948 996 1033 + 1878 3 3 948 1033 993 + 1879 3 3 999 951 1034 + 1880 3 3 1034 951 992 + 1881 3 3 970 1006 1035 + 1882 3 3 970 1035 996 + 1883 3 3 1000 964 1036 + 1884 3 3 1036 964 1010 + 1885 3 3 1011 976 1037 + 1886 3 3 1037 976 997 + 1887 3 3 997 998 1038 + 1888 3 3 997 1038 1037 + 1889 3 3 1012 958 1039 + 1890 3 3 1039 958 999 + 1891 3 3 979 982 1040 + 1892 3 3 979 1040 1032 + 1893 3 3 987 956 1041 + 1894 3 3 1041 956 1014 + 1895 3 3 974 1013 1042 + 1896 3 3 974 1042 986 + 1897 3 3 983 978 1043 + 1898 3 3 1043 978 1031 + 1899 3 3 932 986 1044 + 1900 3 3 932 1044 984 + 1901 3 3 937 985 1045 + 1902 3 3 937 1045 991 + 1903 3 3 977 1025 1030 + 1904 3 3 1024 1009 1046 + 1905 3 3 1046 1009 1017 + 1906 3 3 809 984 1047 + 1907 3 3 809 1047 982 + 1908 3 3 984 1044 1047 + 1909 3 3 1040 982 1047 + 1910 3 3 1018 983 1048 + 1911 3 3 1018 1048 985 + 1912 3 3 1045 985 1048 + 1913 3 3 983 1043 1048 + 1914 3 3 1017 1020 1049 + 1915 3 3 1017 1049 1046 + 1916 3 3 1021 990 1050 + 1917 3 3 1050 990 1032 + 1918 3 3 1032 1040 1051 + 1919 3 3 1032 1051 1050 + 1920 3 3 998 1026 1052 + 1921 3 3 998 1052 1038 + 1922 3 3 1020 991 1053 + 1923 3 3 1053 991 1045 + 1924 3 3 1035 1006 1054 + 1925 3 3 1054 1006 1022 + 1926 3 3 981 1030 1055 + 1927 3 3 981 1055 1026 + 1928 3 3 993 1033 1056 + 1929 3 3 993 1056 1028 + 1930 3 3 1029 1028 1057 + 1931 3 3 1057 1028 1056 + 1932 3 3 1000 1036 1058 + 1933 3 3 1000 1058 1027 + 1934 3 3 1011 1037 1059 + 1935 3 3 1011 1059 1015 + 1936 3 3 1012 1039 1060 + 1937 3 3 1012 1060 1016 + 1938 3 3 1031 987 1061 + 1939 3 3 1061 987 1041 + 1940 3 3 992 995 1062 + 1941 3 3 1062 995 1029 + 1942 3 3 1034 992 1062 + 1943 3 3 1043 1031 1063 + 1944 3 3 1063 1031 1061 + 1945 3 3 1036 1010 1064 + 1946 3 3 1064 1010 1023 + 1947 3 3 1023 1024 1064 + 1948 3 3 1025 980 1065 + 1949 3 3 1065 980 1027 + 1950 3 3 996 1035 1066 + 1951 3 3 996 1066 1033 + 1952 3 3 999 1034 1067 + 1953 3 3 999 1067 1039 + 1954 3 3 1037 1038 1068 + 1955 3 3 1037 1068 1059 + 1956 3 3 1044 986 1069 + 1957 3 3 1069 986 1042 + 1958 3 3 1013 1015 1070 + 1959 3 3 1013 1070 1042 + 1960 3 3 1041 1014 1071 + 1961 3 3 1071 1014 1016 + 1962 3 3 1022 1005 1072 + 1963 3 3 1072 1005 1019 + 1964 3 3 1019 1021 1073 + 1965 3 3 1019 1073 1072 + 1966 3 3 1070 1015 1059 + 1967 3 3 1016 1060 1071 + 1968 3 3 1029 1057 1074 + 1969 3 3 1029 1074 1062 + 1970 3 3 1022 1072 1075 + 1971 3 3 1022 1075 1054 + 1972 3 3 1065 1027 1076 + 1973 3 3 1076 1027 1058 + 1974 3 3 1055 1030 1077 + 1975 3 3 1077 1030 1025 + 1976 3 3 1025 1065 1077 + 1977 3 3 1049 1020 1078 + 1978 3 3 1078 1020 1053 + 1979 3 3 1068 1038 1079 + 1980 3 3 1079 1038 1052 + 1981 3 3 1035 1054 1080 + 1982 3 3 1035 1080 1066 + 1983 3 3 1056 1033 1081 + 1984 3 3 1081 1033 1066 + 1985 3 3 1057 1056 1082 + 1986 3 3 1082 1056 1081 + 1987 3 3 1021 1050 1083 + 1988 3 3 1021 1083 1073 + 1989 3 3 1036 1064 1084 + 1990 3 3 1036 1084 1058 + 1991 3 3 1039 1067 1085 + 1992 3 3 1039 1085 1060 + 1993 3 3 1034 1062 1086 + 1994 3 3 1086 1062 1074 + 1995 3 3 1067 1034 1086 + 1996 3 3 1024 1046 1087 + 1997 3 3 1024 1087 1064 + 1998 3 3 1046 1049 1088 + 1999 3 3 1046 1088 1087 + 2000 3 3 1041 1071 1089 + 2001 3 3 1041 1089 1061 + 2002 3 3 1063 1061 1090 + 2003 3 3 1090 1061 1089 + 2004 3 3 1069 1042 1091 + 2005 3 3 1091 1042 1070 + 2006 3 3 1052 1026 1092 + 2007 3 3 1092 1026 1055 + 2008 3 3 1059 1068 1093 + 2009 3 3 1059 1093 1070 + 2010 3 3 1050 1051 1094 + 2011 3 3 1050 1094 1083 + 2012 3 3 1072 1073 1095 + 2013 3 3 1072 1095 1075 + 2014 3 3 1047 1044 1096 + 2015 3 3 1047 1096 1040 + 2016 3 3 1051 1040 1097 + 2017 3 3 1097 1040 1096 + 2018 3 3 1044 1069 1098 + 2019 3 3 1044 1098 1096 + 2020 3 3 1043 1063 1099 + 2021 3 3 1043 1099 1048 + 2022 3 3 1045 1048 1100 + 2023 3 3 1100 1048 1099 + 2024 3 3 1053 1045 1100 + 2025 3 3 1094 1051 1097 + 2026 3 3 1064 1087 1101 + 2027 3 3 1064 1101 1084 + 2028 3 3 1091 1070 1102 + 2029 3 3 1102 1070 1093 + 2030 3 3 1080 1054 1103 + 2031 3 3 1103 1054 1075 + 2032 3 3 1075 1095 1103 + 2033 3 3 1097 1096 1104 + 2034 3 3 1104 1096 1098 + 2035 3 3 1076 1058 1105 + 2036 3 3 1105 1058 1084 + 2037 3 3 1052 1092 1106 + 2038 3 3 1052 1106 1079 + 2039 3 3 1087 1088 1107 + 2040 3 3 1087 1107 1101 + 2041 3 3 1074 1057 1108 + 2042 3 3 1108 1057 1082 + 2043 3 3 1086 1074 1109 + 2044 3 3 1109 1074 1108 + 2045 3 3 1069 1091 1110 + 2046 3 3 1069 1110 1098 + 2047 3 3 1077 1065 1111 + 2048 3 3 1111 1065 1076 + 2049 3 3 1078 1053 1112 + 2050 3 3 1112 1053 1100 + 2051 3 3 1100 1099 1113 + 2052 3 3 1100 1113 1112 + 2053 3 3 1099 1063 1114 + 2054 3 3 1099 1114 1113 + 2055 3 3 1063 1090 1114 + 2056 3 3 1092 1055 1115 + 2057 3 3 1115 1055 1077 + 2058 3 3 1066 1080 1116 + 2059 3 3 1066 1116 1081 + 2060 3 3 1082 1081 1117 + 2061 3 3 1117 1081 1116 + 2062 3 3 1093 1068 1118 + 2063 3 3 1118 1068 1079 + 2064 3 3 1073 1083 1119 + 2065 3 3 1073 1119 1095 + 2066 3 3 1083 1094 1120 + 2067 3 3 1083 1120 1119 + 2068 3 3 1085 1067 1121 + 2069 3 3 1121 1067 1086 + 2070 3 3 1071 1060 1122 + 2071 3 3 1122 1060 1085 + 2072 3 3 1089 1071 1123 + 2073 3 3 1123 1071 1122 + 2074 3 3 1090 1089 1124 + 2075 3 3 1124 1089 1123 + 2076 3 3 1049 1078 1125 + 2077 3 3 1049 1125 1088 + 2078 3 3 1077 1111 1115 + 2079 3 3 1098 1110 1104 + 2080 3 3 1086 1109 1126 + 2081 3 3 1086 1126 1121 + 2082 3 3 1105 1084 1101 + 2083 3 3 1080 1103 1127 + 2084 3 3 1080 1127 1116 + 2085 3 3 1117 1116 1128 + 2086 3 3 1128 1116 1127 + 2087 3 3 1101 1107 1129 + 2088 3 3 1101 1129 1105 + 2089 3 3 1108 1082 1130 + 2090 3 3 1130 1082 1117 + 2091 3 3 1118 1079 1131 + 2092 3 3 1131 1079 1106 + 2093 3 3 1111 1076 1132 + 2094 3 3 1132 1076 1105 + 2095 3 3 1125 1078 1133 + 2096 3 3 1133 1078 1112 + 2097 3 3 1097 1104 1134 + 2098 3 3 1097 1134 1094 + 2099 3 3 1120 1094 1135 + 2100 3 3 1135 1094 1134 + 2101 3 3 1107 1088 1136 + 2102 3 3 1136 1088 1125 + 2103 3 3 1092 1115 1137 + 2104 3 3 1092 1137 1106 + 2105 3 3 1112 1113 1138 + 2106 3 3 1112 1138 1133 + 2107 3 3 1113 1114 1139 + 2108 3 3 1113 1139 1138 + 2109 3 3 1114 1090 1140 + 2110 3 3 1114 1140 1139 + 2111 3 3 1090 1124 1140 + 2112 3 3 1109 1108 1141 + 2113 3 3 1141 1108 1130 + 2114 3 3 1091 1102 1142 + 2115 3 3 1091 1142 1110 + 2116 3 3 1085 1121 1143 + 2117 3 3 1085 1143 1122 + 2118 3 3 1123 1122 1144 + 2119 3 3 1144 1122 1143 + 2120 3 3 1124 1123 1145 + 2121 3 3 1145 1123 1144 + 2122 3 3 1102 1093 1146 + 2123 3 3 1146 1093 1118 + 2124 3 3 1103 1095 1147 + 2125 3 3 1103 1147 1127 + 2126 3 3 1095 1119 1148 + 2127 3 3 1095 1148 1147 + 2128 3 3 1119 1120 1149 + 2129 3 3 1119 1149 1148 + 2130 3 3 1126 1109 1141 + 2131 3 3 1142 1102 1146 + 2132 3 3 1105 1129 1132 + 2133 3 3 1140 1124 1150 + 2134 3 3 1150 1124 1145 + 2135 3 3 1139 1140 1151 + 2136 3 3 1151 1140 1150 + 2137 3 3 1117 1128 1152 + 2138 3 3 1117 1152 1130 + 2139 3 3 1138 1139 1153 + 2140 3 3 1153 1139 1151 + 2141 3 3 1133 1138 1154 + 2142 3 3 1154 1138 1153 + 2143 3 3 1125 1133 1154 + 2144 3 3 1136 1125 1155 + 2145 3 3 1155 1125 1154 + 2146 3 3 1120 1135 1156 + 2147 3 3 1120 1156 1149 + 2148 3 3 1143 1121 1157 + 2149 3 3 1157 1121 1126 + 2150 3 3 1115 1111 1158 + 2151 3 3 1115 1158 1137 + 2152 3 3 1111 1132 1158 + 2153 3 3 1146 1118 1159 + 2154 3 3 1159 1118 1131 + 2155 3 3 1128 1127 1160 + 2156 3 3 1160 1127 1147 + 2157 3 3 1147 1148 1161 + 2158 3 3 1147 1161 1160 + 2159 3 3 1148 1149 1162 + 2160 3 3 1148 1162 1161 + 2161 3 3 1141 1130 1163 + 2162 3 3 1163 1130 1152 + 2163 3 3 1144 1143 1164 + 2164 3 3 1164 1143 1157 + 2165 3 3 1145 1144 1165 + 2166 3 3 1165 1144 1164 + 2167 3 3 1106 1137 1166 + 2168 3 3 1106 1166 1131 + 2169 3 3 1104 1110 1167 + 2170 3 3 1167 1110 1142 + 2171 3 3 1134 1104 1167 + 2172 3 3 1129 1107 1168 + 2173 3 3 1168 1107 1136 + 2174 3 3 1135 1134 1169 + 2175 3 3 1169 1134 1167 + 2176 3 3 1149 1156 1162 + 2177 3 3 1136 1155 1170 + 2178 3 3 1136 1170 1168 + 2179 3 3 1135 1169 1171 + 2180 3 3 1135 1171 1156 + 2181 3 3 1128 1160 1172 + 2182 3 3 1128 1172 1152 + 2183 3 3 1160 1161 1173 + 2184 3 3 1160 1173 1172 + 2185 3 3 1161 1162 1174 + 2186 3 3 1161 1174 1173 + 2187 3 3 1145 1165 1175 + 2188 3 3 1145 1175 1150 + 2189 3 3 1151 1150 1175 + 2190 3 3 1126 1141 1176 + 2191 3 3 1126 1176 1157 + 2192 3 3 1141 1163 1176 + 2193 3 3 1164 1157 1177 + 2194 3 3 1177 1157 1176 + 2195 3 3 1165 1164 1177 + 2196 3 3 1137 1158 1178 + 2197 3 3 1137 1178 1166 + 2198 3 3 1158 1132 1179 + 2199 3 3 1158 1179 1178 + 2200 3 3 1132 1129 1180 + 2201 3 3 1132 1180 1179 + 2202 3 3 1129 1168 1180 + 2203 3 3 1163 1152 1181 + 2204 3 3 1181 1152 1172 + 2205 3 3 1131 1166 1182 + 2206 3 3 1131 1182 1159 + 2207 3 3 1167 1142 1183 + 2208 3 3 1183 1142 1146 + 2209 3 3 1146 1159 1184 + 2210 3 3 1146 1184 1183 + 2211 3 3 1169 1167 1185 + 2212 3 3 1185 1167 1183 + 2213 3 3 1153 1151 1186 + 2214 3 3 1186 1151 1175 + 2215 3 3 1154 1153 1187 + 2216 3 3 1187 1153 1186 + 2217 3 3 1155 1154 1187 + 2218 3 3 1159 1182 1184 + 2219 3 3 1155 1187 1188 + 2220 3 3 1155 1188 1170 + 2221 3 3 1171 1169 1189 + 2222 3 3 1189 1169 1185 + 2223 3 3 1176 1163 1190 + 2224 3 3 1176 1190 1177 + 2225 3 3 1163 1181 1190 + 2226 3 3 1162 1156 1191 + 2227 3 3 1162 1191 1174 + 2228 3 3 1156 1171 1191 + 2229 3 3 1166 1178 1192 + 2230 3 3 1166 1192 1182 + 2231 3 3 1181 1172 1193 + 2232 3 3 1193 1172 1173 + 2233 3 3 1173 1174 1194 + 2234 3 3 1173 1194 1193 + 2235 3 3 1180 1168 1195 + 2236 3 3 1195 1168 1170 + 2237 3 3 1183 1184 1196 + 2238 3 3 1183 1196 1185 + 2239 3 3 1175 1165 1197 + 2240 3 3 1197 1165 1177 + 2241 3 3 1186 1175 1198 + 2242 3 3 1198 1175 1197 + 2243 3 3 1179 1180 1199 + 2244 3 3 1199 1180 1195 + 2245 3 3 1178 1179 1199 + 2246 3 3 1187 1186 1200 + 2247 3 3 1200 1186 1198 + 2248 3 3 1185 1196 1189 + 2249 3 3 1178 1199 1192 + 2250 3 3 1188 1187 1201 + 2251 3 3 1201 1187 1200 + 2252 3 3 1177 1190 1202 + 2253 3 3 1177 1202 1197 + 2254 3 3 1190 1181 255 + 2255 3 3 1190 255 1202 + 2256 3 3 1181 1193 255 + 2257 3 3 1198 1197 1203 + 2258 3 3 1203 1197 1202 + 2259 3 3 1200 1198 1205 + 2260 3 3 1205 1198 1203 + 2261 3 3 1196 1184 1206 + 2262 3 3 1206 1184 1182 + 2263 3 3 1182 1192 1207 + 2264 3 3 1182 1207 1206 + 2265 3 3 1193 1194 1208 + 2266 3 3 1193 1208 255 + 2267 3 3 1170 1188 1209 + 2268 3 3 1170 1209 1195 + 2269 3 3 1199 1195 1210 + 2270 3 3 1210 1195 1209 + 2271 3 3 1191 1171 1211 + 2272 3 3 1211 1171 1189 + 2273 3 3 1194 1174 1212 + 2274 3 3 1212 1174 1191 + 2275 3 3 1212 1191 1211 + 2276 3 3 1209 1188 1201 + 2277 3 3 1202 255 1208 + 2278 3 3 1203 1202 1208 + 2279 3 3 1192 1199 1204 + 2280 3 3 1204 1199 1210 + 2281 3 3 1207 1192 1204 + 2282 3 3 1205 1203 1213 + 2283 3 3 1213 1203 1208 + 2284 3 3 1208 1194 1213 + 2285 3 3 1194 1212 1213 + 2286 3 3 1200 1205 1215 + 2287 3 3 1200 1215 1201 + 2288 3 3 1210 1209 1216 + 2289 3 3 1216 1209 1201 + 2290 3 3 1196 1206 1217 + 2291 3 3 1196 1217 1189 + 2292 3 3 1211 1189 1217 + 2293 3 3 1206 1207 1218 + 2294 3 3 1206 1218 1217 + 2295 3 3 1216 1201 1215 + 2296 3 3 1205 1213 1219 + 2297 3 3 1205 1219 1215 + 2298 3 3 1213 1212 1220 + 2299 3 3 1213 1220 1219 + 2300 3 3 1212 1211 1220 + 2301 3 3 1211 1217 1220 + 2302 3 3 1217 1218 1220 + 2303 3 3 1207 1204 1218 + 2304 3 3 1204 1210 1214 + 2305 3 3 1204 1214 1218 + 2306 3 3 1210 1216 1214 + 2307 3 3 1220 1218 1219 + 2308 3 3 1216 1215 1219 + 2309 3 3 1218 1214 1216 + 2310 3 3 1218 1216 1219 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 2310 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 + 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 + 161 162 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 + 241 242 243 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 325 326 327 328 329 330 + 331 332 333 334 335 336 337 338 339 340 + 341 342 343 344 345 346 347 348 349 350 + 351 352 353 354 355 356 357 358 359 360 + 361 362 363 364 365 366 367 368 369 370 + 371 372 373 374 375 376 377 378 379 380 + 381 382 383 384 385 386 387 388 389 390 + 391 392 393 394 395 396 397 398 399 400 + 401 402 403 404 405 406 407 408 409 410 + 411 412 413 414 415 416 417 418 419 420 + 421 422 423 424 425 426 427 428 429 430 + 431 432 433 434 435 436 437 438 439 440 + 441 442 443 444 445 446 447 448 449 450 + 451 452 453 454 455 456 457 458 459 460 + 461 462 463 464 465 466 467 468 469 470 + 471 472 473 474 475 476 477 478 479 480 + 481 482 483 484 485 486 487 488 489 490 + 491 492 493 494 495 496 497 498 499 500 + 501 502 503 504 505 506 507 508 509 510 + 511 512 513 514 515 516 517 518 519 520 + 521 522 523 524 525 526 527 528 529 530 + 531 532 533 534 535 536 537 538 539 540 + 541 542 543 544 545 546 547 548 549 550 + 551 552 553 554 555 556 557 558 559 560 + 561 562 563 564 565 566 567 568 569 570 + 571 572 573 574 575 576 577 578 579 580 + 581 582 583 584 585 586 587 588 589 590 + 591 592 593 594 595 596 597 598 599 600 + 601 602 603 604 605 606 607 608 609 610 + 611 612 613 614 615 616 617 618 619 620 + 621 622 623 624 625 626 627 628 629 630 + 631 632 633 634 635 636 637 638 639 640 + 641 642 643 644 645 646 647 648 649 650 + 651 652 653 654 655 656 657 658 659 660 + 661 662 663 664 665 666 667 668 669 670 + 671 672 673 674 675 676 677 678 679 680 + 681 682 683 684 685 686 687 688 689 690 + 691 692 693 694 695 696 697 698 699 700 + 701 702 703 704 705 706 707 708 709 710 + 711 712 713 714 715 716 717 718 719 720 + 721 722 723 724 725 726 727 728 729 730 + 731 732 733 734 735 736 737 738 739 740 + 741 742 743 744 745 746 747 748 749 750 + 751 752 753 754 755 756 757 758 759 760 + 761 762 763 764 765 766 767 768 769 770 + 771 772 773 774 775 776 777 778 779 780 + 781 782 783 784 785 786 787 788 789 790 + 791 792 793 794 795 796 797 798 799 800 + 801 802 803 804 805 806 807 808 809 810 + 811 812 813 814 815 816 817 818 819 820 + 821 822 823 824 825 826 827 828 829 830 + 831 832 833 834 835 836 837 838 839 840 + 841 842 843 844 845 846 847 848 849 850 + 851 852 853 854 855 856 857 858 859 860 + 861 862 863 864 865 866 867 868 869 870 + 871 872 873 874 875 876 877 878 879 880 + 881 882 883 884 885 886 887 888 889 890 + 891 892 893 894 895 896 897 898 899 900 + 901 902 903 904 905 906 907 908 909 910 + 911 912 913 914 915 916 917 918 919 920 + 921 922 923 924 925 926 927 928 929 930 + 931 932 933 934 935 936 937 938 939 940 + 941 942 943 944 945 946 947 948 949 950 + 951 952 953 954 955 956 957 958 959 960 + 961 962 963 964 965 966 967 968 969 970 + 971 972 973 974 975 976 977 978 979 980 + 981 982 983 984 985 986 987 988 989 990 + 991 992 993 994 995 996 997 998 999 1000 + 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 + 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 + 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 + 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 + 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 + 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 + 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 + 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 + 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 + 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 + 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 + 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 + 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 + 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 + 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 + 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 + 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 + 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 + 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 + 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 + 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 + 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 + 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 + 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 + 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 + 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 + 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 + 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 + 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 + 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 + 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 + 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 + 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 + 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 + 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 + 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 + 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 + 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 + 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 + 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 + 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 + 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 + 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 + 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 + 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 + 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 + 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 + 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 + 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 + 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 + 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 + 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 + 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 + 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 + 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 + 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 + 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 + 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 + 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 + 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 + 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 + 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 + 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 + 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 + 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 + 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 + 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 + 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 + 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 + 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 + 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 + 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 + 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 + 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 + 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 + 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 + 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 + 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 + 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 + 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 + 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 + 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 + 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 + 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 + 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 + 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 + 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 + 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 + 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 + 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 + 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 + 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 + 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 + 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 + 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 + 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 + 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 + 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 + 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 + 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 + 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 + 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 + 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 + 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 + 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 + 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 + 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 + 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 + 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 + 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 + 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 + 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 + 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 + 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 + 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 + 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 + 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 + 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 + 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 + 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 + 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 + 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 + 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 + 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 + 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 + 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 + 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 + 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 + 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 + 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 + 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 +ENDOFSECTION diff --git a/Maxwell0125.neu b/Maxwell0125.neu new file mode 100644 index 0000000..aa6fce0 --- /dev/null +++ b/Maxwell0125.neu @@ -0,0 +1,959 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:47:18 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 317 568 1 0 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 -1.00000000000e+00 -1.00000000000e+00 + 2 1.00000000000e+00 -1.00000000000e+00 + 3 -8.75000000000e-01 -1.00000000000e+00 + 4 -7.50000000000e-01 -1.00000000000e+00 + 5 -6.25000000000e-01 -1.00000000000e+00 + 6 -5.00000000000e-01 -1.00000000000e+00 + 7 -3.75000000000e-01 -1.00000000000e+00 + 8 -2.50000000000e-01 -1.00000000000e+00 + 9 -1.25000000000e-01 -1.00000000000e+00 + 10 0.00000000000e+00 -1.00000000000e+00 + 11 1.25000000000e-01 -1.00000000000e+00 + 12 2.50000000000e-01 -1.00000000000e+00 + 13 3.75000000000e-01 -1.00000000000e+00 + 14 5.00000000000e-01 -1.00000000000e+00 + 15 6.25000000000e-01 -1.00000000000e+00 + 16 7.50000000000e-01 -1.00000000000e+00 + 17 8.75000000000e-01 -1.00000000000e+00 + 18 1.00000000000e+00 1.00000000000e+00 + 19 1.00000000000e+00 -8.75000000000e-01 + 20 1.00000000000e+00 -7.50000000000e-01 + 21 1.00000000000e+00 -6.25000000000e-01 + 22 1.00000000000e+00 -5.00000000000e-01 + 23 1.00000000000e+00 -3.75000000000e-01 + 24 1.00000000000e+00 -2.50000000000e-01 + 25 1.00000000000e+00 -1.25000000000e-01 + 26 1.00000000000e+00 0.00000000000e+00 + 27 1.00000000000e+00 1.25000000000e-01 + 28 1.00000000000e+00 2.50000000000e-01 + 29 1.00000000000e+00 3.75000000000e-01 + 30 1.00000000000e+00 5.00000000000e-01 + 31 1.00000000000e+00 6.25000000000e-01 + 32 1.00000000000e+00 7.50000000000e-01 + 33 1.00000000000e+00 8.75000000000e-01 + 34 -1.00000000000e+00 1.00000000000e+00 + 35 8.75000000000e-01 1.00000000000e+00 + 36 7.50000000000e-01 1.00000000000e+00 + 37 6.25000000000e-01 1.00000000000e+00 + 38 5.00000000000e-01 1.00000000000e+00 + 39 3.75000000000e-01 1.00000000000e+00 + 40 2.50000000000e-01 1.00000000000e+00 + 41 1.25000000000e-01 1.00000000000e+00 + 42 0.00000000000e+00 1.00000000000e+00 + 43 -1.25000000000e-01 1.00000000000e+00 + 44 -2.50000000000e-01 1.00000000000e+00 + 45 -3.75000000000e-01 1.00000000000e+00 + 46 -5.00000000000e-01 1.00000000000e+00 + 47 -6.25000000000e-01 1.00000000000e+00 + 48 -7.50000000000e-01 1.00000000000e+00 + 49 -8.75000000000e-01 1.00000000000e+00 + 50 -1.00000000000e+00 8.75000000000e-01 + 51 -1.00000000000e+00 7.50000000000e-01 + 52 -1.00000000000e+00 6.25000000000e-01 + 53 -1.00000000000e+00 5.00000000000e-01 + 54 -1.00000000000e+00 3.75000000000e-01 + 55 -1.00000000000e+00 2.50000000000e-01 + 56 -1.00000000000e+00 1.25000000000e-01 + 57 -1.00000000000e+00 0.00000000000e+00 + 58 -1.00000000000e+00 -1.25000000000e-01 + 59 -1.00000000000e+00 -2.50000000000e-01 + 60 -1.00000000000e+00 -3.75000000000e-01 + 61 -1.00000000000e+00 -5.00000000000e-01 + 62 -1.00000000000e+00 -6.25000000000e-01 + 63 -1.00000000000e+00 -7.50000000000e-01 + 64 -1.00000000000e+00 -8.75000000000e-01 + 65 -9.12241569506e-01 -9.13268199755e-01 + 66 -9.17262022984e-01 6.15895067485e-02 + 67 9.12053708531e-01 -9.13182012857e-01 + 68 9.11634610278e-01 9.13049236545e-01 + 69 -9.13099688558e-01 9.11658684336e-01 + 70 -8.79018518937e-01 -7.99619000335e-01 + 71 8.04133979728e-01 -8.97379433378e-01 + 72 8.77360999309e-01 7.99066900953e-01 + 73 8.02925261632e-01 8.96960981976e-01 + 74 8.78584616076e-01 -7.99381257259e-01 + 75 -8.04494540152e-01 -8.97499812322e-01 + 76 -7.99228350319e-01 8.77471070564e-01 + 77 -8.97103055492e-01 8.03019052668e-01 + 78 -8.94089413681e-01 -6.72080542219e-01 + 79 6.77889089859e-01 8.91112210556e-01 + 80 -6.80778529142e-01 -8.91980797938e-01 + 81 8.93527921378e-01 -6.71552934272e-01 + 82 -6.71678215339e-01 8.92350162425e-01 + 83 6.80264639874e-01 -8.91932418400e-01 + 84 -8.91338982062e-01 6.77995314484e-01 + 85 8.92178492097e-01 6.71377270365e-01 + 86 -8.93718507209e-01 -5.49179295846e-01 + 87 5.50940531454e-01 8.87842285084e-01 + 88 -8.88169597037e-01 5.51016224539e-01 + 89 -5.55585193235e-01 -8.88802142128e-01 + 90 8.93213035060e-01 -5.48129868365e-01 + 91 -5.48748959774e-01 8.91920581963e-01 + 92 5.55107819953e-01 -8.89137382144e-01 + 93 8.91728321202e-01 5.48259958730e-01 + 94 -8.93148780116e-01 -4.24539539944e-01 + 95 -8.88152378079e-01 4.22963189790e-01 + 96 4.23016461707e-01 8.87722645440e-01 + 97 8.93100084379e-01 -4.22637114694e-01 + 98 -4.24084749704e-01 8.91593540150e-01 + 99 -4.30024616756e-01 -8.88160221030e-01 + 100 4.29988256672e-01 -8.89449482489e-01 + 101 8.91377278930e-01 4.23287661487e-01 + 102 -8.92768016741e-01 -2.98514914123e-01 + 103 3.06079939728e-01 -8.91649861299e-01 + 104 -8.90550026502e-01 2.94526714526e-01 + 105 2.94776118563e-01 8.90027361628e-01 + 106 -3.05198608782e-01 -8.88824378724e-01 + 107 8.93946676186e-01 -2.95595995578e-01 + 108 -2.98041062937e-01 8.91568998050e-01 + 109 8.91382868896e-01 2.96861698296e-01 + 110 -8.96953960232e-01 1.67687769021e-01 + 111 1.68065272248e-01 8.96370717231e-01 + 112 8.98451638980e-01 -1.69408874031e-01 + 113 1.83751189799e-01 -8.95344927569e-01 + 114 -8.93697967529e-01 -1.71292026910e-01 + 115 -1.81567630106e-01 -8.91068333345e-01 + 116 -1.70798068969e-01 8.92821214627e-01 + 117 8.92813437012e-01 1.69283608508e-01 + 118 -5.95246811396e-02 -8.94858185355e-01 + 119 -8.98216162309e-01 -4.49634229898e-02 + 120 -4.44830272578e-02 8.97521846757e-01 + 121 8.97989783569e-01 4.28962333862e-02 + 122 7.40172117998e-01 -7.88911115507e-01 + 123 6.20698160137e-02 -8.97221354242e-01 + 124 9.17695941705e-01 -6.31199718662e-02 + 125 6.18994128017e-02 9.16777731792e-01 + 126 7.94191965616e-01 -7.05016571750e-01 + 127 7.86453770965e-01 -5.97469924359e-01 + 128 7.86699826378e-01 -4.73397707511e-01 + 129 7.86620164592e-01 -3.45114990002e-01 + 130 7.90016302965e-01 -2.11236644994e-01 + 131 8.04727701799e-01 -6.42142286035e-02 + 132 6.12466581479e-01 -7.78355025219e-01 + 133 4.84140732483e-01 -7.77413821354e-01 + 134 3.58761372278e-01 -7.79541088436e-01 + 135 2.36289528574e-01 -7.85790985493e-01 + 136 1.19527628051e-01 -7.94886594550e-01 + 137 7.37129150506e-01 7.87976188391e-01 + 138 7.91396517260e-01 7.04385689706e-01 + 139 7.83312662811e-01 5.97081104329e-01 + 140 7.83366583744e-01 4.73708917822e-01 + 141 7.82646775000e-01 3.47112468272e-01 + 142 7.83576807964e-01 2.17396209231e-01 + 143 7.88479113807e-01 8.27569839017e-02 + 144 6.06912731040e-01 7.76626053577e-01 + 145 4.74828117192e-01 7.74769985142e-01 + 146 3.42990645387e-01 7.76533740978e-01 + 147 2.07622681182e-01 7.84293361887e-01 + 148 6.06122942018e-02 8.02721833581e-01 + 149 -7.41105069235e-01 -7.89294635603e-01 + 150 -7.95220225443e-01 -7.05718138091e-01 + 151 -7.87556012497e-01 -5.98842444885e-01 + 152 -7.87317055435e-01 -4.76106836448e-01 + 153 -7.85868193181e-01 -3.50301264653e-01 + 154 -7.85894122065e-01 -2.21464101463e-01 + 155 -7.89728598825e-01 -8.75041401819e-02 + 156 -6.13736024136e-01 -7.78464365097e-01 + 157 -4.85402764173e-01 -7.76454408814e-01 + 158 -3.59070609584e-01 -7.76059413474e-01 + 159 -2.34195126759e-01 -7.78559806548e-01 + 160 -1.12508296380e-01 -7.84251521356e-01 + 161 -7.88392386502e-01 7.37302465791e-01 + 162 -7.04887943975e-01 7.91588931302e-01 + 163 -5.97939330010e-01 7.83550345742e-01 + 164 -4.75130759483e-01 7.83634804540e-01 + 165 -3.49253395392e-01 7.82896638007e-01 + 166 -2.20347934605e-01 7.83698320336e-01 + 167 -8.64345997532e-02 7.88086396861e-01 + 168 -7.77315759830e-01 6.07028024154e-01 + 169 -7.75750147906e-01 4.74741533892e-01 + 170 -7.77742934191e-01 3.42583741846e-01 + 171 -7.85624514858e-01 2.06911021558e-01 + 172 -8.04073252980e-01 5.97136177054e-02 + 173 3.92014299675e-03 -7.94152920668e-01 + 174 6.70949009190e-01 6.62233977611e-01 + 175 -6.63309990103e-01 6.71100534272e-01 + 176 6.76105767551e-01 -6.63693978393e-01 + 177 -6.77784703376e-01 -6.64658792241e-01 + 178 -6.65033928606e-01 5.29964971853e-01 + 179 -6.61520735226e-01 3.96443772152e-01 + 180 -6.69353354485e-01 2.61211892306e-01 + 181 5.38574903084e-01 -6.66453180018e-01 + 182 4.10266781871e-01 -6.63847573004e-01 + 183 2.83139438481e-01 -6.72037281142e-01 + 184 -5.41191436665e-01 -6.66661329162e-01 + 185 -4.13564879983e-01 -6.62136323795e-01 + 186 -2.85113524785e-01 -6.64611807784e-01 + 187 -1.59634607112e-01 -6.68730316557e-01 + 188 5.30023240597e-01 6.63437233356e-01 + 189 3.96877957833e-01 6.59467144938e-01 + 190 2.62120346356e-01 6.67056031387e-01 + 191 -6.80169920428e-01 1.24897532172e-01 + 192 1.61358370824e-01 -6.83159037772e-01 + 193 1.26308837666e-01 6.77840442593e-01 + 194 -5.29737434590e-01 6.77259982096e-01 + 195 -4.04311487244e-01 6.74387302377e-01 + 196 -2.76311969018e-01 6.73650106965e-01 + 197 -1.45088121055e-01 6.75498331148e-01 + 198 6.82244014391e-01 -5.29039577061e-01 + 199 6.79440956277e-01 -4.01774600986e-01 + 200 6.79270622282e-01 -2.70649874777e-01 + 201 6.82661306607e-01 -1.34569346730e-01 + 202 -6.83818539778e-01 -5.31277797951e-01 + 203 -6.79955137981e-01 -4.05979532703e-01 + 204 -6.77679062382e-01 -2.78195441170e-01 + 205 -6.78376952900e-01 -1.47081460261e-01 + 206 6.77086361408e-01 5.27908429150e-01 + 207 6.74209265799e-01 4.01533614047e-01 + 208 6.73518032916e-01 2.72362044296e-01 + 209 6.75570511352e-01 1.39678465649e-01 + 210 -5.89224087612e-01 -5.74761531233e-01 + 211 5.79149636693e-01 5.70735132048e-01 + 212 -5.72812676815e-01 5.79118400361e-01 + 213 5.86422339464e-01 -5.73372109109e-01 + 214 -5.38691554380e-01 4.55723158918e-01 + 215 4.66132620813e-01 -5.40696544531e-01 + 216 4.56068865749e-01 5.35690969409e-01 + 217 -4.71110525120e-01 -5.41376125510e-01 + 218 -5.50829014582e-01 3.13027318389e-01 + 219 3.27989533580e-01 -5.55390128805e-01 + 220 3.13931725802e-01 5.47305638027e-01 + 221 -3.36649444751e-01 -5.53209678633e-01 + 222 -2.08000864745e-01 -5.50857378440e-01 + 223 2.00333569016e-01 -5.67829282890e-01 + 224 -5.60686063227e-01 1.83005293141e-01 + 225 1.84654487504e-01 5.56994723787e-01 + 226 6.81478491684e-01 2.83330519611e-03 + 227 -9.98101594883e-03 6.80731863379e-01 + 228 -6.83139362791e-01 -1.17842554547e-02 + 229 -4.62455181381e-01 5.66230306628e-01 + 230 5.73397771009e-01 -4.62133238670e-01 + 231 5.66280451915e-01 4.59312091245e-01 + 232 -5.75721736247e-01 -4.64655489495e-01 + 233 6.14238781906e-02 -7.05608607267e-01 + 234 -3.86023182145e-02 -6.80613548088e-01 + 235 -3.35782350604e-01 5.63851931772e-01 + 236 -2.06235069131e-01 5.62889914609e-01 + 237 5.70091122691e-01 -3.33918507761e-01 + 238 5.63858990523e-01 3.31360733941e-01 + 239 5.62960886318e-01 2.00198453082e-01 + 240 -5.70598472457e-01 -3.38515374800e-01 + 241 -5.67180366667e-01 -2.09410409429e-01 + 242 5.68196633790e-01 -2.02099597527e-01 + 243 -7.74334087185e-02 -5.59646179586e-01 + 244 6.11013129983e-02 -5.87381936646e-01 + 245 -5.70859034242e-01 5.22764760076e-02 + 246 5.46901204447e-02 5.67446311158e-01 + 247 -7.48964887870e-02 5.64675962268e-01 + 248 -5.68044425369e-01 -7.79706666897e-02 + 249 5.67131945388e-01 -6.82143026621e-02 + 250 5.64896258561e-01 6.64317257813e-02 + 251 4.56438853149e-01 3.94883692922e-01 + 252 3.57743995980e-01 4.46437928633e-01 + 253 2.28460255671e-01 4.19208560080e-01 + 254 4.51090753634e-01 2.63736981458e-01 + 255 -4.67648846888e-01 -4.03124517874e-01 + 256 -3.78349238706e-01 -4.56315584677e-01 + 257 -2.64576578534e-01 -4.36258222606e-01 + 258 -4.57006140609e-01 -2.74604679446e-01 + 259 4.64554432826e-01 -4.00935217430e-01 + 260 3.68794689270e-01 -4.55274811651e-01 + 261 2.42206378655e-01 -4.33780526087e-01 + 262 4.56787907010e-01 -2.70627567512e-01 + 263 -3.99429590919e-01 4.56156437694e-01 + 264 -4.51029044393e-01 3.56951187771e-01 + 265 -4.24867011691e-01 2.26922428379e-01 + 266 -2.69853730997e-01 4.50948592686e-01 + 267 1.10983362349e-01 4.63331911575e-01 + 268 -4.68267027970e-01 1.08480435242e-01 + 269 1.23810123574e-01 -4.79886148724e-01 + 270 -1.30625767971e-01 -4.29535336763e-01 + 271 5.60881997825e-03 -4.51464119112e-01 + 272 -3.49107859512e-01 -3.43842056386e-01 + 273 3.39382985492e-01 3.30619795992e-01 + 274 -3.36994558369e-01 3.38846678506e-01 + 275 3.47507613847e-01 -3.41609462337e-01 + 276 -1.37912302014e-01 4.50170829264e-01 + 277 4.53142812952e-01 -1.38211422004e-01 + 278 4.51472067804e-01 -4.12250691928e-03 + 279 4.50344578770e-01 1.30470747690e-01 + 280 -4.53753015349e-01 -1.42981375961e-01 + 281 -5.33524712583e-03 4.51179014015e-01 + 282 -4.55614014265e-01 -9.14199788590e-03 + 283 -2.05118771493e-01 3.36383566396e-01 + 284 -3.37716749242e-01 -2.14132667262e-01 + 285 3.39450205155e-01 -2.10035451945e-01 + 286 3.37182325248e-01 -7.52945200337e-02 + 287 3.36879603307e-01 6.07561278758e-02 + 288 3.36191769739e-01 1.97185342440e-01 + 289 -2.78789677824e-01 2.18645631711e-01 + 290 -3.43227464614e-01 8.26885876257e-02 + 291 -2.08164000836e-01 -2.98318515752e-01 + 292 2.25541070938e-01 -2.87364412185e-01 + 293 1.08796642853e-01 -3.60700288228e-01 + 294 2.19368080764e-01 2.69674191817e-01 + 295 8.56949116130e-02 3.36064731151e-01 + 296 -3.71041368946e-02 -3.03850485613e-01 + 297 -6.70542938345e-02 3.37511423154e-01 + 298 -3.42059678279e-01 -7.26594727931e-02 + 299 2.20929067500e-01 -1.48536927588e-01 + 300 1.00037218958e-01 -2.23339640104e-01 + 301 2.23061290354e-01 -1.06969293590e-02 + 302 2.23858743479e-01 1.27757919542e-01 + 303 1.11748006761e-01 1.91727800915e-01 + 304 -1.41547541464e-01 2.25259619212e-01 + 305 -2.04687844392e-01 1.10996877989e-01 + 306 -2.28966150111e-01 -1.48894802646e-01 + 307 -1.21178884353e-01 -2.00961035774e-01 + 308 -2.32376201400e-01 -1.38558274140e-02 + 309 -1.21174159928e-02 -1.50291243208e-01 + 310 -9.87792262938e-03 2.25019998839e-01 + 311 1.05029589909e-01 -8.07847670579e-02 + 312 -1.21363789651e-01 -8.23515192935e-02 + 313 1.13928738697e-01 5.49213286052e-02 + 314 -7.88090361781e-02 1.17309766861e-01 + 315 -1.28810701903e-01 2.53425872572e-02 + 316 2.52760153579e-02 1.15824615832e-01 + 317 -1.16516499170e-02 -3.37139560491e-03 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 64 1 65 + 2 3 3 65 1 3 + 3 3 3 17 2 67 + 4 3 3 67 2 19 + 5 3 3 33 18 68 + 6 3 3 68 18 35 + 7 3 3 49 34 69 + 8 3 3 69 34 50 + 9 3 3 64 65 70 + 10 3 3 64 70 63 + 11 3 3 17 67 71 + 12 3 3 17 71 16 + 13 3 3 33 68 72 + 14 3 3 33 72 32 + 15 3 3 68 35 73 + 16 3 3 73 35 36 + 17 3 3 67 19 74 + 18 3 3 74 19 20 + 19 3 3 65 3 75 + 20 3 3 75 3 4 + 21 3 3 49 69 76 + 22 3 3 49 76 48 + 23 3 3 69 50 77 + 24 3 3 77 50 51 + 25 3 3 63 70 78 + 26 3 3 63 78 62 + 27 3 3 73 36 79 + 28 3 3 79 36 37 + 29 3 3 75 4 80 + 30 3 3 80 4 5 + 31 3 3 74 20 81 + 32 3 3 81 20 21 + 33 3 3 48 76 82 + 34 3 3 48 82 47 + 35 3 3 16 71 83 + 36 3 3 16 83 15 + 37 3 3 77 51 84 + 38 3 3 84 51 52 + 39 3 3 32 72 85 + 40 3 3 32 85 31 + 41 3 3 62 78 86 + 42 3 3 62 86 61 + 43 3 3 79 37 87 + 44 3 3 87 37 38 + 45 3 3 84 52 88 + 46 3 3 88 52 53 + 47 3 3 80 5 89 + 48 3 3 89 5 6 + 49 3 3 81 21 90 + 50 3 3 90 21 22 + 51 3 3 47 82 91 + 52 3 3 47 91 46 + 53 3 3 15 83 92 + 54 3 3 15 92 14 + 55 3 3 31 85 93 + 56 3 3 31 93 30 + 57 3 3 61 86 94 + 58 3 3 61 94 60 + 59 3 3 88 53 95 + 60 3 3 95 53 54 + 61 3 3 87 38 96 + 62 3 3 96 38 39 + 63 3 3 90 22 97 + 64 3 3 97 22 23 + 65 3 3 46 91 98 + 66 3 3 46 98 45 + 67 3 3 89 6 99 + 68 3 3 99 6 7 + 69 3 3 14 92 100 + 70 3 3 14 100 13 + 71 3 3 30 93 101 + 72 3 3 30 101 29 + 73 3 3 60 94 102 + 74 3 3 60 102 59 + 75 3 3 13 100 103 + 76 3 3 13 103 12 + 77 3 3 95 54 104 + 78 3 3 104 54 55 + 79 3 3 96 39 105 + 80 3 3 105 39 40 + 81 3 3 99 7 106 + 82 3 3 106 7 8 + 83 3 3 97 23 107 + 84 3 3 107 23 24 + 85 3 3 45 98 108 + 86 3 3 45 108 44 + 87 3 3 29 101 109 + 88 3 3 29 109 28 + 89 3 3 104 55 110 + 90 3 3 110 55 56 + 91 3 3 105 40 111 + 92 3 3 111 40 41 + 93 3 3 107 24 112 + 94 3 3 112 24 25 + 95 3 3 12 103 113 + 96 3 3 12 113 11 + 97 3 3 59 102 114 + 98 3 3 59 114 58 + 99 3 3 106 8 115 + 100 3 3 115 8 9 + 101 3 3 44 108 116 + 102 3 3 44 116 43 + 103 3 3 28 109 117 + 104 3 3 28 117 27 + 105 3 3 115 9 118 + 106 3 3 118 9 10 + 107 3 3 58 114 119 + 108 3 3 58 119 57 + 109 3 3 43 116 120 + 110 3 3 43 120 42 + 111 3 3 27 117 121 + 112 3 3 27 121 26 + 113 3 3 110 56 66 + 114 3 3 66 56 57 + 115 3 3 11 113 123 + 116 3 3 11 123 10 + 117 3 3 112 25 124 + 118 3 3 124 25 26 + 119 3 3 111 41 125 + 120 3 3 125 41 42 + 121 3 3 66 57 119 + 122 3 3 10 123 118 + 123 3 3 125 42 120 + 124 3 3 26 121 124 + 125 3 3 71 67 74 + 126 3 3 68 73 72 + 127 3 3 69 77 76 + 128 3 3 65 75 70 + 129 3 3 83 71 122 + 130 3 3 122 71 74 + 131 3 3 74 81 126 + 132 3 3 74 126 122 + 133 3 3 81 90 127 + 134 3 3 81 127 126 + 135 3 3 90 97 128 + 136 3 3 90 128 127 + 137 3 3 97 107 129 + 138 3 3 97 129 128 + 139 3 3 107 112 130 + 140 3 3 107 130 129 + 141 3 3 112 124 131 + 142 3 3 112 131 130 + 143 3 3 92 83 132 + 144 3 3 132 83 122 + 145 3 3 100 92 133 + 146 3 3 133 92 132 + 147 3 3 103 100 134 + 148 3 3 134 100 133 + 149 3 3 113 103 135 + 150 3 3 135 103 134 + 151 3 3 123 113 136 + 152 3 3 136 113 135 + 153 3 3 73 79 137 + 154 3 3 73 137 72 + 155 3 3 85 72 138 + 156 3 3 138 72 137 + 157 3 3 93 85 139 + 158 3 3 139 85 138 + 159 3 3 101 93 140 + 160 3 3 140 93 139 + 161 3 3 109 101 141 + 162 3 3 141 101 140 + 163 3 3 117 109 142 + 164 3 3 142 109 141 + 165 3 3 121 117 143 + 166 3 3 143 117 142 + 167 3 3 79 87 144 + 168 3 3 79 144 137 + 169 3 3 87 96 145 + 170 3 3 87 145 144 + 171 3 3 96 105 146 + 172 3 3 96 146 145 + 173 3 3 105 111 147 + 174 3 3 105 147 146 + 175 3 3 111 125 148 + 176 3 3 111 148 147 + 177 3 3 75 80 149 + 178 3 3 75 149 70 + 179 3 3 78 70 150 + 180 3 3 150 70 149 + 181 3 3 86 78 151 + 182 3 3 151 78 150 + 183 3 3 94 86 152 + 184 3 3 152 86 151 + 185 3 3 102 94 153 + 186 3 3 153 94 152 + 187 3 3 114 102 154 + 188 3 3 154 102 153 + 189 3 3 119 114 155 + 190 3 3 155 114 154 + 191 3 3 80 89 156 + 192 3 3 80 156 149 + 193 3 3 89 99 157 + 194 3 3 89 157 156 + 195 3 3 99 106 158 + 196 3 3 99 158 157 + 197 3 3 106 115 159 + 198 3 3 106 159 158 + 199 3 3 115 118 160 + 200 3 3 115 160 159 + 201 3 3 77 84 161 + 202 3 3 77 161 76 + 203 3 3 82 76 162 + 204 3 3 162 76 161 + 205 3 3 91 82 163 + 206 3 3 163 82 162 + 207 3 3 98 91 164 + 208 3 3 164 91 163 + 209 3 3 108 98 165 + 210 3 3 165 98 164 + 211 3 3 116 108 166 + 212 3 3 166 108 165 + 213 3 3 120 116 167 + 214 3 3 167 116 166 + 215 3 3 84 88 168 + 216 3 3 84 168 161 + 217 3 3 88 95 169 + 218 3 3 88 169 168 + 219 3 3 95 104 170 + 220 3 3 95 170 169 + 221 3 3 104 110 171 + 222 3 3 104 171 170 + 223 3 3 110 66 172 + 224 3 3 110 172 171 + 225 3 3 124 121 131 + 226 3 3 121 143 131 + 227 3 3 172 66 119 + 228 3 3 119 155 172 + 229 3 3 148 125 120 + 230 3 3 120 167 148 + 231 3 3 123 136 173 + 232 3 3 123 173 118 + 233 3 3 160 118 173 + 234 3 3 138 137 174 + 235 3 3 174 137 144 + 236 3 3 139 138 174 + 237 3 3 161 168 175 + 238 3 3 161 175 162 + 239 3 3 163 162 175 + 240 3 3 132 122 176 + 241 3 3 176 122 126 + 242 3 3 126 127 176 + 243 3 3 150 149 177 + 244 3 3 177 149 156 + 245 3 3 151 150 177 + 246 3 3 168 169 178 + 247 3 3 168 178 175 + 248 3 3 169 170 179 + 249 3 3 169 179 178 + 250 3 3 170 171 180 + 251 3 3 170 180 179 + 252 3 3 133 132 181 + 253 3 3 181 132 176 + 254 3 3 134 133 182 + 255 3 3 182 133 181 + 256 3 3 135 134 183 + 257 3 3 183 134 182 + 258 3 3 156 157 184 + 259 3 3 156 184 177 + 260 3 3 157 158 185 + 261 3 3 157 185 184 + 262 3 3 158 159 186 + 263 3 3 158 186 185 + 264 3 3 159 160 187 + 265 3 3 159 187 186 + 266 3 3 144 145 188 + 267 3 3 144 188 174 + 268 3 3 145 146 189 + 269 3 3 145 189 188 + 270 3 3 146 147 190 + 271 3 3 146 190 189 + 272 3 3 171 172 191 + 273 3 3 171 191 180 + 274 3 3 136 135 192 + 275 3 3 192 135 183 + 276 3 3 147 148 193 + 277 3 3 147 193 190 + 278 3 3 164 163 194 + 279 3 3 194 163 175 + 280 3 3 165 164 195 + 281 3 3 195 164 194 + 282 3 3 166 165 196 + 283 3 3 196 165 195 + 284 3 3 167 166 197 + 285 3 3 197 166 196 + 286 3 3 127 128 198 + 287 3 3 127 198 176 + 288 3 3 128 129 199 + 289 3 3 128 199 198 + 290 3 3 129 130 200 + 291 3 3 129 200 199 + 292 3 3 130 131 201 + 293 3 3 130 201 200 + 294 3 3 152 151 202 + 295 3 3 202 151 177 + 296 3 3 153 152 203 + 297 3 3 203 152 202 + 298 3 3 154 153 204 + 299 3 3 204 153 203 + 300 3 3 155 154 205 + 301 3 3 205 154 204 + 302 3 3 140 139 206 + 303 3 3 206 139 174 + 304 3 3 141 140 207 + 305 3 3 207 140 206 + 306 3 3 142 141 208 + 307 3 3 208 141 207 + 308 3 3 143 142 209 + 309 3 3 209 142 208 + 310 3 3 202 177 210 + 311 3 3 210 177 184 + 312 3 3 174 188 211 + 313 3 3 174 211 206 + 314 3 3 194 175 212 + 315 3 3 212 175 178 + 316 3 3 176 198 213 + 317 3 3 176 213 181 + 318 3 3 178 179 214 + 319 3 3 178 214 212 + 320 3 3 182 181 215 + 321 3 3 215 181 213 + 322 3 3 188 189 216 + 323 3 3 188 216 211 + 324 3 3 184 185 217 + 325 3 3 184 217 210 + 326 3 3 179 180 218 + 327 3 3 179 218 214 + 328 3 3 183 182 219 + 329 3 3 219 182 215 + 330 3 3 189 190 220 + 331 3 3 189 220 216 + 332 3 3 185 186 221 + 333 3 3 185 221 217 + 334 3 3 186 187 222 + 335 3 3 186 222 221 + 336 3 3 192 183 223 + 337 3 3 223 183 219 + 338 3 3 180 191 224 + 339 3 3 180 224 218 + 340 3 3 190 193 225 + 341 3 3 190 225 220 + 342 3 3 201 131 226 + 343 3 3 226 131 143 + 344 3 3 143 209 226 + 345 3 3 148 167 227 + 346 3 3 148 227 193 + 347 3 3 167 197 227 + 348 3 3 172 155 228 + 349 3 3 172 228 191 + 350 3 3 155 205 228 + 351 3 3 195 194 229 + 352 3 3 229 194 212 + 353 3 3 198 199 230 + 354 3 3 198 230 213 + 355 3 3 207 206 231 + 356 3 3 231 206 211 + 357 3 3 203 202 232 + 358 3 3 232 202 210 + 359 3 3 173 136 233 + 360 3 3 233 136 192 + 361 3 3 160 173 234 + 362 3 3 234 173 233 + 363 3 3 187 160 234 + 364 3 3 196 195 235 + 365 3 3 235 195 229 + 366 3 3 197 196 236 + 367 3 3 236 196 235 + 368 3 3 199 200 237 + 369 3 3 199 237 230 + 370 3 3 208 207 238 + 371 3 3 238 207 231 + 372 3 3 209 208 239 + 373 3 3 239 208 238 + 374 3 3 204 203 240 + 375 3 3 240 203 232 + 376 3 3 205 204 241 + 377 3 3 241 204 240 + 378 3 3 200 201 242 + 379 3 3 200 242 237 + 380 3 3 232 210 217 + 381 3 3 211 216 231 + 382 3 3 213 230 215 + 383 3 3 229 212 214 + 384 3 3 187 234 243 + 385 3 3 187 243 222 + 386 3 3 234 233 244 + 387 3 3 234 244 243 + 388 3 3 233 192 244 + 389 3 3 192 223 244 + 390 3 3 224 191 245 + 391 3 3 245 191 228 + 392 3 3 193 227 246 + 393 3 3 193 246 225 + 394 3 3 197 236 247 + 395 3 3 197 247 227 + 396 3 3 228 205 248 + 397 3 3 248 205 241 + 398 3 3 242 201 249 + 399 3 3 249 201 226 + 400 3 3 226 209 250 + 401 3 3 226 250 249 + 402 3 3 209 239 250 + 403 3 3 238 231 251 + 404 3 3 251 231 216 + 405 3 3 216 220 252 + 406 3 3 216 252 251 + 407 3 3 220 225 253 + 408 3 3 220 253 252 + 409 3 3 239 238 254 + 410 3 3 254 238 251 + 411 3 3 240 232 255 + 412 3 3 255 232 217 + 413 3 3 217 221 256 + 414 3 3 217 256 255 + 415 3 3 221 222 257 + 416 3 3 221 257 256 + 417 3 3 241 240 258 + 418 3 3 258 240 255 + 419 3 3 230 237 259 + 420 3 3 230 259 215 + 421 3 3 219 215 260 + 422 3 3 260 215 259 + 423 3 3 223 219 261 + 424 3 3 261 219 260 + 425 3 3 237 242 262 + 426 3 3 237 262 259 + 427 3 3 235 229 263 + 428 3 3 263 229 214 + 429 3 3 214 218 264 + 430 3 3 214 264 263 + 431 3 3 218 224 265 + 432 3 3 218 265 264 + 433 3 3 236 235 266 + 434 3 3 266 235 263 + 435 3 3 245 228 248 + 436 3 3 246 227 247 + 437 3 3 253 225 267 + 438 3 3 267 225 246 + 439 3 3 265 224 268 + 440 3 3 268 224 245 + 441 3 3 244 223 269 + 442 3 3 269 223 261 + 443 3 3 222 243 270 + 444 3 3 222 270 257 + 445 3 3 243 244 271 + 446 3 3 243 271 270 + 447 3 3 258 255 272 + 448 3 3 272 255 256 + 449 3 3 256 257 272 + 450 3 3 251 252 273 + 451 3 3 251 273 254 + 452 3 3 252 253 273 + 453 3 3 266 263 274 + 454 3 3 274 263 264 + 455 3 3 264 265 274 + 456 3 3 259 262 275 + 457 3 3 259 275 260 + 458 3 3 261 260 275 + 459 3 3 236 266 276 + 460 3 3 236 276 247 + 461 3 3 242 249 277 + 462 3 3 242 277 262 + 463 3 3 249 250 278 + 464 3 3 249 278 277 + 465 3 3 250 239 279 + 466 3 3 250 279 278 + 467 3 3 239 254 279 + 468 3 3 248 241 280 + 469 3 3 280 241 258 + 470 3 3 244 269 271 + 471 3 3 246 247 281 + 472 3 3 246 281 267 + 473 3 3 247 276 281 + 474 3 3 245 248 282 + 475 3 3 245 282 268 + 476 3 3 248 280 282 + 477 3 3 276 266 283 + 478 3 3 283 266 274 + 479 3 3 258 272 284 + 480 3 3 258 284 280 + 481 3 3 275 262 285 + 482 3 3 285 262 277 + 483 3 3 277 278 286 + 484 3 3 277 286 285 + 485 3 3 278 279 287 + 486 3 3 278 287 286 + 487 3 3 279 254 288 + 488 3 3 279 288 287 + 489 3 3 254 273 288 + 490 3 3 274 265 289 + 491 3 3 274 289 283 + 492 3 3 265 268 290 + 493 3 3 265 290 289 + 494 3 3 272 257 291 + 495 3 3 272 291 284 + 496 3 3 257 270 291 + 497 3 3 261 275 292 + 498 3 3 292 275 285 + 499 3 3 269 261 293 + 500 3 3 293 261 292 + 501 3 3 273 253 294 + 502 3 3 273 294 288 + 503 3 3 253 267 295 + 504 3 3 253 295 294 + 505 3 3 270 271 296 + 506 3 3 270 296 291 + 507 3 3 269 293 271 + 508 3 3 296 271 293 + 509 3 3 267 281 295 + 510 3 3 268 282 290 + 511 3 3 281 276 297 + 512 3 3 297 276 283 + 513 3 3 282 280 298 + 514 3 3 298 280 284 + 515 3 3 292 285 299 + 516 3 3 299 285 286 + 517 3 3 293 292 300 + 518 3 3 300 292 299 + 519 3 3 286 287 301 + 520 3 3 286 301 299 + 521 3 3 287 288 302 + 522 3 3 287 302 301 + 523 3 3 288 294 302 + 524 3 3 294 295 303 + 525 3 3 294 303 302 + 526 3 3 283 289 304 + 527 3 3 283 304 297 + 528 3 3 289 290 305 + 529 3 3 289 305 304 + 530 3 3 284 291 306 + 531 3 3 284 306 298 + 532 3 3 291 296 307 + 533 3 3 291 307 306 + 534 3 3 290 282 298 + 535 3 3 295 281 297 + 536 3 3 293 300 296 + 537 3 3 305 290 308 + 538 3 3 308 290 298 + 539 3 3 298 306 308 + 540 3 3 307 296 309 + 541 3 3 309 296 300 + 542 3 3 303 295 310 + 543 3 3 310 295 297 + 544 3 3 297 304 310 + 545 3 3 300 299 311 + 546 3 3 300 311 309 + 547 3 3 299 301 311 + 548 3 3 306 307 312 + 549 3 3 312 307 309 + 550 3 3 301 302 313 + 551 3 3 301 313 311 + 552 3 3 302 303 313 + 553 3 3 304 305 314 + 554 3 3 304 314 310 + 555 3 3 306 312 308 + 556 3 3 314 305 315 + 557 3 3 315 305 308 + 558 3 3 303 310 316 + 559 3 3 303 316 313 + 560 3 3 310 314 316 + 561 3 3 309 311 317 + 562 3 3 309 317 312 + 563 3 3 311 313 317 + 564 3 3 315 308 312 + 565 3 3 312 317 315 + 566 3 3 317 313 316 + 567 3 3 316 314 317 + 568 3 3 314 315 317 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 568 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 + 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 + 161 162 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 + 241 242 243 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 325 326 327 328 329 330 + 331 332 333 334 335 336 337 338 339 340 + 341 342 343 344 345 346 347 348 349 350 + 351 352 353 354 355 356 357 358 359 360 + 361 362 363 364 365 366 367 368 369 370 + 371 372 373 374 375 376 377 378 379 380 + 381 382 383 384 385 386 387 388 389 390 + 391 392 393 394 395 396 397 398 399 400 + 401 402 403 404 405 406 407 408 409 410 + 411 412 413 414 415 416 417 418 419 420 + 421 422 423 424 425 426 427 428 429 430 + 431 432 433 434 435 436 437 438 439 440 + 441 442 443 444 445 446 447 448 449 450 + 451 452 453 454 455 456 457 458 459 460 + 461 462 463 464 465 466 467 468 469 470 + 471 472 473 474 475 476 477 478 479 480 + 481 482 483 484 485 486 487 488 489 490 + 491 492 493 494 495 496 497 498 499 500 + 501 502 503 504 505 506 507 508 509 510 + 511 512 513 514 515 516 517 518 519 520 + 521 522 523 524 525 526 527 528 529 530 + 531 532 533 534 535 536 537 538 539 540 + 541 542 543 544 545 546 547 548 549 550 + 551 552 553 554 555 556 557 558 559 560 + 561 562 563 564 565 566 567 568 +ENDOFSECTION diff --git a/Maxwell025.neu b/Maxwell025.neu new file mode 100644 index 0000000..cf555f4 --- /dev/null +++ b/Maxwell025.neu @@ -0,0 +1,268 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:46:24 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 90 146 1 0 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 -1.00000000000e+00 -1.00000000000e+00 + 2 1.00000000000e+00 -1.00000000000e+00 + 3 -7.50000000000e-01 -1.00000000000e+00 + 4 -5.00000000000e-01 -1.00000000000e+00 + 5 -2.50000000000e-01 -1.00000000000e+00 + 6 0.00000000000e+00 -1.00000000000e+00 + 7 2.50000000000e-01 -1.00000000000e+00 + 8 5.00000000000e-01 -1.00000000000e+00 + 9 7.50000000000e-01 -1.00000000000e+00 + 10 1.00000000000e+00 1.00000000000e+00 + 11 1.00000000000e+00 -7.50000000000e-01 + 12 1.00000000000e+00 -5.00000000000e-01 + 13 1.00000000000e+00 -2.50000000000e-01 + 14 1.00000000000e+00 0.00000000000e+00 + 15 1.00000000000e+00 2.50000000000e-01 + 16 1.00000000000e+00 5.00000000000e-01 + 17 1.00000000000e+00 7.50000000000e-01 + 18 -1.00000000000e+00 1.00000000000e+00 + 19 7.50000000000e-01 1.00000000000e+00 + 20 5.00000000000e-01 1.00000000000e+00 + 21 2.50000000000e-01 1.00000000000e+00 + 22 0.00000000000e+00 1.00000000000e+00 + 23 -2.50000000000e-01 1.00000000000e+00 + 24 -5.00000000000e-01 1.00000000000e+00 + 25 -7.50000000000e-01 1.00000000000e+00 + 26 -1.00000000000e+00 7.50000000000e-01 + 27 -1.00000000000e+00 5.00000000000e-01 + 28 -1.00000000000e+00 2.50000000000e-01 + 29 -1.00000000000e+00 0.00000000000e+00 + 30 -1.00000000000e+00 -2.50000000000e-01 + 31 -1.00000000000e+00 -5.00000000000e-01 + 32 -1.00000000000e+00 -7.50000000000e-01 + 33 -8.25315481678e-01 -8.24464819535e-01 + 34 -8.14479510817e-01 1.15026626072e-01 + 35 8.26548609944e-01 -8.19839961059e-01 + 36 8.25893132290e-01 8.26112308771e-01 + 37 -8.26307252863e-01 8.23894545922e-01 + 38 -7.93063327420e-01 -6.08234681141e-01 + 39 5.98552459433e-01 -7.43568183594e-01 + 40 7.59524619631e-01 5.96031746548e-01 + 41 6.13338016346e-01 7.97067260332e-01 + 42 7.99692212562e-01 -5.99446375206e-01 + 43 -5.95134196378e-01 -7.59169406376e-01 + 44 -6.14439541202e-01 7.92812847624e-01 + 45 -7.61312952493e-01 5.90049905287e-01 + 46 -7.80556743419e-01 -3.56459352243e-01 + 47 7.99248969450e-01 -3.48828951967e-01 + 48 -3.70890508383e-01 7.83458485744e-01 + 49 -3.37722654982e-01 -7.92973363920e-01 + 50 -7.83772523358e-01 3.24119146899e-01 + 51 3.69044951851e-01 7.88144867703e-01 + 52 3.31283613138e-01 -7.62719896216e-01 + 53 7.77327200210e-01 3.28296929893e-01 + 54 -7.76079136874e-01 -1.00444166525e-01 + 55 7.82879634117e-01 7.69389565848e-02 + 56 -1.24450559201e-01 7.78269951099e-01 + 57 8.30822011486e-01 -1.34041303312e-01 + 58 -1.28034404849e-01 -8.24707396821e-01 + 59 8.22195408054e-02 -7.72072158280e-01 + 60 -5.74884501595e-01 -4.82350632217e-01 + 61 1.22396599235e-01 7.80306921931e-01 + 62 1.52829369730e-01 -2.26416952463e-01 + 63 -3.94147789219e-01 -5.98411367276e-01 + 64 -1.39648335803e-01 -5.85304953392e-01 + 65 -5.48513809594e-01 -2.10584781355e-01 + 66 -4.95879560622e-01 5.75254549087e-01 + 67 -5.95977775527e-01 3.81331421085e-01 + 68 -5.53308748781e-01 1.04152223670e-01 + 69 -2.48318702202e-01 5.56148507419e-01 + 70 4.92637941241e-01 5.87068639970e-01 + 71 5.89432617311e-01 4.02510475486e-01 + 72 5.33056436590e-01 1.51271660390e-01 + 73 2.45266200630e-01 5.64908480860e-01 + 74 5.96764154960e-01 -4.51138058676e-01 + 75 4.08786746261e-01 -5.58274003266e-01 + 76 1.55334034152e-01 -5.03620958777e-01 + 77 5.98902414176e-01 -1.51962490486e-01 + 78 -9.89792119880e-04 5.52455145624e-01 + 79 -3.32784809789e-01 -3.73245088483e-01 + 80 -3.80751704510e-01 3.40687501587e-01 + 81 3.74383397739e-01 3.63123430243e-01 + 82 3.74129333694e-01 -3.21815459784e-01 + 83 3.24131645319e-01 -5.83171277916e-02 + 84 2.68998020381e-01 1.56466836263e-01 + 85 1.23770695546e-01 3.25146103052e-01 + 86 -1.22200060779e-01 3.17358575133e-01 + 87 -2.92156862925e-01 -9.88246447269e-02 + 88 -2.66297879037e-01 1.32652203808e-01 + 89 -7.39730319863e-02 -2.91070906501e-01 + 90 1.13009950584e-02 2.94881173108e-02 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 32 1 33 + 2 3 3 33 1 3 + 3 3 3 9 2 35 + 4 3 3 35 2 11 + 5 3 3 17 10 36 + 6 3 3 36 10 19 + 7 3 3 25 18 37 + 8 3 3 37 18 26 + 9 3 3 32 33 38 + 10 3 3 32 38 31 + 11 3 3 9 35 39 + 12 3 3 9 39 8 + 13 3 3 17 36 40 + 14 3 3 17 40 16 + 15 3 3 36 19 41 + 16 3 3 41 19 20 + 17 3 3 35 11 42 + 18 3 3 42 11 12 + 19 3 3 33 3 43 + 20 3 3 43 3 4 + 21 3 3 25 37 44 + 22 3 3 25 44 24 + 23 3 3 37 26 45 + 24 3 3 45 26 27 + 25 3 3 31 38 46 + 26 3 3 31 46 30 + 27 3 3 42 12 47 + 28 3 3 47 12 13 + 29 3 3 24 44 48 + 30 3 3 24 48 23 + 31 3 3 43 4 49 + 32 3 3 49 4 5 + 33 3 3 45 27 50 + 34 3 3 50 27 28 + 35 3 3 41 20 51 + 36 3 3 51 20 21 + 37 3 3 8 39 52 + 38 3 3 8 52 7 + 39 3 3 16 40 53 + 40 3 3 16 53 15 + 41 3 3 30 46 54 + 42 3 3 30 54 29 + 43 3 3 15 53 55 + 44 3 3 15 55 14 + 45 3 3 50 28 34 + 46 3 3 34 28 29 + 47 3 3 47 13 57 + 48 3 3 57 13 14 + 49 3 3 23 48 56 + 50 3 3 23 56 22 + 51 3 3 7 52 59 + 52 3 3 7 59 6 + 53 3 3 49 5 58 + 54 3 3 58 5 6 + 55 3 3 51 21 61 + 56 3 3 61 21 22 + 57 3 3 34 29 54 + 58 3 3 58 6 59 + 59 3 3 61 22 56 + 60 3 3 14 55 57 + 61 3 3 36 41 40 + 62 3 3 35 42 39 + 63 3 3 38 33 43 + 64 3 3 44 37 45 + 65 3 3 46 38 60 + 66 3 3 60 38 43 + 67 3 3 43 49 63 + 68 3 3 43 63 60 + 69 3 3 49 58 64 + 70 3 3 49 64 63 + 71 3 3 54 46 65 + 72 3 3 65 46 60 + 73 3 3 48 44 66 + 74 3 3 66 44 45 + 75 3 3 45 50 67 + 76 3 3 45 67 66 + 77 3 3 50 34 68 + 78 3 3 50 68 67 + 79 3 3 56 48 69 + 80 3 3 69 48 66 + 81 3 3 41 51 70 + 82 3 3 41 70 40 + 83 3 3 53 40 71 + 84 3 3 71 40 70 + 85 3 3 55 53 72 + 86 3 3 72 53 71 + 87 3 3 51 61 73 + 88 3 3 51 73 70 + 89 3 3 42 47 74 + 90 3 3 42 74 39 + 91 3 3 52 39 75 + 92 3 3 75 39 74 + 93 3 3 59 52 76 + 94 3 3 76 52 75 + 95 3 3 47 57 77 + 96 3 3 47 77 74 + 97 3 3 68 34 54 + 98 3 3 54 65 68 + 99 3 3 64 58 59 + 100 3 3 59 76 64 + 101 3 3 77 57 55 + 102 3 3 55 72 77 + 103 3 3 73 61 78 + 104 3 3 78 61 56 + 105 3 3 56 69 78 + 106 3 3 60 63 79 + 107 3 3 60 79 65 + 108 3 3 63 64 79 + 109 3 3 69 66 80 + 110 3 3 80 66 67 + 111 3 3 67 68 80 + 112 3 3 70 73 81 + 113 3 3 70 81 71 + 114 3 3 72 71 81 + 115 3 3 74 77 82 + 116 3 3 74 82 75 + 117 3 3 76 75 82 + 118 3 3 82 77 83 + 119 3 3 83 77 72 + 120 3 3 72 81 84 + 121 3 3 72 84 83 + 122 3 3 73 78 85 + 123 3 3 73 85 81 + 124 3 3 78 69 86 + 125 3 3 78 86 85 + 126 3 3 69 80 86 + 127 3 3 65 79 87 + 128 3 3 65 87 68 + 129 3 3 80 68 88 + 130 3 3 88 68 87 + 131 3 3 79 64 89 + 132 3 3 89 64 76 + 133 3 3 76 82 62 + 134 3 3 76 62 89 + 135 3 3 84 81 85 + 136 3 3 80 88 86 + 137 3 3 79 89 87 + 138 3 3 62 82 83 + 139 3 3 88 87 90 + 140 3 3 90 87 89 + 141 3 3 89 62 90 + 142 3 3 83 84 90 + 143 3 3 83 90 62 + 144 3 3 85 86 90 + 145 3 3 90 86 88 + 146 3 3 85 90 84 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 146 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 + 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 +ENDOFSECTION diff --git a/Maxwell05.neu b/Maxwell05.neu new file mode 100644 index 0000000..54ca3c7 --- /dev/null +++ b/Maxwell05.neu @@ -0,0 +1,100 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:45:53 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 32 46 1 0 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 -1.00000000000e+00 -1.00000000000e+00 + 2 1.00000000000e+00 -1.00000000000e+00 + 3 -5.00000000000e-01 -1.00000000000e+00 + 4 0.00000000000e+00 -1.00000000000e+00 + 5 5.00000000000e-01 -1.00000000000e+00 + 6 1.00000000000e+00 1.00000000000e+00 + 7 1.00000000000e+00 -5.00000000000e-01 + 8 1.00000000000e+00 0.00000000000e+00 + 9 1.00000000000e+00 5.00000000000e-01 + 10 -1.00000000000e+00 1.00000000000e+00 + 11 5.00000000000e-01 1.00000000000e+00 + 12 0.00000000000e+00 1.00000000000e+00 + 13 -5.00000000000e-01 1.00000000000e+00 + 14 -1.00000000000e+00 5.00000000000e-01 + 15 -1.00000000000e+00 0.00000000000e+00 + 16 -1.00000000000e+00 -5.00000000000e-01 + 17 -5.88645508883e-01 -5.98992105176e-01 + 18 2.11667061421e-01 6.85732630033e-01 + 19 5.88647540499e-01 5.99003090903e-01 + 20 6.26762099615e-01 -6.06914190601e-01 + 21 -6.26772420298e-01 6.06902153215e-01 + 22 1.88414881142e-01 -6.20334012720e-01 + 23 -6.26379177913e-01 -1.63523171119e-01 + 24 6.26386554150e-01 1.63514801246e-01 + 25 -1.88414262124e-01 6.20330082412e-01 + 26 3.43943168304e-01 -2.09401779089e-01 + 27 -2.11677073731e-01 -6.85741292847e-01 + 28 7.18061842858e-01 -2.30386196324e-01 + 29 -7.18064297465e-01 2.30387800123e-01 + 30 1.51890087403e-01 2.48403531289e-01 + 31 -1.51889281370e-01 -2.48399720144e-01 + 32 -3.43942925669e-01 2.09397547857e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 16 1 17 + 2 3 3 17 1 3 + 3 3 3 9 6 19 + 4 3 3 19 6 11 + 5 3 3 5 2 20 + 6 3 3 20 2 7 + 7 3 3 13 10 21 + 8 3 3 21 10 14 + 9 3 3 5 20 22 + 10 3 3 5 22 4 + 11 3 3 16 17 23 + 12 3 3 16 23 15 + 13 3 3 9 19 24 + 14 3 3 9 24 8 + 15 3 3 13 21 25 + 16 3 3 13 25 12 + 17 3 3 19 11 18 + 18 3 3 18 11 12 + 19 3 3 17 3 27 + 20 3 3 27 3 4 + 21 3 3 20 7 28 + 22 3 3 28 7 8 + 23 3 3 21 14 29 + 24 3 3 29 14 15 + 25 3 3 18 12 25 + 26 3 3 27 4 22 + 27 3 3 28 8 24 + 28 3 3 29 15 23 + 29 3 3 20 28 26 + 30 3 3 20 26 22 + 31 3 3 24 19 30 + 32 3 3 30 19 18 + 33 3 3 23 17 31 + 34 3 3 31 17 27 + 35 3 3 21 29 32 + 36 3 3 21 32 25 + 37 3 3 28 24 26 + 38 3 3 24 30 26 + 39 3 3 29 23 32 + 40 3 3 23 31 32 + 41 3 3 27 22 31 + 42 3 3 22 26 31 + 43 3 3 18 25 30 + 44 3 3 25 32 30 + 45 3 3 30 32 31 + 46 3 3 31 26 30 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 46 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 +ENDOFSECTION diff --git a/Maxwell1.neu b/Maxwell1.neu new file mode 100644 index 0000000..4aee2d1 --- /dev/null +++ b/Maxwell1.neu @@ -0,0 +1,35 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:45:14 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 9 8 1 0 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 -1.00000000000e+00 -1.00000000000e+00 + 2 1.00000000000e+00 -1.00000000000e+00 + 3 0.00000000000e+00 -1.00000000000e+00 + 4 1.00000000000e+00 1.00000000000e+00 + 5 1.00000000000e+00 0.00000000000e+00 + 6 -1.00000000000e+00 1.00000000000e+00 + 7 0.00000000000e+00 1.00000000000e+00 + 8 -1.00000000000e+00 0.00000000000e+00 + 9 -1.63975270435e-01 -1.63975270435e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 8 1 9 + 2 3 3 9 1 3 + 3 3 3 7 6 8 + 4 3 3 4 7 5 + 5 3 3 2 5 3 + 6 3 3 7 8 9 + 7 3 3 5 7 9 + 8 3 3 3 5 9 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 8 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 3 4 5 6 7 8 +ENDOFSECTION diff --git a/Maxwell2.neu b/Maxwell2.neu new file mode 100644 index 0000000..df7a66e --- /dev/null +++ b/Maxwell2.neu @@ -0,0 +1,24 @@ + CONTROL INFO 2.2.30 +** GAMBIT NEUTRAL FILE +1 +PROGRAM: Gambit VERSION: 2.2.30 +16 Feb 2006 10:44:37 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 4 2 1 0 2 2 +ENDOFSECTION + NODAL COORDINATES 2.2.30 + 1 -1.00000000000e+00 -1.00000000000e+00 + 2 1.00000000000e+00 -1.00000000000e+00 + 3 1.00000000000e+00 1.00000000000e+00 + 4 -1.00000000000e+00 1.00000000000e+00 +ENDOFSECTION + ELEMENTS/CELLS 2.2.30 + 1 3 3 4 1 3 + 2 3 3 3 1 2 +ENDOFSECTION + ELEMENT GROUP 2.2.30 +GROUP: 1 ELEMENTS: 2 MATERIAL: 2 NFLAGS: 1 + fluid + 0 + 1 2 +ENDOFSECTION diff --git a/Maxwell2D.m b/Maxwell2D.m new file mode 100644 index 0000000..ca5d62b --- /dev/null +++ b/Maxwell2D.m @@ -0,0 +1,36 @@ +function [Hx,Hy,Ez,time] = Maxwell2D(Hx, Hy, Ez, FinalTime) + +% function [Hx,Hy,Ez] = Maxwell2D(Hx, Hy, Ez, FinalTime) +% Purpose :Integrate TM-mode Maxwell's until FinalTime starting with initial conditions Hx,Hy,Ez + +Globals2D; +time = 0; + +% Runge-Kutta residual storage +resHx = zeros(Np,K); resHy = zeros(Np,K); resEz = zeros(Np,K); + +% compute time step size +rLGL = JacobiGQ(0,0,N); rmin = abs(rLGL(1)-rLGL(2)); +dtscale = dtscale2D; dt = min(dtscale)*rmin*2/3 + +% outer time step loop +while (timeFinalTime), dt = FinalTime-time; end + + for INTRK = 1:5 + % compute right hand side of TM-mode Maxwell's equations + [rhsHx, rhsHy, rhsEz] = MaxwellRHS2D(Hx,Hy,Ez); + + % initiate and increment Runge-Kutta residuals + resHx = rk4a(INTRK)*resHx + dt*rhsHx; + resHy = rk4a(INTRK)*resHy + dt*rhsHy; + resEz = rk4a(INTRK)*resEz + dt*rhsEz; + + % update fields + Hx = Hx+rk4b(INTRK)*resHx; Hy = Hy+rk4b(INTRK)*resHy; Ez = Ez+rk4b(INTRK)*resEz; + end; + % Increment time + time = time+dt; +end +return diff --git a/MaxwellCurved2D.m b/MaxwellCurved2D.m new file mode 100644 index 0000000..7afa63a --- /dev/null +++ b/MaxwellCurved2D.m @@ -0,0 +1,48 @@ +function [Hx,Hy,Ez,time] = MaxwellCurved2D(Hx, Hy, Ez, FinalTime) + +% function [Hx,Hy,Ez] = MaxwellCurved2D(Hx, Hy, Ez, FinalTime) +% Purpose : Integrate TM-mode Maxwell's until FinalTime starting with initial conditions Hx,Hy,Ez + +Globals2D; +time = 0; + +% Runge-Kutta residual storage +resHx = zeros(Np,K); resHy = zeros(Np,K); resEz = zeros(Np,K); + +% compute time step size +rLGL = JacobiGQ(0,0,N); rmin = abs(rLGL(1)-rLGL(2)); +dtscale = dtscale2D; dt = min(dtscale)*rmin*2/3; + +cinfo = BuildCurvedOPS2D(3*N); + +% outer time step loop +tstep = 1; +while (timeFinalTime), dt = FinalTime-time; end + + for INTRK = 1:5 + % compute right hand side of TM-mode Maxwell's equations + [rhsHx, rhsHy, rhsEz] = MaxwellCurvedRHS2D(cinfo, Hx,Hy,Ez); + + % initiate and increment Runge-Kutta residuals + resHx = rk4a(INTRK)*resHx + dt*rhsHx; + resHy = rk4a(INTRK)*resHy + dt*rhsHy; + resEz = rk4a(INTRK)*resEz + dt*rhsEz; + + % update fields + Hx = Hx+rk4b(INTRK)*resHx; + Hy = Hy+rk4b(INTRK)*resHy; + Ez = Ez+rk4b(INTRK)*resEz; + end; + + % Increment time + time = time+dt; tstep = tstep+1; + + if(~mod(tstep, 5)) + PlotField2D(2*N, x, y, Ez); + hold on; ha = trimesh(EToV, VX, VY); set(ha, 'Color', 'black'); hold off + axis([min(x(:)) max(x(:)) min(y(:)) max(y(:)) -1 1]); drawnow; pause(.02); + end +end +return diff --git a/MaxwellCurvedDriver2D.m b/MaxwellCurvedDriver2D.m new file mode 100644 index 0000000..121d045 --- /dev/null +++ b/MaxwellCurvedDriver2D.m @@ -0,0 +1,37 @@ +% Test script for solving the 2D advection +Globals2D; + +% Set polynomial order to use +N = 7; + +% Read and initiate circular mesh +filename = 'circA01.neu'; +[Nv, VX, VY, K, EToV, BCType] = MeshReaderGambitBC2D(filename); + +StartUp2D; +BuildBCMaps2D; + +% Push all boundary faces to unit cylinder +[k,f] = find(BCType); +curved = sort(unique(k)); +MakeCylinder2D([k,f], 1, 0, 0); + +% Set initial conditions +% First 6 modes of eigenmodes with 6 azimuthal periods +alpha = [9.936109524217684,13.589290170541217,17.003819667816014,... + 20.320789213566506,23.586084435581391,26.820151983411403]; + +% choose radial mode +alpha0 = alpha(2); +theta = atan2(y,x); +rad = sqrt(x.^2+y.^2); + +Ez = besselj(6, alpha0*rad).*cos(6*theta); +Hx = zeros(Np, K); Hy = zeros(Np, K); + +% Solve Problem for exactly one period +FinalTime = .5; +[Hx,Hy,Ez,time] = MaxwellCurved2D(Hx,Hy,Ez,FinalTime); + +exactEz = besselj(6, alpha0*rad).*cos(6*theta)*cos(alpha0*time(end)); +maxabserror = max(max(abs(Ez-exactEz))) diff --git a/MaxwellCurvedRHS2D.m b/MaxwellCurvedRHS2D.m new file mode 100644 index 0000000..85cd71e --- /dev/null +++ b/MaxwellCurvedRHS2D.m @@ -0,0 +1,50 @@ +function [rhsHx, rhsHy, rhsEz] = MaxwellCurvedRHS2D(cinfo, Hx,Hy,Ez) + +% function [rhsHx, rhsHy, rhsEz] = MaxwellCurvedRHS2D(cinfo, Hx,Hy,Ez) +% Purpose : Evaluate RHS flux in 2D Maxwell TM form + +Globals2D; + +[rhsHx,rhsHy,rhsEz] = MaxwellRHS2D(Hx, Hy, Ez); + +% correct residuals at each curved element +Ncinfo = length(cinfo); +for n=1:Ncinfo + + % for each curved element computed L2 derivatives via cubature + cur = cinfo(n); k1 = cur.elmt; cDx = cur.Dx; cDy = cur.Dy; + + rhsHx(:,k1) = -cDy*Ez(:,k1); + rhsHy(:,k1) = cDx*Ez(:,k1); + rhsEz(:,k1) = cDx*Hy(:,k1) - cDy*Hx(:,k1); + + % for each face of each curved element use Gauss quadrature based lifts + for f1=1:Nfaces + k2 = EToE(k1,f1); + gnx = cur.gnx(:,f1); gny = cur.gny(:,f1); + gVM = cur.gVM(:,:,f1); gVP = cur.gVP(:,:,f1); + glift = cur.glift(:,:,f1); + + % compute difference of solution traces at Gauss nodes + gdHx = gVM*Hx(:,k1) - gVP*Hx(:,k2); + gdHy = gVM*Hy(:,k1) - gVP*Hy(:,k2); + gdEz = gVM*Ez(:,k1) - gVP*Ez(:,k2); + + % correct jump at Gauss nodes on domain boundary faces + if(k1==k2) + gdHx = 0*gdHx; gdHy = 0*gdHy; gdEz = 2*gVM*Ez(:,k1); + end + + % perform upwinding + gndotdH = gnx.*gdHx+gny.*gdHy; + fluxHx = gny.*gdEz + gndotdH.*gnx-gdHx; + fluxHy = -gnx.*gdEz + gndotdH.*gny-gdHy; + fluxEz = -gnx.*gdHy + gny.*gdHx -gdEz; + + % lift flux terms using Gauss based lift operator + rhsHx(:,k1) = rhsHx(:,k1) + glift*fluxHx/2; + rhsHy(:,k1) = rhsHy(:,k1) + glift*fluxHy/2; + rhsEz(:,k1) = rhsEz(:,k1) + glift*fluxEz/2; + end +end +return; diff --git a/MaxwellHNonCon2D.m b/MaxwellHNonCon2D.m new file mode 100644 index 0000000..b3bc23b --- /dev/null +++ b/MaxwellHNonCon2D.m @@ -0,0 +1,51 @@ +function [Hx,Hy,Ez,time] = MaxwellHNonCon2D(Hx, Hy, Ez, FinalTime) + +% function [Hx,Hy,Ez] = MaxwellHNonCon2D(Hx, Hy, Ez, FinalTime) +% Purpose : Integrate TM-mode Maxwell's until FinalTime starting with initial conditions Hx,Hy,Ez +% + +Globals2D; +time = 0; + +% Runge-Kutta residual storage +resHx = zeros(Np,K); resHy = zeros(Np,K); resEz = zeros(Np,K); + +% compute time step size +rLGL = JacobiGQ(0,0,N); rmin = abs(rLGL(1)-rLGL(2)); +dtscale = dtscale2D; dt = min(dtscale)*rmin*2/3; + +% find non-conforming neighbors +neighbors = BuildHNonCon2D(N+1, 1e-6); + +% outer time step loop +tstep = 1; +while (timeFinalTime), dt = FinalTime-time; end + + for INTRK = 1:5 + % compute right hand side of TM-mode Maxwell's equations + [rhsHx, rhsHy, rhsEz] = MaxwellHNonConRHS2D(Hx,Hy,Ez, neighbors); + + % initiate and increment Runge-Kutta residuals + resHx = rk4a(INTRK)*resHx + dt*rhsHx; + resHy = rk4a(INTRK)*resHy + dt*rhsHy; + resEz = rk4a(INTRK)*resEz + dt*rhsEz; + + % update fields + Hx = Hx+rk4b(INTRK)*resHx; + Hy = Hy+rk4b(INTRK)*resHy; + Ez = Ez+rk4b(INTRK)*resEz; + end; + + % Increment time + time = time+dt; tstep = tstep+1; + + if(~mod(tstep, 5)) + PlotField2D(N, x, y, Ez); + hold on; ha = trimesh(EToV, VX, VY); set(ha, 'Color', 'black'); hold off + axis([-1 1 -1 1 -1 1]); drawnow; pause(.02); + end + +end +return diff --git a/MaxwellHNonConDriver2D.m b/MaxwellHNonConDriver2D.m new file mode 100644 index 0000000..4b40486 --- /dev/null +++ b/MaxwellHNonConDriver2D.m @@ -0,0 +1,40 @@ +% Test script for solving the 2D advection +Globals2D; + +% Set polynomial order +N = 7; + +% Read and set up simple mesh +filename = 'Maxwell05.neu' +[Nv, VX, VY, K, EToV, BCType] = MeshReaderGambitBC2D(filename); + +StartUp2D; + +% make boundary conditions all Wall type +BCType = Wall*(EToE==((1:K)'*ones(1,Nfaces))); + +% create a non-conforming interface by refinement +refineflag = zeros(K,1); +refineflag(1:5) = 1; +Hrefine2D(refineflag); +StartUp2D; +BuildBCMaps2D; + +refineflag = zeros(K,1); +refineflag(end) = 1; +Hrefine2D(refineflag); +StartUp2D; +BuildBCMaps2D; + +% Set initial conditions +mmode = 1; nmode = 1; +Ez = sin(mmode*pi*x).*sin(nmode*pi*y); +Hx = zeros(Np, K); Hy = zeros(Np, K); + +% Solve Problem for exactly one period +FinalTime = sqrt(2); +[Hx,Hy,Ez,time] = MaxwellHNonCon2D(Hx,Hy,Ez,FinalTime); + +exactEz = sin(mmode*pi*x).*sin(nmode*pi*y); +maxabserror = max(max(abs(Ez-exactEz))) + diff --git a/MaxwellHNonConRHS2D.m b/MaxwellHNonConRHS2D.m new file mode 100644 index 0000000..0a78d7c --- /dev/null +++ b/MaxwellHNonConRHS2D.m @@ -0,0 +1,44 @@ +function [rhsHx, rhsHy, rhsEz] = MaxwellHNonConRHS2D(Hx,Hy,Ez, neighbors) + +% function [rhsHx, rhsHy, rhsEz] = MaxwellHNonConRHS2D(Hx,Hy,Ez, neighbors) +% Purpose : Evaluate RHS flux in 2D Maxwell TM form + +Globals2D; + +% 1.0 Only apply PEC boundary conditions at wall boundaries +savemapB = mapB; savevmapB = vmapB; mapB = mapW; vmapB = vmapW; + +% 1.1 Evaluate right hand side +[rhsHx, rhsHy, rhsEz] = MaxwellRHS2D(Hx, Hy, Ez); + +% 1.2 Restore original boundary node lists +mapB = savemapB; vmapB = savevmapB; + +% 2.0 Correct lifted fluxes at each non-conforming face fragment +Nnoncon = length(neighbors); +for n=1:Nnoncon + neigh = neighbors{n}; + + % 2.1 Extract information about this non-conforming face fragment + k1 = neigh.elmtM; gVM = neigh.gVM; + k2 = neigh.elmtP; gVP = neigh.gVP; + lnx = neigh.nx; lny = neigh.ny; + + % 2.2 Compute difference of traces at Gauss nodes on face fragment + ldHx = gVM*Hx(:,k1) - gVP*Hx(:,k2); + ldHy = gVM*Hy(:,k1) - gVP*Hy(:,k2); + ldEz = gVM*Ez(:,k1) - gVP*Ez(:,k2); + + % 2.3 Compute flux terms at Gauss nodes on face fragment + lndotdH = lnx.*ldHx+lny.*ldHy; + fluxHx = lny.*ldEz + lndotdH.*lnx-ldHx; + fluxHy = -lnx.*ldEz + lndotdH.*lny-ldHy; + fluxEz = -lnx.*ldHy + lny.*ldHx -ldEz; + + % 2.4 Lift fluxes for non-conforming face fragments and update residuals + lift = neigh.lift; + rhsHx(:,k1) = rhsHx(:,k1) + lift*fluxHx/2; + rhsHy(:,k1) = rhsHy(:,k1) + lift*fluxHy/2; + rhsEz(:,k1) = rhsEz(:,k1) + lift*fluxEz/2; +end +return; diff --git a/MaxwellPNonCon2D.m b/MaxwellPNonCon2D.m new file mode 100644 index 0000000..e57971d --- /dev/null +++ b/MaxwellPNonCon2D.m @@ -0,0 +1,42 @@ +function [Hx,Hy,Ez,time] = MaxwellPNonCon2D(pinfo, Hx, Hy, Ez, FinalTime) + +% function [Hx,Hy,Ez] = MaxwellPNonCon2D(pinfo, Hx, Hy, Ez, FinalTime) +% Purpose : Integrate TM-mode Maxwell's until FinalTime starting with initial conditions Hx,Hy,Ez + +Globals2D; +time = 0; + +% Runge-Kutta residual storage +resHx = zeros(size(Hx)); resHy = resHx; resEz = resHx; + +% compute time step size (taking into account variable polynomial order) +dt = 100; +for N=1:length(pinfo) + dt = min(dt, 2./( N^2*max(pinfo(N).Fscale(:)/2))); +end + +% outer time step loop +tstep = 1; +while (timeFinalTime), dt = FinalTime-time; end + + for INTRK = 1:5 + % compute right hand side of TM-mode Maxwell's equations + [rhsHx, rhsHy, rhsEz] = MaxwellPNonConRHS2D(pinfo, Hx,Hy,Ez); + + % initiate and increment Runge-Kutta residuals + resHx = rk4a(INTRK)*resHx + dt*rhsHx; + resHy = rk4a(INTRK)*resHy + dt*rhsHy; + resEz = rk4a(INTRK)*resEz + dt*rhsEz; + + % update fields + Hx = Hx+rk4b(INTRK)*resHx; + Hy = Hy+rk4b(INTRK)*resHy; + Ez = Ez+rk4b(INTRK)*resEz; + end; + + % Increment time + time = time+dt; tstep = tstep+1; +end +return diff --git a/MaxwellPNonConDriver2D.m b/MaxwellPNonConDriver2D.m new file mode 100644 index 0000000..f4cad33 --- /dev/null +++ b/MaxwellPNonConDriver2D.m @@ -0,0 +1,34 @@ +% Test script for solving the 2D advection +Globals2D; + +% Generate simple mesh +filename = 'Maxwell025.neu'; + +[Nv, VX, VY, K, EToV] = MeshReaderGambit2D(filename); +Nfaces = 3; +[EToE,EToF] = tiConnect2D(EToV); +BCType = Wall*(EToE==((1:K)'*ones(1,Nfaces))); + +% Build mesh +Norder = ceil(10*rand(K,1)); + +% Set up arbitrary order elements mesh +[pinfo] = BuildPNonCon2D(Norder, K, VX, VY, EToV, BCType); + +% Set initial conditions +mmode = 1; nmode = 1; + +x = []; y = []; +for N1=1:max(Norder) + pinf = pinfo(N1); + x(pinf.ids) = pinf.x; + y(pinf.ids) = pinf.y; +end +x = x'; y = y'; +Ez = sin(mmode*pi*x).*sin(nmode*pi*y); +Hx = zeros(size(x)); Hy = zeros(size(x)); + +% Solve Problem for exactly one period +FinalTime = 1; +[Hx,Hy,Ez,time] = MaxwellPNonCon2D(pinfo, Hx,Hy,Ez,FinalTime); + diff --git a/MaxwellPNonConRHS2D.m b/MaxwellPNonConRHS2D.m new file mode 100644 index 0000000..f0ec9d4 --- /dev/null +++ b/MaxwellPNonConRHS2D.m @@ -0,0 +1,78 @@ +function [rhsHx, rhsHy, rhsEz] = MaxwellPNonConRHS2D(pinfo, Hx,Hy,Ez) + +% function [rhsHx, rhsHy, rhsEz] = MaxwellPNonConRHS2D(pinfo, Hx,Hy,Ez) +% Purpose : Evaluate RHS flux in 2D Maxwell TM form + +Globals2D; + +% Initialize storage for right hand side residuals +rhsHx = zeros(size(Hx)); rhsHy = zeros(size(Hy)); rhsEz = zeros(size(Ez)); + +% For each possible polynomial order +for N=1:length(pinfo) + + % Extract information for this polynomial order + pinf = pinfo(N); + K = pinf.K; + + % Check to see if any elements of this order exist + if(K>0) + + % Find location of N'th order nodes + ids = pinf.ids; Fmask = pinf.Fmask; + + % Extract N'th order nodes + HxN = Hx(ids); HyN = Hy(ids); EzN = Ez(ids); + + % Extract '-' traces of N'th order nodal data + HxM = HxN(Fmask(:),:); HyM = HyN(Fmask(:),:); EzM = EzN(Fmask(:),:); + + % Storage for '+' traces + HxP = zeros(size(HxM)); HyP = HxP; EzP = HxP; + + % For each possible order + for N2=1:length(pinfo) + + % Check to see if any neighbor nodes of this order were located + if(length(pinf.fmapM{N2}(:))>0) + + % L2 project N2'th order neighbor data onto N'th order trace space + interp = pinf.interpP{N2}; fmapM = pinf.fmapM{N2}; vmapP = pinf.vmapP{N2}; + + HxP(fmapM) = interp*Hx(vmapP); HyP(fmapM) = interp*Hy(vmapP); + EzP(fmapM) = interp*Ez(vmapP); + end + end + + % Compute jumps of trace data at faces + dHx = HxM-HxP; dHy = HyM-HyP; dEz = EzM-EzP; + + % Apply PEC boundary condition at wall boundary faces + dHx(pinf.mapW) = 0; dHy(pinf.mapW) = 0; dEz(pinf.mapW) = 2*EzM(pinf.mapW); + + % evaluate jump in incoming characteristic variable + dR = -pinf.ny.*dHx + pinf.nx.*dHy + dEz ; + + % Compute flux terms + fluxHx = pinf.ny.*dR; + fluxHy = -pinf.nx.*dR; + fluxEz = -dR; + + % Evaluate local derivatives of fields + dHxdr = pinf.Dr*HxN; dHxds = pinf.Ds*HxN; + dHydr = pinf.Dr*HyN; dHyds = pinf.Ds*HyN; + dEzdr = pinf.Dr*EzN; dEzds = pinf.Ds*EzN; + + % Compute physical derivatives of fields + dHxdy = pinf.ry.*dHxdr + pinf.sy.*dHxds; + dHydx = pinf.rx.*dHydr + pinf.sx.*dHyds; + dEzdx = pinf.rx.*dEzdr + pinf.sx.*dEzds; + dEzdy = pinf.ry.*dEzdr + pinf.sy.*dEzds; + + % Compute right hand sides of the PDE's + rhsHx(ids) = -dEzdy + pinf.LIFT*(pinf.Fscale.*fluxHx)/2.0; + rhsHy(ids) = dEzdx + pinf.LIFT*(pinf.Fscale.*fluxHy)/2.0; + rhsEz(ids) = dHydx - dHxdy + pinf.LIFT*(pinf.Fscale.*fluxEz)/2.0; + end +end +return \ No newline at end of file diff --git a/MeshReaderGambit2D.m b/MeshReaderGambit2D.m new file mode 100644 index 0000000..871e0ce --- /dev/null +++ b/MeshReaderGambit2D.m @@ -0,0 +1,46 @@ +function [Nv, VX, VY, K, EToV] = MeshReaderGambit2D(FileName) + +% function [Nv, VX, VY, K, EToV] = MeshReaderGambit2D(FileName) +% Purpose : Read in basic grid information to build grid +% NOTE : gambit(Fluent, Inc) *.neu format is assumed + +Fid = fopen(FileName, 'rt'); + +% read intro +for i=1:6 + line = fgetl(Fid); +end + +% Find number of nodes and number of elements +dims = fscanf(Fid, '%d'); +Nv = dims(1); K = dims(2); + +for i=1:2 + line = fgetl(Fid); +end + +% read node coordinates +VX = (1:Nv); VY = (1:Nv); +for i = 1:Nv + line = fgetl(Fid); + tmpx = sscanf(line, '%lf'); + VX(i) = tmpx(2); VY(i) = tmpx(3); +end + +for i=1:2 + line = fgetl(Fid); +end + +% read element to node connectivity +EToV = zeros(K, 3); +for k = 1:K + line = fgetl(Fid); + tmpcon = sscanf(line, '%lf'); + EToV(k,1) = tmpcon(4); + EToV(k,2) = tmpcon(5); + EToV(k,3) = tmpcon(6); +end + +% Close file +st = fclose(Fid); +return diff --git a/MeshReaderGambitBC2D.m b/MeshReaderGambitBC2D.m new file mode 100644 index 0000000..4ed7a54 --- /dev/null +++ b/MeshReaderGambitBC2D.m @@ -0,0 +1,80 @@ +function [Nv, VX, VY, K, EToV, BCType] = MeshReaderGambitBC2D(FileName) + +% function [Nv, VX, VY, K, EToV, BCType] = MeshReaderGambitBC2D(FileName) +% Purpose : Read in basic grid information to build grid +% NOTE : gambit(Fluent, Inc) *.neu format is assumed + +Globals2D; + +Fid = fopen(FileName, 'rt'); + +% read intro +for i=1:6 + line = fgetl(Fid); +end + +% Find number of nodes and number of elements +dims = fscanf(Fid, '%d'); +Nv = dims(1); K = dims(2); + +for i=1:2 + line = fgetl(Fid); +end + +% read node coordinates +VX = (1:Nv); VY = (1:Nv); +for i = 1:Nv + line = fgetl(Fid); + tmpx = sscanf(line, '%lf'); + VX(i) = tmpx(2); VY(i) = tmpx(3); +end + +for i=1:2 + line = fgetl(Fid); +end + +% read element to node connectivity +EToV = zeros(K, 3); +for k = 1:K + line = fgetl(Fid); + tmpcon = sscanf(line, '%lf'); + EToV(k,:) = tmpcon(4:6); +end + +% skip through material property section +for i=1:4 + line = fgetl(Fid); +end; + +while isempty(intersect(line,'ENDOFSECTION')) + line = fgetl(Fid); +end + +line = fgetl(Fid); line = fgetl(Fid); + +% boundary codes (defined in Globals2D) +BCType = zeros(K,3); + +% Read all the boundary conditions at the nodes +while line ~= -1 + if ~isempty(strfind(line, 'In')), bcflag = In; end; + if ~isempty(strfind(line, 'Out')), bcflag = Out; end; + if ~isempty(strfind(line, 'Wall')), bcflag = Wall; end; + if ~isempty(strfind(line, 'Far')), bcflag = Far; end; + if ~isempty(strfind(line, 'Cyl')), bcflag = Cyl; end; + if ~isempty(strfind(line, 'Dirichlet')), bcflag = Dirichlet; end; + if ~isempty(strfind(line, 'Neuman')), bcflag = Neuman; end; + if ~isempty(strfind(line, 'Slip')), bcflag = Slip; end; + + line = fgetl(Fid); + while isempty(strfind(line, 'ENDOFSECTION')) + tmpid = sscanf(line, '%d'); + BCType(tmpid(1),tmpid(3)) = bcflag; + line = fgetl(Fid); + end; + line = fgetl(Fid); line = fgetl(Fid); +end + +% Close file +st = fclose(Fid); +return diff --git a/Nodes2D.m b/Nodes2D.m new file mode 100644 index 0000000..a9c5758 --- /dev/null +++ b/Nodes2D.m @@ -0,0 +1,45 @@ +function [x,y] = Nodes2D(N); + +% function [x,y] = Nodes2D(N); +% Purpose : Compute (x,y) nodes in equilateral triangle for polynomial of order N + +alpopt = [0.0000 0.0000 1.4152 0.1001 0.2751 0.9800 1.0999 ... + 1.2832 1.3648 1.4773 1.4959 1.5743 1.5770 1.6223 1.6258]; + +% Set optimized parameter, alpha, depending on order N +if (N<16) + alpha = alpopt(N); +else + alpha = 5/3; +end; + +% total number of nodes +Np = (N+1)*(N+2)/2; + +% Create equidistributed nodes on equilateral triangle +L1 = zeros(Np,1); L2 = zeros(Np,1); L3 = zeros(Np,1); +sk = 1; +for n=1:N+1 + for m=1:N+2-n + L1(sk) = (n-1)/N; L3(sk) = (m-1)/N; + sk = sk+1; + end +end +L2 = 1.0-L1-L3; +x = -L2+L3; y = (-L2-L3+2*L1)/sqrt(3.0); + +% Compute blending function at each node for each edge +blend1 = 4*L2.*L3; blend2 = 4*L1.*L3; blend3 = 4*L1.*L2; + +% Amount of warp for each node, for each edge +warpf1 = Warpfactor(N,L3-L2); warpf2 = Warpfactor(N,L1-L3); warpf3 = Warpfactor(N,L2-L1); + +% Combine blend & warp +warp1 = blend1.*warpf1.*(1 + (alpha*L1).^2); +warp2 = blend2.*warpf2.*(1 + (alpha*L2).^2); +warp3 = blend3.*warpf3.*(1 + (alpha*L3).^2); + +% Accumulate deformations associated with each edge +x = x + 1*warp1 + cos(2*pi/3)*warp2 + cos(4*pi/3)*warp3; +y = y + 0*warp1 + sin(2*pi/3)*warp2 + sin(4*pi/3)*warp3; +return; diff --git a/Normals2D.m b/Normals2D.m new file mode 100644 index 0000000..076c03a --- /dev/null +++ b/Normals2D.m @@ -0,0 +1,27 @@ +function [nx, ny, sJ] = Normals2D() + +% function [nx, ny, sJ] = Normals2D() +% Purpose : Compute outward pointing normals at elements faces and surface Jacobians + +Globals2D; +xr = Dr*x; yr = Dr*y; xs = Ds*x; ys = Ds*y; J = xr.*ys-xs.*yr; + +% interpolate geometric factors to face nodes +fxr = xr(Fmask, :); fxs = xs(Fmask, :); fyr = yr(Fmask, :); fys = ys(Fmask, :); + +% build normals +nx = zeros(3*Nfp, K); ny = zeros(3*Nfp, K); +fid1 = (1:Nfp)'; fid2 = (Nfp+1:2*Nfp)'; fid3 = (2*Nfp+1:3*Nfp)'; + +% face 1 +nx(fid1, :) = fyr(fid1, :); ny(fid1, :) = -fxr(fid1, :); + +% face 2 +nx(fid2, :) = fys(fid2, :)-fyr(fid2, :); ny(fid2, :) = -fxs(fid2, :)+fxr(fid2, :); + +% face 3 +nx(fid3, :) = -fys(fid3, :); ny(fid3, :) = fxs(fid3, :); + +% normalise +sJ = sqrt(nx.*nx+ny.*ny); nx = nx./sJ; ny = ny./sJ; +return; diff --git a/PhysDmatrices2D.m b/PhysDmatrices2D.m new file mode 100644 index 0000000..fd4f780 --- /dev/null +++ b/PhysDmatrices2D.m @@ -0,0 +1,15 @@ +function [Dx,Dy] = PhysDmatrices2D(x1, y1, interp) + +% function [Dr,Ds] = PhysDmatrices2D(x1, y1, interp) +% Purpose : Initialize the (x,y) differentiation matrices on the simplex +% evaluated at (x1,y1) at order N + +Globals2D; +IDr = interp*Dr; IDs = interp*Ds; + +[rx1,sx1,ry1,sy1,J1] = GeometricFactors2D(x1, y1, IDr, IDs); + +n = size(interp, 1); +Dx = spdiags(rx1, 0, n, n)*IDr + spdiags(sx1, 0, n, n)*IDs; +Dy = spdiags(ry1, 0, n, n)*IDr + spdiags(sy1, 0, n, n)*IDs; +return; diff --git a/PlotContour2D.m b/PlotContour2D.m new file mode 100644 index 0000000..ebbcef6 --- /dev/null +++ b/PlotContour2D.m @@ -0,0 +1,45 @@ +function PlotContour2D(tri, x, y, u, levels) + +% function PlotContour2D(tri, x, y, u, levels) +% Purpose: generic routine to plot contours for triangulated data + +Nlevels = length(levels); + +hold on; + +v1 = tri(:,1); v2 = tri(:,2); v3 = tri(:,3); +u1 = u(v1); u2 = u(v2); u3 = u(v3); +x1 = x(v1); x2 = x(v2); x3 = x(v3); +y1 = y(v1); y2 = y(v2); y3 = y(v3); + +allx = []; ally = []; +for n=1:Nlevels + lev = levels(n); + + flag1 = max(u1,u2)>=lev & min(u1,u2)<=lev; % edge 1 + flag2 = max(u2,u3)>=lev & min(u2,u3)<=lev; % edge 2 + flag3 = max(u1,u3)>=lev & min(u1,u3)<=lev; % edge 3 + + c1 = (lev-u1)./(u2-u1); xc1 = (1-c1).*x1 + c1.*x2; yc1 = (1-c1).*y1 + c1.*y2; + c2 = (lev-u2)./(u3-u2); xc2 = (1-c2).*x2 + c2.*x3; yc2 = (1-c2).*y2 + c2.*y3; + c3 = (lev-u1)./(u3-u1); xc3 = (1-c3).*x1 + c3.*x3; yc3 = (1-c3).*y1 + c3.*y3; + + ids = find(flag1+flag2==2); + allx = [allx, [xc1(ids),xc2(ids)]']; + ally = [ally, [yc1(ids),yc2(ids)]']; + + ids = find(flag2+flag3==2); + allx = [allx, [xc2(ids),xc3(ids)]']; + ally = [ally, [yc2(ids),yc3(ids)]']; + + ids = find(flag1+flag3==2); + allx = [allx, [xc1(ids),xc3(ids)]']; + ally = [ally, [yc1(ids),yc3(ids)]']; +end +hold off + +ha = line(allx, ally); +set(ha, 'Color', 'red') + +hold off; +return; diff --git a/PlotMesh2D.m b/PlotMesh2D.m new file mode 100644 index 0000000..f4e2a19 --- /dev/null +++ b/PlotMesh2D.m @@ -0,0 +1,27 @@ +function PlotMesh2D() + +% function PlotMesh2D() +% Purpose: Show unstructured finite element grid + +Globals2D; + +axis equal +xmax = max(max(x)); xmin = min(min(x)); +ymax = max(max(y)); ymin = min(min(y)); + +Lx = xmax-xmin; +Ly = ymax-ymin; +xmax = xmax+.1*Lx; xmin = xmin-.1*Lx; +ymax = ymax+.1*Ly; ymin = ymin-.1*Ly; + +axis([xmin xmax ymin ymax]) +drawnow; pause(.05); + +oFx = reshape(Fx, Nfp, Nfaces*K); oFy = reshape(Fy, Nfp, Nfaces*K); + +plot(oFx, oFy, 'k-') +axis equal +axis([xmin xmax ymin ymax]) + +drawnow; pause(.05); +return; diff --git a/Poisson2D.m b/Poisson2D.m new file mode 100644 index 0000000..fac25f7 --- /dev/null +++ b/Poisson2D.m @@ -0,0 +1,21 @@ +function [A,M] = Poisson2D(); + +% function [A,M] = Poisson2D() +% Purpose: Set up matrix for 2D Poisson equation based on stabilized +% internal fluxes on symmetric form + +Globals2D; +g = zeros(K*Np,1); +A = spalloc(K*Np, K*Np, 3*Np); M = spalloc(K*Np, K*Np, 3*Np); + +% Build matrix -- one column at a time +for i=1:K*Np + g(i) = 1.0; + gmat = reshape(g,Np,K); + [Avec,Mvec] = PoissonRHS2D(gmat); + + ids = find(Avec); A(ids,i) = Avec(ids); + ids = find(Mvec); M(ids,i) = Mvec(ids); + g(i)=0.0; +end +return diff --git a/PoissonDriver2D.m b/PoissonDriver2D.m new file mode 100644 index 0000000..3d071b4 --- /dev/null +++ b/PoissonDriver2D.m @@ -0,0 +1,38 @@ +% Driver script for solving the 2D Poisson equation +Globals2D; + +% Polynomial order used for approximation +N = 5; + +% Read in Mesh +[Nv, VX, VY, K, EToV] = MeshReaderGambitBC2D('circA01.neu'); + +% Initialize solver and construct grid and metric +StartUp2D; + +% set up boundary conditions +BuildBCMaps2D; + +% set up right hand side for homogeneous Poisson +%[A,M] = Poisson2D(); % Setup using PoissonRHS2D.m +[A,M] = PoissonIPDG2D(); % Setup using PoissonIPDG2D.m + +% set up Dirichlet boundary conditions +uD = zeros(Nfp*Nfaces, K); +uD(mapD) = sin(pi*Fx(mapD)).*sin(pi*Fy(mapD)); + +% set up Neumann boundary conditions +qN = zeros(Nfp*Nfaces, K); +qN(mapN) = nx(mapN).*(pi*cos(pi*Fx(mapN)).*sin(pi*Fy(mapN))) + ... + ny(mapN).*(pi*sin(pi*Fx(mapN)).*cos(pi*Fy(mapN))) ; + +% evaluate boundary condition contribution to rhs +Aqbc = PoissonIPDGbc2D(uD, qN); + +% set up right hand side forcing +rhs = -2*(pi^2)*sin(pi*x).*sin(pi*y); +rhs = -MassMatrix*(J.*rhs) + Aqbc; + +% solve system +u = A\rhs(:); +u = reshape(u, Np, K); diff --git a/PoissonIPDG2D.m b/PoissonIPDG2D.m new file mode 100644 index 0000000..3863841 --- /dev/null +++ b/PoissonIPDG2D.m @@ -0,0 +1,80 @@ +function [OP,MM] = PoissonIPDG2D() + +% Purpose: Set up the discrete Poisson matrix directly +% using LDG. The operator is set up in the weak form +Globals2D; + +% build local face matrices +massEdge = zeros(Np,Np,Nfaces); +Fm = Fmask(:,1); faceR = r(Fm); +V1D = Vandermonde1D(N, faceR); massEdge(Fm,Fm,1) = inv(V1D*V1D'); +Fm = Fmask(:,2); faceR = r(Fm); +V1D = Vandermonde1D(N, faceR); massEdge(Fm,Fm,2) = inv(V1D*V1D'); +Fm = Fmask(:,3); faceS = s(Fm); +V1D = Vandermonde1D(N, faceS); massEdge(Fm,Fm,3) = inv(V1D*V1D'); + +% build local volume mass matrix +MassMatrix = invV'*invV; + +% build DG derivative matrices +MM = zeros(K*Np*Np, 3); OP = zeros(K*Np*Np*(1+Nfaces), 3); + +% global node numbering +entries = (1:Np*Np)'; entriesMM = (1:Np*Np)'; +for k1=1:K + if(~mod(k1,1000)) k1, end; + rows1 = ((k1-1)*Np+1:k1*Np)'*ones(1,Np); cols1 = rows1'; + + % Build local operators + Dx = rx(1,k1)*Dr + sx(1,k1)*Ds; Dy = ry(1,k1)*Dr + sy(1,k1)*Ds; + + OP11 = J(1,k1)*(Dx'*MassMatrix*Dx + Dy'*MassMatrix*Dy); + + % Build element-to-element parts of operator + for f1=1:Nfaces + k2 = EToE(k1,f1); f2 = EToF(k1,f1); + + rows2 = ((k2-1)*Np+1:k2*Np)'*ones(1,Np); cols2 = rows2'; + + fidM = (k1-1)*Nfp*Nfaces + (f1-1)*Nfp + (1:Nfp); + vidM = vmapM(fidM); Fm1 = mod(vidM-1,Np)+1; + vidP = vmapP(fidM); Fm2 = mod(vidP-1,Np)+1; + + id = 1+(f1-1)*Nfp + (k1-1)*Nfp*Nfaces; + lnx = nx(id); lny = ny(id); lsJ = sJ(id); + hinv = max(Fscale(id), Fscale(1+(f2-1)*Nfp, k2)); + + Dx2 = rx(1,k2)*Dr + sx(1,k2)*Ds; Dy2 = ry(1,k2)*Dr + sy(1,k2)*Ds; + + Dn1 = lnx*Dx + lny*Dy ; + Dn2 = lnx*Dx2 + lny*Dy2; + + mmE = lsJ*massEdge(:,:,f1); + + gtau = 100*2*(N+1)*(N+1)*hinv; % set penalty scaling + switch(BCType(k1,f1)) + case {Dirichlet} + OP11 = OP11 + ( gtau*mmE - mmE*Dn1 - Dn1'*mmE ); % ok + case {Neuman} + % nada + otherwise + % interior face variational terms + OP11 = OP11 + 0.5*( gtau*mmE - mmE*Dn1 - Dn1'*mmE ); + + OP12 = zeros(Np); + OP12(:,Fm2) = - 0.5*( gtau*mmE(:,Fm1) ); + OP12(Fm1,:) = OP12(Fm1,:) - 0.5*( mmE(Fm1,Fm1)*Dn2(Fm2,:) ); + OP12(:,Fm2) = OP12(:,Fm2) - 0.5*(-Dn1'*mmE(:, Fm1) ); + OP(entries(:), :) = [rows1(:), cols2(:), OP12(:)]; + entries = entries + Np*Np; + + end + end + OP(entries(:), :) = [rows1(:), cols1(:), OP11(:)]; + MM(entriesMM(:), :) = [rows1(:), cols1(:), J(1,k1)*MassMatrix(:)]; + entries = entries + Np*Np; entriesMM = entriesMM + Np*Np; +end + +OP = OP(1:max(entries) -Np*Np,:); OP = myspconvert(OP, Np*K, Np*K, 1e-15); +MM = MM(1:max(entriesMM)-Np*Np,:); MM = myspconvert(MM, Np*K, Np*K, 1e-15); +return diff --git a/PoissonIPDGbc2D.m b/PoissonIPDGbc2D.m new file mode 100644 index 0000000..9481537 --- /dev/null +++ b/PoissonIPDGbc2D.m @@ -0,0 +1,46 @@ +function [bc] = PoissonIPDGbc2D(ubc,qbc) + +% Purpose: Set up the discrete Poisson matrix directly +% using LDG. The operator is set up in the weak form +Globals2D; + +% build local face matrices +massEdge = zeros(Np,Np,Nfaces); +Fm = Fmask(:,1); faceR = r(Fm); V1D = Vandermonde1D(N, faceR); massEdge(Fm,Fm,1) = inv(V1D*V1D'); +Fm = Fmask(:,2); faceR = r(Fm); V1D = Vandermonde1D(N, faceR); massEdge(Fm,Fm,2) = inv(V1D*V1D'); +Fm = Fmask(:,3); faceS = s(Fm); V1D = Vandermonde1D(N, faceS); massEdge(Fm,Fm,3) = inv(V1D*V1D'); + +% build DG right hand side +bc = zeros(Np, K); + +for k1=1:K + if(~mod(k1,1000)) k1, end; + + for f1=1:Nfaces + + if(BCType(k1,f1)) + + Fm1 = Fmask(:,f1); + fidM = (k1-1)*Nfp*Nfaces + (f1-1)*Nfp + (1:Nfp)'; + + id = 1+(f1-1)*Nfp + (k1-1)*Nfp*Nfaces; + lnx = nx(id); lny = ny(id); lsJ = sJ(id); hinv = Fscale(id); + + Dx = rx(1,k1)*Dr + sx(1,k1)*Ds; + Dy = ry(1,k1)*Dr + sy(1,k1)*Ds; + Dn1 = lnx*Dx + lny*Dy ; + + mmE = lsJ*massEdge(:,:,f1); + + gtau = 100*2*(N+1)*(N+1)*hinv; % set penalty scaling + switch(BCType(k1,f1)) + case {Dirichlet} + bc(:,k1) = bc(:,k1) + (gtau*mmE(:,Fm1) - Dn1'*mmE(:,Fm1))*ubc(fidM); + case {Neuman} + bc(:,k1) = bc(:,k1) + mmE(:,Fm1)*qbc(fidM); + otherwise + end + end + end +end +return diff --git a/PoissonRHS2D.m b/PoissonRHS2D.m new file mode 100644 index 0000000..b3fb305 --- /dev/null +++ b/PoissonRHS2D.m @@ -0,0 +1,35 @@ +function [rhsu,Mu] = PoissonRHS2D(u) + +% function [rhsu] = PoissonRHS2D(u) +% Purpose : Evaluate RHS flux in 2D Heat/Poisson equation using a stabilized internal penalty flux + +Globals2D; + +% Define field differences at faces and impose Dirichlet BCs +du = zeros(Nfp*Nfaces,K); du(:)=u(vmapM)-u(vmapP); du(mapD) = 2*u(vmapD); + +% Compute qx and qy, define differences and impose Neumann BC's +[dudx,dudy] = Grad2D(u); + +% Compute DG gradient with central fluxes +fluxxu = nx.*du/2.0; qx = dudx - LIFT*(Fscale.*fluxxu); +fluxyu = ny.*du/2.0; qy = dudy - LIFT*(Fscale.*fluxyu); + +% Compute minimum height of elements either side of each edge +hmin = min(2*J(vmapP)./sJ(mapP), 2*J(vmapM)./sJ(mapM)); +tau = reshape(Np./hmin, Nfp*Nfaces, K); + +% Evaluate jumps in components of q at element interfaces +dqx=zeros(Nfp*Nfaces,K); dqx(:)=qx(vmapM)-qx(vmapP); dqx(mapN) = 2*qx(vmapN); +dqy=zeros(Nfp*Nfaces,K); dqy(:)=qy(vmapM)-qy(vmapP); dqy(mapN) = 2*qy(vmapN); + +% Evaluate flux function +fluxq = (nx.*dqx + ny.*dqy + tau.*du)/2; + +% Compute right hand side +divq = Div2D(qx,qy); + +% compute right hand side residual +rhsu = J.*((invV'*invV)*(divq - LIFT*(Fscale.*fluxq))); +Mu = J.*((invV'*invV)*u); +return; diff --git a/Sample2D.m b/Sample2D.m new file mode 100644 index 0000000..899a4e5 --- /dev/null +++ b/Sample2D.m @@ -0,0 +1,23 @@ + +function [sampleweights,sampletri] = Sample2D(xout, yout) + +% function [sampleweights,sampletri] = Sample2D(xout, yout) +% purpose: input = coordinates of output data point +% output = number of containing tri and interpolation weights +% [ only works for straight sided triangles ] + +Globals2D; + +% find containing tri +[sampletri,tribary] = ... + tsearchn([VX', VY'], EToV, [xout,yout]); + +% Matlab barycentric coordinates -> biunit triangle coordinates +sout = 2*tribary(:,3)-1; rout = 2*tribary(:,2)-1; + +% build generalized Vandermonde for the sample point +Vout = Vandermonde2D(N, rout, sout); + +% build interpolation matrix for the sample point +sampleweights = Vout*invV; +return; diff --git a/Simplex2DP.m b/Simplex2DP.m new file mode 100644 index 0000000..6c710d0 --- /dev/null +++ b/Simplex2DP.m @@ -0,0 +1,9 @@ +function [P] = Simplex2DP(a,b,i,j); + +% function [P] = Simplex2DP(a,b,i,j); +% Purpose : Evaluate 2D orthonormal polynomial +% on simplex at (a,b) of order (i,j). + +h1 = JacobiP(a,0,0,i); h2 = JacobiP(b,2*i+1,0,j); +P = sqrt(2.0)*h1.*h2.*(1-b).^i; +return; diff --git a/Vandermonde1D.m b/Vandermonde1D.m new file mode 100644 index 0000000..71be55e --- /dev/null +++ b/Vandermonde1D.m @@ -0,0 +1,10 @@ +function [V1D] = Vandermonde1D(N,r) + +% function [V1D] = Vandermonde1D(N,r) +% Purpose : Initialize the 1D Vandermonde Matrix, V_{ij} = phi_j(r_i); + +V1D = zeros(length(r),N+1); +for j=1:N+1 + V1D(:,j) = JacobiP(r(:), 0, 0, j-1); +end; +return diff --git a/Vandermonde2D.m b/Vandermonde2D.m new file mode 100644 index 0000000..11c737b --- /dev/null +++ b/Vandermonde2D.m @@ -0,0 +1,19 @@ +function [V2D] = Vandermonde2D(N, r, s); + +% function [V2D] = Vandermonde2D(N, r, s); +% Purpose : Initialize the 2D Vandermonde Matrix, V_{ij} = phi_j(r_i, s_i); + +V2D = zeros(length(r),(N+1)*(N+2)/2); + +% Transfer to (a,b) coordinates +[a, b] = rstoab(r, s); + +% build the Vandermonde matrix +sk = 1; +for i=0:N + for j=0:N - i + V2D(:,sk) = Simplex2DP(a,b,i,j); + sk = sk+1; + end +end +return; diff --git a/Warpfactor.m b/Warpfactor.m new file mode 100644 index 0000000..a7fcb49 --- /dev/null +++ b/Warpfactor.m @@ -0,0 +1,25 @@ +function warp = Warpfactor(N, rout) + +% function warp = Warpfactor(N, rout) +% Purpose : Compute scaled warp function at order N based on rout interpolation nodes + +% Compute LGL and equidistant node distribution +LGLr = JacobiGL(0,0,N); req = linspace(-1,1,N+1)'; + +% Compute V based on req +Veq = Vandermonde1D(N,req); + +% Evaluate Lagrange polynomial at rout +Nr = length(rout); Pmat = zeros(N+1,Nr); +for i=1:N+1 + Pmat(i,:) = JacobiP(rout, 0, 0, i-1)'; +end; +Lmat = Veq'\Pmat; + +% Compute warp factor +warp = Lmat'*(LGLr - req); + +% Scale factor +zerof = (abs(rout)<1.0-1.0e-10); sf = 1.0 - (zerof.*rout).^2; +warp = warp./sf + warp.*(zerof-1); +return; diff --git a/bump025.neu b/bump025.neu new file mode 100644 index 0000000..fd5cfce --- /dev/null +++ b/bump025.neu @@ -0,0 +1,222 @@ + CONTROL INFO 1.3.0 +** GAMBIT NEUTRAL FILE +USEMe mesh file, generated by function: +WriteNeuFormat(C:\Documents and Settings\Tim\Desktop\bump1A025.neu) +WinUSEMe beta version Ausgust 2002 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 62 87 1 4 2 2 +ENDOFSECTION + NODAL COORDINATES 1.3.0 + 1 -3.000000000e+000 0.000000000e+000 + 2 3.000000000e+000 0.000000000e+000 + 3 3.000000000e+000 2.000000000e+000 + 4 -3.000000000e+000 2.000000000e+000 + 5 5.000000000e-001 0.000000000e+000 + 6 4.619398117e-001 1.913416982e-001 + 7 3.535534143e-001 3.535534143e-001 + 8 1.913416982e-001 4.619398117e-001 + 9 0.000000000e+000 5.000000000e-001 + 10 -1.913416982e-001 4.619398117e-001 + 11 -3.535534143e-001 3.535534143e-001 + 12 -4.619398117e-001 1.913418025e-001 + 13 -5.000000000e-001 0.000000000e+000 + 14 0.000000000e+000 2.000000000e+000 + 15 -1.500000000e+000 2.000000000e+000 + 16 -8.309034109e-001 1.243534803e+000 + 17 8.309034109e-001 1.243534803e+000 + 18 1.500000000e+000 2.000000000e+000 + 19 -1.500000000e+000 0.000000000e+000 + 20 1.500000000e+000 0.000000000e+000 + 21 -9.266548753e-001 6.191712618e-001 + 22 -2.174239010e-001 1.093064308e+000 + 23 9.266551137e-001 6.191711426e-001 + 24 -5.110421181e-001 7.648286223e-001 + 25 -1.000000000e+000 0.000000000e+000 + 26 1.794540882e-001 9.021769762e-001 + 27 1.000000000e+000 0.000000000e+000 + 28 4.607041180e-001 6.894924045e-001 + 29 -6.608622670e-001 4.415742159e-001 + 30 -1.550601721e-001 7.795404196e-001 + 31 6.598678231e-001 4.409095645e-001 + 32 -1.788318992e+000 1.070838690e+000 + 33 1.788318753e+000 1.070838928e+000 + 34 -7.500000000e-001 0.000000000e+000 + 35 7.500000000e-001 0.000000000e+000 + 36 -7.500000000e-001 2.000000000e+000 + 37 -1.125000000e+000 2.000000000e+000 + 38 -2.250000000e+000 2.000000000e+000 + 39 -3.000000000e+000 1.000000000e+000 + 40 -2.250000000e+000 0.000000000e+000 + 41 -3.000000000e+000 1.500000000e+000 + 42 -2.406704664e+000 1.250000000e+000 + 43 -2.484420300e+000 6.054347157e-001 + 44 -1.899478316e+000 4.838200808e-001 + 45 -1.433679581e+000 6.996492743e-001 + 46 2.250000000e+000 2.000000000e+000 + 47 3.000000000e+000 1.000000000e+000 + 48 3.000000000e+000 1.500000000e+000 + 49 2.406704426e+000 1.250000000e+000 + 50 2.250000000e+000 0.000000000e+000 + 51 2.484420300e+000 6.054347157e-001 + 52 1.899478197e+000 4.838201106e-001 + 53 1.433679581e+000 6.996493936e-001 + 54 7.500000000e-001 2.000000000e+000 + 55 2.898448408e-001 1.483800411e+000 + 56 1.362045407e+000 1.447879434e+000 + 57 1.880359888e+000 1.604386091e+000 + 58 -3.750000000e-001 1.610370636e+000 + 59 -1.362045527e+000 1.447879314e+000 + 60 -1.880360007e+000 1.604385972e+000 + 61 -3.000000000e+000 5.000000000e-001 + 62 3.000000000e+000 5.000000000e-001 +ENDOFSECTION + ELEMENTS/CELLS 1.3.0 + 1 3 3 40 43 1 + 2 3 3 9 8 26 + 3 3 3 26 55 22 + 4 3 3 8 7 28 + 5 3 3 53 27 20 + 6 3 3 59 60 32 + 7 3 3 24 30 22 + 8 3 3 58 14 36 + 9 3 3 45 25 21 + 10 3 3 24 21 29 + 11 3 3 26 28 17 + 12 3 3 26 17 55 + 13 3 3 21 24 16 + 14 3 3 24 11 10 + 15 3 3 45 32 44 + 16 3 3 12 11 29 + 17 3 3 28 7 31 + 18 3 3 17 28 23 + 19 3 3 56 54 17 + 20 3 3 16 24 22 + 21 3 3 45 16 59 + 22 3 3 34 13 12 + 23 3 3 30 26 22 + 24 3 3 30 24 10 + 25 3 3 31 7 6 + 26 3 3 58 16 22 + 27 3 3 53 17 23 + 28 3 3 8 28 26 + 29 3 3 17 53 56 + 30 3 3 34 29 25 + 31 3 3 46 49 48 + 32 3 3 30 10 9 + 33 3 3 16 36 37 + 34 3 3 6 5 35 + 35 3 3 29 21 25 + 36 3 3 52 53 20 + 37 3 3 26 30 9 + 38 3 3 24 29 11 + 39 3 3 35 27 31 + 40 3 3 23 28 31 + 41 3 3 42 38 41 + 42 3 3 41 39 42 + 43 3 3 47 49 51 + 44 3 3 33 52 51 + 45 3 3 29 34 12 + 46 3 3 31 27 23 + 47 3 3 6 35 31 + 48 3 3 38 60 15 + 49 3 3 37 15 59 + 50 3 3 43 42 39 + 51 3 3 32 42 43 + 52 3 3 32 43 44 + 53 3 3 38 4 41 + 54 3 3 42 32 60 + 55 3 3 43 39 61 + 56 3 3 43 40 44 + 57 3 3 40 19 44 + 58 3 3 19 25 45 + 59 3 3 19 45 44 + 60 3 3 16 45 21 + 61 3 3 48 49 47 + 62 3 3 56 57 18 + 63 3 3 46 48 3 + 64 3 3 46 57 49 + 65 3 3 52 50 51 + 66 3 3 33 51 49 + 67 3 3 51 2 62 + 68 3 3 2 51 50 + 69 3 3 53 52 33 + 70 3 3 20 50 52 + 71 3 3 53 33 56 + 72 3 3 53 23 27 + 73 3 3 55 54 14 + 74 3 3 54 55 17 + 75 3 3 55 14 58 + 76 3 3 57 56 33 + 77 3 3 54 56 18 + 78 3 3 49 57 33 + 79 3 3 18 57 46 + 80 3 3 16 58 36 + 81 3 3 55 58 22 + 82 3 3 45 59 32 + 83 3 3 37 59 16 + 84 3 3 15 60 59 + 85 3 3 42 60 38 + 86 3 3 1 43 61 + 87 3 3 62 47 51 +ENDOFSECTION + ELEMENT GROUP 1.3.0 +GROUP: 1 ELEMENTS: 87 MATERIAL: 1.000 NFLAGS: 0 + epsilon: 1.000 + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 + 81 82 83 84 85 86 87 +ENDOFSECTION + BOUNDARY CONDITIONS 1.3.0 + Cyl 1 8 0 0 + 2 3 1 + 4 3 1 + 14 3 2 + 16 3 1 + 22 3 2 + 25 3 2 + 32 3 2 + 34 3 1 +ENDOFSECTION + BOUNDARY CONDITIONS 1.3.0 + Wall 1 19 0 0 + 1 3 3 + 5 3 2 + 8 3 2 + 22 3 1 + 30 3 3 + 33 3 2 + 34 3 2 + 39 3 1 + 48 3 3 + 49 3 1 + 53 3 1 + 57 3 1 + 58 3 1 + 63 3 3 + 68 3 3 + 70 3 1 + 73 3 2 + 77 3 3 + 79 3 3 +ENDOFSECTION + BOUNDARY CONDITIONS 1.3.0 + Inflow 1 4 0 0 + 42 3 1 + 53 3 2 + 55 3 2 + 86 3 3 +ENDOFSECTION + BOUNDARY CONDITIONS 1.3.0 + Outflow 1 4 0 0 + 61 3 3 + 63 3 2 + 67 3 2 + 87 3 1 +ENDOFSECTION diff --git a/circA01.neu b/circA01.neu new file mode 100644 index 0000000..44dc77e --- /dev/null +++ b/circA01.neu @@ -0,0 +1,113 @@ + CONTROL INFO 1.3.0 +** GAMBIT NEUTRAL FILE +USEMe mesh file, generated by function: +WriteNeuFormat(C:\Documents and Settings\timwar\Desktop\circA01.neu) +WinUSEMe beta version Ausgust 2002 + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 30 42 1 1 2 2 +ENDOFSECTION + NODAL COORDINATES 1.3.0 + 1 1.000000000e+000 0.000000000e+000 + 2 9.238796234e-001 3.826833963e-001 + 3 7.071068287e-001 7.071068287e-001 + 4 3.826834857e-001 9.238795042e-001 + 5 7.679489755e-008 1.000000000e+000 + 6 -3.826833069e-001 9.238796234e-001 + 7 -7.071067095e-001 7.071068883e-001 + 8 -9.238795042e-001 3.826834857e-001 + 9 -1.000000000e+000 1.535897951e-007 + 10 -9.238796234e-001 -3.826833069e-001 + 11 -7.071068883e-001 -7.071065903e-001 + 12 -3.826836050e-001 -9.238793850e-001 + 13 -2.303846998e-007 -1.000000000e+000 + 14 3.826831877e-001 -9.238796234e-001 + 15 7.071065903e-001 -7.071068883e-001 + 16 9.238793850e-001 -3.826836944e-001 + 17 -4.316749767e-007 -1.164324885e-007 + 18 -9.945613891e-002 5.000000000e-001 + 19 -5.000001788e-001 9.945627302e-002 + 20 -2.832274437e-001 -4.238795936e-001 + 21 2.832270861e-001 -4.238795340e-001 + 22 4.999997616e-001 9.945619106e-002 + 23 3.314354420e-001 4.960280955e-001 + 24 -2.167729586e-001 2.167728543e-001 + 25 -2.832276523e-001 -1.173166558e-001 + 26 -1.869738639e-007 -3.065630496e-001 + 27 2.832269371e-001 -1.173165292e-001 + 28 6.169267297e-001 3.832668364e-001 + 29 1.180048808e-001 7.166358232e-001 + 30 1.140036881e-001 2.825680971e-001 +ENDOFSECTION + ELEMENTS/CELLS 1.3.0 + 1 3 3 10 20 25 + 2 3 3 30 24 17 + 3 3 3 11 12 20 + 4 3 3 29 4 5 + 5 3 3 30 23 18 + 6 3 3 9 19 8 + 7 3 3 21 13 14 + 8 3 3 11 20 10 + 9 3 3 7 18 6 + 10 3 3 7 19 24 + 11 3 3 19 7 8 + 12 3 3 18 23 29 + 13 3 3 13 21 26 + 14 3 3 7 24 18 + 15 3 3 1 22 16 + 16 3 3 28 3 23 + 17 3 3 22 27 16 + 18 3 3 16 21 15 + 19 3 3 26 17 25 + 20 3 3 1 2 22 + 21 3 3 10 19 9 + 22 3 3 5 6 18 + 23 3 3 13 20 12 + 24 3 3 23 22 28 + 25 3 3 4 23 3 + 26 3 3 19 25 24 + 27 3 3 25 17 24 + 28 3 3 21 14 15 + 29 3 3 27 17 26 + 30 3 3 23 30 22 + 31 3 3 10 25 19 + 32 3 3 26 25 20 + 33 3 3 13 26 20 + 34 3 3 27 26 21 + 35 3 3 16 27 21 + 36 3 3 30 27 22 + 37 3 3 22 2 28 + 38 3 3 3 28 2 + 39 3 3 4 29 23 + 40 3 3 5 18 29 + 41 3 3 24 30 18 + 42 3 3 30 17 27 +ENDOFSECTION + ELEMENT GROUP 1.3.0 +GROUP: 1 ELEMENTS: 42 MATERIAL: 1.000 NFLAGS: 0 + epsilon: 1.000 + 0 + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 +ENDOFSECTION + BOUNDARY CONDITIONS 1.3.0 + Dirichlet 1 16 0 0 + 3 3 1 + 4 3 2 + 6 3 3 + 7 3 2 + 8 3 3 + 9 3 3 + 11 3 2 + 15 3 3 + 18 3 3 + 20 3 1 + 21 3 3 + 22 3 1 + 23 3 3 + 25 3 3 + 28 3 2 + 38 3 3 +ENDOFSECTION diff --git a/dtscale2D.m b/dtscale2D.m new file mode 100644 index 0000000..5432fca --- /dev/null +++ b/dtscale2D.m @@ -0,0 +1,25 @@ +function dtscale = dtscale2D; + +% function dtscale = dtscale2D; +% Purpose : Compute inscribed circle diameter as characteristic +% for grid to choose timestep + +Globals2D; + +% Find vertex nodes +vmask1 = find( abs(s+r+2) < NODETOL)'; +vmask2 = find( abs(r-1) < NODETOL)'; +vmask3 = find( abs(s-1) < NODETOL)'; +vmask = [vmask1;vmask2;vmask3]'; +vx = x(vmask(:), :); vy = y(vmask(:), :); + +% Compute semi-perimeter and area +len1 = sqrt((vx(1,:)-vx(2,:)).^2+(vy(1,:)-vy(2,:)).^2); +len2 = sqrt((vx(2,:)-vx(3,:)).^2+(vy(2,:)-vy(3,:)).^2); +len3 = sqrt((vx(3,:)-vx(1,:)).^2+(vy(3,:)-vy(1,:)).^2); +sper = (len1 + len2 + len3)/2.0; +Area = sqrt(sper.*(sper-len1).*(sper-len2).*(sper-len3)); + +% Compute scale using radius of inscribed circle +dtscale = Area./sper; +return; \ No newline at end of file diff --git a/edgeDirection.m b/edgeDirection.m new file mode 100644 index 0000000..00ef1b4 --- /dev/null +++ b/edgeDirection.m @@ -0,0 +1,11 @@ +function [t, n] = edgeDirection(p, e) + % Compute edge length, unit tangential vectors t, and unit normal vectors n. + % The tangential vector is from starting point to ending point. + % The normal vector is pointing to the right side of the edge. + % It returns edgeL, a row vector of dimension meshData.nE, + % t, n, two 2-by-meshData.nE matrices. + + edgeVec = p(:,e(2,:)) - p(:,e(1,:)); + edgeL = sqrt(sum(edgeVec.^2,1)); + t = edgeVec./[edgeL; edgeL]; + n = [t(2,:); -t(1,:)]; \ No newline at end of file diff --git a/edgeLength.m b/edgeLength.m new file mode 100644 index 0000000..20fa4c1 --- /dev/null +++ b/edgeLength.m @@ -0,0 +1,5 @@ +function [edgeL] = edgeLength(p,e) + % Compute length of edges. + % It returns a row vector of dimension meshData.nE + + edgeL = sqrt(sum((p(:,e(2,:)) - p(:,e(1,:))).^2,1)); \ No newline at end of file diff --git a/edgePointCoord.m b/edgePointCoord.m new file mode 100644 index 0000000..755e1c8 --- /dev/null +++ b/edgePointCoord.m @@ -0,0 +1,14 @@ +function [px, py] = edgePointCoord(p, e, refcoord) + % Given a reference coordinate 0<=refcoord<=1, + % compute the actual coordinate of points on all edges with coordinate + % pStart + refcoord * (pEnd - pStart) + % + % The output is stored in two + % row vectors, px for x-coordinate and py for y-coordinate. + % Both are ordered according to the edges defined in e. + % + % Example: + % [px, py] = edgePointCoord(p, e, 0.5); returns the center of edges + + px = (1-refcoord)*p(1, e(1, :)) + refcoord*p(1, e(2, :)); + py = (1-refcoord)*p(2, e(1, :)) + refcoord*p(2, e(2, :)); \ No newline at end of file diff --git a/meshAdaptiveRefine.asv b/meshAdaptiveRefine.asv new file mode 100644 index 0000000..95a3f79 --- /dev/null +++ b/meshAdaptiveRefine.asv @@ -0,0 +1,177 @@ +function [meshData] = meshAdaptiveRefine(meshData, triangle_mark) +% Refine the mesh using the newest vertex bisection method. +% In each triangle, the "newest vertex is called the "peak" +% and the edge oppsite to this vertex is called the "base". +% +% Inputs: +% mesh - mesh struct, see meshInfo.m for details. +% In mesh.T, the first vertex will be the peak and +% hence the second edge will be the base. +% (Remark: call meshMakeLongestEdgeSuitable to make triangular meshes +% ready for the adaptive refinement.) +% +% triangle_mark - an nT-dim vector containing 0 and positive integers +% triangle_mark(i) > 0 means the ith triangle +% will be refined. +% +% Remark: we choose not to use recursive function call in the +% implementation of the adaptive mesh refine, in order to inprove the +% performance. Notice that our function knows the total number of new +% vertices, triangles, edges to be added. Then it allocates the memory in +% bulk size. This should be faster, especially in Matlab, than increase the +% size of matrices/vectors one column by one column. + + if ~strcmp(meshData.elementType,'triangular') + error('meshAdaptiveRefine only works for triangular meshes!'); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Part 1: Mark triangles and edges to be refined. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Initially, marked edges contain bases of all marked triangles. + edge_mark = zeros(1, meshData.nE); + edge_mark(abs(meshData.T2E(2, triangle_mark==1))) = 1; + + % To ensure geometric conformity of the mesh, we check repeatedly + % and mark new triangles or edges if needed, until there's nothing + % more to mark. + % n -- number of new marks in current sweep. n = 0 means + % the current marked set will give a conforming meshData. + n = 1; + while n + [n, triangle_mark, edge_mark] = markEdge(meshData, triangle_mark, edge_mark); + end + + % Marked edges are indexed. Hence The new vertex at the center of the + % marked edge will have a unique index = nPofOriginalMesh + markedEdgeIndex + ind = (edge_mark>0); + edge_mark(ind) = 1:nnz(edge_mark); + + % markedT and markedE stores the indices of marked triangles and edges. + markedT = find(triangle_mark>0); + markedE = find(edge_mark>0); + + % be_mark and markedBE are boundary edge marks. + be_mark = edge_mark(meshData.BE2E); + markedBE = find(be_mark>0); + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Part 2: Add new vertices, triangles and boundaryEdges to the meshData. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Add new vertices + meshData.P(:,(meshData.nP+1):(meshData.nP+length(markedE))) = ... + ( meshData.P(:,meshData.E(1,markedE)) + meshData.P(:,meshData.E(2,markedE)) ) *0.5; + + % Set triangles + % First, compute the total number of new triangles + % Note that each marked internal edge brings 2 more triangles and each + % marked boundary edge only brings 1 more. + nTInc = 2*length(markedE) - length(markedBE); + % Allocate memory + meshData.T(:, (meshData.nT+1):(meshData.nT+nTInc)) = 0; + meshData.TSubdomN(:, (meshData.nT+1):(meshData.nT+nTInc)) = 0; + meshData.T2E(:, (meshData.nT+1):(meshData.nT+nTInc)) = 0; + % bisect triangles + for i=1:length(markedT) + % t2emark is the edge_mark of triangle i. + t2emark = edge_mark(abs(meshData.T2E(:,markedT(i)))); + + % Bisect triangle i. + [meshData, leftTind, rightTind] = bisect(markedT(i), meshData, edge_mark); + + % Bisect left triangle if needed. + if t2emark(1) + meshData = bisect(leftTind, meshData, edge_mark); + end + + % Bisect right triangle if needed. + if t2emark(3) + meshData = bisect(rightTind, meshData, edge_mark); + end + end + + % set boundary edges. + % First, compute the total number of new boundary edges + nBEInc = length(markedBE); + % Allocarte memory + meshData.BE(:, (meshData.nBE+1):(meshData.nBE+nBEInc)) = 0; + meshData.BESegN(:, (meshData.nBE+1):(meshData.nBE+nBEInc)) = 0; + meshData.BEOrient(:, (meshData.nBE+1):(meshData.nBE+nBEInc)) = 0; + % bisect boundary edges + for i=1:length(markedBE) + % set BE start from the end of current BE and end at the center. + meshData.BE(:,meshData.nBE+1) = meshData.BE([2,1],markedBE(i)); + meshData.BESegN(meshData.nBE+1) = meshData.BESegN(markedBE(i)); + meshData.BEOrient(meshData.nBE+1) = -meshData.BEOrient(markedBE(i)); + % set the ends of both sub-BE of the current BE to be the center. + meshData.BE(2,[markedBE(i),meshData.nBE]) = meshData.nP + be_mark(markedBE(i)); + % increase nBE + meshData.nBE = meshData.nBE+1; + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Final clean up: set the rest of the mesh data. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + meshData.nP = size(meshData.P, 2); + meshData.nBE= size(meshData.BE, 2); + meshData.nT = size(meshData.T, 2); + meshData.nE = (3*meshData.nT-meshData.nBE)/2+meshData.nBE; + meshData = meshConstructEdgeData(meshData); + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Subroutines. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [n, triangle_mark, edge_mark] = markEdge(meshData, triangle_mark, edge_mark) +% This function completes one sweep of marking triangles-and-edges. +% It does two things: +% (1) Bases of all marked triangles should be marked (edgesShouldBeMarked) +% Record the number of edgesShouldBeMarked but not marked, and mark them. +% (2) Triangles with one marked edge should be marked (trianglesShouldBeMarked) +% Record the number of triangleShouldBeMarked but not marked, and mark +% them. +% +% n -- The number of total marks (triangle and edge) done in this sweep. +% n = 0 means no more mark needed and the mesh is ready to be bisected. + + edgesShouldBeMarked = abs(meshData.T2E(2, triangle_mark>0)); + temp_edge_mark = edge_mark(edgesShouldBeMarked); + n = length(temp_edge_mark) - nnz(temp_edge_mark); + edge_mark(edgesShouldBeMarked) = 1; + + ind = (edge_mark>0); + trianglesShouldBeMarked = nonzeros(union(meshData.E2T(1,ind),meshData.E2T(2,ind))); + temp_triangle_mark = triangle_mark(trianglesShouldBeMarked); + n = n + length(temp_triangle_mark) - nnz(temp_triangle_mark); + triangle_mark(trianglesShouldBeMarked) = 1; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [meshData, leftTind, rightTind] = bisect(i, meshData, edge_mark) +% Bisect triangle i. +% It returns the updated mesh and the indices of the left and right sub-triangles. + + % indP -- index of the new vertex at the center of the base. + indP = meshData.nP + edge_mark(abs(meshData.T2E(2,i))); + + % Set vertices and subdomain info for the left and right sub-triangles, + % and make sure both of them have the new vertex as peaks. + meshData.T(:,[i,meshData.nT+1]) = [indP, meshData.T(1,i), meshData.T(2,i); ... + indP, meshData.T(3,i), meshData.T(1,i)]'; + meshData.TSubdomN([i, meshData.nT+1]) = [meshData.TSubdomN(i), meshData.TSubdomN(i)]; + + % Set the base of two sub-triangles. This is important since the subtriangles + % may need to be bisected later. + meshData.T2E(2,[i,meshData.nT+1]) = [meshData.T2E(1,i), meshData.T2E(3,i)]; + + % Indices of the left and right sub-triangles. + leftTind = i; + rightTind = size(meshData.T2E,2); + + % increase nT + meshData.nT = meshData.nT+1; \ No newline at end of file diff --git a/meshAdaptiveRefine.m b/meshAdaptiveRefine.m new file mode 100644 index 0000000..14a9d6e --- /dev/null +++ b/meshAdaptiveRefine.m @@ -0,0 +1,176 @@ +function [meshData] = meshAdaptiveRefine(meshData, triangle_mark) +% Refine the mesh using the newest vertex bisection method. +% In each triangle, the "newest vertex is called the "peak" +% and the edge oppsite to this vertex is called the "base". +% +% Inputs: +% mesh - mesh struct, see meshInfo.m for details. +% In mesh.T, the first vertex will be the peak and +% hence the second edge will be the base. +% (Remark: call meshMakeLongestEdgeSuitable to make triangular meshes +% ready for the adaptive refinement.) +% +% triangle_mark - an nT-dim vector containing 0 and positive integers +% triangle_mark(i) > 0 means the ith triangle +% will be refined. +% +% Remark: we choose not to use recursive function call in the +% implementation of the adaptive mesh refine, in order to inprove the +% performance. Notice that our function knows the total number of new +% vertices, triangles, edges to be added. Then it allocates the memory in +% bulk size. This should be faster, especially in Matlab, than increase the +% size of matrices/vectors one column by one column. + + if ~strcmp(meshData.elementType,'triangular') + error('meshAdaptiveRefine only works for triangular meshes!'); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Part 1: Mark triangles and edges to be refined. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Initially, marked edges contain bases of all marked triangles. + edge_mark = zeros(1, meshData.nE); + edge_mark(abs(meshData.T2E(2, triangle_mark==1))) = 1; + + % To ensure geometric conformity of the mesh, we check repeatedly + % and mark new triangles or edges if needed, until there's nothing + % more to mark. + % n -- number of new marks in current sweep. n = 0 means + % the current marked set will give a conforming meshData. + n = 1; + while n + [n, triangle_mark, edge_mark] = markEdge(meshData, triangle_mark, edge_mark); + end + + % Marked edges are indexed. Hence The new vertex at the center of the + % marked edge will have a unique index = nPofOriginalMesh + markedEdgeIndex + edge_mark(edge_mark>0) = 1:nnz(edge_mark); + + % markedT and markedE stores the indices of marked triangles and edges. + markedT = find(triangle_mark>0); + markedE = find(edge_mark>0); + + % be_mark and markedBE are boundary edge marks. + be_mark = edge_mark(meshData.BE2E); + markedBE = find(be_mark>0); + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Part 2: Add new vertices, triangles and boundaryEdges to the meshData. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Add new vertices + meshData.P(:,(meshData.nP+1):(meshData.nP+length(markedE))) = ... + ( meshData.P(:,meshData.E(1,markedE)) + meshData.P(:,meshData.E(2,markedE)) ) *0.5; + + % Set triangles + % First, compute the total number of new triangles + % Note that each marked internal edge brings 2 more triangles and each + % marked boundary edge only brings 1 more. + nTInc = 2*length(markedE) - length(markedBE); + % Allocate memory + meshData.T(:, (meshData.nT+1):(meshData.nT+nTInc)) = 0; + meshData.TSubdomN(:, (meshData.nT+1):(meshData.nT+nTInc)) = 0; + meshData.T2E(:, (meshData.nT+1):(meshData.nT+nTInc)) = 0; + % bisect triangles + for i=1:length(markedT) + % t2emark is the edge_mark of triangle i. + t2emark = edge_mark(abs(meshData.T2E(:,markedT(i)))); + + % Bisect triangle i. + [meshData, leftTind, rightTind] = bisect(markedT(i), meshData, edge_mark); + + % Bisect left triangle if needed. + if t2emark(1) + meshData = bisect(leftTind, meshData, edge_mark); + end + + % Bisect right triangle if needed. + if t2emark(3) + meshData = bisect(rightTind, meshData, edge_mark); + end + end + + % set boundary edges. + % First, compute the total number of new boundary edges + nBEInc = length(markedBE); + % Allocarte memory + meshData.BE(:, (meshData.nBE+1):(meshData.nBE+nBEInc)) = 0; + meshData.BESegN(:, (meshData.nBE+1):(meshData.nBE+nBEInc)) = 0; + meshData.BEOrient(:, (meshData.nBE+1):(meshData.nBE+nBEInc)) = 0; + % bisect boundary edges + for i=1:length(markedBE) + % set BE start from the end of current BE and end at the center. + meshData.BE(:,meshData.nBE+1) = meshData.BE([2,1],markedBE(i)); + meshData.BESegN(meshData.nBE+1) = meshData.BESegN(markedBE(i)); + meshData.BEOrient(meshData.nBE+1) = -meshData.BEOrient(markedBE(i)); + % set the ends of both sub-BE of the current BE to be the center. + meshData.BE(2,[markedBE(i),meshData.nBE]) = meshData.nP + be_mark(markedBE(i)); + % increase nBE + meshData.nBE = meshData.nBE+1; + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Final clean up: set the rest of the mesh data. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + meshData.nP = size(meshData.P, 2); + meshData.nBE= size(meshData.BE, 2); + meshData.nT = size(meshData.T, 2); + meshData.nE = (3*meshData.nT-meshData.nBE)/2+meshData.nBE; + meshData = meshConstructEdgeData(meshData); + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Subroutines. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [n, triangle_mark, edge_mark] = markEdge(meshData, triangle_mark, edge_mark) +% This function completes one sweep of marking triangles-and-edges. +% It does two things: +% (1) Bases of all marked triangles should be marked (edgesShouldBeMarked) +% Record the number of edgesShouldBeMarked but not marked, and mark them. +% (2) Triangles with one marked edge should be marked (trianglesShouldBeMarked) +% Record the number of triangleShouldBeMarked but not marked, and mark +% them. +% +% n -- The number of total marks (triangle and edge) done in this sweep. +% n = 0 means no more mark needed and the mesh is ready to be bisected. + + edgesShouldBeMarked = abs(meshData.T2E(2, triangle_mark>0)); + temp_edge_mark = edge_mark(edgesShouldBeMarked); + n = length(temp_edge_mark) - nnz(temp_edge_mark); + edge_mark(edgesShouldBeMarked) = 1; + + ind = (edge_mark>0); + trianglesShouldBeMarked = nonzeros(union(meshData.E2T(1,ind),meshData.E2T(2,ind))); + temp_triangle_mark = triangle_mark(trianglesShouldBeMarked); + n = n + length(temp_triangle_mark) - nnz(temp_triangle_mark); + triangle_mark(trianglesShouldBeMarked) = 1; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [meshData, leftTind, rightTind] = bisect(i, meshData, edge_mark) +% Bisect triangle i. +% It returns the updated mesh and the indices of the left and right sub-triangles. + + % indP -- index of the new vertex at the center of the base. + indP = meshData.nP + edge_mark(abs(meshData.T2E(2,i))); + + % Set vertices and subdomain info for the left and right sub-triangles, + % and make sure both of them have the new vertex as peaks. + meshData.T(:,[i,meshData.nT+1]) = [indP, meshData.T(1,i), meshData.T(2,i); ... + indP, meshData.T(3,i), meshData.T(1,i)]'; + meshData.TSubdomN([i, meshData.nT+1]) = [meshData.TSubdomN(i), meshData.TSubdomN(i)]; + + % Set the base of two sub-triangles. This is important since the subtriangles + % may need to be bisected later. + meshData.T2E(2,[i,meshData.nT+1]) = [meshData.T2E(1,i), meshData.T2E(3,i)]; + + % Indices of the left and right sub-triangles. + leftTind = i; + rightTind = size(meshData.T2E,2); + + % increase nT + meshData.nT = meshData.nT+1; \ No newline at end of file diff --git a/meshBaryCenter.m b/meshBaryCenter.m new file mode 100644 index 0000000..a8b5a1b --- /dev/null +++ b/meshBaryCenter.m @@ -0,0 +1,14 @@ +function [baryCenter] = meshBaryCenter(meshData) +% Find the bary center of element. +% Does not work for elementType=='trig-cluster' + +switch meshData.elementType + case 'triangular' + baryCenter = (meshData.P(:,meshData.T(1,:)) + meshData.P(:,meshData.T(2,:)) ... + + meshData.P(:,meshData.T(3,:)) )*(1/3); + case 'quadrilateral' + baryCenter = (meshData.P(:,meshData.T(1,:)) + meshData.P(:,meshData.T(2,:)) ... + +meshData.P(:,meshData.T(3,:)) + meshData.P(:,meshData.T(4,:)))*(0.25); + case 'trig-cluster' + error('meshBaryCenter does not work for trig-cluster meshes!'); +end \ No newline at end of file diff --git a/meshConstructEdgeData.m b/meshConstructEdgeData.m new file mode 100644 index 0000000..056b355 --- /dev/null +++ b/meshConstructEdgeData.m @@ -0,0 +1,91 @@ +function [meshData] = meshConstructEdgeData (meshData) +% +% generate edge related data structures, namely +% +% E, T2E, E2T, ELInd, E2BE, BE2E +% +% Remark: meshConstructEdgeData resets BE so that they start from +% points with smaller indices. In this case, both BE2E and E2BE are +% nonnegative. + + % Sort BE start and ending points by the point index + [meshData.BE,tempI] = sort(meshData.BE); + ind = ( diff(tempI,1,1)==-1 ); % indices of edges that has been flipped + meshData.BEOrient(ind) = -meshData.BEOrient(ind); + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Part 1: Creat tables E, T2E, E2T and ELInd + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Sort internal halfedges so that all starts from the vertex with smaller + % index. Total nHalfEdges = 3*nT or 4*nT depending on mesh types. + % Note that some of the halfedges are dummies that connect vertex 0 to 0. + if strcmp(meshData.elementType,'quadrilateral') + maxTn = 4; + else + maxTn = 3; + end + halfedges = zeros(2, maxTn*meshData.nT); + for i=1:(maxTn-1) + halfedges(:,((i-1)*meshData.nT+1):(i*meshData.nT)) = meshData.T([i, i+1],:); + end + i = maxTn; + halfedges(:,((i-1)*meshData.nT+1):(i*meshData.nT)) = meshData.T([i,1],:); + + % e (2-by-nHalfedges) -- sorted halfedge + % flag (1-by-nHalfedges) -- orientation (1 or -1) of the halfedge in edge + [e, flag] = sort(halfedges); + flag = diff(flag,1,1); + + % Combine two opposite halfedges to get the unique edge. + % e (nEdges-by-2) -- stores the unique edge. + % J (nHalfEdges-by-1) -- stores the halfedge-to-edge map + [e, temp, J] = unique(e', 'rows'); + meshData.E = e'; + [temp,meshData.nE] = size(meshData.E); + + % Then flag'.*J gives the halfedge-to-orientedEdge map. + % This helps to generate T2E by triangle->halfedge->orientedEdge + meshData.T2E = reshape(flag'.*J, meshData.nT, maxTn)'; + + % Generate E2T. + % For boundary edges, either left or right triangle = 0. + % T (1-by-nHalfEdges) -- stores indices of associated triangles + % for each halfedge. + meshData.E2T = zeros(2, meshData.nE); + T = repmat(1:meshData.nT, 1, maxTn); + % Left triangle index. + lind = ( flag==1 ); + meshData.E2T(1,J(lind)) = T(lind); + % Right triangle index. + rind = ( flag==-1 ); + meshData.E2T(2,J(rind)) = T(rind); + + % Generate ELInd + meshData.ELInd = zeros(2, meshData.nE); + t2e = reshape(meshData.T2E', 1, maxTn*meshData.nT); + ind = ( t2e~=0 ); + rowind = (1-sign(t2e))/2+1; + colind = abs(t2e); + values = reshape(repmat((1:maxTn)', 1, meshData.nT)', 1, maxTn*meshData.nT); + meshData.ELInd = meshData.ELInd + sparse(rowind(ind), colind(ind), ... + values(ind), 2, meshData.nE); + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Part 2: Creat tables E2BE and BE2E + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Find all boundary edges, which are edges with left or right triangle = 0. + ind = union(find(meshData.E2T(1,:)==0), find(meshData.E2T(2,:)==0)); + + % Reserve spaces for E2BE and BE2E + meshData.E2BE = zeros(1, meshData.nE); + meshData.BE2E = zeros(1, meshData.nBE); + + % Set the tables + [temp, IE] = sortrows(meshData.E(:,ind)'); + [temp, IBE] = sortrows(meshData.BE'); + [temp, reverseIE] = sort(IE); + meshData.E2BE(ind(IE)) = IBE; + meshData.BE2E(IBE) = ind(reverseIE); + diff --git a/meshDisp.m b/meshDisp.m new file mode 100644 index 0000000..7bee4bd --- /dev/null +++ b/meshDisp.m @@ -0,0 +1,53 @@ +function meshDisp(meshData) +% display meshData structure + + fprintf(' elementType == %s\n', meshData.elementType); + + fprintf(' Points: %d\n', meshData.nP); + disp(meshData.P) + + fprintf(' Elements: %d\n', meshData.nT); + disp(meshData.T) + + fprintf(' Subdomains: %d\n',meshData.nSubdom); + disp(meshData.TSubdomN); + + fprintf(' Edges: %d\n', meshData.nE); + disp(meshData.E) + + fprintf(' Boundary edges: %d\n', meshData.nBE); + disp(meshData.BE) + fprintf(' BE Segment number: \n'); + disp(meshData.BESegN); + fprintf(' BE Orientation: \n'); + disp(meshData.BEOrient); + + fprintf(' T2E table: \n'); + disp(meshData.T2E); + + fprintf(' E2T table: \n'); + disp(meshData.E2T); + + fprintf(' ELInd table: \n'); + disp(meshData.ELInd); + + fprintf(' E2BE table: \n'); + disp(meshData.E2BE); + + fprintf(' BE2E table: \n'); + disp(meshData.BE2E); + + if strcmp(meshData.elementType, 'trig-cluster') + fprintf(' This is a trig-cluster mesh.\n'); + + fprintf(' Clusters: %d\n', meshData.nC); + disp(meshData.C) + + fprintf(' T2C table:\n'); + disp(meshData.T2C); + + fprintf(' Interfaces: %d\n',meshData.nInterface); + disp(meshData.Interface); + end + + \ No newline at end of file diff --git a/meshMarkForRefine.m b/meshMarkForRefine.m new file mode 100644 index 0000000..188b40d --- /dev/null +++ b/meshMarkForRefine.m @@ -0,0 +1,54 @@ +function [mark] = meshMarkForRefine(meshData, eta, strategy) +% +% Mark triangles for adaptive refinement. +% Only works for triangular meshes. +% eta is a given vector of dim = nT, which stores the a posteriori error estimator. +% + + if ~strcmp(meshData.elementType,'triangular') + error('meshMarkForRefine only works for triangular meshes!'); + end + + mark = zeros(1,meshData.nT); + + switch strategy + case 'maximum' + maxeta = max(eta); + mark(eta>maxeta/2) = 1; + case 'bulk' + total = norm(eta,2); + [sortedeta, ind] = sort(eta,2,'descend'); + s = sqrt(cumsum(sortedeta.^2)); + lastone = max(union(find(stheta*mean(eta(temp(nonzeroind)))) + mark(i) = 1; + end + end + otherwise + maxeta = max(eta); + mark(eta>maxeta/2) = 1; + end \ No newline at end of file diff --git a/meshPlot.m b/meshPlot.m new file mode 100644 index 0000000..faca2b2 --- /dev/null +++ b/meshPlot.m @@ -0,0 +1,18 @@ +function meshPlot(meshData) + clf; + if strcmp(meshData.elementType, 'trig-cluster') + hold on + line([meshData.P(1,meshData.E(1,:)); meshData.P(1,meshData.E(2,:))], ... + [meshData.P(2,meshData.E(1,:)); meshData.P(2,meshData.E(2,:))], ... + 'Color', [0.7,0.7,0.7]); + ii = meshData.E(:,meshData.Interface); + line([meshData.P(1,ii(1,:)); meshData.P(1,ii(2,:))], ... + [meshData.P(2,ii(1,:)); meshData.P(2,ii(2,:))], ... + 'Color', 'k'); + hold off + else + line([meshData.P(1,meshData.E(1,:)); meshData.P(1,meshData.E(2,:))], ... + [meshData.P(2,meshData.E(1,:)); meshData.P(2,meshData.E(2,:))], ... + 'Color', 'k'); + end + axis off, axis equal; \ No newline at end of file diff --git a/meshPlotPrimalDual.m b/meshPlotPrimalDual.m new file mode 100644 index 0000000..ce3995a --- /dev/null +++ b/meshPlotPrimalDual.m @@ -0,0 +1,15 @@ +function meshPlotPrimalDual(meshData, dualMesh) +% Draw the primal and the dual mesh together +clf; +hold on +% dual Mesh +ii = dualMesh.E(:,dualMesh.Interface); +line([dualMesh.P(1,ii(1,:)); dualMesh.P(1,ii(2,:))], ... + [dualMesh.P(2,ii(1,:)); dualMesh.P(2,ii(2,:))], ... + 'Color', 'r'); +% primal mesh +line([meshData.P(1,meshData.E(1,:)); meshData.P(1,meshData.E(2,:))], ... + [meshData.P(2,meshData.E(1,:)); meshData.P(2,meshData.E(2,:))], ... + 'Color', 'k'); +hold off +axis off, axis equal; \ No newline at end of file diff --git a/meshPlotWithIndices.m b/meshPlotWithIndices.m new file mode 100644 index 0000000..e2e99e7 --- /dev/null +++ b/meshPlotWithIndices.m @@ -0,0 +1,98 @@ +function meshPlotWithIndices(meshData, varargin) + % Plot the mesh with indices of points, triangles, edges, etc. + % varargin contains + % 1. a string containing one or more of + % p: draw point indices + % t: draw element indices + % e: draw edge indices together with direction + % b: draw boundary edge indices together with direction + % + % 2. font size + % + % By default, it plot 'pt' using default font size 10. + % + % Remark: + % (1) If t is chosen, it draws the element indices in red, with a green + % dashed line connecting the index with the starting point of this + % element. + % (2) Boundary edge indices are enclosed in a rectangular box, in order + % to distinguish them from internal edges. If both e and b are chosen, + % the small rectangular box encloses two indices, the first one is edge + % index and the second one is BE index. + % + % Example: + % meshPlotWithIndices(meshData); + % meshPlotWithIndices(meshData, 'pe'); + % meshPlotWithIndices(meshData, 'pe', 14); + + if strcmp(meshData.elementType, 'trig-cluster') + error('meshPlotWithIndices currently does not work for trig-cluster meshes'); + end + + defaultplot = 'pt'; + defaultfontsize = 10; + if nargin > 1 + defaultplot = varargin{1}; + end + if nargin > 2 + defaultfontsize = varargin{2}; + end + + clf; + hold on + + % Draw edges + line([meshData.P(1,meshData.E(1,:)); meshData.P(1,meshData.E(2,:))], ... + [meshData.P(2,meshData.E(1,:)); meshData.P(2,meshData.E(2,:))], ... + 'Color', 'k'); + + % Draw arrows that indicate edge directions + if ismember('e', defaultplot) + [ax, ay] = edgePointCoord(meshData.P, meshData.E, 0); + [ll, tt, ~] = edgeLengthDirection(meshData.P, meshData.E); + ll = ll*0.75; + quiver(ax, ay, ll.*tt(1,:), ll.*tt(2,:),0,'k'); + end + if ismember('b', defaultplot) + [ax, ay] = edgePointCoord(meshData.P, meshData.BE, 0); + [ll, tt, ~] = edgeLengthDirection(meshData.P, meshData.BE); + ll = ll*0.75; + quiver(ax, ay, ll.*tt(1,:), ll.*tt(2,:),0,'k'); + end + + % Draw indices + if ismember('p', defaultplot) + text(meshData.P(1,:), meshData.P(2,:), num2str((1:meshData.nP)'), ... + 'Color','blue','FontWeight','bold','FontSize',defaultfontsize); + end + if ismember('t', defaultplot) + [cx, cy] = trgPointCoord(meshData.P, meshData.T(1:3,:), [1/3, 1/3]); + text(cx, cy, num2str((1:meshData.nT)'), ... + 'Color','red','EdgeColor','red','FontWeight','bold','FontSize',defaultfontsize); + line([cx; meshData.P(1, meshData.T(1,:))], [cy; meshData.P(2, meshData.T(1,:))], ... + 'Color', 'g', 'LineStyle', '--', 'LineWidth', 2); + end + if ismember('e', defaultplot)&&(~ismember('b', defaultplot)) + ce = 0.5*(meshData.P(:, meshData.E(1,:)) + meshData.P(:, meshData.E(2,:))); + text(ce(1,:), ce(2,:), num2str((1:meshData.nE)'), ... + 'Color','magenta','FontWeight','bold','FontSize',defaultfontsize); + end + if ismember('b', defaultplot)&&(~ismember('e', defaultplot)) + cbe = 0.5*(meshData.P(:, meshData.BE(1,:)) + meshData.P(:, meshData.BE(2,:))); + text(cbe(1,:), cbe(2,:), num2str((1:meshData.nBE)'), ... + 'Color','magenta','EdgeColor','magenta','FontWeight','bold','FontSize',defaultfontsize); + end + if ismember('e', defaultplot)&&ismember('b', defaultplot) + ce = 0.5*(meshData.P(:, meshData.E(1,:)) + meshData.P(:, meshData.E(2,:))); + ieInd = find(meshData.E2BE==0); + estring = num2str((1:meshData.nE)'); + text(ce(1,ieInd), ce(2,ieInd), estring(ieInd,:), ... + 'Color','magenta','FontWeight','bold','FontSize',defaultfontsize); + bestring = [estring(meshData.BE2E, :), repmat(', ',meshData.nBE, 1), num2str((1:meshData.nBE)')]; + text(ce(1,meshData.BE2E), ce(2,meshData.BE2E), bestring, ... + 'Color','magenta','EdgeColor','magenta','FontWeight','bold','FontSize',defaultfontsize); + end + + axis equal; + axis off + hold off \ No newline at end of file diff --git a/meshPlotWithSubdomains.m b/meshPlotWithSubdomains.m new file mode 100644 index 0000000..cf09e3e --- /dev/null +++ b/meshPlotWithSubdomains.m @@ -0,0 +1,28 @@ +function meshPlotWithSubdomains(meshData) +% Draw the mesh where subdomains are indicated by different colors. + + clf; + + % Use colors to indicate subdomains. + switch meshData.elementType + case 'triangular' + xx = [meshData.P(1,meshData.T(1,:)); meshData.P(1,meshData.T(2,:)); meshData.P(1,meshData.T(3,:))]; + yy = [meshData.P(2,meshData.T(1,:)); meshData.P(2,meshData.T(2,:)); meshData.P(2,meshData.T(3,:))]; + p = repmat(meshData.TSubdomN,3, 1); + H1=patch(xx,yy,p); + set(H1,'EdgeColor',[0,0,0]); + case 'quadrilateral' + xx = [meshData.P(1,meshData.T(1,:)); meshData.P(1,meshData.T(2,:)); ... + meshData.P(1,meshData.T(3,:)); meshData.P(1,meshData.T(4,:))]; + yy = [meshData.P(2,meshData.T(1,:)); meshData.P(2,meshData.T(2,:)); ... + meshData.P(2,meshData.T(3,:)); meshData.P(2,meshData.T(4,:))]; + p = repmat(meshData.TSubdomN,4, 1); + H1=patch(xx,yy,p); + set(H1,'EdgeColor',[0,0,0]); + case {'trigcluster'} + error('meshPlotWithSubdomains currently does not work for trig-cluster meshes'); + end + + view(2); + axis equal + axis off \ No newline at end of file diff --git a/meshUniformRefineQuadrilateral.m b/meshUniformRefineQuadrilateral.m new file mode 100644 index 0000000..c4137d9 --- /dev/null +++ b/meshUniformRefineQuadrilateral.m @@ -0,0 +1,145 @@ +function [meshData] = meshUniformRefineQuadrilateral(meshData) +% Refine a quadrilateral mesh uniformly. +% +% Remark: After unifirm refine, edges may not start from points with a +% lower index. However, this program guarantees that the edges and boundary +% edges have the same direction. The reason that we do not want to make +% all edge direction from smaller point indices to larger is that, this +% breaks the coarse-fine mesh relationship which is important in multigrid +% methods. + + if ~strcmp(meshData.elementType,'quadrilateral') + error('meshUniformRefineQuadrilateral only works for quadrilateral meshes!'); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Refine + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Step 0: Set some quantities + % --------------------------- + np = meshData.nP; + ne = meshData.nE; + nt = meshData.nT; + nbe = meshData.nBE; + ne2 = 2*ne; + nt4 = nt*4; + e1c = np+abs(meshData.T2E(1,:)); + e2c = np+abs(meshData.T2E(2,:)); + e3c = np+abs(meshData.T2E(3,:)); + e4c = np+abs(meshData.T2E(4,:)); + qc = np+ne+(1:nt); + + % Step 1: Add new vertices + % --------------------------- + meshData.P(:, (np+1):(np+ne+nt)) = ... + [( meshData.P(:,meshData.E(1,:)) + meshData.P(:,meshData.E(2,:)) ) *0.5, ... + ( meshData.P(:,meshData.T(1,:)) + meshData.P(:,meshData.T(2,:)) ... + +meshData.P(:,meshData.T(3,:)) + meshData.P(:,meshData.T(4,:)) ) *0.25]; + + % Step 2: Add new edges + % --------------------------- + meshData.E(:, (ne+1):(ne2+nt4)) = 0; + % set two sub-edges of all original edges. + % The edge order is: + % first, ne edges with vertices [startP, centerP] + % second, ne edges with vertices [endP, centerP] + meshData.E(:, (ne+1):(ne2)) = [meshData.E(2,1:ne); meshData.nP+(1:ne)]; + meshData.E(2, 1:ne) = np+(1:ne); + % Set four new edges inside each original triangle. + % The order is from points at edge center to point at the barycenter. + meshData.E(:, (ne2+1):4:end) = [e1c; qc]; + meshData.E(:, (ne2+2):4:end) = [e2c; qc]; + meshData.E(:, (ne2+3):4:end) = [e3c; qc]; + meshData.E(:, (ne2+4):4:end) = [e4c; qc]; + + % Step 3: Add new quadrilaterals + % --------------------------- + t = meshData.T; + meshData.T(:, (nt+1):(4*nt)) = 0; + % The ith sub-quadrilateral inherits the ith vertex of the original quad. + meshData.T(:, 1:4:end) = [t(1,:); e1c; qc; e4c]; + meshData.T(:, 2:4:end) = [t(2,:); e2c; qc; e1c]; + meshData.T(:, 3:4:end) = [t(3,:); e3c; qc; e2c]; + meshData.T(:, 4:4:end) = [t(4,:); e4c; qc; e3c]; + % Set subdomains + meshData.TSubdomN(1,(nt+1):(4*nt)) = 0; + meshData.TSubdomN((nt+1):3:end) = meshData.TSubdomN(1:nt); + meshData.TSubdomN((nt+2):3:end) = meshData.TSubdomN(1:nt); + meshData.TSubdomN((nt+3):3:end) = meshData.TSubdomN(1:nt); + + % Step 4: Add new boundary edges + % --------------------------- + meshData.BE(:, (nbe+1):(2*nbe)) = ... + [meshData.BE(2,1:nbe); np+meshData.BE2E]; + meshData.BE(2, 1:nbe) = np+meshData.BE2E(:); + meshData.BESegN((nbe+1):(2*nbe)) = meshData.BESegN(1:nbe); + meshData.BEOrient((nbe+1):(2*nbe)) = -meshData.BEOrient(1:nbe); + + % Step 5: Set T2E + % --------------------------- + % Each column of temp will store all eight sub-edges + % on the boundary of a quadrilateral, in counterclockwise direction, + % starting from the one [vertex1, centerOfOriginalEdge1]. + % Each sub-edge has the orientation that points to the center + % of the original edges. + temp = zeros(8, nt); + temp([1,3,5,7],:) = abs(meshData.T2E); + temp([2,4,6,8],:) = meshData.nE+abs(meshData.T2E); + ind = ( meshData.T2E(1,:)<0 ); + temp([1,2], ind) = temp([2,1], ind); + ind = ( meshData.T2E(2,:)<0 ); + temp([3,4], ind) = temp([4,3], ind); + ind = ( meshData.T2E(3,:)<0 ); + temp([5,6], ind) = temp([6,5], ind); + ind = ( meshData.T2E(4,:)<0 ); + temp([7,8], ind) = temp([8,7], ind); + meshData.T2E(:, (nt+1):(4*nt)) = 0; + iedge1 = ne2+(1:4:nt4); + iedge2 = ne2+(2:4:nt4); + iedge3 = ne2+(3:4:nt4); + iedge4 = ne2+(4:4:nt4); + meshData.T2E(:, 1:4:end) = [temp(1,:); iedge1; -iedge4; -temp(8,:)]; + meshData.T2E(:, 2:4:end) = [temp(3,:); iedge2; -iedge1; -temp(2,:)]; + meshData.T2E(:, 3:4:end) = [temp(5,:); iedge3; -iedge2; -temp(4,:)]; + meshData.T2E(:, 4:4:end) = [temp(7,:); iedge4; -iedge3; -temp(6,:)]; + + % Step 6: Set E2T and ELInd + % --------------------------- + meshData.E2T(:, 1:(ne2+nt4)) = 0; + meshData.ELInd(:, 1:(ne2+nt4)) = 0; + % For sub-edges of original edges. + % We will use the fact that all subedges are pointed in to the center + % of the original edge. + meshData.E2T(1,meshData.T2E(1,1:end)) = 1:nt4; + meshData.E2T(2,-meshData.T2E(4,1:end)) = 1:nt4; + meshData.ELInd(1,meshData.T2E(1,1:end)) = 1; + meshData.ELInd(2,-meshData.T2E(4,1:end)) = 4; + % For four new internal edges. + q1 = 1:4:nt4; + q2 = 2:4:nt4; + q3 = 3:4:nt4; + q4 = 4:4:nt4; + meshData.E2T(:, (ne2+1):4:end) = [q1; q2]; + meshData.E2T(:, (ne2+2):4:end) = [q2; q3]; + meshData.E2T(:, (ne2+3):4:end) = [q3; q4]; + meshData.E2T(:, (ne2+4):4:end) = [q4; q1]; + meshData.ELInd(1, (ne2+1):end) = 2; + meshData.ELInd(2, (ne2+1):end) = 3; + + % Step 7: Set E2BE and BE2E + % --------------------------- + indE = find(meshData.E2BE>0); + meshData.E2BE((ne+1):(ne2+nt4)) = 0; + meshData.E2BE(ne+indE) = nbe + meshData.E2BE(indE); + meshData.BE2E((nbe+1):(2*nbe)) = ne + meshData.BE2E(1:nbe); + + % Step 8: Set numbers + % --------------------------- + meshData.nP = meshData.nP+meshData.nE+meshData.nT; + meshData.nE = 2*meshData.nE+4*meshData.nT; + meshData.nT = 4*meshData.nT; + meshData.nBE = 2*meshData.nBE; + + + \ No newline at end of file diff --git a/meshUniformRefineTriangular.asv b/meshUniformRefineTriangular.asv new file mode 100644 index 0000000..f0c9537 --- /dev/null +++ b/meshUniformRefineTriangular.asv @@ -0,0 +1,135 @@ +function [meshData] = meshUniformRefineTriangular(meshData) +% Refine a triangular mesh uniformly. +% +% Remark: After unifirm refine, edges may not start from points with a +% lower index. However, this program guarantees that the edges and boundary +% edges have the same direction. The reason that we do not want to make +% all edge direction from smaller point indices to larger is that, this +% breaks the coarse-fine mesh relationship which is important in multigrid +% methods. + + if ~strcmp(meshData.elementType,'triangular') + error('meshUniformRefineTriangular only works for triangular meshes!'); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Refine + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Step 0: Set some quantities + % --------------------------- + np = meshData.nP; + ne = meshData.nE; + nt = meshData.nT; + nbe = meshData.nBE; + ne2 = 2*ne; + nt3 = nt*3; + + + % Step 1: Add new vertices + % --------------------------- + meshData.P(:, (np+1):(np+ne)) = ... + ( meshData.P(:,meshData.E(1,:)) + meshData.P(:,meshData.E(2,:)) ) *0.5; + + % Step 2: Add new edges + % --------------------------- + meshData.E(:, (ne+1):(ne2+nt3)) = 0; + % set two sub-edges of all original edges. + % The edge order is: + % first, ne edges with vertices [startP, centerP] + % second, ne edges with vertices [endP, centerP] + meshData.E(:, (ne+1):(ne2)) = [meshData.E(2,1:ne); meshData.nP+(1:ne)]; + meshData.E(2, 1:ne) = np+(1:ne); + % Set three new edges inside each original triangle. + % Pay attention to the order and orientation. + meshData.E(:, (ne2+1):3:end) = np + abs([meshData.T2E(1,:); meshData.T2E(3,:)]); + meshData.E(:, (ne2+2):3:end) = np + abs([meshData.T2E(2,:); meshData.T2E(1,:)]); + meshData.E(:, (ne2+3):3:end) = np + abs([meshData.T2E(3,:); meshData.T2E(2,:)]); + + % Step 3: Add new triangles + % --------------------------- + meshData.T(:, (nt+1):(4*nt)) = 0; + % Add three sub-triangles who have one original vertex. + % Pay attention to the orientation of these triangles. + meshData.T(:, (nt+1):3:end) = ... + [meshData.T(1,1:nt); np+abs(meshData.T2E(1,:)); ... + np+abs(meshData.T2E(3,:))]; + meshData.T(:, (nt+2):3:end) = ... + [meshData.T(2,1:nt); np+abs(meshData.T2E(2,:)); ... + np+abs(meshData.T2E(1,:))]; + meshData.T(:, (nt+3):3:end) = ... + [meshData.T(3,1:nt); np+abs(meshData.T2E(3,:)); ... + np+abs(meshData.T2E(2,:))]; + % The new sub-triangle at the center inherits + % the original triangle's index. + meshData.T(:, 1:nt) = np+abs(meshData.T2E); + % Set subdomains + meshData.TSubdomN(1,(nt+1):(4*nt)) = 0; + meshData.TSubdomN((nt+1):3:end) = meshData.TSubdomN(1:nt); + meshData.TSubdomN((nt+2):3:end) = meshData.TSubdomN(1:nt); + meshData.TSubdomN((nt+3):3:end) = meshData.TSubdomN(1:nt); + + % Step 4: Add new boundary edges + % --------------------------- + meshData.BE(:, (nbe+1):(2*nbe)) = ... + [meshData.BE(2,1:nbe); np+meshData.BE2E]; + meshData.BE(2, 1:nbe) = np+meshData.BE2E(:); + meshData.BESegN((nbe+1):(2*nbe)) = meshData.BESegN(1:nbe); + meshData.BEOrient((nbe+1):(2*nbe)) = -meshData.BEOrient(1:nbe); + + % Step 5: Set T2E + % --------------------------- + % Each column of temp will store all six sub-edges + % on the boundary of a triangle, in counterclockwise direction, + % starting from the one [vertex1, venterOfOriginalEdge1]. + % Each sub-edge has the orientation that points to the center + % of the original edges. + temp = zeros(6, nt); + temp([1,3,5],:) = abs(meshData.T2E); + temp([2,4,6],:) = meshData.nE+abs(meshData.T2E); + ind = ( meshData.T2E(1,:)<0 ); + temp([1,2], ind) = temp([2,1], ind); + ind = ( meshData.T2E(2,:)<0 ); + temp([3,4], ind) = temp([4,3], ind); + ind = ( meshData.T2E(3,:)<0 ); + temp([5,6], ind) = temp([6,5], ind); + meshData.T2E(:, (nt+1):(4*nt)) = 0; + meshData.T2E(:, (nt+1):3:end) = [temp(1,:); ne2+(1:3:nt3); -temp(6,:)]; + meshData.T2E(:, (nt+2):3:end) = [temp(3,:); ne2+(2:3:nt3); -temp(2,:)]; + meshData.T2E(:, (nt+3):3:end) = [temp(5,:); ne2+(3:3:nt3); -temp(4,:)]; + meshData.T2E(:, 1:nt) = -(ne2 + [2:3:nt3; 3:3:nt3; 1:3:nt3]); + + % Step 6: Set E2T and ELInd + % --------------------------- + meshData.E2T(:, 1:(ne2+nt3)) = 0; + meshData.ELInd(:, 1:(ne2+nt3)) = 0; + % For sub-edges of original edges. + % We will use the fact that all subedges are pointed in to the center + % of the original edge. + meshData.E2T(1,meshData.T2E(1,(nt+1):end)) = (nt+1):(4*nt); + meshData.E2T(2,-meshData.T2E(3,(nt+1):end)) = (nt+1):(4*nt); + meshData.ELInd(1,meshData.T2E(1,(nt+1):end)) = 1; + meshData.ELInd(2,-meshData.T2E(3,(nt+1):end)) = 3; + % For three new internal edges. + meshData.E2T(:, (ne2+1):end) = [(nt+1):(4*nt); reshape([1:nt;1:nt;1:nt],1,nt3)]; + meshData.ELInd(1,(ne2+1):end) = 2; + meshData.ELInd(2,(ne2+1):3:end) = 3; + meshData.ELInd(2,(ne2+2):3:end) = 1; + meshData.ELInd(2,(ne2+3):3:end) = 2; + + % Step 7: Set E2BE and BE2E + % --------------------------- + indE = find(meshData.E2BE>0); + meshData.E2BE((ne+1):(ne2+nt3)) = 0; + meshData.E2BE(ne+indE) = nbe + meshData.E2BE(indE); + meshData.BE2E((nbe+1):(2*nbe)) = ne + meshData.BE2E(1:nbe); + + % Step 8: Set numbers + % --------------------------- + meshData.nP = meshData.nP+meshData.nE; + meshData.nE = 2*meshData.nE+3*meshData.nT; + meshData.nT = 4*meshData.nT; + meshData.nBE = 2*meshData.nBE; + + + \ No newline at end of file diff --git a/meshUniformRefineTriangular.m b/meshUniformRefineTriangular.m new file mode 100644 index 0000000..071bb12 --- /dev/null +++ b/meshUniformRefineTriangular.m @@ -0,0 +1,134 @@ +function [meshData] = meshUniformRefineTriangular(meshData) +% Refine a triangular mesh uniformly. +% +% Remark: After unifirm refine, edges may not start from points with a +% lower index. However, this program guarantees that the edges and boundary +% edges have the same direction. The reason that we do not want to make +% all edge direction from smaller point indices to larger is that, this +% breaks the coarse-fine mesh relationship which is important in multigrid +% methods. + + if ~strcmp(meshData.elementType,'triangular') + error('meshUniformRefineTriangular only works for triangular meshes!'); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Refine + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Step 0: Set some quantities + % --------------------------- + np = meshData.nP; + ne = meshData.nE; + nt = meshData.nT; + nbe = meshData.nBE; + ne2 = 2*ne; + nt3 = nt*3; + e1c = np+abs(meshData.T2E(1,:)); + e2c = np+abs(meshData.T2E(2,:)); + e3c = np+abs(meshData.T2E(3,:)); + + % Step 1: Add new vertices + % --------------------------- + meshData.P(:, (np+1):(np+ne)) = ... + ( meshData.P(:,meshData.E(1,:)) + meshData.P(:,meshData.E(2,:)) ) *0.5; + + % Step 2: Add new edges + % --------------------------- + meshData.E(:, (ne+1):(ne2+nt3)) = 0; + % set two sub-edges of all original edges. + % The edge order is: + % first, ne edges with vertices [startP, centerP] + % second, ne edges with vertices [endP, centerP] + meshData.E(:, (ne+1):(ne2)) = [meshData.E(2,1:ne); meshData.nP+(1:ne)]; + meshData.E(2, 1:ne) = np+(1:ne); + % Set three new edges inside each original triangle. + % Pay attention to the order and orientation. + meshData.E(:, (ne2+1):3:end) = [e1c; e3c]; + meshData.E(:, (ne2+2):3:end) = [e2c; e1c]; + meshData.E(:, (ne2+3):3:end) = [e3c; e2c]; + + % Step 3: Add new triangles + % --------------------------- + meshData.T(:, (nt+1):(4*nt)) = 0; + % Add three sub-triangles who have one original vertex. + % Pay attention to the orientation of these triangles. + meshData.T(:, (nt+1):3:end) = ... + [meshData.T(1,1:nt); e1c; e3c]; + meshData.T(:, (nt+2):3:end) = ... + [meshData.T(2,1:nt); e2c; e1c]; + meshData.T(:, (nt+3):3:end) = ... + [meshData.T(3,1:nt); e3c; e2c]; + % The new sub-triangle at the center inherits + % the original triangle's index. + meshData.T(:, 1:nt) = [e1c; e2c; e3c]; %np+abs(meshData.T2E); + % Set subdomains + meshData.TSubdomN(1,(nt+1):(4*nt)) = 0; + meshData.TSubdomN((nt+1):3:end) = meshData.TSubdomN(1:nt); + meshData.TSubdomN((nt+2):3:end) = meshData.TSubdomN(1:nt); + meshData.TSubdomN((nt+3):3:end) = meshData.TSubdomN(1:nt); + + % Step 4: Add new boundary edges + % --------------------------- + meshData.BE(:, (nbe+1):(2*nbe)) = ... + [meshData.BE(2,1:nbe); np+meshData.BE2E]; + meshData.BE(2, 1:nbe) = np+meshData.BE2E(:); + meshData.BESegN((nbe+1):(2*nbe)) = meshData.BESegN(1:nbe); + meshData.BEOrient((nbe+1):(2*nbe)) = -meshData.BEOrient(1:nbe); + + % Step 5: Set T2E + % --------------------------- + % Each column of temp will store all six sub-edges + % on the boundary of a triangle, in counterclockwise direction, + % starting from the one [vertex1, centerOfOriginalEdge1]. + % Each sub-edge has the orientation that points to the center + % of the original edges. + temp = zeros(6, nt); + temp([1,3,5],:) = abs(meshData.T2E); + temp([2,4,6],:) = meshData.nE+abs(meshData.T2E); + ind = ( meshData.T2E(1,:)<0 ); + temp([1,2], ind) = temp([2,1], ind); + ind = ( meshData.T2E(2,:)<0 ); + temp([3,4], ind) = temp([4,3], ind); + ind = ( meshData.T2E(3,:)<0 ); + temp([5,6], ind) = temp([6,5], ind); + meshData.T2E(:, (nt+1):(4*nt)) = 0; + meshData.T2E(:, (nt+1):3:end) = [temp(1,:); ne2+(1:3:nt3); -temp(6,:)]; + meshData.T2E(:, (nt+2):3:end) = [temp(3,:); ne2+(2:3:nt3); -temp(2,:)]; + meshData.T2E(:, (nt+3):3:end) = [temp(5,:); ne2+(3:3:nt3); -temp(4,:)]; + meshData.T2E(:, 1:nt) = -(ne2 + [2:3:nt3; 3:3:nt3; 1:3:nt3]); + + % Step 6: Set E2T and ELInd + % --------------------------- + meshData.E2T(:, 1:(ne2+nt3)) = 0; + meshData.ELInd(:, 1:(ne2+nt3)) = 0; + % For sub-edges of original edges. + % We will use the fact that all subedges are pointed in to the center + % of the original edge. + meshData.E2T(1,meshData.T2E(1,(nt+1):end)) = (nt+1):(4*nt); + meshData.E2T(2,-meshData.T2E(3,(nt+1):end)) = (nt+1):(4*nt); + meshData.ELInd(1,meshData.T2E(1,(nt+1):end)) = 1; + meshData.ELInd(2,-meshData.T2E(3,(nt+1):end)) = 3; + % For three new internal edges. + meshData.E2T(:, (ne2+1):end) = [(nt+1):(4*nt); reshape([1:nt;1:nt;1:nt],1,nt3)]; + meshData.ELInd(1,(ne2+1):end) = 2; + meshData.ELInd(2,(ne2+1):3:end) = 3; + meshData.ELInd(2,(ne2+2):3:end) = 1; + meshData.ELInd(2,(ne2+3):3:end) = 2; + + % Step 7: Set E2BE and BE2E + % --------------------------- + indE = find(meshData.E2BE>0); + meshData.E2BE((ne+1):(ne2+nt3)) = 0; + meshData.E2BE(ne+indE) = nbe + meshData.E2BE(indE); + meshData.BE2E((nbe+1):(2*nbe)) = ne + meshData.BE2E(1:nbe); + + % Step 8: Set numbers + % --------------------------- + meshData.nP = meshData.nP+meshData.nE; + meshData.nE = 2*meshData.nE+3*meshData.nT; + meshData.nT = 4*meshData.nT; + meshData.nBE = 2*meshData.nBE; + + + \ No newline at end of file diff --git a/rstoab.m b/rstoab.m new file mode 100644 index 0000000..0961cc6 --- /dev/null +++ b/rstoab.m @@ -0,0 +1,13 @@ +function [a,b] = rstoab(r,s) + +% function [a,b] = rstoab(r,s) +% Purpose : Transfer from (r,s) -> (a,b) coordinates in triangle + +Np = length(r); a = zeros(Np,1); +for n=1:Np + if(s(n) ~= 1) + a(n) = 2*(1+r(n))/(1-s(n))-1; + else a(n) = -1; end +end +b = s; +return; diff --git a/setRectDomBE.m b/setRectDomBE.m new file mode 100644 index 0000000..8f93afc --- /dev/null +++ b/setRectDomBE.m @@ -0,0 +1,28 @@ +function [be, beSegN, beOrient] = setRectDomBE(m, n) +% Set Boundary edge for rectangular domains divided into m*n. +% Not the boundary edge is the same for qudrilateral and triangular meshes. +% The output can be used directly as meshData.BE, meshData.BESegN, +% and meshData.BEOrient. + + be = zeros(2, 2*(m+n)); + beSegN = zeros(1, 2*(m+n)); + beOrient = zeros(1, 2*(m+n)); + + % bottom edge + be(:, 1:m) = [1:m; 2:m+1]; + beSegN(:, 1:m) = ones(1,m); + beOrient(:, 1:m) = ones(1,m); + % right edge + be(:, m+1:m+n) = [m+1:m+1:n*(m+1); 2*(m+1):m+1:(n+1)*(m+1)]; + beSegN(:, m+1:m+n) = 2*ones(1,n); + beOrient(:, m+1:m+n) = ones(1,n); + % top edge + be(:, m+n+1:m+n+m) = [(n+1)*(m+1):-1:n*(m+1)+2; ... + (n+1)*(m+1)-1:-1:n*(m+1)+1]; + beSegN(:, m+n+1:m+n+m) = 3*ones(1,m); + beOrient(:, m+n+1:m+n+m) = ones(1,m); + % left edge + be(:, m+n+m+1:m+n+m+n) = [n*(m+1)+1:-m-1:m+2; ... + (n-1)*(m+1)+1:-m-1:1]; + beSegN(:, m+n+m+1:m+n+m+n) = 4*ones(1,n); + beOrient(:, m+n+m+1:m+n+m+n) = ones(1,n); \ No newline at end of file diff --git a/setRectDomP.m b/setRectDomP.m new file mode 100644 index 0000000..bcc2db9 --- /dev/null +++ b/setRectDomP.m @@ -0,0 +1,13 @@ +function [p] = setRectDomP(a, b, c, d, m, n) +% Set points for rectangular domain (a,b)*(c, d) partitioned into +% m*n subdivisions. +% The output p can be used as meshData.P directly +% for rectangular meshes or triangular meshes (type '\', '/'). +% For triangular meshes of type 'x', an extra center point need to be +% added after calling setRectDomP. + + hx = (b-a)/m; + hy = (d-c)/n; + p = zeros(2, (m+1)*(n+1)); + p(1,:) = repmat(a:hx:b, 1, n+1); + p(2,:) = reshape(repmat(c:hy:d,m+1,1),1,(m+1)*(n+1)); \ No newline at end of file diff --git a/setRectDomPJiggle.m b/setRectDomPJiggle.m new file mode 100644 index 0000000..6c179cc --- /dev/null +++ b/setRectDomPJiggle.m @@ -0,0 +1,22 @@ +function [p] = setRectDomPJiggle(a, b, c, d, m, n, opt) +% Set points for rectangular domain (a,b)*(c, d) partitioned into +% m*n subdivisions, with jiggle points. +% 0<=opt<=1 is the jiggle size. +% The output p can be used as meshData.P directly +% for rectangular meshes or triangular meshes (type '\', '/'). +% For triangular meshes of type 'x', an extra center point need to be +% added after calling setRectDomP. + + hx = (b-a)/m; + hy = (d-c)/n; + p = zeros(2, (m+1)*(n+1)); + p(1,:) = repmat(a:hx:b, 1, n+1); + p(2,:) = reshape(repmat(c:hy:d,m+1,1),1,(m+1)*(n+1)); + % jiggle + opt = max(min(opt,1),0); + twistx = rand(n+1,m+1)*0.4*hx*opt - 0.2*hx*opt; + twisty = rand(n+1,m+1)*0.4*hy*opt - 0.2*hy*opt; + twistx(:, [1, end]) = 0; + twisty([1, end], :) = 0; + p(1,:) = p(1,:) + reshape(twistx', 1, (m+1)*(n+1)); + p(2,:) = p(2,:) + reshape(twisty', 1, (m+1)*(n+1)); \ No newline at end of file diff --git a/tiConnect2D.m b/tiConnect2D.m new file mode 100644 index 0000000..6b7864f --- /dev/null +++ b/tiConnect2D.m @@ -0,0 +1,33 @@ +function [EToE,EToF]= tiConnect2D(EToV) + +% function [EToE,EToF]= tiConnect2D(EToV) +% Purpose: triangle face connect algorithm due to Toby Isaac + +Nfaces=3; +K = size(EToV,1); +Nnodes = max(max(EToV)); + +% create list of all faces 1, then 2, & 3 +fnodes = [EToV(:,[1,2]);EToV(:,[2,3]);EToV(:,[3,1])]; +fnodes = sort(fnodes,2)-1; + +% set up default element to element and Element to faces connectivity +EToE= (1:K)'*ones(1,Nfaces); EToF= ones(K,1)*(1:Nfaces); + +% uniquely number each set of three faces by their node numbers +id = fnodes(:,1)*Nnodes + fnodes(:,2)+1; +spNodeToNode=[id, (1:Nfaces*K)', EToE(:), EToF(:)]; + +% Now we sort by global face number. +sorted=sortrows(spNodeToNode,1); + +% find matches in the sorted face list +[indices,dummy]=find( sorted(1:(end-1),1)==sorted(2:end,1) ); + +% make links reflexive +matchL = [sorted(indices,:) ;sorted(indices+1,:)]; +matchR = [sorted(indices+1,:) ;sorted(indices,:)]; + +% insert matches +EToE(matchL(:,2)) = matchR(:,3); EToF(matchL(:,2)) = matchR(:,4); +return; diff --git a/trgArea.m b/trgArea.m new file mode 100644 index 0000000..31a5692 --- /dev/null +++ b/trgArea.m @@ -0,0 +1,24 @@ +function [a] = trgArea(p, t) +% Computes the area of all triangles in a triangular mesh. +% When ( meshData.elementType == 'triangular' ) +% p, t should be meshData.P, meshData.T (see meshInfo.m for details). +% +% It returns a row vector A of dimension = meshData.nT, +% which contains the areas of each triangle. + + % indices of points + p1Ind = t(1,:); + p2Ind = t(2,:); + p3Ind = t(3,:); + + % x and y components of edge12 and edge13 + % Example of edge naming convention: + % edge23x means x component of edge from p2 to p3 + % edge32y means y component of edge from p3 to p2 + edge12x = p(1,p2Ind) - p(1,p1Ind); + edge12y = p(2,p2Ind) - p(2,p1Ind); + edge13x = p(1,p3Ind) - p(1,p1Ind); + edge13y = p(2,p3Ind) - p(2,p1Ind); + + % area + a = (1/2)*(edge12x.*edge13y - edge12y.*edge13x); \ No newline at end of file diff --git a/trgAreaGradLambda.m b/trgAreaGradLambda.m new file mode 100644 index 0000000..022caf0 --- /dev/null +++ b/trgAreaGradLambda.m @@ -0,0 +1,35 @@ +function [a, g1x, g1y, g2x, g2y, g3x, g3y] = trgAreaGradLambda(p,t) +% Computes the area of triangles (see trgArea.m for information on a) +% and \grad g(i), where g1, g2, g3 are the nodal basis functions of +% P1 (in other words, the three barycentric coordinates.) +% Each output variable is a row vector of dimension = meshData.nT + + % indices of points + p1Ind = t(1,:); + p2Ind = t(2,:); + p3Ind = t(3,:); + + % x and y components of edges. + % Example of edge naming convention: + % edge23x means x component of edge from p2 to p3 + % edge32y means y component of edge from p3 to p2 + edge12x = p(1,p2Ind) - p(1,p1Ind); + edge21y = p(2,p1Ind) - p(2,p2Ind); + edge31x = p(1,p1Ind) - p(1,p3Ind); + edge13y = p(2,p3Ind) - p(2,p1Ind); + edge23x = p(1,p3Ind) - p(1,p2Ind); + edge32y = p(2,p2Ind) - p(2,p3Ind); + + % 2|T| + a = edge12x.*edge13y - edge21y.*edge31x; + + % gradient terms + g1x = edge32y./a; + g1y = edge23x./a; + g2x = edge13y./a; + g2y = edge31x./a; + g3x = edge21y./a; + g3y = edge12x./a; + + % Compute |T| + a = (1/2)*a; \ No newline at end of file diff --git a/trgCscTheta.m b/trgCscTheta.m new file mode 100644 index 0000000..7e8f2f2 --- /dev/null +++ b/trgCscTheta.m @@ -0,0 +1,18 @@ +function [csc1, csc2, csc3] = trgCscTheta(meshData) + % Only works when ( meshData.elementType == 'triangular' ) + % Compute csc of internal angles \theta_i for each triangle in the mesh. + % Each \theta_i, i=1,2,3, is the internal angle at vertex x_i. + % csc1, csc2, csc3 are row vectors of dimension meshData.nT + + if ~strcmp(meshData.elementType,'triangular') + error('trgCscTheta only works when ( meshData.elementType == "triangular" )!'); + end + + area = trgArea(meshData.P, meshData.T); + edgeL = edgeLength(meshData.P, meshData.E); + t2e = abs(meshData.T2E); + + csc1 = 0.5*edgeL(t2e(1,:)).*edgeL(t2e(3,:))./area; + csc2 = 0.5*edgeL(t2e(1,:)).*edgeL(t2e(2,:))./area; + csc3 = 0.5*edgeL(t2e(2,:)).*edgeL(t2e(3,:))./area; + \ No newline at end of file diff --git a/trgPointCoord.m b/trgPointCoord.m new file mode 100644 index 0000000..2c5018d --- /dev/null +++ b/trgPointCoord.m @@ -0,0 +1,21 @@ +function [px, py] = trgPointCoord(p, t, refcoord) + % Given a 2-dim vector refcoord for the reference coordinate, + % compute the actual coordinate of points in alltriangle correspond to + % this reference coordinate. Here refcoord contains + % (x, y) + % On the reference triangle, (x, y) are + % identical to (\lambda_2, \lambda_3) in the + % barycentric coordinate, and \lambda_1 = 1-x-y + % + % The output is stored in two + % row vectors, px for x-coordinate and py for y-coordinate. + % Both are ordered according to the triangle defined in t. + % + % Example: + % [px, py] = trgPointCoord(p, t, [1/3, 1/3]); + % returns the center of triangles + + px = (1-refcoord(1)-refcoord(2)) * p(1, t(1,:)) + ... + refcoord(1) * p(1, t(2,:)) + refcoord(2) * p(1, t(3,:)); + py = (1-refcoord(1)-refcoord(2)) * p(2, t(1,:)) + ... + refcoord(1) * p(2, t(2,:)) + refcoord(2) * p(2, t(3,:)); \ No newline at end of file diff --git a/trgVecNormal.m b/trgVecNormal.m new file mode 100644 index 0000000..d348980 --- /dev/null +++ b/trgVecNormal.m @@ -0,0 +1,29 @@ +function [n1, n2, n3] = trgVecNormal(meshData) +% Only works when ( meshData.elementType == 'triangular' ) +% Compute the unit outward normal vector of each triangle in the mesh. +% n1, n2, n3 are 2-by-meshData.nT matrices. + + if ~strcmp(meshData.elementType,'triangular') + error('trgVecNormal only works when ( meshData.elementType == "triangular" )!'); + end + + [~,n] = edgeDirection(meshData.P, meshData.E); + t2e = abs(meshData.T2E); + n1 = zeros(2,meshData.nT); + n2 = zeros(2,meshData.nT); + n3 = zeros(2,meshData.nT); + + posind = ( meshData.T2E(1,:)>0 ); + negind = ( meshData.T2E(1,:)<0 ); + n1(:, posind) = n(:, t2e(1,posind)); + n1(:, negind) = -n(:, t2e(1,negind)); + + posind = ( meshData.T2E(2,:)>0 ); + negind = ( meshData.T2E(2,:)<0 ); + n2(:, posind) = n(:, t2e(2,posind)); + n2(:, negind) = -n(:, t2e(2,negind)); + + posind = ( meshData.T2E(3,:)>0 ); + negind = ( meshData.T2E(3,:)<0 ); + n3(:, posind) = n(:, t2e(3,posind)); + n3(:, negind) = -n(:, t2e(3,negind)); \ No newline at end of file diff --git a/trgVecTangent.m b/trgVecTangent.m new file mode 100644 index 0000000..a7084fb --- /dev/null +++ b/trgVecTangent.m @@ -0,0 +1,30 @@ +function [t1, t2, t3] = trgVecTangent(meshData) +% Only works when ( meshData.elementType == 'triangular' ) +% Compute the unit tangent vector of each triangle in the mesh, +% in the counter-clockwise direction (positive orientation). +% t1, t2, t3 are 2-by-meshData.nT matrices. + + if ~strcmp(meshData.elementType,'triangular') + error('trgVecNormal only works when ( meshData.elementType == "triangular" )!'); + end + + [t,~] = edgeDirection(meshData.P, meshData.E); + t2e = abs(meshData.T2E); + t1 = zeros(2,meshData.nT); + t2 = zeros(2,meshData.nT); + t3 = zeros(2,meshData.nT); + + posind = ( meshData.T2E(1,:)>0 ); + negind = ( meshData.T2E(1,:)<0 ); + t1(:, posind) = t(:, t2e(1,posind)); + t1(:, negind) = -t(:, t2e(1,negind)); + + posind = ( meshData.T2E(2,:)>0 ); + negind = ( meshData.T2E(2,:)<0 ); + t2(:, posind) = t(:, t2e(2,posind)); + t2(:, negind) = -t(:, t2e(2,negind)); + + posind = ( meshData.T2E(3,:)>0 ); + negind = ( meshData.T2E(3,:)<0 ); + t3(:, posind) = t(:, t2e(3,posind)); + t3(:, negind) = -t(:, t2e(3,negind)); \ No newline at end of file diff --git a/xytors.m b/xytors.m new file mode 100644 index 0000000..f950e0c --- /dev/null +++ b/xytors.m @@ -0,0 +1,11 @@ +function [r,s] = xytors(x,y) + +% function [r,s] = xytors(x, y) +% Purpose : From (x,y) in equilateral triangle to (r,s) coordinates in standard triangle + +L1 = (sqrt(3.0)*y+1.0)/3.0; +L2 = (-3.0*x - sqrt(3.0)*y + 2.0)/6.0; +L3 = ( 3.0*x - sqrt(3.0)*y + 2.0)/6.0; + +r = -L2 + L3 - L1; s = -L2 - L3 + L1; +return;