public static FEAThermalElement[] Extract(CyPhy.ThermalFEAElements thermalElement, string compid, CADGeometry geom) { List <FEAThermalElement> result = new List <FEAThermalElement>(); if (thermalElement is CyPhy.ThermalEnvironment) { if ((thermalElement as CyPhy.ThermalEnvironment).Children.ParameterCollection.Any()) { var param = (thermalElement as CyPhy.ThermalEnvironment).Children.ParameterCollection.First(); string role = ((MgaFCO)param.Impl).MetaRole.Name; var elem = new FEAThermalElement(param) { ComponentID = compid, Geometry = geom }; result.Add(elem); } } else if (thermalElement is CyPhy.ThermalLoad) { foreach (var param in (thermalElement as CyPhy.ThermalLoad).Children.ParameterCollection) { var elem = new FEAThermalElement(param) { ComponentID = compid, Geometry = geom }; if (elem.Type == "Convection") { elem.Unit = "J/(s-mm^2-K)"; } else if (elem.Type == "HeatFlux") { elem.Unit = "J/(s-mm^2)"; } else if (elem.Type == "HeatGeneration") { elem.Unit = "J/s"; } else if (elem.Type == "InitialTemperature") { elem.Unit = "K"; } else if (elem.Type == "SpecifiedTemperature") { elem.Unit = "K"; } result.Add(elem); } } return(result.ToArray()); }
public override void TraverseTestBench(CyPhy.TestBenchType testBenchBase) { string stepFormat = "AP203_E2_Single_File"; if (!DataExchangeFormats.Contains(stepFormat)) DataExchangeFormats.Add(stepFormat); CyPhy.CADTestBench testBench = testBenchBase as CyPhy.CADTestBench; if (testBench == null) testBench = CyPhyClasses.CADTestBench.Cast(testBenchBase.Impl); this.CyphyTestBenchRef = testBench; base.TraverseTestBench(testBenchBase); AdjSurfTreatment = CyphyTestBenchRef.Attributes.AdjoiningTreatment; // Solver Settings ElementType = "MIDPOINT_PARABOLIC_FIXED"; ShellType = "N/A"; SolverType = testBench.Attributes.SolverType.ToString(); MeshType = "SOLID"; MaxAdaptiveIterations = testBench.Attributes.MaxAdaptiveIterations; FEAAnalysisType = "STRUCTURAL"; if (testBench.Children.ThermalLoadCollection.Any() || testBench.Children.ThermalEnvironmentCollection.Any()) { FEAAnalysisType = "THERMAL"; } // Metrics foreach (var item in testBench.Children.TIP2StructuralMetricCollection) { if (item.SrcEnds.TestInjectionPoint != null) { CyPhy.TestInjectionPoint tip = item.SrcEnds.TestInjectionPoint; CyPhy.StructuralFEAComputation feaComp = item.DstEnds.StructuralFEAComputation; if (tip.AllReferred == null) continue; List<CyPhy.Component> testComponents = new List<CyPhy.Component>(); if (tip.AllReferred is CyPhy.ComponentAssembly) { CollectLeafComponents(testComponents, tip.AllReferred as CyPhy.ComponentAssembly); } else if (tip.AllReferred is CyPhy.Component) { // Interested in components with CAD Model only if ((tip.AllReferred as CyPhy.Component).Children.CADModelCollection.Any()) testComponents.Add(tip.AllReferred as CyPhy.Component); } foreach (CyPhy.Component comp in testComponents) { string compId = comp.Attributes.InstanceGUID; foreach (var cyphycompport in feaComp.Children.StructuralAnalysisComputationTypeCollection) { TBComputation tbcomputation = new TBComputation(); if (cyphycompport is CyPhy.BearingStress) { tbcomputation.ComputationType = TBComputation.Type.BEARINGSTRESS; } else if (cyphycompport is CyPhy.MisesStress) { tbcomputation.ComputationType = TBComputation.Type.VONMISESSTRESS; } else if (cyphycompport is CyPhy.ShearStress) { tbcomputation.ComputationType = TBComputation.Type.SHEARSTRESS; } else if (cyphycompport is CyPhy.MaximumDisplacement) { tbcomputation.ComputationType = TBComputation.Type.DISPLACEMENT; } else if (cyphycompport is CyPhy.FactorOfSafety) { tbcomputation.ComputationType = TBComputation.Type.FACTOROFSAFETY; } tbcomputation.FeatureDatumName = ""; tbcomputation.RequestedValueType = "Scalar"; tbcomputation.Details = "InfiniteCycle"; tbcomputation.ComponentID = compId; foreach (var cyphyconn in cyphycompport.DstConnections.FEAComputation2MetricCollection) { tbcomputation.MetricID = cyphyconn.DstEnds.Metric.ID; } if (!String.IsNullOrEmpty(tbcomputation.MetricID)) this.Computations.Add(tbcomputation); } } } } // Thermal Metrics foreach (var item in testBench.Children.TIP2ThermalMetricCollection) { if (item.SrcEnds.TestInjectionPoint != null) { CyPhy.TestInjectionPoint tip = item.SrcEnds.TestInjectionPoint; CyPhy.ThermalFEAComputation feaComp = item.DstEnds.ThermalFEAComputation; if (tip.AllReferred == null) continue; List<CyPhy.Component> testComponents = new List<CyPhy.Component>(); if (tip.AllReferred is CyPhy.ComponentAssembly) { CollectLeafComponents(testComponents, tip.AllReferred as CyPhy.ComponentAssembly); } else if (tip.AllReferred is CyPhy.Component) { // Interested in components with CAD Model only if ((tip.AllReferred as CyPhy.Component).Children.CADModelCollection.Any()) testComponents.Add(tip.AllReferred as CyPhy.Component); } foreach (CyPhy.Component comp in testComponents) { string compId = comp.Attributes.InstanceGUID; foreach (var cyphycompport in feaComp.Children.ThermalAnalysisMetricsCollection) { TBComputation tbcomputation = new TBComputation(); if (cyphycompport is CyPhy.MinimumTemperature) { tbcomputation.ComputationType = TBComputation.Type.MINIMUMTEMPERATURE; } else if (cyphycompport is CyPhy.MaximumTemperature) { tbcomputation.ComputationType = TBComputation.Type.MAXIMUMTEMPERATURE; } tbcomputation.FeatureDatumName = ""; tbcomputation.RequestedValueType = "Scalar"; tbcomputation.Details = "InfiniteCycle"; tbcomputation.ComponentID = compId; foreach (var cyphyconn in cyphycompport.DstConnections.FEAComputation2MetricCollection) { tbcomputation.MetricID = cyphyconn.DstEnds.Metric.ID; } if (!String.IsNullOrEmpty(tbcomputation.MetricID)) this.Computations.Add(tbcomputation); } } } } bool convectionPresent = false; bool ambientTempPresent = false; // thermal elements foreach(var item in testBench.Children.ThermalFEAElementsCollection) { foreach (var conn in item.DstConnections.ThermalElement2TIPCollection) { CyPhy.TestInjectionPoint tip = conn.DstEnds.TestInjectionPoint; if (tip.AllReferred == null) continue; List<CyPhy.Component> testComponents = new List<CyPhy.Component>(); if (tip.AllReferred is CyPhy.ComponentAssembly) { CollectLeafComponents(testComponents, tip.AllReferred as CyPhy.ComponentAssembly); } else if (tip.AllReferred is CyPhy.Component) { // Interested in components with CAD Model only if ((tip.AllReferred as CyPhy.Component).Children.CADModelCollection.Any()) testComponents.Add(tip.AllReferred as CyPhy.Component); } foreach (var component in testComponents) { FEAThermalElement[] element = FEAThermalElement.Extract(item, component.Attributes.InstanceGUID, null); if (element.Where(e => e.Type == "Convection").Any()) { convectionPresent = true; } ThermalElements.AddRange(element); } } foreach (var conn in item.DstConnections.ThermalElements2GeometryCollection) { CyPhy.GeometryBase geometryBase = conn.DstEnds.GeometryTypes; string tipContextPath = Path.GetDirectoryName(geometryBase.Path); CADGeometry geometryRep = FillOutGeometryRep(geometryBase.Impl as MgaFCO, tipContextPath); FEAThermalElement[] element = FEAThermalElement.Extract(item, null, geometryRep); ThermalElements.AddRange(element); } } if (testBench.Children.ThermalEnvironmentCollection.Any()) { if (testBench.Children.ThermalEnvironmentCollection.Count() > 1) { Logger.Instance.AddLogMessage("Multiple ThermalEnvironments are present in the testbench. There should be only one.", Severity.Error); } else { if (!testBench.Children.ThermalEnvironmentCollection.First().Children.ParameterCollection.Any()) { Logger.Instance.AddLogMessage("ThermalEnvironment is present but there are no parameters specified in it.", Severity.Warning); } else { foreach (var param in testBench.Children.ThermalEnvironmentCollection.First().Children.ParameterCollection) { var elem = new FEAThermalElement(param) { Unit = "K", ComponentID = cadDataContainer.assemblies.First().Key }; ThermalElements.Add(elem); ambientTempPresent = true; } } } } if (convectionPresent && !ambientTempPresent) { Logger.Instance.AddLogMessage("Convection is present but no Ambient Temperature has been specified. Please specify Ambient Temperature.", Severity.Error); } // Constraints foreach (var cyphyconstraint in testBench.Children.AnalysisConstraintCollection) { if (cyphyconstraint.Kind == "PinConstraint") { CyPhy.PinConstraint pinConstraint = CyPhyClasses.PinConstraint.Cast(cyphyconstraint.Impl); // Geometry - must be a cylinder foreach (var geometry in pinConstraint.DstConnections.Pin2CylinderCollection) { FEAPinConstraint feapinRep = new FEAPinConstraint(); feapinRep.AxialDisplacement = pinConstraint.Attributes.AxialDisplacement.ToString(); feapinRep.AxialRotation = pinConstraint.Attributes.AxialRotation.ToString(); CyPhy.CylinderGeometryType cylinderType = geometry.DstEnds.CylinderGeometryType; if (cylinderType != null) { string tipContextPath = Path.GetDirectoryName(cylinderType.Path); AddGeometry2Constraint(feapinRep, cylinderType.Impl as MgaFCO, tipContextPath, true); } } } else if (cyphyconstraint.Kind == "BallConstraint") { CyPhy.BallConstraint ballConstraint = CyPhyClasses.BallConstraint.Cast(cyphyconstraint.Impl); foreach (var item in ballConstraint.DstConnections.Ball2SphereCollection) { FEABallConstraint feaballRep = new FEABallConstraint(); CyPhy.SphereGeometryType sphereType = item.DstEnds.SphereGeometryType; if (sphereType != null) { string tipContextPath = Path.GetDirectoryName(sphereType.Path); AddGeometry2Constraint(feaballRep, sphereType.Impl as MgaFCO, tipContextPath, true); } } } else if (cyphyconstraint.Kind == "DisplacementConstraint") { CyPhy.DisplacementConstraint displacementConstraint = CyPhyClasses.DisplacementConstraint.Cast(cyphyconstraint.Impl); string tx = "FREE", ty = "FREE", tz = "FREE", tunit = "mm", rx = "FREE", ry = "FREE", rz = "FREE", runit = "deg"; CyPhy.Rotation rotation = displacementConstraint.Children.RotationCollection.FirstOrDefault(); if (rotation != null) { bool hasScalar = (rotation.Attributes.XDirection == CyPhyClasses.Rotation.AttributesClass.XDirection_enum.SCALAR) || (rotation.Attributes.YDirection == CyPhyClasses.Rotation.AttributesClass.YDirection_enum.SCALAR) || (rotation.Attributes.ZDirection == CyPhyClasses.Rotation.AttributesClass.ZDirection_enum.SCALAR) ; rx = (rotation.Attributes.XDirection == CyPhyClasses.Rotation.AttributesClass.XDirection_enum.SCALAR) ? rotation.Attributes.XDirectionValue.ToString() : rotation.Attributes.XDirection.ToString(); ry = (rotation.Attributes.YDirection == CyPhyClasses.Rotation.AttributesClass.YDirection_enum.SCALAR) ? rotation.Attributes.YDirectionValue.ToString() : rotation.Attributes.YDirection.ToString(); rz = (rotation.Attributes.ZDirection == CyPhyClasses.Rotation.AttributesClass.ZDirection_enum.SCALAR) ? rotation.Attributes.ZDirectionValue.ToString() : rotation.Attributes.ZDirection.ToString(); if (!hasScalar) { runit = "N/A"; } else { if (rotation.Referred.unit != null) runit = rotation.Referred.unit.Name; } } CyPhy.Translation translation = displacementConstraint.Children.TranslationCollection.FirstOrDefault(); if (translation != null) { bool hasScalar = (translation.Attributes.XDirection == CyPhyClasses.Translation.AttributesClass.XDirection_enum.SCALAR) || (translation.Attributes.YDirection == CyPhyClasses.Translation.AttributesClass.YDirection_enum.SCALAR) || (translation.Attributes.ZDirection == CyPhyClasses.Translation.AttributesClass.ZDirection_enum.SCALAR); tx = (translation.Attributes.XDirection == CyPhyClasses.Translation.AttributesClass.XDirection_enum.SCALAR) ? translation.Attributes.XDirectionValue.ToString() : translation.Attributes.XDirection.ToString(); ty = (translation.Attributes.YDirection == CyPhyClasses.Translation.AttributesClass.YDirection_enum.SCALAR) ? translation.Attributes.YDirectionValue.ToString() : translation.Attributes.YDirection.ToString(); tz = (translation.Attributes.ZDirection == CyPhyClasses.Translation.AttributesClass.ZDirection_enum.SCALAR) ? translation.Attributes.ZDirectionValue.ToString() : translation.Attributes.ZDirection.ToString(); if (!hasScalar) { tunit = "N/A"; } else { if (translation.Referred.unit != null) tunit = translation.Referred.unit.Name; } } foreach (var item in displacementConstraint.DstConnections.Displacement2GeometryCollection) { FEADisplacementConstraint feadispRep = new FEADisplacementConstraint(); feadispRep.Rotation_X = rx; feadispRep.Rotation_Y = ry; feadispRep.Rotation_Z = rz; feadispRep.RotationUnits = runit; feadispRep.Translation_X = tx; feadispRep.Translation_Y = ty; feadispRep.Translation_Z = tz; feadispRep.TranslationUnits = tunit; Logger.Instance.AddLogMessage(String.Format("DisplacementConstraint Units - Rotation Component = {0}, Translation Component = {1}", runit, tunit), Severity.Info); CyPhy.GeometryBase geometry = item.DstEnds.GeometryBase; if (geometry != null) { string tipContextPath = Path.GetDirectoryName(geometry.Path); AddGeometry2Constraint(feadispRep, geometry.Impl as MgaFCO, tipContextPath, true); } } } } // Loads foreach (var cyphyload in testBench.Children.AnalysisLoadCollection) { if (cyphyload is CyPhy.ForceLoadParam) { CyPhy.ForceLoadParam forceLoad = CyPhyClasses.ForceLoadParam.Cast(cyphyload.Impl); double fx = 0.0, fy = 0.0, fz = 0.0, mx = 0.0, my = 0.0, mz = 0.0; string funit = "N", munit = "N-mm"; CyPhy.Parameter p1 = GetForceLoadParam(forceLoad, "ForceX", out fx); GetForceLoadParam(forceLoad, "ForceY", out fy); GetForceLoadParam(forceLoad, "ForceZ", out fz); CyPhy.Parameter p2 = GetForceLoadParam(forceLoad, "MomentX", out mx); GetForceLoadParam(forceLoad, "MomentY", out my); GetForceLoadParam(forceLoad, "MomentZ", out mz); GetParamUnitName(p1, ref funit); GetParamUnitName(p2, ref munit); foreach (var item in forceLoad.DstConnections.ForceLoadParam2GeometryCollection) { FEAForceLoad feaforceRep = new FEAForceLoad(); feaforceRep.Force_X = fx; feaforceRep.Force_Y = fy; feaforceRep.Force_Z = fz; feaforceRep.ForceUnit = funit; feaforceRep.Moment_X = mx; feaforceRep.Moment_Y = my; feaforceRep.Moment_Z = mz; feaforceRep.MomentUnit = munit; Logger.Instance.AddLogMessage(String.Format("ForceLoad Units - Force Component = {0}, Moment Component = {1}", funit, munit), Severity.Info); CyPhy.GeometryBase geometry = item.DstEnds.GeometryBase; if (geometry != null) { string tipContextPath = Path.GetDirectoryName(geometry.Path); AddGeometry2Load(feaforceRep, geometry.Impl as MgaFCO, tipContextPath, true); } } } else if (cyphyload is CyPhy.ForceLoad) { Logger.Instance.AddLogMessage("ForceLoad is used in FEA testbench. This construct is obsolete, please use ForceLoadParam instead.", Severity.Warning); CyPhy.ForceLoad forceLoad = CyPhyClasses.ForceLoad.Cast(cyphyload.Impl); double fx = 0.0, fy = 0.0, fz = 0.0, mx = 0.0, my = 0.0, mz = 0.0; string funit = "N", munit = "N-mm"; CyPhy.Force force = forceLoad.Children.ForceCollection.FirstOrDefault(); if (force != null) { fx = force.Attributes.XDirectionValue; fy = force.Attributes.YDirectionValue; fz = force.Attributes.ZDirectionValue; if (force.Referred.unit != null) funit = force.Referred.unit.Name; } CyPhy.Moment moment = forceLoad.Children.MomentCollection.FirstOrDefault(); if (moment != null) { mx = moment.Attributes.XDirectionValue; my = moment.Attributes.YDirectionValue; mz = moment.Attributes.ZDirectionValue; if (moment.Referred.unit != null) munit = moment.Referred.unit.Name; } foreach (var item in forceLoad.DstConnections.Force2GeometryCollection) { FEAForceLoad feaforceRep = new FEAForceLoad(); feaforceRep.Force_X = fx; feaforceRep.Force_Y = fy; feaforceRep.Force_Z = fz; feaforceRep.ForceUnit = funit; feaforceRep.Moment_X = mx; feaforceRep.Moment_Y = my; feaforceRep.Moment_Z = mz; feaforceRep.MomentUnit = munit; Logger.Instance.AddLogMessage(String.Format("ForceLoad Units - Force Component = {0}, Moment Component = {1}", funit, munit), Severity.Info); CyPhy.GeometryBase geometry = item.DstEnds.GeometryBase; if (geometry != null) { string tipContextPath = Path.GetDirectoryName(geometry.Path); AddGeometry2Load(feaforceRep, geometry.Impl as MgaFCO, tipContextPath, true); } } } else if (cyphyload is CyPhy.AccelerationLoadParam) { CyPhy.AccelerationLoadParam acceleration = CyPhyClasses.AccelerationLoadParam.Cast(cyphyload.Impl); FEAccelerationLoad feaaccelRep = new FEAccelerationLoad(); double x = 0; double y = 0; double z = 0; CyPhy.Parameter p1 = GetAccelerationLoadParam(acceleration, "X", out x); GetAccelerationLoadParam(acceleration, "Y", out y); GetAccelerationLoadParam(acceleration, "Z", out z); feaaccelRep.X = x; feaaccelRep.Y = y; feaaccelRep.Z = z; string unit = "mm/s^2"; GetParamUnitName(p1, ref unit); feaaccelRep.Units = unit; Logger.Instance.AddLogMessage(String.Format("AccelerationLoad Units = {0}", feaaccelRep.Units), Severity.Info); this.Loads.Add(feaaccelRep); } else if (cyphyload is CyPhy.AccelerationLoad) { Logger.Instance.AddLogMessage("AccelerationLoad is used in FEA testbench. This construct is obsolete, please use AccelerationLoadParam instead.", Severity.Warning); CyPhy.AccelerationLoad acceleration = CyPhyClasses.AccelerationLoad.Cast(cyphyload.Impl); FEAccelerationLoad feaaccelRep = new FEAccelerationLoad(); feaaccelRep.X = acceleration.Attributes.XDirectionValue; feaaccelRep.Y = acceleration.Attributes.YDirectionValue; feaaccelRep.Z = acceleration.Attributes.ZDirectionValue; if (acceleration.Referred.unit != null) feaaccelRep.Units = acceleration.Referred.unit.Name; else feaaccelRep.Units = "mm/s^2"; Logger.Instance.AddLogMessage(String.Format("AccelerationLoad Units = {0}", feaaccelRep.Units), Severity.Info); this.Loads.Add(feaaccelRep); } else if (cyphyload is CyPhy.PressureLoadParam) { CyPhy.PressureLoadParam pressure = CyPhyClasses.PressureLoadParam.Cast(cyphyload.Impl); foreach (var item in pressure.DstConnections.PressureParam2GeometryCollection) { FEAPressureLoad feapressRep = new FEAPressureLoad(); double p = 0; CyPhy.Parameter p1 = GetPressureLoadParam(pressure, "PressureLoad", out p); feapressRep.Value = p; string unit = "MPa"; GetParamUnitName(p1, ref unit); feapressRep.Units = unit; Logger.Instance.AddLogMessage(String.Format("PressureLoad Units = {0}", feapressRep.Units), Severity.Info); CyPhy.GeometryBase geometry = item.DstEnds.GeometryBase; if (geometry != null) { string tipContextPath = Path.GetDirectoryName(geometry.Path); AddGeometry2Load(feapressRep, geometry.Impl as MgaFCO, tipContextPath, true); } } } else if (cyphyload is CyPhy.PressureLoad) { Logger.Instance.AddLogMessage("PressureLoad is used in FEA testbench. This construct is obsolete, please use PressureLoadParam instead.", Severity.Warning); CyPhy.PressureLoad pressure = CyPhyClasses.PressureLoad.Cast(cyphyload.Impl); foreach (var item in pressure.DstConnections.Pressure2GeometryCollection) { FEAPressureLoad feapressRep = new FEAPressureLoad(); feapressRep.Value = pressure.Attributes.Value; if (pressure.Referred.unit != null) feapressRep.Units = pressure.Referred.unit.Name; else feapressRep.Units = "MPa"; Logger.Instance.AddLogMessage(String.Format("PressureLoad Units = {0}", feapressRep.Units), Severity.Info); CyPhy.GeometryBase geometry = item.DstEnds.GeometryBase; if (geometry != null) { string tipContextPath = Path.GetDirectoryName(geometry.Path); AddGeometry2Load(feapressRep, geometry.Impl as MgaFCO, tipContextPath, true); } } } } // Post Processing Blocks foreach (var postprocess in testBench.Children.PostProcessingCollection) { PostProcessScripts.Add(postprocess.Attributes.ScriptPath); } }
public static FEAThermalElement[] Extract(CyPhy.ThermalFEAElements thermalElement, string compid, CADGeometry geom) { List<FEAThermalElement> result = new List<FEAThermalElement>(); if (thermalElement is CyPhy.ThermalEnvironment) { if ((thermalElement as CyPhy.ThermalEnvironment).Children.ParameterCollection.Any()) { var param = (thermalElement as CyPhy.ThermalEnvironment).Children.ParameterCollection.First(); string role = ((MgaFCO)param.Impl).MetaRole.Name; var elem = new FEAThermalElement(param) { ComponentID = compid, Geometry = geom }; result.Add(elem); } } else if (thermalElement is CyPhy.ThermalLoad) { foreach (var param in (thermalElement as CyPhy.ThermalLoad).Children.ParameterCollection) { var elem = new FEAThermalElement(param) { ComponentID = compid, Geometry = geom }; if (elem.Type == "Convection") { elem.Unit = "J/(s-mm^2-K)"; } else if (elem.Type == "HeatFlux") { elem.Unit = "J/(s-mm^2)"; } else if (elem.Type == "HeatGeneration") { elem.Unit = "J/s"; } else if (elem.Type == "InitialTemperature") { elem.Unit = "K"; } else if (elem.Type == "SpecifiedTemperature") { elem.Unit = "K"; } result.Add(elem); } } return result.ToArray(); }