예제 #1
0
        /// <summary>
        /// [VariableDensity] Ctor.
        /// </summary>
        /// <param name="SolverConf"></param>
        /// <param name="Src"></param>
        /// <param name="BDF"></param>
        /// <param name="Rho"></param>
        /// <param name="MaxUseMatrix"></param>
        public MatrixAssemblyApprox(SolverConfiguration SolverConf, int NoOfCells, SIMPLEMatrixAssembly Src, BDFScheme BDF, BlockDiagonalMatrix Rho, int MaxUseMatrix = 1)
            : base(SolverConf.Control.PredictorApproximationIsConstant, false, MaxUsePerIterMatrix: MaxUseMatrix)
        {
            m_SolverConf = SolverConf;
            m_Src        = Src;
            m_BDF        = BDF;
            m_NoOfCells  = NoOfCells;

            if (Rho != null)
            {
                // VariableDensity
                m_Rho = Rho;
                if (m_Src.i0 != m_Rho.RowPartitioning.i0)
                {
                    throw new NotImplementedException("Different row partitions, which should be equal.");
                }
            }
            else
            {
                // Incompressible
                m_Rho = new BlockDiagonalMatrix(m_Src.LocalLength, 1);
                m_Rho.AccEyeSp();
            }

            base.Initialize();
        }
예제 #2
0
        protected override MsrMatrix ComputeMatrix()
        {
            MsrMatrix Approx    = m_Approx.AssemblyMatrix;
            MsrMatrix ApproxInv = new MsrMatrix(Approx.RowPartitioning, Approx.ColPartition);

            switch (m_SolverConf.PredictorApproximation)
            {
            case PredictorApproximations.Identity:
            case PredictorApproximations.Identity_IP1:
            case PredictorApproximations.Diagonal:
                int i0          = Approx.RowPartitioning.i0;
                int LocalLength = Approx.RowPartitioning.LocalLength;

                for (int row = 0; row < LocalLength; row++)
                {
                    double Approx_ii = Approx[row + i0, row + i0];
                    ApproxInv[row + i0, row + i0] = 1.0 / Approx_ii;
                }
                break;

            case PredictorApproximations.BlockDiagonal:
                BlockDiagonalMatrix ApproxBlock    = new BlockDiagonalMatrix(Approx, Approx.RowPartitioning.LocalLength / m_LocalNoOfCells, Approx.ColPartition.LocalLength / m_LocalNoOfCells);
                BlockDiagonalMatrix ApproxBlockInv = ApproxBlock.Invert();
                ApproxInv.Acc(1.0, ApproxBlockInv);
                break;

            default:
                throw new ArgumentException();
            }

            return(ApproxInv);
        }
예제 #3
0
        static void Main(string[] args)
        {
            Application.InitMPI();

            MultidimensionalArray myMultidimensionalArray = MultidimensionalArray.Create(3, 6);

            myMultidimensionalArray[1, 2] = 3.0;
            myMultidimensionalArray[2, 5] = 2.0;
            TestShowVisualizer(myMultidimensionalArray);

            BlockDiagonalMatrix myBlockDiagonalMatrix = new BlockDiagonalMatrix(15, 3);

            myBlockDiagonalMatrix[1, 1] = 1.0;
            TestShowVisualizer(myBlockDiagonalMatrix);

            MsrMatrix myMsrMatrix = new MsrMatrix(4, 1);

            myMsrMatrix[1, 1] = 3.0;
            TestShowVisualizer(myMsrMatrix);

            MultidimensionalArray myNodeSet = MultidimensionalArray.Create(3, 2);

            myNodeSet[0, 0] = 1.0;
            myNodeSet[0, 1] = 2.0;
            myNodeSet[1, 0] = 3.0;
            myNodeSet[1, 1] = 4.0;
            myNodeSet[2, 0] = 5.0;
            myNodeSet[2, 1] = 6.0;
            NodeSet nodeSet = new NodeSet(null, myNodeSet);

            TestShowVisualizer(nodeSet);
        }
예제 #4
0
파일: Program.cs 프로젝트: xyuan/BoSSS
        static void Main(string[] args)
        {
            bool dummy;

            ilPSP.Environment.Bootstrap(args, Application.GetBoSSSInstallDir(), out dummy);

            MultidimensionalArray myMultidimensionalArray = MultidimensionalArray.Create(3, 6);

            myMultidimensionalArray[1, 2] = 3.0;
            myMultidimensionalArray[2, 5] = 2.0;
            TestShowVisualizer(myMultidimensionalArray);

            BlockDiagonalMatrix myBlockDiagonalMatrix = new BlockDiagonalMatrix(15, 3);

            myBlockDiagonalMatrix[1, 1] = 1.0;
            TestShowVisualizer(myBlockDiagonalMatrix);

            MsrMatrix myMsrMatrix = new MsrMatrix(4, 1);

            myMsrMatrix[1, 1] = 3.0;
            TestShowVisualizer(myMsrMatrix);

            MultidimensionalArray myNodeSet = MultidimensionalArray.Create(3, 2);

            myNodeSet[0, 0] = 1.0;
            myNodeSet[0, 1] = 2.0;
            myNodeSet[1, 0] = 3.0;
            myNodeSet[1, 1] = 4.0;
            myNodeSet[2, 0] = 5.0;
            myNodeSet[2, 1] = 6.0;
            NodeSet nodeSet = new NodeSet(null, myNodeSet);

            TestShowVisualizer(nodeSet);
        }
