예제 #1
0
        /// <summary>
        /// Creates an <see cref="OperatorFactory"/> with appropriate terms
        /// (convective/diffusive) for the selected <paramref name="formulation"/>.
        /// </summary>
        /// <param name="formulation">
        /// The chosen equation system
        /// </param>
        /// <param name="control"></param>
        /// <param name="gridData"></param>
        /// <param name="speciesMap"></param>
        /// <param name="workingSet"></param>
        /// <param name="boundaryMap">
        /// Boundary information
        /// </param>
        /// <returns>
        /// An instance of <see cref="OperatorFactory"/> that has been
        /// configured with the fluxes defined by
        /// <see cref="CNSControl.ConvectiveFluxType"/> and/or
        /// <see cref="CNSControl.DiffusiveFluxType"/>.
        /// </returns>
        public static OperatorFactory GetOperatorFactory(
            this DomainTypes formulation, CNSControl control, IGridData gridData, BoundaryConditionMap boundaryMap, CNSFieldSet workingSet, ISpeciesMap speciesMap)
        {
            switch (formulation)
            {
            case DomainTypes.Standard:
                return(new OperatorFactory(
                           control, gridData, workingSet, speciesMap, boundaryMap));

            case DomainTypes.StaticImmersedBoundary:
            case DomainTypes.MovingImmersedBoundary:
                FluxBuilder convectiveBuilder = control.ConvectiveFluxType.GetBuilder(
                    control, boundaryMap, speciesMap);
                return(new IBMOperatorFactory(
                           (IBMControl)control,
                           gridData,
                           workingSet,
                           speciesMap,
                           boundaryMap));

            default:
                throw new Exception(
                          "Unknown formulation \"" + control.DomainType + "\"");
            }
        }
예제 #2
0
        /// <summary>
        /// Prepares the construction of a new equation system
        /// </summary>
        /// <param name="control"></param>
        /// <param name="gridData"></param>
        /// <param name="workingSet"></param>
        /// <param name="speciesMap"></param>
        /// <param name="boundaryMap"></param>
        /// <remarks>
        /// Source terms are currently considered independent of the considered
        /// equation system and are thus constructed automatically from the
        /// control file (see <see cref="CustomSourceBuilder"/>).
        /// </remarks>
        public OperatorFactory(
            CNSControl control,
            GridData gridData,
            CNSFieldSet workingSet,
            ISpeciesMap speciesMap,
            IBoundaryConditionMap boundaryMap)
        {
            bool hasConvection = control.ActiveOperators.HasFlag(Operators.Convection);
            bool hasDiffusion  = control.ActiveOperators.HasFlag(Operators.Diffusion);

            if (!hasConvection && !hasDiffusion)
            {
                throw new Exception(
                          "Either convective or diffusive terms must be active");
            }

            if (hasConvection)
            {
                this.convectiveFluxBuilder = control.ConvectiveFluxType.GetBuilder(
                    control, boundaryMap, speciesMap);
            }

            if (hasDiffusion)
            {
                this.diffusiveFluxBuilder = control.DiffusiveFluxType.GetBuilder(
                    control, boundaryMap, speciesMap, gridData);
            }

            if (control.ActiveOperators.HasFlag(Operators.Gravity))
            {
                this.sourceTermBuilders.Add(
                    new GravityFluxBuilder(control, boundaryMap, speciesMap));
            }

            if (control.ActiveOperators.HasFlag(Operators.CustomSource))
            {
                this.sourceTermBuilders.Add(
                    new CustomSourceBuilder(control, boundaryMap, speciesMap));
            }

            if (control.ActiveOperators.HasFlag(Operators.SpongeLayer))
            {
                this.sourceTermBuilders.Add(
                    new SpongeLayerFluxBuilder(control, boundaryMap, speciesMap));
            }

            if (control.ActiveOperators.HasFlag(Operators.ArtificialViscosity))
            {
                this.sourceTermBuilders.Add(
                    new LaplacianArtificialViscosityFluxBuilder(control, boundaryMap, speciesMap));
            }

            this.control    = control;
            this.gridData   = gridData;
            this.workingSet = workingSet;
            this.speciesMap = speciesMap;
        }