{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Praktikum Komputasi 3: Simulasi Persamaan Gelombang 1D (Julia)\n",
    "\n",
    "Persamaan Gelombang 1D memodelkan perambatan sinyal tegangan dan arus pada saluran transmisi tanpa rugi-rugi (*lossless transmission line*), atau vibrasi gelombang mekanik:\n",
    "$$ \\frac{\\partial^2 u}{\\partial t^2} = v^2 \\frac{\\partial^2 u}{\\partial x^2} $$\n",
    "\n",
    "dengan:\n",
    "- $u(x,t)$ adalah amplitudo gelombang (tegangan $v(x,t)$ atau arus $i(x,t)$)\n",
    "- $v = \\frac{1}{\\sqrt{LC}}$ adalah kecepatan rambat gelombang pada saluran transmisi ($L$ dan $C$ per satuan panjang)\n",
    "\n",
    "## Metode Beda Hingga (Finite Difference Method / FDTD)\n",
    "Diskritisasi turunan parsial kedua waktu dan ruang:\n",
    "$$ \\frac{u_i^{n+1} - 2u_i^n + u_i^{n-1}}{\\Delta t^2} = v^2 \\frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\\Delta x^2} $$\n",
    "\n",
    "Skema pembaruan eksplisit:\n",
    "$$ u_i^{n+1} = 2(1 - r^2)u_i^n + r^2(u_{i+1}^n + u_{i-1}^n) - u_i^{n-1} $$\n",
    "dengan $r = \\frac{v \\Delta t}{\\Delta x}$ (Bilangan Courant / CFL condition, syarat stabil $r \\le 1$)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "using Plots"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Implementasi Solver Gelombang Beda Hingga 1D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Parameter Fisik Saluran Transmisi\n",
    "L_domain = 10.0     # Panjang saluran (meter)\n",
    "v = 2.0             # Kecepatan rambat gelombang (m/s)\n",
    "T_total = 4.0       # Total durasi waktu simulasi (detik)\n",
    "\n",
    "# Parameter Numerik Grid\n",
    "Nx = 200            # Jumlah titik spasial\n",
    "dx = L_domain / (Nx - 1)\n",
    "x = range(0.0, L_domain, length=Nx)\n",
    "\n",
    "# Pilih dt sedemikian hingga Courant number r = 0.8 <= 1 (Stabil)\n",
    "r = 0.8\n",
    "dt = r * dx / v\n",
    "Nt = Int(round(T_total / dt))\n",
    "\n",
    "println(\"Grid spasi dx = $dx m, langkah waktu dt = $dt s, Nilai Courant r = $r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Inisialisasi Pulsa Gelombang dan Perambatan Waktu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Matriks solusi: u[spasial, waktu]\n",
    "u = zeros(Nx, Nt)\n",
    "\n",
    "# Syarat awal: Pulsa Gauss di tengah saluran (t = 0)\n",
    "x0 = L_domain / 2.0\n",
    "sigma = 0.5\n",
    "u[:, 1] = exp.(-((collect(x) .- x0).^2) ./ (2 * sigma^2))\n",
    "\n",
    "# Langkah pertama (t = dt) menggunakan syarat kecepatan awal nol (du/dt = 0)\n",
    "for i in 2:(Nx-1)\n",
    "    u[i, 2] = u[i, 1] + 0.5 * r^2 * (u[i+1, 1] - 2*u[i, 1] + u[i-1, 1])\n",
    "end\n",
    "# Batas Dirichlet (ujung saluran terhubung ke tanah: u(0,t) = 0, u(L,t) = 0)\n",
    "u[1, 2] = 0.0\n",
    "u[Nx, 2] = 0.0\n",
    "\n",
    "# Loop perambatan waktu (FDTD)\n",
    "for n in 2:(Nt-1)\n",
    "    for i in 2:(Nx-1)\n",
    "        u[i, n+1] = 2*(1 - r^2)*u[i, n] + r^2*(u[i+1, n] + u[i-1, n]) - u[i, n-1]\n",
    "    end\n",
    "    # Syarat Batas (Refleksi ujung saluran)\n",
    "    u[1, n+1] = 0.0\n",
    "    u[Nx, n+1] = 0.0\n",
    "end\n",
    "\n",
    "println(\"Simulasi selesai untuk $Nt langkah waktu.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Visualisasi Snapshot Gelombang pada Berbagai Waktu ($t$)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Plot snapshot profil gelombang pada beberapa detik\n",
    "times_to_plot = [0.0, 0.8, 1.6, 2.4, 3.2]\n",
    "\n",
    "p = plot(xlabel=\"Posisi Saluran x (meter)\", ylabel=\"Amplitudo Tegangan u(x,t)\", \n",
    "         title=\"Perambatan & Pemantulan Gelombang 1D (Julia FDTD)\", legend=:topright)\n",
    "\n",
    "for t_target in times_to_plot\n",
    "    step_idx = min(Nt, max(1, Int(round(t_target / dt)) + 1))\n",
    "    t_actual = (step_idx - 1) * dt\n",
    "    plot!(collect(x), u[:, step_idx], label=\"t = $(round(t_actual, digits=2)) s\", lw=2)\n",
    "end\n",
    "\n",
    "display(p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Visualisasi Waterfall / Spatiotemporal Surface (2D Heatmap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t_axis = range(0.0, T_total, length=Nt)\n",
    "heatmap(collect(x), collect(t_axis), u', xlabel=\"Posisi x (m)\", ylabel=\"Waktu t (s)\", \n",
    "        title=\"Diagram Perambatan Gelombang Spatiotemporal\", color=:viridis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Pertanyaan Evaluasi Praktikum\n",
    "1. **Teorema d'Alembert:** Jelaskan mengapa satu pulsa awal di $t=0$ terbelah menjadi dua pulsa simetris yang merambat ke kiri dan ke kanan!\n",
    "2. **Refleksi Gelombang:** Amati apa yang terjadi ketika gelombang menabrak batas di $x=0$ dan $x=L$. Mengapa polaritas gelombang terbalik saat dipantulkan (fase bergeser $180^\\circ$)?\n",
    "3. **Kestabilan Courant-Friedrichs-Lewy (CFL):** Ubahlah nilai $r = 1.2$ (melanggar kondisi CFL). Jalankan ulang dan amati ledakan ketidakstabilan numerik (*numerical explosion*)!"
   ]
  }
 ],
 "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
}