예제 #5
0
        protected override MsrMatrix ComputeMatrix()
        {
            MsrMatrix Src    = m_Src.AssemblyMatrix;
            MsrMatrix Approx = new MsrMatrix(Src.RowPartitioning, Src.ColPartition);

            int i0          = Src.RowPartitioning.i0;
            int LocalLength = Src.RowPartitioning.LocalLength;

            double BDFfactor;

            switch (m_SolverConf.Control.Algorithm)
            {
            case SolutionAlgorithms.Steady_SIMPLE:
                BDFfactor = 0.0;
                break;

            case SolutionAlgorithms.Unsteady_SIMPLE:
                int    BDFOrder = m_SolverConf.BDFOrder;
                double dt       = m_SolverConf.dt;
                BDFfactor = m_BDF.beta[BDFOrder - 1][0] / (m_BDF.gamma[BDFOrder - 1] * dt);
                break;

            default:
                throw new ArgumentException();
            }

            switch (m_SolverConf.Control.PredictorApproximation)
            {
            case PredictorApproximations.Identity:
            case PredictorApproximations.Identity_IP1:
                Approx.AccEyeSp();
                Approx.AccEyeSp(BDFfactor);
                break;

            case PredictorApproximations.Diagonal:
                for (int row = 0; row < LocalLength; row++)
                {
                    double Src_ii = Src[row + i0, row + i0];
                    double Rho_ii = m_Rho[row + i0, row + i0];
                    Approx[row + i0, row + i0] = BDFfactor * Rho_ii + Src_ii;
                }
                break;

            case PredictorApproximations.BlockDiagonal:
                BlockDiagonalMatrix SrcBlock = new BlockDiagonalMatrix(Src, Src.RowPartitioning.LocalLength / m_NoOfCells, Src.ColPartition.LocalLength / m_NoOfCells);
                Approx.Acc(1.0, SrcBlock);
                Approx.Acc(BDFfactor, m_Rho);
                break;

            default:
                throw new ArgumentException();
            }

            return(Approx);
        }
예제 #6
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="Basis"></param>
        /// <param name="GridDat"></param>
        /// <param name="Fields"></param>
        public QuadratureMatrix(Basis Basis, IGridData GridDat, params SinglePhaseField[] Fields)
            : base(new int[] { Basis.MaximalLength *Basis.MaximalLength },
                   GridDat,
                   (new CellQuadratureScheme()).Compile(GridDat, Fields[0].Basis.Degree + 2 * Basis.Degree)) //
        {
            m_Basis  = Basis;
            m_Fields = Fields;

            UnsetteledCoordinateMapping map = new UnsetteledCoordinateMapping(Basis);

            m_Matrix = new BlockDiagonalMatrix(map.LocalLength, Basis.MaximalLength);

            FieldVals = new MultidimensionalArray[Fields.Length];
        }
