Ejemplo n.º 1
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;
        }
Ejemplo n.º 2
0
        public bool Create(string filename_)
        {
            Inputfile = filename_;
            if (LoadFromFile() != 0)
                return false;

            SetParameters();
            count = 0;

            elements = new Element[imax, jmax];
            int i, j;

            for (i = 0; i < imax; i++)
                for (j = 0; j < jmax; j++)
                {
                    Element elem = new Element();
                    elem.id = i*j+j;
                    elem.u = 0;
                    elem.cfdist = dh;
                    elements[i,j] = elem;
                }

            SetBoundary();
            return true;
        }
Ejemplo n.º 3
0
        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;

        }
Ejemplo n.º 4
0
 public static double FaceWeightFactorSimple(Element main, Element e, Face face)
 {
     double wf = main.volume / (main.volume + e.volume);
     return wf;
 }
Ejemplo n.º 5
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;
        }
Ejemplo n.º 6
0
        public bool Create(string filename_)
        {
//            Inputfile = filename_;
//            if (LoadFromFile() != 0)
//                return false;

            count = 0;
            SetParameters();

            elements = new Element[elementcount];
            int e = 0;
            for (e = 0; e < elementcount ; e++)
            {
                elements[e]=new Element();
            }
            Element elem;
            e = 0;
            for (e = 0; e < elementcount; e++)
            {
                elem = elements[e]; elem.id = e + 1; elem.k = 1;
                elem.SetRectangle(0.1*e, 0, 0.1, 0.1); elem.PreCalc();
                /*
                            e++;elem = elements[e];elem.id = e+1;elem.k = 1;
                            elem.SetRectangle(0.1, 0, 0.1, 0.1); elem.PreCalc();
                            e++;elem = elements[e];elem.id = e+1;elem.k = 1;
                            elem.SetRectangle(0.2, 0, 0.1, 0.1); elem.PreCalc();
                            e++;elem = elements[e];elem.id = e+1;elem.k = 1;
                            elem.SetRectangle(0.3, 0, 0.1, 0.1); elem.PreCalc();
                */
                elem.nbs[Side.NORTH] = null; elem.nbs[Side.SOUTH] = null;
            }

            elem = elements[0];
            elem.nbs[Side.EAST] = elements[1];elem.nbs[Side.WEST] = null;

            elem = elements[elementcount-1];
            elem.nbs[Side.EAST] = null; elem.nbs[Side.WEST] = elements[elementcount-2];

            for (e = 1; e < elementcount-1; e++)
            {
                elem = elements[e];
                elem.nbs[Side.EAST] = elements[e+1]; elem.nbs[Side.WEST] = elements[e-1];
            }

            

            for (e = 0; e < elementcount; e++)
            {
                elements[e].Calc();
            }

            SetInitialBoundary();
            return true;
        }
