Exemple #1
0
 public override void DrawViewportWires(Grasshopper.Kernel.IGH_PreviewArgs args)
 {
     if (lpS != null)
     {
         foreach (GH_particleSystem pS in lpS)
         {
             if (pS != null)
             {
                 if (pS.DVPW != null)
                 {
                     pS.DVPW(args);
                 }
             }
             var x = FriedChiken.getParticles();
             if (_VN)
             {
                 for (int i = 0; i < FriedChiken.nParticles; i++)
                 {
                     args.Display.Draw2dText(i.ToString("000"), System.Drawing.Color.Red, new Rhino.Geometry.Point3d(x[i, 0] + __dist, x[i, 1], x[i, 2]), true);
                 }
             }
         }
     }
     base.DrawViewportWires(args);
 }
        public void begin(particleSystem pS)
        {
            foreach (elements.node n in nodeList)
            {
                n.copyFrom(pS.particles);
            }
            initialNodes = new matrix(nNodes, __dim);
            for (int i = 0; i < nNodes; i++)
            {
                initialNodes[i, 0] = nodeList[i].getNodes()[0, 0];
                initialNodes[i, 1] = nodeList[i].getNodes()[0, 1];
                initialNodes[i, 2] = nodeList[i].getNodes()[0, 2];
            }
            vector _mask = FriedChiken.getMask();

            foreach (elements.node n in nodeList)
            {
                if (fixX)
                {
                    _mask[FriedChiken.index[pS.globalIndex[n.el[0]], 0]] = 1;
                }
                if (fixY)
                {
                    _mask[FriedChiken.index[pS.globalIndex[n.el[0]], 1]] = 1;
                }
                if (fixZ)
                {
                    _mask[FriedChiken.index[pS.globalIndex[n.el[0]], 2]] = 1;
                }
            }
        }
Exemple #3
0
 public override void BakeGeometry(Rhino.RhinoDoc doc, Rhino.DocObjects.ObjectAttributes att, List <Guid> obj_ids)
 {
     if (lpS != null)
     {
         foreach (GH_particleSystem pS in lpS)
         {
             if (pS != null)
             {
                 if (pS.BKGT != null)
                 {
                     pS.BKGT(doc, att, obj_ids);
                 }
             }
         }
     }
     if (_VN)
     {
         var x = FriedChiken.getParticles();
         for (int i = 0; i < FriedChiken.nParticles; i++)
         {
             Rhino.DocObjects.ObjectAttributes a2 = att.Duplicate();
             a2.LayerIndex = 2;
             obj_ids.Add(doc.Objects.AddTextDot(new Rhino.Geometry.TextDot(i.ToString("000"), new Rhino.Geometry.Point3d(x[i, 0] + __dist, x[i, 1], x[i, 2])), a2));
         }
     }
     base.BakeGeometry(doc, att, obj_ids);
 }
        public void update(particleSystem pS)
        {
            vector load = FriedChiken.getLoad();

            foreach (elements.node n in nodeList)
            {
                load[FriedChiken.index[pS.globalIndex[n.el[0]], 0]] += this.forceX;
                load[FriedChiken.index[pS.globalIndex[n.el[0]], 1]] += this.forceY;
                load[FriedChiken.index[pS.globalIndex[n.el[0]], 2]] += this.forceZ;
            }
        }
Exemple #5
0
        private void phi()
        {
            var jacob = ShoNS.Array.DoubleArray.From(FriedChiken.getJacobian().rawData);
            var omega = ShoNS.Array.DoubleArray.From(FriedChiken.omega.rawData);

            jacob = jacob.T;
            omega = omega.T;
            var solver  = new ShoNS.Array.Solver(jacob);
            var _lambda = solver.Solve(omega);

            _lambda.CopyTo(lambda, 0);
            FriedChiken.omega.xminusyA(FriedChiken.omega, lambda, FriedChiken.getJacobian());
        }
        public void update(particleSystem pS)
        {
            vector grad = FriedChiken.getGradient();
            vector load = FriedChiken.getLoad();

            System.Threading.Tasks.Parallel.For(0, elemList.Count, (i) =>
            {
                elements.element e = elemList[i];
                e.copyFrom(pS.particles);
                e.Update();
            }
                                                );

            for (int i = 0; i < elemList.Count; i++)
            {
                elements.element e = elemList[i];
                e.Merge(pS, grad, load, ref FriedChiken.energy);
            }
        }
