Beispiel #1
0
        public double g(int x, int tx, double[,] tab, int t, double stalaSig, double alfa, double cL, double cS, double roL, double roS, double tempKrzep, double entalpiaL, double entalpiaS, double kappa)
        {
            funkcje.Temperatura tempZEntalpii = new funkcje.Temperatura();

            double g;
            double suma = 0;


            if (t > tx)
            {
                for (int it = 1; it <= tx; it++)
                {
                    suma = suma + (Math.Pow(it, 1 - alfa) - Math.Pow(it - 1, 1 - alfa)) * (tempZEntalpii.temperatura(tab[tx - it + 1, x], tempKrzep, cL, roL, cS, roS, kappa, entalpiaL, entalpiaS) - tempZEntalpii.temperatura(tab[tx - it, x], tempKrzep, cL, roL, cS, roS, kappa, entalpiaL, entalpiaS));
                }

                g = ((cS * roS) / (cL * roL) - 1) * stalaSig * suma;
            }
            else
            {
                g = 0;
            }



            return(g);
        }
        static void Main(string[] args)
        {
            //double cS= 1000, cL= 1290, roS= 2679, roL= 2380, L= 390000, tempKrzep= 930, u0= 1213, uI= 298, lambdaL=104,lambdaS= 240;
            //double cS = 690, cL = 800, roS = 7500, roL = 7000, L = 270000, tempKrzep = 1773, u0 = 2213, uI = 323, lambdaL = 33, lambdaS = 30;
            double cS = 25, cL = 26, roS = 10, roL = 10, tempKrzep = 1, u0, uI, /*u0 = 1573, uI =973,*/ lambdaL = 130, lambdaS = 125;
            //double cS = 4217, cL = 4182, roS = 999.82, roL = 998.29, L = 334000, tempKrzep = 273, u0=293, uI=263, /*u0 = 1573, uI =973,*/ lambdaL = 0.6, lambdaS = 0.569;
            int    lbIteracji = 200;
            double a, stalaA, stalaSigma;
            double aL = lambdaL / (roL * cL);
            //double entalpiaL = 3536280000, entalpiaS = 2491470000;
            //double entalpiaL = 11200275000, entalpiaS = 9175275000;
            //double entalpiaL = 500, entalpiaS = 250;
            double entalpiaS, entalpiaL;
            double b = 2;
            double alfa = 0.8;
            int    granica = 0;
            int    n = 1000;
            double deltaX = b / n, deltaT = 0.01;


            //double[] temp0= { 50,50,50,50,50};
            //int n = temp0.Length;


            double[] temp0 = new double[n + 1];


            for (int i = 0; i <= n; i++)
            {
                //temp0[i] = tempKrzep-i*dT;
                //temp0[i] = uI;
                //temp0[i] =Math.Exp(-deltaX*i); /*warunek początkowy T0 */
                temp0[i] = Math.Exp(-deltaX * i);
            }

            double[] aVec = new double[n + 1];
            double[] bVec = new double[n + 1];
            double[] cVec = new double[n + 1];
            double[] dVec = new double[n + 1];
            double[,] tabH        = new double[lbIteracji + 1, n + 1];
            double[,] tabHKreska  = new double[lbIteracji + 1, n + 1];
            double[,] tabHDaszek  = new double[lbIteracji + 1, n + 1];
            double[,] tabH2Kreska = new double[lbIteracji + 1, n + 1];
            double[,] tabH2Daszek = new double[lbIteracji + 1, n + 1];
            int[] tabTx = new int[n + 1]; /*tablica, w której zapisane są czasy tx topnienia dla danego punktu x*/

            double suma = 0;
            int    j    = 1;
            int    l    = 990;

            double[] temperatury = new double[n + 1];


            funkcje.MetodaThomasa thomas = new funkcje.MetodaThomasa(); /* obiekt klasy MetodaThomasa do rozwiązania układu równań */
            double[] wynikThomas;

            funkcje.Temperatura tempZEntalpii = new funkcje.Temperatura(); /* obiekt klasy Temperatura do wyznaczenia temperatury na podstawie entalpii */
            double temp;

            funkcje.FunkcjaG funkcjaG = new funkcje.FunkcjaG(); /* obiekt klasy funkcjaG */
            double           wynikG;

            funkcje.Entalpia entZtemp = new funkcje.Entalpia();
            double           ent;

            funkcje.Kappa kap = new funkcje.Kappa();
            double        kappa;



            for (int i = 0; i <= n; i++)
            {
                tabTx[i] = lbIteracji; /* ustawiamy czas topnienia dla punktu x na lbIteracji */
            }
            kappa     = kap.kappa(lambdaL, lambdaS, aL, 1);
            entalpiaS = cS * roS * tempKrzep;
            entalpiaL = entalpiaS + kappa;

            for (int i = 0; i < temp0.Length; i++)
            {
                if (temp0[i] > tempKrzep)
                {
                    tabH[0, i] = entZtemp.entalpia(temp0[i], tempKrzep, cL, roL, cS, roS, kappa); /* Etap 1: wyznaczamy entalpie w chwili 0 na podstawie T0*/
                }
                else
                {
                    tabH[0, i] = entZtemp.entalpia(temp0[i], tempKrzep, cL, roL, cS, roS, kappa);
                }
            }

            //Console.Write("tabH0[n-1]: {0}", tabH[0, 0]);

            /*Console.Write("tabH0: ");
             * for (int i = 0; i < n; i++)
             *  Console.Write("{0} ", tabH[0, i]);*/


            stalaSigma = 1 / (SpecialFunction.gamma(1 - alfa) * (1 - alfa) * Math.Pow(deltaT, alfa)); /* wartość funkcji sigma */



            //for (int j = 1; j < lbIteracji; j++)
            while (granica < l && j <= lbIteracji)
            {
                a      = lambdaL / (cL * roL); /* Etap 2a: sprowadzamy całość do fazy ciekłej */
                stalaA = a / (Math.Pow(deltaX, 2));

                kappa     = kap.kappa(lambdaL, lambdaS, aL, deltaT * j);
                entalpiaS = cS * roS * tempKrzep;
                entalpiaL = entalpiaS + kappa;


                for (int i = 0; i < temp0.Length; i++)
                {
                    tabHKreska[j - 1, i] = Math.Max(tabH[j - 1, i], entalpiaL);
                }

                //Console.WriteLine(" ");
                //Console.Write("tabHKreska: ");
                //for (int i = 0; i < n; i++)
                //    Console.Write("{0} ", tabHKreska[j-1, i]);

                //Console.Write("tabHKreska[n-1]: {0}", tabHKreska[j-1, 0]);

                aVec[0] = 0;
                for (int i = 1; i < n; i++)
                {
                    aVec[i] = -stalaA;
                }
                aVec[n] = -2 * stalaA;

                bVec[0] = 1;
                for (int i = 1; i < n + 1; i++)
                {
                    bVec[i] = stalaSigma + 2 * stalaA;
                }

                cVec[0] = 0;
                for (int i = 1; i < n; i++)
                {
                    cVec[i] = -stalaA;
                }
                cVec[n] = 0;

                //u0 = Math.Exp(a*(j)*deltaT);
                u0      = Math.Exp(a * (j) * deltaT);
                dVec[0] = entZtemp.entalpia(u0, tempKrzep, cL, roL, cS, roS, kappa); /* obliczenie entalpii dla brzegowej temperatury u0 */
                Console.WriteLine(dVec[0] > entalpiaL);

                for (int i = 1; i <= n; i++)
                {
                    suma = 0;

                    for (int it = 2; it <= j; it++)
                    {
                        suma = suma + (Math.Pow(it, 1 - alfa) - Math.Pow(it - 1, 1 - alfa)) * (tabHKreska[j - it + 1, i] - tabHKreska[j - it, i]);
                    }

                    dVec[i] = stalaSigma * tabHKreska[j - 1, i] - stalaSigma * suma + cL * roL * funkcjaG.g(i, tabTx[i], tabHKreska, j, stalaSigma, alfa, cL, cS, roL, roS, tempKrzep, entalpiaL, entalpiaS, kappa);
                }


                wynikThomas = thomas.nowa(aVec, bVec, cVec, dVec); /* rozwiązanie układu równań metodą Thomasa */

                for (int i = 0; i <= n; i++)
                {
                    tabHDaszek[j, i] = wynikThomas[i];
                }

                //Console.Write("tabHDaszek[n-1]: {0}", tabHDaszek[j, 0]);

                //Console.WriteLine(" ");
                //Console.Write("tabHDaszek wyznaczone z Thomasa: ");
                //for (int i = 0; i < n; i++)
                //    Console.Write("{0} ", tabHDaszek[j, i]);


                for (int i = 0; i <= n; i++)
                {
                    tabHKreska[j, i] = tabHDaszek[j, i] + (tabH[j - 1, i] - tabHKreska[j - 1, i]); /* korekta entalpii */
                }
                //Console.Write("tabHKreska[n-1]: {0}", tabHKreska[j, 0]);

                /* Console.WriteLine(" ");
                 * Console.Write("tabHKreska po korekcie: ");
                 * for (int i = 0; i < n; i++)
                 *   Console.Write("{0} ", tabHKreska[j, i]); */


                a      = lambdaS / (cS * roS); /* Etap 2b: sprowadzamy całość do fazy stałej  */
                stalaA = a / (Math.Pow(deltaX, 2));


                for (int i = 0; i <= n; i++)
                {
                    tabH2Kreska[j - 1, i] = Math.Min(tabHKreska[j, i], entalpiaS);
                }

                //Console.Write("tabH2Kreska[n-1]: {0}", tabH2Kreska[j-1, 0]);

                //Console.WriteLine(" ");
                //Console.Write("tabH2Kreska (minimum): ");
                //for (int i = 0; i < n; i++)
                //    Console.Write("{0} ", tabH2Kreska[j-1, i]);

                aVec[0] = 0;
                for (int i = 1; i < n; i++)
                {
                    aVec[i] = -stalaA;
                }
                aVec[n] = 0;


                for (int i = 0; i < n; i++)
                {
                    bVec[i] = stalaSigma + 2 * stalaA;
                }
                bVec[n] = 1;

                cVec[0] = -2 * stalaA;
                for (int i = 1; i < n; i++)
                {
                    cVec[i] = -stalaA;
                }
                cVec[n] = 0;


                for (int i = 0; i < n; i++)
                {
                    suma = 0;
                    for (int it = 2; it <= j; it++)
                    {
                        suma = suma + (Math.Pow(it, 1 - alfa) - Math.Pow(it - 1, 1 - alfa)) * (tabH2Kreska[j - it + 1, i] - tabH2Kreska[j - it, i]);
                    }

                    dVec[i] = stalaSigma * tabH2Kreska[j - 1, i] - stalaSigma * suma + cL * roL * funkcjaG.g(i, tabTx[i], tabH2Kreska, j, stalaSigma, alfa, cL, cS, roL, roS, tempKrzep, entalpiaL, entalpiaS, kappa);;
                }
                uI = Math.Exp(a * (j) * deltaT - 2);
                //uI =Math.Exp(a*(j)*deltaT-1);
                dVec[n] = entZtemp.entalpia(uI, tempKrzep, cL, roL, cS, roS, kappa);
                Console.WriteLine(uI);

                wynikThomas = thomas.nowa(aVec, bVec, cVec, dVec); /* rozwiązanie układu równań metodą Thomasa */


                for (int i = 0; i <= n; i++)
                {
                    tabH2Daszek[j, i] = wynikThomas[i];
                }

                //Console.Write("tabH2Daszek[n-1]: {0}", tabH2Daszek[j, 0]);

                //Console.WriteLine(" ");
                // Console.Write("tabH2Daszek z thomasa: ");
                // for (int i = 0; i < n; i++)
                // Console.Write("{0} ", tabH2Daszek[j, i]);

                for (int i = 0; i <= n; i++)
                {
                    tabH[j, i] = tabH2Daszek[j, i] + (tabHKreska[j, i] - tabH2Kreska[j - 1, i]); /* korekta */
                }
                //Console.Write("tabH[n-1]: {0}", tabH[j, 0]);

                //Console.WriteLine(" ");
                //Console.Write("tabH po korekcie: ");
                //for (int i = 0; i < n; i++)
                //{
                //    Console.Write("{0} ", tabH[j, i]);
                //}

                //Console.WriteLine(" ");
                //Console.Write("temp tabH: ");
                //for (int i = 0; i < n; i++)
                //{
                //    Console.Write("{0} ", tempZEntalpii.temperatura(tabH[j, i]));
                //}

                //Console.WriteLine(" ");

                for (int i = 0; i <= n; i++)
                {
                    if (tabH[j, i] > entalpiaS && tabH[j - 1, i] <= entalpiaS)
                    {
                        tabTx[i] = j;
                    }
                }

                for (int i = 1; i < n; i++)
                {
                    if (tabH[j, i] <= entalpiaS && tabH[j, i + 1] <= entalpiaS && tabH[j, i - 1] > entalpiaS)
                    {
                        granica = i;
                    }
                }


                Console.WriteLine("{0}", j);
                j++;
            }

            Console.Write("tabH: ");
            for (int i = 0; i <= n; i++)
            {
                Console.Write("{0} ", tabH[j - 1, i]);
            }

            string path = @"C:\Users\agata.chmielowska\Desktop\AlgorytmC1zestawDanych\Wyniki\entalpie.csv";

            System.IO.StreamWriter str = new System.IO.StreamWriter(path, false);

            for (int i = 0; i <= n; i++)
            {
                str.WriteLine("{0} ", tabH[j - 1, i]);
            }
            str.Close();

            Console.WriteLine("");
            Console.Write("temp tabH: ");
            for (int i = 0; i <= n; i++)
            {
                temperatury[i] = tempZEntalpii.temperatura(tabH[j - 1, i], tempKrzep, cL, roL, cS, roS, kappa, entalpiaL, entalpiaS);
                Console.Write("{0} ", temperatury[i]);
            }

            path = @"C:\Users\agata.chmielowska\Desktop\AlgorytmC1zestawDanych\Wyniki\temperatury.csv";
            str  = new System.IO.StreamWriter(path, false);

            for (int i = 0; i <= n; i++)
            {
                str.WriteLine("{0} ", temperatury[i]);
            }
            str.Close();

            Console.WriteLine("");
            Console.Write("Wartość tabTx:");
            for (int i = 0; i <= n; i++)
            {
                Console.Write("{0} ", tabTx[i]);
            }

            path = @"C:\Users\agata.chmielowska\Desktop\AlgorytmC1zestawDanych\Wyniki\granica.csv";
            str  = new System.IO.StreamWriter(path, false);

            for (int i = 0; i <= n; i++)
            {
                str.WriteLine("{0} ", tabTx[i] * deltaT);
            }
            str.Close();

            Console.WriteLine("");
            Console.WriteLine("Program zakończył działanie po {0} iteracjach", j - 1);

            Console.WriteLine("");
            Console.WriteLine("Granica znajduje sie w punkcie: {0}", granica);

            temp = tempZEntalpii.temperatura(entalpiaL, tempKrzep, cL, roL, cS, roS, kappa, entalpiaL, entalpiaS);
            Console.WriteLine("Wartosc temperatury: {0}", temp);

            wynikG = funkcjaG.g(5, tabTx[5], tabH, 20, stalaSigma, alfa, cL, cS, roL, roS, tempKrzep, entalpiaL, entalpiaS, kappa);
            Console.WriteLine("Wartość g: {0} ", wynikG);

            Console.WriteLine("Wartość funkcji gamma: {0} ", SpecialFunction.gamma(0.5));



            Console.ReadKey();
            return;
        }