/// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            solverOpt = new IguanaGmshSolver3D();

            DA.GetData(0, ref sizeFactor);
            DA.GetData(1, ref minSize);
            DA.GetData(2, ref maxSize);
            DA.GetData(3, ref minPts);
            DA.GetData(4, ref adaptive);
            DA.GetData(5, ref minElemPerTwoPi);
            DA.GetData(6, ref steps);
            DA.GetData(7, ref qualityType);
            DA.GetData(8, ref qualityThreshold);
            DA.GetData(9, ref recombine);

            solverOpt.MeshingAlgorithm                  = MeshSolvers3D.Delaunay;
            solverOpt.CharacteristicLengthFactor        = sizeFactor;
            solverOpt.CharacteristicLengthMin           = minSize;
            solverOpt.CharacteristicLengthMax           = maxSize;
            solverOpt.CharacteristicLengthFromCurvature = adaptive;
            solverOpt.OptimizationSteps                 = steps;
            solverOpt.OptimizeThreshold                 = qualityThreshold;
            solverOpt.HighOrderOptimize                 = ho_optimization;
            solverOpt.ElementOrder = 2;

            string method = Enum.GetName(typeof(ElementQualityType), qualityType);

            if (method != null)
            {
                qualityType = 2;
            }
            solverOpt.QualityType = qualityType;

            method = Enum.GetName(typeof(RecombinationAlgorithm), recombine);
            if (method == null)
            {
                recombine = 2;
            }
            solverOpt.RecombinationAlgorithm = recombine;
            solverOpt.RecombineAll           = true;

            DA.SetData(0, solverOpt);

            this.Message = "20Hexa+13Pyram";
        }
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            if (recompute)
            {
                Mesh               bMesh         = null;
                Vector3d           dir           = new Vector3d();
                List <double>      lengths       = new List <double>();
                List <int>         divisions     = new List <int>();
                IguanaGmshField    field         = null;
                IguanaGmshSolver3D solverOptions = new IguanaGmshSolver3D();

                DA.GetData(0, ref bMesh);
                DA.GetData(1, ref dir);
                DA.GetDataList(2, lengths);
                DA.GetDataList(3, divisions);
                DA.GetData(4, ref field);
                DA.GetData(7, ref solverOptions);

                List <IguanaGmshConstraint> constraints = new List <IguanaGmshConstraint>();
                foreach (var obj in base.Params.Input[5].VolatileData.AllData(true))
                {
                    IguanaGmshConstraint c;
                    obj.CastTo <IguanaGmshConstraint>(out c);
                    constraints.Add(c);
                }

                List <IguanaGmshTransfinite> transfinite = new List <IguanaGmshTransfinite>();
                foreach (var obj in base.Params.Input[6].VolatileData.AllData(true))
                {
                    IguanaGmshTransfinite t;
                    obj.CastTo <IguanaGmshTransfinite>(out t);
                    transfinite.Add(t);
                }


                // Extract required data from base surface
                if (!bMesh.IsClosed)
                {
                    IguanaGmsh.Initialize();

                    Tuple <int, int>[] dimTags;
                    IguanaGmshFactory.Geo.GmshSurfaceFromMesh(bMesh, out dimTags);
                    Tuple <int, int>[] temp;
                    IguanaGmsh.Model.GetEntities(out temp, 2);

                    bool synchronize = true;
                    if (constraints.Count > 0)
                    {
                        synchronize = false;
                    }

                    // Embed constraints
                    if (!synchronize)
                    {
                        IguanaGmshFactory.Geo.EmbedConstraintsOnSurface(constraints, temp[0].Item2, true);
                    }

                    //Transfinite
                    if (transfinite.Count > 0)
                    {
                        IguanaGmshFactory.ApplyTransfiniteSettings(transfinite);
                    }

                    // Extrude
                    Tuple <int, int>[] ov;
                    IguanaGmsh.Model.Geo.Extrude(temp, dir.X, dir.Y, dir.Z, out ov, divisions.ToArray(), lengths.ToArray(), true);

                    IguanaGmsh.Model.Geo.Synchronize();

                    // Preprocessing settings
                    //solverOptions.ApplyBasic3DSettings();
                    //solverOptions.ApplyAdvanced3DSettings();

                    // 2d mesh generation
                    IguanaGmsh.Model.Mesh.Generate(3);

                    // Iguana mesh construction
                    mesh = IguanaGmshFactory.TryGetIMesh(3);
                    IguanaGmshFactory.TryGetEntitiesID(out entitiesID);

                    IguanaGmsh.FinalizeGmsh();
                }
            }

            recompute = true;
            DA.SetData(0, mesh);
        }