Exemple #7
0
        private void varphi()
        {
            double norm = FriedChiken.q.norm;

            matrix.y_equals_Ax(FriedChiken.getJacobian(), FriedChiken.q, qr);
            var jacob = ShoNS.Array.DoubleArray.From(FriedChiken.getJacobian().rawData);
            var _qr   = ShoNS.Array.DoubleArray.From(qr.rawData).T;
            var solve = new ShoNS.Array.Solver(jacob);
            var z     = solve.Solve(_qr);

            double[] _qo = qo.rawData;
            z.CopyTo(_qo, 0);
            FriedChiken.q.Subtract(qo);
            if (FriedChiken.q.norm != 0)
            {
                FriedChiken.q.dividedby(FriedChiken.q.norm);
                FriedChiken.q.times(norm);
            }
        }
        public void update(particleSystem pS)
        {
            vector r = FriedChiken.getResidual();
            matrix J = FriedChiken.getJacobian();

            currentVolume = 0;
            for (int i = 0; i < J.nCol; i++)
            {
                J[number, i] = 0;
            }
            for (int i = 0; i < (int)elemList.Count; i++)
            {
                elements.element e = elemList[i];
                e.copyFrom(pS.particles);
                e.Update();
                e.Merge(pS, J, this.number);
                currentVolume += e.Volume;
            }
            r[number] = currentVolume - refVolume;
        }
 unsafe public void begin(particleSystem pS)
 {
     foreach (elements.element e in this.elemList)
     {
         e.copyFrom(pS.particles);
         e.setMaterial(em, gvt);
         e.Update();
         e.memoryMetric();
     }
     if (refVolume < 0)
     {
         refVolume = 0;
         foreach (elements.element e in this.elemList)
         {
             refVolume += e.Volume;
         }
     }
     this.number = FriedChiken.requestConditionNumber();
     makeBoundary();
 }
Exemple #10
0
        private int psi()
        {
            FriedChiken.Tick(t); //要素アップデート、勾配の計算
            FriedChiken.Tack(t); //マスク等後処理
            int itr = 0;

            for (int s = 0; s < 50; s++)
            {
                var ff     = ShoNS.Array.DoubleArray.From(FriedChiken.getJacobian().rawData);
                var g      = ShoNS.Array.DoubleArray.From(FriedChiken.getResidual().rawData).T;
                var solver = new ShoNS.Array.Solver(ff);
                var _dx    = solver.Solve(g);
                _dx.CopyTo(dx.rawData, 0);
                FriedChiken.x.Subtract(1.0, dx);
                FriedChiken.Tick(t); //要素アップデート、勾配の計算
                FriedChiken.Tack(t); //マスク等後処理
                itr++;
                if (FriedChiken.getResidual().norm < 0.0001)
                {
                    break;
                }
            }
            return(itr);
        }
