Пример #1
0
        /// <summary>
        /// Log energy for Orr-Sommerfeld problem.
        /// </summary>
        void LogEnergyOrrSommerfeld(int TimestepNo, double phystime, double dt)
        {
            Energy.Clear();
            Energy.ProjectFunction(
                1.0,
                (X, U, cell) => (1.0 - X[1] * X[1] - U[0]) * (1.0 - X[1] * X[1] - U[0]) + U[1] * U[1],
                null,
                WorkingSet.Velocity.Current[0],
                WorkingSet.Velocity.Current[1]);

            EnergyIntegral = Energy.IntegralOver(null);
            omega          = 1 / (2 * (phystime + dt)) * Math.Log(EnergyIntegral / Energy_t0);

            if (base.MPIRank == 0)
            {
                Log_Energy.WriteLine();
                Log_Energy.Write("{0}\t{1}\t{2}",
                                 (phystime + dt).ToString("0.000", NumberFormatInfo.InvariantInfo),
                                 EnergyIntegral.ToString("0.0000000000E+00", NumberFormatInfo.InvariantInfo),
                                 omega.ToString("0.000000E+00", NumberFormatInfo.InvariantInfo));
                Log_Energy.Flush();
                if (TimestepNo == base.Control.NoOfTimesteps)
                {
                    Log_Energy.Close();
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Returns thermodynamic pressure as function of inital mass and temperature.
        /// </summary>
        /// <param name="InitialMass"></param>
        /// <param name="Temperature"></param>
        /// <returns></returns>
        public double GetMassDeterminedThermodynamicPressure(double InitialMass, SinglePhaseField Temperature)
        {
            SinglePhaseField OneOverTemperature = new SinglePhaseField(Temperature.Basis);

            OneOverTemperature.ProjectPow(1.0, Temperature, -1.0);
            return(InitialMass / OneOverTemperature.IntegralOver(null));
        }
Пример #3
0
        /// <summary>
        /// Initialize logging of energy for Orr-Sommerfeld problem
        /// </summary>
        void InitLogEnergyOrrSommerfeld()
        {
            Energy = new SinglePhaseField(new Basis(base.GridData, 20));

            if (base.MPIRank == 0)
            {
                Log_Energy = base.DatabaseDriver.FsDriver.GetNewLog("PerturbationEnergy", CurrentSessionInfo.ID);
            }

            Energy.Clear();
            Energy.ProjectFunction(
                1.0,
                (X, U, cell) => (1.0 - X[1] * X[1] - U[0]) * (1.0 - X[1] * X[1] - U[0]) + U[1] * U[1],
                null,
                WorkingSet.Velocity.Current[0],
                WorkingSet.Velocity.Current[1]);

            Energy_t0 = Energy.IntegralOver(null);

            if (base.MPIRank == 0)
            {
                Log_Energy.Write("Time\tPerturbationEnergy\tOmega");
                Log_Energy.WriteLine();
                Log_Energy.Write("{0}\t{1}\t{2}",
                                 (0.0).ToString("0.000", NumberFormatInfo.InvariantInfo),
                                 Energy_t0.ToString("0.0000000000E+00", NumberFormatInfo.InvariantInfo),
                                 (2.234976E-03).ToString("0.000000E+00", NumberFormatInfo.InvariantInfo));
                Log_Energy.Flush();
            }

            if (base.MPIRank == 0)
            {
                Console.WriteLine("E(t0) = " + Energy_t0);
            }
        }
Пример #4
0
        /// <summary>
        /// Returns thermodynamic pressure as function of inital mass and temperature.
        /// </summary>
        /// <param name="InitialMass"></param>
        /// <param name="Temperature"></param>
        /// <returns></returns>
        public override double GetMassDeterminedThermodynamicPressure(double InitialMass, SinglePhaseField Temperature)
        {
            SinglePhaseField omega = new SinglePhaseField(Temperature.Basis);

            omega.ProjectField(1.0,
                               delegate(int j0, int Len, NodeSet NS, MultidimensionalArray result) {
                int K = result.GetLength(1);     // No nof Nodes
                MultidimensionalArray temp = MultidimensionalArray.Create(Len, K);
                Temperature.Evaluate(j0, Len, NS, temp);
                for (int j = 0; j < Len; j++)
                {
                    for (int k = 0; k < K; k++)
                    {
                        result[j, k] = 1 / temp[j, k];
                    }
                }
            }, new Foundation.Quadrature.CellQuadratureScheme(true, null));
            return(InitialMass / omega.IntegralOver(null));
        }