{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b72d0da5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:00.039788Z",
     "iopub.status.busy": "2026-10-02T14:46:00.039511Z",
     "iopub.status.idle": "2026-10-02T14:46:00.044910Z",
     "shell.execute_reply": "2026-10-02T14:46:00.044194Z"
    },
    "papermill": {
     "duration": 0.011646,
     "end_time": "2026-10-02T14:46:00.045738+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:00.034092+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output",
     "active-ipynb"
    ]
   },
   "outputs": [],
   "source": [
    "try:\n",
    "    from openmdao.utils.notebook_utils import notebook_mode  # noqa: F401\n",
    "except ImportError:\n",
    "    !python -m pip install openmdao[notebooks]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f105641c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:00.087919Z",
     "iopub.status.busy": "2026-10-02T14:46:00.087621Z",
     "iopub.status.idle": "2026-10-02T14:46:00.768614Z",
     "shell.execute_reply": "2026-10-02T14:46:00.767746Z"
    },
    "papermill": {
     "duration": 0.686299,
     "end_time": "2026-10-02T14:46:00.769262+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:00.082963+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "from openmdao.utils.assert_utils import assert_near_equal\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71ec736f",
   "metadata": {
    "papermill": {
     "duration": 0.002279,
     "end_time": "2026-10-02T14:46:00.774262+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:00.771983+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Getting Data from a Case\n",
    "\n",
    "The `Case` object contains all the information about a specific recorded case whether it was recorded by\n",
    "a problem, driver, system, or solver. `Case` objects have a number methods for accessing variables and their values."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1600741f",
   "metadata": {
    "papermill": {
     "duration": 0.002296,
     "end_time": "2026-10-02T14:46:00.778818+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:00.776522+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Example of Getting Variable Data from Case Recording of a Driver\n",
    "\n",
    "Here are the methods typically used when retrieving data from the recording of a :code:`Driver`.\n",
    "\n",
    "```{eval-rst}\n",
    ".. automethod:: openmdao.recorders.case.Case.get_objectives\n",
    "    :noindex:\n",
    "\n",
    ".. automethod:: openmdao.recorders.case.Case.get_constraints\n",
    "    :noindex:\n",
    "\n",
    ".. automethod:: openmdao.recorders.case.Case.get_design_vars\n",
    "    :noindex:\n",
    "\n",
    ".. automethod:: openmdao.recorders.case.Case.get_responses\n",
    "    :noindex:\n",
    "```\n",
    "\n",
    "The following example shows how to use these methods to easily check the variables of interest\n",
    "from the first driver iteration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4673113c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:00.784292Z",
     "iopub.status.busy": "2026-10-02T14:46:00.783939Z",
     "iopub.status.idle": "2026-10-02T14:46:02.104630Z",
     "shell.execute_reply": "2026-10-02T14:46:02.103927Z"
    },
    "papermill": {
     "duration": 1.324417,
     "end_time": "2026-10-02T14:46:02.105427+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:00.781010+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/papermill.record/text/html": "<style>pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.output_html .hll { background-color: #ffffcc }\n.output_html { background: #f8f8f8; }\n.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */\n.output_html .err { border: 1px solid #F00 } /* Error */\n.output_html .k { color: #008000; font-weight: bold } /* Keyword */\n.output_html .o { color: #666 } /* Operator */\n.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n.output_html .cp { color: #9C6500 } /* Comment.Preproc */\n.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n.output_html .gd { color: #A00000 } /* Generic.Deleted */\n.output_html .ge { font-style: italic } /* Generic.Emph */\n.output_html .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.output_html .gr { color: #E40000 } /* Generic.Error */\n.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.output_html .gi { color: #008400 } /* Generic.Inserted */\n.output_html .go { color: #717171 } /* Generic.Output */\n.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.output_html .gs { font-weight: bold } /* Generic.Strong */\n.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.output_html .gt { color: #04D } /* Generic.Traceback */\n.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.output_html .kp { color: #008000 } /* Keyword.Pseudo */\n.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.output_html .kt { color: #B00040 } /* Keyword.Type */\n.output_html .m { color: #666 } /* Literal.Number */\n.output_html .s { color: #BA2121 } /* Literal.String */\n.output_html .na { color: #687822 } /* Name.Attribute */\n.output_html .nb { color: #008000 } /* Name.Builtin */\n.output_html .nc { color: #00F; font-weight: bold } /* Name.Class */\n.output_html .no { color: #800 } /* Name.Constant */\n.output_html .nd { color: #A2F } /* Name.Decorator */\n.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */\n.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n.output_html .nf { color: #00F } /* Name.Function */\n.output_html .nl { color: #767600 } /* Name.Label */\n.output_html .nn { color: #00F; font-weight: bold } /* Name.Namespace */\n.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.output_html .nv { color: #19177C } /* Name.Variable */\n.output_html .ow { color: #A2F; font-weight: bold } /* Operator.Word */\n.output_html .w { color: #BBB } /* Text.Whitespace */\n.output_html .mb { color: #666 } /* Literal.Number.Bin */\n.output_html .mf { color: #666 } /* Literal.Number.Float */\n.output_html .mh { color: #666 } /* Literal.Number.Hex */\n.output_html .mi { color: #666 } /* Literal.Number.Integer */\n.output_html .mo { color: #666 } /* Literal.Number.Oct */\n.output_html .sa { color: #BA2121 } /* Literal.String.Affix */\n.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */\n.output_html .sc { color: #BA2121 } /* Literal.String.Char */\n.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n.output_html .sx { color: #008000 } /* Literal.String.Other */\n.output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n.output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n.output_html .ss { color: #19177C } /* Literal.String.Symbol */\n.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.output_html .fm { color: #00F } /* Name.Function.Magic */\n.output_html .vc { color: #19177C } /* Name.Variable.Class */\n.output_html .vg { color: #19177C } /* Name.Variable.Global */\n.output_html .vi { color: #19177C } /* Name.Variable.Instance */\n.output_html .vm { color: #19177C } /* Name.Variable.Magic */\n.output_html .il { color: #666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SellarDerivatives</span><span class=\"p\">(</span><span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">Group</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Group containing the Sellar MDA. This version uses the disciplines with derivatives.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;d1&#39;</span><span class=\"p\">,</span> <span class=\"n\">SellarDis1withDerivatives</span><span class=\"p\">(),</span> <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">])</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;d2&#39;</span><span class=\"p\">,</span> <span class=\"n\">SellarDis2withDerivatives</span><span class=\"p\">(),</span> <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">])</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;obj_cmp&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;obj = x**2 + z[1] + y1 + exp(-y2)&#39;</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span>\n                                                  <span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">z</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"mf\">0.0</span><span class=\"p\">]),</span> <span class=\"n\">y1</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">y2</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">),</span>\n                           <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;obj&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">])</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;con_cmp1&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;con1 = 3.16 - y1&#39;</span><span class=\"p\">,</span> <span class=\"n\">con1</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">y1</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">),</span>\n                           <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;con1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">])</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;con_cmp2&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;con2 = y2 - 24.0&#39;</span><span class=\"p\">,</span> <span class=\"n\">con2</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">y2</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">),</span>\n                           <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;con2&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">])</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">set_input_defaults</span><span class=\"p\">(</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"mf\">1.0</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">set_input_defaults</span><span class=\"p\">(</span><span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"mf\">5.0</span><span class=\"p\">,</span> <span class=\"mf\">2.0</span><span class=\"p\">]))</span>\n</pre></div>\n",
      "application/papermill.record/text/latex": "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{SellarDerivatives}\\PY{p}{(}\\PY{n}{om}\\PY{o}{.}\\PY{n}{Group}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{    }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{    Group containing the Sellar MDA. This version uses the disciplines with derivatives.}\n\\PY{l+s+sd}{    \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{setup}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{d1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{SellarDis1withDerivatives}\\PY{p}{(}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{d2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{SellarDis2withDerivatives}\\PY{p}{(}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj\\PYZus{}cmp}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{ExecComp}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj = x**2 + z[1] + y1 + exp(\\PYZhy{}y2)}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{obj}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{,}\n                                                  \\PY{n}{x}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{n}{z}\\PY{o}{=}\\PY{n}{np}\\PY{o}{.}\\PY{n}{array}\\PY{p}{(}\\PY{p}{[}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{l+m+mf}{0.0}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,} \\PY{n}{y1}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{n}{y2}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\\PY{p}{,}\n                           \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con\\PYZus{}cmp1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{ExecComp}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con1 = 3.16 \\PYZhy{} y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{con1}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{n}{y1}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\\PY{p}{,}\n                           \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con\\PYZus{}cmp2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{ExecComp}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con2 = y2 \\PYZhy{} 24.0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{con2}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{n}{y2}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\\PY{p}{,}\n                           \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{set\\PYZus{}input\\PYZus{}defaults}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+m+mf}{1.0}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{set\\PYZus{}input\\PYZus{}defaults}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{np}\\PY{o}{.}\\PY{n}{array}\\PY{p}{(}\\PY{p}{[}\\PY{l+m+mf}{5.0}\\PY{p}{,} \\PY{l+m+mf}{2.0}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\n\\end{Verbatim}\n",
      "application/papermill.record/text/plain": "class SellarDerivatives(om.Group):\n    \"\"\"\n    Group containing the Sellar MDA. This version uses the disciplines with derivatives.\n    \"\"\"\n\n    def setup(self):\n        self.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1', 'y2'])\n        self.add_subsystem('d2', SellarDis2withDerivatives(), promotes=['z', 'y1', 'y2'])\n\n        self.add_subsystem('obj_cmp', om.ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)', obj=0.0,\n                                                  x=0.0, z=np.array([0.0, 0.0]), y1=0.0, y2=0.0),\n                           promotes=['obj', 'x', 'z', 'y1', 'y2'])\n\n        self.add_subsystem('con_cmp1', om.ExecComp('con1 = 3.16 - y1', con1=0.0, y1=0.0),\n                           promotes=['con1', 'y1'])\n        self.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0', con2=0.0, y2=0.0),\n                           promotes=['con2', 'y2'])\n\n        self.set_input_defaults('x', 1.0)\n        self.set_input_defaults('z', np.array([5.0, 2.0]))"
     },
     "metadata": {
      "scrapbook": {
       "mime_prefix": "application/papermill.record/",
       "name": "code_src80"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src80\", get_code(\"openmdao.test_suite.components.sellar_feature.SellarDerivatives\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d70881f",
   "metadata": {
    "papermill": {
     "duration": 0.024412,
     "end_time": "2026-10-02T14:46:02.132516+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:02.108104+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `SellarDerivatives` class definition \n",
    "\n",
    "{glue:}`code_src80`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "39f36d40",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:02.160806Z",
     "iopub.status.busy": "2026-10-02T14:46:02.160589Z",
     "iopub.status.idle": "2026-10-02T14:46:04.115449Z",
     "shell.execute_reply": "2026-10-02T14:46:04.114046Z"
    },
    "papermill": {
     "duration": 1.959098,
     "end_time": "2026-10-02T14:46:04.116206+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:02.157108+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1790952363.419036] [runnervm8df0l:10400:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55c414c349d0 failed to create UD QP TX wr:256 sge:6 inl:64 resp:0 RX wr:4096 sge:1 resp:0 failed: Operation not supported\n",
      "[1790952363.419318] [runnervm8df0l:10400:0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[runnervm8df0l:10400] pml_ucx.c:313  Error: Failed to create UCP worker\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<!DOCTYPE html>\n",
       "<html lang=\"en\">\n",
       "<head>\n",
       "    <style>\n",
       "        h2 {\n",
       "            text-align: center;\n",
       "        }\n",
       "    </style>\n",
       "</head>\n",
       "<body>\n",
       "    <h2></h2>\n",
       "        <table style=\"border: 1px solid #999; border-collapse: collapse;\">\n",
       "        <tr><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">driver</th></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|0</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|1</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|2</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|3</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|4</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|5</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:ScipyOptimize_SLSQP|6</td></tr>\n",
       "    </table>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.sellar_feature import SellarDerivatives\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "prob = om.Problem(name='case_reader_data', model=SellarDerivatives())\n",
    "\n",
    "model = prob.model\n",
    "model.add_design_var('z', lower=np.array([-10.0, 0.0]),\n",
    "                          upper=np.array([10.0, 10.0]))\n",
    "model.add_design_var('x', lower=0.0, upper=10.0)\n",
    "model.add_objective('obj')\n",
    "model.add_constraint('con1', upper=0.0)\n",
    "model.add_constraint('con2', upper=0.0)\n",
    "\n",
    "model.nonlinear_solver = om.NonlinearBlockGS()\n",
    "model.linear_solver = om.ScipyKrylov()\n",
    "\n",
    "driver = prob.driver = om.ScipyOptimizeDriver(optimizer='SLSQP', tol=1e-9, disp=False)\n",
    "\n",
    "driver.add_recorder(om.SqliteRecorder(\"case_reader_data.sql\"))\n",
    "\n",
    "driver.recording_options['includes'] = []\n",
    "driver.recording_options['record_objectives'] = True\n",
    "driver.recording_options['record_constraints'] = True\n",
    "driver.recording_options['record_desvars'] = True\n",
    "\n",
    "prob.setup()\n",
    "prob.set_solver_print(0)\n",
    "prob.run_driver()\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_data.sql\")\n",
    "driver_cases = cr.list_cases('driver')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4a2a310d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.128569Z",
     "iopub.status.busy": "2026-10-02T14:46:04.128123Z",
     "iopub.status.idle": "2026-10-02T14:46:04.132536Z",
     "shell.execute_reply": "2026-10-02T14:46:04.131528Z"
    },
    "papermill": {
     "duration": 0.01121,
     "end_time": "2026-10-02T14:46:04.133219+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.122009+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert driver_cases == [ f\"rank0:ScipyOptimize_SLSQP|{n}\" for n in range(driver.iter_count)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "752d0182",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.195618Z",
     "iopub.status.busy": "2026-10-02T14:46:04.195355Z",
     "iopub.status.idle": "2026-10-02T14:46:04.198946Z",
     "shell.execute_reply": "2026-10-02T14:46:04.198430Z"
    },
    "papermill": {
     "duration": 0.061208,
     "end_time": "2026-10-02T14:46:04.199434+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.138226+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['x', 'z', 'con1', 'con2', 'obj'])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "case = cr.get_case(driver_cases[0])\n",
    "case.outputs.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "7c017153",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.208744Z",
     "iopub.status.busy": "2026-10-02T14:46:04.208531Z",
     "iopub.status.idle": "2026-10-02T14:46:04.211119Z",
     "shell.execute_reply": "2026-10-02T14:46:04.210630Z"
    },
    "papermill": {
     "duration": 0.007656,
     "end_time": "2026-10-02T14:46:04.211577+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.203921+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert sorted(case.outputs.keys()) == ['con1', 'con2', 'obj', 'x', 'z']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "83dcbae9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.220619Z",
     "iopub.status.busy": "2026-10-02T14:46:04.220443Z",
     "iopub.status.idle": "2026-10-02T14:46:04.223015Z",
     "shell.execute_reply": "2026-10-02T14:46:04.222564Z"
    },
    "papermill": {
     "duration": 0.00783,
     "end_time": "2026-10-02T14:46:04.223471+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.215641+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "objs = case.get_objectives()\n",
    "cons = case.get_constraints()\n",
    "dvs = case.get_design_vars()\n",
    "rsps = case.get_responses()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "348bfae0",
   "metadata": {
    "papermill": {
     "duration": 0.003434,
     "end_time": "2026-10-02T14:46:04.230297+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.226863+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Using `keys()` will give you the promoted variable names:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b66ff1bc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.237511Z",
     "iopub.status.busy": "2026-10-02T14:46:04.237351Z",
     "iopub.status.idle": "2026-10-02T14:46:04.240023Z",
     "shell.execute_reply": "2026-10-02T14:46:04.239614Z"
    },
    "papermill": {
     "duration": 0.006924,
     "end_time": "2026-10-02T14:46:04.240435+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.233511+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(['obj'], ['con1', 'con2'], ['x', 'z'])\n"
     ]
    }
   ],
   "source": [
    "print((sorted(objs.keys()), sorted(cons.keys()), sorted(dvs.keys())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "64ae2602",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.248418Z",
     "iopub.status.busy": "2026-10-02T14:46:04.248265Z",
     "iopub.status.idle": "2026-10-02T14:46:04.250849Z",
     "shell.execute_reply": "2026-10-02T14:46:04.250240Z"
    },
    "papermill": {
     "duration": 0.007485,
     "end_time": "2026-10-02T14:46:04.251602+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.244117+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert sorted(objs.keys()) == ['obj']\n",
    "assert sorted(cons.keys()) == ['con1', 'con2']\n",
    "assert sorted(dvs.keys()) == ['x', 'z']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae008818",
   "metadata": {
    "papermill": {
     "duration": 0.003612,
     "end_time": "2026-10-02T14:46:04.258754+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.255142+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Alternatively, you can get the absolute names:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "0553ea3d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.266634Z",
     "iopub.status.busy": "2026-10-02T14:46:04.266447Z",
     "iopub.status.idle": "2026-10-02T14:46:04.270647Z",
     "shell.execute_reply": "2026-10-02T14:46:04.270027Z"
    },
    "papermill": {
     "duration": 0.008851,
     "end_time": "2026-10-02T14:46:04.271128+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.262277+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(['obj_cmp.obj'], ['con_cmp1.con1', 'con_cmp2.con2'], ['x', 'z'])\n"
     ]
    }
   ],
   "source": [
    "print((sorted(objs.absolute_names()), sorted(cons.absolute_names()), sorted(dvs.absolute_names())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a85d275f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.279365Z",
     "iopub.status.busy": "2026-10-02T14:46:04.279194Z",
     "iopub.status.idle": "2026-10-02T14:46:04.281978Z",
     "shell.execute_reply": "2026-10-02T14:46:04.281467Z"
    },
    "papermill": {
     "duration": 0.007515,
     "end_time": "2026-10-02T14:46:04.282421+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.274906+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert sorted(objs.absolute_names()) == ['obj_cmp.obj']\n",
    "assert sorted(cons.absolute_names()) == ['con_cmp1.con1', 'con_cmp2.con2']\n",
    "assert sorted(dvs.absolute_names()) == ['x', 'z']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a52c56e1",
   "metadata": {
    "papermill": {
     "duration": 0.003587,
     "end_time": "2026-10-02T14:46:04.290437+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.286850+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "You can access variable values using either the promoted or the absolute name:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "994b2659",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.298671Z",
     "iopub.status.busy": "2026-10-02T14:46:04.298478Z",
     "iopub.status.idle": "2026-10-02T14:46:04.302517Z",
     "shell.execute_reply": "2026-10-02T14:46:04.301851Z"
    },
    "papermill": {
     "duration": 0.009052,
     "end_time": "2026-10-02T14:46:04.303075+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.294023+00:00",
     "status": "completed"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "objective (obj):\t [28.58830817] [28.58830817]\n",
      "constraint (con1):\t [-22.42830237] [-22.42830237]\n",
      "design vars (x):\t [1.] [5. 2.]\n",
      "response vars (con2):\t [-11.94151185] [-11.94151185]\n"
     ]
    }
   ],
   "source": [
    "print('objective (obj):\\t', objs['obj'], objs['obj_cmp.obj'])\n",
    "print('constraint (con1):\\t', cons['con1'], cons['con_cmp1.con1'])\n",
    "# Note that x is supplied by an automatically generated IndepVarComp\n",
    "print('design vars (x):\\t', dvs['x'], dvs['_auto_ivc.v1'])\n",
    "print('response vars (con2):\\t', rsps['con2'], rsps['con_cmp2.con2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8d917543",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.311341Z",
     "iopub.status.busy": "2026-10-02T14:46:04.311156Z",
     "iopub.status.idle": "2026-10-02T14:46:04.313790Z",
     "shell.execute_reply": "2026-10-02T14:46:04.313319Z"
    },
    "papermill": {
     "duration": 0.008734,
     "end_time": "2026-10-02T14:46:04.315486+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.306752+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert objs['obj'] == objs['obj_cmp.obj']\n",
    "assert cons['con1'] == cons['con_cmp1.con1']\n",
    "assert dvs['x'] == dvs['_auto_ivc.v0']\n",
    "assert rsps['con2'] == rsps['con_cmp2.con2']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e6219f4",
   "metadata": {
    "papermill": {
     "duration": 0.003609,
     "end_time": "2026-10-02T14:46:04.322999+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.319390+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "You can also access the variables directly from the case object:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "dd809e15",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.331282Z",
     "iopub.status.busy": "2026-10-02T14:46:04.331109Z",
     "iopub.status.idle": "2026-10-02T14:46:04.334545Z",
     "shell.execute_reply": "2026-10-02T14:46:04.333963Z"
    },
    "papermill": {
     "duration": 0.008406,
     "end_time": "2026-10-02T14:46:04.335081+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.326675+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([28.58830817]), array([28.58830817]))\n",
      "(array([1.]), array([5., 2.]))\n"
     ]
    }
   ],
   "source": [
    "print((case['obj'], case['obj_cmp.obj']))\n",
    "print((case['x'], case['_auto_ivc.v1']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "89077431",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.343171Z",
     "iopub.status.busy": "2026-10-02T14:46:04.342999Z",
     "iopub.status.idle": "2026-10-02T14:46:04.345667Z",
     "shell.execute_reply": "2026-10-02T14:46:04.344970Z"
    },
    "papermill": {
     "duration": 0.00743,
     "end_time": "2026-10-02T14:46:04.346083+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.338653+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert case['obj'] == case['obj_cmp.obj']\n",
    "assert case['x'] == case['_auto_ivc.v0']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8343898a",
   "metadata": {
    "papermill": {
     "duration": 0.003667,
     "end_time": "2026-10-02T14:46:04.353507+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.349840+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Getting Variable Data from Case Recording of a Problem"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "083d0793",
   "metadata": {
    "papermill": {
     "duration": 0.003607,
     "end_time": "2026-10-02T14:46:04.360927+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.357320+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Here are the methods typically used when retrieving data from the recording of a `Problem`.\n",
    "\n",
    "```{eval-rst}\n",
    ".. automethod:: openmdao.recorders.case.Case.list_inputs\n",
    "    :noindex:\n",
    "\n",
    ".. automethod:: openmdao.recorders.case.Case.list_outputs\n",
    "    :noindex:\n",
    "```\n",
    "The following example shows how to use these methods."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "c23fa8a5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.427269Z",
     "iopub.status.busy": "2026-10-02T14:46:04.427022Z",
     "iopub.status.idle": "2026-10-02T14:46:04.438326Z",
     "shell.execute_reply": "2026-10-02T14:46:04.437599Z"
    },
    "papermill": {
     "duration": 0.074724,
     "end_time": "2026-10-02T14:46:04.439330+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.364606+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/papermill.record/text/html": "<style>pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.output_html .hll { background-color: #ffffcc }\n.output_html { background: #f8f8f8; }\n.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */\n.output_html .err { border: 1px solid #F00 } /* Error */\n.output_html .k { color: #008000; font-weight: bold } /* Keyword */\n.output_html .o { color: #666 } /* Operator */\n.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n.output_html .cp { color: #9C6500 } /* Comment.Preproc */\n.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n.output_html .gd { color: #A00000 } /* Generic.Deleted */\n.output_html .ge { font-style: italic } /* Generic.Emph */\n.output_html .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.output_html .gr { color: #E40000 } /* Generic.Error */\n.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.output_html .gi { color: #008400 } /* Generic.Inserted */\n.output_html .go { color: #717171 } /* Generic.Output */\n.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.output_html .gs { font-weight: bold } /* Generic.Strong */\n.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.output_html .gt { color: #04D } /* Generic.Traceback */\n.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.output_html .kp { color: #008000 } /* Keyword.Pseudo */\n.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.output_html .kt { color: #B00040 } /* Keyword.Type */\n.output_html .m { color: #666 } /* Literal.Number */\n.output_html .s { color: #BA2121 } /* Literal.String */\n.output_html .na { color: #687822 } /* Name.Attribute */\n.output_html .nb { color: #008000 } /* Name.Builtin */\n.output_html .nc { color: #00F; font-weight: bold } /* Name.Class */\n.output_html .no { color: #800 } /* Name.Constant */\n.output_html .nd { color: #A2F } /* Name.Decorator */\n.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */\n.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n.output_html .nf { color: #00F } /* Name.Function */\n.output_html .nl { color: #767600 } /* Name.Label */\n.output_html .nn { color: #00F; font-weight: bold } /* Name.Namespace */\n.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.output_html .nv { color: #19177C } /* Name.Variable */\n.output_html .ow { color: #A2F; font-weight: bold } /* Operator.Word */\n.output_html .w { color: #BBB } /* Text.Whitespace */\n.output_html .mb { color: #666 } /* Literal.Number.Bin */\n.output_html .mf { color: #666 } /* Literal.Number.Float */\n.output_html .mh { color: #666 } /* Literal.Number.Hex */\n.output_html .mi { color: #666 } /* Literal.Number.Integer */\n.output_html .mo { color: #666 } /* Literal.Number.Oct */\n.output_html .sa { color: #BA2121 } /* Literal.String.Affix */\n.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */\n.output_html .sc { color: #BA2121 } /* Literal.String.Char */\n.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n.output_html .sx { color: #008000 } /* Literal.String.Other */\n.output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n.output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n.output_html .ss { color: #19177C } /* Literal.String.Symbol */\n.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.output_html .fm { color: #00F } /* Name.Function.Magic */\n.output_html .vc { color: #19177C } /* Name.Variable.Class */\n.output_html .vg { color: #19177C } /* Name.Variable.Global */\n.output_html .vi { color: #19177C } /* Name.Variable.Instance */\n.output_html .vm { color: #19177C } /* Name.Variable.Magic */\n.output_html .il { color: #666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SellarProblem</span><span class=\"p\">(</span><span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">Problem</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    The Sellar problem with configurable model class.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model_class</span><span class=\"o\">=</span><span class=\"n\">SellarDerivatives</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">prob_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">{}</span> <span class=\"k\">if</span> <span class=\"n\">name</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"k\">else</span> <span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"n\">name</span><span class=\"p\">}</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model_class</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">),</span> <span class=\"o\">**</span><span class=\"n\">prob_kwargs</span><span class=\"p\">)</span>\n\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span>\n        <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_design_var</span><span class=\"p\">(</span><span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"o\">-</span><span class=\"mf\">10.0</span><span class=\"p\">,</span> <span class=\"mf\">0.0</span><span class=\"p\">]),</span> <span class=\"n\">upper</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"mf\">10.0</span><span class=\"p\">,</span> <span class=\"mf\">10.0</span><span class=\"p\">]))</span>\n        <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_design_var</span><span class=\"p\">(</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"o\">=</span><span class=\"mf\">10.0</span><span class=\"p\">)</span>\n        <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_objective</span><span class=\"p\">(</span><span class=\"s1\">&#39;obj&#39;</span><span class=\"p\">)</span>\n        <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_constraint</span><span class=\"p\">(</span><span class=\"s1\">&#39;con1&#39;</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">)</span>\n        <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_constraint</span><span class=\"p\">(</span><span class=\"s1\">&#39;con2&#39;</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># default to non-verbose</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">set_solver_print</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</pre></div>\n",
      "application/papermill.record/text/latex": "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{SellarProblem}\\PY{p}{(}\\PY{n}{om}\\PY{o}{.}\\PY{n}{Problem}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{    }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{    The Sellar problem with configurable model class.}\n\\PY{l+s+sd}{    \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf+fm}{\\PYZus{}\\PYZus{}init\\PYZus{}\\PYZus{}}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{,} \\PY{n}{model\\PYZus{}class}\\PY{o}{=}\\PY{n}{SellarDerivatives}\\PY{p}{,} \\PY{n}{name}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,} \\PY{o}{*}\\PY{o}{*}\\PY{n}{kwargs}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n}{prob\\PYZus{}kwargs} \\PY{o}{=} \\PY{p}{\\PYZob{}}\\PY{p}{\\PYZcb{}} \\PY{k}{if} \\PY{n}{name} \\PY{o+ow}{is} \\PY{k+kc}{None} \\PY{k}{else} \\PY{p}{\\PYZob{}}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{name}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{:} \\PY{n}{name}\\PY{p}{\\PYZcb{}}\n        \\PY{n+nb}{super}\\PY{p}{(}\\PY{p}{)}\\PY{o}{.}\\PY{n+nf+fm}{\\PYZus{}\\PYZus{}init\\PYZus{}\\PYZus{}}\\PY{p}{(}\\PY{n}{model\\PYZus{}class}\\PY{p}{(}\\PY{o}{*}\\PY{o}{*}\\PY{n}{kwargs}\\PY{p}{)}\\PY{p}{,} \\PY{o}{*}\\PY{o}{*}\\PY{n}{prob\\PYZus{}kwargs}\\PY{p}{)}\n\n        \\PY{n}{model} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{model}\n        \\PY{n}{model}\\PY{o}{.}\\PY{n}{add\\PYZus{}design\\PYZus{}var}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{lower}\\PY{o}{=}\\PY{n}{np}\\PY{o}{.}\\PY{n}{array}\\PY{p}{(}\\PY{p}{[}\\PY{o}{\\PYZhy{}}\\PY{l+m+mf}{10.0}\\PY{p}{,} \\PY{l+m+mf}{0.0}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,} \\PY{n}{upper}\\PY{o}{=}\\PY{n}{np}\\PY{o}{.}\\PY{n}{array}\\PY{p}{(}\\PY{p}{[}\\PY{l+m+mf}{10.0}\\PY{p}{,} \\PY{l+m+mf}{10.0}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\n        \\PY{n}{model}\\PY{o}{.}\\PY{n}{add\\PYZus{}design\\PYZus{}var}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{lower}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{n}{upper}\\PY{o}{=}\\PY{l+m+mf}{10.0}\\PY{p}{)}\n        \\PY{n}{model}\\PY{o}{.}\\PY{n}{add\\PYZus{}objective}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n}{model}\\PY{o}{.}\\PY{n}{add\\PYZus{}constraint}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{upper}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\n        \\PY{n}{model}\\PY{o}{.}\\PY{n}{add\\PYZus{}constraint}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{upper}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\n\n        \\PY{c+c1}{\\PYZsh{} default to non\\PYZhy{}verbose}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{set\\PYZus{}solver\\PYZus{}print}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\n\\end{Verbatim}\n",
      "application/papermill.record/text/plain": "class SellarProblem(om.Problem):\n    \"\"\"\n    The Sellar problem with configurable model class.\n    \"\"\"\n\n    def __init__(self, model_class=SellarDerivatives, name=None, **kwargs):\n        prob_kwargs = {} if name is None else {'name': name}\n        super().__init__(model_class(**kwargs), **prob_kwargs)\n\n        model = self.model\n        model.add_design_var('z', lower=np.array([-10.0, 0.0]), upper=np.array([10.0, 10.0]))\n        model.add_design_var('x', lower=0.0, upper=10.0)\n        model.add_objective('obj')\n        model.add_constraint('con1', upper=0.0)\n        model.add_constraint('con2', upper=0.0)\n\n        # default to non-verbose\n        self.set_solver_print(0)"
     },
     "metadata": {
      "scrapbook": {
       "mime_prefix": "application/papermill.record/",
       "name": "code_src81"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src81\", get_code(\"openmdao.test_suite.components.sellar.SellarProblem\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f777c4b5",
   "metadata": {
    "papermill": {
     "duration": 0.003837,
     "end_time": "2026-10-02T14:46:04.447620+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.443783+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `SellarProblem` class definition \n",
    "\n",
    "{glue:}`code_src81`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "b77ca7f9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:04.456667Z",
     "iopub.status.busy": "2026-10-02T14:46:04.456464Z",
     "iopub.status.idle": "2026-10-02T14:46:05.017874Z",
     "shell.execute_reply": "2026-10-02T14:46:05.017271Z"
    },
    "papermill": {
     "duration": 0.567081,
     "end_time": "2026-10-02T14:46:05.018796+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:04.451715+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/problem.py:384: OpenMDAOWarning:The problem name 'case_reader_data' already exists\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.sellar import SellarProblem\n",
    "from openmdao.test_suite.components.sellar_feature import SellarDerivatives\n",
    "\n",
    "prob = SellarProblem(name='case_reader_data', model_class=SellarDerivatives)\n",
    "\n",
    "recorder = om.SqliteRecorder(\"case_reader_data.sql\")\n",
    "prob.model.nonlinear_solver = om.NonlinearBlockGS()\n",
    "prob.model.linear_solver = om.ScipyKrylov()\n",
    "\n",
    "prob.model.add_recorder(recorder)\n",
    "prob.model.recording_options['record_residuals'] = True\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "d1 = prob.model.d1\n",
    "d1.add_recorder(recorder)\n",
    "\n",
    "prob.run_driver()\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_data.sql\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "17466551",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.032823Z",
     "iopub.status.busy": "2026-10-02T14:46:05.032581Z",
     "iopub.status.idle": "2026-10-02T14:46:05.041032Z",
     "shell.execute_reply": "2026-10-02T14:46:05.040300Z"
    },
    "papermill": {
     "duration": 0.01438,
     "end_time": "2026-10-02T14:46:05.041620+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.027240+00:00",
     "status": "completed"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<!DOCTYPE html>\n",
       "<html lang=\"en\">\n",
       "<head>\n",
       "    <style>\n",
       "        h2 {\n",
       "            text-align: center;\n",
       "        }\n",
       "    </style>\n",
       "</head>\n",
       "<body>\n",
       "    <h2></h2>\n",
       "        <table style=\"border: 1px solid #999; border-collapse: collapse;\">\n",
       "        <tr><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">root.d1</th></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|d1._solve_nonlinear|0</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|1|d1._solve_nonlinear|1</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|2|d1._solve_nonlinear|2</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|3|d1._solve_nonlinear|3</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|4|d1._solve_nonlinear|4</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|5|d1._solve_nonlinear|5</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|6|d1._solve_nonlinear|6</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rank0:Driver|0|root._solve_nonlinear|0|NonlinearBlockGS|7|d1._solve_nonlinear|7</td></tr>\n",
       "    </table>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "system_cases = cr.list_cases('root.d1')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92daf4d8",
   "metadata": {
    "papermill": {
     "duration": 0.004383,
     "end_time": "2026-10-02T14:46:05.050718+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.046335+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "`list_inputs()` and `list_outputs()` will print a report to the screen as well as returning a list of the variables and their values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c0f1771f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.060371Z",
     "iopub.status.busy": "2026-10-02T14:46:05.060160Z",
     "iopub.status.idle": "2026-10-02T14:46:05.065447Z",
     "shell.execute_reply": "2026-10-02T14:46:05.064792Z"
    },
    "papermill": {
     "duration": 0.01119,
     "end_time": "2026-10-02T14:46:05.066182+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.054992+00:00",
     "status": "completed"
    },
    "scrolled": false,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3 Input(s) in 'd1'\n",
      "\n",
      "varname  val                  prom_name\n",
      "-------  -------------------  ---------\n",
      "z        |5.38516481|         z        \n",
      "x        [1.]                 x        \n",
      "y2       [12.27257053]        y2       \n",
      "\n",
      "\n",
      "1 Explicit Output(s) in 'd1'\n",
      "\n",
      "varname  val            prom_name\n",
      "-------  -------------  ---------\n",
      "y1       [25.54548589]  y1       \n",
      "\n",
      "\n",
      "0 Implicit Output(s) in 'd1'\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "case = cr.get_case(system_cases[1])\n",
    "\n",
    "case_inputs = case.list_inputs()\n",
    "case_outputs = case.list_outputs()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "381552da",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.077808Z",
     "iopub.status.busy": "2026-10-02T14:46:05.077586Z",
     "iopub.status.idle": "2026-10-02T14:46:05.081595Z",
     "shell.execute_reply": "2026-10-02T14:46:05.081067Z"
    },
    "papermill": {
     "duration": 0.010222,
     "end_time": "2026-10-02T14:46:05.082174+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.071952+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('d1.x', {'io': 'input', 'prom_name': 'x', 'val': array([1.])}),\n",
      " ('d1.y2', {'io': 'input', 'prom_name': 'y2', 'val': array([12.27257053])}),\n",
      " ('d1.z', {'io': 'input', 'prom_name': 'z', 'val': array([5., 2.])})]\n",
      "[('d1.y1', {'io': 'output', 'prom_name': 'y1', 'val': array([25.54548589])})]\n"
     ]
    }
   ],
   "source": [
    "from pprint import pprint\n",
    "pprint(case_inputs)\n",
    "pprint(case_outputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "8c47a072",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.092790Z",
     "iopub.status.busy": "2026-10-02T14:46:05.092571Z",
     "iopub.status.idle": "2026-10-02T14:46:05.097479Z",
     "shell.execute_reply": "2026-10-02T14:46:05.096928Z"
    },
    "papermill": {
     "duration": 0.010877,
     "end_time": "2026-10-02T14:46:05.098062+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.087185+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.0)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal(case_inputs[0][1]['val'], [1.], tolerance=1e-10) # d1.x\n",
    "assert_near_equal(case_inputs[1][1]['val'], [12.27257053], tolerance=1e-10) # d1.y2\n",
    "assert_near_equal(case_inputs[2][1]['val'], [5., 2.], tolerance=1e-10) # d1.z\n",
    "assert_near_equal(case_outputs[0][1]['val'], [25.545485893882876], tolerance=1e-10) # d1.y1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d9805b7",
   "metadata": {
    "papermill": {
     "duration": 0.00458,
     "end_time": "2026-10-02T14:46:05.107402+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.102822+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "The `list_inputs()` and `list_outputs()` methods have optional arguments that let you filter based on variable names what gets listed. This is shown in the following examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "96292edd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.117931Z",
     "iopub.status.busy": "2026-10-02T14:46:05.117768Z",
     "iopub.status.idle": "2026-10-02T14:46:05.125653Z",
     "shell.execute_reply": "2026-10-02T14:46:05.125095Z"
    },
    "papermill": {
     "duration": 0.012395,
     "end_time": "2026-10-02T14:46:05.126106+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.113711+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/papermill.record/text/html": "<style>pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.output_html .hll { background-color: #ffffcc }\n.output_html { background: #f8f8f8; }\n.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */\n.output_html .err { border: 1px solid #F00 } /* Error */\n.output_html .k { color: #008000; font-weight: bold } /* Keyword */\n.output_html .o { color: #666 } /* Operator */\n.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n.output_html .cp { color: #9C6500 } /* Comment.Preproc */\n.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n.output_html .gd { color: #A00000 } /* Generic.Deleted */\n.output_html .ge { font-style: italic } /* Generic.Emph */\n.output_html .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.output_html .gr { color: #E40000 } /* Generic.Error */\n.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.output_html .gi { color: #008400 } /* Generic.Inserted */\n.output_html .go { color: #717171 } /* Generic.Output */\n.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.output_html .gs { font-weight: bold } /* Generic.Strong */\n.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.output_html .gt { color: #04D } /* Generic.Traceback */\n.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.output_html .kp { color: #008000 } /* Keyword.Pseudo */\n.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.output_html .kt { color: #B00040 } /* Keyword.Type */\n.output_html .m { color: #666 } /* Literal.Number */\n.output_html .s { color: #BA2121 } /* Literal.String */\n.output_html .na { color: #687822 } /* Name.Attribute */\n.output_html .nb { color: #008000 } /* Name.Builtin */\n.output_html .nc { color: #00F; font-weight: bold } /* Name.Class */\n.output_html .no { color: #800 } /* Name.Constant */\n.output_html .nd { color: #A2F } /* Name.Decorator */\n.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */\n.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n.output_html .nf { color: #00F } /* Name.Function */\n.output_html .nl { color: #767600 } /* Name.Label */\n.output_html .nn { color: #00F; font-weight: bold } /* Name.Namespace */\n.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.output_html .nv { color: #19177C } /* Name.Variable */\n.output_html .ow { color: #A2F; font-weight: bold } /* Operator.Word */\n.output_html .w { color: #BBB } /* Text.Whitespace */\n.output_html .mb { color: #666 } /* Literal.Number.Bin */\n.output_html .mf { color: #666 } /* Literal.Number.Float */\n.output_html .mh { color: #666 } /* Literal.Number.Hex */\n.output_html .mi { color: #666 } /* Literal.Number.Integer */\n.output_html .mo { color: #666 } /* Literal.Number.Oct */\n.output_html .sa { color: #BA2121 } /* Literal.String.Affix */\n.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */\n.output_html .sc { color: #BA2121 } /* Literal.String.Char */\n.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n.output_html .sx { color: #008000 } /* Literal.String.Other */\n.output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n.output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n.output_html .ss { color: #19177C } /* Literal.String.Symbol */\n.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.output_html .fm { color: #00F } /* Name.Function.Magic */\n.output_html .vc { color: #19177C } /* Name.Variable.Class */\n.output_html .vg { color: #19177C } /* Name.Variable.Global */\n.output_html .vi { color: #19177C } /* Name.Variable.Instance */\n.output_html .vm { color: #19177C } /* Name.Variable.Magic */\n.output_html .il { color: #666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RectangleComp</span><span class=\"p\">(</span><span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExplicitComponent</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A simple Explicit Component that computes the area of a rectangle.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_input</span><span class=\"p\">(</span><span class=\"s1\">&#39;length&#39;</span><span class=\"p\">,</span> <span class=\"n\">val</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_input</span><span class=\"p\">(</span><span class=\"s1\">&#39;width&#39;</span><span class=\"p\">,</span> <span class=\"n\">val</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_output</span><span class=\"p\">(</span><span class=\"s1\">&#39;area&#39;</span><span class=\"p\">,</span> <span class=\"n\">val</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setup_partials</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">declare_partials</span><span class=\"p\">(</span><span class=\"s1\">&#39;*&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;*&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">compute</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">inputs</span><span class=\"p\">,</span> <span class=\"n\">outputs</span><span class=\"p\">):</span>\n        <span class=\"n\">outputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;area&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;length&#39;</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;width&#39;</span><span class=\"p\">]</span>\n</pre></div>\n",
      "application/papermill.record/text/latex": "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{RectangleComp}\\PY{p}{(}\\PY{n}{om}\\PY{o}{.}\\PY{n}{ExplicitComponent}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{    }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{    A simple Explicit Component that computes the area of a rectangle.}\n\\PY{l+s+sd}{    \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{setup}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}input}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{length}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{val}\\PY{o}{=}\\PY{l+m+mf}{1.}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}input}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{width}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{val}\\PY{o}{=}\\PY{l+m+mf}{1.}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}output}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{area}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{val}\\PY{o}{=}\\PY{l+m+mf}{1.}\\PY{p}{)}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{setup\\PYZus{}partials}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{declare\\PYZus{}partials}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{*}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{*}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{compute}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{,} \\PY{n}{inputs}\\PY{p}{,} \\PY{n}{outputs}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n}{outputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{area}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{n}{inputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{length}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{*} \\PY{n}{inputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{width}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n\\end{Verbatim}\n",
      "application/papermill.record/text/plain": "class RectangleComp(om.ExplicitComponent):\n    \"\"\"\n    A simple Explicit Component that computes the area of a rectangle.\n    \"\"\"\n\n    def setup(self):\n        self.add_input('length', val=1.)\n        self.add_input('width', val=1.)\n        self.add_output('area', val=1.)\n\n    def setup_partials(self):\n        self.declare_partials('*', '*')\n\n    def compute(self, inputs, outputs):\n        outputs['area'] = inputs['length'] * inputs['width']"
     },
     "metadata": {
      "scrapbook": {
       "mime_prefix": "application/papermill.record/",
       "name": "code_src82"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src82\", get_code(\"openmdao.core.tests.test_expl_comp.RectangleComp\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "770f3117",
   "metadata": {
    "papermill": {
     "duration": 0.003842,
     "end_time": "2026-10-02T14:46:05.133235+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.129393+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `RectangleComp` class definition \n",
    "\n",
    "{glue:}`code_src82`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "01b82cad",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.141641Z",
     "iopub.status.busy": "2026-10-02T14:46:05.141479Z",
     "iopub.status.idle": "2026-10-02T14:46:05.473830Z",
     "shell.execute_reply": "2026-10-02T14:46:05.473001Z"
    },
    "papermill": {
     "duration": 0.338229,
     "end_time": "2026-10-02T14:46:05.475273+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.137044+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/problem.py:384: OpenMDAOWarning:The problem name 'case_reader_data' already exists\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.core.tests.test_expl_comp import RectangleComp\n",
    "\n",
    "model = om.Group()\n",
    "prob = om.Problem(model=model, name='case_reader_data')\n",
    "model.add_recorder(om.SqliteRecorder('case_reader_data.sql'))\n",
    "\n",
    "model.add_subsystem('rect', RectangleComp(), promotes=['length', 'width', 'area'])\n",
    "\n",
    "prob.setup(check=False)\n",
    "\n",
    "prob.set_val('length', 100.)\n",
    "prob.set_val('width', 60.0)\n",
    "\n",
    "prob.run_model()\n",
    "\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_data.sql\")\n",
    "case = cr.get_case(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "78cc1ab7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.485717Z",
     "iopub.status.busy": "2026-10-02T14:46:05.485480Z",
     "iopub.status.idle": "2026-10-02T14:46:05.489878Z",
     "shell.execute_reply": "2026-10-02T14:46:05.489335Z"
    },
    "papermill": {
     "duration": 0.010842,
     "end_time": "2026-10-02T14:46:05.490752+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.479910+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Input(s) in 'model'\n",
      "\n",
      "varname   val     prom_name\n",
      "--------  ------  ---------\n",
      "rect\n",
      "  length  [100.]  length   \n",
      "\n",
      "\n",
      "[('rect.length', {'val': array([100.]), 'io': 'input', 'prom_name': 'length'})]\n"
     ]
    }
   ],
   "source": [
    "# Inputs with includes\n",
    "inputs = case.list_inputs(includes=['*length'])\n",
    "print(inputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "bdf132ca",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.500499Z",
     "iopub.status.busy": "2026-10-02T14:46:05.500314Z",
     "iopub.status.idle": "2026-10-02T14:46:05.503671Z",
     "shell.execute_reply": "2026-10-02T14:46:05.503050Z"
    },
    "papermill": {
     "duration": 0.009187,
     "end_time": "2026-10-02T14:46:05.504411+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.495224+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert objs['obj'] == objs['obj_cmp.obj']\n",
    "assert cons['con1'] == cons['con_cmp1.con1']\n",
    "assert dvs['x'] == dvs['_auto_ivc.v0']\n",
    "assert rsps['con2'] == rsps['con_cmp2.con2']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "377006c0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.514385Z",
     "iopub.status.busy": "2026-10-02T14:46:05.514208Z",
     "iopub.status.idle": "2026-10-02T14:46:05.518475Z",
     "shell.execute_reply": "2026-10-02T14:46:05.517647Z"
    },
    "papermill": {
     "duration": 0.009934,
     "end_time": "2026-10-02T14:46:05.519050+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.509116+00:00",
     "status": "completed"
    },
    "scrolled": false,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Input(s) in 'model'\n",
      "\n",
      "varname  val    prom_name\n",
      "-------  -----  ---------\n",
      "rect\n",
      "  width  [60.]  width    \n",
      "\n",
      "\n",
      "[('rect.width', {'val': array([60.]), 'io': 'input', 'prom_name': 'width'})]\n"
     ]
    }
   ],
   "source": [
    "# Inputs with excludes\n",
    "inputs = case.list_inputs(excludes=['*length'])\n",
    "print(inputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "f84bda42",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.528927Z",
     "iopub.status.busy": "2026-10-02T14:46:05.528755Z",
     "iopub.status.idle": "2026-10-02T14:46:05.531277Z",
     "shell.execute_reply": "2026-10-02T14:46:05.530603Z"
    },
    "papermill": {
     "duration": 0.007972,
     "end_time": "2026-10-02T14:46:05.531755+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.523783+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert len(inputs) == 1\n",
    "assert inputs[0][0] == 'rect.width'\n",
    "assert inputs[0][1]['val'] == 60."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "8ec16981",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.541117Z",
     "iopub.status.busy": "2026-10-02T14:46:05.540943Z",
     "iopub.status.idle": "2026-10-02T14:46:05.544062Z",
     "shell.execute_reply": "2026-10-02T14:46:05.543511Z"
    },
    "papermill": {
     "duration": 0.008699,
     "end_time": "2026-10-02T14:46:05.544724+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.536025+00:00",
     "status": "completed"
    },
    "scrolled": false,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Explicit Output(s) in 'model'\n",
      "\n",
      "varname  val      prom_name\n",
      "-------  -------  ---------\n",
      "rect\n",
      "  area   [6000.]  area     \n",
      "\n",
      "\n",
      "0 Implicit Output(s) in 'model'\n",
      "\n",
      "\n",
      "[('rect.area', {'val': array([6000.]), 'io': 'output', 'prom_name': 'area'})]\n"
     ]
    }
   ],
   "source": [
    "# Outputs with includes\n",
    "outputs = case.list_outputs(includes=['*area'])\n",
    "print(outputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "508d9626",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.554139Z",
     "iopub.status.busy": "2026-10-02T14:46:05.553984Z",
     "iopub.status.idle": "2026-10-02T14:46:05.556373Z",
     "shell.execute_reply": "2026-10-02T14:46:05.555859Z"
    },
    "papermill": {
     "duration": 0.00809,
     "end_time": "2026-10-02T14:46:05.557127+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.549037+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert len(outputs) == 1\n",
    "assert outputs[0][0] == 'rect.area'\n",
    "assert outputs[0][1]['val'] == 6000."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ffd87254",
   "metadata": {
    "papermill": {
     "duration": 0.004273,
     "end_time": "2026-10-02T14:46:05.565775+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.561502+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Finally, you can also make use of the variable tagging feature when getting values from cases. This example shows how to do that."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "0c39ef89",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.575639Z",
     "iopub.status.busy": "2026-10-02T14:46:05.575467Z",
     "iopub.status.idle": "2026-10-02T14:46:05.956929Z",
     "shell.execute_reply": "2026-10-02T14:46:05.956160Z"
    },
    "papermill": {
     "duration": 0.387481,
     "end_time": "2026-10-02T14:46:05.957726+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.570245+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/problem.py:384: OpenMDAOWarning:The problem name 'case_reader_data' already exists\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "\n",
    "class RectangleCompWithTags(om.ExplicitComponent):\n",
    "    \"\"\"\n",
    "    A simple Explicit Component that also has input and output with tags.\n",
    "    \"\"\"\n",
    "\n",
    "    def setup(self):\n",
    "        self.add_input('length', val=1., tags=[\"tag1\", \"tag2\"])\n",
    "        self.add_input('width', val=1., tags=[\"tag2\"])\n",
    "        self.add_output('area', val=1., tags=\"tag1\")\n",
    "\n",
    "    def setup_partials(self):\n",
    "        self.declare_partials('*', '*')\n",
    "\n",
    "    def compute(self, inputs, outputs):\n",
    "        outputs['area'] = inputs['length'] * inputs['width']\n",
    "\n",
    "model = om.Group()\n",
    "prob = om.Problem(model=model, name='case_reader_data')\n",
    "model.add_recorder(om.SqliteRecorder('case_reader_data.sql'))\n",
    "\n",
    "model.add_subsystem('rect', RectangleCompWithTags(), promotes=['length', 'width', 'area'])\n",
    "\n",
    "prob.setup(check=False)\n",
    "\n",
    "prob.set_val('length', 100.0)\n",
    "prob.set_val('width', 60.0)\n",
    "\n",
    "prob.run_model()\n",
    "\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_data.sql\")\n",
    "case = cr.get_case(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "55c98e30",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.968168Z",
     "iopub.status.busy": "2026-10-02T14:46:05.967959Z",
     "iopub.status.idle": "2026-10-02T14:46:05.972588Z",
     "shell.execute_reply": "2026-10-02T14:46:05.971891Z"
    },
    "papermill": {
     "duration": 0.010594,
     "end_time": "2026-10-02T14:46:05.973265+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.962671+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Input(s) in 'model'\n",
      "\n",
      "varname   val     prom_name  tags            \n",
      "--------  ------  ---------  ----------------\n",
      "rect\n",
      "  length  [100.]  length     ['tag1', 'tag2']\n",
      "\n",
      "\n",
      "[('rect.length', {'val': array([100.]), 'io': 'input', 'prom_name': 'length'})]\n"
     ]
    }
   ],
   "source": [
    "# Inputs with tag that matches\n",
    "inputs = case.list_inputs(tags=\"tag1\")\n",
    "print(inputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "790f6fb6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:05.983806Z",
     "iopub.status.busy": "2026-10-02T14:46:05.983599Z",
     "iopub.status.idle": "2026-10-02T14:46:05.986991Z",
     "shell.execute_reply": "2026-10-02T14:46:05.986201Z"
    },
    "papermill": {
     "duration": 0.009269,
     "end_time": "2026-10-02T14:46:05.987543+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.978274+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert len(inputs) == 1\n",
    "assert inputs[0][0] == 'rect.length'\n",
    "assert inputs[0][1]['val'] == 100."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "8c6b1c65",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.104315Z",
     "iopub.status.busy": "2026-10-02T14:46:06.104077Z",
     "iopub.status.idle": "2026-10-02T14:46:06.108053Z",
     "shell.execute_reply": "2026-10-02T14:46:06.107445Z"
    },
    "papermill": {
     "duration": 0.117142,
     "end_time": "2026-10-02T14:46:06.109049+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:05.991907+00:00",
     "status": "completed"
    },
    "scrolled": false,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 Input(s) in 'model'\n",
      "\n",
      "varname   val     prom_name  tags            \n",
      "--------  ------  ---------  ----------------\n",
      "rect\n",
      "  length  [100.]  length     ['tag1', 'tag2']\n",
      "  width   [60.]   width      ['tag2']        \n",
      "\n",
      "\n",
      "[('rect.length', {'val': array([100.]), 'io': 'input', 'prom_name': 'length'}), ('rect.width', {'val': array([60.]), 'io': 'input', 'prom_name': 'width'})]\n"
     ]
    }
   ],
   "source": [
    "# Inputs with multiple tags\n",
    "inputs = case.list_inputs(tags=[\"tag1\", \"tag2\"])\n",
    "print(inputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "709c77b2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.120662Z",
     "iopub.status.busy": "2026-10-02T14:46:06.120453Z",
     "iopub.status.idle": "2026-10-02T14:46:06.123388Z",
     "shell.execute_reply": "2026-10-02T14:46:06.122792Z"
    },
    "papermill": {
     "duration": 0.009338,
     "end_time": "2026-10-02T14:46:06.124181+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.114843+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert len(inputs) == 2\n",
    "assert inputs[0][0] == 'rect.length'\n",
    "assert inputs[0][1]['val'] == 100.\n",
    "assert inputs[1][0] == 'rect.width'\n",
    "assert inputs[1][1]['val'] == 60."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "a6db80b6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.159082Z",
     "iopub.status.busy": "2026-10-02T14:46:06.158865Z",
     "iopub.status.idle": "2026-10-02T14:46:06.162386Z",
     "shell.execute_reply": "2026-10-02T14:46:06.161730Z"
    },
    "papermill": {
     "duration": 0.009899,
     "end_time": "2026-10-02T14:46:06.163113+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.153214+00:00",
     "status": "completed"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Explicit Output(s) in 'model'\n",
      "\n",
      "varname  val      prom_name\n",
      "-------  -------  ---------\n",
      "rect\n",
      "  area   [6000.]  area     \n",
      "\n",
      "\n",
      "0 Implicit Output(s) in 'model'\n",
      "\n",
      "\n",
      "[('rect.area', {'val': array([6000.]), 'io': 'output', 'prom_name': 'area'})]\n"
     ]
    }
   ],
   "source": [
    "# Outputs with tag that does match\n",
    "outputs = case.list_outputs(tags=\"tag1\")\n",
    "print(outputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "f6d7a7b8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.190337Z",
     "iopub.status.busy": "2026-10-02T14:46:06.190121Z",
     "iopub.status.idle": "2026-10-02T14:46:06.192878Z",
     "shell.execute_reply": "2026-10-02T14:46:06.192262Z"
    },
    "papermill": {
     "duration": 0.025652,
     "end_time": "2026-10-02T14:46:06.193483+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.167831+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert len(outputs) == 1\n",
    "assert outputs[0][0] == 'rect.area'\n",
    "assert outputs[0][1]['val'] == 6000."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f4bed9c",
   "metadata": {
    "papermill": {
     "duration": 0.005076,
     "end_time": "2026-10-02T14:46:06.203136+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.198060+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Getting Variable Data from Case By Specifying Variable Name and Units Desired\n",
    "\n",
    "You can also get variable values from a `Case` like you would from a `Problem` using dictionary-like access\n",
    "or, if you want the value in different units, using the `get_val` method.\n",
    "\n",
    "\n",
    "```{eval-rst}\n",
    ".. automethod:: openmdao.recorders.case.Case.get_val\n",
    "    :noindex:\n",
    "```\n",
    "\n",
    "This example shows both methods of getting variable data by name."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "fc879257",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.215106Z",
     "iopub.status.busy": "2026-10-02T14:46:06.214806Z",
     "iopub.status.idle": "2026-10-02T14:46:06.555982Z",
     "shell.execute_reply": "2026-10-02T14:46:06.555313Z"
    },
    "papermill": {
     "duration": 0.352546,
     "end_time": "2026-10-02T14:46:06.562024+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.209478+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/problem.py:384: OpenMDAOWarning:The problem name 'case_reader_data' already exists\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "\n",
    "model = om.Group()\n",
    "model.add_recorder(om.SqliteRecorder('case_reader_data.sql'))\n",
    "\n",
    "speed = om.ExecComp('v=x/t', x={'units': 'm'}, t={'units': 's'}, v={'units': 'm/s'})\n",
    "\n",
    "model.add_subsystem('speed', speed, promotes=['x', 't', 'v'])\n",
    "\n",
    "prob = om.Problem(model=model, name='case_reader_data')\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('x', 100., units='m')\n",
    "prob.set_val('t', 60., units='s')\n",
    "\n",
    "prob.run_model()\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / 'case_reader_data.sql')\n",
    "case = cr.get_case(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "132d5f4c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.574938Z",
     "iopub.status.busy": "2026-10-02T14:46:06.574719Z",
     "iopub.status.idle": "2026-10-02T14:46:06.579009Z",
     "shell.execute_reply": "2026-10-02T14:46:06.578192Z"
    },
    "papermill": {
     "duration": 0.010695,
     "end_time": "2026-10-02T14:46:06.579506+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.568811+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[100.]\n"
     ]
    }
   ],
   "source": [
    "print(case['x'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "eea55a5d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.678089Z",
     "iopub.status.busy": "2026-10-02T14:46:06.676966Z",
     "iopub.status.idle": "2026-10-02T14:46:06.681312Z",
     "shell.execute_reply": "2026-10-02T14:46:06.680441Z"
    },
    "papermill": {
     "duration": 0.097349,
     "end_time": "2026-10-02T14:46:06.681813+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.584464+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert case['x'] == 100."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "784db754",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.701812Z",
     "iopub.status.busy": "2026-10-02T14:46:06.701450Z",
     "iopub.status.idle": "2026-10-02T14:46:06.706048Z",
     "shell.execute_reply": "2026-10-02T14:46:06.705276Z"
    },
    "papermill": {
     "duration": 0.019041,
     "end_time": "2026-10-02T14:46:06.706469+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.687428+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[328.0839895]\n"
     ]
    }
   ],
   "source": [
    "print(case.get_val('x', units='ft'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "63f602e6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.716923Z",
     "iopub.status.busy": "2026-10-02T14:46:06.716762Z",
     "iopub.status.idle": "2026-10-02T14:46:06.721010Z",
     "shell.execute_reply": "2026-10-02T14:46:06.720166Z"
    },
    "papermill": {
     "duration": 0.010061,
     "end_time": "2026-10-02T14:46:06.721485+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.711424+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(4.000024546273919e-12)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal(case.get_val('x', units='ft'), 328.0839895, 1e-8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "f0f70343",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.734277Z",
     "iopub.status.busy": "2026-10-02T14:46:06.734112Z",
     "iopub.status.idle": "2026-10-02T14:46:06.738362Z",
     "shell.execute_reply": "2026-10-02T14:46:06.737474Z"
    },
    "papermill": {
     "duration": 0.010088,
     "end_time": "2026-10-02T14:46:06.738849+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.728761+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.66666667]\n"
     ]
    }
   ],
   "source": [
    "print(case['v'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "eb907582",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.749148Z",
     "iopub.status.busy": "2026-10-02T14:46:06.749017Z",
     "iopub.status.idle": "2026-10-02T14:46:06.752571Z",
     "shell.execute_reply": "2026-10-02T14:46:06.752057Z"
    },
    "papermill": {
     "duration": 0.009038,
     "end_time": "2026-10-02T14:46:06.752875+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.743837+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1.9999998950272165e-09)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal(case['v'], 1.66666667, 1e-8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "5421b4ee",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.761658Z",
     "iopub.status.busy": "2026-10-02T14:46:06.761496Z",
     "iopub.status.idle": "2026-10-02T14:46:06.764177Z",
     "shell.execute_reply": "2026-10-02T14:46:06.763729Z"
    },
    "papermill": {
     "duration": 0.008859,
     "end_time": "2026-10-02T14:46:06.765251+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.756392+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5.46806649]\n"
     ]
    }
   ],
   "source": [
    "print(case.get_val('v', units='ft/s'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "afdc07d7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.775956Z",
     "iopub.status.busy": "2026-10-02T14:46:06.775791Z",
     "iopub.status.idle": "2026-10-02T14:46:06.780548Z",
     "shell.execute_reply": "2026-10-02T14:46:06.779787Z"
    },
    "papermill": {
     "duration": 0.011149,
     "end_time": "2026-10-02T14:46:06.781018+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.769869+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(3.087998657734684e-10)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal(case.get_val('v', units='ft/s'),5.46806649, 1e-8)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "949b3518",
   "metadata": {
    "papermill": {
     "duration": 0.004998,
     "end_time": "2026-10-02T14:46:06.791339+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.786341+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Getting Derivative Data from a Case\n",
    "\n",
    "A driver has the ability to record derivatives but it is not enabled by default. If you do enable\n",
    "this option, the recorded cases will have a value for the `jacobian`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "a9289bd5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.802018Z",
     "iopub.status.busy": "2026-10-02T14:46:06.801844Z",
     "iopub.status.idle": "2026-10-02T14:46:06.813770Z",
     "shell.execute_reply": "2026-10-02T14:46:06.812975Z"
    },
    "papermill": {
     "duration": 0.017915,
     "end_time": "2026-10-02T14:46:06.814266+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.796351+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/papermill.record/text/html": "<style>pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.output_html .hll { background-color: #ffffcc }\n.output_html { background: #f8f8f8; }\n.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */\n.output_html .err { border: 1px solid #F00 } /* Error */\n.output_html .k { color: #008000; font-weight: bold } /* Keyword */\n.output_html .o { color: #666 } /* Operator */\n.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n.output_html .cp { color: #9C6500 } /* Comment.Preproc */\n.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n.output_html .gd { color: #A00000 } /* Generic.Deleted */\n.output_html .ge { font-style: italic } /* Generic.Emph */\n.output_html .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.output_html .gr { color: #E40000 } /* Generic.Error */\n.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.output_html .gi { color: #008400 } /* Generic.Inserted */\n.output_html .go { color: #717171 } /* Generic.Output */\n.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.output_html .gs { font-weight: bold } /* Generic.Strong */\n.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.output_html .gt { color: #04D } /* Generic.Traceback */\n.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.output_html .kp { color: #008000 } /* Keyword.Pseudo */\n.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.output_html .kt { color: #B00040 } /* Keyword.Type */\n.output_html .m { color: #666 } /* Literal.Number */\n.output_html .s { color: #BA2121 } /* Literal.String */\n.output_html .na { color: #687822 } /* Name.Attribute */\n.output_html .nb { color: #008000 } /* Name.Builtin */\n.output_html .nc { color: #00F; font-weight: bold } /* Name.Class */\n.output_html .no { color: #800 } /* Name.Constant */\n.output_html .nd { color: #A2F } /* Name.Decorator */\n.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */\n.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n.output_html .nf { color: #00F } /* Name.Function */\n.output_html .nl { color: #767600 } /* Name.Label */\n.output_html .nn { color: #00F; font-weight: bold } /* Name.Namespace */\n.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.output_html .nv { color: #19177C } /* Name.Variable */\n.output_html .ow { color: #A2F; font-weight: bold } /* Operator.Word */\n.output_html .w { color: #BBB } /* Text.Whitespace */\n.output_html .mb { color: #666 } /* Literal.Number.Bin */\n.output_html .mf { color: #666 } /* Literal.Number.Float */\n.output_html .mh { color: #666 } /* Literal.Number.Hex */\n.output_html .mi { color: #666 } /* Literal.Number.Integer */\n.output_html .mo { color: #666 } /* Literal.Number.Oct */\n.output_html .sa { color: #BA2121 } /* Literal.String.Affix */\n.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */\n.output_html .sc { color: #BA2121 } /* Literal.String.Char */\n.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n.output_html .sx { color: #008000 } /* Literal.String.Other */\n.output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n.output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n.output_html .ss { color: #19177C } /* Literal.String.Symbol */\n.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.output_html .fm { color: #00F } /* Name.Function.Magic */\n.output_html .vc { color: #19177C } /* Name.Variable.Class */\n.output_html .vg { color: #19177C } /* Name.Variable.Global */\n.output_html .vi { color: #19177C } /* Name.Variable.Instance */\n.output_html .vm { color: #19177C } /* Name.Variable.Magic */\n.output_html .il { color: #666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SellarMDA</span><span class=\"p\">(</span><span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">Group</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Group containing the Sellar MDA.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">cycle</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;cycle&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">Group</span><span class=\"p\">(),</span> <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;*&#39;</span><span class=\"p\">])</span>\n        <span class=\"n\">cycle</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;d1&#39;</span><span class=\"p\">,</span> <span class=\"n\">SellarDis1</span><span class=\"p\">(),</span> <span class=\"n\">promotes_inputs</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">],</span>\n                            <span class=\"n\">promotes_outputs</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">])</span>\n        <span class=\"n\">cycle</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;d2&#39;</span><span class=\"p\">,</span> <span class=\"n\">SellarDis2</span><span class=\"p\">(),</span> <span class=\"n\">promotes_inputs</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">],</span>\n                            <span class=\"n\">promotes_outputs</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">])</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">set_input_defaults</span><span class=\"p\">(</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"mf\">1.0</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">set_input_defaults</span><span class=\"p\">(</span><span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"mf\">5.0</span><span class=\"p\">,</span> <span class=\"mf\">2.0</span><span class=\"p\">]))</span>\n\n        <span class=\"c1\"># Nonlinear Block Gauss Seidel is a gradient free solver</span>\n        <span class=\"n\">cycle</span><span class=\"o\">.</span><span class=\"n\">nonlinear_solver</span> <span class=\"o\">=</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">NonlinearBlockGS</span><span class=\"p\">()</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;obj_cmp&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;obj = x**2 + z[1] + y1 + exp(-y2)&#39;</span><span class=\"p\">,</span>\n                                                  <span class=\"n\">z</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"mf\">0.0</span><span class=\"p\">]),</span> <span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">),</span>\n                           <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;x&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;z&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;obj&#39;</span><span class=\"p\">])</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;con_cmp1&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;con1 = 3.16 - y1&#39;</span><span class=\"p\">),</span> <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;con1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y1&#39;</span><span class=\"p\">])</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;con_cmp2&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;con2 = y2 - 24.0&#39;</span><span class=\"p\">),</span> <span class=\"n\">promotes</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;con2&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y2&#39;</span><span class=\"p\">])</span>\n</pre></div>\n",
      "application/papermill.record/text/latex": "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{SellarMDA}\\PY{p}{(}\\PY{n}{om}\\PY{o}{.}\\PY{n}{Group}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{    }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{    Group containing the Sellar MDA.}\n\\PY{l+s+sd}{    \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{setup}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n}{cycle} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{cycle}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{Group}\\PY{p}{(}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{*}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n        \\PY{n}{cycle}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{d1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{SellarDis1}\\PY{p}{(}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes\\PYZus{}inputs}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{,}\n                            \\PY{n}{promotes\\PYZus{}outputs}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n        \\PY{n}{cycle}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{d2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{SellarDis2}\\PY{p}{(}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes\\PYZus{}inputs}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{,}\n                            \\PY{n}{promotes\\PYZus{}outputs}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{set\\PYZus{}input\\PYZus{}defaults}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+m+mf}{1.0}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{set\\PYZus{}input\\PYZus{}defaults}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{np}\\PY{o}{.}\\PY{n}{array}\\PY{p}{(}\\PY{p}{[}\\PY{l+m+mf}{5.0}\\PY{p}{,} \\PY{l+m+mf}{2.0}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\n\n        \\PY{c+c1}{\\PYZsh{} Nonlinear Block Gauss Seidel is a gradient free solver}\n        \\PY{n}{cycle}\\PY{o}{.}\\PY{n}{nonlinear\\PYZus{}solver} \\PY{o}{=} \\PY{n}{om}\\PY{o}{.}\\PY{n}{NonlinearBlockGS}\\PY{p}{(}\\PY{p}{)}\n\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj\\PYZus{}cmp}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{ExecComp}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj = x**2 + z[1] + y1 + exp(\\PYZhy{}y2)}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,}\n                                                  \\PY{n}{z}\\PY{o}{=}\\PY{n}{np}\\PY{o}{.}\\PY{n}{array}\\PY{p}{(}\\PY{p}{[}\\PY{l+m+mf}{0.0}\\PY{p}{,} \\PY{l+m+mf}{0.0}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,} \\PY{n}{x}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\\PY{p}{,}\n                           \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{z}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{obj}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con\\PYZus{}cmp1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{ExecComp}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con1 = 3.16 \\PYZhy{} y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}subsystem}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con\\PYZus{}cmp2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{om}\\PY{o}{.}\\PY{n}{ExecComp}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con2 = y2 \\PYZhy{} 24.0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\\PY{p}{,} \\PY{n}{promotes}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{con2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{y2}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\\end{Verbatim}\n",
      "application/papermill.record/text/plain": "class SellarMDA(om.Group):\n    \"\"\"\n    Group containing the Sellar MDA.\n    \"\"\"\n\n    def setup(self):\n        cycle = self.add_subsystem('cycle', om.Group(), promotes=['*'])\n        cycle.add_subsystem('d1', SellarDis1(), promotes_inputs=['x', 'z', 'y2'],\n                            promotes_outputs=['y1'])\n        cycle.add_subsystem('d2', SellarDis2(), promotes_inputs=['z', 'y1'],\n                            promotes_outputs=['y2'])\n\n        self.set_input_defaults('x', 1.0)\n        self.set_input_defaults('z', np.array([5.0, 2.0]))\n\n        # Nonlinear Block Gauss Seidel is a gradient free solver\n        cycle.nonlinear_solver = om.NonlinearBlockGS()\n\n        self.add_subsystem('obj_cmp', om.ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)',\n                                                  z=np.array([0.0, 0.0]), x=0.0),\n                           promotes=['x', 'z', 'y1', 'y2', 'obj'])\n\n        self.add_subsystem('con_cmp1', om.ExecComp('con1 = 3.16 - y1'), promotes=['con1', 'y1'])\n        self.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0'), promotes=['con2', 'y2'])"
     },
     "metadata": {
      "scrapbook": {
       "mime_prefix": "application/papermill.record/",
       "name": "code_src83"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src83\", get_code(\"openmdao.test_suite.components.sellar_feature.SellarMDA\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3180a4a0",
   "metadata": {
    "papermill": {
     "duration": 0.005161,
     "end_time": "2026-10-02T14:46:06.824962+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.819801+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `SellarMDA` class definition \n",
    "\n",
    "{glue:}`code_src83`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "b0e989eb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:06.836003Z",
     "iopub.status.busy": "2026-10-02T14:46:06.835640Z",
     "iopub.status.idle": "2026-10-02T14:46:07.567799Z",
     "shell.execute_reply": "2026-10-02T14:46:07.567222Z"
    },
    "papermill": {
     "duration": 0.739376,
     "end_time": "2026-10-02T14:46:07.569259+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:06.829883+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/problem.py:384: OpenMDAOWarning:The problem name 'case_reader_data' already exists\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.sellar_feature import SellarMDA\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "prob = om.Problem(name='case_reader_data', model=SellarMDA())\n",
    "\n",
    "model = prob.model\n",
    "model.add_design_var('z', lower=np.array([-10.0, 0.0]),\n",
    "                          upper=np.array([10.0, 10.0]))\n",
    "model.add_design_var('x', lower=0.0, upper=10.0)\n",
    "model.add_objective('obj')\n",
    "model.add_constraint('con1', upper=0.0)\n",
    "model.add_constraint('con2', upper=0.0)\n",
    "\n",
    "driver = prob.driver = om.ScipyOptimizeDriver(optimizer='SLSQP', tol=1e-9, disp=False)\n",
    "driver.recording_options['record_derivatives'] = True\n",
    "\n",
    "driver.add_recorder(om.SqliteRecorder('case_reader_data.sql'))\n",
    "\n",
    "prob.setup()\n",
    "prob.set_solver_print(0)\n",
    "prob.run_driver()\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / 'case_reader_data.sql')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "3a4ca195",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.583340Z",
     "iopub.status.busy": "2026-10-02T14:46:07.583145Z",
     "iopub.status.idle": "2026-10-02T14:46:07.589339Z",
     "shell.execute_reply": "2026-10-02T14:46:07.588565Z"
    },
    "papermill": {
     "duration": 0.012909,
     "end_time": "2026-10-02T14:46:07.589806+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.576897+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{('obj', 'z'): array([[3.90585351, 1.97002055]]),\n",
       " ('obj', 'x'): array([[0.99341446]]),\n",
       " ('con1', 'z'): array([[-3.95527322, -0.99999445]]),\n",
       " ('con1', 'x'): array([[-0.99999445]]),\n",
       " ('con2', 'z'): array([[2.1124997 , 1.28126727]]),\n",
       " ('con2', 'x'): array([[0.28126883]])}"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Get derivatives associated with the last iteration.\n",
    "derivs = cr.get_case(-1).derivatives\n",
    "derivs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "9698d3aa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.600731Z",
     "iopub.status.busy": "2026-10-02T14:46:07.600545Z",
     "iopub.status.idle": "2026-10-02T14:46:07.604583Z",
     "shell.execute_reply": "2026-10-02T14:46:07.603832Z"
    },
    "papermill": {
     "duration": 0.010187,
     "end_time": "2026-10-02T14:46:07.605057+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.594870+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[3.90585351 1.97002055]]\n"
     ]
    }
   ],
   "source": [
    "# Get specific derivative.\n",
    "print(derivs['obj', 'z'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "a20d5fc8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.616139Z",
     "iopub.status.busy": "2026-10-02T14:46:07.615971Z",
     "iopub.status.idle": "2026-10-02T14:46:07.621143Z",
     "shell.execute_reply": "2026-10-02T14:46:07.620350Z"
    },
    "papermill": {
     "duration": 0.011343,
     "end_time": "2026-10-02T14:46:07.621608+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.610265+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.0)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check that derivatives have been recorded.\n",
    "assert set(derivs.keys()) == set([\n",
    "    ('obj', 'z'), ('con2', 'z'), ('con1', 'x'),\n",
    "    ('obj', 'x'), ('con2', 'x'), ('con1', 'z')\n",
    "])\n",
    "\n",
    "# check specific derivative.\n",
    "assert_near_equal(derivs['obj', 'z'], derivs['obj', 'z'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0eb16cb4",
   "metadata": {
    "papermill": {
     "duration": 0.005086,
     "end_time": "2026-10-02T14:46:07.640990+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.635904+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Problem recording can also include recording of the derivatives as this example shows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "a713128f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.799891Z",
     "iopub.status.busy": "2026-10-02T14:46:07.798909Z",
     "iopub.status.idle": "2026-10-02T14:46:07.894478Z",
     "shell.execute_reply": "2026-10-02T14:46:07.893366Z"
    },
    "papermill": {
     "duration": 0.103421,
     "end_time": "2026-10-02T14:46:07.895076+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.791655+00:00",
     "status": "completed"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/problem.py:384: OpenMDAOWarning:The problem name 'case_reader_data' already exists\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.eggcrate import EggCrate\n",
    "\n",
    "prob = om.Problem(name='case_reader_data')\n",
    "\n",
    "model = prob.model\n",
    "model.add_subsystem('egg_crate', EggCrate(), promotes=['x', 'y', 'f_xy'])\n",
    "model.add_design_var('x', lower=-50.0, upper=50.0)\n",
    "model.add_design_var('y', lower=-50.0, upper=50.0)\n",
    "model.add_objective('f_xy')\n",
    "\n",
    "prob.driver = om.ScipyOptimizeDriver(disp=False, tol=1e-9)\n",
    "\n",
    "prob.recording_options['record_derivatives'] = True\n",
    "prob.add_recorder(om.SqliteRecorder('case_reader_data.sql'))\n",
    "\n",
    "prob.setup()\n",
    "prob.set_solver_print(0)\n",
    "\n",
    "prob.set_val('x', 2.5)\n",
    "prob.set_val('y', 2.5)\n",
    "\n",
    "prob.run_driver()\n",
    "\n",
    "case_name_1 = \"c1\"\n",
    "prob.record(case_name_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "4357fe79",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.908389Z",
     "iopub.status.busy": "2026-10-02T14:46:07.908201Z",
     "iopub.status.idle": "2026-10-02T14:46:07.913508Z",
     "shell.execute_reply": "2026-10-02T14:46:07.912736Z"
    },
    "papermill": {
     "duration": 0.012421,
     "end_time": "2026-10-02T14:46:07.914082+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.901661+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(2.3567185249572234e-10)"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal([prob.get_val('x'), prob.get_val('y'), prob.get_val('f_xy')],\n",
    "                  [[3.01960159], [3.01960159], [18.97639468]], 1e-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "26ccfbc0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.925517Z",
     "iopub.status.busy": "2026-10-02T14:46:07.925345Z",
     "iopub.status.idle": "2026-10-02T14:46:08.162314Z",
     "shell.execute_reply": "2026-10-02T14:46:08.161774Z"
    },
    "papermill": {
     "duration": 0.244289,
     "end_time": "2026-10-02T14:46:08.163756+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.919467+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "prob.set_val('x', 0.1)\n",
    "prob.set_val('y', -0.1)\n",
    "\n",
    "prob.run_driver()\n",
    "\n",
    "case_name_2 = \"c2\"\n",
    "prob.record(case_name_2)\n",
    "\n",
    "prob.cleanup()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "0f6496ab",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:08.176373Z",
     "iopub.status.busy": "2026-10-02T14:46:08.176172Z",
     "iopub.status.idle": "2026-10-02T14:46:08.181274Z",
     "shell.execute_reply": "2026-10-02T14:46:08.180503Z"
    },
    "papermill": {
     "duration": 0.011816,
     "end_time": "2026-10-02T14:46:08.181777+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:08.169961+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(9.77967628986754e-08)"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal([prob.get_val('x'), prob.get_val('y'), prob.get_val('f_xy')],\n",
    "                  [[-2.14311975e-08], [2.14312031e-08], [2.388341e-14]], 1e-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "ef81dd20",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:08.221905Z",
     "iopub.status.busy": "2026-10-02T14:46:08.221719Z",
     "iopub.status.idle": "2026-10-02T14:46:08.230850Z",
     "shell.execute_reply": "2026-10-02T14:46:08.230063Z"
    },
    "papermill": {
     "duration": 0.015712,
     "end_time": "2026-10-02T14:46:08.231278+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:08.215566+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{('f_xy', 'x'): array([[-1.50431553e-05]]), ('f_xy', 'y'): array([[-1.50431553e-05]])}\n",
      "{('f_xy', 'x'): array([[-1.11442238e-06]]), ('f_xy', 'y'): array([[1.11442245e-06]])}\n"
     ]
    }
   ],
   "source": [
    "cr = om.CaseReader(prob.get_outputs_dir() / 'case_reader_data.sql')\n",
    "\n",
    "c1 = cr.get_case(case_name_1)\n",
    "c2 = cr.get_case(case_name_2)\n",
    "\n",
    "print(c1.derivatives)\n",
    "print(c2.derivatives)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "edb64b8b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:08.242823Z",
     "iopub.status.busy": "2026-10-02T14:46:08.242525Z",
     "iopub.status.idle": "2026-10-02T14:46:08.249567Z",
     "shell.execute_reply": "2026-10-02T14:46:08.248860Z"
    },
    "papermill": {
     "duration": 0.013433,
     "end_time": "2026-10-02T14:46:08.250061+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:08.236628+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<!DOCTYPE html>\n",
       "<html lang=\"en\">\n",
       "<head>\n",
       "    <style>\n",
       "        h2 {\n",
       "            text-align: center;\n",
       "        }\n",
       "    </style>\n",
       "</head>\n",
       "<body>\n",
       "    <h2></h2>\n",
       "        <table style=\"border: 1px solid #999; border-collapse: collapse;\">\n",
       "        <tr><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">problem</th></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">c1</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">c2</td></tr>\n",
       "    </table>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "np.float64(1.1144224509662202e-06)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_problem_cases = len(cr.list_cases('problem'))\n",
    "assert num_problem_cases == 2\n",
    "\n",
    "# check that derivatives have been recorded properly.\n",
    "assert_near_equal(c1.derivatives[('f_xy', 'x')][0], 0.0, 1e-4)\n",
    "assert_near_equal(c1.derivatives[('f_xy', 'y')][0], 0.0, 1e-4)\n",
    "\n",
    "assert_near_equal(c2.derivatives[('f_xy', 'x')][0], 0.0, 1e-4)\n",
    "assert_near_equal(c2.derivatives[('f_xy', 'y')][0], 0.0, 1e-4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3304389c",
   "metadata": {
    "papermill": {
     "duration": 0.005271,
     "end_time": "2026-10-02T14:46:08.260934+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:08.255663+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "```{note}\n",
    "For both `Driver` and `Problem`, the recording of the derivatives is not affected by\n",
    "the `includes` and `excludes` options.\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "dev311",
   "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.13.14"
  },
  "orphan": true,
  "papermill": {
   "default_parameters": {},
   "duration": 9.987506,
   "end_time": "2026-10-02T14:46:09.385913+00:00",
   "environment_variables": {},
   "exception": null,
   "input_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/openmdao_book/features/recording/case_reader_data.ipynb",
   "output_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/_executed_book/features/recording/case_reader_data.ipynb",
   "parameters": {},
   "start_time": "2026-10-02T14:45:59.398407+00:00",
   "version": "2.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}