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