From eac9eda533501e559e3950c433c1bfe6cfd960e6 Mon Sep 17 00:00:00 2001 From: Derek Steinmoeller Date: Sun, 15 Apr 2018 21:49:24 -0400 Subject: [PATCH] Partial implementation of EToE/EToF calculation. --- src/Nodes1DProvisioner.cpp | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/Nodes1DProvisioner.cpp b/src/Nodes1DProvisioner.cpp index 6fb7d6ca..89d6eb6d 100644 --- a/src/Nodes1DProvisioner.cpp +++ b/src/Nodes1DProvisioner.cpp @@ -4,6 +4,7 @@ #include #include #include +#include using namespace std; using namespace blitz; @@ -69,8 +70,78 @@ void Nodes1DProvisioner::buildNodes() { buildConnectivityMatrices(); } +/** + * Build global connectivity matrices (EToE, EToF) for 1D grid + * based using EToV (Element-to-Vertex) matrix. + */ void Nodes1DProvisioner::buildConnectivityMatrices() { + firstIndex ii; + secondIndex jj; + thirdIndex kk; + + int totalFaces = NumFaces*NumElements; + int numVertices = NumElements + 1; + + int localVertNum[2]; + localVertNum[0] = 0; localVertNum[1] = 1; + + // Build global face-to-vertex array. (should be sparse matrix in 2D/3D). + Array FToV(totalFaces, numVertices); + FToV = 0*jj; + + Array & E2V = *EToV; + + cout << E2V << endl; + + int globalFaceNum = 0; + for (int k=0; k <= NumElements; k++) { + for (int f=0; f < NumFaces; f++) { + int v = localVertNum[f]; + int vGlobal = (int)E2V(k,v); + FToV(globalFaceNum, vGlobal-1) = 1; + globalFaceNum++; + } + } + + cout << FToV << endl; + + Array FToF(totalFaces, totalFaces); + Array I(totalFaces, totalFaces); + + for (int f=0; f < totalFaces; f++) + I(f,f) = 1; + + //Array FToVtrans = FToV(jj,ii); + + // Global Face-to-Face connectivity matrix. + FToF = sum(FToV(ii,kk)*FToV(jj,kk), kk) - I; + + cout << FToF << endl; + + +/* +% + +% Build global face to global face sparse array +SpFToF = SpFToV*SpFToV' - speye(TotalFaces); + +% Find complete face to face connections +[faces1, faces2] = find(SpFToF==1); + +% Convert face global number to element and face numbers +element1 = floor( (faces1-1)/Nfaces ) + 1; +face1 = mod( (faces1-1), Nfaces ) + 1; +element2 = floor( (faces2-1)/Nfaces ) + 1; +face2 = mod( (faces2-1), Nfaces ) + 1; + +% Rearrange into Nelements x Nfaces sized arrays +ind = sub2ind([K, Nfaces], element1, face1); +EToE = (1:K)'*ones(1,Nfaces); +EToF = ones(K,1)*(1:Nfaces); +EToE(ind) = element2; EToF(ind) = face2; +*/ + } void Nodes1DProvisioner::buildLift() {