Example #1
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="SolverConf"></param>
        /// <param name="WorkingSet"></param>
        /// <param name="WorkingSetMatrices"></param>
        public BaseSIMPLEStepVariableDensity(SolverConfiguration SolverConf, VariableSet WorkingSet, VariableMatrices WorkingSetMatrices)
        {
            this.SolverConf         = SolverConf;
            this.WorkingSet         = WorkingSet;
            this.WorkingSetMatrices = WorkingSetMatrices;

            // Construct BDF scheme for unsteady solver
            if (SolverConf.Control.Algorithm == SolutionAlgorithms.Unsteady_SIMPLE)
            {
                BDF = new BDFScheme();
            }

            // Construct SIMPLEOperators
            UnsetteledCoordinateMapping VelocityMapping = new UnsetteledCoordinateMapping(WorkingSet.VelBasis);
            UnsetteledCoordinateMapping PressureMapping = new UnsetteledCoordinateMapping(WorkingSet.PressureBasis);

            Basis[] VelBasisS = new Basis[SolverConf.SpatialDimension];
            for (int d = 0; d < SolverConf.SpatialDimension; d++)
            {
                VelBasisS[d] = WorkingSet.VelBasis;
            }
            UnsetteledCoordinateMapping VelocityVectorMapping = new UnsetteledCoordinateMapping(VelBasisS);

            OperatorsFlowField = GetOperatorsFlowField(VelocityMapping, VelocityVectorMapping, PressureMapping);

            // Construct matrix assemblies
            MatrixAssembliesFlowField = new MatrixFactoryVariableDensityFlowField(
                SolverConf,
                OperatorsFlowField,
                WorkingSetMatrices.Rho.Matrix,
                BDF,
                VelocityMapping,
                VelocityVectorMapping);
        }
Example #2
0
        /// <summary>
        /// Test code for debugging.
        /// </summary>
        /// <param name="OperatorsFlowField"></param>
        /// <param name="VelocityMapping"></param>
        /// <param name="VelocityVectorMapping"></param>
        private void SaveMatricesToTextFile(OperatorFactoryFlowFieldVariableDensity OperatorsFlowField,
                                            UnsetteledCoordinateMapping VelocityMapping, UnsetteledCoordinateMapping VelocityVectorMapping)
        {
            OperatorsFlowField.Swip2[0].OperatorMatrix.SaveToTextFileSparse("C:\\tmp\\Swip20.txt");
            OperatorsFlowField.Swip2[1].OperatorMatrix.SaveToTextFileSparse("C:\\tmp\\Swip21.txt");
            OperatorsFlowField.Swip3[0].OperatorMatrix.SaveToTextFileSparse("C:\\tmp\\Swip30.txt");
            OperatorsFlowField.Swip3[1].OperatorMatrix.SaveToTextFileSparse("C:\\tmp\\Swip31.txt");

            ViscSplit[0, 0].AssemblyMatrix.SaveToTextFileSparse("C:\\tmp\\ViscSplit00.txt");
            ViscSplit[0, 1].AssemblyMatrix.SaveToTextFileSparse("C:\\tmp\\ViscSplit01.txt");
            ViscSplit[1, 0].AssemblyMatrix.SaveToTextFileSparse("C:\\tmp\\ViscSplit10.txt");
            ViscSplit[1, 1].AssemblyMatrix.SaveToTextFileSparse("C:\\tmp\\ViscSplit11.txt");

            int[] IndicesVelocity        = VelocityMapping.GetSubvectorIndices(true, 0);
            int[] IndicesVelocityVector0 = VelocityVectorMapping.GetSubvectorIndices(true, 0);
            int[] IndicesVelocityVector1 = VelocityVectorMapping.GetSubvectorIndices(true, 1);

            MsrMatrix Swip2Mtx = new MsrMatrix(VelocityVectorMapping);

            OperatorsFlowField.Swip2[0].OperatorMatrix.WriteSubMatrixTo <IList <int>, IList <int>, IList <int>, IList <int> >(Swip2Mtx,
                                                                                                                              IndicesVelocity,
                                                                                                                              IndicesVelocityVector0,
                                                                                                                              IndicesVelocityVector0,
                                                                                                                              IndicesVelocityVector0);
            OperatorsFlowField.Swip2[0].OperatorMatrix.AccSubMatrixTo <IList <int>, IList <int>, IList <int>, IList <int> >(1.0,
                                                                                                                            Swip2Mtx,
                                                                                                                            IndicesVelocity,
                                                                                                                            IndicesVelocityVector0,
                                                                                                                            IndicesVelocityVector1,
                                                                                                                            IndicesVelocityVector1);
            OperatorsFlowField.Swip2[1].OperatorMatrix.AccSubMatrixTo <IList <int>, IList <int>, IList <int>, IList <int> >(1.0,
                                                                                                                            Swip2Mtx,
                                                                                                                            IndicesVelocity,
                                                                                                                            IndicesVelocityVector1,
                                                                                                                            IndicesVelocityVector0,
                                                                                                                            IndicesVelocityVector0);
            OperatorsFlowField.Swip2[1].OperatorMatrix.AccSubMatrixTo <IList <int>, IList <int>, IList <int>, IList <int> >(1.0,
                                                                                                                            Swip2Mtx,
                                                                                                                            IndicesVelocity,
                                                                                                                            IndicesVelocityVector1,
                                                                                                                            IndicesVelocityVector1,
                                                                                                                            IndicesVelocityVector1);

            Swip2Mtx.SaveToTextFileSparse("C:\\tmp\\Swip2.txt");
        }
