Exemple #1
0
        /// <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);
        }