Ejemplo n.º 7
0
        //by book
        public bool Create(string filename_)
        {
//            Inputfile = filename_;
//            if (LoadFromFile() != 0)
//                return false;

            count = 0;
            SetParameters();

            elements = new Element[elementcount];
            int e = 0;
            for (e = 0; e < elementcount ; e++)
            {
                elements[e]=new Element();
            }
            double t500=500/2;
            double t200=200/2;
            double t400=400/2;
            double a = 0.02;
            double da=0.02/2.0;
            double h =(Math.Sqrt(3)/2.0)*a;
            Element elem;
            e = 0;elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(a, 0, a + da, h,da, h); 
            elem.nbs[0] = elements[1]; elem.nbs[1] = elements[7]; elem.nbs[2] = null;
            elem.PreCalc();             

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(a, 0, 2 * a, 0, a + da, h); 
            elem.nbs[0] = null; elem.nbs[1] = elements[2]; elem.nbs[2] = elements[0];
            elem.PreCalc(); 

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(2 * a, 0, 2*a + da, h,a+da, h);
            elem.nbs[0] = elements[3]; elem.nbs[1] = null; elem.nbs[2] = elements[1];
            elem.PreCalc(); 

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(2 * a, 0,3*a,0 ,2*a + da, h);
            elem.nbs[0] = null; elem.nbs[1] = elements[4]; elem.nbs[2] = elements[2];
            elem.PreCalc();

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(3 * a, 0,3*a+da,h ,2 * a + da, h );
            elem.nbs[0] = null; elem.nbs[1] = elements[5]; elem.nbs[2] = elements[3];
            elem.PreCalc(); 
            //---------------------
            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(2 * a + da, h, 3 * a + da, h, 3 * a ,2*h);
            elem.nbs[0] = elements[4]; elem.nbs[1] = elements[6]; elem.nbs[2] = null;
            elem.PreCalc();

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(3 * a + da, h,4 * a, 2*h, 3 * a, 2 * h);
            elem.nbs[0] = null; elem.nbs[1] = null; elem.nbs[2] = elements[5];
            elem.PreCalc();

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(da, h, a+da, h, a, 2 * h);
            elem.nbs[0] = elements[0]; elem.nbs[1] = null; elem.nbs[2] = elements[8];
            elem.PreCalc();

            e++; elem = elements[e]; elem.id = e + 1; elem.k = 1;
            elem.SetTriangle(da, h, a, 2 * h,0, 2 * h);
            elem.nbs[0] = elements[7]; elem.nbs[1] = null; elem.nbs[2] = null;
            elem.PreCalc();
            
            for (e = 0; e < elementcount; e++)
                elements[e].Calc();
            for (e = 0; e < elementcount; e++)
                elements[e].CalcFaces();
            //frombook
            e = 0; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, t500);
            e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_FLUX, 0);
            e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, t400);
            e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_FLUX, 0);
            e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t500);
            //--
            e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, t200);
            e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST,t500); elem.SetBoundary(1, BoundaryType.BND_FLUX, 0);
            e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, t200);
            e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_FLUX, 0); elem.SetBoundary(2, BoundaryType.BND_CONST, t500);


            //1
            //e = 0; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, t500);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST,t500);
            //e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, t400);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t500);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t500);
            ////--
            //e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, t200);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t500); elem.SetBoundary(1, BoundaryType.BND_FLUX, 0);
            //e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, t200);
            //e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_FLUX, 0); elem.SetBoundary(2, BoundaryType.BND_CONST, t500);

            //2
            //e = 0; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, t500);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t500);
            //e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, t200);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t200);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t200);
            ////--
            //e++; elem = elements[e]; elem.SetBoundary(2, BoundaryType.BND_CONST, t200);
            //e++; elem = elements[e]; elem.SetBoundary(0, BoundaryType.BND_CONST, t200); elem.SetBoundary(1, BoundaryType.BND_FLUX, 0);
            //e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_CONST, t200);
            //e++; elem = elements[e]; elem.SetBoundary(1, BoundaryType.BND_FLUX, 0); elem.SetBoundary(2, BoundaryType.BND_CONST, t500);

            nodecount = 0;
            nodes = new Node[elementcount*3];
            int n = 0;
            int v = 0;
            for (e = 0; e < elementcount; e++)
            {
                elem = elements[e];
                for (v = 0; v < elem.vertex.Length; v++)
                {
                    bool found=false;
                    for (n = 0; n < nodecount; n++)
                    {
                        if (nodes[n].vertex.Equal(elem.vertex[v]))
                        {
                            if (n == 0)
                            {
                                int abb = 1;
                            }
                            nodes[n].elements[nodes[n].elemcount] = elem;
                            nodes[n].elemcount++;
                            found=true;
                            break;
                        }
                    }
                    if (!found)
                    {
                        nodes[nodecount] = new Node();
                        nodes[nodecount].id = nodecount + 1;
                        nodes[nodecount].vertex = elem.vertex[v];
                        nodes[nodecount].elements[0] = elem;
                        nodes[nodecount].elemcount++;
                        nodecount++;
                    }
                }
            }

            int n2=0;
            for (n = 0; n < nodecount; n++)
            {
                for (e = 0; e < nodes[n].elemcount; e++)
                {
                    elem = nodes[n].elements[e];
                    bool found= false;
                    for (n2 = 0; n2 < Element.FACEMAX; n2++)
                    {
                        if (elem.nodes[n2] == nodes[n])
                        {
                            found = true;
                            break;
                        }
                    }
                    if(!found)
                    {
                        elem.nodes[elem.nodecount] = nodes[n];
                        elem.nodecount++;
                    }

                }
            }

//            SetInitialBoundary();
            return true;
        }