Aero-Bench
Prompt
# RUOLO Sei un ingegnere aerodinamico e sviluppatore scientifico. Devi costruire, validare e rendere interattivo un solver a pannelli per una configurazione **tandem deportante in effetto suolo** (ala principale + ala posteriore, tipica dei WIG/ekranoplan), in flusso incomprimibile 2D potenziale. # OBIETTIVO Un repository Python eseguibile che, dato un sistema di due profili NACA a 4 cifre vicino a un suolo piano, risolva l'equazione di Laplace con il **metodo di Hess-Smith** (pannelli con sorgenti a intensità costante + vortice legato, condizione di Kutta al bordo d'uscita) e tratti il suolo con il **metodo delle immagini virtuali**. Sopra il solver, una **dashboard interattiva** che permetta di cambiare angolo d'attacco e distanza dal suolo (più i parametri di tandem e di profilo) e vedere subito Cp, portanza e campi di flusso. # ARCHITETTURA RICHIESTA hess-smith-tandem/ README.md # derivazione, ipotesi, limiti, come si esegue pyproject.toml # python>=3.11, numpy, scipy, pandas, streamlit, plotly, pytest src/panel2d/ geometry.py # NACA 4 cifre, distribuzione coseno, discretizzazione influences.py # matrici di influenza sorgente/vortice (vettorizzate) images.py # sistema immagine rispetto al suolo solver.py # assemblaggio, Kutta, solve, circolazioni post.py # Cp, Cl (KJ + integrazione di pressione), Cm, streamlines tandem.py # configurazione a due corpi + suolo cases.py # casi di validazione dichiarativi app/dashboard.py # Streamlit validation/ data/*.csv # punti sperimentali con fonte, figura/tabella, incertezza run_validation.py # genera il report report.md # tabelle + figure, PASS/FAIL/BORDERLINE per caso tests/ # pytest reports/figures/ # output grafici salvati su disco # SPECIFICA FISICA E NUMERICA (vincolante) 1. Modello: Laplace ∇²φ = 0, incomprimibile, 2D, irrotazionale, inviscido, stazionario. V∞ = (cos α, sin α). Unità adimensionalizzate con corda e V∞ = 1. 2. Metodo di Hess-Smith: su ogni pannello una sorgente a intensità costante σ_i, più **un solo vortice γ_k per corpo** (γ costante lungo il corpo). Incognite: {σ_i} + {γ_k}. Equazioni: N di non penetrazione (V·n = 0 al punto di controllo di ogni pannello reale) + una Kutta per corpo. 3. Kutta: imponi l'uguaglianza in modulo delle velocità tangenziali sui due pannelli adiacenti al bordo d'uscita (V_t,1 = −V_t,N nella convenzione delle normali), cioè uscita fluida dal TE. Verifica a posteriori: Cp continuo attraverso il TE (entro 1e-3). 4. Geometria NACA 4 cifre: usa le formule standard (spessore con 0.2969√x − 0.1260x − 0.3516x² + 0.2843x³ − 0.1015x⁴, opzione bordo d'uscita chiuso −0.1036; camber e sua derivata per la linea media con m, p). Discretizza con distribuzione **coseno** (addensamento a LE e TE). Rendi esplicito il numero di pannelli e la convenzione del TE. 5. Tandem: corpo 1 all'origine, corpo 2 posizionato con **stagger orizzontale, offset verticale e decalage**; corda, spessore e camber indipendenti per i due profili. Ogni corpo ha la propria circolazione e la propria Kutta. 6. Suolo con immagini: specchia **tutto** il sistema (pannelli di entrambi i corpi + vortici legati + eventuale scia) rispetto alla retta y = −h, con la stessa intensità. Le immagini servono **solo** a soddisfare V·n = 0 sul suolo. La portanza si calcola **solo** sulla circolazione dei corpi reali: L = ρ V∞ Γ_reale (Kutta-Joukowski). **Non contare due volte** le immagini: se il tuo Cl raddoppia rispetto al caso senza suolo, la formula è sbagliata. 7. Scia: parti dalla versione minima (vortice legato + Kutta, nessuna scia estesa). Poi aggiungi la variante con **scia rettilinea a valle del TE** (sheet di vortici lungo +x, più la sua immagine), necessaria perché il profilo posteriore senta correttamente il primo. Quantifica la differenza fra le due versioni e dichiarala nel report: è un risultato, non un dettaglio. 8. Post-processing: Cp = 1 − (V_t/V∞)², Cl per Kutta-Joukowski **e** per integrazione di pressione (devono coincidere entro 0.5%), Cm rispetto a c/4, Cl di ciascun profilo. 9. Solver: matrice densa, `numpy.linalg.solve`, influenza vettorizzata (niente doppi cicli Python sui pannelli). Stampa il numero di condizionamento: se esplode, dillo. 10. Limiti da dichiarare in README e nella dashboard: inviscido → **Cd = 0**, nessuna separazione, nessun blocco; per h/c molto piccoli e α alti il potenziale non è più fisico. Non presentare un Cd del pannello come se fosse reale. # VALIDAZIONE (vincolante) Regole assolute: - **Nessun valore inventato.** Ogni punto sperimentale va in `validation/data/*.csv` con colonne: case_id, quantity, value, unit, source_id, figure_or_table, digitized (yes/no), uncertainty. - Ogni `source_id` ha DOI o URL, autore, anno, titolo, rivista/rapporto. Se la fonte è a pagamento e non riesci a leggerla, marca il caso `pending` e scrivilo — non riempire con stime. - Se hai digitalizzato un punto dal grafico, dichiaralo (`digitized=yes`) con incertezza ±. - Ogni numero nel report deve essere riproducibile con un comando che incolli nell'output. Casi da coprire, con soglie: A. **Analitico, sulla macchina delle immagini.** Sorgente e vortice puntuali a quota h: verifica numerica che V·n = 0 sul suolo (|V·n| < 1e-10). Test unitari, non grafici. B. **Piastra piana / profilo sottile, h → ∞.** Cl ≈ 2π α per α piccolo, entro 2% per t ≤ 0.06 e α ≤ 5°. È il test che dice se la Kutta è implementata bene. C. **Profili NACA 0012 e 2412, h → ∞.** Confronto con i dati di sezione di Abbott, von Doenhoff, Stivers, *Summary of Airfoil Data*, NACA Report 824, 1945 (pubblico su NTRS). Cross-check indipendente con XFOIL e/o NeuralFoil sulla stessa geometria: devi riportare lo scostamento fra i due codici, non solo dal dato sperimentale. D. **Effetto suolo, profilo singolo.** NACA 4412: Ahmed, Takasaki, Kohama, *Aerodynamics of a NACA4412 Airfoil in Ground Effect*, AIAA Journal, 2007 (galleria a suolo mobile). NACA 5312: *NACA 5312 in Ground Effect — Wind Tunnel and Panel Code Studies*, AIAA 15th Applied Aerodynamics Conference, 1997. NACA 4412 viscoso: Hsiun & Chen, *Aerodynamic characteristics of a two-dimensional airfoil with ground effect*, Journal of Aircraft, 1996. E. **Tandem in effetto suolo.** Ahmed & Kohama, *Experimental Investigation on the Aerodynamic Characteristics of a Tandem Wing Configuration in Close Ground Proximity*, JSME International Journal Series B, 42(4), 1999, p. 612. Verifica il risultato fisico noto: il profilo posteriore **perde portanza** rispetto a quello isolato, e la perdita cresce riducendo lo stagger. Cerca anche dataset 2D recenti ad accesso aperto e, se trovati, aggiungili come casi extra. F. **Coerenza interna e convergenza.** - N = 60/120/240/480: |ΔCl| < 0.002 fra le ultime due risoluzioni. - Cl_pressione vs Cl_Kutta-Joukowski entro 0.5%. - Σσ_i ≈ 0 per corpo chiuso (conservazione della massa), entro 1e-8. - NACA 0012 a α = 0: Cl = 0 entro 1e-10, e invariante al variare di h/c. - h/c = 100 contro h/c = ∞ (nessun suolo): scostamento < 0.5%. Soglie di accettazione vs esperimento: entro **5% sul Cl** dove il flusso è attaccato (α ≤ 8°, h/c ≥ 0.2, NACA a 4 cifre con t ≤ 0.15). Fuori da queste condizioni il confronto va riportato comunque, ma etichettato come **diverge per separazione non modellata**, con il punto esatto in cui la curva si stacca dal dato. Un caso fuori soglia si scrive FAIL con la spiegazione: non si nasconde, non si allarga la tolleranza per farlo passare. # DASHBOARD INTERATTIVA (Streamlit + Plotly) Controlli: α (con slider continuo), h/c (scala log, da 0.05 a 20), cifre NACA dei due profili (m, p, t in input, con preset 0012/2412/4412), stagger / offset verticale / decalage, rapporto corde, N pannelli, toggle "suolo attivo (immagini)" e "scia estesa". Output: disegno della geometria con i profili specchiati e la traccia del suolo; campo di velocità e linee di corrente; grafico Cp sui due profili; Cl vs α; Cl vs h/c (con i punti sperimentali dei casi D/E sovrapposti e cliccabili sulla fonte); tabella numerica (Γ, Cl_1, Cl_2, Cm, Cl_p vs Cl_KJ, condizionamento); pulsante di export CSV di tutti i risultati. La dashboard deve poter rieseguire i casi di validazione e mostrarli a fianco delle curve calcolate. Test headless con `streamlit.testing.v1.AppTest`, non solo "a occhio nel browser". # QUALITÀ - `pytest -q` verde, con i test analitici di A, B, C, F. - Nessuna dipendenza pesante; tutto deve girare in locale in pochi secondi per N ≈ 300. - Ogni figura citata nel report esiste come file in `reports/figures/`. - README che spiega la derivazione (riferimenti: Hess & Smith, *Calculation of Potential Flow About Arbitrary Bodies*, Progress in Aerospace Sciences 8, 1967; Katz & Plotkin, *Low-Speed Aerodynamics*, cap. 11) e — importante — elenca le ipotesi che invalidano il risultato. # CRITERI DI "FATTO" 1. `python validation/run_validation.py` gira e produce `validation/report.md` con tabelle PASS/FAIL/BORDERLINE per ogni caso A–F e le figure. 2. `streamlit run app/dashboard.py` mostra la configurazione tandem in effetto suolo e reagisce a un cambio di α e h/c. 3. `pytest -q` verde. 4. Nel report: per ogni caso, fonte citata + valore di riferimento + valore calcolato + scarto. 5. Elenco esplicito dei limiti e dei casi `pending` con la ragione. # COSA RESTITUIRE Path dei file creati, comandi eseguiti con **l'output reale incollato** (non descritto), il contenuto di `validation/report.md`, e una sezione "Rischi residui e divergenze" in cui elenchi dove il metodo non è validato e cosa servirebbe per validarlo (strato limite, Navier-Stokes, dati di galleria diversi da quelli trovati). # REGOLE - Se una formula, un dato o un riferimento non lo trovi: dillo e fermati su quel punto. Non inventare numeri, DOI, pagine o risultati sperimentali. - Non dichiarare "validato" un caso che non supera le soglie. - Dichiara ogni semplificazione nel momento in cui la fai, non alla fine.
Response not available
Response not available
Response not available