{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "ChEn-5310: Computational Continuum Transport Phenomena Spring 2021 UMass Lowell; Prof. V. F. de Almeida **05Mar21**\n", "\n", "# 07. Poisson 1D with Dirichlet-Neumann Boundary Conditions\n", "$ \n", " \\newcommand{\\Amtrx}{\\boldsymbol{\\mathsf{A}}}\n", " \\newcommand{\\Bmtrx}{\\boldsymbol{\\mathsf{B}}}\n", " \\newcommand{\\Mmtrx}{\\boldsymbol{\\mathsf{M}}}\n", " \\newcommand{\\Imtrx}{\\boldsymbol{\\mathsf{I}}}\n", " \\newcommand{\\Pmtrx}{\\boldsymbol{\\mathsf{P}}}\n", " \\newcommand{\\Lmtrx}{\\boldsymbol{\\mathsf{L}}}\n", " \\newcommand{\\Umtrx}{\\boldsymbol{\\mathsf{U}}}\n", " \\newcommand{\\Smtrx}{\\boldsymbol{\\mathsf{S}}}\n", " \\newcommand{\\xvec}{\\boldsymbol{\\mathsf{x}}}\n", " \\newcommand{\\avec}{\\boldsymbol{\\mathsf{a}}}\n", " \\newcommand{\\bvec}{\\boldsymbol{\\mathsf{b}}}\n", " \\newcommand{\\cvec}{\\boldsymbol{\\mathsf{c}}}\n", " \\newcommand{\\rvec}{\\boldsymbol{\\mathsf{r}}}\n", " \\newcommand{\\fvec}{\\boldsymbol{\\mathsf{f}}}\n", " \\newcommand{\\mvec}{\\boldsymbol{\\mathsf{m}}}\n", " \\newcommand{\\gvec}{\\boldsymbol{\\mathsf{g}}}\n", " \\newcommand{\\zerovec}{\\boldsymbol{\\mathsf{0}}}\n", " \\newcommand{\\norm}[1]{\\bigl\\lVert{#1}\\bigr\\rVert}\n", " \\newcommand{\\transpose}[1]{{#1}^\\top}\n", " \\DeclareMathOperator{\\rank}{rank}\n", " \\newcommand{\\Reals}{\\mathbb{R}}\n", " \\newcommand{\\thetavec}{\\boldsymbol{\\theta}}\n", "$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Table of Contents\n", "* [Objectives](#obj)\n", "1. [Plotting Functions](#plotting)\n", "

\n", "1. [Problem Statement](#problem)\n", " + [Strong Form](#strong)\n", " + [Natural (Normal Flux) Boundary Condition Case (Neumann)](#nbc)\n", " + [Variational Form](#variational)\n", " + [Poisson-Dirichlet Energy](#energy)\n", "

\n", "1. [Problem Solution](#solution)\n", " + [Use Neumann Boundary Condition from MOOSE](#moosefluxbc)\n", " + [Code a Normal Flux Boundary Condition Kernel](#fluxbc)\n", " + [Compile and Link Application](#compilelink1)\n", "

\n", "1. [\"Draining\" Boundary Condition (input file)](#drain)\n", " + [Run App](#drainrun)\n", " + [Quadratic Lagrange FEM Results](#drainresults)\n", "

\n", "1. [\"Feeding\" Boundary Condition (input file)](#feed)\n", " + [Run App](#feedrun)\n", " + [Quadratic Lagrange FEM Results](#feedresults)\n", "

\n", "1. [Energy Postprocessing](#energypostpro)\n", " + [Code the Energy Postprocessor](#postpro)\n", "

\n", "1. [Application Tree](#tree)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Objectives](#toc)\n", "\n", " + This is a continuation of the Poisson 1D problem with Dirichlet boundary conditions detailed in [Notebook 06](https://nbviewer.jupyter.org/github/dpploy/engy-5310/blob/main/notebooks/06-poisson-1d-dirichlet.ipynb); some information may not be duplicated here.\n", " + Introduce the Galerkin variational (weak) form of the Poisson 1D problem below ([OneNote notes here](https://studentuml-my.sharepoint.com/:o:/g/personal/valmor_dealmeida_uml_edu/Eib-vZHIpRlPlOMtz0Gf_asBegEFKsl9dOK4nHyDbgSeUA?e=sLu1td)).\n", " + Introduce the use of combined Dirichlet and Neumann boundary conditions.\n", " + Use second order accurate finite element Lagrange basis functions to solve the problem numerically.\n", " + Some initial code is provided in the course repository but no full source code is given out. If you do not do a minimum of programing you will not learn basic aspects of this subject. Hands-on work during lectures will fill in this gap. If you do all the steps proposed in this notebook and attend the working lectures you will only have an initial knowledge of the subject." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Plotting Functions](#toc)\n", "\n", "This is an auxiliary section for holding plotting functions used later." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "code_folding": [ 2 ] }, "outputs": [], "source": [ "'''Plot function for FEM Solution'''\n", "\n", "def plot_solution(df, \n", " title='No Title', \n", " basis_functions_type='No basis functions type',\n", " flux_basis_functions_type='No basis functions type'):\n", " \n", " import matplotlib.pyplot as plt\n", " %matplotlib inline\n", " plt.style.use('dark_background')\n", "\n", " (fig, ax1) = plt.subplots(1, figsize=(14, 5))\n", "\n", " ax1.plot(df['x'], df['u'],'r*-',label=basis_functions_type)\n", "\n", " ax1.set_xlabel(r'$x$ [cm]', fontsize=18)\n", " ax1.set_ylabel(r'$u_h(x)$ [g/cc]', fontsize=18, color='red')\n", " ax1.tick_params(axis='y', labelcolor='red', labelsize=14)\n", " ax1.tick_params(axis='x', labelsize=14)\n", " ax1.legend(loc='center left', fontsize=12)\n", " #ax1.set_ylim(0,1)\n", " ax1.grid(True)\n", "\n", " if 'diffFluxU_x' in df.columns:\n", " # create a twin x axis to be shared\n", " ax2 = ax1.twinx()\n", "\n", " ax2.plot(df['x'], df['diffFluxU_x'],'*-', color='yellow', label=flux_basis_functions_type)\n", "\n", " ax2.set_ylabel(r\"$q_h(x)$ [g/cm2-s]\", fontsize=16, color='yellow')\n", " ax2.tick_params(axis='y', labelcolor='yellow', labelsize=14)\n", " ax2.legend(loc='center right', fontsize=12)\n", " #ax2.set_ylim(0,2)\n", " #ax2.grid(True)\n", "\n", " plt.title(title, fontsize=20)\n", " fig.tight_layout() # otherwise the right y-label is slightly clipped\n", " plt.show()\n", " print('')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "code_folding": [ 2 ] }, "outputs": [], "source": [ "'''Plot Function for Error Compared to Exact Dimensionless Solution'''\n", "\n", "def plot_solution_error(df, fem_type='No FEM type'):\n", " \n", " from engy_5310.toolkit import engy5310_p1_exact_solution\n", "\n", " import matplotlib.pyplot as plt\n", " %matplotlib inline\n", " plt.style.use('dark_background')\n", " \n", " (u_hat, _, _) = engy5310_p1_exact_solution(x_a, x_b, u_a, u_b, diff_coeff, source_s)\n", "\n", " L = df['x'].max() - df['x'].min()\n", " x_mean = (df['x'].max() + df['x'].min())/2.0\n", " x_hat = (df['x'] - x_mean)/L\n", " a_hat = u_a/source_s*diff_coeff/L**2\n", " b_hat = u_b/source_s*diff_coeff/L**2\n", "\n", " uh_hat = df['u']/source_s*diff_coeff/L**2\n", "\n", " plt.figure(1, figsize=(14, 5))\n", " \n", " plt.plot(x_hat, uh_hat,'r-*',label=fem_type)\n", " \n", " plt.plot(x_hat, u_hat(x_hat, a_hat, b_hat), 'x', color='yellow', label='Exact Solution')\n", "\n", " plt.plot(x_hat, uh_hat-u_hat(x_hat, a_hat, b_hat), 'x', color='magenta', label=r'$\\hat{u}_h-\\hat{u}$')\n", " \n", " plt.title('Dimensionless FEM Solution and Error', fontsize=20)\n", " plt.ylabel(r'$\\hat{u}_h, \\hat{u}$', fontsize=18)\n", " plt.xlabel(r'$\\hat{x}$', fontsize=18)\n", " plt.xticks(fontsize=16)\n", " plt.yticks(fontsize=16)\n", " plt.legend(loc='best',fontsize=12)\n", " plt.grid(True)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "code_folding": [ 2 ] }, "outputs": [], "source": [ "'''Plot Function for Error Compared to Exact Dimensionless Solution'''\n", "\n", "def plot_flux_error(df, fem_type='No FEM type'):\n", " \n", " from engy_5310.toolkit import engy5310_p1_exact_solution\n", " \n", " import matplotlib.pyplot as plt\n", " %matplotlib inline\n", " plt.style.use('dark_background')\n", " \n", " (_, flux_hat, _) = engy5310_p1_exact_solution(x_a, x_b, u_a, u_b, diff_coeff, source_s)\n", "\n", " L = df['x'].max() - df['x'].min()\n", " x_mean = (df['x'].max() + df['x'].min())/2.0\n", " x_hat = (df['x'] - x_mean)/L\n", " \n", " a_hat = u_a/source_s*diff_coeff/L**2\n", " b_hat = u_b/source_s*diff_coeff/L**2\n", "\n", " flux_h_hat = df['diffFluxU_x']/source_s/L\n", "\n", " plt.figure(1, figsize=(14, 5))\n", " \n", " plt.plot(x_hat, flux_h_hat, 'r-*', label=fem_type)\n", " \n", " plt.plot(x_hat, flux_hat(x_hat, a_hat, b_hat), 'x', color='yellow', label='Exact Solution')\n", "\n", " plt.plot(x_hat, flux_h_hat-flux_hat(x_hat, a_hat, b_hat),'x',color='magenta',label=r'$\\hat{q}_h-\\hat{q}$')\n", " \n", " plt.title('Dimensionless FEM Solution and Error', fontsize=20)\n", " plt.ylabel(r'$\\hat{q}_h, \\hat{q}$', fontsize=18)\n", " plt.xlabel(r'$\\hat{x}$', fontsize=18)\n", " plt.xticks(fontsize=16)\n", " plt.yticks(fontsize=16)\n", " plt.legend(loc='best',fontsize=12)\n", " plt.grid(True)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Problem Statement](#toc)\n", "\n", "The following sections describe what is referred in the literature as the one-dimensional Poisson problem with Dirchlet-Neumann boundary conditions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Strong Form of Problem Statement](#toc)\n", "\n", "Solve the Poisson model problem. Find $u:[a,b]\\subset\\Reals\\rightarrow\\Reals$ for $D > 0$ such that:\n", "\n", "\\begin{align*}\n", " -\\bigl(-D\\, u'\\bigr)'(x) + S &= 0 \\quad \\forall \\quad x\\in [a,b], \\\\\n", " u(a) &= A, \\\\\n", " q_n(b) &= q_{nb}.\n", "\\end{align*}\n", " \n", "Solve this problem analytically for the constants: diffusion coefficient, $D$, source, $S$, entry concentration, $A$, and exit normal flux, $q_{nb}$. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Natural (Normal Flux) Boundary Condition Case (Neumann)](#toc)\n", "\n", "The diffusion flux associated to $u$ is defined as\n", "\n", "\\begin{equation*}\n", " q(x) := -D\\,u'(x).\n", "\\end{equation*}\n", "\n", "The normal diffusion flux evaluated at boundary points is defined in 1D as:\n", "\n", "\\begin{align*}\n", " q_n(a) &:= - q(a), \\quad \\text{the normal flux at $a$ is equal to the negative of the flux at $a$}, \\\\\n", " q_n(b) &:= q(b) \\quad \\text{the normal flux at $b$ is equal to the flux at $b$}.\n", "\\end{align*}\n", "\n", "Therefore a positive value of normal flux $q_n$ at any boundary point indicates that the quantity $u$ is removed at the boundary. Otherwise, when $q_n$ is negative, $u$ is greater at the boundary as compared to the interior. The *normal* qualification here refers to the direction of the outward pointing vector at the boundary. Since this is a 1D problem, at the exit $b$, the normal aligns with the coordinate $x$ direction. At $a$ the normal is pointing in the opposite direction of the coordinate system; therefore the minus sign in the above definition.\n", "\n", "In the literature, the **Neumann boundary condition** is given on the *normal derivative* (or normal gradient) of the unknown variable. This is not the same as the normal diffusion flux but related.\n", "\n", "Here we will employ a mix of Dirichlet boundary condition on the entry point and a normal flux boundary condition on the exit point. That is:\n", "\n", "\\begin{align*}\n", " u(a) &= A, \\\\\n", " -D\\,u'(b) &= q_n(b) = q_{nb},\n", "\\end{align*}\n", "\n", "where $q_b$ is the value to be specified. If this value is positive, $u$ will be depleted at the boundary." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Variational Form of Problem Statement](#toc)\n", "\n", "The Galerkin weak formulation is as follows. Find $u \\in H^1\\!\\bigl([a,b]\\bigr)$ so that \n", "\n", "\\begin{align*}\n", " \\int\\limits_a^b -D\\, u'(x)\\,v'(x)\\,dx - q_n(b)\\,v(b) + \\int\\limits_a^b S\\,v(x)\\,dx &= 0 \\quad \\forall \\quad v \\in H^1_0\\!\\bigl([a,b]\\bigr), \n", "\\end{align*}\n", "\n", "where $H^1\\!\\bigl([a,b]\\bigr) := \\bigl\\{ u:[a,b]\\subset\\Reals\\rightarrow \\Reals \\mid \\int_a^b u'^2\\,dx < \\infty \\bigr\\}$ and \n", "$H^1_0\\!\\bigl([a,b]\\bigr) := \\bigl\\{ v \\mid v \\in H^1\\!\\bigl([a,b]\\bigr), v(a) = 0 \\bigr\\}$. This variational form is a modified Galerkin's weak form including the Neumann boundary condition." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Poisson-Dirichlet Energy](#toc)\n", "\n", "The associated energy that the variational form minimizes is the **mixed Dirichlet/Neumann total energy**:\n", "\n", "\\begin{align*}\n", " \\Phi[u] := \\int\\limits_a^b \\,\\frac{1}{2}\\bigl(q(x)\\bigr)^2 - D\\,S\\,u(x) \\,dx + D\\,q_n(b)\\,u(b).\n", "\\end{align*}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Problem Solution](#toc)\n", "\n", "The previously developed code for the Dirichlet boundary condition (Notebook 06) case remains unchanged and usable.\n", "To setup the new term in the weak form, there exist two options (you should do both): \n", "\n", " 1. The first, is to use the internal `MOOSE` framework implementation of the `NeumannBC` type in the boundary condition block of the input file. Start by just modifying your `MOOSE` boundary condition block in the input file as described [below](#moosefluxbc).\n", " 1. The second, involves the implementation of a new MOOSE kernel to be added to the weak form terms. This is the approach followed [here](#fluxbc) and there is a template in the course repository, `EquationFluxBC` which can be used as a starting point. In the Input file blocks shown below, the `type = NormalFluxBC` was created in the `Engy5310P1App` for this example. This approach implements an extended version of the normal diffusion flux [(see also Notebook 08)](https://nbviewer.jupyter.org/github/dpploy/engy-5310/blob/main/notebooks/08-poisson-1d-robin.ipynb).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Use Neumann Boundary Condition from MOOSE](#toc)\n", "\n", "```\n", "[BCs]\n", " [entry]\n", " type = DirichletBC # part of MOOSE\n", " variable = u\n", " boundary = left\n", " value = 3.00000e+00\n", " []\n", " [exit]\n", " type = NeumannBC # part of MOOSE\n", " variable = u\n", " boundary = right\n", " value = 4.10000e-01 # part of MOOSE\n", " []\n", "[]\n", "\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Code a Normal Flux Boundary Condition Kernel](#toc)\n", "\n", "To make this useful for the Robin boundary condition case later (Notebook 08), implement a linear transfer function as follows:\n", "\n", "\\begin{equation*}\n", " q_n(x) = q_\\text{bias} + h\\,\\bigl(u(x) - u_\\infty\\bigr).\n", "\\end{equation*}\n", "\n", "but set $h$ to zero at the moment.\n", "\n", "1. `cd include`\n", "1. `mkdir bcs`\n", "1. `cd bcs`\n", "1. Create a `NormalFluxBC.h` class interface as folows:\n", " + Use the `EquationFluxBC.h` [course template](https://github.com/dpploy/engy-5310/blob/main/moose-app-templates/EquationFluxBC.h) as follows:\n", " + `cp *path-to*/moose-app-templates/EquationFluxBC.h .`\n", " + `mv EquationFluxBC.h NormalFluxBC.h`\n", " + Edit the file `NormalFluxBC.h` with a text editor by replacing all instances of `EquationFluxBC` with `NormalFluxBC`.\n", " + Suggestion: you will need to declare member variables named `_bias`, `_transferCoeff`, `_reference`, as `Real` data type.\n", "1. `cd ../..`\n", "1. `cd src`\n", "1. `mkdir kernels`\n", "1. `cd kernels`\n", "1. Create a `NormalFluxBC.C` class implementation as follows:\n", " + Use the `EquationFluxBC.C` [course template](https://github.com/dpploy/engy-5310/blob/main/moose-app-templates/EquationFluxBC.C) as follows.\n", " + `cp *path-to*/moose-app-templates/EquationFluxBC.C .`\n", " + `mv EquationFluxBC.C NormalFluxBC.C`\n", " + Edit the file `EquationFluxBC.C` with a text editor by replacing all instances of `EquationFluxBC` with `NormalFluxBC`.\n", " + You will need to program the *residual* and *Jacobian* methods. This portion of the implementation is covered in class." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Compile and Link Application](#toc)\n", "\n", "1. Make sure you are in the problem project:\n", " + `cd ../..`\n", " + `pwd`\n", "1. You should see: `..../engy5310p1`\n", "1. Compile and link the application\n", " + `make`\n", "1. If all is sucessfull you should see among other things in the screen output:\n", " + Linking Library `.../engy5310p1/lib/libengy5310p1-opt.la...`\n", " + Linking Executable `.../engy5310p1/engy5310p1-opt...`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [\"Draining\" Boundary Condition (input file)](#toc)\n", "\n", "The *draining* boundary condition uses a positive normal diffusion flux at the exit point, therefore there exists diffusion *removal* of material at that point.\n", "\n", "Using the previous `input.hit` input file (edit with a text editor), the `exit` block was modified as follows:\n", "\n", "```\n", "[BCs]\n", " [entry]\n", " type = DirichletBC # part of MOOSE\n", " variable = u\n", " boundary = left\n", " value = 3.00000e+00\n", " []\n", " [exit]\n", " type = NormalFluxBC # user built\n", " variable = u\n", " boundary = right\n", " bias = 4.10000e-01 # user built\n", " []\n", "[]\n", "\n", "```\n", "\n", "\n", "Save the input file in the `.../engy5310p1/` directory." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Run Application](#toc)\n", "\n", "1. In the `engy5310p1/` directory run the application with the Linux shell command:\n", " + `./engy5310p1-opt -i input.hit`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Quadratic Lagrange FEM](#toc)\n", "\n", "Solve problem with parameter values:\n", "\n", "> + a = 0 cm\n", "> + b = 25 cm\n", "> + A = 3 g/cc\n", "> + qn_b = 0.41 g/cm^2-s (the bias parameter)\n", "> + D = 0.1 cm^2/s\n", "> + S = 5e-2 g/cc-s\n", "\n", "FEM parameters:\n", "\n", "> + Basis Functions: Second Order Lagrangian\n", "> + num. of finite elements: 1" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "'''Domain'''\n", "\n", "x_left = 0\n", "x_right = 25\n", "\n", "x_length = x_right - x_left" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "'''Parameters and data'''\n", "\n", "diff_coeff = 0.1\n", "source_s = 5e-2\n", "\n", "u_left = 3\n", "qn_right = 0.41 # draining on the exit boundary; normal diffusion flux is positive" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "'''FEM Solution'''\n", "\n", "n_felem = 1\n", "\n", "order = 'second'\n", "\n", "n_plot_pts = 2*n_felem + 1\n", "n_plot_pts = 10\n", "\n", "try: \n", " from engy_5310.toolkit import write_engy5310_p1_1d_input_file \n", "except ModuleNotFoundError:\n", " assert False, 'You need to provide your own code here. Bailing out.'\n", "\n", "write_engy5310_p1_1d_input_file(x_left=x_left, x_right=x_right, u_left=u_left, qn_bias_right=qn_right, \n", " diff_coeff=diff_coeff, source_s=source_s, n_felem=n_felem, order=order, \n", " n_plot_pts=n_plot_pts, compute_diffusion_flux=True)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Engy-5310 Problem 1: Poisson 1D FEM\r\n", "# UMass Lowell Nuclear Chemical Engineering\r\n", "# Prof. Valmor F. de Almeida\r\n", "# 19Apr21 13:07:16\r\n", "\r\n", "# Parameters\r\n", "xmin = 0.00000e+00\r\n", "xmax = 2.50000e+01\r\n", "diff_coeff = 1.00000e-01\r\n", "source_s = 5.00000e-02\r\n", "u_left = 3.00000e+00\r\n", "qn_bias_right = -5.00000e-01\r\n", "\r\n", "[Problem]\r\n", " type = FEProblem\r\n", " coord_type = XYZ\r\n", "[]\r\n", "\r\n", "[Mesh]\r\n", " [1d]\r\n", " type = GeneratedMeshGenerator\r\n", " dim = 1\r\n", " xmin = ${replace xmin}\r\n", " xmax = ${replace xmax}\r\n", " nx = 1\r\n", " elem_type = edge3\r\n", " []\r\n", "[]\r\n", "\r\n", "[Variables]\r\n", " [u]\r\n", " order = second\r\n", " family = lagrange\r\n", " initial_condition = ${replace u_left}\r\n", " []\r\n", "[]\r\n", "\r\n", "[AuxVariables]\r\n", " [diffFluxU]\r\n", " order = FIRST\r\n", " family = MONOMIAL_VEC\r\n", " []\r\n", " [diffFluxU_x]\r\n", " order = FIRST\r\n", " family = MONOMIAL\r\n", " []\r\n", "[]\r\n", "\r\n", "[Kernels]\r\n", " [diffusion-term]\r\n", " type = DiffusionTerm\r\n", " variable = u # produced quantity\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " []\r\n", " [source-term]\r\n", " type = SourceTerm\r\n", " variable = u # add to produced quantity\r\n", " sourceS = ${replace source_s}\r\n", " []\r\n", "[]\r\n", "\r\n", "[AuxKernels]\r\n", " [diffusion-flux]\r\n", " execute_on = timestep_end\r\n", " type = DiffusionFlux\r\n", " field = u\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " variable = diffFluxU # produced quantity\r\n", " []\r\n", " [diffusion-flux-x]\r\n", " execute_on = timestep_end\r\n", " type = VectorVariableComponentAux\r\n", " variable = diffFluxU_x # produced quantity\r\n", " component = x\r\n", " vector_variable = diffFluxU \r\n", " []\r\n", "[]\r\n", "\r\n", "[BCs]\r\n", " [entry]\r\n", " type = DirichletBC\r\n", " variable = u\r\n", " boundary = left\r\n", " value = 3.00000e+00\r\n", " []\r\n", " [exit]\r\n", " type = NormalFluxBC\r\n", " variable = u\r\n", " boundary = right\r\n", " bias = ${replace qn_bias_right}\r\n", " []\r\n", "[]\r\n", "\r\n", "[Executioner]\r\n", " type = Steady\r\n", " solve_type = 'PJFNK'\r\n", " petsc_options_iname = '-pc_type -pc_hypre_type'\r\n", " petsc_options_value = 'hypre boomeramg'\r\n", "[]\r\n", "\r\n", "[VectorPostprocessors]\r\n", " [x-data]\r\n", " type = LineValueSampler\r\n", " execute_on = 'timestep_end final'\r\n", " variable = 'u diffFluxU_x' # output data\r\n", " start_point = '${replace xmin} 0 0'\r\n", " end_point = '${replace xmax} 0 0'\r\n", " num_points = 10\r\n", " sort_by = id\r\n", " []\r\n", "[]\r\n", "\r\n", "[Outputs]\r\n", " console = true\r\n", " [file-x-data]\r\n", " type = CSV\r\n", " file_base = 'output'\r\n", " execute_on = 'final'\r\n", " show = 'x-data'\r\n", " []\r\n", "[]\r\n" ] } ], "source": [ "'''Display MOOSE input file created'''\n", "\n", "!cat engy5310p1/input.hit" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Framework Information:\n", "MOOSE Version: git commit 52562be492 on 2021-04-09\n", "LibMesh Version: 27141d18f3137f77e33cdb3d565fd38ebfbfc46f\n", "PETSc Version: 3.15.0\n", "SLEPc Version: 3.14.2\n", "Current Time: Mon Apr 19 13:07:34 2021\n", "Executable Timestamp: Sat Apr 17 21:27:24 2021\n", "\n", "Parallelism:\n", " Num Processors: 1\n", " Num Threads: 1\n", "\n", "Mesh: \n", " Parallel Type: replicated\n", " Mesh Dimension: 1\n", " Spatial Dimension: 1\n", " Nodes: \n", " Total: 3\n", " Local: 3\n", " Elems: \n", " Total: 1\n", " Local: 1\n", " Num Subdomains: 1\n", " Num Partitions: 1\n", "\n", "Nonlinear System:\n", " Num DOFs: 3\n", " Num Local DOFs: 3\n", " Variables: \"u\" \n", " Finite Element Types: \"LAGRANGE\" \n", " Approximation Orders: \"SECOND\" \n", "\n", "Auxiliary System:\n", " Num DOFs: 4\n", " Num Local DOFs: 4\n", " Variables: \"diffFluxU\" \"diffFluxU_x\" \n", " Finite Element Types: \"MONOMIAL_VEC\" \"MONOMIAL\" \n", " Approximation Orders: \"FIRST\" \"FIRST\" \n", "\n", "Execution Information:\n", " Executioner: Steady\n", " Solver Mode: Preconditioned JFNK\n", " PETSc Preconditioner: hypre boomeramg \n", "\n", " 0 Nonlinear |R| = \u001b[32m1.093700e+00\u001b[39m\n", " 0 Linear |R| = \u001b[32m1.093700e+00\u001b[39m\n", " 1 Linear |R| = \u001b[32m3.044605e-07\u001b[39m\n", " 1 Nonlinear |R| = \u001b[32m3.185802e-08\u001b[39m\n", " 0 Linear |R| = \u001b[32m3.185802e-08\u001b[39m\n", " 1 Linear |R| = \u001b[32m7.732334e-15\u001b[39m\n", " 2 Nonlinear |R| = \u001b[32m3.540550e-15\u001b[39m\n", "\u001b[32m Solve Converged!\u001b[39m\n", "WARNING! There are options you set that were not used!\n", "WARNING! could be spelling mistake, etc!\n", "There is one unused database option. It is:\n", "Option left: name:-i value: engy5310p1/input.hit\n" ] } ], "source": [ "'''Run Engy5310P1 MOOSE App'''\n", "\n", "!engy5310p1/engy5310p1-opt -i engy5310p1/input.hit" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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ktq9ezfff/89Xbp0YdWqVUycOJFSpUrRvn175s6dm2ZP/zfffEOtWrV47LHHWL16NQBr1qzh6aef5tNPP2Xo0KF06tQp12IODQ1NMwkF+wDsu+++y/D5O3bsSChYdjruuece3n33XdatW8eiRYsICwujePHiXHzxxVxzzTUEBgby1FNPJZvD/X//938sWLCA9957j+uuu45ly5ZRo0YNbrvtNk6dOkX37t2z9KHBe++9x/XXX8/48eMZNWoUBw8e5KqrrqJOnTrMmjUroTc+3rFjx1i8eDEtWrRgxIgRbNiwgdjYWCZMmMDatWvTfZ2uXbsybdo0Ro0axfjx4/nnn3+44IILCA0N5ciRI3Tp0iVPpoyIiOQkz0vJq6mpFYyW0okTJ9y+ffvcsmXL3ODBg93111+f7vrDGS2vldFyWGktsxbf7r77bjd79mwXHh7uIiMj3ebNm92IESPcZZddlnBMdpZwSmuJoPhWr149N3ToULd161Z34sQJd+DAAbd27Vr3xRdfuNatWyc7NjAw0L3xxhtu06ZNCeuVz5o1ywUHB7uDBw+68ePH59nvOmXr2rWrW7lypYuIiHD79u1zY8aMcfXq1UtYoqhly5aZ/p7SOxbSX1IpO9dBetdA1apV3bfffuv27t3rjh8/7lauXOm6dOnibrnlFuecc0888USWruuUy6ylbHXr1nXR0dHOubSXgitcuLB74YUX3Nq1a93x48fdkSNH3Lx589ydd96Z5d9LVven9e+Q0e8pKCjIPfnkk+6vv/5yx48fd2FhYW7YsGGuZs2a2VoKK7140/s/mtVrs1ChQu6dd95xO3bscFFRUW7jxo2ud+/eLigoKNXP/OijjzrnnBs3blyar/HLL78455zr1atXjseflWXWUv77OJe4zFpmzddl1ho0aOBefPFFN2PGDLd582Z3/PhxFxkZ6f799183YsQI16xZszSfV7VqVffZZ5+5rVu3uqioKLdv3z43duxYd/nll6c6NqP30JtuusktXbrURUZGuv3797uRI0eme20B7pxzznETJkxw+/fvd7GxscnOm9H7wPnnn++GDRvmdu3a5U6ePOl27drlhg8f7s4///xUx2bnfUlNTU0tj5vnAaipqampJWlt27Z1zjnXrVs3z2MpiO311193zjl33XXXeR6LmpqampqamlrSpjnoIiJ+pnPnzsTE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n3Q/wA033EC/fv04//zzCQwMpFixYqxdm7UFuGrUqMGmTZuydGx6AgMDeeONN7jtttuoUKECp+LKMpYvX56iRYsSEhKSLOaU8ae17amnnuLBBx+katWqOOcoVapUwu8IYPfu3QnfHz9+nKJFixIUFETVqlX577//0j13rVq16Nq1K4899ljCtkKFClG1atVs/vSn7zJgBHARMBC4etgwVufAECURyVlFikDbtrY++U032R/9qCiYNg3eeAN+/RX27vU6ShE5Uz3pww3zZ59Bz54QGWlzfH/5BR7JqRvmbEh5Xxd/X5bZfVtG99SQ9j1nWnbs2MG///7LgAED2LhxIzt37ky2v2rVqqxI8mnrsWPHOHDgANWqVUu4V0/5M5QoUSLhuUnv53ft2kVISAiVkkz+35MkY42MjEz1OP5cKWV2v5wbDhywlpnly20N8rZtYeRI21atGtStCwszmQv95JM2XL19e6vmfjpiYuD3363973/QpIn9He/SBd5+O+vnyTRBf/U0gizoKgJfYGu39yR1AbvT8ccffxAVFcXNN9/MTz/9lLC9WLFitGvXjpdeegmw/7TFihVL2F85yUSLmjVrMmTIENq0acMff/zBqVOnWLlyZUKxt7CwMGrUqJHs+JScSxwHUahQIX755Re6dOnC+PHjE3qN48+X9Ni07NixI9knjdlx991306lTJ6699lq2bt1K6dKlCQ8PJyAggH379hEdHU316tUT5pcn/fnS+pmaN2/O888/T5s2bfjrr79wznHw4MEsFcQLCwujWooFFpN+CLFjxw7eeOMNBgwYcDo/co4IBJ7D/j/vBa4FZgBLk8y7EhFvlS0LN95of8yvvx6KF4fwcJg40ea4/f67fVIvIpKfVKxoxbQGD7ZE3Zc5wXkpo/u2zO6pIfP74KSGDRvGN998Q/fu3VPt27VrV7Le8mLFinHWWWel6hRKS8rnVqlShejoaPbs2UP16tWzHF9Kp3O/nBeOHLHaK+++ax9exy+ztmYNTJ+eeNz06dbj3qePPX7mGfvQ+957bd3y+M8xIiPtnKdr0SJrvXv79rwsDXGXtN0KPIpVv3407nFOOXLkCP379+fjjz/m+uuvJzg4mFq1avHTTz+xf/9+vv/+ewBWrVpF+/btKVu2LJUqVaJXr14J5yhevDjOuYTe9m7dulGvXr2E/aNHj+bxxx+n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we23w86ddr8cFZWnoaeOy9uXl4LuPGAiUAO4AxjtbThnnIsvTkzKL7/ctv39N7zzjhV5++yz33jkkSs9jFBEREREJPtKlbLCxd272xRNgPvug23b4NprLQlPS/fuULEiXH11YifVtm15E3NGlKBLrrka6zmPwdY5X+RtOGeEwEBo2jQxKT/3XNv+xx/w3HM23GfDhmTPyPsgRUREROSMFxwczNKlSxMeDx48mCFDhvh8nkaNbIh70kR8505Ytw6uuir9BD00FBYsgI8/tt73gwdh9Gh44w2IifE5jByjBF1yxX3AV1iF9g7AFm/DKdAKF4Y2bexNpmNHqFQJTp6EGTPg3Xdtfvnu3V5HKSIiIiKSKCYmhsaNG5/2eSpXtoR6//7k2/fsyXiFobPPhmuugR9+gA4doHZt+PRTKFECnn32tMPKNiXokuNexaq1TwduBQ57G06BVLq0vZGEhkK7dvZGcuQITJpk88knT4ajR72OUkREREQke157DV56KeNjWrVKf19AADiX/v7AQNi7F3r0sHnqK1bAWWfBwIFK0KWAKIytb34X1nv+P2x4u+SMatWshzw0FFq3hpAQCAuDESNsPvmsWdZzLiIiIiKS3w0aZPe5Gdm+HZo0sYJv5csn70WvWBHmzk3/uWFhNvc8aRG5deugePHU58pLStAlR5QHxgNXAc8B73obToFRt27ifPIrrrBt69fD++9bUr5kScafDIqIiIiI5EcHDljLzPLl1knVti2MHGnbqlWz++iFC9N/3oIFcPfdyXvazz8fjh3zLjkHJeiSAy7EKrVXAW4BxngbTr4WEABXXpmYlF9wgW1fvBheeMGS8n/+8TBAERERERE/cuQIfP211V7auzdxmbU1axKruoN9v2QJ9Oljjz//HB591NZB/+QTm4Pevz989pknP0YCJehyWlpjCfkJoCWwNOPDJQ2FClmBitBQqyBZubINt5k504b2TJgAu3Z5HaWIiIiIiH968kkrFDdqFBQtasWSu3RJPnz9nHNgx47Exzt3wnXXWTK/apUVVf7mG3j99TwPPxkl6JJt3YEvgfVYpfbt3oaTr5QqZcXdOne2r6VKWVG3yZOtl3zSJDis6noiIiIiIpmKioLHH7eWnjp1Um9bvBiaNcu9uLJDCbr4LAB4A3gBmALcDhzxNKL8oUqVxCJv11xjPed79sCPP1pS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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "'''Show FEM Solution'''\n", "\n", "import pandas as pd\n", "df = pd.read_csv('output_x-data_0002.csv')\n", "\n", "plot_solution(df, title='Dirichlet/Draining Normal Flux FEM Solution', basis_functions_type='Quadratic Lagrange', flux_basis_functions_type='Linear Monomial')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Comments:**\n", "\n", "1. Because the flux at the exit is specified as positive, there is outgoing diffusion at the exit point of the domain, hence despite the constant source, the exit concentration is reduced to a level lower than the internal concentration. If the specified flux is too high compared to the source (or the source small compared to the flux) it will drive the concentration values at the exit to unphysical negative values.\n", "1. Note that 1 finite element was used." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [\"Feeding\" Boundary Condition (input file)](#toc)\n", "\n", "The *feeding* boundary condition uses a negative normal diffusion flux at the exit point, therefore there exists diffusion *feed* of material at that point.\n", "\n", "In a similar way to the *draining* flux previously described the input file was modified as follows:\n", "\n", "```\n", "[exit]\n", " type = NormalFluxBC\n", " variable = u\n", " boundary = right\n", " bias = -0.5\n", "[]\n", "```\n", "\n", "\n", "Save the input file in the `.../engy5310p1/` directory." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Run Application](#toc)\n", "\n", "1. In the `engy5310p1/` directory run the application with the Linux shell command:\n", " + `./engy5310p1-opt -i input.i`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Quadratic Lagrange FEM](#toc)\n", "\n", "Solve problem with parameter values:\n", "\n", "> + a = 0 cm\n", "> + b = 25 cm\n", "> + A = 3 g/cc\n", "> + qn_b = -0.5 g/cm^2-s (the bias parameter)\n", "> + D = 0.1 cm^2/s\n", "> + S = 1e-3 g/cc-s\n", "\n", "FEM parameters:\n", "\n", "> + Basis Functions: Second Order Lagrangian\n", "> + num. of finite elements: 1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "'''Parameters and data'''\n", "\n", "qn_right = - 0.5 # feeding on the exit boundary; normal flux is negative" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "'''FEM Solution'''\n", "\n", "n_felem = 1\n", "order = 'second'\n", "#n_plot_pts = 2*n_felem + 1\n", "n_plot_pts = 10\n", "\n", "try: \n", " from engy_5310.toolkit import write_engy5310_p1_1d_input_file \n", "except ModuleNotFoundError:\n", " assert False, 'You need to provide your own code here. Bailing out.'\n", "\n", "write_engy5310_p1_1d_input_file(x_left=x_left, x_right=x_right, u_left=u_left, qn_bias_right=qn_right, \n", " diff_coeff=diff_coeff, source_s=source_s, n_felem=n_felem, order=order, \n", " n_plot_pts=n_plot_pts, compute_diffusion_flux=True, use_moose_neumann_bc=False)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Engy-5310 Problem 1: Poisson 1D FEM\r\n", "# UMass Lowell Nuclear Chemical Engineering\r\n", "# Prof. Valmor F. de Almeida\r\n", "# 19Apr21 13:04:44\r\n", "\r\n", "# Parameters\r\n", "xmin = 0.00000e+00\r\n", "xmax = 2.50000e+01\r\n", "diff_coeff = 1.00000e-01\r\n", "source_s = 5.00000e-02\r\n", "u_left = 3.00000e+00\r\n", "qn_bias_right = -5.00000e-01\r\n", "\r\n", "[Problem]\r\n", " type = FEProblem\r\n", " coord_type = XYZ\r\n", "[]\r\n", "\r\n", "[Mesh]\r\n", " [1d]\r\n", " type = GeneratedMeshGenerator\r\n", " dim = 1\r\n", " xmin = ${replace xmin}\r\n", " xmax = ${replace xmax}\r\n", " nx = 1\r\n", " elem_type = edge3\r\n", " []\r\n", "[]\r\n", "\r\n", "[Variables]\r\n", " [u]\r\n", " order = second\r\n", " family = lagrange\r\n", " initial_condition = ${replace u_left}\r\n", " []\r\n", "[]\r\n", "\r\n", "[AuxVariables]\r\n", " [diffFluxU]\r\n", " order = FIRST\r\n", " family = MONOMIAL_VEC\r\n", " []\r\n", " [diffFluxU_x]\r\n", " order = FIRST\r\n", " family = MONOMIAL\r\n", " []\r\n", "[]\r\n", "\r\n", "[Kernels]\r\n", " [diffusion-term]\r\n", " type = DiffusionTerm\r\n", " variable = u # produced quantity\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " []\r\n", " [source-term]\r\n", " type = SourceTerm\r\n", " variable = u # add to produced quantity\r\n", " sourceS = ${replace source_s}\r\n", " []\r\n", "[]\r\n", "\r\n", "[AuxKernels]\r\n", " [diffusion-flux]\r\n", " execute_on = timestep_end\r\n", " type = DiffusionFlux\r\n", " field = u\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " variable = diffFluxU # produced quantity\r\n", " []\r\n", " [diffusion-flux-x]\r\n", " execute_on = timestep_end\r\n", " type = VectorVariableComponentAux\r\n", " variable = diffFluxU_x # produced quantity\r\n", " component = x\r\n", " vector_variable = diffFluxU \r\n", " []\r\n", "[]\r\n", "\r\n", "[BCs]\r\n", " [entry]\r\n", " type = DirichletBC\r\n", " variable = u\r\n", " boundary = left\r\n", " value = 3.00000e+00\r\n", " []\r\n", " [exit]\r\n", " type = NormalFluxBC\r\n", " variable = u\r\n", " boundary = right\r\n", " bias = ${replace qn_bias_right}\r\n", " []\r\n", "[]\r\n", "\r\n", "[Executioner]\r\n", " type = Steady\r\n", " solve_type = 'PJFNK'\r\n", " petsc_options_iname = '-pc_type -pc_hypre_type'\r\n", " petsc_options_value = 'hypre boomeramg'\r\n", "[]\r\n", "\r\n", "[VectorPostprocessors]\r\n", " [x-data]\r\n", " type = LineValueSampler\r\n", " execute_on = 'timestep_end final'\r\n", " variable = 'u diffFluxU_x' # output data\r\n", " start_point = '${replace xmin} 0 0'\r\n", " end_point = '${replace xmax} 0 0'\r\n", " num_points = 10\r\n", " sort_by = id\r\n", " []\r\n", "[]\r\n", "\r\n", "[Outputs]\r\n", " console = true\r\n", " [file-x-data]\r\n", " type = CSV\r\n", " file_base = 'output'\r\n", " execute_on = 'final'\r\n", " show = 'x-data'\r\n", " []\r\n", "[]\r\n" ] } ], "source": [ "'''Display MOOSE input file created'''\n", "\n", "!cat engy5310p1/input.hit" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Framework Information:\n", "MOOSE Version: git commit 52562be492 on 2021-04-09\n", "LibMesh Version: 27141d18f3137f77e33cdb3d565fd38ebfbfc46f\n", "PETSc Version: 3.15.0\n", "SLEPc Version: 3.14.2\n", "Current Time: Mon Apr 19 13:04:45 2021\n", "Executable Timestamp: Sat Apr 17 21:27:24 2021\n", "\n", "Parallelism:\n", " Num Processors: 1\n", " Num Threads: 1\n", "\n", "Mesh: \n", " Parallel Type: replicated\n", " Mesh Dimension: 1\n", " Spatial Dimension: 1\n", " Nodes: \n", " Total: 3\n", " Local: 3\n", " Elems: \n", " Total: 1\n", " Local: 1\n", " Num Subdomains: 1\n", " Num Partitions: 1\n", "\n", "Nonlinear System:\n", " Num DOFs: 3\n", " Num Local DOFs: 3\n", " Variables: \"u\" \n", " Finite Element Types: \"LAGRANGE\" \n", " Approximation Orders: \"SECOND\" \n", "\n", "Auxiliary System:\n", " Num DOFs: 4\n", " Num Local DOFs: 4\n", " Variables: \"diffFluxU\" \"diffFluxU_x\" \n", " Finite Element Types: \"MONOMIAL_VEC\" \"MONOMIAL\" \n", " Approximation Orders: \"FIRST\" \"FIRST\" \n", "\n", "Execution Information:\n", " Executioner: Steady\n", " Solver Mode: Preconditioned JFNK\n", " PETSc Preconditioner: hypre boomeramg \n", "\n", " 0 Nonlinear |R| = \u001b[32m1.093700e+00\u001b[39m\n", " 0 Linear |R| = \u001b[32m1.093700e+00\u001b[39m\n", " 1 Linear |R| = \u001b[32m3.044605e-07\u001b[39m\n", " 1 Nonlinear |R| = \u001b[32m3.185802e-08\u001b[39m\n", " 0 Linear |R| = \u001b[32m3.185802e-08\u001b[39m\n", " 1 Linear |R| = \u001b[32m7.732334e-15\u001b[39m\n", " 2 Nonlinear |R| = \u001b[32m3.540550e-15\u001b[39m\n", "\u001b[32m Solve Converged!\u001b[39m\n", "WARNING! There are options you set that were not used!\n", "WARNING! could be spelling mistake, etc!\n", "There is one unused database option. It is:\n", "Option left: name:-i value: engy5310p1/input.hit\n" ] } ], "source": [ "'''Run Engy5310P1 MOOSE App'''\n", "\n", "!engy5310p1/engy5310p1-opt -i engy5310p1/input.hit" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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rlatWsydO5eTJ09y/vx5Vq5cyR133JHqn1FEJDb1oItIunAch7fffpvmzZvTrVs3nn/++VQ974477uC1115jzZo1jB07lmLFinHp0qVknzNu3Dh69uzJ0aNHmTlzJkePHqVcuXI0b96c7du3s3HjxjjHd+zYkc6dO7NgwQJGjRpFzZo16dChA/Xr16dmzZocP348xTh79uzJmDFjCA8P56effuLgwYNUq1aNJ554gk6dOtGgQQMOHjzIqVOnGDJkCD179qRSpUpxhqnHHwpcpkwZ6tevz8cff5yq31V8FSpUYOXKlVSuXJlVq1axcOFC8ubNS8eOHVm4cCFPPvlkzM16tG+++YbHH3+cgwcPMnPmTE6dOkWDBg14++23admyJa1btyYyMjLm+P79+/Pxxx9z8uRJJkyYwKlTp2jTpg1r167l9OnTbsc8ZcoU7rzzThYsWMCZM2do3749AwYMoESJEjz22GNxjn3ppZcYMWIEJ06c4LvvvuP06dO0bt2aX375JU2vDbB582YmTZrEo48+So8ePRIdBhxfhw4d+PHHH/Hy8uKHH35g//791K1bl759+9K5c2caNWqUaI/oJ598wp133sm8efOYP39+nN8rwAcffECzZs2YM2cOixcv5u6772b48OH4+/tz4sQJ3nvvPWbNmsXq1atp3bo1/fr1w8fHh759+8Y5z3vvvceVK1dYv349//77LwULFqRFixZ8+umn1K9fn0cffTRNvytPeumll2jYsCHPP/88y5cvZ/78+QDUqFGDTz/9lMOHD/Pwww+n6UOa2OrUqUPRokXZt29fnGkZffr0AezfKKWh0Cm9X2W27du38/PPP/PII48wYMCAmPhKlixJp06dmDx5stt/P9Hvke6MFvDz82PRokU0a9aMbdu28cUXXxAQEMB9993H999/z/Dhw3n99dfdiiMl+/btY8iQIfTv3x+w0QrRUpoaVLBgQX755RduvPFGfvvtN0aOHEmxYsV44IEHWLx4MU899RSjR49O8Lx69erxyiuvsG7dOr755hsqVKjAvffey7Jly6hduzY7duxIx59QRHIKR01NTS2lFi25Y/z9/Z1Lly45juM4lSpVitm+YsWKBM9t2rRpzDn79OmT6Pn27t3r7N27N8623r17O47jOOvXr3cKFCgQZ5+3t7dTqlSpmMc9evRwHMdxLl++7LRo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OZcuXeLjjz+mWrVqCfb7+fklSCSjlyWqUKFCguPbtWtHQEAAQUFBaY5p48aNrFq1invuuSfJOao33XRTzFx0gI8++ohcuXIxduzYmCGdsRUqVCjOHMvJkydz6dIlnnnmmZi16cF+zyNGjMjQ4ZtTpkzh8uXLPPPMMwnmXL/77rtJ9sa6a/bs2axatYpOnTrRqFGjBPtnzZrF8ePH6datG7fffnucff3796dq1aosWbIkwfzzzBK9dF/8DxBq164dZ011T/vtt9/w8/NLcK326NEj0Q9hAF544QU6duzI9OnT+fbbb/n222+ZOnUq7dq14+WXX06XuAoVKhQTU+x1vKdOncrChQupXr06s2fPTvR9xc/Pj759+/Lhhx+mSywZYdq0aXTp0oW777470XXKU+vBBx+kVatWic7PL1myZMwUhNijiMaOHYu3tzcjRoyI8+FH0aJFGTRoUMwxKYmu5RB/XfcWLVrQrVu3RJ9z/PhxihcvTu7cuVM8P8Dly5eZPHky+fPn56233oqzr0qVKjz77LNcunSJiRMnpup8IiJXQ3PQRcQt0QWavL29KVSoEDfeeCONGzcmV65crF+/noceeihV64qn1TfffEPjxo3p0aMHO3fuZPbs2Rw9epQyZcrQokULxo4dy9ChQ9P1Nbdv385jjz3G2LFj+euvv1i4cCE7duzAz8+PChUqcOedd3L06NE4BdaWLVvGAw88wMyZM5k/fz4XLlxg//79TJo0icDAQC5cuMCCBQuuKq7u3buzfPlyxo4dy7PPPsv69es5deoU5cqV45ZbbuHmm2+mQYMGMfUAxo0bR926dXn66afZvXs3ixYt4sCBAxQpUoTKlSvTpEkTxo0bx1NPPQXA/v37efXVV/noo4/YvHkz06dP5/Tp07Rp04ZChQqxdetWatWqdVU/Q1L27NnDm2++ybvvvsvWrVtjXrt169YUKVKELVu2cMstt6TLa7300kv8+uuviX74cv78eR577DFmzJjBzz//zIwZMzhw4AB169alTZs2hISE8OSTT6ZLHGkxYcIEXn75ZUaOHEnz5s3ZuXMn1apVo2PHjsycOZMHH3zQY7HF9tlnn9GrVy+++uorWrZsycGDB6lVqxYNGzZkzpw5dOrUKc7x9erV491332XPnj0xa5IDPPnkk9SvX5933nmHVatWxQxPT40uXbrE1Ezw8fGhXLlydOrUiWLFivHbb78xatSomGMdx+H+++9n4sSJdOnShT179rBs2TK2bdtGZGQkFStWpGXLlpQoUYIRI0Zc3S8nGbVr1062KF5K73UXLlxg9uzZVx3H7bffTv/+/QkJCWHNmjXs3bsXsJE0HTp0ICAggFmzZvHDDz/EPOeDDz6gXbt2dOnSha1btzJ//nwCAgK4//77KVmyJO+//z6//PJLiq89btw4Xn75ZQYOHEitWrX4+++/qV69Ou3atSMoKIj77rsvwXOWLVvGbbfdxsKFC1m1ahXh4eFs3bqVuXPnJvk6r776KnfeeSfPPPMM9evXZ8WKFTHroOfPn59+/frFfCAmIpLRPF5KXk1NLeu3+C5evOgcPXrU2bBhgzN69GinTZs2CZYLi27JLbMWfzmm2C25pXK6d+/urFy50jl16pRz4cIFZ8+ePc6kSZOcOnXqxByT1BI8sX+m+GvhJrcE1U033eSMGzfO2bdvX8z64H/88YczatQop3nz5nGO9fb2dt555x1n9+7dMWvDr1ixwvH19XVOnDjhzJ49O8XfdWr+XfLly+e89tprzoYNG5yzZ886YWFhzp49e5y5c+c6vXv3dgICAhI8p0OHDs6cOXOc0NBQJzw83AkJCXHWr1/vDBs2LNElkR588EFn48aNzoULF5wjR444EydOdEqXLu3Wv2talkoCnIcfftjZtGlTgtf+448/nJMnT6b6+o2/zFr8Fntt9cSWgqtXr54zc+ZM58iRI054eLizf/9+58svv3RKly6d4NiUljFLbn9yS44l9XuqUaOGM3v2bCc0NNQ5d+6cs2HDBufxxx9PctmqtC6zltTfUWr/rhs1auT8/PPPzvnz553Tp087c+fOdW6++eYEP3OBAgWc3bt3O+Hh4XGWa4xudevWdS5evOjs3bs30SUDk4o/vtOnTzvr1693XnrppWSXU2vdurUzefJkZ8+ePU5YWJhz4cIFZ/fu3c7kyZMTrEWeXIteZi01v/fULLMW/+8ppWs8dnN3mbVy5co5ffv2dWbOnOn8888/zunTp53w8HDnv//+c+bNm+c89NBDib7/58qVy3nttdecP/74wwkLC3POnDnjrF69Os767NEtqesVcGrWrOnMmzfPOXPmjHP27FlnxYoVTpMmTZL8mwgICHC+/PJL5+DBgzFLMsY+r+MkfO8HnIIF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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "'''Show FEM Solution'''\n", "\n", "import pandas as pd\n", "df = pd.read_csv('output_x-data_0002.csv')\n", "\n", "plot_solution(df, title='Dirichlet/Feeding Normal Flux BC FEM Solution', basis_functions_type='Quadratic Lagrange', flux_basis_functions_type='Linear Monomial')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Comments:**\n", "\n", "1. Because the normal flux at the exit is specified as negative, there is incoming diffusion into the domain, hence the concentration is higher at the exit than the entry point. The average concentration in the domain is greatly increased at steady state.\n", "1. Note that 1 finite element was used." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Energy Postprocessing](#toc)\n", "\n", "To compute the [Poisson-Dirichlet energy](#energy) a *Postprocessor* needs to be built. The integral of the flux magnitude squared over the domain has been implemented in Notebook 06 for the Dirichlet energy. Here the normal flux term evaluated at the boundary needs to be implemented." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Code the Energy Postprocessor](#toc)\n", "\n", "coming soon...\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "'''FEM Solution'''\n", "\n", "n_felem = 1\n", "\n", "order = 'second'\n", "\n", "#n_plot_pts = 2*n_felem + 1\n", "n_plot_pts = 10\n", "\n", "try: \n", " from engy_5310.toolkit import write_engy5310_p1_1d_input_file \n", "except ModuleNotFoundError:\n", " assert False, 'You need to provide your own code here. Bailing out.'\n", "\n", "write_engy5310_p1_1d_input_file(x_left=x_left, x_right=x_right, u_left=u_left, qn_bias_right=qn_right, \n", " diff_coeff=diff_coeff, source_s=source_s, n_felem=n_felem, order=order, \n", " n_plot_pts=n_plot_pts, \n", " compute_diffusion_flux=True, use_moose_neumann_bc=False, compute_energy=True)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Engy-5310 Problem 1: Poisson 1D FEM\r\n", "# UMass Lowell Nuclear Chemical Engineering\r\n", "# Prof. Valmor F. de Almeida\r\n", "# 19Apr21 13:04:45\r\n", "\r\n", "# Parameters\r\n", "xmin = 0.00000e+00\r\n", "xmax = 2.50000e+01\r\n", "diff_coeff = 1.00000e-01\r\n", "source_s = 5.00000e-02\r\n", "u_left = 3.00000e+00\r\n", "qn_bias_right = -5.00000e-01\r\n", "\r\n", "[Problem]\r\n", " type = FEProblem\r\n", " coord_type = XYZ\r\n", "[]\r\n", "\r\n", "[Mesh]\r\n", " [1d]\r\n", " type = GeneratedMeshGenerator\r\n", " dim = 1\r\n", " xmin = ${replace xmin}\r\n", " xmax = ${replace xmax}\r\n", " nx = 1\r\n", " elem_type = edge3\r\n", " []\r\n", "[]\r\n", "\r\n", "[Variables]\r\n", " [u]\r\n", " order = second\r\n", " family = lagrange\r\n", " initial_condition = ${replace u_left}\r\n", " []\r\n", "[]\r\n", "\r\n", "[AuxVariables]\r\n", " [diffFluxU]\r\n", " order = FIRST\r\n", " family = MONOMIAL_VEC\r\n", " []\r\n", " [diffFluxU_x]\r\n", " order = FIRST\r\n", " family = MONOMIAL\r\n", " []\r\n", "[]\r\n", "\r\n", "[Kernels]\r\n", " [diffusion-term]\r\n", " type = DiffusionTerm\r\n", " variable = u # produced quantity\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " []\r\n", " [source-term]\r\n", " type = SourceTerm\r\n", " variable = u # add to produced quantity\r\n", " sourceS = ${replace source_s}\r\n", " []\r\n", "[]\r\n", "\r\n", "[AuxKernels]\r\n", " [diffusion-flux]\r\n", " execute_on = timestep_end\r\n", " type = DiffusionFlux\r\n", " field = u\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " variable = diffFluxU # produced quantity\r\n", " []\r\n", " [diffusion-flux-x]\r\n", " execute_on = timestep_end\r\n", " type = VectorVariableComponentAux\r\n", " variable = diffFluxU_x # produced quantity\r\n", " component = x\r\n", " vector_variable = diffFluxU \r\n", " []\r\n", "[]\r\n", "\r\n", "[BCs]\r\n", " [entry]\r\n", " type = DirichletBC\r\n", " variable = u\r\n", " boundary = left\r\n", " value = 3.00000e+00\r\n", " []\r\n", " [exit]\r\n", " type = NormalFluxBC\r\n", " variable = u\r\n", " boundary = right\r\n", " bias = ${replace qn_bias_right}\r\n", " []\r\n", "[]\r\n", "\r\n", "[Executioner]\r\n", " type = Steady\r\n", " solve_type = 'PJFNK'\r\n", " petsc_options_iname = '-pc_type -pc_hypre_type'\r\n", " petsc_options_value = 'hypre boomeramg'\r\n", "[]\r\n", "\r\n", "[Postprocessors]\r\n", " [bulk-energy]\r\n", " type = BulkEnergy\r\n", " execute_on = 'timestep_end final'\r\n", " variable = 'u' # bulk energy unknown variable\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " sourceS = ${replace source_s}\r\n", " []\r\n", " [boundary-energy-right]\r\n", " type = BoundaryEnergy\r\n", " execute_on = 'timestep_end final'\r\n", " variable = 'u' # bulk energy unknown variable\r\n", " diffCoeff = ${replace diff_coeff}\r\n", " diffNormalFluxBias = ${replace qn_bias_right}\r\n", " boundary = right\r\n", " []\r\n", " [total-energy]\r\n", " type = LinearCombinationPostprocessor\r\n", " pp_names = 'bulk-energy boundary-energy-right'\r\n", " pp_coefs = '1 1'\r\n", " b = 0\r\n", " []\r\n", "[]\r\n", "\r\n", "[VectorPostprocessors]\r\n", " [x-data]\r\n", " type = LineValueSampler\r\n", " execute_on = 'timestep_end final'\r\n", " variable = 'u diffFluxU_x' # output data\r\n", " start_point = '${replace xmin} 0 0'\r\n", " end_point = '${replace xmax} 0 0'\r\n", " num_points = 10\r\n", " sort_by = id\r\n", " []\r\n", "[]\r\n", "\r\n", "[Outputs]\r\n", " console = true\r\n", " [file-x-data]\r\n", " type = CSV\r\n", " file_base = 'output'\r\n", " execute_on = 'final'\r\n", " show = 'x-data'\r\n", " []\r\n", " [console-energy]\r\n", " type = Console\r\n", " execute_on = 'final linear nonlinear'\r\n", " show = 'bulk-energy boundary-energy-right total-energy'\r\n", " []\r\n", " [file-energy]\r\n", " type = CSV\r\n", " execute_on = 'final'\r\n", " file_base = 'output_energy'\r\n", " show = 'bulk-energy'\r\n", " []\r\n", "[]\r\n" ] } ], "source": [ "'''Display MOOSE input file created'''\n", "\n", "!cat engy5310p1/input.hit" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Framework Information:\n", "MOOSE Version: git commit 52562be492 on 2021-04-09\n", "LibMesh Version: 27141d18f3137f77e33cdb3d565fd38ebfbfc46f\n", "PETSc Version: 3.15.0\n", "SLEPc Version: 3.14.2\n", "Current Time: Mon Apr 19 13:04:45 2021\n", "Executable Timestamp: Sat Apr 17 21:27:24 2021\n", "\n", "Parallelism:\n", " Num Processors: 1\n", " Num Threads: 1\n", "\n", "Mesh: \n", " Parallel Type: replicated\n", " Mesh Dimension: 1\n", " Spatial Dimension: 1\n", " Nodes: \n", " Total: 3\n", " Local: 3\n", " Elems: \n", " Total: 1\n", " Local: 1\n", " Num Subdomains: 1\n", " Num Partitions: 1\n", "\n", "Nonlinear System:\n", " Num DOFs: 3\n", " Num Local DOFs: 3\n", " Variables: \"u\" \n", " Finite Element Types: \"LAGRANGE\" \n", " Approximation Orders: \"SECOND\" \n", "\n", "Auxiliary System:\n", " Num DOFs: 4\n", " Num Local DOFs: 4\n", " Variables: \"diffFluxU\" \"diffFluxU_x\" \n", " Finite Element Types: \"MONOMIAL_VEC\" \"MONOMIAL\" \n", " Approximation Orders: \"FIRST\" \"FIRST\" \n", "\n", "Execution Information:\n", " Executioner: Steady\n", " Solver Mode: Preconditioned JFNK\n", " PETSc Preconditioner: hypre boomeramg \n", "\n", "\n", "Postprocessor Values:\n", "+----------------+-----------------------+----------------+----------------+\n", "| time | boundary-energy-right | bulk-energy | total-energy |\n", "+----------------+-----------------------+----------------+----------------+\n", "| 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 |\n", "+----------------+-----------------------+----------------+----------------+\n", "\n", " 0 Nonlinear |R| = \u001b[32m1.093700e+00\u001b[39m\n", " 0 Linear |R| = \u001b[32m1.093700e+00\u001b[39m\n", " 1 Linear |R| = \u001b[32m3.044605e-07\u001b[39m\n", " 1 Nonlinear |R| = \u001b[32m3.185802e-08\u001b[39m\n", " 0 Linear |R| = \u001b[32m3.185802e-08\u001b[39m\n", " 1 Linear |R| = \u001b[32m7.732334e-15\u001b[39m\n", " 2 Nonlinear |R| = \u001b[32m3.540550e-15\u001b[39m\n", "\u001b[32m Solve Converged!\u001b[39m\n", "\n", "Postprocessor Values:\n", "+----------------+-----------------------+----------------+----------------+\n", "| time | boundary-energy-right | bulk-energy | total-energy |\n", "+----------------+-----------------------+----------------+----------------+\n", "| 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 |\n", "| 1.000000e+00 | -1.421250e+01 | -3.760417e+00 | -1.797292e+01 |\n", "+----------------+-----------------------+----------------+----------------+\n", "\n", "\n", "FINAL:\n", "\n", "Postprocessor Values:\n", "+----------------+-----------------------+----------------+----------------+\n", "| time | boundary-energy-right | bulk-energy | total-energy |\n", "+----------------+-----------------------+----------------+----------------+\n", "| 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 |\n", "| 1.000000e+00 | -1.421250e+01 | -3.760417e+00 | -1.797292e+01 |\n", "| 2.000000e+00 | -1.421250e+01 | -3.760417e+00 | -1.797292e+01 |\n", "+----------------+-----------------------+----------------+----------------+\n", "\n", "WARNING! There are options you set that were not used!\n", "WARNING! could be spelling mistake, etc!\n", "There is one unused database option. It is:\n", "Option left: name:-i value: engy5310p1/input.hit\n" ] } ], "source": [ "'''Run Engy5310P1 MOOSE App'''\n", "\n", "!engy5310p1/engy5310p1-opt -i engy5310p1/input.hit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Application Tree](#toc)\n", "\n", "This tree printout helps the understanding of various pieces of the `MOOSE` application repository created after all the above steps including future implementations in the notebooks following the present one that cover various boundary conditions." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[01;34mengy5310p1\u001b[00m\r\n", "├── LICENSE\r\n", "├── Makefile\r\n", "├── README.md\r\n", "├── \u001b[01;34m__pycache__\u001b[00m\r\n", "│   └── chigger.cpython-38.pyc\r\n", "├── \u001b[01;34mbuild\u001b[00m\r\n", "│   ├── \u001b[01;34mheader_symlinks\u001b[00m\r\n", "│   │   ├── \u001b[01;36mBoundaryEnergy.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/postprocessors/BoundaryEnergy.h\r\n", "│   │   ├── \u001b[01;36mBulkEnergy.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/postprocessors/BulkEnergy.h\r\n", "│   │   ├── \u001b[01;36mConvectionTerm.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/kernels/ConvectionTerm.h\r\n", "│   │   ├── \u001b[01;36mDiffusionFlux.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/auxkernels/DiffusionFlux.h\r\n", "│   │   ├── \u001b[01;36mDiffusionFluxComponent.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/auxkernels/DiffusionFluxComponent.h\r\n", "│   │   ├── \u001b[01;36mDiffusionTerm.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/kernels/DiffusionTerm.h\r\n", "│   │   ├── \u001b[01;36mEngy5310P1App.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/base/Engy5310P1App.h\r\n", "│   │   ├── \u001b[01;36mNormalFluxBC.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/bcs/NormalFluxBC.h\r\n", "│   │   └── \u001b[01;36mSourceTerm.h\u001b[00m -> /home/dealmeida/OneDrive/uml-courses/engy-5310/2021-01-05-spring/jupynb-repo/notebooks/engy5310p1/include/kernels/SourceTerm.h\r\n", "│   └── \u001b[01;34munity_src\u001b[00m\r\n", "│   ├── auxkernels_Unity.C\r\n", "│   ├── auxkernels_Unity.x86_64-pc-linux-gnu.opt.lo\r\n", "│   ├── auxkernels_Unity.x86_64-pc-linux-gnu.opt.lo.d\r\n", "│   ├── bcs_Unity.C\r\n", "│   ├── bcs_Unity.x86_64-pc-linux-gnu.opt.lo\r\n", "│   ├── bcs_Unity.x86_64-pc-linux-gnu.opt.lo.d\r\n", "│   ├── kernels_Unity.C\r\n", "│   ├── kernels_Unity.x86_64-pc-linux-gnu.opt.lo\r\n", "│   ├── kernels_Unity.x86_64-pc-linux-gnu.opt.lo.d\r\n", "│   ├── postprocessors_Unity.C\r\n", "│   ├── postprocessors_Unity.x86_64-pc-linux-gnu.opt.lo\r\n", "│   └── postprocessors_Unity.x86_64-pc-linux-gnu.opt.lo.d\r\n", "├── \u001b[01;32mengy5310p1-opt\u001b[00m\r\n", "├── \u001b[01;34minclude\u001b[00m\r\n", "│   ├── \u001b[01;34mauxkernels\u001b[00m\r\n", "│   │   ├── DiffusionFlux.h\r\n", "│   │   └── DiffusionFluxComponent.h\r\n", "│   ├── \u001b[01;34mbase\u001b[00m\r\n", "│   │   └── Engy5310P1App.h\r\n", "│   ├── \u001b[01;34mbcs\u001b[00m\r\n", "│   │   └── NormalFluxBC.h\r\n", "│   ├── \u001b[01;34mkernels\u001b[00m\r\n", "│   │   ├── ConvectionTerm.h\r\n", "│   │   ├── ConvectionTerm.h~\r\n", "│   │   ├── DiffusionTerm.h\r\n", "│   │   └── SourceTerm.h\r\n", "│   └── \u001b[01;34mpostprocessors\u001b[00m\r\n", "│   ├── BoundaryEnergy.h\r\n", "│   └── BulkEnergy.h\r\n", "├── input.hit\r\n", "├── \u001b[01;34mlib\u001b[00m\r\n", "│   ├── \u001b[01;32mlibengy5310p1-opt.la\u001b[00m\r\n", "│   ├── \u001b[01;36mlibengy5310p1-opt.so\u001b[00m -> \u001b[01;32mlibengy5310p1-opt.so.0.0.0\u001b[00m\r\n", "│   ├── \u001b[01;36mlibengy5310p1-opt.so.0\u001b[00m -> \u001b[01;32mlibengy5310p1-opt.so.0.0.0\u001b[00m\r\n", "│   └── \u001b[01;32mlibengy5310p1-opt.so.0.0.0\u001b[00m\r\n", "├── \u001b[01;34msrc\u001b[00m\r\n", "│   ├── \u001b[01;34mauxkernels\u001b[00m\r\n", "│   │   ├── DiffusionFlux.C\r\n", "│   │   └── DiffusionFluxComponent.C\r\n", "│   ├── \u001b[01;34mbase\u001b[00m\r\n", "│   │   ├── Engy5310P1App.C\r\n", "│   │   ├── Engy5310P1App.x86_64-pc-linux-gnu.opt.lo\r\n", "│   │   └── Engy5310P1App.x86_64-pc-linux-gnu.opt.lo.d\r\n", "│   ├── \u001b[01;34mbcs\u001b[00m\r\n", "│   │   ├── NormalFluxBC.C\r\n", "│   │   └── NormalFluxBC.C~\r\n", "│   ├── \u001b[01;34mkernels\u001b[00m\r\n", "│   │   ├── ConvectionTerm.C\r\n", "│   │   ├── ConvectionTerm.C~\r\n", "│   │   ├── DiffusionTerm.C\r\n", "│   │   └── SourceTerm.C\r\n", "│   ├── main.C\r\n", "│   ├── main.C~\r\n", "│   ├── main.x86_64-pc-linux-gnu.opt.lo\r\n", "│   ├── main.x86_64-pc-linux-gnu.opt.lo.d\r\n", "│   └── \u001b[01;34mpostprocessors\u001b[00m\r\n", "│   ├── BoundaryEnergy.C\r\n", "│   └── BulkEnergy.C\r\n", "├── \u001b[01;34mtest\u001b[00m\r\n", "│   └── \u001b[01;34mlib\u001b[00m\r\n", "│   ├── \u001b[01;32mlibengy5310p1_test-opt.la\u001b[00m\r\n", "│   ├── \u001b[01;36mlibengy5310p1_test-opt.so\u001b[00m -> \u001b[01;32mlibengy5310p1_test-opt.so.0.0.0\u001b[00m\r\n", "│   ├── \u001b[01;36mlibengy5310p1_test-opt.so.0\u001b[00m -> \u001b[01;32mlibengy5310p1_test-opt.so.0.0.0\u001b[00m\r\n", "│   └── \u001b[01;32mlibengy5310p1_test-opt.so.0.0.0\u001b[00m\r\n", "├── test.i\r\n", "└── vtkviz.py\r\n", "\r\n", "19 directories, 64 files\r\n" ] } ], "source": [ "!tree engy5310p1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "220.75px" }, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }