コード例 #1
0
        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;

                TBComputationType tbcomputation = new TBComputationType();
                tbcomputation.MetricID = item.DstEnds.Metric.ID;
                tbcomputation.ComputationType = cadcomputation.Kind;
                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 (!DataExchangeFormats.Contains(stepFormat))
                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;
            }
        }
コード例 #2
0
        public override void TraverseTestBench(CyPhy.TestBenchType testBenchBase)
        {
            // META-3195 - CFD needs Inventor format now instead of STL ASCII
            STLDataExchangeFormats.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)
            {
                TBComputationType tbcomputation = new TBComputationType();
                tbcomputation.MetricID = conn.DstEnds.Metric.ID;
                tbcomputation.ComputationType = "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);
            }

        }
コード例 #3
0
        public override void TraverseTestBench(CyPhy.TestBenchType testBenchBase)
        {
            string stepFormat = "AP203_E2_Single_File";
            if (!DataExchangeFormats.Contains(stepFormat))
                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)
            {
                CyPhy.BallisticComputationType cadcomputation = item.SrcEnds.BallisticComputationType;

                TBComputationType tbcomputation = new TBComputationType();
                tbcomputation.MetricID = item.DstEnds.Metric.ID;
                tbcomputation.ComputationType = cadcomputation.Kind;
                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);
                }

            }
        }
コード例 #4
0
        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;
            /*
            ElementType = testBench.Attributes.ElementShapeType.ToString();
            ShellType = (testBench.Attributes.ShellElementType == CyPhyClasses.CADTestBench.AttributesClass.ShellElementType_enum.N_A) ? 
                        testBench.Attributes.ShellElementType.ToString().Replace("_", "/") :
                        testBench.Attributes.ShellElementType.ToString();
            SolverType = testBench.Attributes.SolverType.ToString();

            if (testBench.Attributes.SolverType == CyPhyClasses.CADTestBench.AttributesClass.SolverType_enum.ANSYS)
                throw new NotImplementedException();

            MeshType = testBench.Attributes.MeshType.ToString();         
            MeshType = testBench.Attributes.MeshType.ToString(); 
            */            
            //testBench.Attributes.InfiniteCycle;
            //testBench.Attributes.NumerOfCycles.ToString();


            // 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)
                        {
                            TBComputationType tbcomputation = new TBComputationType();
                            tbcomputation.ComputationType = cyphycompport.Kind.Replace("Stress", "").Replace("Maximum", "");
                            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);
                        }
                    }
                }
            }

            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)
                        {
                            TBComputationType tbcomputation = new TBComputationType();
                            tbcomputation.ComputationType = cyphycompport.Kind;
                            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 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);
                        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 = "C", ComponentID = cadDataContainer.assemblies.First().Key };
                            ThermalElements.Add(elem);
                        }
                    }
                }
            }

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

                }
                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);
                        }
                    }
                }
                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);
                        }
                    }
                }
            }

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

                }
                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);
                        }
                    }
                }
                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);
                        }
                    }
                }
            }
            // Post Processing Blocks
            foreach (var postprocess in testBench.Children.PostProcessingCollection)
            {
                PostProcessScripts.Add(postprocess.Attributes.ScriptPath);
            }


        }