potential_flow_joukowski — MATH complex op

• Data kinds: कोई नहीं → cimage (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)

• Call: import fullseye as fs; fs.ledger.potential_flow_joukowski(alpha_deg=5.0, speed=1.0, chord_b=1.0, centre_offset=(-0.09+0.09j), centre=0j, half_width=3.0, shape=(256, 256)) (implementation को सीधे call करना हो तो import mathops; mathops.potential_flow_joukowski(alpha_deg=5.0, speed=1.0, chord_b=1.0, centre_offset=(-0.09+0.09j), centre=0j, half_width=3.0, shape=(256, 256)), registry से लेना हो तो opsmath.get("potential_flow_joukowski"))

उपयोग

Joukowski aerofoil के पास से inviscid flow, complex velocity field के रूप में।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

Returns the complex velocity w(z) = dW/dz = u - i*v sampled over a window of the physical plane. Inside the solid body the field is set to exactly 0 (there is no flow there), so field == 0 is the body mask and nothing is silently nan.

The construction is the classical one: flow past a circle of radius a = |chord_b - centre_offset| centred at centre_offset, plus the circulation the Kutta condition demands, pushed through the Joukowski map z = zeta + chord_b**2 / zeta. The window is inverted back to the circle plane by choosing, of the two preimages, the one outside the circle.

★What makes this checkable rather than merely plotted:

• The field is holomorphic outside the body, so this family's own cplx_cr_residual must read ~0 on it — an existing operator is the oracle, and it is not the formula used to build the field.

• The Kutta condition is the whole point: dW/dzeta vanishes at the trailing edge exactly where dz/dzeta does, so the velocity there stays finite. Perturb the circulation by any amount and the trailing-edge velocity diverges — the gate has a control group.

• Re(closed integral of w dz) around the body is the circulation, and it is path independent (Cauchy) — a big rectangle and a small one must agree.

• Far from the body w -> speed * exp(-i*alpha), decaying like 1/|z|.

• The zeroed region is the aerofoil, whose area the shoelace formula on cplx_joukowski of the circle gives independently.

Parameters

alpha_deg : float

Angle of attack in degrees.

speed : float > 0

Free-stream speed.

chord_b : float > 0

Half the flat-plate chord; the map is zeta + chord_b**2/zeta.

centre_offset : complex

Circle centre. Negative real part thickens, positive imaginary part

cambers. The default is a thin cambered section.

centre, half_width, shape :

The window in the physical plane, as in cplx_plane_grid.

Raises ValueError: speed <= 0; non-finite angle; a circle that does not enclose -chord_b (the image would fold over itself) or whose centre is at or beyond +chord_b; degenerate window.

HALCON: no operator.

पूरी family का input contract (fail-closed)

mathops के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• complex input से ValueError — float64 में ज़बरदस्ती बदलने पर imaginary part चुपचाप छूट जाता है (numpy केवल ComplexWarning देता है और "सही दिखने वाला पर गलत" real number लौटाता है)। .real/.imag/abs() स्पष्ट रूप से लिखें, या complex data संभालने वाले complexops का उपयोग करें।

• masked array (masked elements वाला) से ValueError — mask हटाकर नीचे के raw values इस्तेमाल करने वाला implicit conversion अस्वीकार है। भरना है या हटाना है, यह स्पष्ट रूप से बताएँ।

• हर input पर NaN/Inf से ValueError (गिनती बताकर अस्वीकार — क्योंकि यह पूरे परिणाम में फैल जाता है)।

• Shape सख़्त है: 1-D और 2-D को implicit रूप से promote या broadcast नहीं किया जाता (vector slot में matrix या matrix slot में vector देने पर ValueError; reshape स्पष्ट रूप से करें)।

• Size की सीमा: matrix लेने वाले ops और stat_histogram के bins, mathops.MAX_ELEMENTS (2^26 ≈ 6.7 करोड़ elements) से अधिक होने पर ValueError देते हैं।

उपयोग की विस्तृत guide

• math_metrology family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_complex_plane_fields — py -3.11 examples/poc_complex_plane_fields.py

वे अगले ops जिनसे type जुड़ता है (cimage को input के रूप में लेते हैं)

cplx_cr_residual · cplx_domain_colour · mandelbrot_interior

इसी category के (complex)

cplx_contour_circle · cplx_poly_eval · cplx_contour_integral · cplx_winding_number · cplx_cauchy_value · cplx_argument_principle · cplx_laurent_coeffs · cplx_joukowski


*Provenance: mathops.py — MATH operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.