def velocity_matrix(ra: MatrixVector, rb: MatrixVector, rc: MatrixVector, betm: float = 1.0, tol: float = 1e-12): if ra.shape != rb.shape: return ValueError() numi = rc.shape[0] numj = ra.shape[1] ra = ra.repeat(numi, axis=0) rb = rb.repeat(numi, axis=0) rc = rc.repeat(numj, axis=1) a = rc - ra b = rc - rb a.x = a.x / betm b.x = b.x / betm am = a.return_magnitude() bm = b.return_magnitude() # Velocity from Bound Vortex adb = elementwise_dot_product(a, b) abm = multiply(am, bm) dm = multiply(abm, abm + adb) axb = elementwise_cross_product(a, b) axbm = axb.return_magnitude() chki = (axbm == 0.0) chki = logical_and(axbm >= -tol, axbm <= tol) veli = elementwise_multiply(axb, divide(am + bm, dm)) veli.x[chki] = 0.0 veli.y[chki] = 0.0 veli.z[chki] = 0.0 # Velocity from Trailing Vortex A axx = MatrixVector(zeros(a.shape, dtype=float), a.z, -a.y) axxm = axx.return_magnitude() chka = (axxm == 0.0) vela = elementwise_divide(axx, multiply(am, am - a.x)) vela.x[chka] = 0.0 vela.y[chka] = 0.0 vela.z[chka] = 0.0 # Velocity from Trailing Vortex B bxx = MatrixVector(zeros(b.shape, dtype=float), b.z, -b.y) bxxm = bxx.return_magnitude() chkb = (bxxm == 0.0) velb = elementwise_divide(bxx, multiply(bm, bm - b.x)) velb.x[chkb] = 0.0 velb.y[chkb] = 0.0 velb.z[chkb] = 0.0 return veli, vela, velb
def vel_doublet_matrix(ov, om, faco): ov = faco * ov oxx = MatrixVector(zeros(ov.shape), -ov.z, ov.y) oxxm = oxx.return_magnitude() chko = (oxxm == 0.0) velol = elementwise_divide(oxx, multiply(om, om - ov.x)) velol.x[chko] = 0.0 velol.y[chko] = 0.0 velol.z[chko] = 0.0 return velol
def phi_doublet_matrix(vecs: MatrixVector, rls: MatrixVector, sgnz: matrix): mags = vecs.return_magnitude() ms = divide(vecs.x, rls.y) ths = arctan(ms) ths[rls.y == 0.0] = piby2 gs = multiply(ms, divide(rls.z, mags)) Js = arctan(gs) Js[rls.y == 0.0] = piby2 phids = Js - multiply(sgnz, ths) return phids, mags
def vel_trailing_doublet_matrix(ov, om, faco): ov: MatrixVector = faco * ov oxx = MatrixVector(zeros(ov.shape), -ov.z, ov.y) oxxm = oxx.return_magnitude() chko = absolute(oxxm) < tol den = multiply(om, om - ov.x) chkd = absolute(den) < tol denr = zeros(ov.shape, dtype=float) reciprocal(den, where=logical_not(chkd), out=denr) velol = elementwise_multiply(oxx, denr) velol.x[chko] = 0.0 velol.y[chko] = 0.0 velol.z[chko] = 0.0 return velol
def phi_doublet_matrix(vecs: MatrixVector, sgnz: matrix): mags = vecs.return_magnitude() chkm = mags < tol chky = absolute(vecs.y) < tol vecs.y[chky] = 0.0 ms = zeros(mags.shape, dtype=float) divide(vecs.x, vecs.y, where=logical_not(chky), out=ms) ths = arctan(ms) ths[chky] = piby2 ts = zeros(mags.shape, dtype=float) divide(vecs.z, mags, where=logical_not(chkm), out=ts) gs = multiply(ms, ts) Js = arctan(gs) Js[chky] = piby2 phids = Js - multiply(sgnz, ths) return phids, mags