/// <summary> /// /// </summary> /// <param name="XOp"></param> /// <param name="config"></param> /// <param name="spcName"></param> /// <param name="spcId"></param> /// <param name="BcMap"></param> /// <param name="LsTrk"></param> /// <param name="U0meanrequired"></param> public static void AddSpeciesNSE(XSpatialOperatorMk2 XOp, INSE_Configuration config, int D, string spcName, SpeciesId spcId, IncompressibleMultiphaseBoundaryCondMap BcMap, LevelSetTracker LsTrk, out bool U0meanrequired) { U0meanrequired = false; for (int d = 0; d < D; d++) { AddSpeciesNSE_component(XOp, config, d, D, spcName, spcId, BcMap, LsTrk, out U0meanrequired); } }
//==================== // Continuity equation //==================== #region conti /// <summary> /// /// </summary> /// <param name="XOp"></param> /// <param name="config"></param> /// <param name="D"></param> /// <param name="spcName"></param> /// <param name="spcId"></param> /// <param name="BcMap"></param> public static void AddSpeciesContinuityEq(XSpatialOperatorMk2 XOp, INSE_Configuration config, int D, string spcName, SpeciesId spcId, IncompressibleMultiphaseBoundaryCondMap BcMap) { // check input if (XOp.IsCommited) { throw new InvalidOperationException("Spatial Operator is already comitted. Adding of new components is not allowed"); } string CodName = EquationNames.ContinuityEquation; if (!XOp.CodomainVar.Contains(CodName)) { throw new ArgumentException("CoDomain variable \"" + CodName + "\" is not defined in Spatial Operator"); } PhysicalParameters physParams = config.getPhysParams; DoNotTouchParameters dntParams = config.getDntParams; // set species arguments double rhoSpc; switch (spcName) { case "A": { rhoSpc = physParams.rho_A; break; } case "B": { rhoSpc = physParams.rho_B; break; } default: throw new ArgumentException("Unknown species."); } // set components var comps = XOp.EquationComponents[CodName]; for (int d = 0; d < D; d++) { var src = new Operator.Continuity.DivergenceInSpeciesBulk_Volume(d, D, spcName, rhoSpc, dntParams.ContiSign, dntParams.RescaleConti); comps.Add(src); var flx = new Operator.Continuity.DivergenceInSpeciesBulk_Edge(d, BcMap, spcName, spcId, rhoSpc, dntParams.ContiSign, dntParams.RescaleConti); comps.Add(flx); //var stab = new PressureStabilizationInBulk(dntParams.PresPenalty2, physParams.reynolds_A, physParams.reynolds_B, spcName, spcId); //comps.Add(stab); } }
//======================= // Navier Stokes equation //======================= #region nse /// <summary> /// /// </summary> /// <param name="XOp"></param> /// <param name="d"></param> /// <param name="D"></param> /// <param name="spcName"></param> /// <param name="spcId"></param> /// <param name="BcMap"></param> /// <param name="config"></param> /// <param name="LsTrk"></param> /// <param name="U0meanrequired"></param> public static void AddSpeciesNSE_component(XSpatialOperatorMk2 XOp, INSE_Configuration config, int d, int D, string spcName, SpeciesId spcId, IncompressibleMultiphaseBoundaryCondMap BcMap, LevelSetTracker LsTrk, out bool U0meanrequired) { // check input if (XOp.IsCommited) { throw new InvalidOperationException("Spatial Operator is already committed. Adding of new components is not allowed"); } string CodName = EquationNames.MomentumEquationComponent(d); if (!XOp.CodomainVar.Contains(CodName)) { throw new ArgumentException("CoDomain variable \"" + CodName + "\" is not defined in Spatial Operator"); } PhysicalParameters physParams = config.getPhysParams; DoNotTouchParameters dntParams = config.getDntParams; // set species arguments double rhoSpc, LFFSpc, muSpc; switch (spcName) { case "A": { rhoSpc = physParams.rho_A; LFFSpc = dntParams.LFFA; muSpc = physParams.mu_A; break; } case "B": { rhoSpc = physParams.rho_B; LFFSpc = dntParams.LFFB; muSpc = physParams.mu_B; break; } default: throw new ArgumentException("Unknown species."); } // set components var comps = XOp.EquationComponents[CodName]; // convective operator // =================== U0meanrequired = false; if (physParams.IncludeConvection && config.isTransport) { var conv = new Operator.Convection.ConvectionInSpeciesBulk_LLF(D, BcMap, spcName, spcId, d, rhoSpc, LFFSpc, LsTrk); comps.Add(conv); U0meanrequired = true; } // pressure gradient // ================= if (config.isPressureGradient) { var pres = new Operator.Pressure.PressureInSpeciesBulk(d, BcMap, spcName, spcId); comps.Add(pres); //problably necessary for LDG Simulation. Only one species parameter reynoldsA!!!!!! //var presStab = new PressureStabilizationInBulk(dntParams.PresPenalty2, physParams.reynolds_A, spcName, spcId); //comps.Add(presStab); } // viscous operator // ================ if (config.isViscous && !(muSpc == 0.0)) { double penalty = dntParams.PenaltySafety; switch (dntParams.ViscosityMode) { case ViscosityMode.Standard: case ViscosityMode.TransposeTermMissing: { // Bulk operator: var Visc1 = new Operator.Viscosity.ViscosityInSpeciesBulk_GradUTerm( dntParams.UseGhostPenalties ? 0.0 : penalty, 1.0, BcMap, spcName, spcId, d, D, physParams.mu_A, physParams.mu_B); comps.Add(Visc1); if (dntParams.UseGhostPenalties) { var Visc1Penalty = new Operator.Viscosity.ViscosityInSpeciesBulk_GradUTerm( penalty, 0.0, BcMap, spcName, spcId, d, D, physParams.mu_A, physParams.mu_B); XOp.GhostEdgesOperator.EquationComponents[CodName].Add(Visc1Penalty); } break; } case ViscosityMode.FullySymmetric: { // Bulk operator var Visc1 = new Operator.Viscosity.ViscosityInSpeciesBulk_GradUTerm( dntParams.UseGhostPenalties ? 0.0 : penalty, 1.0, BcMap, spcName, spcId, d, D, physParams.mu_A, physParams.mu_B); comps.Add(Visc1); var Visc2 = new Operator.Viscosity.ViscosityInSpeciesBulk_GradUtranspTerm( dntParams.UseGhostPenalties ? 0.0 : penalty, 1.0, BcMap, spcName, spcId, d, D, physParams.mu_A, physParams.mu_B); comps.Add(Visc2); if (dntParams.UseGhostPenalties) { var Visc1Penalty = new Operator.Viscosity.ViscosityInSpeciesBulk_GradUTerm( penalty, 0.0, BcMap, spcName, spcId, d, D, physParams.mu_A, physParams.mu_B); var Visc2Penalty = new Operator.Viscosity.ViscosityInSpeciesBulk_GradUtranspTerm( penalty, 0.0, BcMap, spcName, spcId, d, D, physParams.mu_A, physParams.mu_B); XOp.GhostEdgesOperator.EquationComponents[CodName].Add(Visc1Penalty); XOp.GhostEdgesOperator.EquationComponents[CodName].Add(Visc2Penalty); } break; } case ViscosityMode.Viscoelastic: { //set species arguments double ReSpc, betaSpc; switch (spcName) { case "A": { ReSpc = physParams.reynolds_A; betaSpc = physParams.beta_a; break; } case "B": { ReSpc = physParams.reynolds_B; betaSpc = physParams.beta_b; break; } default: throw new ArgumentException("Unknown species."); } // Bulk operator: var Visc1 = new Operator.Viscosity.DimensionlessViscosityInSpeciesBulk_GradUTerm( dntParams.UseGhostPenalties ? 0.0 : penalty, 1.0, BcMap, spcName, spcId, d, D, physParams.reynolds_A / physParams.beta_a, physParams.reynolds_B / physParams.beta_b); comps.Add(Visc1); var Visc2 = new Operator.Viscosity.DimensionlessViscosityInSpeciesBulk_GradUtranspTerm( dntParams.UseGhostPenalties ? 0.0 : penalty, 1.0, BcMap, spcName, spcId, d, D, physParams.reynolds_A / physParams.beta_a, physParams.reynolds_B / physParams.beta_b); comps.Add(Visc2); var div = new StressDivergenceInBulk(d, BcMap, ReSpc, dntParams.Penalty1, dntParams.Penalty2, spcName, spcId); comps.Add(div); break; } default: throw new NotImplementedException(); } } }