Example #3
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="SolverConf"></param>
        /// <param name="OperatorsFlowField"></param>
        /// <param name="Rho"></param>
        /// <param name="BDF"></param>
        /// <param name="VelocityMapping"></param>
        /// <param name="VelocityVectorMapping"></param>
        public MatrixFactoryVariableDensityFlowField(SolverConfiguration SolverConf, OperatorFactoryFlowFieldVariableDensity OperatorsFlowField,
                                                     BlockDiagonalMatrix Rho, BDFScheme BDF,
                                                     UnsetteledCoordinateMapping VelocityMapping, UnsetteledCoordinateMapping VelocityVectorMapping)
        {
            // Initialize Predictor
            // ====================

            ViscSplit = new SIMPLEMatrixAssembly[SolverConf.SpatialDimension, SolverConf.SpatialDimension];
            for (int i = 0; i < SolverConf.SpatialDimension; i++)
            {
                for (int j = 0; j < SolverConf.SpatialDimension; j++)
                {
                    switch (SolverConf.Control.PhysicsMode)
                    {
                    case PhysicsMode.LowMach:
                        ViscSplit[i, j] = new MatrixAssemblyViscSplit(OperatorsFlowField.Swip2[i], OperatorsFlowField.Swip3[i],
                                                                      j, VelocityMapping, VelocityVectorMapping);
                        break;

                    case PhysicsMode.Multiphase:
                        ViscSplit[i, j] = new MatrixAssemblyViscSplit(OperatorsFlowField.Swip2[i], null,
                                                                      j, VelocityMapping, VelocityVectorMapping);
                        break;

                    case PhysicsMode.Incompressible:
                        throw new ApplicationException("Using wrong matrix factory for incompressible flows");

                    default:
                        throw new NotImplementedException();
                    }
                }
            }

            //SaveMatricesToTextFile(OperatorsFlowField, VelocityMapping, VelocityVectorMapping);

            Predictor          = new SIMPLEMatrixAssembly[SolverConf.SpatialDimension];
            PredictorApprox    = new SIMPLEMatrixAssembly[SolverConf.SpatialDimension];
            PredictorApproxInv = new SIMPLEMatrixAssembly[SolverConf.SpatialDimension];
            for (int comp = 0; comp < SolverConf.SpatialDimension; comp++)
            {
                Predictor[comp]          = new MatrixAssemblyVariableDensityPredictor(comp, OperatorsFlowField.Convection, OperatorsFlowField.Visc, ViscSplit);
                PredictorApprox[comp]    = new MatrixAssemblyApprox(SolverConf, VelocityMapping.GridDat.iLogicalCells.NoOfLocalUpdatedCells, Predictor[comp], BDF, Rho, 1 + 2 * SolverConf.Control.PredictorApproximationUpdateCycle);
                PredictorApproxInv[comp] = new MatrixAssemblyApproxInv(SolverConf.Control, VelocityMapping.GridDat.iLogicalCells.NoOfLocalUpdatedCells, PredictorApprox[comp], 1 + SolverConf.Control.PredictorApproximationUpdateCycle);
            }

            // Initialize Corrector
            // ====================

            switch (SolverConf.Control.PhysicsMode)
            {
            case PhysicsMode.LowMach:
                Corrector = new MatrixAssemblyVariableDensityCorrector(OperatorsFlowField.DivergenceConti, PredictorApproxInv, OperatorsFlowField.PressureGradient);
                break;

            case PhysicsMode.Multiphase:
                Corrector = new MatrixAssemblyVariableDensityCorrector(OperatorsFlowField.DivergenceConti, PredictorApproxInv, OperatorsFlowField.PressureGradient, SolverConf.Control.PredictorApproximationUpdateCycle);
                break;

            case PhysicsMode.Incompressible:
                throw new ApplicationException("Using wrong matrix factory for incompressible flows");

            default:
                throw new NotImplementedException();
            }
        }