예제 #7
0
        public void Init(MultigridOperator op)
        {
            BlockMsrMatrix M     = op.OperatorMatrix;
            var            MgMap = op.Mapping;

            this.m_MultigridOp = op;


            if (!M.RowPartitioning.Equals(MgMap.Partitioning))
            {
                throw new ArgumentException("Row partitioning mismatch.");
            }
            if (!M.ColPartition.Equals(MgMap.Partitioning))
            {
                throw new ArgumentException("Column partitioning mismatch.");
            }

            Mtx = M;
            int L = M.RowPartitioning.LocalLength;

            /*
             * diag = new double[L];
             * int i0 = Mtx.RowPartitioning.i0;
             *
             * for(int i = 0; i < L; i++) {
             *  diag[i] = Mtx[i0 + i, i0 + i];
             * }
             */

            if (op.Mapping.MaximalLength != op.Mapping.MinimalLength)
            {
                // 'BlockDiagonalMatrix' should be completely replaced by 'BlockMsrMatrix'
                throw new NotImplementedException("todo - Block Jacobi for variable block Sizes");
            }


            int Nblk = op.Mapping.MaximalLength;

            Diag    = new BlockDiagonalMatrix(M.ToMsrMatrix(), Nblk, Nblk);
            invDiag = Diag.Invert();
            invDiag.CheckForNanOrInfM();
        }
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="solverConfig"></param>
        /// <param name="_sparseSolver"></param>
        /// <param name="DensityMatrix"></param>
        /// <param name="MatAsmblyTemperature"></param>
        /// <param name="MatAsmblyTemperatureApprox"></param>
        /// <param name="Temperature"></param>
        /// <param name="BDF"></param>
        /// <param name="EoS"></param>
        /// <param name="ThermodynamicPressure"></param>
        public LowMachSolverTemperature(SolverConfiguration solverConfig, ISparseSolver _sparseSolver,
                                        BlockDiagonalMatrix DensityMatrix, SIMPLEMatrixAssembly MatAsmblyTemperature, SIMPLEMatrixAssembly MatAsmblyTemperatureApprox,
                                        ScalarFieldHistory <SinglePhaseField> Temperature,
                                        BDFScheme BDF, MaterialLaw EoS,
                                        ScalarFieldHistory <SinglePhaseField> ThermodynamicPressure)
            : base(solverConfig, _sparseSolver)
        {
            this.DensityMatrix              = DensityMatrix;
            this.MatAsmblyTemperature       = MatAsmblyTemperature;
            this.MatAsmblyTemperatureApprox = MatAsmblyTemperatureApprox;

            LowMachSIMPLEControl lowMachControl = solverConfig.Control as LowMachSIMPLEControl;

            this.ModeRelaxTemperature = lowMachControl.RelaxationModeTemperature;
            this.RelaxFactor          = (1.0 - lowMachControl.RelexationFactorTemperature) / lowMachControl.RelexationFactorTemperature;
            this.Temperature          = Temperature;

            this.BDF = BDF;
            this.EoS = EoS;

            this.gamma = lowMachControl.Gamma;
            this.ThermodynamicPressure = ThermodynamicPressure;
        }
예제 #9
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="solverConf"></param>
        /// <param name="_sparseSolver"></param>
        /// <param name="DensityMatrix"></param>
        /// <param name="MatAsmblyPredictor"></param>
        /// <param name="MatAsmblyPredictorApprox"></param>
        /// <param name="PressureGradient"></param>
        /// <param name="Pressure"></param>
        /// <param name="MatAsmblyViscSplit"></param>
        /// <param name="BuoyantForce"></param>
        /// <param name="Velocity"></param>
        /// <param name="Scalar"></param>
        /// <param name="EoS"></param>
        /// <param name="BDF"></param>
        public VariableDensitySolverPredictor(SolverConfiguration solverConf, ISparseSolver _sparseSolver,
                                              BlockDiagonalMatrix DensityMatrix, SIMPLEMatrixAssembly MatAsmblyPredictor, SIMPLEMatrixAssembly MatAsmblyPredictorApprox,
                                              SIMPLEOperator[] PressureGradient, SinglePhaseField Pressure,
                                              SIMPLEMatrixAssembly[,] MatAsmblyViscSplit, IEvaluatorNonLin[] BuoyantForce,
                                              VectorFieldHistory <SinglePhaseField> Velocity, ScalarFieldHistory <SinglePhaseField> Scalar, MaterialLaw EoS, BDFScheme BDF)
            : base(solverConf, _sparseSolver)
        {
            m_DensityMatrix            = DensityMatrix;
            m_MatAsmblyPredictor       = MatAsmblyPredictor;
            m_MatAsmblyPredictorApprox = MatAsmblyPredictorApprox;

            m_PressureGradient      = PressureGradient;
            m_Pressure              = Pressure;
            m_MatAsmblyViscSplit    = MatAsmblyViscSplit;
            m_BuoyantForceEvaluator = BuoyantForce;
            m_Velocity              = Velocity;
            m_Scalar = Scalar;
            m_EoS    = EoS;

            m_RelaxFactor = (1.0 - base.m_solverConf.Control.RelexationFactorVelocity) / base.m_solverConf.Control.RelexationFactorVelocity;

            m_BDF = BDF;
        }
예제 #10
0
        /// <summary>
        /// Ctor.
        /// </summary>
        public MatrixFactoryTemperature(OperatorFactoryTemperature TemperatureOperators, int LocalNoOfCells, BlockDiagonalMatrix Rho,
                                        SolverConfiguration solverConf, BDFScheme BDF)
        {
            Temperature = new MatrixAssemblyTemperature(TemperatureOperators.TemperatureConvection, TemperatureOperators.HeatConduction);

            LowMachSIMPLEControl lowMachControl = solverConf.Control as LowMachSIMPLEControl;

            if (lowMachControl.RelaxationModeTemperature == RelaxationTypes.Implicit)
            {
                TemperatureApprox = new MatrixAssemblyApprox(
                    solverConf, LocalNoOfCells, Temperature, BDF, Rho, 2 * lowMachControl.PredictorApproximationUpdateCycle);
            }
        }
예제 #11
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();
            }
        }