#include "fiko/dokum/malzeme.hpp" #include #include namespace fiko::dokum { // ---- fs(T): katı oran modeli ---------------------------------------------- f64 Alasim::katiOran(f64 T) const { if (T >= tLikidus) return 0.0; if (T <= tSolidus) return 1.0; const f64 dT = tLikidus - tSolidus; if (dT <= 1e-9) return T <= tSolidus ? 1.0 : 0.0; switch (fsModel) { case FsModel::Lineer: return (tLikidus - T) / dT; case FsModel::Lever: { // ⚠️ ŞU AN LINEER İLE BİREBİR AYNI — gerçek Lever kuralı DEĞİL. // Gerçek Lever (denge, tam difüzyon): fs = (1/(1−k))·(T_liq−T)/(Tm−T). // sicaklik() de bu ikisini birlikte ele alır (analitik lineer ters). // Davranış korunuyor; ayrıştırmak isteyen sicaklik()'i de ayırmalı. const f64 x = (tLikidus - T) / dT; return std::clamp(x, 0.0, 1.0); } case FsModel::Scheil: { // Scheil (sıfır katı difüzyon, tam sıvı karışım). Kompozisyon formu: // C_L = C₀·(1−fs)^(k−1) ve likidus doğrusu T = Tm + m·C_L // → ileri yasa: T(fs) = Tm + (T_liq − Tm)·(1−fs)^(k−1) // → ters (aşağıdaki kod): fs = 1 − [(Tm−T)/(Tm−T_liq)]^(1/(k−1)) // Tm (saf çözücü ergime) lineer faz diyagramından: likidus ve solidus // doğruları Tm'den çıkar, eğim oranı k → T_liq = Tm(1−k) + k·T_sol // → Tm = (T_liq − k·T_sol)/(1−k) [aşağıdaki tm ile birebir] // ⚠️ Scheil solidusta fs=1'e ULAŞMAZ (artık ötektik sıvı kalır; k=0.13 → // fs≈0.904). Üstteki `T <= tSolidus → 1.0` kısayolu bu farkı solidusta bir // anda kapatır: FDM'de H korunduğu için hücre ~T_sol'da bekleyip kalan // gizli ısıyı atar — ötektik platosu gibi davranır. Kasıtsız ama fiziksel. // Doğrulama: test_dokum.cpp f2_scheil_ileri_yasa (bağımsız ileri yasa). const f64 kp = std::clamp(kPartisyon, 0.01, 0.99); const f64 tm = tLikidus + (tLikidus - tSolidus) * kp / (1.0 - kp); const f64 pay = tm - T; const f64 payd = tm - tLikidus; if (pay <= 0 || payd <= 0) return 0.0; f64 fs = 1.0 - std::pow(pay / payd, 1.0 / (kp - 1.0)); return std::clamp(fs, 0.0, 1.0); } } return 0.0; } f64 Alasim::katiOranTurev(f64 T) const { // Sayısal türev (küçük komşuluk) — LUT herhangi model için geçerli. const f64 e = 1e-3; return (katiOran(T + e) - katiOran(T - e)) / (2.0 * e); } // ---- Kalıp penetrasyon + efektif arayüz ------------------------------------ f64 Kalip::penetrasyon() const { return std::sqrt(k * yogunluk * c); } f64 Kalip::etkinH(f64 t) const { // U(t) = 1/(1/h + √(πt)/b). t→0'da h ile sınırlı, büyük t'de kalıp emilim domine. const f64 b = penetrasyon(); if (b <= 1e-12) return arayuzH; const f64 direnc = 1.0 / std::max(arayuzH, 1e-9) + std::sqrt(3.14159265358979323846 * std::max(t, 0.0)) / b; return 1.0 / direnc; } f64 afsGecirgenlikSI(f64 afs) { return 3.06e-13 * std::max(afs, 0.0); } // ---- Hazır malzeme kütüphanesi --------------------------------------------- Alasim alasimAlSi7Mg() { Alasim a; a.ad = "AlSi7Mg"; a.yogunluk = 2680.0; a.c = 963.0; a.k = 150.0; a.gizliIsi = 389000.0; a.tLikidus = 615.0; a.tSolidus = 555.0; a.cekmeOrani = 0.065; a.sdasK = 10.0e-6; a.yuzeyGerilimi = 0.80; // Al-Si alaşımı, 700–800 °C (literatür) return a; } Alasim alasimGG25() { Alasim a; a.ad = "GG25 (gri dökme demir)"; a.yogunluk = 7200.0; a.c = 540.0; a.k = 45.0; a.gizliIsi = 220000.0; a.tLikidus = 1180.0; a.tSolidus = 1130.0; a.cekmeOrani = 0.02; a.sdasK = 25.0e-6; a.yuzeyGerilimi = 1.40; // dökme demir, ~1250 °C (literatür) return a; } Alasim alasimCelik() { Alasim a; a.ad = "Döküm çeliği (düşük-C)"; a.yogunluk = 7800.0; a.c = 500.0; a.k = 35.0; a.gizliIsi = 270000.0; a.tLikidus = 1520.0; a.tSolidus = 1450.0; a.cekmeOrani = 0.03; a.sdasK = 20.0e-6; a.yuzeyGerilimi = 1.25; // çelik, ~1500 °C (literatür) return a; } Alasim alasimBakir() { Alasim a; a.ad = "Bakır (saf)"; a.yogunluk = 8000.0; a.c = 385.0; a.k = 400.0; a.gizliIsi = 205000.0; a.tLikidus = 1085.0; a.tSolidus = 1050.0; a.cekmeOrani = 0.023; a.sdasK = 22.0e-6; a.yuzeyGerilimi = 1.30; // bakır, ~1200 °C (literatür) return a; } Alasim alasimPirinc() { Alasim a; a.ad = "Pirinç (CuZn30)"; a.yogunluk = 8500.0; a.c = 380.0; a.k = 150.0; a.gizliIsi = 170000.0; a.tLikidus = 950.0; a.tSolidus = 915.0; a.cekmeOrani = 0.019; a.sdasK = 18.0e-6; a.yuzeyGerilimi = 1.00; // pirinç, ~1000 °C (literatür) return a; } Alasim alasimCinko() { Alasim a; a.ad = "Çinko (sıvı metal döküm)"; a.yogunluk = 6800.0; a.c = 388.0; a.k = 116.0; a.gizliIsi = 112000.0; a.tLikidus = 420.0; a.tSolidus = 390.0; a.cekmeOrani = 0.023; a.sdasK = 12.0e-6; a.yuzeyGerilimi = 0.50; // çinko, ~430 °C (literatür) return a; } Alasim alasimMagnezyum() { Alasim a; a.ad = "Magnezyum (AZ91D kuru kalp)"; a.yogunluk = 1740.0; a.c = 1020.0; a.k = 160.0; a.gizliIsi = 200000.0; a.tLikidus = 650.0; a.tSolidus = 600.0; a.cekmeOrani = 0.035; a.sdasK = 14.0e-6; a.yuzeyGerilimi = 0.65; // Mg alaşımı, ~650 °C (literatür) return a; } Kalip kalipSilikaKum() { Kalip k; k.ad = "Silika kum"; k.yogunluk = 1600.0; k.c = 1170.0; k.k = 0.6; k.tBaslangic = 25.0; k.arayuzH = 1000.0; k.gecirgenlik = afsGecirgenlikSI(120.0); // yeşil kum AFS≈120 → ~3.7e-11 m² return k; } Kalip kalipCelikKalip() { Kalip k; k.ad = "Çelik kalıp (kokil)"; k.yogunluk = 7800.0; k.c = 500.0; k.k = 35.0; k.tBaslangic = 200.0; k.arayuzH = 2500.0; k.gecirgenlik = 0.0; // kokil gaz geçirmez → hava yalnız vent'ten kaçar return k; } } // namespace fiko::dokum