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;