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 })); } } }