コード例 #1
0
ファイル: Math2D.cs プロジェクト: snytav/FiniteVolume
        public static Evector SurfaceNormal(Evector p1, Evector p2)
        {
            Evector dif = p2 - p1;
            Evector n   = new Evector(dif.y, -dif.x);

            return(n);
        }
コード例 #2
0
ファイル: Math2D.cs プロジェクト: snytav/FiniteVolume
        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);
        }
コード例 #3
0
ファイル: Math2D.cs プロジェクト: snytav/FiniteVolume
        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);
        }
コード例 #4
0
ファイル: Math2D.cs プロジェクト: snytav/FiniteVolume
        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);
        }
コード例 #5
0
ファイル: Math2D.cs プロジェクト: snytav/FiniteVolume
        public static Evector LineNormal(Evector p1, Evector p2)
        {
            Evector dif = p2 - p1;
            Evector n   = new Evector(dif.y, -dif.x);

            n.Normalize();
            return(n);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
ファイル: Math2D.cs プロジェクト: snytav/FiniteVolume
 public static Evector TriangleCenter(Evector v1, Evector v2, Evector v3)
 {
     return((v1 + v2 + v3) / 3);
 }
コード例 #8
0
ファイル: Math2D.cs プロジェクト: nexscifix/FiniteVolume
        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;

        }
コード例 #9
0
ファイル: Math2D.cs プロジェクト: nexscifix/FiniteVolume
 public static Evector LineNormal(Evector p1, Evector p2)
 {
     Evector dif=p2-p1;
     Evector n = new Evector(dif.y, -dif.x);
     n.Normalize();
     return n;
 }
コード例 #10
0
ファイル: Math2D.cs プロジェクト: nexscifix/FiniteVolume
 public static Evector SurfaceNormal(Evector p1, Evector p2)
 {
     Evector dif = p2 - p1;
     Evector n = new Evector(dif.y, -dif.x);
     return n;
 }
コード例 #11
0
ファイル: MainSolver.cs プロジェクト: nexscifix/FiniteVolume
        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;

        }
コード例 #12
0
ファイル: MainSolver.cs プロジェクト: snytav/FiniteVolume
        // -------------------- 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);
            }
        }
コード例 #13
0
ファイル: MainSolver.cs プロジェクト: snytav/FiniteVolume
        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);
        }
コード例 #14
0
ファイル: MainSolver.cs プロジェクト: nexscifix/FiniteVolume
        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;
        }
コード例 #15
0
ファイル: Math2D.cs プロジェクト: nexscifix/FiniteVolume
        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;

        }
コード例 #16
0
ファイル: Math2D.cs プロジェクト: nexscifix/FiniteVolume
        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;
        }
コード例 #17
0
ファイル: Math2D.cs プロジェクト: nexscifix/FiniteVolume
 public static Evector TriangleCenter(Evector v1, Evector v2, Evector v3)
 {
     return (v1 + v2 + v3) / 3;
 }
コード例 #18
0
        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);
        }
コード例 #19
0
ファイル: MainSolver.cs プロジェクト: snytav/FiniteVolume
        // -------------------- 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);
            }
        }