public static FSI_Control StickyTrap(string _DbPath = null, int k = 2, double VelXBase = 0.0, double angle = 0.0) { FSI_Control C = new FSI_Control(); const double BaseSize = 1.0; // basic database options // ====================== //C.DbPath = @"\\dc1\userspace\deriabina\bosss_db"; C.savetodb = false; C.saveperiod = 1; C.ProjectName = "ParticleCollisionTest"; C.ProjectDescription = "Gravity"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); C.AdaptiveMeshRefinement = false; C.RefinementLevel = 2; C.SessionName = "fjkfjksdfhjk"; C.pureDryCollisions = true; C.SetDGdegree(k); // grid and boundary conditions // ============================ C.GridFunc = delegate { int q, r; q = 40; r = 40; double[] Xnodes = GenericBlas.Linspace(-1.5 * BaseSize, 1.5 * BaseSize, q + 1); double[] Ynodes = GenericBlas.Linspace(-1.5 * BaseSize, 1.5 * BaseSize, r + 1); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall_left"); grd.EdgeTagNames.Add(2, "Wall_right"); grd.EdgeTagNames.Add(3, "Pressure_Outlet_lower"); grd.EdgeTagNames.Add(4, "Pressure_Outlet_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-1.5 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-1.5 * BaseSize)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (-1.5 * BaseSize)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-1.5 * BaseSize)) <= 1.0e-8) { et = 4; } return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; C.GridPartType = GridPartType.Hilbert; C.AddBoundaryValue("Wall_left"); C.AddBoundaryValue("Wall_right"); C.AddBoundaryValue("Pressure_Outlet_lower"); C.AddBoundaryValue("Pressure_Outlet_upper"); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; // Fluid Properties C.PhysicalParameters.rho_A = 1.0; C.PhysicalParameters.mu_A = 0.1; C.CoefficientOfRestitution = 0; // Particle Properties //C.PhysicalParameters.mu_B = 0.1; //C.particleMass = 1; C.Particles.Add(new Particle_Sphere(new double[] { 0.0, 0.6 }) { radius_P = 0.18, particleDensity = 4, GravityVertical = -9.81, AddaptiveUnderrelaxation = true, underrelaxation_factor = 9,// underrelaxation with [factor * 10^exponent] ClearSmallValues = true, neglectAddedDamping = false, IncludeRotation = false }); C.Particles.Add(new Particle_superEllipsoid(new double[] { 0.45, 0 }, startAngl: 45) { particleDensity = 1, thickness_P = 0.2, length_P = 0.4, //radius_P = 0.4, superEllipsoidExponent = 4, GravityVertical = -0, IncludeRotation = false, IncludeTranslation = false, }); C.Particles.Add(new Particle_superEllipsoid(new double[] { -0.45, 0 }, startAngl: -45) { particleDensity = 1, thickness_P = 0.2, length_P = 0.4, //radius_P = 0.4, superEllipsoidExponent = 4, GravityVertical = -0, IncludeRotation = false, IncludeTranslation = false, }); C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); C.PhysicalParameters.IncludeConvection = false; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = true; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.ForceAndTorque_ConvergenceCriterion = 1e-2; // Timestepping // ============ //C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-2; C.dtMax = dt; C.dtMin = dt; C.Endtime = 10.0; C.NoOfTimesteps = 50; // haben fertig... // =============== return(C); }
public static FSI_Control Test_ActiveForce(int k = 2) { FSI_Control C = new FSI_Control(); // basic database options // ============================= //C.DbPath = @"\\hpccluster\hpccluster-scratch\deussen\cluster_db\straightChannel"; C.savetodb = false; C.saveperiod = 1; C.ProjectName = "Test_singleActiveParticle"; C.ProjectDescription = "Test_singleActiveParticle"; C.SessionName = C.ProjectName; C.Tags.Add("activeParticle"); // DG degrees // ============================= C.SetDGdegree(k); // Grid // ============================= //Generating grid C.GridFunc = delegate { int q = new int(); // #Cells in x-dircetion + 1 int r = new int(); // #Cells in y-dircetion + 1 q = 40; r = 30; double[] Xnodes = GenericBlas.Linspace(-4, 4, q); double[] Ynodes = GenericBlas.Linspace(-3, 3, r); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Pressure_Outlet_left"); grd.EdgeTagNames.Add(2, "Pressure_Outlet_right"); grd.EdgeTagNames.Add(3, "Wall_lower"); grd.EdgeTagNames.Add(4, "Wall_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-4)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-4)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (-3)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-3)) <= 1.0e-8) { et = 4; } Debug.Assert(et != 0); return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; // Mesh refinement // ============================= C.AdaptiveMeshRefinement = false; C.RefinementLevel = 1; // Boundary conditions // ============================= C.AddBoundaryValue("Pressure_Outlet_left"); //, "VelocityX", X => 0.0); C.AddBoundaryValue("Pressure_Outlet_right"); //, "VelocityX", X => 0.0); C.AddBoundaryValue("Wall_lower"); C.AddBoundaryValue("Wall_upper"); // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; //pg/(mum^3) C.PhysicalParameters.mu_A = 1e4; //pg(mum*s) C.PhysicalParameters.Material = true; // Particle Properties // ============================= C.Particles = new List <Particle>(); int numOfParticles = 1; for (int d = 0; d < numOfParticles; d++) { C.Particles.Add(new Particle_Ellipsoid(new double[] { 0.0, 0.0 }, startAngl: 0) { particleDensity = 1, ActiveParticle = true, ActiveStress = 1e5, thickness_P = 0.4, length_P = 1, AddaptiveUnderrelaxation = true, underrelaxation_factor = 1,// underrelaxation with [factor * 10^exponent] ClearSmallValues = true, neglectAddedDamping = false, IncludeRotation = false, IncludeTranslation = true }); } //Define level-set double phiComplete(double[] X, double t) { //Generating the correct sign int exp = C.Particles.Count - 1; double ret = Math.Pow(-1, exp); //Level-set function depending on # of particles for (int i = 0; i < C.Particles.Count; i++) { ret *= C.Particles[i].Phi_P(X); } return(ret); } // Quadrature rules // ============================= C.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; //Initial Values // ============================= C.InitialValues_Evaluators.Add("Phi", X => phiComplete(X, 0)); C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); // Physical Parameters // ============================= C.PhysicalParameters.IncludeConvection = false; // misc. solver options // ============================= C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.NonLinearSolver.MaxSolverIterations = 1000; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; C.LinearSolver.MaxSolverIterations = 1000; C.LinearSolver.MinSolverIterations = 1; C.ForceAndTorque_ConvergenceCriterion = 1e-2; C.LSunderrelax = 1.0; // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.FSI_LieSplittingFullyCoupled; C.LSunderrelax = 1; C.max_iterations_fully_coupled = 1000; // Timestepping // ============================= C.instationarySolver = true; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-3; C.dtMax = dt; C.dtMin = dt; C.Endtime = 1e-3; C.NoOfTimesteps = 1; // haben fertig... // =============== return(C); }
/// <summary> /// Testing of particle/wall interactions using a single particle /// </summary> public static FSI_Control SingleDryParticleAgainstWall(string _DbPath = null, bool MeshRefine = true) { FSI_Control C = new FSI_Control(); // basic database options // ====================== C.DbPath = _DbPath; C.savetodb = _DbPath != null; C.saveperiod = 1; C.ProjectName = "ParticleCollisionTest"; C.ProjectDescription = "Gravity"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); C.AdaptiveMeshRefinement = true; // DG degrees // ========== C.SetDGdegree(1); // grid and boundary conditions // ============================ double[] Xnodes = GenericBlas.Linspace(-1, 1, 31); double[] Ynodes = GenericBlas.Linspace(-1, 1, 31); double h = Math.Min((Xnodes[1] - Xnodes[0]), (Ynodes[1] - Ynodes[0])); C.GridFunc = delegate { var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 1; return(et); }); return(grd); }; C.AddBoundaryValue("Wall"); // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; // Fluid Properties C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.1; // Particles // ========= C.Particles.Add(new Particle_Sphere(new double[] { -0.5, -0.5 }, startAngl: 90.0) { particleDensity = 1.0, radius_P = 0.1, }); C.Particles[0].TranslationalVelocity[0][0] = +1; C.Particles[0].TranslationalVelocity[0][1] = -1; C.Particles[0].RotationalVelocity[0] = 0; C.pureDryCollisions = true; C.collisionModel = FSI_Control.CollisionModel.MomentumConservation; double V = 0; foreach (var p in C.Particles) { V = Math.Max(V, p.TranslationalVelocity[0].L2Norm()); } if (V <= 0) { throw new ArithmeticException(); } // Physical Parameters // =================== C.PhysicalParameters.IncludeConvection = true; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.AdaptiveMeshRefinement = MeshRefine; C.RefinementLevel = 1; // Timestepping // ============ //C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = (h / V) * (MeshRefine ? 0.5 * 0.5 * 0.5 * 0.2 : 0.1); C.dtMax = dt; C.dtMin = dt; C.Endtime = 100.0 / V; C.NoOfTimesteps = 500; // haben fertig... // =============== C.LevelSetSmoothing = false; return(C); }
/// <summary> /// Testing particle bouncing /// </summary> public static FSI_Control DryParticleBounce(string _DbPath = null) { FSI_Control C = new FSI_Control(); // basic database options // ====================== C.DbPath = _DbPath; C.savetodb = _DbPath != null; C.saveperiod = 1; C.ProjectName = "ParticleCollisionTest"; C.ProjectDescription = "Gravity"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); // DG degrees // ========== C.SetDGdegree(1); // grid and boundary conditions // ============================ double[] Xnodes = GenericBlas.Linspace(-1, 1, 20); double[] Ynodes = GenericBlas.Linspace(-1, 2, 30); double h = Math.Min((Xnodes[1] - Xnodes[0]), (Ynodes[1] - Ynodes[0])); C.GridFunc = delegate { var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 1; return(et); }); return(grd); }; C.AddBoundaryValue("Wall"); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; // Fluid Properties C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.1; // Particles // ========= C.Particles.Add(new Particle_Sphere(new double[] { 0.0, 0.8 }, startAngl: 0.0) { particleDensity = 1.0, radius_P = 0.15, GravityVertical = -9.81 }); C.collisionModel = FSI_Control.CollisionModel.MomentumConservation; // Physical Parameters // =================== C.pureDryCollisions = true; C.PhysicalParameters.IncludeConvection = true; C.CoefficientOfRestitution = 1; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.AdaptiveMeshRefinement = false; // Timestepping // ============ //C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-2; C.dtMax = dt; C.dtMin = dt; C.Endtime = 2; C.NoOfTimesteps = 116; // haben fertig... // =============== return(C); }
public static FSI_Control DeriabinaPentagoneFalle(int k = 2) { FSI_Control C = new FSI_Control(); const double BaseSize = 1.0; // basic database options // ====================== //C.DbPath = @"\\dc1\userspace\deriabina\bosss_db"; C.savetodb = false; C.saveperiod = 1; C.ProjectName = "ParticleCollisionTest"; C.ProjectDescription = "Gravity"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); C.AdaptiveMeshRefinement = false; C.SessionName = "fjkfjksdfhjk"; C.RefinementLevel = 3; C.pureDryCollisions = true; C.SetDGdegree(k); // grid and boundary conditions // ============================ C.GridFunc = delegate { int q = new int(); int r = new int(); q = 10; r = 10; double[] Xnodes = GenericBlas.Linspace(-1.5 * BaseSize, 1.5 * BaseSize, q + 1); double[] Ynodes = GenericBlas.Linspace(3.5 * BaseSize, 6.0 * BaseSize, r + 1); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall_left"); grd.EdgeTagNames.Add(2, "Wall_right"); grd.EdgeTagNames.Add(3, "Pressure_Outlet"); grd.EdgeTagNames.Add(4, "Wall_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-1.5 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-1.5 * BaseSize)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (3.5 * BaseSize)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-6.0 * BaseSize)) <= 1.0e-8) { et = 4; } return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; C.GridPartType = GridPartType.Hilbert; C.AddBoundaryValue("Wall_left"); C.AddBoundaryValue("Wall_right"); C.AddBoundaryValue("Pressure_Outlet"); C.AddBoundaryValue("Wall_upper"); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; // Fluid Properties C.PhysicalParameters.rho_A = 1.0; C.PhysicalParameters.mu_A = 0.1; C.CoefficientOfRestitution = 1.0; C.gravity = new double[] { 0, -9.81 }; double particleDensity = 2.01; ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions); ParticleMotionInit fix = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, true, true); C.Particles.Add(new Particle_Sphere(motion, 0.35, new double[] { -1.0, 5.5 }) { }); C.Particles.Add(new Particle_superEllipsoid(fix, 1, 0.3, 4, new double[] { 0.60, 4.0 }, startAngl: 45) { }); C.Particles.Add(new Particle_superEllipsoid(fix, 1, 0.3, 4, new double[] { -0.60, 4.0 }, startAngl: -45) { }); C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); // For restart //C.RestartInfo = new Tuple<Guid, TimestepNumber>(new Guid("42c82f3c-bdf1-4531-8472-b65feb713326"), 400); //C.GridGuid = new Guid("f1659eb6-b249-47dc-9384-7ee9452d05df"); // Physical Parameters // =================== C.PhysicalParameters.IncludeConvection = false; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; // Timestepping // ============ //C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-2; C.dtMax = dt; C.dtMin = dt; C.Endtime = 30.0; C.NoOfTimesteps = 1000000; // haben fertig... // =============== return(C); }
public static FSI_Control ParticleInShearFlow(string _DbPath = null, int k = 2, double VelXBase = 0.0) { FSI_Control C = new FSI_Control(); const double BaseSize = 1.0; // basic database options // ====================== C.savetodb = false; C.ProjectName = "ShearFlow_Test"; C.ProjectDescription = "ShearFlow"; C.Tags.Add("with immersed boundary method"); // DG degrees // ========== C.SetDGdegree(k); // grid and boundary conditions // ============================ C.GridFunc = delegate { double[] Xnodes = GenericBlas.Linspace(-2 * BaseSize, 2 * BaseSize, 21); double[] Ynodes = GenericBlas.Linspace(-3 * BaseSize, 3 * BaseSize, 31); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: true); grd.EdgeTagNames.Add(1, "Velocity_Inlet_left"); grd.EdgeTagNames.Add(2, "Velocity_Inlet_right"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-2 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-2 * BaseSize)) <= 1.0e-8) { et = 2; } Debug.Assert(et != 0); return(et); }); return(grd); }; C.AddBoundaryValue("Velocity_Inlet_left", "VelocityY", X => 0.02); C.AddBoundaryValue("Velocity_Inlet_right", "VelocityY", X => - 0.02); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties //C.LevelSetMovement = "coupled"; C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; // Particle Properties C.Particles.Add(new Particle_Sphere(new double[] { 0.0, 0.0 }) { radius_P = 0.4, particleDensity = 1.0, IncludeTranslation = false, IncludeRotation = true }); ////Define level-set //Func<double[], double, double> phiComplete = delegate (double[] X, double t) { // int exp = C.Particles.Count - 1; // double ret = Math.Pow(-1, exp); // for (int i = 0; i < C.Particles.Count; i++) { // ret *= C.Particles[i].Phi_P(X, t); // } // return ret; //}; //Func<double[], double, double> phi = (X, t) => -(X[0] - t+X[1]); //C.MovementFunc = phi; //C.InitialValues_Evaluators.Add("Phi", X => phiComplete(X, 0)); //C.InitialValues.Add("VelocityX#B", X => 1); //C.InitialValues_Evaluators.Add("VelocityX", X => 0); //C.InitialValues_Evaluators.Add("VelocityY", X => 0); //C.InitialValues.Add("Phi", X => -1); //C.InitialValues.Add("Phi", X => (X[0] - 0.41)); // For restart //C.RestartInfo = new Tuple<Guid, TimestepNumber>(new Guid("fec14187-4e12-43b6-af1e-e9d535c78668"), -1); // Physical Parameters // =================== C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.25; C.PhysicalParameters.IncludeConvection = true; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 1; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.1; C.LevelSetSmoothing = false; C.LinearSolver.SolverCode = LinearSolverConfig.Code.classic_pardiso; C.LinearSolver.MaxSolverIterations = 100; C.LinearSolver.MinSolverIterations = 1; C.NonLinearSolver.MaxSolverIterations = 100; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; // Timestepping // ============ C.Timestepper_Scheme = FSI_Control.TimesteppingScheme.BDF2; double dt = 0.1; C.dtFixed = dt; C.dtMax = dt; C.dtMin = dt; C.Endtime = 120; C.NoOfTimesteps = 100; // haben fertig... // =============== return(C); }
/// <summary> /// Testing of particle/wall interactions using a single particle /// </summary> public static FSI_Control Test_DryParticleCollision(string _DbPath = null, bool MeshRefine = false) { FSI_Control C = new FSI_Control { // basic database options // ====================== DbPath = _DbPath, savetodb = _DbPath != null, saveperiod = 1, ProjectName = "ParticleCollisionTest", ProjectDescription = "Gravity" }; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); C.AdaptiveMeshRefinement = true; // DG degrees // ========== C.SetDGdegree(1); // grid and boundary conditions // ============================ double[] Xnodes = GenericBlas.Linspace(-1, 1, 21); double[] Ynodes = GenericBlas.Linspace(-1, 1, 21); double h = Math.Min((Xnodes[1] - Xnodes[0]), (Ynodes[1] - Ynodes[0])); C.GridFunc = delegate { var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 1; return(et); }); return(grd); }; C.AddBoundaryValue("Wall"); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; // Fluid Properties C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.1; // Particles // ========= C.pureDryCollisions = true; double particleDensity = 1.0; ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions); C.Particles.Add(new Particle_Sphere(motion, 0.15, new double[] { -0.6, +0.1 }, startAngl: 90.0, startTransVelocity: new double[] { 1, 0 }, startRotVelocity: 0)); C.Particles.Add(new Particle_Sphere(motion, 0.15, new double[] { +0.6, -0.1 }, startAngl: 90.0, startTransVelocity: new double[] { -1, 0 }, startRotVelocity: 0)); C.collisionModel = FSI_Control.CollisionModel.MomentumConservation; double V = 0; foreach (var p in C.Particles) { V = Math.Max(V, p.Motion.GetTranslationalVelocity(0).L2Norm()); } if (V <= 0) { throw new ArithmeticException(); } // Physical Parameters // =================== C.PhysicalParameters.IncludeConvection = true; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.AdaptiveMeshRefinement = MeshRefine; // Timestepping // ============ //C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = (h / V) * (MeshRefine ? 0.5 * 0.5 * 0.5 * 0.2 : 0.1); C.dtMax = dt; C.dtMin = dt; C.Endtime = 100.0 / V; C.NoOfTimesteps = 200; // haben fertig... // =============== return(C); }
public static FSI_Control Test_HydrodynamicForces(int k = 2) { FSI_Control C = new FSI_Control { // basic database options // ============================= //C.DbPath = @"\\hpccluster\hpccluster-scratch\deussen\cluster_db\straightChannel"; savetodb = false, saveperiod = 1, ProjectName = "Test_singleActiveParticle", ProjectDescription = "Test_singleActiveParticle" }; C.SessionName = C.ProjectName; C.Tags.Add("activeParticle"); // DG degrees // ============================= C.SetDGdegree(k); // Grid // ============================= //Generating grid C.GridFunc = delegate { int q = new int(); // #Cells in x-dircetion + 1 int r = new int(); // #Cells in y-dircetion + 1 q = 40; r = 30; double[] Xnodes = GenericBlas.Linspace(-4, 4, q); double[] Ynodes = GenericBlas.Linspace(-3, 3, r); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Velocity_Inlet_left"); grd.EdgeTagNames.Add(2, "Pressure_Outlet_right"); grd.EdgeTagNames.Add(3, "Wall_lower"); grd.EdgeTagNames.Add(4, "Wall_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-4)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-4)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (-3)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-3)) <= 1.0e-8) { et = 4; } Debug.Assert(et != 0); return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; // Mesh refinement // ============================= C.AdaptiveMeshRefinement = false; C.RefinementLevel = 1; // Boundary conditions // ============================= C.AddBoundaryValue("Velocity_Inlet_left", "VelocityX", X => 1.0); C.AddBoundaryValue("Pressure_Outlet_right");//, "VelocityX", X => 0.0); C.AddBoundaryValue("Wall_lower"); C.AddBoundaryValue("Wall_upper"); // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 0.1; //pg/(mum^3) C.PhysicalParameters.mu_A = 1e-1; //pg(mum*s) C.PhysicalParameters.Material = true; C.gravity = new double[] { 0, 0 }; double particleDensity = 1.0; C.hydrodynamicsConvergenceCriterion = 1e-2; ParticleUnderrelaxationParam underrelaxationParam = new ParticleUnderrelaxationParam(C.hydrodynamicsConvergenceCriterion, ParticleUnderrelaxationParam.UnderrelaxationMethod.ProcentualRelaxation, 9, true); ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, false, false, underrelaxationParam, 1); // Particle Properties // ============================= C.Particles = new List <Particle>(); int numOfParticles = 1; for (int d = 0; d < numOfParticles; d++) { C.Particles.Add(new Particle_Sphere(motion, 0.5, new double[] { 0.0, 0.0 }, startAngl: 0)); } // Quadrature rules // ============================= C.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; //Initial Values // ============================= C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); // Physical Parameters // ============================= C.PhysicalParameters.IncludeConvection = true; // misc. solver options // ============================= C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.NonLinearSolver.MaxSolverIterations = 1000; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; C.LinearSolver.MaxSolverIterations = 1000; C.LinearSolver.MinSolverIterations = 1; C.LSunderrelax = 1.0; // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.FSI_LieSplittingFullyCoupled; C.LSunderrelax = 1; C.maxIterationsFullyCoupled = 1000; // Timestepping // ============================= C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-3; C.dtMax = dt; C.dtMin = dt; C.Endtime = 1e-3; C.NoOfTimesteps = 2; // haben fertig... // =============== return(C); }
public static FSI_Control Test_ParticleParameter(int k = 2) { FSI_Control C = new FSI_Control(); const double BaseSize = 1.0; // basic database options // ====================== //C.DbPath = @"\\dc1\userspace\deriabina\bosss_db"; C.savetodb = false; C.saveperiod = 1; C.ProjectName = "ParticleCollisionTest"; C.ProjectDescription = "Gravity"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); C.AdaptiveMeshRefinement = false; C.RefinementLevel = 1; C.SessionName = "fjkfjksdfhjk"; C.pureDryCollisions = true; C.SetDGdegree(k); // grid and boundary conditions // ============================ C.GridFunc = delegate { int q, r; q = 30; r = 20; double[] Xnodes = GenericBlas.Linspace(-1 * BaseSize, 7 * BaseSize, q + 1); double[] Ynodes = GenericBlas.Linspace(-2 * BaseSize, 2 * BaseSize, r + 1); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Pressure_Outlet_left"); grd.EdgeTagNames.Add(2, "Pressure_Outlet_right"); grd.EdgeTagNames.Add(3, "Pressure_Outlet_lower"); grd.EdgeTagNames.Add(4, "Pressure_Outlet_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-1 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-7 * BaseSize)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (-2 * BaseSize)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-2 * BaseSize)) <= 1.0e-8) { et = 4; } return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; C.GridPartType = GridPartType.Hilbert; C.AddBoundaryValue("Pressure_Outlet_left"); C.AddBoundaryValue("Pressure_Outlet_right"); C.AddBoundaryValue("Pressure_Outlet_lower"); C.AddBoundaryValue("Pressure_Outlet_upper"); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; // Fluid Properties C.PhysicalParameters.rho_A = 1.0; C.PhysicalParameters.mu_A = 0.1; C.CoefficientOfRestitution = 0; double particleDensity1 = 2; ParticleMotionInit motion1 = new ParticleMotionInit(C.gravity, particleDensity1, C.pureDryCollisions); double particleDensity2 = 1; ParticleMotionInit motion2 = new ParticleMotionInit(C.gravity, particleDensity2, C.pureDryCollisions); C.Particles.Add(new Particle_Sphere(motion1, 1, new double[] { 0.0, 0.0 })); C.Particles.Add(new Particle_Ellipsoid(motion2, 1, 1, new double[] { 0.0, 4.0 }, startAngl: 0)); C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); C.PhysicalParameters.IncludeConvection = false; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = true; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.hydrodynamicsConvergenceCriterion = 1e-2; // Timestepping // ============ C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-2; C.dtMax = dt; C.dtMin = dt; C.Endtime = 1e-2; C.NoOfTimesteps = 1; // haben fertig... // =============== return(C); }
public static FSI_Control Test_ParticleInShearFlow(int k = 2) { FSI_Control C = new FSI_Control(); const double BaseSize = 1.0; // basic database options // ====================== C.savetodb = false; C.ProjectName = "ShearFlow_Test"; C.ProjectDescription = "ShearFlow"; C.Tags.Add("with immersed boundary method"); // DG degrees // ========== C.SetDGdegree(k); // grid and boundary conditions // ============================ C.GridFunc = delegate { double[] Xnodes = GenericBlas.Linspace(-2 * BaseSize, 2 * BaseSize, 21); double[] Ynodes = GenericBlas.Linspace(-3 * BaseSize, 3 * BaseSize, 31); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: true); grd.EdgeTagNames.Add(1, "Velocity_Inlet_left"); grd.EdgeTagNames.Add(2, "Velocity_Inlet_right"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-2 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-2 * BaseSize)) <= 1.0e-8) { et = 2; } Debug.Assert(et != 0); return(et); }); return(grd); }; C.AddBoundaryValue("Velocity_Inlet_left", "VelocityY", X => 0.02); C.AddBoundaryValue("Velocity_Inlet_right", "VelocityY", X => - 0.02); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; C.gravity = new double[] { 0, 0 }; double particleDensity = 1; ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, false, true); C.Particles.Add(new Particle_Sphere(motion, 0.4, new double[] { 0.0, 0.0 })); // For restart //C.RestartInfo = new Tuple<Guid, TimestepNumber>(new Guid("fec14187-4e12-43b6-af1e-e9d535c78668"), -1); // Physical Parameters // =================== C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.25; C.PhysicalParameters.IncludeConvection = true; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 1; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.1; C.LevelSetSmoothing = false; C.LinearSolver.SolverCode = LinearSolverCode.classic_pardiso; C.LinearSolver.MaxSolverIterations = 100; C.LinearSolver.MinSolverIterations = 1; C.NonLinearSolver.MaxSolverIterations = 100; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; // Timestepping // ============ C.Timestepper_Scheme = FSI_Control.TimesteppingScheme.BDF2; double dt = 0.1; C.dtFixed = dt; C.dtMax = dt; C.dtMin = dt; C.Endtime = 120; C.NoOfTimesteps = 100; // haben fertig... // =============== return(C); }
/// <summary> /// Testing of particle/wall interactions using a single particle /// </summary> public static FSI_Control HundredDryActiveParticles(string _DbPath = null) { FSI_Control C = new FSI_Control(); // basic database options // ====================== C.DbPath = _DbPath; C.savetodb = _DbPath != null; C.saveperiod = 1; C.ProjectName = "ParticleCollisionTest"; C.ProjectDescription = "Gravity"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); C.pureDryCollisions = true; // DG degrees // ========== C.SetDGdegree(2); // grid and boundary conditions // ============================ double[] Xnodes = GenericBlas.Linspace(-6, 6, 120); double[] Ynodes = GenericBlas.Linspace(-6, 6, 120); double h = Math.Min((Xnodes[1] - Xnodes[0]), (Ynodes[1] - Ynodes[0])); C.GridFunc = delegate { var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 1; return(et); }); return(grd); }; C.AddBoundaryValue("Wall"); // Boundary values for level-set //C.BoundaryFunc = new Func<double, double>[] { (t) => 0.1 * 2 * Math.PI * -Math.Sin(Math.PI * 2 * 1 * t), (t) => 0}; //C.BoundaryFunc = new Func<double, double>[] { (t) => 0, (t) => 0 }; // Initial Values // ============== // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; // Fluid Properties C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.1; // Particles // ========= for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { double StartAngle = 10 * i - 10 * i * j + 8; C.Particles.Add(new Particle_Ellipsoid(new double[] { -4 + 2 * i + Math.Pow(-1, j) * 0.5, -4 + 2 * j }, StartAngle) { particleDensity = 100.0, length_P = 0.5, thickness_P = 0.4, GravityVertical = -0.001, //ActiveVelocity = 1, }); } } C.collisionModel = FSI_Control.CollisionModel.MomentumConservation; // Physical Parameters // =================== C.PhysicalParameters.IncludeConvection = true; // misc. solver options // ==================== C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.LevelSetSmoothing = false; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.AdaptiveMeshRefinement = false; C.RefinementLevel = 1; // Timestepping // ============ //C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-1; C.dtMax = dt; C.dtMin = dt; C.Endtime = 100000000.0; C.NoOfTimesteps = 225000000; // haben fertig... // =============== return(C); }
public static FSI_Control TestActiveParticle(string _DbPath = null, int k = 2, double VelXBase = 0.0, double stressM = 1e0, double cellAgg = 0.2, int maxCurv = 20, double muA = 1e0, double timestepX = 1e-3) { FSI_Control C = new FSI_Control(); // General scaling parameter // ============================= const double BaseSize = 1.0e0; // basic database options // ============================= //C.DbPath = @"\\hpccluster\hpccluster-scratch\deussen\cluster_db\active_particle_test"; C.savetodb = false; C.saveperiod = 1; C.ProjectName = "ActiveParticleTest"; C.ProjectDescription = "Active"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); // DG degrees // ============================= C.SetDGdegree(k); // Grid // ============================= //Generating grid C.GridFunc = delegate { int q = new int(); // #Cells in x-dircetion + 1 int r = new int(); // #Cells in y-dircetion + 1 q = 20; r = 8; double[] Xnodes = GenericBlas.Linspace(-5 * BaseSize, 5 * BaseSize, q); double[] Ynodes = GenericBlas.Linspace(-2 * BaseSize, 2 * BaseSize, r); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Wall_left"); grd.EdgeTagNames.Add(2, "Wall_right"); grd.EdgeTagNames.Add(3, "Wall_lower"); grd.EdgeTagNames.Add(4, "Wall_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-5 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-5 * BaseSize)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (-2 * BaseSize)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-2 * BaseSize)) <= 1.0e-8) { et = 4; } Debug.Assert(et != 0); return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; // Mesh refinement // ============================= C.AdaptiveMeshRefinement = true; C.RefinementLevel = 2; C.maxCurvature = maxCurv; // Boundary conditions // ============================= C.AddBoundaryValue("Wall_left"); //, "VelocityX", X => 0.0); C.AddBoundaryValue("Wall_right"); //, "VelocityX", X => 0.0); C.AddBoundaryValue("Wall_lower"); C.AddBoundaryValue("Wall_upper"); // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 0.9982e0; //pg/(mum^3) C.PhysicalParameters.mu_A = muA; //pg(mum*s) C.PhysicalParameters.Material = true; // Particle Properties // ============================= // Defining particles int numOfParticles = 1; for (int d = 0; d < numOfParticles; d++) { C.Particles.Add(new Particle_Sphere(new double[] { 0 + 14 * d, 0.0 }, startAngl: 180 * d) { radius_P = 1, particleDensity = 1.5,//pg/(mum^3) GravityVertical = 0, ActiveParticle = true, ActiveStress = stressM, //thickness_P = 0.1 * BaseSize, Sphere kann nur einen radius haben! fk. //length_P = 2 * BaseSize, Sphere kann nur einen radius haben! fk. //superEllipsoidExponent = 4, // only even numbers are supported AddaptiveUnderrelaxation = true, // set true if you want to define a constant underrelaxation (not recommended) underrelaxation_factor = 9, // underrelaxation with [factor * 10^exponent] }); } //Define level-set //Func<double[], double, double> phiComplete = delegate (double[] X, double t) //{ // //Generating the correct sign // int exp = C.Particles.Count - 1; // double ret = Math.Pow(-1, exp); // //Level-set function depending on #particles // for (int i = 0; i < C.Particles.Count; i++) // { // ret *= C.Particles[i].Phi_P(X); // } // return ret; //}; // Quadrature rules // ============================= C.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; //Initial Values // ============================= //C.InitialValues_Evaluators.Add("Phi", X => phiComplete(X, 0)); C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); // For restart // ============================= //C.RestartInfo = new Tuple<Guid, TimestepNumber>(new Guid("42c82f3c-bdf1-4531-8472-b65feb713326"), 400); //C.GridGuid = new Guid("f1659eb6 -b249-47dc-9384-7ee9452d05df"); // Physical Parameters // ============================= C.PhysicalParameters.IncludeConvection = false; // misc. solver options // ============================= C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = cellAgg; C.LevelSetSmoothing = false; //C.MaxSolverIterations = 1000; //C.MinSolverIterations = 1; //C.NoOfMultigridLevels = 1; C.NonLinearSolver.MaxSolverIterations = 1000; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.MaxSolverIterations = 1000; C.LinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; C.ForceAndTorque_ConvergenceCriterion = 1e-6; C.LSunderrelax = 1.0; // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; C.max_iterations_fully_coupled = 10000; // Timestepping // ============================= //switch (C.Timestepper_LevelSetHandling) //{ // case LevelSetHandling.Coupled_Once: // C.Timestepper_Mode = FSI_Control.TimesteppingMode.MovingMesh; // break; // case LevelSetHandling.Coupled_Iterative: // C.Timestepper_Mode = FSI_Control.TimesteppingMode.MovingMesh; // break; // case LevelSetHandling.LieSplitting: // C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; // break; // case LevelSetHandling.StrangSplitting: // C.Timestepper_Mode = FSI_Control.TimesteppingMode.Splitting; // break; // case LevelSetHandling.None: // C.Timestepper_Mode = FSI_Control.TimesteppingMode.None; // break; //} C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = timestepX;//s C.dtMax = dt; C.dtMin = dt; C.Endtime = 1000000; C.NoOfTimesteps = 10000; // haben fertig... // =============== return(C); }
public static FSI_Control ActiveRod_noBackroundFlow(string _DbPath = null, int k = 2, double VelXBase = 0.0, double stressM = 1e3, double cellAgg = 0.2, double muA = 1e4, double timestepX = 1e-3) { FSI_Control C = new FSI_Control(); // General scaling parameter // ============================= const double BaseSize = 1.0; // basic database options // ============================= C.DbPath = @"\\hpccluster\hpccluster-scratch\deussen\cluster_db\tiltedChannel"; C.savetodb = false; C.saveperiod = 1; C.ProjectName = "activeRod_noBackroundFlow"; C.ProjectDescription = "Active"; C.SessionName = C.ProjectName; C.Tags.Add("with immersed boundary method"); // DG degrees // ============================= C.SetDGdegree(k); // Grid // ============================= //Generating grid C.GridFunc = delegate { int q = new int(); // #Cells in x-dircetion + 1 int r = new int(); // #Cells in y-dircetion + 1 q = 75 / 3; r = 60 / 3; double[] Xnodes = GenericBlas.Linspace(-2 * BaseSize, 13 * BaseSize, q); double[] Ynodes = GenericBlas.Linspace(-6 * BaseSize, 6 * BaseSize, r); var grd = Grid2D.Cartesian2DGrid(Xnodes, Ynodes, periodicX: false, periodicY: false); grd.EdgeTagNames.Add(1, "Pressure_Outlet_left"); grd.EdgeTagNames.Add(2, "Pressure_Outlet_right"); grd.EdgeTagNames.Add(3, "Wall_lower"); grd.EdgeTagNames.Add(4, "Wall_upper"); grd.DefineEdgeTags(delegate(double[] X) { byte et = 0; if (Math.Abs(X[0] - (-2 * BaseSize)) <= 1.0e-8) { et = 1; } if (Math.Abs(X[0] + (-13 * BaseSize)) <= 1.0e-8) { et = 2; } if (Math.Abs(X[1] - (-6 * BaseSize)) <= 1.0e-8) { et = 3; } if (Math.Abs(X[1] + (-6 * BaseSize)) <= 1.0e-8) { et = 4; } Debug.Assert(et != 0); return(et); }); Console.WriteLine("Cells:" + grd.NumberOfCells); return(grd); }; // Mesh refinement // ============================= C.AdaptiveMeshRefinement = true; C.RefinementLevel = 2; C.maxCurvature = 2; // Boundary conditions // ============================= C.AddBoundaryValue("Pressure_Outlet_left"); //, "VelocityX", X => 0.0); C.AddBoundaryValue("Pressure_Outlet_right"); //, "VelocityX", X => 0.0); C.AddBoundaryValue("Wall_lower"); C.AddBoundaryValue("Wall_upper"); // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; //pg/(mum^3) C.PhysicalParameters.mu_A = muA; //pg(mum*s) C.PhysicalParameters.Material = true; // Particle Properties // ============================= // Defining particles int numOfParticles = 1; for (int d = 0; d < numOfParticles; d++) { C.Particles.Add(new Particle_Ellipsoid(new double[] { 5.0, 0.0 }, startAngl: 10) { particleDensity = 0, ActiveParticle = true, ActiveStress = stressM, thickness_P = 0.6 * BaseSize, length_P = 1.5 * BaseSize, AddaptiveUnderrelaxation = true, // set true if you want to define a constant underrelaxation (not recommended) underrelaxation_factor = 0.5, // underrelaxation with [factor * 10^exponent] ClearSmallValues = true, neglectAddedDamping = false }); } //Define level-set double phiComplete(double[] X, double t) { //Generating the correct sign int exp = C.Particles.Count - 1; double ret = Math.Pow(-1, exp); //Level-set function depending on # of particles for (int i = 0; i < C.Particles.Count; i++) { ret *= C.Particles[i].Phi_P(X); } return(ret); } // Quadrature rules // ============================= C.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; //Initial Values // ============================= C.InitialValues_Evaluators.Add("Phi", X => phiComplete(X, 0)); C.InitialValues_Evaluators.Add("VelocityX", X => 0); C.InitialValues_Evaluators.Add("VelocityY", X => 0); // For restart // ============================= //C.RestartInfo = new Tuple<Guid, TimestepNumber>(new Guid("42c82f3c-bdf1-4531-8472-b65feb713326"), 400); //C.GridGuid = new Guid("f1659eb6 -b249-47dc-9384-7ee9452d05df"); // Physical Parameters // ============================= C.PhysicalParameters.IncludeConvection = false; // misc. solver options // ============================= C.AdvancedDiscretizationOptions.PenaltySafety = 4; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = cellAgg; C.LevelSetSmoothing = false; C.NonLinearSolver.MaxSolverIterations = 1000; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; C.LinearSolver.MaxSolverIterations = 1000; C.LinearSolver.MinSolverIterations = 1; C.ForceAndTorque_ConvergenceCriterion = 10; C.LSunderrelax = 1.0; // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; C.LSunderrelax = 1; C.max_iterations_fully_coupled = 10000; // Timestepping // ============================= C.instationarySolver = true; C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = timestepX; C.dtMax = dt; C.dtMin = dt; C.Endtime = 1000000; C.NoOfTimesteps = 10000; // haben fertig... // =============== return(C); }