/// <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); }
/// <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"); }
/// <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(); } }