/// <summary> /// /// </summary> /// <returns></returns> public static XNSE_Control CapillaryRise_Tube_SFB1194(int p = 2, int kelemR = 8, int omegaTc = 3, bool startUp = true, bool symmetry = true, string _DbPath = null) { XNSE_Control C = new XNSE_Control(); _DbPath = @"\\dc1\userspace\smuda\cluster\CapillaryRise\CapillaryRise_studyDB"; //_DbPath = @"\\HPCCLUSTER\hpccluster-scratch\smuda\CapillaryRise_studyDB"; // basic database options // ====================== #region db C.DbPath = _DbPath; C.savetodb = false; // C.DbPath != null; C.ProjectName = "XNSE/CapillaryRise"; C.ProjectDescription = "A comparative study for SFB 1194"; C.ContinueOnIoError = false; C.LogValues = XNSE_Control.LoggingValues.MovingContactLine; C.LogPeriod = 100; #endregion // DG degrees // ========== #region degrees C.FieldOptions.Add("VelocityX", new FieldOpts() { Degree = p, SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); C.FieldOptions.Add("VelocityY", new FieldOpts() { Degree = p, SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); C.FieldOptions.Add("GravityY", new FieldOpts() { SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); C.FieldOptions.Add("Pressure", new FieldOpts() { Degree = p - 1, SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); C.FieldOptions.Add("PhiDG", new FieldOpts() { SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); C.FieldOptions.Add("Phi", new FieldOpts() { Degree = p, SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); C.FieldOptions.Add("Curvature", new FieldOpts() { Degree = p, SaveToDB = FieldOpts.SaveToDBOpt.TRUE }); #endregion // Physical Parameters // =================== #region physics // the gaseous phase should be close to air C.PhysicalParameters.rho_B = 1.204e-6; // kg / cm^3 C.PhysicalParameters.mu_B = 17.1e-8; // kg / cm s double g = 0; double R = 0; double H = 0; double t_end = 0; double dt = 0; double t_startUp = 0; double dt_startUp = 0; Guid restartID = new Guid(); switch (omegaTc) { case 1: { C.Tags.Add("omega = 0.1"); R = 5e-3; // cm H = 3e-2; C.PhysicalParameters.rho_A = 1663.8; C.PhysicalParameters.mu_A = 0.01; C.PhysicalParameters.Sigma = 0.2; // kg / s^2 C.PhysicalParameters.betaS_A = 1e-3 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaS_B = 1e-5 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaL = 0; C.PhysicalParameters.theta_e = 3.0 * Math.PI / 18.0; g = 1.04; // cm / s^2 t_end = 13.86; t_startUp = 0.49032; dt = 4e-5; dt_startUp = 4e-5; //restartID = new Guid("07ca4397-8eed-4769-b795-9725fe7d3cd7"); //restartID = new Guid("fa8454ce-c05a-4dea-a308-663b6be04ff7"); restartID = new Guid("6380b408-e043-4ed3-8ae5-819d7566e241"); break; } case 2: { C.Tags.Add("omega = 0.5"); R = 5e-3; // cm H = 3e-2; C.PhysicalParameters.rho_A = 133.0; C.PhysicalParameters.mu_A = 0.01; C.PhysicalParameters.Sigma = 0.1; // kg / s^2 C.PhysicalParameters.betaS_A = 1e-3 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaS_B = 1e-5 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaL = 0; C.PhysicalParameters.theta_e = 3.0 * Math.PI / 18.0; g = 6.51; // cm / s^2 t_end = 1.11; t_startUp = 0.15; dt = 2e-5; dt_startUp = 4e-5; restartID = new Guid("59e43164-1c32-4ece-b5ab-257844198fa4"); break; } case 3: { C.Tags.Add("omega = 1"); R = 5e-3; // cm H = 3e-2; C.PhysicalParameters.rho_A = 83.1; C.PhysicalParameters.mu_A = 0.01; C.PhysicalParameters.Sigma = 0.04; // kg / s^2 C.PhysicalParameters.betaS_A = 8; C.PhysicalParameters.betaS_B = 0.008; C.PhysicalParameters.betaL = 0; // 0.04; // 4.004; C.PhysicalParameters.theta_e = 3.0 * Math.PI / 18.0; g = 4.17; // cm / s^2 t_end = 0.7; t_startUp = 0.098; dt = 3.5e-5; dt_startUp = 4e-5; restartID = new Guid("e2a38f38-bcdb-4588-bd87-9914dc2989e4"); //startUp //restartID = new Guid("3a1136f2-5363-43b0-8084-5c2ee6ce9d06"); //restart //restartID = new Guid("f37c9194-1bfb-4250-8dc6-a4d1bbe01ed9"); break; } case 4: { C.Tags.Add("omega = 10"); R = 5e-3; // cm H = 3e-2; C.PhysicalParameters.rho_A = 3.3255; C.PhysicalParameters.mu_A = 0.01; C.PhysicalParameters.Sigma = 0.01; // kg / s^2 C.PhysicalParameters.betaS_A = 1e-3 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaS_B = 1e-5 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaL = 0; C.PhysicalParameters.theta_e = 3.0 * Math.PI / 18.0; g = 26.042; // cm / s^2 t_end = 2.7713; t_startUp = 0.098; dt = 1e-4; dt_startUp = 1e-4; restartID = new Guid("26a16f96-a657-4834-8216-89d30a04c938"); break; } case 5: { C.Tags.Add("omega = 100"); R = 5e-3; // cm H = 3e-2; C.PhysicalParameters.rho_A = 0.33255; C.PhysicalParameters.mu_A = 0.01; C.PhysicalParameters.Sigma = 0.001; // kg / s^2 C.PhysicalParameters.betaS_A = 1e-3 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaS_B = 1e-5 / Math.Min(R / kelemR, H / (5 * kelemR)); C.PhysicalParameters.betaL = 0; C.PhysicalParameters.theta_e = 3.0 * Math.PI / 18.0; g = 26.042; // cm / s^2 t_end = 27.713; t_startUp = 0.098; dt = 1e-3; dt_startUp = 1e-3; restartID = new Guid("b59abf15-1358-48c1-8b79-6b10e1c1d729"); break; } } C.PhysicalParameters.IncludeConvection = true; C.PhysicalParameters.Material = true; #endregion // grid generation // =============== #region grid if (startUp) { C.GridFunc = delegate() { double[] Xnodes; if (symmetry) { Xnodes = GenericBlas.Linspace(0, R, kelemR + 1); } else { Xnodes = GenericBlas.Linspace(-R, R, 2 * kelemR + 1); } double[] Ynodes = GenericBlas.Linspace(0, H, 6 * kelemR + 1); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes); grd.EdgeTagNames.Add(1, "wall_lower"); grd.EdgeTagNames.Add(2, "pressure_outlet_upper"); if (symmetry) { grd.EdgeTagNames.Add(3, "slipsymmetry_left"); } else { grd.EdgeTagNames.Add(3, "navierslip_linear_left"); } grd.EdgeTagNames.Add(4, "navierslip_linear_right"); //grd.EdgeTagNames.Add(4, "navierslip_localized_right"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[1]) <= 1.0e-8) { et = 1; } if (Math.Abs(X[1] - H) <= 1.0e-8) { et = 2; } if (symmetry) { if (Math.Abs(X[0]) <= 1.0e-8) { et = 3; } } else { if (Math.Abs(X[0] + R) <= 1.0e-8) { et = 3; } } if (Math.Abs(X[0] - R) <= 1.0e-8) { et = 4; } return(et); }); return(grd); }; } #endregion // Initial Values // ============== #region init double h0 = 1e-2; Func <double[], double> PhiFunc = (X => X[1] - h0); if (startUp) { C.InitialValues_Evaluators.Add("Phi", PhiFunc); C.InitialValues_Evaluators.Add("GravityY#A", X => - g); C.InitialValues_Evaluators.Add("GravityY#B", X => - g); } else { C.RestartInfo = new Tuple <Guid, TimestepNumber>(restartID, null); } #endregion // boundary conditions // =================== #region BC if (startUp) { C.AddBoundaryValue("wall_lower"); } else { //C.AddBoundaryCondition("wall_lower"); C.ChangeBoundaryCondition("wall_lower", "pressure_outlet_lower"); C.AddBoundaryValue("pressure_outlet_lower"); } C.AddBoundaryValue("pressure_outlet_upper"); if (symmetry) { C.AddBoundaryValue("slipsymmetry_left"); } else { C.AddBoundaryValue("navierslip_linear_left"); } //C.ChangeBoundaryCondition("navierslip_localized_right", "navierslip_linear_right"); C.AddBoundaryValue("navierslip_linear_right"); C.AdvancedDiscretizationOptions.GNBC_Localization = NavierSlip_Localization.Nearband; C.AdvancedDiscretizationOptions.GNBC_SlipLength = NavierSlip_SlipLength.hmin_Grid; #endregion // misc. solver options // ==================== #region solver C.ComputeEnergy = false; C.LSContiProjectionMethod = Solution.LevelSetTools.ContinuityProjectionOption.ContinuousDG; C.VelocityBlockPrecondMode = MultigridOperator.Mode.SymPart_DiagBlockEquilib; C.NoOfMultigridLevels = 1; C.Solver_MaxIterations = 50; C.Solver_ConvergenceCriterion = 1e-8; C.LevelSet_ConvergenceCriterion = 1e-6; C.AdvancedDiscretizationOptions.FilterConfiguration = CurvatureAlgorithms.FilterConfiguration.NoFilter; C.AdvancedDiscretizationOptions.SurfStressTensor = SurfaceSressTensor.Isotropic; //C.PhysicalParameters.mu_I = dt * 0.2; C.AdvancedDiscretizationOptions.UseLevelSetStabilization = false; C.AdvancedDiscretizationOptions.SST_isotropicMode = Solution.XNSECommon.SurfaceStressTensor_IsotropicMode.LaplaceBeltrami_ContactLine; C.AdaptiveMeshRefinement = false; C.RefineStrategy = XNSE_Control.RefinementStrategy.constantInterface; C.RefineNavierSlipBoundary = false; C.RefinementLevel = 1; #endregion // level-set // ========= #region levelset C.Option_LevelSetEvolution = LevelSetEvolution.FastMarching; //int Nsp = 256; //C.FourierLevSetControl = new FourierLevSetControl(FourierType.Planar, Nsp, R, X => h0, R/(double)Nsp); //C.FourierLevSetControl.Timestepper = FourierLevelSet_Timestepper.RungeKutta1901; #endregion // Timestepping // ============ #region time C.Timestepper_Scheme = XNSE_Control.TimesteppingScheme.BDF2; C.Timestepper_BDFinit = TimeStepperInit.SingleInit; C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; C.CompMode = AppControl._CompMode.Transient; C.dtMax = (startUp) ? dt_startUp : dt; C.dtMin = (startUp) ? dt_startUp : dt; C.Endtime = (startUp) ? Math.Sqrt(2 * R / g) * 5.0 : (t_startUp + t_end); C.NoOfTimesteps = (int)(C.Endtime / C.dtMin); C.saveperiod = 100; #endregion return(C); }