Exemple #11
0
        protected override void SolveInstance(Grasshopper.Kernel.IGH_DataAccess DA)
        {
            stw.Stop();
            string dbg = stw.ElapsedMilliseconds.ToString();

            stw.Reset();
            double dist = 0;

            if (!DA.GetData(1, ref dist))
            {
                return;
            }
            if (_go == false)
            {
                t = 0;
                FriedChiken.clear();
                lpS = new List <GH_particleSystem>();

                if (fixedPointsGuids != null)
                {
                    foreach (Guid[] gs in fixedPointsGuids)
                    {
                        foreach (Guid g in gs)
                        {
                            Rhino.RhinoDoc.ActiveDoc.Objects.Delete(g, true);
                        }
                    }
                    fixedPointsGuids = null;
                }

                if (!DA.GetDataList(0, lpS))
                {
                    return;
                }
                particleSystem[] _ps = null;
                _ps = new particleSystem[lpS.Count];
                for (int i = 0; i < lpS.Count; i++)
                {
                    _ps[i] = lpS[i].Value;
                }
                FriedChiken.addParticleSystems(_ps);
                //FriedChiken.begin();
                __dist = dist;
                lS     = new List <Rhino.Geometry.GeometryBase>();
                lPC    = new List <Rhino.Geometry.PointCloud>();

                lfN = new List <NumericalMethodHelper.objects.fixedNodes>();
                fixedPointsGuids = new List <Guid[]>();

                foreach (GH_particleSystem pS in lpS)
                {
                    if (pS != null)
                    {
                        if (pS.UPGR != null)
                        {
                            pS.UPGR(dist, 0, 0);
                        }
                    }
                }
            }
            else
            {
                double dt = full.getDt();
                if (t == 0)
                {
                    output = new List <string>();
                    //firstAction(DA);
                    FriedChiken.clear();
                    lpS = new List <GH_particleSystem>();
                    if (!DA.GetDataList(0, lpS))
                    {
                        return;
                    }
                    particleSystem[] _ps = null;
                    _ps = new particleSystem[lpS.Count];
                    for (int i = 0; i < lpS.Count; i++)
                    {
                        _ps[i] = lpS[i].Value;
                    }
                    FriedChiken.addParticleSystems(_ps);
                    if (fixedPointsGuids != null)
                    {
                        foreach (Guid[] gs in fixedPointsGuids)
                        {
                            foreach (Guid g in gs)
                            {
                                Rhino.RhinoDoc.ActiveDoc.Objects.Delete(g, true);
                            }
                        }
                    }
                    FriedChiken.begin();
                    refX   = DoubleArray.From(FriedChiken.x.rawData);
                    __dist = dist;
                    if (FriedChiken.numCond > 0)
                    {
                        lambda = new vector(FriedChiken.numCond).zeros();
                        dx     = new vector(FriedChiken.q.nElem);
                        qo     = new vector(FriedChiken.q.nElem);
                        qr     = new vector(FriedChiken.numCond).zeros();
                    }
                    lS  = new List <Rhino.Geometry.GeometryBase>();
                    lPC = new List <Rhino.Geometry.PointCloud>();

                    lfN = new List <NumericalMethodHelper.objects.fixedNodes>();
                    fixedPointsGuids = new List <Guid[]>();
                    for (int i = 0; i < FriedChiken.particleSystems.Count; i++)
                    {
                        for (int j = 0; j < FriedChiken.particleSystems[i].objList.Count; j++)
                        {
                            if (FriedChiken.particleSystems[i].objList[j] is mikity.NumericalMethodHelper.objects.fixedNodes)
                            {
                                mikity.NumericalMethodHelper.objects.fixedNodes fN = (mikity.NumericalMethodHelper.objects.fixedNodes)FriedChiken.particleSystems[i].objList[j];
                                lfN.Add(fN);
                                fixedPointsGuids.Add(new Guid[fN.nNodes]);
                                Rhino.Geometry.Point3d[] ps = new Rhino.Geometry.Point3d[fN.nNodes];
                                Guid[] gs = fixedPointsGuids[fixedPointsGuids.Count - 1];

                                for (int k = 0; k < fN.nNodes; k++)
                                {
                                    ps[k] = new Rhino.Geometry.Point3d(fN.nodeList[k].getNodes()[0, 0] + dist, fN.nodeList[k].getNodes()[0, 1], fN.nodeList[k].getNodes()[0, 2]);
                                    gs[k] = Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(ps[k]);
                                }
                                Rhino.RhinoDoc.ActiveDoc.Groups.Add(gs);
                            }
                        }
                    }
                }
                //Computation

                while (stw.ElapsedMilliseconds < 25)
                {
                    stw.Start();
                    FriedChiken.Tick(t); //要素アップデート、勾配の計算
                    FriedChiken.Tack(t); //マスク等後処理
                    if (_IF)
                    {
                        FriedChiken.omega.zeros();
                    }
                    double resid = 0;
                    if (FriedChiken.numCond > 0)
                    {
                        resid = FriedChiken.getResidual().norm;
                        phi();
                    }
                    string tmp = "\t" + t.ToString() + "\t";
                    tmp += FriedChiken.omega.norm.ToString() + "\t";

                    if (_geodesic)
                    {
                        if (FriedChiken.numCond > 0)
                        {
                            varphi();
                        }
                    }
                    var    v     = DoubleArray.From(FriedChiken.q.rawData);
                    double normW = FriedChiken.omega.norm;
                    if (_normalize == true)
                    {
                        if (normW != 0)
                        {
                            FriedChiken.omega.dividedby(normW);//力を正規化
                        }
                        normW = FriedChiken.omega.norm;
                    }
                    var a = DoubleArray.From(FriedChiken.omega.rawData);

                    FriedChiken.omega.MinusTo(FriedChiken.r);//力を加速度に
                    double norm1 = (v * v.T)[0, 0];
                    double norm2 = (v * a.T)[0, 0];
                    double norm3 = (a * a.T)[0, 0];
                    double f     = 0;
                    if (norm1 * norm3 != 0)
                    {
                        f = -norm2 / Math.Sqrt(norm1 * norm3);
                    }
                    else if (norm1 == 0)
                    {
                        f = 1;
                    }
                    else
                    {
                        f = -1;
                    }
                    double damping = 0;
                    if (_drift1)
                    {
                        damping = Drift1(f);
                    }
                    else if (_drift2)
                    {
                        damping = Drift2(f);
                    }
                    else if (_drift3)
                    {
                        damping = Drift3(f);
                    }
                    else
                    {
                        damping = Drift0(f);
                    }
                    //damping = 0;
                    full.move(f);
                    dbg = "damping:" + damping.ToString() + "\n" + "dt:" + dt.ToString() + "\n" + "Step#:" + t.ToString();
                    full.setDbgText(dbg);
                    FriedChiken.q.times(damping).Add(dt, FriedChiken.r);
                    double normQ = FriedChiken.q.norm;
                    double K     = normQ * normQ * 0.5;
                    double P     = FriedChiken.energy;
                    double E     = K + P;
                    int    itr   = 0;
                    FriedChiken.x.Add(dt, FriedChiken.q);
                    if (FriedChiken.numCond > 0)
                    {
                        itr = psi();
                    }
                    full.addNorm(K, E, itr, normW, resid);

                    stw.Stop();
                    t++;
                    if (_RP == false)
                    {
                        break;
                    }
                }
                stw.Reset();

                //////////////
                for (int i = 0; i < lfN.Count; i++)
                {
                    Guid[] gs = fixedPointsGuids[i];
                    for (int j = 0; j < gs.Count(); j++)
                    {
                        Rhino.DocObjects.PointObject obj = (Rhino.DocObjects.PointObject)Rhino.RhinoDoc.ActiveDoc.Objects.Find(gs[j]);
                        Rhino.Geometry.Point3d       p   = new Rhino.Geometry.Point3d(obj.PointGeometry.Location.X, obj.PointGeometry.Location.Y, obj.PointGeometry.Location.Z);
                        if (lfN[i].fixX)
                        {
                            lfN[i].nodeList[j].getNodes()[0, 0] = lfN[i].nodeList[j].getNodes()[0, 0] * 0.95 + (p.X - dist) * 0.05; //*
                            if (dist != __dist)
                            {
                                p.X = p.X + dist - __dist;
                            }
                        }
                        else
                        {
                            p.X = lfN[i].nodeList[j].getNodes()[0, 0] + dist;
                        }
                        if (lfN[i].fixY)
                        {
                            lfN[i].nodeList[j].getNodes()[0, 1] = lfN[i].nodeList[j].getNodes()[0, 1] * 0.95 + p.Y * 0.05;//*
                        }
                        else
                        {
                            p.Y = lfN[i].nodeList[j].getNodes()[0, 1];
                        }
                        if (lfN[i].fixZ)
                        {
                            lfN[i].nodeList[j].getNodes()[0, 2] = lfN[i].nodeList[j].getNodes()[0, 2] * 0.95 + p.Z * 0.05; //*
                        }
                        else
                        {
                            p.Z = lfN[i].nodeList[j].getNodes()[0, 2];
                        }
                        double x = 0, y = 0, z = 0;
                        x = p.X - obj.PointGeometry.Location.X;
                        y = p.Y - obj.PointGeometry.Location.Y;
                        z = p.Z - obj.PointGeometry.Location.Z;

                        Rhino.Geometry.Transform tx = Rhino.Geometry.Transform.Translation(x, y, z);
                        gs[j] = Rhino.RhinoDoc.ActiveDoc.Objects.Transform(gs[j], tx, true);
                    }
                }
                if (dist != __dist)
                {
                    __dist = dist;
                }


                foreach (GH_particleSystem pS in lpS)
                {
                    if (pS != null)
                    {
                        if (pS.UPGR != null)
                        {
                            pS.UPGR(dist, 0, 0);
                        }
                    }
                }
            }

            return;
        }
