/// <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(); } } }
/// <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)); }
/// <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); } }
/// <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)); }