public static FSI_Control TwoSpheres(int k = 2) { FSI_Control C = new FSI_Control(degree: k, projectName: "TwoSpheres"); List <string> boundaryValues = new List <string> { "Wall" }; C.SetBoundaries(boundaryValues); C.SetGrid(lengthX: 4, lengthY: 4, cellsPerUnitLength: 20, periodicX: false, periodicY: false); // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 1; C.PhysicalParameters.IncludeConvection = false; C.pureDryCollisions = true; C.gravity = new double[] { 0, -9.81 }; // Particle Properties // ============================= double particleDensity = 1; ParticleMotionInit motion1 = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, false, false); ParticleMotionInit motion2 = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, true, true); C.Particles.Add(new Particle_Ellipsoid(motion1, 0.25, 0.1, new double[] { 0, 0.5 }, startAngl: 45, activeStress: 0)); C.Particles.Add(new Particle_Ellipsoid(motion2, 0.25, 0.1, new double[] { 0, 0 }, startAngl: 0, activeStress: 0)); // misc. solver options // ============================= C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-3; C.dtMax = dt; C.dtMin = dt; C.Endtime = 1000000; C.NoOfTimesteps = 100; 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.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; C.LSunderrelax = 1; C.maxIterationsFullyCoupled = 1000000; return(C); }
/// <summary> /// Constructor for a sphere. /// </summary> /// <param name="motionInit"> /// Initializes the motion parameters of the particle (which model to use, whether it is a dry simulation etc.) /// </param> /// <param name="radius"> /// The radius. /// </param> /// <param name="startPos"> /// The initial position. /// </param> /// <param name="startAngl"> /// The inital anlge. /// </param> /// <param name="activeStress"> /// The active stress excerted on the fluid by the particle. Zero for passive particles. /// </param> /// <param name="startTransVelocity"> /// The inital translational velocity. /// </param> /// <param name="startRotVelocity"> /// The inital rotational velocity. /// </param> public Particle_Sphere(ParticleMotionInit motionInit, double radius, double[] startPos = null, double startAngl = 0, double activeStress = 0, double[] startTransVelocity = null, double startRotVelocity = 0) : base(motionInit, startPos, startAngl, activeStress, startTransVelocity, startRotVelocity) { m_Radius = radius; Aux.TestArithmeticException(radius, "Particle radius"); Motion.GetParticleLengthscale(radius); Motion.GetParticleMinimalLengthscale(radius); Motion.GetParticleArea(Area); Motion.GetParticleMomentOfInertia(MomentOfInertia); }
/// <summary> /// Constructor for the trap used in the masters thesis if E. Deriabina (2019) /// </summary> /// <param name="motionInit"> /// Initializes the motion parameters of the particle (which model to use, whether it is a dry simulation etc.) /// </param> /// <param name="width"> /// The main lengthscale. /// </param> /// <param name="startPos"> /// The initial position. /// </param> /// <param name="startAngl"> /// The inital anlge. /// </param> /// <param name="activeStress"> /// The active stress excerted on the fluid by the particle. Zero for passive particles. /// </param> /// <param name="startTransVelocity"> /// The inital translational velocity. /// </param> /// <param name="startRotVelocity"> /// The inital rotational velocity. /// </param> public Particle_TrapRight(ParticleMotionInit motionInit, double width, double[] startPos = null, double startAngl = 0, double activeStress = 0, double[] startTransVelocity = null, double startRotVelocity = 0) : base(motionInit, startPos, startAngl, activeStress, startTransVelocity, startRotVelocity) { m_Length = width; Aux.TestArithmeticException(width, "Particle width"); Motion.GetParticleLengthscale(width); Motion.GetParticleMinimalLengthscale(width); Motion.GetParticleArea(Area); Motion.GetParticleMomentOfInertia(MomentOfInertia); }
/// <summary> /// Constructor for a hippopede. /// </summary> /// <param name="motionInit"> /// Initializes the motion parameters of the particle (which model to use, whether it is a dry simulation etc.) /// </param> /// <param name="length"> /// The length of the horizontal halfaxis. /// </param> /// <param name="thickness"> /// The length of the vertical halfaxis. /// </param> /// <param name="startPos"> /// The initial position. /// </param> /// <param name="startAngl"> /// The inital anlge. /// </param> /// <param name="activeStress"> /// The active stress excerted on the fluid by the particle. Zero for passive particles. /// </param> /// <param name="startTransVelocity"> /// The inital translational velocity. /// </param> /// <param name="startRotVelocity"> /// The inital rotational velocity. /// </param> public Particle_Hippopede(ParticleMotionInit motionInit, double length, double thickness, double[] startPos = null, double startAngl = 0, double activeStress = 0, double[] startTransVelocity = null, double startRotVelocity = 0) : base(motionInit, startPos, activeStress, startAngl, startTransVelocity, startRotVelocity) { m_Length = length; m_Thickness = thickness; Aux.TestArithmeticException(length, "Particle length"); Aux.TestArithmeticException(thickness, "Particle thickness"); Motion.GetParticleLengthscale(GetLengthScales().Max()); Motion.GetParticleMinimalLengthscale(GetLengthScales().Min()); Motion.GetParticleArea(Area); Motion.GetParticleMomentOfInertia(MomentOfInertia); }
/// <summary> /// Constructor for an arbitrary particle to be implemented in the Particle_Shape classes. /// </summary> /// <param name="motionInit"> /// Initializes the motion parameters of the particle (which model to use, whether it is a dry simulation etc.) /// </param> /// <param name="startPos"> /// The initial position. /// </param> /// <param name="startAngl"> /// The inital anlge. /// </param> /// <param name="activeStress"> /// The active stress excerted on the fluid by the particle. Zero for passive particles. /// </param> /// <param name="startTransVelocity"> /// The inital translational velocity. /// </param> /// <param name="startRotVelocity"> /// The inital rotational velocity. /// </param> public Particle(ParticleMotionInit motionInit, double[] startPos, double startAngl = 0.0, double activeStress = 0, double[] startTransVelocity = null, double startRotVelocity = 0) { SpatialDim = startPos.Length; ActiveStress = activeStress; m_MotionInit = motionInit; Aux = new FSI_Auxillary(); m_MotionInit.CheckInput(); Motion = m_MotionInit.ParticleMotion; Motion.InitializeParticlePositionAndAngle(startPos, startAngl); Motion.InitializeParticleVelocity(startTransVelocity, startRotVelocity); particleDensity = Motion.Density; }
/// <summary> /// Constructor for a superellipsoid. /// </summary> /// <param name="motionInit"> /// Initializes the motion parameters of the particle (which model to use, whether it is a dry simulation etc.) /// </param> /// <param name="length"> /// The length of the horizontal halfaxis. /// </param> /// <param name="thickness"> /// The length of the vertical halfaxis. /// </param> /// <param name="superEllipsoidExponent"> /// The exponent of the superellipsoid. /// </param> /// <param name="startPos"> /// The initial position. /// </param> /// <param name="startAngl"> /// The inital anlge. /// </param> /// <param name="activeStress"> /// The active stress excerted on the fluid by the particle. Zero for passive particles. /// </param> /// <param name="startTransVelocity"> /// The inital translational velocity. /// </param> /// <param name="startRotVelocity"> /// The inital rotational velocity. /// </param> public Particle_superEllipsoid(ParticleMotionInit motionInit, double length, double thickness, int superEllipsoidExponent, double[] startPos = null, double startAngl = 0, double activeStress = 0, double[] startTransVelocity = null, double startRotVelocity = 0) : base(motionInit, startPos, startAngl, activeStress, startTransVelocity, startRotVelocity) { m_Length = length; m_Thickness = thickness; m_Exponent = superEllipsoidExponent; Aux.TestArithmeticException(length, "Particle length"); Aux.TestArithmeticException(thickness, "Particle thickness"); Aux.TestArithmeticException(superEllipsoidExponent, "super ellipsoid exponent"); Motion.GetParticleLengthscale(GetLengthScales().Max()); Motion.GetParticleMinimalLengthscale(GetLengthScales().Min()); Motion.GetParticleArea(Area); Motion.GetParticleMomentOfInertia(MomentOfInertia); }
public static FSI_Control ActiveRod_noWalls(int k = 3) { FSI_Control C = new FSI_Control(k, "activeRod_noBackroundFlow", "active Particles"); C.SetSaveOptions(dataBasePath: @"\\hpccluster\hpccluster-scratch\deussen\cluster_db\Channel", savePeriod: 1); // Domain // ============================= List <string> boundaryValues = new List <string> { "Pressure_Outlet" }; C.SetBoundaries(boundaryValues); C.SetGrid(lengthX: 20, lengthY: 8, cellsPerUnitLength: 1, periodicX: false, periodicY: false); C.SetAddaptiveMeshRefinement(amrLevel: 6); // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.FSI_LieSplittingFullyCoupled; C.maxIterationsFullyCoupled = 100000; C.hydrodynamicsConvergenceCriterion = 1e-1; // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 1; C.PhysicalParameters.IncludeConvection = true; C.gravity = new double[] { 0, 0 }; double particleDensity = 1; // Particle Properties // ============================= C.underrelaxationParam = new ParticleUnderrelaxationParam(C.hydrodynamicsConvergenceCriterion, ParticleUnderrelaxationParam.UnderrelaxationMethod.ProcentualRelaxation, relaxationFactor: 3.0, useAddaptiveUnderrelaxation: true); ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, false, false, false, C.underrelaxationParam, 1); C.Particles = new List <Particle> { new Particle_Ellipsoid(motion, 0.5, 0.05, new double[] { 0.0, 0.0 }, startAngl: 0, activeStress: 1) }; // 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"); // misc. solver options // ============================= 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; // Timestepping // ============================= C.Timestepper_Scheme = IBM_Solver.IBM_Control.TimesteppingScheme.BDF2; C.SetTimesteps(dt: 1e-3, noOfTimesteps: 1000000000); return(C); }
public static FSI_Control ActiveRods_noBackroundFlow(int k = 2) { FSI_Control C = new FSI_Control(degree: k, projectName: "9_active_Rods"); C.SetSaveOptions(@"\\hpccluster\hpccluster-scratch\deussen\cluster_db\25_particles", 1); List <string> boundaryValues = new List <string> { "Wall" }; int sqrtPart = 2; C.SetBoundaries(boundaryValues); C.SetGrid(lengthX: sqrtPart + 1, lengthY: sqrtPart + 1, cellsPerUnitLength: 4, periodicX: false, periodicY: false); C.SetAddaptiveMeshRefinement(amrLevel: 1); C.hydrodynamicsConvergenceCriterion = 1e-3; // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.01; C.PhysicalParameters.IncludeConvection = false; // Particle Properties // ============================= double particleDensity = 2; C.underrelaxationParam = new ParticleUnderrelaxationParam(C.hydrodynamicsConvergenceCriterion, ParticleUnderrelaxationParam.UnderrelaxationMethod.ProcentualRelaxation, relaxationFactor: 3.0, useAddaptiveUnderrelaxation: true); ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, false, false, false, C.underrelaxationParam, 1); for (int x = 0; x < sqrtPart; x++) { for (int y = 0; y < sqrtPart; y++) { C.Particles.Add(new Particle_Ellipsoid(motion, 0.25, 0.1, new double[] { -0.5 + 1 * x, 0.5 - 1 * y }, startAngl: 180 - 30 - 90 * (x - y) + 180 * (1 - x * y), activeStress: 50)); } } // misc. solver options // ============================= C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-3; C.dtMax = dt; C.dtMin = dt; C.Endtime = 100000000; C.NoOfTimesteps = 1000000; 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.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; C.Timestepper_LevelSetHandling = LevelSetHandling.FSI_LieSplittingFullyCoupled; C.LSunderrelax = 1; C.maxIterationsFullyCoupled = 1000000; return(C); }
public static FSI_Control WetParticleWallCollision(int k = 3, double DensityFactor = 2500, int amrLevel = 4) { FSI_Control C = new FSI_Control(degree: k, projectName: "wetParticleWallCollision"); C.SetSaveOptions(@"D:\BoSSS_databases\wetParticleCollision", 1); List <string> boundaryValues = new List <string> { "Pressure_Outlet_left", "Pressure_Outlet_right", "Wall_lower", "Pressure_Outlet_upper" }; C.SetBoundaries(boundaryValues); C.SetGrid(lengthX: 2, lengthY: 2, cellsPerUnitLength: 1, periodicX: false, periodicY: false); C.SetAddaptiveMeshRefinement(amrLevel); C.hydrodynamicsConvergenceCriterion = 1e-6; // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 1; C.PhysicalParameters.Material = true; C.gravity = new double[] { 0, -5 }; double particleDensity = 1 * DensityFactor; // Particle Properties // ============================= // Defining particles C.Particles = new List <Particle>(); C.underrelaxationParam = new ParticleUnderrelaxationParam(convergenceLimit: C.hydrodynamicsConvergenceCriterion, relaxationFactor: 1.0, useAddaptiveUnderrelaxation: true); ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, false, false, false, C.underrelaxationParam, 1); C.Particles.Add(new Particle_Sphere(motion, 0.25, new double[] { 0.0, 0.0 }, 0, 0, new double[] { 0, 0 })); // Quadrature rules // ============================= C.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; // 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.LSunderrelax = 1.0; // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; C.LSunderrelax = 1; C.maxIterationsFullyCoupled = 2000; // Timestepping // ============================= C.Timestepper_Scheme = IBM_Solver.IBM_Control.TimesteppingScheme.BDF2; C.SetTimesteps(dt: 1e-3, noOfTimesteps: 2500); // haben fertig... // =============== return(C); }
public static FSI_Control Main(int k = 2, int amrLevel = 2, double aspectRatio = 2, double relaxationFactor = 0.3, bool addaptiveUnderrelaxation = true, double conv = 1e-6) { FSI_Control C = new FSI_Control(k, "activeRod_noBackroundFlow", "active Particles"); C.SetSaveOptions(dataBasePath: @"D:\BoSSS_databases\Channel", savePeriod: 1); // Domain // ============================= List <string> boundaryValues = new List <string> { "Pressure_Outlet_left", "Pressure_Outlet_right", "Pressure_Outlet_lower", "Pressure_Outlet_upper" }; C.SetBoundaries(boundaryValues); C.SetGrid(lengthX: 10, lengthY: 10, cellsPerUnitLength: 1, periodicX: false, periodicY: false); C.SetAddaptiveMeshRefinement(amrLevel); // Coupling Properties // ============================= C.Timestepper_LevelSetHandling = LevelSetHandling.FSI_LieSplittingFullyCoupled; C.LevelSetSmoothing = false; C.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; C.AdvancedDiscretizationOptions.CellAgglomerationThreshold = 0.2; C.hydrodynamicsConvergenceCriterion = conv; // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 1; C.PhysicalParameters.IncludeConvection = false; double particleDensity = 1; C.gravity = new double[] { 0, 0 }; // Particle Properties // ============================= C.underrelaxationParam = new ParticleUnderrelaxationParam(C.hydrodynamicsConvergenceCriterion, ParticleUnderrelaxationParam.UnderrelaxationMethod.ProcentualRelaxation, relaxationFactor, addaptiveUnderrelaxation); ParticleMotionInit motion = new ParticleMotionInit(C.gravity, particleDensity, false, false, false, C.underrelaxationParam, 1.5); double particleRadius = 0.5; C.Particles = new List <Particle> { new Particle_Ellipsoid(motion, aspectRatio * particleRadius, particleRadius, new double[] { 0.0, 0.0 }, 0, 1) }; // misc. solver options // ============================= C.NonLinearSolver.MaxSolverIterations = 1000; C.NonLinearSolver.MinSolverIterations = 1; C.LinearSolver.NoOfMultigridLevels = 1; C.LinearSolver.MaxSolverIterations = 1000; C.LinearSolver.MinSolverIterations = 1; // Timestepping // ============================= C.Timestepper_Scheme = IBM_Solver.IBM_Control.TimesteppingScheme.BDF2; C.SetTimesteps(dt: 1e-3, noOfTimesteps: 250000); 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 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); }
public static FSI_Control RectangleTest(int k = 3) { FSI_Control C = new FSI_Control(degree: k, projectName: "9_active_Rods"); //C.SetSaveOptions(@"D:\BoSSS_databases\multipleActiveParticles", 1); List <string> boundaryValues = new List <string> { "Wall_left", "Wall_right", "Wall_lower", "Wall_upper" }; C.SetBoundaries(boundaryValues); C.SetGrid(lengthX: 3, lengthY: 3, cellsPerUnitLength: 30, periodicX: false, periodicY: false); //C.SetAddaptiveMeshRefinement(amrLevel: 2); C.hydrodynamicsConvergenceCriterion = 1e-2; // Fluid Properties // ============================= C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 1; C.PhysicalParameters.IncludeConvection = true; C.pureDryCollisions = true; C.gravity = new double[] { 0, -9.81 }; // Particle Properties // ============================= double particleDensity = 20; ParticleMotionInit motion1 = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, false, false); ParticleMotionInit motion2 = new ParticleMotionInit(C.gravity, particleDensity, C.pureDryCollisions, true, true); C.Particles.Add(new Particle_Shell(motion2, 1, 0.5, 0.2, new double[] { 0, 0 }, startAngl: 0)); C.Particles.Add(new Particle_Sphere(motion1, 0.1, new double[] { 0, 1 }, startAngl: 0)); // misc. solver options // ============================= C.Timestepper_Scheme = FSI_Solver.FSI_Control.TimesteppingScheme.BDF2; double dt = 1e-3; C.dtMax = dt; C.dtMin = dt; C.Endtime = 1000000; C.NoOfTimesteps = 1000000; 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.CutCellQuadratureType = Foundation.XDG.XQuadFactoryHelper.MomentFittingVariants.Saye; C.Timestepper_LevelSetHandling = LevelSetHandling.LieSplitting; C.LSunderrelax = 1; C.maxIterationsFullyCoupled = 1000000; 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_StickyTrap(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 = 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; C.gravity = new double[] { 0, -9.81 }; // Particle Properties //C.PhysicalParameters.mu_B = 0.1; //C.particleMass = 1; double particleDensity1 = 4.0; ParticleMotionInit motion1 = new ParticleMotionInit(C.gravity, particleDensity1, C.pureDryCollisions, true); double particleDensity2 = 1.0; ParticleMotionInit motion2 = new ParticleMotionInit(C.gravity, particleDensity2, C.pureDryCollisions, true, true); C.Particles.Add(new Particle_Sphere(motion1, 0.18, new double[] { 0.0, 0.6 })); C.Particles.Add(new Particle_superEllipsoid(motion2, 0.4, 0.2, 4, new double[] { 0.45, 0 }, startAngl: 45)); C.Particles.Add(new Particle_superEllipsoid(motion2, 0.4, 0.2, 4, new double[] { -0.45, 0 }, startAngl: -45)); 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 = false; C.LinearSolver.MaxSolverIterations = 10; C.NonLinearSolver.MaxSolverIterations = 10; C.LinearSolver.NoOfMultigridLevels = 1; C.hydrodynamicsConvergenceCriterion = 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); }
/// <summary> /// Testing particle bouncing /// </summary> public static FSI_Control Test_DryParticleBounce(string _DbPath = null) { 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"); // 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"); // Coupling Properties C.Timestepper_LevelSetHandling = LevelSetHandling.Coupled_Once; // Fluid Properties C.PhysicalParameters.rho_A = 1; C.PhysicalParameters.mu_A = 0.1; C.PhysicalParameters.IncludeConvection = true; C.CoefficientOfRestitution = 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.0, 0.8 }, 0.0)); C.collisionModel = FSI_Control.CollisionModel.MomentumConservation; // 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); }