Exemple #12
0
        bool keyboardHook_KeyUp(RamGecTools.KeyboardHook.VKeys key)
        {
            if (DEV)
            {
                if (key == RamGecTools.KeyboardHook.VKeys.KEY_F)
                {
                    for (int i = 0; i < FriedChiken.nParticles; i++)
                    {
                        FriedChiken.x[i * 3 + 0] += (rand.NextDouble() - 0.5) * 50d;
                        FriedChiken.x[i * 3 + 1] += (rand.NextDouble() - 0.5) * 50d;
                        FriedChiken.x[i * 3 + 2] += (rand.NextDouble() - 0.5) * 50d;
                    }
                    return(true);
                }

                if (key == RamGecTools.KeyboardHook.VKeys.KEY_E)
                {
                    if (_IF)
                    {
                        _IF = false;
                        full.offIF();
                    }
                    else
                    {
                        _IF = true;
                        full.onIF();
                    }
                    return(true);
                }
                if (key == RamGecTools.KeyboardHook.VKeys.KEY_R)
                {
                    if (_RP)
                    {
                        _RP = false;
                        full.offRF();
                    }
                    else
                    {
                        _RP = true;
                        full.onRF();
                    }
                    return(true);
                }

                if (key == RamGecTools.KeyboardHook.VKeys.KEY_N)
                {
                    if (_normalize)
                    {
                        _normalize = false;
                        full.offNorm();
                    }
                    else
                    {
                        _normalize = true;
                        full.onNorm();
                    }
                    return(true);
                }

                if (key == RamGecTools.KeyboardHook.VKeys.KEY_H)
                {
                    if (_geodesic)
                    {
                        _geodesic = false;
                        full.offGeo();
                    }
                    else
                    {
                        _geodesic = true;
                        full.onGeo();
                    }
                    return(true);
                }

                if (key == RamGecTools.KeyboardHook.VKeys.KEY_A)
                {
                    if (_drift1)
                    {
                        _drift1 = false;
                        _drift2 = true;
                        _drift3 = false;
                        full.drift2();
                        full.renewPlot(Drift2);
                    }
                    else if (_drift2)
                    {
                        _drift1 = false;
                        _drift2 = false;
                        _drift3 = true;
                        full.drift3();
                        full.renewPlot(Drift3);
                    }
                    else if (_drift3)
                    {
                        _drift1 = false;
                        _drift2 = false;
                        _drift3 = false;
                        full.drift0();
                        full.renewPlot(Drift0);
                    }
                    else
                    {
                        _drift1 = true;
                        _drift2 = false;
                        _drift3 = false;
                        full.drift1();
                        full.renewPlot(Drift1);
                    }
                    return(true);
                }
            }

            if (key == RamGecTools.KeyboardHook.VKeys.ESCAPE)
            {
                full.resetGo();
                full.clearNorm();
                _go           = false;
                timer.Enabled = false;
                if (t != 0 && refX != null)
                {
                    t = 0;
                    for (int i = 0; i < FriedChiken.x.rawData.Length; i++)
                    {
                        FriedChiken.x.rawData[i] = refX[i];
                    }
                    FriedChiken.Tick(t); //要素アップデート、勾配の計算
                    FriedChiken.Tack(t); //マスク等後処理
                    refX = null;
                }
                ExpireSolution(true);
                return(true);
            }
            if (key == RamGecTools.KeyboardHook.VKeys.KEY_G)
            {
                if (_go)
                {
                    full.pauseGo();

                    _go           = false;
                    timer.Enabled = false;
                }
                else
                {
                    full.onGo();

                    _go           = true;
                    timer.Enabled = true;
                }
                return(true);
            }
            if (key == RamGecTools.KeyboardHook.VKeys.KEY_T)
            {
                if (_VN)
                {
                    _VN = false;
                    full.offVN();
                }
                else
                {
                    _VN = true;
                    full.onVN();
                }
                return(true);
            }
            return(false);
        }