{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Diffusion Example" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# dependencies\n", "using LFAToolkit\n", "using LinearAlgebra\n", "using Pkg\n", "Pkg.activate(\"./\")\n", "Pkg.instantiate()\n", "using Plots" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "code_folding": [ 5, 7 ] }, "outputs": [], "source": [ "# setup\n", "p = 2\n", "dimension = 1\n", "\n", "mesh = []\n", "if dimension == 1\n", " mesh = Mesh1D(1.0)\n", "elseif dimension == 2\n", " mesh = Mesh2D(1.0, 1.0)\n", "end\n", "\n", "# operator\n", "diffusion = GalleryOperator(\"diffusion\", p + 1, p + 1, mesh)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "code_folding": [ 10, 14, 25, 38, 42, 53 ] }, "outputs": [], "source": [ "# compute full operator symbols\n", "numbersteps = 250\n", "maxeigenvalue = 0\n", "θ_min = -π/2\n", "θ_max = 3π/2\n", "θ_step = 2π/(numbersteps-1)\n", "θ_range = θ_min:θ_step:θ_max\n", "\n", "# compute and plot smoothing factor\n", "# -- 1D --\n", "if dimension == 1\n", " # compute\n", " maxeigenvalues = zeros(numbersteps)\n", "\n", " for i in 1:numbersteps\n", " θ = [θ_range[i]]\n", " A = computesymbols(diffusion, θ)\n", " eigenvalues = [abs(val) for val in eigvals(A)]\n", " maxeigenvalues[i] = max(eigenvalues...)\n", " maxeigenvalue = max(maxeigenvalue, maxeigenvalues[i])\n", " end\n", "\n", " # plot\n", " println(\"max eigenvalue: \", maxeigenvalue)\n", " xrange = θ_range/π\n", " plot(\n", " xrange,\n", " xlabel=\"θ/π\",\n", " xtickfont=font(12, \"Courier\"),\n", " maxeigenvalues,\n", " ytickfont=font(12, \"Courier\"),\n", " ylabel=\"spectral radius\",\n", " linewidth=3,\n", " legend=:none,\n", " title=\"Mass Operator Symbol\"\n", " )\n", " ylims!(0.0, max(maxeigenvalues...) * 1.1)\n", "# -- 2D --\n", "elseif dimension == 2\n", " # compute\n", " maxeigenvalues = zeros(numbersteps, numbersteps)\n", "\n", " for i in 1:numbersteps, j in 1:numbersteps\n", " θ = [θ_range[i], θ_range[j]]\n", " A = computesymbols(diffusion, θ)\n", " eigenvalues = [abs(val) for val in eigvals(A)]\n", " maxeigenvalues[i, j] = max(eigenvalues...)\n", " maxeigenvalue = max(maxeigenvalue, maxeigenvalues[i, j])\n", " end\n", "\n", " # plot\n", " println(\"max eigenvalue: \", maxeigenvalue)\n", " xrange = θ_range/π\n", " heatmap(\n", " xrange,\n", " xlabel=\"θ/π\",\n", " xtickfont=font(12, \"Courier\"),\n", " xrange,\n", " ylabel=\"θ/π\",\n", " maxeigenvalues,\n", " ytickfont=font(12, \"Courier\"),\n", " title=\"Mass Operator Symbol\",\n", " transpose=true,\n", " aspect_ratio=:equal\n", " )\n", " xlims!(θ_min/π, θ_max/π)\n", " ylims!(θ_min/π, θ_max/π)\n", "end" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.5.2", "language": "julia", "name": "julia-1.5" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.5.2" } }, "nbformat": 4, "nbformat_minor": 4 }