public static Evector SurfaceNormal(Evector p1, Evector p2) { Evector dif = p2 - p1; Evector n = new Evector(dif.y, -dif.x); return(n); }
public static double TriangleArea(Evector v1, Evector v2, Evector v3) { // double triarea = Math.Abs(((v1 - v3) % (v2 - v3)).Length()) / 2; double triarea = Math.Abs(v1.x * (v2.y - v3.y) + v2.x * (v3.y - v1.y) + v3.x * (v1.y - v2.y)) / 2.0; return(triarea); }
public static double PolygonArea(Evector[] vertex) { Evector PolyGeomCentr = new Evector(); foreach (Evector v in vertex) { PolyGeomCentr += v; } PolyGeomCentr /= vertex.Length; double polygonarea = 0; for (int n = 0; n < vertex.Length; n++) { Evector v1 = vertex[n]; Evector v2; if (n == vertex.Length - 1) { v2 = vertex[0]; } else { v2 = vertex[n + 1]; } double triarea = TriangleArea(v1, v2, PolyGeomCentr); polygonarea += triarea; } return(polygonarea); }
public static Evector PolygonCentroid(Evector[] vertex) { Evector PolyGeomCentr = new Evector(); foreach (Evector v in vertex) { PolyGeomCentr += v; } PolyGeomCentr /= vertex.Length; Evector PolygonCentr = new Evector(); double polygonarea = 0; for (int n = 0; n < vertex.Length; n++) { Evector v1 = vertex[n]; Evector v2; if (n == vertex.Length - 1) { v2 = vertex[0]; } else { v2 = vertex[n + 1]; } Evector TriangleGeomCentr = TriangleCenter(v1, v2, PolyGeomCentr); double triarea = TriangleArea(v1, v2, PolyGeomCentr); polygonarea += triarea; PolygonCentr += triarea * TriangleGeomCentr; } PolygonCentr /= polygonarea; return(PolygonCentr); }
public static Evector LineNormal(Evector p1, Evector p2) { Evector dif = p2 - p1; Evector n = new Evector(dif.y, -dif.x); n.Normalize(); return(n); }
public static double FaceWeightFactor(Element main, Element e, Face face) { double wf = 0; Vector2 dcf = face.centroid - main.centroid; Vector2 dff = e.centroid - face.centroid; wf = (dcf * face.normal) / ((dcf + dff) * face.normal); return(wf); }
public static Evector TriangleCenter(Evector v1, Evector v2, Evector v3) { return((v1 + v2 + v3) / 3); }
public static Evector PolygonCentroid(Evector[] vertex) { Evector PolyGeomCentr = new Evector(); foreach (Evector v in vertex) { PolyGeomCentr += v; } PolyGeomCentr /= vertex.Length; Evector PolygonCentr = new Evector(); double polygonarea = 0; for (int n = 0; n < vertex.Length; n++) { Evector v1 = vertex[n]; Evector v2 ; if(n==vertex.Length-1) v2=vertex[0]; else v2 = vertex[n + 1]; Evector TriangleGeomCentr = TriangleCenter(v1, v2, PolyGeomCentr); double triarea = TriangleArea(v1, v2, PolyGeomCentr); polygonarea += triarea; PolygonCentr += triarea * TriangleGeomCentr; } PolygonCentr /= polygonarea; return PolygonCentr; }
public static Evector LineNormal(Evector p1, Evector p2) { Evector dif=p2-p1; Evector n = new Evector(dif.y, -dif.x); n.Normalize(); return n; }
public static Evector SurfaceNormal(Evector p1, Evector p2) { Evector dif = p2 - p1; Evector n = new Evector(dif.y, -dif.x); return n; }
public bool Create(string filename_) { double[,] points=null ; double[,] polys = null; double[,] bound = null; Dictionary<string, Face> facedic = new Dictionary<string, Face>(); if (!LoadFromFile(filename_, ref points, ref polys, ref bound)) return false; count = 0; SetParameters(); elementcount = polys.GetLength(1); int vertexcount = polys.GetLength(0)-1; elements = new Element[elementcount]; int faceid = 0; int e = 0; for (e = 0; e < elementcount; e++) { Element elem; elements[e] = new Element(vertexcount); elem = elements[e]; elem.id = e; elem.k = 1; Vector2[] vertex = new Vector2[vertexcount]; for (int v = 0; v < vertexcount; v++) { int pointindex = (int)polys[v, e]; vertex[v] = new Vector2(points[0, pointindex], points[1, pointindex]); int p1index = pointindex; int p2index = 0; if (v < vertexcount - 1) p2index = (int)polys[v + 1, e]; else p2index = (int)polys[0, e]; int p1 = p1index; int p2 = p2index; string facestr =Face.GetFaceStrId(p1index,p2index); if (!facedic.ContainsKey(facestr)) { Face face = new Face(new Vector2(points[0, p1], points[1, p1]), new Vector2(points[0, p2], points[1, p2])); face.id = faceid; face.pointid1=p1; face.pointid2=p2; face.owner = elem; faceid++; facedic.Add(facestr, face); elem.faces[v] = face; } else { Face face = facedic[facestr]; face.nbelem = elem; elem.faces[v] = face; Element owner = face.owner; elem.nbs[v] = owner; owner.nbs[owner.FaceLocalId(face)] = elem; } } elem.SetPolygon(vertex); elem.PreCalc(); } faces = new Face[facedic.Count]; bndfaces = new Face[bound.GetLength(1)]; foreach (var pair in facedic) { Face face = pair.Value; faces[face.id] = face; } for (e = 0; e < elementcount; e++) elements[e].Calc(); int f; for (f = 0; f < bound.GetLength(1); f++) { string facestr = Face.GetFaceStrId((int)bound[0, f], (int)bound[1, f]); Face face = facedic[facestr]; face.bnddomain = (int)bound[5, f]; face.bndgroup = (int)bound[4, f]; face.isboundary = true; bndfaces[f]=face; } SetInitialBoundary(); // for (e = 0; e < elementcount; e++) // elements[e].CalcFluxes(); return true; }
// -------------------- COMPUTE --------------------------------- // -------------------- COMPUTE --------------------------------- public void Calc() { double bc, ac; double sumflux; double[] aa = new double[6]; double[] bb = new double[6]; int e; for (e = 0; e < elementcount; e++) { Element elem = elements[e]; int nf; bc = 0; ac = 0; sumflux = 0; for (int nn = 0; nn < 6; nn++) { aa[nn] = 0; bb[nn] = 0; } for (nf = 0; nf < elem.vertex.Length; nf++) { Face face = elem.faces[nf]; Element nb = elem.nbs[nf]; if (face.isboundary) { if (face.boundaryType == BoundaryType.BND_CONST) { double flux1; double flux; flux1 = elem.k * (face.area / elem.nodedistances[nf]); Vector2 Sf = face.sf.Clone(); Vector2 dCf = elem.cfdistance[nf].Clone(); if (Sf * dCf < 0) { Sf = -Sf; } //1) minimum correction //Vector2 DCF = elem.cndistance[nf].Clone(); Vector2 e1 = dCf.GetNormalize(); Vector2 EF = (e1 * Sf) * e1; flux = elem.k * (EF.Length() / dCf.Length()); ac += flux; bc += flux * face.bndu; bb[nf] = flux; } else if (face.boundaryType == BoundaryType.BND_INSULATED) { double flux; flux = 0; ac += flux; bc += flux * face.bndu; bb[nf] = flux; } } else { double flux1; double flux; flux1 = -elem.k * (face.area / elem.nodedistances[nf]); Vector2 Sf = face.sf.Clone(); Vector2 dCf = elem.cfdistance[nf].Clone(); if (Sf * dCf < 0) { Sf = -Sf; } Vector2 DCF = elem.cndistance[nf].Clone(); Vector2 e1 = DCF.GetNormalize(); //corrected flux //1) minimum correction Vector2 EF = (e1 * Sf) * e1; flux = -elem.k * (EF.Length() / DCF.Length()); sumflux += flux * nb.u; ac += -flux; aa[nf] = -flux; } } elem.u = elem.u + delt * (bc - sumflux - ac * elem.u); } }
public bool Create(string filename_) { double[,] points = null; double[,] polys = null; double[,] bound = null; Dictionary <string, Face> facedic = new Dictionary <string, Face>(); if (!LoadFromFile(filename_, ref points, ref polys, ref bound)) { return(false); } count = 0; SetParameters(); elementcount = polys.GetLength(1); int vertexcount = polys.GetLength(0) - 1; elements = new Element[elementcount]; int faceid = 0; int e = 0; for (e = 0; e < elementcount; e++) { Element elem; elements[e] = new Element(vertexcount); elem = elements[e]; elem.id = e; elem.k = 1; Vector2[] vertex = new Vector2[vertexcount]; for (int v = 0; v < vertexcount; v++) { int pointindex = (int)polys[v, e]; vertex[v] = new Vector2(points[0, pointindex], points[1, pointindex]); int p1index = pointindex; int p2index = 0; if (v < vertexcount - 1) { p2index = (int)polys[v + 1, e]; } else { p2index = (int)polys[0, e]; } int p1 = p1index; int p2 = p2index; string facestr = Face.GetFaceStrId(p1index, p2index); if (!facedic.ContainsKey(facestr)) { Face face = new Face(new Vector2(points[0, p1], points[1, p1]), new Vector2(points[0, p2], points[1, p2])); face.id = faceid; face.pointid1 = p1; face.pointid2 = p2; face.owner = elem; faceid++; facedic.Add(facestr, face); elem.faces[v] = face; } else { Face face = facedic[facestr]; face.nbelem = elem; elem.faces[v] = face; Element owner = face.owner; elem.nbs[v] = owner; owner.nbs[owner.FaceLocalId(face)] = elem; } } elem.SetPolygon(vertex); elem.PreCalc(); } faces = new Face[facedic.Count]; bndfaces = new Face[bound.GetLength(1)]; foreach (var pair in facedic) { Face face = pair.Value; faces[face.id] = face; } for (e = 0; e < elementcount; e++) { elements[e].Calc(); } int f; for (f = 0; f < bound.GetLength(1); f++) { string facestr = Face.GetFaceStrId((int)bound[0, f], (int)bound[1, f]); Face face = facedic[facestr]; face.bnddomain = (int)bound[5, f]; face.bndgroup = (int)bound[4, f]; face.isboundary = true; bndfaces[f] = face; } SetInitialBoundary(); //for (e = 0; e < elementcount; e++) // elements[e].CalcFluxes(); return(true); }
public bool Create(string filename_) { // Inputfile = filename_; // if (LoadFromFile() != 0) // return false; // TestCalcUnstructuredFlux(); // TestCalcUnstructuredFace(); count = 0; SetParameters(); int rowcount=12; elementcount = rowcount * 12; double h = 4; elements = new Element[elementcount]; int e = 0; for (e = 0; e < elementcount ; e++) { elements[e]=new Element(); } Element elem; e = 0; int n = 0; int row = 0; int total = elementcount / rowcount; for (e = row * total; e < (row+1) * total; e++) { elem = elements[e]; elem.id = e + 1; elem.k = 1; Vector2[] vertex = new Vector2[4]; vertex[0] = new Vector2(h * n, h * row); vertex[1] = new Vector2(h * (n + 1), h * row); vertex[2] = new Vector2(h * (n + 1), h * (row + 1)); vertex[3] = new Vector2(h * n, h * (row + 1)); elem.SetPolygon(vertex); elem.nbs[0] = null; elem.nbs[2] = elements[e+total]; if (n == 0) elem.nbs[3] = null; else elem.nbs[3] = elements[e-1]; if (n == total-1) elem.nbs[1] = null; else elem.nbs[1] = elements[e + 1]; elem.PreCalc(); n++; } for (int r = 0; r < rowcount-2; r++) { n = 0; row++; for (e = row * total; e < (row + 1) * total; e++) { elem = elements[e]; elem.id = e + 1; elem.k = 1; elem.SetPolygon4(h * n, h * row, h * (n + 1), h * row, h * (n + 1), h * (row + 1), h * n, h * (row + 1)); elem.nbs[0] = elements[e - total]; elem.nbs[2] = elements[e + total]; if (e == row * total) elem.nbs[3] = null; else elem.nbs[3] = elements[e - 1]; if (e == (row + 1) * total - 1) elem.nbs[1] = null; else elem.nbs[1] = elements[e + 1]; elem.PreCalc(); n++; } } n = 0; row++; for (e = row * total; e < (row + 1) * total; e++) { elem = elements[e]; elem.id = e + 1; elem.k = 1; elem.SetPolygon4(h * n, h * row, h * (n + 1), h * row, h * (n + 1), h * (row + 1), h * n, h * (row + 1)); elem.nbs[0] = elements[e - total]; elem.nbs[2] = null; if (e == row * total) elem.nbs[3] = null; else elem.nbs[3] = elements[e - 1]; if (e == (row + 1) * total - 1) elem.nbs[1] = null; else elem.nbs[1] = elements[e + 1]; elem.PreCalc(); n++; } for (e = 0; e < elementcount; e++) elements[e].Calc(); for (e = 0; e < elementcount; e++) elements[e].CalcFaces(); double bndw = 240; //down e = 0; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, 0); elem.SetBoundary(3, BoundaryType.BND_CONST, bndw); for (int el = 0; el < total - 2; el++) { e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, 0); } e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, 0); elem.SetBoundary(1, BoundaryType.BND_CONST, 0); //-- //middle for (int r = 0; r < rowcount - 2; r++) { e++; elem = elements[e]; elem.SetBoundary(3, BoundaryType.BND_CONST, bndw); for (int el = 0; el < total - 2; el++) e++; e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, 0); } //-- //up e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, 0); elem.SetBoundary(3, BoundaryType.BND_CONST, bndw); for (int el = 0; el < total - 2; el++) { e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, 0); } e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, 0); elem.SetBoundary(1, BoundaryType.BND_CONST, 0); SetInitialBoundary(); for (e = 0; e < elementcount; e++) elements[e].CalcFluxes(); return true; }
public static double PolygonArea(Evector[] vertex) { Evector PolyGeomCentr = new Evector(); foreach (Evector v in vertex) { PolyGeomCentr += v; } PolyGeomCentr /= vertex.Length; double polygonarea = 0; for (int n = 0; n < vertex.Length; n++) { Evector v1 = vertex[n]; Evector v2; if (n == vertex.Length - 1) v2 = vertex[0]; else v2 = vertex[n + 1]; double triarea = TriangleArea(v1, v2, PolyGeomCentr); polygonarea += triarea; } return polygonarea; }
public static double TriangleArea(Evector v1, Evector v2, Evector v3) { // double triarea = Math.Abs(((v1 - v3) % (v2 - v3)).Length()) / 2; double triarea = Math.Abs(v1.x * (v2.y - v3.y) + v2.x * (v3.y - v1.y) + v3.x * (v1.y - v2.y)) / 2.0; return triarea; }
public static Evector TriangleCenter(Evector v1, Evector v2, Evector v3) { return (v1 + v2 + v3) / 3; }
public bool Create(string filename_) { // Inputfile = filename_; // if (LoadFromFile() != 0) // return false; // TestCalcUnstructuredFlux(); // TestCalcUnstructuredFace(); count = 0; SetParameters(); int rowcount = 12; elementcount = rowcount * 12; double h = 4; elements = new Element[elementcount]; int e = 0; for (e = 0; e < elementcount; e++) { elements[e] = new Element(); } Element elem; e = 0; int n = 0; int row = 0; int total = elementcount / rowcount; for (e = row * total; e < (row + 1) * total; e++) { elem = elements[e]; elem.id = e + 1; elem.k = 1; Vector2[] vertex = new Vector2[4]; vertex[0] = new Vector2(h * n, h * row); vertex[1] = new Vector2(h * (n + 1), h * row); vertex[2] = new Vector2(h * (n + 1), h * (row + 1)); vertex[3] = new Vector2(h * n, h * (row + 1)); elem.SetPolygon(vertex); elem.nbs[0] = null; elem.nbs[2] = elements[e + total]; if (n == 0) { elem.nbs[3] = null; } else { elem.nbs[3] = elements[e - 1]; } if (n == total - 1) { elem.nbs[1] = null; } else { elem.nbs[1] = elements[e + 1]; } elem.PreCalc(); n++; } for (int r = 0; r < rowcount - 2; r++) { n = 0; row++; for (e = row * total; e < (row + 1) * total; e++) { elem = elements[e]; elem.id = e + 1; elem.k = 1; elem.SetPolygon4(h * n, h * row, h * (n + 1), h * row, h * (n + 1), h * (row + 1), h * n, h * (row + 1)); elem.nbs[0] = elements[e - total]; elem.nbs[2] = elements[e + total]; if (e == row * total) { elem.nbs[3] = null; } else { elem.nbs[3] = elements[e - 1]; } if (e == (row + 1) * total - 1) { elem.nbs[1] = null; } else { elem.nbs[1] = elements[e + 1]; } elem.PreCalc(); n++; } } n = 0; row++; for (e = row * total; e < (row + 1) * total; e++) { elem = elements[e]; elem.id = e + 1; elem.k = 1; elem.SetPolygon4(h * n, h * row, h * (n + 1), h * row, h * (n + 1), h * (row + 1), h * n, h * (row + 1)); elem.nbs[0] = elements[e - total]; elem.nbs[2] = null; if (e == row * total) { elem.nbs[3] = null; } else { elem.nbs[3] = elements[e - 1]; } if (e == (row + 1) * total - 1) { elem.nbs[1] = null; } else { elem.nbs[1] = elements[e + 1]; } elem.PreCalc(); n++; } for (e = 0; e < elementcount; e++) { elements[e].Calc(); } for (e = 0; e < elementcount; e++) { elements[e].CalcFaces(); } double bndw = 240; //down e = 0; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, 0); elem.SetBoundary(3, BoundaryType.BND_CONST, bndw); for (int el = 0; el < total - 2; el++) { e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, 0); } e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, 0); elem.SetBoundary(1, BoundaryType.BND_CONST, 0); //-- //middle for (int r = 0; r < rowcount - 2; r++) { e++; elem = elements[e]; elem.SetBoundary(3, BoundaryType.BND_CONST, bndw); for (int el = 0; el < total - 2; el++) { e++; } e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, 0); } //-- //up e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, 0); elem.SetBoundary(3, BoundaryType.BND_CONST, bndw); for (int el = 0; el < total - 2; el++) { e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, 0); } e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, 0); elem.SetBoundary(1, BoundaryType.BND_CONST, 0); SetInitialBoundary(); for (e = 0; e < elementcount; e++) { elements[e].CalcFluxes(); } return(true); }
// -------------------- COMPUTE --------------------------------- // -------------------- COMPUTE --------------------------------- public void Calc() { double bc, ac; double sumflux; double[] aa = new double[6]; double[] bb = new double[6]; int e; for (e = 0; e < elementcount; e++) { elements[e].CalcGradient(); } for (e = 0; e < elementcount; e++) { Element elem = elements[e]; int nf; bc = 0; ac = 0; sumflux = 0; for (int nn = 0; nn < 6; nn++) { aa[nn] = 0; bb[nn] = 0; } for (nf = 0; nf < elem.vertex.Length; nf++) { Face face = elem.faces[nf]; Element nb = elem.nbs[nf]; if (face.isboundary) { if (face.boundaryType == BoundaryType.BND_CONST) { double flux1nf; flux1nf = elem.k * (face.area / elem.nodedistances[nf]); Vector2 Sf = face.sf.Clone(); Vector2 dCf = elem.cfdistance[nf].Clone(); if (Sf * dCf < 0) { Sf = -Sf; } //1) minimum correction //Vector2 DCF = elem.cndistance[nf].Clone(); Vector2 e1 = dCf.GetNormalize(); Vector2 EF = (e1 * Sf) * e1; double flux; flux = elem.k * (EF.Length() / dCf.Length()); Vector2 gradface = elem.gradient;// elem.geomInterpolateFactor[nf] * nb.gradient + (1 - elem.geomInterpolateFactor[nf]) * elem.gradient; Vector2 TF = Sf - EF; double fluxT = -elem.k * (gradface * TF); bc -= fluxT; // Vector2 gradface = (elem.u-face.u) * (EF.Length() / dCf.Length()) * Sf.GetNormalize(); // Vector2 TF = Sf - EF; // double fluxT = -elem.k * (gradface * TF); // bc -= fluxT; ac += flux; bc += flux * face.bndu; bb[nf] = flux; } else if (face.boundaryType == BoundaryType.BND_INSULATED) { double flux = 0; ac += flux; bc += flux * face.bndu; bb[nf] = flux; } } else { double flux1nf; flux1nf = -elem.k * (face.area / elem.nodedistances[nf]); Vector2 Sf = face.sf.Clone(); Vector2 dCf = elem.cfdistance[nf].Clone(); if (Sf * dCf < 0) { Sf = -Sf; } //1) minimum correction Vector2 DCF = elem.cndistance[nf].Clone(); Vector2 e1 = DCF.GetNormalize(); Vector2 EF = (e1 * Sf) * e1; double flux; flux = -elem.k * (EF.Length() / dCf.Length()); //if (!elem.isboundary) { Vector2 gradface = elem.geomInterpolateFactor[nf] * nb.gradient + (1 - elem.geomInterpolateFactor[nf]) * elem.gradient; Vector2 TF = Sf - EF; double fluxT = -elem.k * (gradface * TF); bc -= fluxT; } sumflux += flux * nb.u; ac += -flux; aa[nf] = -flux; } } elem.u = elem.u + (delt / elem.volume) * (bc - sumflux - ac * elem.u); } }