Example #1
0
        private void SolveQijz()
        {
            Qizj = new Matrix(Elements.Count, Elements.Count);
            for (int i = 0; i < Elements.Count; i++)
            {
                for (int j = 0; j < Elements.Count; j++)
                {
                    Pos[] r = new Pos[3];

                    for (int k = 0; k < 3; k++)
                    {
                        r[k] = new Pos(Elements[j].pr[k] - Elements[j].pl[k],
                                       Elements[i].pcp[k] - Elements[j].pl[k],
                                       Elements[i].pcp[k] - Elements[j].pr[k]);
                    }
                    double qpsirel = 0;

                    //Opt.TODO
                    for (int k = 0; k < 3; k++)
                    {
                        qpsirel += r[0][k] * (r[1].UnitVector[k] - r[2].UnitVector[k]);
                    }

                    Pos phidrel = Pos.CrossProduct(r[0], r[1]);
                    Pos vabrel  = (Pos)(qpsirel * phidrel);
                    //後曳渦(左)
                    Pos vae = new Pos();

                    vae.y = r[1][2] /
                            (new Pos(0, r[1][1], r[1][2]).Magnitude) *
                            (1 + r[1].UnitVector[0]);

                    vae.z = -r[1][1] /
                            new Pos(0, r[1][1], r[1][2]).Magnitude *
                            (1 + r[1].UnitVector[0]);

                    //後曳渦(右)
                    Pos veb = new Pos();
                    veb.y = r[2][2] /
                            (new Pos(0, r[2][1], r[2][2]).Magnitude) *
                            (1 + r[2].UnitVector[0]);

                    veb.z = -r[2][1] /
                            new Pos(0, r[1][1], r[1][2]).Magnitude *
                            (1 + r[1].UnitVector[0]);

                    Pos vij = (Pos)((vabrel + vae + veb) / (4.0 * Math.PI));

                    Matrix Phi = new Matrix(new double[3, 3]
                    {
                        { Cal.Cos(Elements[i].phi), 0, 0 },
                        { 0, Cal.Sin(Elements[i].phi), 0 },
                        { 0, 0, Cal.Cos(Elements[i].phi) }
                    });

                    Matrix Seta = new Matrix(new double[3, 3]
                    {
                        { Cal.Cos(Elements[i].seta), 0, 0 },
                        { 0, Cal.Sin(Elements[i].seta), 0 },
                        { 0, 0, Cal.Cos(Elements[i].seta) }
                    });
                    //qijzを計算
                    Qizj[i, j] = Vector.InnerProduct(Phi * Seta * vij, new Vector(new double[3] {
                        1, 1, 1
                    }));
                }
            }
        }