public override void TraverseTestBench(CyPhy.TestBenchType testBenchBase) { CyPhy.BlastTestBench testBench = testBenchBase as CyPhy.BlastTestBench; if (testBench == null) { testBench = CyPhyClasses.BlastTestBench.Cast(testBenchBase.Impl); } base.TraverseTestBench(testBenchBase); foreach (var item in testBench.Children.BlastComputation2MetricCollection) { CyPhy.BlastComputationType cadcomputation = item.SrcEnds.BlastComputationType; TBComputation tbcomputation = new TBComputation(); tbcomputation.MetricID = item.DstEnds.Metric.ID; if (cadcomputation is CyPhy.MaxHorizonalVelocity) { tbcomputation.ComputationType = TBComputation.Type.MAXHORIZONALVELOCITY; } else if (cadcomputation is CyPhy.MaxVerticalJump) { tbcomputation.ComputationType = TBComputation.Type.MAXVERTICALJUMP; } else if (cadcomputation is CyPhy.MaxVerticalVelocity) { tbcomputation.ComputationType = TBComputation.Type.MAXVERTICALVELOCITY; } tbcomputation.RequestedValueType = ""; Computations.Add(tbcomputation); } int predefinedCnt = testBench.Children.PredefinedBlastSuiteCollection.Count(); int customCnt = testBench.Children.BlastModelCollection.Count(); if (predefinedCnt > 0) { if (predefinedCnt > 1) { Logger.Instance.AddLogMessage("Blast testbench can only have at most 1 predefined blast suite.", Severity.Error); return; } if (customCnt > 0) { Logger.Instance.AddLogMessage("Blast testbench can not have both predefined and custom blast suite.", Severity.Error); return; } } // reference plane if (testBench.Children.ReferencePlaneCollection.Any()) { if (testBench.Children.ReferencePlaneCollection.First().Attributes.ReferencePlaneType == 0) { referencePlaneType = Survivability.ReferencePlaneTypeEnum.Ground; } else { referencePlaneType = Survivability.ReferencePlaneTypeEnum.Waterline; } } Survivability.BlastConfig.Analysis blastAnalysis = new Survivability.BlastConfig.Analysis(); blastAnalysis.ID = AnalysisID; //blastAnalysis.ID = testBench.ID; blastAnalysis.numDisplayTimeSteps = testBench.Attributes.DisplayTimeSteps; blastAnalysis.duration_seconds = testBench.Attributes.Duration; if (predefinedCnt > 0) { blastAnalysis.suiteName = testBench.Children.PredefinedBlastSuiteCollection.First().Attributes.BlastSuiteName; } if (customCnt > 0) { blastAnalysis.suiteName = testBench.Children.BlastModelCollection.First().Attributes.BlastSuiteName; } blastAnalysis.tier = (int)testBench.Attributes.BlastTier + 1; // starts at 0 blastConfig.analysis = blastAnalysis; string stepFormat; if (blastAnalysis.tier > 1) { stepFormat = "AP203_E2_Separate_Part_Files"; } else { stepFormat = "AP203_E2_Single_File"; } if (!STEP_DataExchangeFormats.Contains(stepFormat, StringComparer.CurrentCultureIgnoreCase)) { STEP_DataExchangeFormats.Add(stepFormat); } // blast threat if (customCnt > 0) { CyPhy.BlastModel blastSuite = testBench.Children.BlastModelCollection.First(); if (!blastSuite.Children.BlastThreatCollection.Any()) { Logger.Instance.AddLogMessage("Custom blast testbench must contain a blast threat within a blast suite.", Severity.Error); return; } if (!blastSuite.Children.ChargeLocationCollection.Any()) { Logger.Instance.AddLogMessage("Custom blast testbench must contain a charge location within a blast suite.", Severity.Error); return; } CyPhy.BlastThreat threat = blastSuite.Children.BlastThreatCollection.First(); Survivability.BlastConfig.BlastThreat configThreat = new Survivability.BlastConfig.BlastThreat(); configThreat.burialDepth_meters = threat.Attributes.ThreatBurialDepth; configThreat.chargeSize_kgOfTNT = threat.Attributes.TNTChargeSize; int tTypeint = (int)threat.Attributes.ThreatType; configThreat.type = (Survivability.BlastConfig.BlastThreatTypeEnum)tTypeint; Survivability.BlastConfig.Shape shape = new Survivability.BlastConfig.Shape(); shape.height_meters = threat.Attributes.ThreatShapeHeight; shape.radius_meters = threat.Attributes.ThreatShapeRadius; int sTypeint = (int)threat.Attributes.ThreatShapeType; shape.type = (Survivability.BlastConfig.Shape.ShapeTypeEnum)sTypeint; configThreat.shape = shape; CyPhy.ChargeLocation loc = blastSuite.Children.ChargeLocationCollection.First(); Survivability.BlastConfig.ChargeLocation configChargeLoc = new Survivability.BlastConfig.ChargeLocation(); configChargeLoc.x_meters = loc.Attributes.X; configChargeLoc.y_meters = loc.Attributes.Y; configChargeLoc.z_meters = loc.Attributes.Z; configThreat.chargeLocation = configChargeLoc; blastConfig.blastThreat = configThreat; } }
public override void TraverseTestBench(CyPhy.TestBenchType testBenchBase) { string stepFormat = "AP203_E2_Single_File"; if (!STEP_DataExchangeFormats.Contains(stepFormat, StringComparer.OrdinalIgnoreCase)) { STEP_DataExchangeFormats.Add(stepFormat); } CyPhy.BallisticTestBench testBench = testBenchBase as CyPhy.BallisticTestBench; if (testBench == null) { testBench = CyPhyClasses.BallisticTestBench.Cast(testBenchBase.Impl); } base.TraverseTestBench(testBenchBase); //AnalysisID = testBench.ID; foreach (var item in testBench.Children.BallisticComputation2MetricCollection) { TBComputation tbcomputation = new TBComputation(); if (item.SrcEnds.TotalIntersections != null) { tbcomputation.ComputationType = TBComputation.Type.TOTALINTERSECTIONS; } else if (item.SrcEnds.TotalKills != null) { tbcomputation.ComputationType = TBComputation.Type.TOTALKILLS; } else if (item.SrcEnds.TotalPerforations != null) { tbcomputation.ComputationType = TBComputation.Type.TOTALPERFORATIONS; } else if (item.SrcEnds.TotalShots != null) { tbcomputation.ComputationType = TBComputation.Type.TOTALSHOTS; } else { Logger.Instance.AddLogMessage("Unknown Ballistic calculation: " + item.SrcEnd.Impl.Name, Severity.Error); } tbcomputation.MetricID = item.DstEnds.Metric.ID; tbcomputation.MetricName = item.Name; tbcomputation.RequestedValueType = ""; Computations.Add(tbcomputation); } int predefinedCnt = testBench.Children.PredefinedBallisticSuiteCollection.Count(); int customCnt = testBench.Children.ShotlineModelCollection.Count(); if (predefinedCnt > 0) { if (predefinedCnt > 1) { Logger.Instance.AddLogMessage("Ballistic testbench can only have at most 1 predefined shotline suite.", Severity.Error); return; } if (customCnt > 0) { Logger.Instance.AddLogMessage("Ballistic testbench can not have both predefined and custom shotline suites.", Severity.Error); return; } } // reference plane if (testBench.Children.ReferencePlaneCollection.Any()) { if (testBench.Children.ReferencePlaneCollection.First().Attributes.ReferencePlaneType == 0) { referencePlaneType = Survivability.ReferencePlaneTypeEnum.Ground; } else { referencePlaneType = Survivability.ReferencePlaneTypeEnum.Waterline; } } // analysis Survivability.BallisticConfig.Analysis ballisticAnalysis = new Survivability.BallisticConfig.Analysis(); ballisticAnalysis.ID = AnalysisID; if (predefinedCnt > 0) { ballisticAnalysis.suiteName = testBench.Children.PredefinedBallisticSuiteCollection.First().Attributes.Name; } else { ballisticAnalysis.suiteName = testBench.Name; } if (ballisticAnalysis.suiteName.Length == 0) { Logger.Instance.AddLogMessage("Ballistic analysis suite has no name specified.", Severity.Warning); } ballisticAnalysis.tier = (int)testBench.Attributes.Tier + 1; // starts at 0 ballisticConfig.analysis = ballisticAnalysis; // ballistic threat foreach (var item in testBench.Children.BallisticThreatCollection) { VerifyBallisticThreat(item); Survivability.BallisticConfig.BallisticThreat threat = new Survivability.BallisticConfig.BallisticThreat(); threat.diameter_meters = item.Attributes.Diameter; threat.length_meters = item.Attributes.Length; threat.materialRef = item.Attributes.Material; threat.speed_metersPerSec = item.Attributes.Speed; if (item.Kind == "ProjectileBallisticThreat") { threat.type = Survivability.BallisticConfig.BallisticThreat.BallisticThreatTypeEnum.Ballistic; } else if (item.Kind == "ShapedChargeJetBallisticThreat") { threat.type = Survivability.BallisticConfig.BallisticThreat.BallisticThreatTypeEnum.ShapedChargeJet; threat.standoff_meters = (item as CyPhy.ShapedChargeJetBallisticThreat).Attributes.Standoff; int chargeq = (int)(item as CyPhy.ShapedChargeJetBallisticThreat).Attributes.ChargeQuality; threat.chargeQuality = (Survivability.BallisticConfig.BallisticThreat.ChargeQualityEnum)(chargeq); } threat.name = item.ID; ballisticConfig.ballisticThreats.Add(threat); } // critical components foreach (var item in testBench.Children.CriticalComponentCollection) { int type = (int)item.Attributes.Type; CyPhy.TIPRefBase refbase = item.Referred.TIPRefBase; if (refbase != null) { if (refbase.Kind != "Component") { Logger.Instance.AddLogMessage(String.Format("Critical component must refer to a component: {0}", refbase.Name), Severity.Error); } else { Survivability.BallisticConfig.CriticalComponent criticalcomponent = new Survivability.BallisticConfig.CriticalComponent(); criticalcomponent.componentID = (refbase as CyPhy.Component).Attributes.InstanceGUID; criticalcomponent.type = (Survivability.BallisticConfig.CriticalComponent.CriticalityTypeEnum)(type); ballisticConfig.criticalComponents.Add(criticalcomponent); } } } // file location // see GenerateCADXmlOutput(); // custom shotline foreach (var item in testBench.Children.ShotlineModelCollection) { if (VerifyShotLineModel(item)) { continue; } string componentid = ""; string datumname = ""; CyPhy.ShotlineTarget target = item.DstConnections.ShotlineTargetCollection.First(); CyPhy.Point ap = target.DstEnds.Point; PointMetricTraversal traverser = new PointMetricTraversal(ap); if (!traverser.portsFound.Any()) { Logger.Instance.AddLogMessage("Shotline Model is connected to an AnalysisPoint which does not end in a PointGeometry [" + item.Path + "]", Severity.Error); continue; } datumname = (traverser.portsFound.First() as CyPhy.Point).Attributes.DatumName; CyPhy.Component targetComponent = CyPhyClasses.Component.Cast(traverser.portsFound.First().ParentContainer.ParentContainer.Impl); componentid = targetComponent.Attributes.InstanceGUID; foreach (var conn in item.SrcConnections.Threat2ShotlineSuiteCollection) { CyPhy.BallisticThreat threat = conn.SrcEnds.BallisticThreat; CustomShotline customshotline = new CustomShotline(); customshotline.Azimuth = item.Children.AzimuthAngleCollection.First().Attributes.Value; customshotline.Elevation = item.Children.ElevationAngleCollection.First().Attributes.Value; customshotline.BallisticThreatRef = threat.ID; customshotline.ComponentID = componentid; customshotline.DatumPoint = datumname; customshotline.ShotlineName = item.Attributes.Name; customShotlineList.Add(customshotline); } } }
public override void TraverseTestBench(CyPhy.TestBenchType testBenchBase) { // META-3195 - CFD needs Inventor format now instead of STL - Stereolithography_ASCII NonSTEP_DataExchangeFormats.Add("Inventor"); CyPhy.CFDTestBench testBench = testBenchBase as CyPhy.CFDTestBench; if (testBench == null) { testBench = CyPhyClasses.CFDTestBench.Cast(testBenchBase.Impl); } base.TraverseTestBench(testBenchBase); //AnalysisID = testBench.ID; foreach (var conn in testBench.Children.CFDComputation2MetricCollection) { TBComputation tbcomputation = new TBComputation(); tbcomputation.MetricID = conn.DstEnds.Metric.ID; tbcomputation.ComputationType = TBComputation.Type.COEFFICIENTOFDRAG; tbcomputation.RequestedValueType = "SCALAR"; Computations.Add(tbcomputation); } int calmSolverCnt = testBench.Children.CalmWaterSolverSettingsCollection.Count(); int waveSolverCnt = testBench.Children.WaveResistanceSolverSettingsCollection.Count(); int correlationSolverCnt = testBench.Children.CorrelationSettingsCollection.Count(); int hydrostaticsSolverCnt = testBench.Children.HydrostaticsSolverSettingsCollection.Count(); if ((calmSolverCnt + waveSolverCnt + correlationSolverCnt + hydrostaticsSolverCnt) < 1) { Logger.Instance.AddLogMessage("No CFD solver settings in the test bench", Severity.Error); return; } if (hydrostaticsSolverCnt > 1 || (calmSolverCnt + waveSolverCnt + correlationSolverCnt) > 1) { Logger.Instance.AddLogMessage( "Multiple CFD solver settings in the test bench", Severity.Error); Logger.Instance.AddLogMessage( "A test bench can only contain one hydrostatics and one calm, wave or correlation solver setting.", Severity.Info); return; } #region ValidAttributes double MinVelocity = 0; double MaxVelocity = 343; double AbsZero = -273.15; double MaxTemp = 100; double MinAngle = 0; double MaxAngle = 360; #endregion if (hydrostaticsSolverCnt == 1) { CyPhy.HydrostaticsSolverSettings solverSettings = testBench.Children.HydrostaticsSolverSettingsCollection.First(); if (solverSettings.Attributes.FluidTemperature < AbsZero || solverSettings.Attributes.FluidTemperature > MaxTemp) { string message = string.Format( "'{0}': 'FluidTemperature' attribute must be [{1} - {2}]", solverSettings.Name, AbsZero, MaxTemp); Logger.Instance.AddLogMessage( message, Severity.Error); } if (solverSettings.Attributes.PitchAngleStart < MinAngle || solverSettings.Attributes.PitchAngleStart > MaxAngle || solverSettings.Attributes.PitchAngleEnd < MinAngle || solverSettings.Attributes.PitchAngleEnd > MaxAngle || solverSettings.Attributes.RollAngleStart < MinAngle || solverSettings.Attributes.RollAngleStart > MaxAngle || solverSettings.Attributes.RollAngleEnd < MinAngle || solverSettings.Attributes.RollAngleEnd > MaxAngle || solverSettings.Attributes.PitchAngleStepSize < MinAngle || solverSettings.Attributes.PitchAngleStepSize > MaxAngle || solverSettings.Attributes.RollAngleStepSize < MinAngle || solverSettings.Attributes.RollAngleStepSize > MaxAngle) { string message = string.Format( "'{0}': 'Angle' attributes must be [{1}-{2}]", solverSettings.Name, MinAngle, MaxAngle); Logger.Instance.AddLogMessage( message, Severity.Error); } cfdConfigs.Add(new CFDConfig.HydrostaticsSolverSettings(solverSettings, testBench)); } if (calmSolverCnt == 1) { CyPhy.CalmWaterSolverSettings solverSettings = testBench.Children.CalmWaterSolverSettingsCollection.First(); if (solverSettings.Attributes.VehicleVelocity > MaxVelocity || solverSettings.Attributes.VehicleVelocity < MinVelocity) { string message = string.Format( "'{0}': 'Velocity' attribute must be [{1}-{2}]", solverSettings.Name, MinVelocity, MaxVelocity); Logger.Instance.AddLogMessage( message, Severity.Error); } if (solverSettings.Attributes.FluidTemperature < AbsZero || solverSettings.Attributes.FluidTemperature > MaxTemp) { string message = string.Format( "'{0}': 'FluidTemperature' attribute must be [{1} - {2}]", solverSettings.Name, AbsZero, MaxTemp); Logger.Instance.AddLogMessage( message, Severity.Error); } cfdConfigs.Add(new CFDConfig.CalmWaterSolverSettings(solverSettings, testBench)); return; } if (waveSolverCnt == 1) { CyPhy.WaveResistanceSolverSettings solverSettings = testBench.Children.WaveResistanceSolverSettingsCollection.First(); if (solverSettings.Attributes.VehicleVelocity > MaxVelocity || solverSettings.Attributes.VehicleVelocity < MinVelocity) { string message = string.Format( "'{0}': 'Velocity' attribute must be [{1}-{2}]", solverSettings.Name, MinVelocity, MaxVelocity); Logger.Instance.AddLogMessage( message, Severity.Error); } if (solverSettings.Attributes.FluidTemperature < AbsZero || solverSettings.Attributes.FluidTemperature > MaxTemp) { string message = string.Format( "'{0}': 'FluidTemperature' attribute must be [{1} - {2}]", solverSettings.Name, AbsZero, MaxTemp); Logger.Instance.AddLogMessage( message, Severity.Error); } if (solverSettings.Attributes.WaveFrequency < 0) { string message = string.Format( "'{0}': 'WaveFrequency' attribute must be greater than 0", solverSettings.Name); Logger.Instance.AddLogMessage( message, Severity.Error); } if (solverSettings.Attributes.WaveDirection < MinAngle || solverSettings.Attributes.WaveDirection > MaxAngle) { string message = string.Format( "'{0}': 'Angle' attributes must be [{1}-{2}]", solverSettings.Name, MinAngle, MaxAngle); Logger.Instance.AddLogMessage( message, Severity.Error); } cfdConfigs.Add(new CFDConfig.WaveResistanceSolverSettings(solverSettings, testBench)); return; } if (correlationSolverCnt == 1) { CyPhy.CorrelationSettings solverSettings = testBench.Children.CorrelationSettingsCollection.First(); if (solverSettings.Attributes.VehicleVelocity > MaxVelocity || solverSettings.Attributes.VehicleVelocity < 0) { string message = string.Format( "'{0}': 'Velocity' attribute must be [{1}-{2}]", solverSettings.Name, MinVelocity, MaxVelocity); Logger.Instance.AddLogMessage( message, Severity.Error); } cfdConfigs.Add(new CFDConfig.CorrelationSolverSettings(solverSettings, testBench)); return; } // Post Processing Blocks foreach (var postprocess in testBench.Children.PostProcessingCollection) { PostProcessScripts.Add(postprocess.Attributes.ScriptPath); } }