public override void Evaluate(FSharpList <Value> args, Dictionary <PortData, Value> outPuts)
        {
            object arg0 = ((Value.Container)args[0]).Item;

            Autodesk.Revit.DB.Face f = null;
            if (arg0 is Reference)
            {
                Reference faceRef = arg0 as Reference;
                f = dynRevitSettings.Doc.Document.GetElement(faceRef.ElementId).GetGeometryObjectFromReference(faceRef) as Autodesk.Revit.DB.Face;
            }

            double d    = ((Value.Number)args[1]).Item;      //dampening
            double s    = ((Value.Number)args[2]).Item;      //spring constant
            double r    = ((Value.Number)args[3]).Item;      //rest length
            double m    = ((Value.Number)args[4]).Item;      //nodal mass
            int    numX = (int)((Value.Number)args[5]).Item; //number of particles in X
            int    numY = (int)((Value.Number)args[6]).Item; //number of particles in Y
            double g    = ((Value.Number)args[7]).Item;      //gravity z component

            ParticleSystem.setIsFaceConstrained(true);
            ParticleSystem.setConstraintFace(f);

            ParticleSystem.Clear();

            setupParticleSystem(f, numX, numY, d, r, s, m);
            ParticleSystem.setGravity(g);

            outPuts[OutPortData[0]] = Value.NewContainer(ParticleSystem);
        }