# ОСНОВНОЙ GPU-решатель (без SDF): цилиндр, три версии (без AMR / 2× / вложенный 2×+4×). # Математика идентична CPU-прототипу _amr_anims.py; backend — CuPy (GPU) с откатом на numpy. # Запуск: python amr_cylinder_gpu.py (fp32 по умолчанию) # AMR_FP64=1 python amr_cylinder_gpu.py (двойная точность) # AMR_STEPS=2000 python amr_cylinder_gpu.py (короткий прогон) import os, time, numpy as np import amr_gpu_core as core HERE = os.path.dirname(os.path.abspath(__file__)) ANIM = os.path.join(HERE, "anim"); os.makedirs(ANIM, exist_ok=True) FIGS = os.path.join(HERE, "figures"); os.makedirs(FIGS, exist_ok=True) print(f"[ОСНОВНОЙ · без SDF] backend={core.BACKEND}; домен {core.Nx}x{core.Ny}; steps={core.STEPS}; " f"L1(2×) {core.P1['Nfx']}x{core.P1['Nfy']}; L2(4×) {core.P2['Nfx']}x{core.P2['Nfy']}") t0 = time.perf_counter() R0 = core.run("none", False); print(" none :", round(time.perf_counter()-t0, 1), "s") R1 = core.run("amr2x", False); print(" amr2x :", round(time.perf_counter()-t0, 1), "s") R2 = core.run("nested", False); print(" nested :", round(time.perf_counter()-t0, 1), "s") core.save_gif(R1, "amr2x_cyl.gif", ANIM, " (без SDF)") core.save_gif(R2, "amr_nested_cyl.gif", ANIM, " (без SDF)") AS = [core.analyze(R0), core.analyze(R1), core.analyze(R2)] core.print_table(AS, "БЕЗ SDF — сравнение на реально собранных данных (установившийся режим)") np.savez(os.path.join(HERE, "_amr_probe_data.npz"), St=np.array([a["St"] for a in AS]), Cd=np.array([a["Cd"] for a in AS]), Clrms=np.array([a["Clrms"] for a in AS]), uyrms=np.array([a["uyrms"] for a in AS]), Cl0=AS[0]["Cl_s"], Cl1=AS[1]["Cl_s"], Cl2=AS[2]["Cl_s"], uy0=AS[0]["uy"], uy1=AS[1]["uy"], uy2=AS[2]["uy"]) core.probe_figure(AS, R2, os.path.join(FIGS, "11e_amr_probe_comparison.png"), "AMR на цилиндре (без SDF): сравнение трёх версий на данных зондов") print("DONE (без SDF)")