/// <summary>
        ///
        /// </summary>
        /// <param name="DA"></param>
        private void InitializeSolver(IGH_DataAccess DA, DynamicRemesher.Settings settings)
        {
            GH_HeMesh3d source = null;

            if (!DA.GetData(0, ref source))
            {
                return;
            }

            IGH_Goo targetGoo = null;

            if (!DA.GetData(1, ref targetGoo))
            {
                return;
            }

            var featsGoo = new List <GH_ObjectWrapper>();

            DA.GetDataList(2, featsGoo);

            var target   = CreateSurfaceFeature(targetGoo);
            var features = featsGoo.Select(obj => (IFeature)obj.Value).Concat(CreateBoundaryFeatures(source));

            _solver = DynamicRemesher.Solver.Create(source.Value, target, features, settings);
        }
        /// <inheritdoc />
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            int state = 0;

            if (!DA.GetData(6, ref state))
            {
                return;
            }

            // reset
            if (state == 0)
            {
                _solver = null;
                return;
            }

            GH_ObjectWrapper settingsGoo = null;

            if (!DA.GetData(4, ref settingsGoo))
            {
                return;
            }

            if (_solver == null)
            {
                InitializeSolver(DA, (DynamicRemesher.Settings)settingsGoo.Value);
            }
            else
            {
                _solver.Settings = (DynamicRemesher.Settings)settingsGoo.Value;
            }

            // update length field
            GH_ObjectWrapper fieldGoo = null;

            if (DA.GetData(3, ref fieldGoo))
            {
                _solver.LengthField = (IField3d <double>)fieldGoo.Value;
            }
            else
            {
                _solver.LengthField = null;
            }

            int subSteps = 0;

            DA.GetData(5, ref subSteps);

            // step
            for (int i = 0; i < subSteps; i++)
            {
                _solver.Step();
            }

            _print.AppendLine($"{_solver.StepCount} steps");

            // output
            DA.SetData(0, new GH_String(_print.ToString()));
            DA.SetData(1, new GH_HeMesh3d(HeMesh3d.Factory.CreateCopy(_solver.Mesh, _setV, null, null)));

            // recall
            if (state == 1)
            {
                ExpireSolution(true);
            }

            _print.Clear();
        }
        /// <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)
        {
            int state = 0;

            if (!DA.GetData(6, ref state))
            {
                return;
            }

            // reset
            if (state == 0)
            {
                _solver = null;
                return;
            }

            // initialize
            if (_solver == null)
            {
                GH_HeMesh3d source = null;
                if (!DA.GetData(0, ref source))
                {
                    return;
                }

                GH_Mesh target = null;
                if (!DA.GetData(1, ref target))
                {
                    return;
                }

                var feats = new List <GH_ObjectWrapper>();
                DA.GetDataList(2, feats);

                _solver = DynamicRemesher.Solver.Create(
                    source.Value.Duplicate(), new MeshFeature(target.Value),
                    feats.Select(f => (IFeature)f.Value)
                    );
            }

            // update dynamic parameters
            GH_ObjectWrapper goo = null;

            // update fields
            if (DA.GetData(3, ref goo))
            {
                _solver.LengthField = (IField3d <double>)goo.Value;
            }
            else
            {
                _solver.LengthField = null;
            }

            // update settings
            if (!DA.GetData(4, ref goo))
            {
                return;
            }
            _solver.Settings = (DynamicRemesher.Settings)goo.Value;

            int subSteps = 0;

            DA.GetData(5, ref subSteps);

            // step
            for (int i = 0; i < subSteps; i++)
            {
                _solver.Step();
            }

            _print.AppendLine($"{_solver.StepCount} steps");

            // output
            DA.SetData(0, new GH_String(_print.ToString()));
            DA.SetData(1, new GH_HeMesh3d(HeMesh3d.Factory.CreateCopy(_solver.Mesh, _setV, delegate { }, delegate { })));

            // recall
            if (state == 1)
            {
                ExpireSolution(true);
            }

            _print.Clear();
        }