{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Praktikum Komputasi 4: Simulasi Persamaan Panas / Difusi 1D (Julia)\n",
    "\n",
    "Persamaan Panas 1D memodelkan difusi termal pada konduktor listrik berarus (kabel transmisi bawah tanah/udara) atau difusi muatan pembawa minoritas pada semikonduktor:\n",
    "$$ \\frac{\\partial u}{\\partial t} = \\alpha \\frac{\\partial^2 u}{\\partial x^2} $$\n",
    "\n",
    "dengan:\n",
    "- $u(x,t)$ adalah temperatur atau densitas panas pada posisi $x$ dan waktu $t$.\n",
    "- $\\alpha = \\frac{k}{\\rho c_p}$ adalah difusivitas termal material konduktor ($m^2/s$).\n",
    "\n",
    "## Skema Beda Hingga FTCS (Forward-Time Central-Space)\n",
    "$$ \\frac{u_i^{n+1} - u_i^n}{\\Delta t} = \\alpha \\frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\\Delta x^2} $$\n",
    "\n",
    "Pembaruan eksplisit:\n",
    "$$ u_i^{n+1} = u_i^n + r (u_{i+1}^n - 2u_i^n + u_{i-1}^n) $$\n",
    "dengan rasio difusi $r = \\frac{\\alpha \\Delta t}{\\Delta x^2}$.\n",
    "\n",
    "**Syarat Kestabilan Von Neumann:** $r \\le 0.5$ agar skema numerik stabil dan konvergen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "using Plots"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Parameter Fisik Kabel dan Grid Numerik"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Parameter Fisik Kabel Konduktor Tembaga\n",
    "L = 1.0             # Panjang kabel (meter)\n",
    "alpha = 0.01        # Difusivitas termal efektif (m^2/s)\n",
    "T_sim = 20.0        # Total waktu pendinginan/difusi (detik)\n",
    "\n",
    "# Parameter Grid Spasial\n",
    "Nx = 100\n",
    "dx = L / (Nx - 1)\n",
    "x = range(0.0, L, length=Nx)\n",
    "\n",
    "# Pilih dt agar rasio difusi r = 0.4 <= 0.5 (Aman/Stabil)\n",
    "r = 0.4\n",
    "dt = r * (dx^2) / alpha\n",
    "Nt = Int(round(T_sim / dt))\n",
    "\n",
    "println(\"dx = $(round(dx, digits=4)) m, dt = $(round(dt, digits=5)) s, Nt = $Nt langkah waktu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Inisialisasi Kondisi Batas & Hot-Spot Suhu Awal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "u = zeros(Nx, Nt)\n",
    "\n",
    "# Kondisi Awal: Hot-spot suhu 100°C di tengah kabel akibat hubung singkat lokal\n",
    "# Ujung kabel dijaga pada suhu lingkungan 0°C (Dirichlet Boundary Conditions)\n",
    "u[:, 1] = 100.0 .* sin.(pi .* collect(x) ./ L) .+ 50.0 .* sin.(3 * pi .* collect(x) ./ L)\n",
    "\n",
    "# Loop Waktu (FTCS)\n",
    "for n in 1:(Nt-1)\n",
    "    for i in 2:(Nx-1)\n",
    "        u[i, n+1] = u[i, n] + r * (u[i+1, n] - 2*u[i, n] + u[i-1, n])\n",
    "    end\n",
    "    # Syarat Batas Dirichlet (Pendinginan di kedua ujung kabel)\n",
    "    u[1, n+1] = 0.0\n",
    "    u[Nx, n+1] = 0.0\n",
    "end\n",
    "\n",
    "println(\"Simulasi difusi termal kabel selesai.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Visualisasi Peluruhan Suhu terhadap Waktu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "time_snapshots = [0.0, 1.0, 3.0, 7.0, 15.0]\n",
    "\n",
    "p = plot(xlabel=\"Posisi Kabel x (meter)\", ylabel=\"Temperatur T (°C)\",\n",
    "         title=\"Profil Pendinginan Difusi Termal Konduktor\", legend=:topright)\n",
    "\n",
    "for ts in time_snapshots\n",
    "    idx = min(Nt, max(1, Int(round(ts / dt)) + 1))\n",
    "    t_curr = (idx - 1) * dt\n",
    "    plot!(collect(x), u[:, idx], label=\"t = $(round(t_curr, digits=1)) s\", lw=2.5)\n",
    "end\n",
    "\n",
    "display(p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Analisis Spatiotemporal Heatmap"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t_grid = range(0.0, T_sim, length=Nt)\n",
    "heatmap(collect(x), collect(t_grid), u', xlabel=\"Posisi Kabel x (m)\", ylabel=\"Waktu t (detik)\",\n",
    "        title=\"Peta Distribusi Panas Sepanjang Kabel\", color=:inferno)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Pertanyaan Evaluasi Mahasiswa\n",
    "1. **Harmonik Fourier:** Perhatikan bahwa komponen frekuensi tinggi ($3\\pi x / L$) meluruh jauh lebih cepat daripada harmonik dasar ($\\pi x / L$). Buktikan mengapa secara matematis laju peluruhan sebanding dengan $e^{-(n\\pi/L)^2 \\alpha t}$!\n",
    "2. **Batas Terisolasi (Neumann):** Bagaimana jika kedua ujung kabel diisolasi termal sempurna ($\partial u / \partial x = 0$)? Modifikasi kode dan amati suhu akhir *steady-state*!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Julia 1.10",
   "language": "julia",
   "name": "julia-1.10"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
