/// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object can be used to retrieve data from input parameters and
        /// to store data in output parameters.</param>
        protected override void SolveInstance(IGH_DataAccess DA, EvaluationUnit unit)
        {
            var run = false;

            var combos = new List <int>();
            var mass   = 0.0;


            var        modelName = "";
            IModel     model     = null;
            IModelData data      = null;

            var errorMsg = new List <string>();

            DA.GetData(1, ref run);
            if (run)
            {
                if (!DA.GetData(2 + 1, ref modelName))
                {
                    Component_GetData.ConnectRFEM(ref model, ref data);
                }
                else
                {
                    Component_GetData.ConnectRFEM(modelName, ref model, ref data);
                }
                try
                {
                    //Calculate Load Combos
                    DA.GetDataList(0, combos);
                    var myCalculation = model.GetCalculation();
                    myCalculation.Clean();
                    foreach (var no in combos)
                    {
                        ErrorInfo[] errormsg = myCalculation.Calculate(LoadingType.LoadCombinationType, 1);
                    }

                    // Get EC3 LoadCase
                    var myEC3 = (Dlubal.STEEL_EC3.Module)model.GetModule("STEEL_EC3");
                    Dlubal.STEEL_EC3.ICase myCaseEC3 = myEC3.moGetCase(1, ITEM_AT.AT_NO);

                    // Get Cross Sections
                    // Select cross sections?
                    var countCS = myCaseEC3.moGetCrossSectionsCount();
                    for (int i = 0; i < countCS; i++)
                    {
                        Dlubal.STEEL_EC3.CROSS_SECTION myCSEC3 = myCaseEC3.moGetCrossSection(i + 1, ITEM_AT.AT_NO);
                        myCSEC3.Optimization = 1;
                        myCaseEC3.moSetCrossSection(myCSEC3.No, ITEM_AT.AT_NO, myCSEC3);
                    }

                    // Berechnung durchführen
                    var error = myCaseEC3.moCalculate();

                    //Querschnitt an RFEM übergeben.
                    var myCSECRFEM = new List <CrossSection>();
                    for (int i = 0; i < countCS; i++)
                    {
                        Dlubal.STEEL_EC3.CROSS_SECTION myCSEC3 = myCaseEC3.moGetCrossSection(i + 1, ITEM_AT.AT_NO);
                        var myCS = data.GetCrossSection(i + 1, ItemAt.AtNo).GetData();
                        myCS.TextID      = myCSEC3.Description;
                        myCS.Description = myCSEC3.Description;
                        myCSECRFEM.Add(myCS);
                    }

                    // Set Data
                    data.PrepareModification();
                    foreach (var crosec in myCSECRFEM)
                    {
                        data.SetCrossSection(crosec);
                    }
                    data.FinishModification();

                    // Get steel mass
                    var members = data.GetMembers();
                    mass = members.Sum(item => item.Weight);
                }
                catch (Exception ex)
                {
                    Component_GetData.DisconnectRFEM(ref model, ref data);
                    throw ex;
                }
                Component_GetData.DisconnectRFEM(ref model, ref data);
            }
            // Assign Output
            DA.SetData(0, mass);


            if (errorMsg.Count != 0)
            {
                //errorMsg.Add("List item index may be one unit lower than object number");
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, String.Join(System.Environment.NewLine, errorMsg.ToArray()));
            }
        }