{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3e4eca87",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.053114Z",
     "iopub.status.busy": "2026-10-02T14:46:07.052856Z",
     "iopub.status.idle": "2026-10-02T14:46:07.057746Z",
     "shell.execute_reply": "2026-10-02T14:46:07.057237Z"
    },
    "papermill": {
     "duration": 0.008627,
     "end_time": "2026-10-02T14:46:07.058310+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.049683+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": null,
   "id": "41ac5cc5",
   "metadata": {
    "papermill": {
     "duration": 0.002351,
     "end_time": "2026-10-02T14:46:07.071416+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.069065+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "109bd62c",
   "metadata": {
    "papermill": {
     "duration": 0.0023,
     "end_time": "2026-10-02T14:46:07.075583+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.073283+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# Accessing Recorded Metadata\n",
    "\n",
    "In addition to the cases themselves, a `CaseReader` may also record\n",
    "certain metadata about the model and its constituent systems and solvers."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28211656",
   "metadata": {
    "papermill": {
     "duration": 0.002178,
     "end_time": "2026-10-02T14:46:07.079733+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.077555+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Problem Metadata\n",
    "\n",
    "By default, a case recorder will save metadata about the model to assist in later visualization\n",
    "and debugging.  This information is made available via the `problem_metadata` attribute of\n",
    "a `CaseReader`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "57459d74",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:07.085763Z",
     "iopub.status.busy": "2026-10-02T14:46:07.085556Z",
     "iopub.status.idle": "2026-10-02T14:46:09.960113Z",
     "shell.execute_reply": "2026-10-02T14:46:09.959470Z"
    },
    "papermill": {
     "duration": 2.878393,
     "end_time": "2026-10-02T14:46:09.960635+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:07.082242+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_src84"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src84\", get_code(\"openmdao.test_suite.components.sellar_feature.SellarDerivatives\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e5e6640",
   "metadata": {
    "papermill": {
     "duration": 0.002101,
     "end_time": "2026-10-02T14:46:09.965389+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:09.963288+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `SellarDerivatives` class definition \n",
    "\n",
    "{glue:}`code_src84`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "341416e9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:09.970217Z",
     "iopub.status.busy": "2026-10-02T14:46:09.970009Z",
     "iopub.status.idle": "2026-10-02T14:46:12.706345Z",
     "shell.execute_reply": "2026-10-02T14:46:12.705777Z"
    },
    "papermill": {
     "duration": 2.739862,
     "end_time": "2026-10-02T14:46:12.707157+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:09.967295+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1790952371.231366] [runnervm8df0l:10436:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55d0d7efe1b0 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",
      "[1790952371.231609] [runnervm8df0l:10436: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:10436] pml_ucx.c:313  Error: Failed to create UCP worker\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NL: NLBGS Converged in 8 iterations\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.sellar_feature import SellarDerivatives\n",
    "\n",
    "prob = om.Problem(name='case_reader_metadata', model=SellarDerivatives())\n",
    "\n",
    "prob.model.nonlinear_solver = om.NonlinearBlockGS()\n",
    "prob.model.linear_solver = om.ScipyKrylov()\n",
    "\n",
    "recorder = om.SqliteRecorder(\"case_reader_metadata.sql\")\n",
    "prob.driver.add_recorder(recorder)\n",
    "\n",
    "prob.setup()\n",
    "prob.run_driver()\n",
    "prob.cleanup()\n",
    "\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_metadata.sql\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a8694a87",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:12.712845Z",
     "iopub.status.busy": "2026-10-02T14:46:12.712640Z",
     "iopub.status.idle": "2026-10-02T14:46:12.715883Z",
     "shell.execute_reply": "2026-10-02T14:46:12.715471Z"
    },
    "papermill": {
     "duration": 0.006665,
     "end_time": "2026-10-02T14:46:12.716319+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.709654+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'src': '_auto_ivc.v0', 'tgt': 'd1.x'},\n",
       " {'src': '_auto_ivc.v0', 'tgt': 'obj_cmp.x'},\n",
       " {'src': '_auto_ivc.v1', 'tgt': 'd1.z'},\n",
       " {'src': '_auto_ivc.v1', 'tgt': 'd2.z'},\n",
       " {'src': '_auto_ivc.v1', 'tgt': 'obj_cmp.z'},\n",
       " {'src': 'd1.y1', 'tgt': 'con_cmp1.y1'},\n",
       " {'src': 'd1.y1', 'tgt': 'd2.y1'},\n",
       " {'src': 'd1.y1', 'tgt': 'obj_cmp.y1'},\n",
       " {'src': 'd2.y2', 'tgt': 'con_cmp2.y2'},\n",
       " {'src': 'd2.y2', 'tgt': 'd1.y2'},\n",
       " {'src': 'd2.y2', 'tgt': 'obj_cmp.y2'}]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# access list of connections stored in metadata\n",
    "cr.problem_metadata['connections_list']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5f3236bd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:12.725620Z",
     "iopub.status.busy": "2026-10-02T14:46:12.725375Z",
     "iopub.status.idle": "2026-10-02T14:46:12.728848Z",
     "shell.execute_reply": "2026-10-02T14:46:12.728443Z"
    },
    "papermill": {
     "duration": 0.010896,
     "end_time": "2026-10-02T14:46:12.729314+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.718418+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "expected = [\n",
    "    {'src': '_auto_ivc.v0', 'tgt': 'd1.x'},\n",
    "    {'src': '_auto_ivc.v0', 'tgt': 'obj_cmp.x'},\n",
    "    {'src': '_auto_ivc.v1', 'tgt': 'd1.z'},\n",
    "    {'src': '_auto_ivc.v1', 'tgt': 'd2.z'},\n",
    "    {'src': '_auto_ivc.v1', 'tgt': 'obj_cmp.z'},\n",
    "    {'src': 'd1.y1', 'tgt': 'con_cmp1.y1'},\n",
    "    {'src': 'd1.y1', 'tgt': 'd2.y1', 'cycle_arrows': [[0, 1]]},\n",
    "    {'src': 'd1.y1', 'tgt': 'obj_cmp.y1'},\n",
    "    {'src': 'd2.y2', 'tgt': 'con_cmp2.y2'},\n",
    "    {'src': 'd2.y2', 'tgt': 'd1.y2', 'cycle_arrows': [[1, 0]]},\n",
    "    {'src': 'd2.y2', 'tgt': 'obj_cmp.y2'}\n",
    "]\n",
    "\n",
    "connections = sorted(cr.problem_metadata['connections_list'], key=lambda x: (x['src'], x['tgt']))\n",
    "for i, meta in enumerate(connections):\n",
    "    for key in meta:\n",
    "        if key != 'cycle_arrows':\n",
    "            assert meta[key] == expected[i][key]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ae3924e2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:12.734303Z",
     "iopub.status.busy": "2026-10-02T14:46:12.734073Z",
     "iopub.status.idle": "2026-10-02T14:46:12.740658Z",
     "shell.execute_reply": "2026-10-02T14:46:12.740246Z"
    },
    "papermill": {
     "duration": 0.009691,
     "end_time": "2026-10-02T14:46:12.741123+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.731432+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'name': 'root',\n",
       " 'type': 'root',\n",
       " 'class': 'openmdao.test_suite.components.sellar_feature:SellarDerivatives',\n",
       " 'expressions': None,\n",
       " 'nonlinear_solver': 'NL: NLBGS',\n",
       " 'nonlinear_solver_options': {'maxiter': 10,\n",
       "  'atol': 1e-10,\n",
       "  'rtol': 1e-10,\n",
       "  'iprint': 1,\n",
       "  'err_on_non_converge': False,\n",
       "  'debug_print': False,\n",
       "  'stall_limit': 0,\n",
       "  'stall_tol': 1e-12,\n",
       "  'stall_tol_type': 'rel',\n",
       "  'restart_from_successful': False,\n",
       "  'use_aitken': False,\n",
       "  'aitken_min_factor': 0.1,\n",
       "  'aitken_max_factor': 1.5,\n",
       "  'aitken_initial_factor': 1.0,\n",
       "  'cs_reconverge': True,\n",
       "  'use_apply_nonlinear': False,\n",
       "  'reraise_child_analysiserror': False},\n",
       " 'linear_solver': 'LN: SCIPY',\n",
       " 'linear_solver_options': {'maxiter': 1000,\n",
       "  'atol': 1e-12,\n",
       "  'rtol': 1e-10,\n",
       "  'iprint': 1,\n",
       "  'err_on_non_converge': False,\n",
       "  'assemble_jac': False,\n",
       "  'solver': 'gmres',\n",
       "  'restart': 20,\n",
       "  'rhs_checking': False},\n",
       " 'component_type': None,\n",
       " 'subsystem_type': 'group',\n",
       " 'is_parallel': False,\n",
       " 'children': [{'name': '_auto_ivc',\n",
       "   'type': 'subsystem',\n",
       "   'class': 'openmdao.core.indepvarcomp:_AutoIndepVarComp',\n",
       "   'expressions': None,\n",
       "   'nonlinear_solver': '',\n",
       "   'nonlinear_solver_options': None,\n",
       "   'linear_solver': '',\n",
       "   'linear_solver_options': None,\n",
       "   'subsystem_type': 'component',\n",
       "   'is_parallel': False,\n",
       "   'component_type': 'indep',\n",
       "   'children': [{'name': 'v0',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'v1',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(2,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [5.0, 2.0],\n",
       "     'val_min_indices': [1],\n",
       "     'val_min': 2.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 5.0}],\n",
       "   'options': {'derivs_method': None,\n",
       "    'distributed': False,\n",
       "    'run_root_only': False,\n",
       "    'always_opt': False,\n",
       "    'use_jit': True,\n",
       "    'default_shape': [1],\n",
       "    'name': 'UNDEFINED',\n",
       "    'val': 1.0,\n",
       "    'shape': None,\n",
       "    'units': None,\n",
       "    'res_units': None,\n",
       "    'desc': None,\n",
       "    'lower': None,\n",
       "    'upper': None,\n",
       "    'ref': 1.0,\n",
       "    'ref0': 0.0,\n",
       "    'res_ref': None,\n",
       "    'tags': None}},\n",
       "  {'name': 'd1',\n",
       "   'type': 'subsystem',\n",
       "   'class': 'openmdao.test_suite.components.sellar:SellarDis1withDerivatives',\n",
       "   'expressions': None,\n",
       "   'nonlinear_solver': '',\n",
       "   'nonlinear_solver_options': None,\n",
       "   'linear_solver': '',\n",
       "   'linear_solver_options': None,\n",
       "   'subsystem_type': 'component',\n",
       "   'is_parallel': False,\n",
       "   'component_type': 'explicit',\n",
       "   'children': [{'name': 'z',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(2,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [5.0, 2.0],\n",
       "     'val_min_indices': [1],\n",
       "     'val_min': 2.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 5.0},\n",
       "    {'name': 'x',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'y2',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'y1',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0}],\n",
       "   'options': {'derivs_method': None,\n",
       "    'distributed': False,\n",
       "    'run_root_only': False,\n",
       "    'always_opt': False,\n",
       "    'use_jit': True,\n",
       "    'default_shape': [1]}},\n",
       "  {'name': 'd2',\n",
       "   'type': 'subsystem',\n",
       "   'class': 'openmdao.test_suite.components.sellar:SellarDis2withDerivatives',\n",
       "   'expressions': None,\n",
       "   'nonlinear_solver': '',\n",
       "   'nonlinear_solver_options': None,\n",
       "   'linear_solver': '',\n",
       "   'linear_solver_options': None,\n",
       "   'subsystem_type': 'component',\n",
       "   'is_parallel': False,\n",
       "   'component_type': 'explicit',\n",
       "   'children': [{'name': 'z',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(2,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [5.0, 2.0],\n",
       "     'val_min_indices': [1],\n",
       "     'val_min': 2.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 5.0},\n",
       "    {'name': 'y1',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'y2',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0}],\n",
       "   'options': {'derivs_method': None,\n",
       "    'distributed': False,\n",
       "    'run_root_only': False,\n",
       "    'always_opt': False,\n",
       "    'use_jit': True,\n",
       "    'default_shape': [1]}},\n",
       "  {'name': 'obj_cmp',\n",
       "   'type': 'subsystem',\n",
       "   'class': 'openmdao.components.exec_comp:ExecComp',\n",
       "   'expressions': ['obj = x**2 + z[1] + y1 + exp(-y2)'],\n",
       "   'nonlinear_solver': '',\n",
       "   'nonlinear_solver_options': None,\n",
       "   'linear_solver': '',\n",
       "   'linear_solver_options': None,\n",
       "   'subsystem_type': 'component',\n",
       "   'is_parallel': False,\n",
       "   'component_type': 'exec',\n",
       "   'children': [{'name': 'x',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'y1',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'y2',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'z',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(2,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [5.0, 2.0],\n",
       "     'val_min_indices': [1],\n",
       "     'val_min': 2.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 5.0},\n",
       "    {'name': 'obj',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [0.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 0.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 0.0}],\n",
       "   'options': {'derivs_method': None,\n",
       "    'run_root_only': False,\n",
       "    'always_opt': False,\n",
       "    'use_jit': True,\n",
       "    'default_shape': [1],\n",
       "    'has_diag_partials': False,\n",
       "    'units': None,\n",
       "    'shape': None,\n",
       "    'shape_by_conn': False,\n",
       "    'do_coloring': False}},\n",
       "  {'name': 'con_cmp1',\n",
       "   'type': 'subsystem',\n",
       "   'class': 'openmdao.components.exec_comp:ExecComp',\n",
       "   'expressions': ['con1 = 3.16 - y1'],\n",
       "   'nonlinear_solver': '',\n",
       "   'nonlinear_solver_options': None,\n",
       "   'linear_solver': '',\n",
       "   'linear_solver_options': None,\n",
       "   'subsystem_type': 'component',\n",
       "   'is_parallel': False,\n",
       "   'component_type': 'exec',\n",
       "   'children': [{'name': 'y1',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'con1',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [0.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 0.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 0.0}],\n",
       "   'options': {'derivs_method': None,\n",
       "    'run_root_only': False,\n",
       "    'always_opt': False,\n",
       "    'use_jit': True,\n",
       "    'default_shape': [1],\n",
       "    'has_diag_partials': False,\n",
       "    'units': None,\n",
       "    'shape': None,\n",
       "    'shape_by_conn': False,\n",
       "    'do_coloring': False}},\n",
       "  {'name': 'con_cmp2',\n",
       "   'type': 'subsystem',\n",
       "   'class': 'openmdao.components.exec_comp:ExecComp',\n",
       "   'expressions': ['con2 = y2 - 24.0'],\n",
       "   'nonlinear_solver': '',\n",
       "   'nonlinear_solver_options': None,\n",
       "   'linear_solver': '',\n",
       "   'linear_solver_options': None,\n",
       "   'subsystem_type': 'component',\n",
       "   'is_parallel': False,\n",
       "   'component_type': 'exec',\n",
       "   'children': [{'name': 'y2',\n",
       "     'type': 'input',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'units': 'None',\n",
       "     'val': [1.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 1.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 1.0},\n",
       "    {'name': 'con2',\n",
       "     'type': 'output',\n",
       "     'dtype': 'ndarray',\n",
       "     'is_discrete': False,\n",
       "     'distributed': False,\n",
       "     'shape': '(1,)',\n",
       "     'desc': '',\n",
       "     'implicit': False,\n",
       "     'units': 'None',\n",
       "     'val': [0.0],\n",
       "     'val_min_indices': [0],\n",
       "     'val_min': 0.0,\n",
       "     'val_max_indices': [0],\n",
       "     'val_max': 0.0}],\n",
       "   'options': {'derivs_method': None,\n",
       "    'run_root_only': False,\n",
       "    'always_opt': False,\n",
       "    'use_jit': True,\n",
       "    'default_shape': [1],\n",
       "    'has_diag_partials': False,\n",
       "    'units': None,\n",
       "    'shape': None,\n",
       "    'shape_by_conn': False,\n",
       "    'do_coloring': False}}],\n",
       " 'options': {'assembled_jac_type': None,\n",
       "  'derivs_method': None,\n",
       "  'auto_order': False}}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# access the model tree stored in metadata\n",
    "cr.problem_metadata['tree']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9e3fc674",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:12.746935Z",
     "iopub.status.busy": "2026-10-02T14:46:12.746774Z",
     "iopub.status.idle": "2026-10-02T14:46:12.749924Z",
     "shell.execute_reply": "2026-10-02T14:46:12.749126Z"
    },
    "papermill": {
     "duration": 0.006889,
     "end_time": "2026-10-02T14:46:12.750369+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.743480+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert set(cr.problem_metadata['tree'].keys()) == {\n",
    "    'name', 'type', 'class', 'expressions', 'component_type',\n",
    "    'subsystem_type', 'is_parallel', 'linear_solver', 'linear_solver_options',\n",
    "    'nonlinear_solver', 'nonlinear_solver_options', 'children', 'options'\n",
    "}\n",
    "\n",
    "assert cr.problem_metadata['tree']['name'] == 'root'\n",
    "\n",
    "assert set([child[\"name\"] for child in cr.problem_metadata['tree'][\"children\"]]) == {\n",
    "    '_auto_ivc', 'con_cmp1', 'con_cmp2', 'd1', 'd2', 'obj_cmp'\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebfcb9c8",
   "metadata": {
    "papermill": {
     "duration": 0.002168,
     "end_time": "2026-10-02T14:46:12.754590+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.752422+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## System Options\n",
    "\n",
    "All case recorders record the component options and scaling factors for all systems in the model.\n",
    "\n",
    "These values are accessible using the `list_model_options` function of a case reader object.\n",
    "This function displays and returns a dictionary of the option values for each system in the model.\n",
    "\n",
    "If the model has been run multiple times, you can specify the run for which to get/display options.\n",
    "\n",
    "The following examples use the `SellarDerivsGrouped` model, which provides system-level options to set and control the solvers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a1c74657",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:12.759619Z",
     "iopub.status.busy": "2026-10-02T14:46:12.759449Z",
     "iopub.status.idle": "2026-10-02T14:46:12.778518Z",
     "shell.execute_reply": "2026-10-02T14:46:12.778180Z"
    },
    "papermill": {
     "duration": 0.022218,
     "end_time": "2026-10-02T14:46:12.778952+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.756734+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\">SellarDerivativesGrouped</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\">initialize</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\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;nonlinear_solver&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recordable</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;Nonlinear solver (class or instance) for Sellar MDA&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;nl_atol&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;User-specified atol for nonlinear solver.&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;nl_maxiter&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;Iteration limit for nonlinear solver.&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;linear_solver&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recordable</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;Linear solver (class or instance)&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;ln_atol&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;User-specified atol for linear solver.&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;ln_maxiter&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;Iteration limit for linear solver.&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;mda_nonlinear_solver&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recordable</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;Nonlinear solver (class or instance)&#39;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">declare</span><span class=\"p\">(</span><span class=\"s1\">&#39;mda_linear_solver&#39;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">recordable</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                             <span class=\"n\">desc</span><span class=\"o\">=</span><span class=\"s1\">&#39;Linear solver (class or instance) for Sellar MDA&#39;</span><span class=\"p\">)</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\">mda</span> <span class=\"o\">=</span> <span class=\"n\">mda</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;mda&#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;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=\"n\">mda</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=\"n\">mda</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>\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> <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\">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\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=\"n\">nl</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;nonlinear_solver&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"n\">nl</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nonlinear_solver</span> <span class=\"o\">=</span> <span class=\"n\">nl</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">inspect</span><span class=\"o\">.</span><span class=\"n\">isclass</span><span class=\"p\">(</span><span class=\"n\">nl</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"n\">nl</span>\n\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;nl_atol&#39;</span><span class=\"p\">]:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nonlinear_solver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;atol&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;nl_atol&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;nl_maxiter&#39;</span><span class=\"p\">]:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nonlinear_solver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;maxiter&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;nl_maxiter&#39;</span><span class=\"p\">]</span>\n\n        <span class=\"n\">ln</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;linear_solver&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"n\">ln</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">linear_solver</span> <span class=\"o\">=</span> <span class=\"n\">ln</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">inspect</span><span class=\"o\">.</span><span class=\"n\">isclass</span><span class=\"p\">(</span><span class=\"n\">ln</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"n\">ln</span>\n\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;ln_atol&#39;</span><span class=\"p\">]:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">linear_solver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;atol&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;ln_atol&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;ln_maxiter&#39;</span><span class=\"p\">]:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">linear_solver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;maxiter&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;ln_maxiter&#39;</span><span class=\"p\">]</span>\n\n        <span class=\"n\">nl</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;mda_nonlinear_solver&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"n\">nl</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">mda</span><span class=\"o\">.</span><span class=\"n\">nonlinear_solver</span> <span class=\"o\">=</span> <span class=\"n\">nl</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">inspect</span><span class=\"o\">.</span><span class=\"n\">isclass</span><span class=\"p\">(</span><span class=\"n\">nl</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"n\">nl</span>\n\n        <span class=\"n\">ln</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;mda_linear_solver&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"n\">ln</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">mda</span><span class=\"o\">.</span><span class=\"n\">linear_solver</span> <span class=\"o\">=</span> <span class=\"n\">ln</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">inspect</span><span class=\"o\">.</span><span class=\"n\">isclass</span><span class=\"p\">(</span><span class=\"n\">ln</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"n\">ln</span>\n</pre></div>\n",
      "application/papermill.record/text/latex": "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{SellarDerivativesGrouped}\\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}{initialize}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nonlinear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,} \\PY{n}{recordable}\\PY{o}{=}\\PY{k+kc}{False}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{Nonlinear solver (class or instance) for Sellar MDA}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nl\\PYZus{}atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{User\\PYZhy{}specified atol for nonlinear solver.}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nl\\PYZus{}maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{Iteration limit for nonlinear solver.}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{linear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,} \\PY{n}{recordable}\\PY{o}{=}\\PY{k+kc}{False}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{Linear solver (class or instance)}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{ln\\PYZus{}atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{User\\PYZhy{}specified atol for linear solver.}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{ln\\PYZus{}maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{Iteration limit for linear solver.}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{mda\\PYZus{}nonlinear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,} \\PY{n}{recordable}\\PY{o}{=}\\PY{k+kc}{False}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{Nonlinear solver (class or instance)}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{o}{.}\\PY{n}{declare}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{mda\\PYZus{}linear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{default}\\PY{o}{=}\\PY{k+kc}{None}\\PY{p}{,} \\PY{n}{recordable}\\PY{o}{=}\\PY{k+kc}{False}\\PY{p}{,}\n                             \\PY{n}{desc}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{Linear solver (class or instance) for Sellar MDA}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{)}\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}{mda} \\PY{o}{=} \\PY{n}{mda} \\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}{mda}\\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}{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}{mda}\\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}{mda}\\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}{,}\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{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{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\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{n}{nl} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nonlinear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{k}{if} \\PY{n}{nl}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{nonlinear\\PYZus{}solver} \\PY{o}{=} \\PY{n}{nl}\\PY{p}{(}\\PY{p}{)} \\PY{k}{if} \\PY{n}{inspect}\\PY{o}{.}\\PY{n}{isclass}\\PY{p}{(}\\PY{n}{nl}\\PY{p}{)} \\PY{k}{else} \\PY{n}{nl}\n\n        \\PY{k}{if} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nl\\PYZus{}atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{nonlinear\\PYZus{}solver}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nl\\PYZus{}atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{k}{if} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nl\\PYZus{}maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{nonlinear\\PYZus{}solver}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{nl\\PYZus{}maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n\n        \\PY{n}{ln} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{linear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{k}{if} \\PY{n}{ln}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{linear\\PYZus{}solver} \\PY{o}{=} \\PY{n}{ln}\\PY{p}{(}\\PY{p}{)} \\PY{k}{if} \\PY{n}{inspect}\\PY{o}{.}\\PY{n}{isclass}\\PY{p}{(}\\PY{n}{ln}\\PY{p}{)} \\PY{k}{else} \\PY{n}{ln}\n\n        \\PY{k}{if} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{ln\\PYZus{}atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{linear\\PYZus{}solver}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{ln\\PYZus{}atol}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{k}{if} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{ln\\PYZus{}maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{linear\\PYZus{}solver}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{ln\\PYZus{}maxiter}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n\n        \\PY{n}{nl} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{mda\\PYZus{}nonlinear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{k}{if} \\PY{n}{nl}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{mda}\\PY{o}{.}\\PY{n}{nonlinear\\PYZus{}solver} \\PY{o}{=} \\PY{n}{nl}\\PY{p}{(}\\PY{p}{)} \\PY{k}{if} \\PY{n}{inspect}\\PY{o}{.}\\PY{n}{isclass}\\PY{p}{(}\\PY{n}{nl}\\PY{p}{)} \\PY{k}{else} \\PY{n}{nl}\n\n        \\PY{n}{ln} \\PY{o}{=} \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{options}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{mda\\PYZus{}linear\\PYZus{}solver}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{k}{if} \\PY{n}{ln}\\PY{p}{:}\n            \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{mda}\\PY{o}{.}\\PY{n}{linear\\PYZus{}solver} \\PY{o}{=} \\PY{n}{ln}\\PY{p}{(}\\PY{p}{)} \\PY{k}{if} \\PY{n}{inspect}\\PY{o}{.}\\PY{n}{isclass}\\PY{p}{(}\\PY{n}{ln}\\PY{p}{)} \\PY{k}{else} \\PY{n}{ln}\n\\end{Verbatim}\n",
      "application/papermill.record/text/plain": "class SellarDerivativesGrouped(om.Group):\n    \"\"\"\n    Group containing the Sellar MDA. This version uses the disciplines with derivatives.\n    \"\"\"\n\n    def initialize(self):\n        self.options.declare('nonlinear_solver', default=None, recordable=False,\n                             desc='Nonlinear solver (class or instance) for Sellar MDA')\n        self.options.declare('nl_atol', default=None,\n                             desc='User-specified atol for nonlinear solver.')\n        self.options.declare('nl_maxiter', default=None,\n                             desc='Iteration limit for nonlinear solver.')\n        self.options.declare('linear_solver', default=None, recordable=False,\n                             desc='Linear solver (class or instance)')\n        self.options.declare('ln_atol', default=None,\n                             desc='User-specified atol for linear solver.')\n        self.options.declare('ln_maxiter', default=None,\n                             desc='Iteration limit for linear solver.')\n        self.options.declare('mda_nonlinear_solver', default=None, recordable=False,\n                             desc='Nonlinear solver (class or instance)')\n        self.options.declare('mda_linear_solver', default=None, recordable=False,\n                             desc='Linear solver (class or instance) for Sellar MDA')\n\n    def setup(self):\n        self.mda = mda = self.add_subsystem('mda', om.Group(), promotes=['x', 'z', 'y1', 'y2'])\n        mda.add_subsystem('d1', SellarDis1withDerivatives(), promotes=['x', 'z', 'y1', 'y2'])\n        mda.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)',\n                                                  z=np.array([0.0, 0.0]), x=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'), promotes=['con1', 'y1'])\n        self.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0'), promotes=['con2', 'y2'])\n\n        self.set_input_defaults('x', 1.0)\n        self.set_input_defaults('z', np.array([5.0, 2.0]))\n\n        nl = self.options['nonlinear_solver']\n        if nl:\n            self.nonlinear_solver = nl() if inspect.isclass(nl) else nl\n\n        if self.options['nl_atol']:\n            self.nonlinear_solver.options['atol'] = self.options['nl_atol']\n        if self.options['nl_maxiter']:\n            self.nonlinear_solver.options['maxiter'] = self.options['nl_maxiter']\n\n        ln = self.options['linear_solver']\n        if ln:\n            self.linear_solver = ln() if inspect.isclass(ln) else ln\n\n        if self.options['ln_atol']:\n            self.linear_solver.options['atol'] = self.options['ln_atol']\n        if self.options['ln_maxiter']:\n            self.linear_solver.options['maxiter'] = self.options['ln_maxiter']\n\n        nl = self.options['mda_nonlinear_solver']\n        if nl:\n            self.mda.nonlinear_solver = nl() if inspect.isclass(nl) else nl\n\n        ln = self.options['mda_linear_solver']\n        if ln:\n            self.mda.linear_solver = ln() if inspect.isclass(ln) else ln"
     },
     "metadata": {
      "scrapbook": {
       "mime_prefix": "application/papermill.record/",
       "name": "code_src85"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src85\", get_code(\"openmdao.test_suite.components.sellar.SellarDerivativesGrouped\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec425b16",
   "metadata": {
    "papermill": {
     "duration": 0.007332,
     "end_time": "2026-10-02T14:46:12.788752+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.781420+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `SellarDerivativesGrouped` class definition \n",
    "\n",
    "{glue:}`code_src85`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5fcdc462",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:12.794371Z",
     "iopub.status.busy": "2026-10-02T14:46:12.794167Z",
     "iopub.status.idle": "2026-10-02T14:46:13.513563Z",
     "shell.execute_reply": "2026-10-02T14:46:13.512897Z"
    },
    "papermill": {
     "duration": 0.723023,
     "end_time": "2026-10-02T14:46:13.514260+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:12.791237+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NL: NLBGSSolver 'NL: NLBGS' on system '' failed to converge in 1 iterations.\n",
      "NL: NLBGS Converged in 8 iterations\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.sellar import SellarDerivativesGrouped\n",
    "\n",
    "prob = om.Problem(name='case_reader_metadata2', model=SellarDerivativesGrouped())\n",
    "\n",
    "prob.add_recorder(om.SqliteRecorder(\"case_reader_metadata.sql\"))\n",
    "\n",
    "# set option and run model\n",
    "prob.model.options['nonlinear_solver'] = om.NonlinearBlockGS()\n",
    "prob.model.options['nl_maxiter'] = 1\n",
    "prob.setup()\n",
    "prob.run_model()\n",
    "\n",
    "# change option and run again\n",
    "prob.model.options['nl_maxiter'] = 9\n",
    "prob.setup()\n",
    "prob.run_model()\n",
    "\n",
    "# clean up after runs and open a case reader\n",
    "prob.cleanup()\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_metadata.sql\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e3370c20",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:13.520992Z",
     "iopub.status.busy": "2026-10-02T14:46:13.520852Z",
     "iopub.status.idle": "2026-10-02T14:46:13.523610Z",
     "shell.execute_reply": "2026-10-02T14:46:13.523028Z"
    },
    "papermill": {
     "duration": 0.006826,
     "end_time": "2026-10-02T14:46:13.524287+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:13.517461+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Run Number: 0\n",
      "    Subsystem : root\n",
      "        assembled_jac_type: None\n",
      "        derivs_method: None\n",
      "        nl_atol: None\n",
      "        nl_maxiter: 1\n",
      "        ln_atol: None\n",
      "        ln_maxiter: None\n",
      "        auto_order: False\n",
      "    Subsystem : _auto_ivc\n",
      "        derivs_method: None\n",
      "        distributed: False\n",
      "        run_root_only: False\n",
      "        always_opt: False\n",
      "        use_jit: True\n",
      "        default_shape: (1,)\n",
      "        name: UNDEFINED\n",
      "        val: 1.0\n",
      "        shape: None\n",
      "        units: None\n",
      "        res_units: None\n",
      "        desc: None\n",
      "        lower: None\n",
      "        upper: None\n",
      "        ref: 1.0\n",
      "        ref0: 0.0\n",
      "        res_ref: None\n",
      "        tags: None\n",
      "    Subsystem : mda\n",
      "        assembled_jac_type: None\n",
      "        derivs_method: None\n",
      "        auto_order: False\n",
      "    Subsystem : mda.d1\n",
      "        derivs_method: None\n",
      "        distributed: False\n",
      "        run_root_only: False\n",
      "        always_opt: False\n",
      "        use_jit: True\n",
      "        default_shape: (1,)\n",
      "    Subsystem : mda.d2\n",
      "        derivs_method: None\n",
      "        distributed: False\n",
      "        run_root_only: False\n",
      "        always_opt: False\n",
      "        use_jit: True\n",
      "        default_shape: (1,)\n",
      "    Subsystem : obj_cmp\n",
      "        derivs_method: None\n",
      "        run_root_only: False\n",
      "        always_opt: False\n",
      "        use_jit: True\n",
      "        default_shape: (1,)\n",
      "        has_diag_partials: False\n",
      "        units: None\n",
      "        shape: None\n",
      "        shape_by_conn: False\n",
      "        do_coloring: False\n",
      "    Subsystem : con_cmp1\n",
      "        derivs_method: None\n",
      "        run_root_only: False\n",
      "        always_opt: False\n",
      "        use_jit: True\n",
      "        default_shape: (1,)\n",
      "        has_diag_partials: False\n",
      "        units: None\n",
      "        shape: None\n",
      "        shape_by_conn: False\n",
      "        do_coloring: False\n",
      "    Subsystem : con_cmp2\n",
      "        derivs_method: None\n",
      "        run_root_only: False\n",
      "        always_opt: False\n",
      "        use_jit: True\n",
      "        default_shape: (1,)\n",
      "        has_diag_partials: False\n",
      "        units: None\n",
      "        shape: None\n",
      "        shape_by_conn: False\n",
      "        do_coloring: False\n"
     ]
    }
   ],
   "source": [
    "# get/display options for initial run\n",
    "options = cr.list_model_options()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "749b4503",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:13.561092Z",
     "iopub.status.busy": "2026-10-02T14:46:13.560907Z",
     "iopub.status.idle": "2026-10-02T14:46:13.563865Z",
     "shell.execute_reply": "2026-10-02T14:46:13.563218Z"
    },
    "papermill": {
     "duration": 0.006194,
     "end_time": "2026-10-02T14:46:13.564348+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:13.558154+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert sorted(options.keys()) == sorted([\n",
    "    'root', '_auto_ivc', 'con_cmp1', 'con_cmp2', 'mda', 'mda.d1', 'mda.d2', 'obj_cmp'\n",
    "])\n",
    "\n",
    "assert sorted(options['mda.d1'].keys()) == sorted(prob.model.mda.d1.options._dict.keys())\n",
    "\n",
    "assert options['root']['nl_maxiter'] == 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2191a3c2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:13.569036Z",
     "iopub.status.busy": "2026-10-02T14:46:13.568910Z",
     "iopub.status.idle": "2026-10-02T14:46:13.572062Z",
     "shell.execute_reply": "2026-10-02T14:46:13.571329Z"
    },
    "papermill": {
     "duration": 0.006165,
     "end_time": "2026-10-02T14:46:13.572664+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:13.566499+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check nl_maxiter option for the second run\n",
    "options = cr.list_model_options(run_number=1, out_stream=None)\n",
    "options['root']['nl_maxiter']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "4f5e71bf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:13.617192Z",
     "iopub.status.busy": "2026-10-02T14:46:13.617063Z",
     "iopub.status.idle": "2026-10-02T14:46:13.619514Z",
     "shell.execute_reply": "2026-10-02T14:46:13.618767Z"
    },
    "papermill": {
     "duration": 0.044599,
     "end_time": "2026-10-02T14:46:13.619908+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:13.575309+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert options['root']['nl_maxiter'] == 9"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef49722f",
   "metadata": {
    "papermill": {
     "duration": 0.001867,
     "end_time": "2026-10-02T14:46:13.623722+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:13.621855+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Solver Options\n",
    "\n",
    "All case recorders record the solver options for all solvers in the model.\n",
    "\n",
    "These values are accessible using the `list_solver_options` function of a case reader object.\n",
    "\n",
    "This function displays and returns a dictionary of the option values for each solver in the model.\n",
    "If the model has been run multiple times, you can specify the run for which to get/display options."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6a859134",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:13.628114Z",
     "iopub.status.busy": "2026-10-02T14:46:13.627991Z",
     "iopub.status.idle": "2026-10-02T14:46:14.423218Z",
     "shell.execute_reply": "2026-10-02T14:46:14.422600Z"
    },
    "papermill": {
     "duration": 0.798365,
     "end_time": "2026-10-02T14:46:14.423959+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:13.625594+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "|  \n",
      "|  ===\n",
      "|  mda\n",
      "|  ===\n",
      "|  NL: Newton Converged in 2 iterations\n",
      "|  \n",
      "|  ===\n",
      "|  mda\n",
      "|  ===\n",
      "|  NL: Newton Converged in 0 iterations\n",
      "NL: NLBGS Converged in 2 iterations\n",
      "|  \n",
      "|  ===\n",
      "|  mda\n",
      "|  ===\n",
      "|  NL: Newton Converged in 0 iterations\n",
      "NL: NLBGS Converged in 1 iterations\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.sellar import SellarDerivativesGrouped\n",
    "\n",
    "prob = om.Problem(name='case_reader_metadata3', model=SellarDerivativesGrouped())\n",
    "\n",
    "prob.model.options['nonlinear_solver'] = om.NonlinearBlockGS()\n",
    "prob.model.options['linear_solver'] = om.ScipyKrylov()\n",
    "\n",
    "# configure a Newton solver with linesearch for the Sellar MDA Group\n",
    "newton = om.NewtonSolver(solve_subsystems=True, max_sub_solves=4)\n",
    "newton.linesearch = om.BoundsEnforceLS()\n",
    "prob.model.options['mda_nonlinear_solver'] = newton\n",
    "\n",
    "prob.model.options['mda_linear_solver'] = om.ScipyKrylov()\n",
    "\n",
    "prob.add_recorder(om.SqliteRecorder(\"case_reader_metadata.sql\"))\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "# initial run\n",
    "newton.linesearch.options['bound_enforcement'] = 'vector'\n",
    "prob.run_model()\n",
    "\n",
    "# change linesearch and run again\n",
    "newton.linesearch.options['bound_enforcement'] = 'wall'\n",
    "prob.run_model()\n",
    "\n",
    "# clean up after runs and open a case reader\n",
    "prob.cleanup()\n",
    "cr = om.CaseReader(prob.get_outputs_dir() / \"case_reader_metadata.sql\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "b5c7bdbf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.434063Z",
     "iopub.status.busy": "2026-10-02T14:46:14.433873Z",
     "iopub.status.idle": "2026-10-02T14:46:14.437468Z",
     "shell.execute_reply": "2026-10-02T14:46:14.436659Z"
    },
    "papermill": {
     "duration": 0.011522,
     "end_time": "2026-10-02T14:46:14.437957+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.426435+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Run Number: 0\n",
      "    Solver: root.NonlinearBlockGS\n",
      "        maxiter: 10\n",
      "        atol: 1e-10\n",
      "        rtol: 1e-10\n",
      "        iprint: 1\n",
      "        err_on_non_converge: False\n",
      "        debug_print: False\n",
      "        stall_limit: 0\n",
      "        stall_tol: 1e-12\n",
      "        stall_tol_type: rel\n",
      "        restart_from_successful: False\n",
      "        use_aitken: False\n",
      "        aitken_min_factor: 0.1\n",
      "        aitken_max_factor: 1.5\n",
      "        aitken_initial_factor: 1.0\n",
      "        cs_reconverge: True\n",
      "        use_apply_nonlinear: False\n",
      "        reraise_child_analysiserror: False\n",
      "    Solver: root.ScipyKrylov\n",
      "        maxiter: 1000\n",
      "        atol: 1e-12\n",
      "        rtol: 1e-10\n",
      "        iprint: 1\n",
      "        err_on_non_converge: False\n",
      "        assemble_jac: False\n",
      "        solver: gmres\n",
      "        restart: 20\n",
      "        rhs_checking: False\n",
      "    Solver: mda.NewtonSolver\n",
      "        maxiter: 10\n",
      "        atol: 1e-10\n",
      "        rtol: 1e-10\n",
      "        iprint: 1\n",
      "        err_on_non_converge: False\n",
      "        debug_print: False\n",
      "        stall_limit: 0\n",
      "        stall_tol: 1e-12\n",
      "        stall_tol_type: rel\n",
      "        restart_from_successful: False\n",
      "        solve_subsystems: True\n",
      "        max_sub_solves: 4\n",
      "        cs_reconverge: True\n",
      "        reraise_child_analysiserror: False\n",
      "    Solver: mda.BoundsEnforceLS\n",
      "        iprint: 1\n",
      "        debug_print: False\n",
      "        stall_limit: 0\n",
      "        stall_tol: 1e-12\n",
      "        stall_tol_type: rel\n",
      "        bound_enforcement: vector\n",
      "        print_bound_enforce: False\n",
      "    Solver: mda.ScipyKrylov\n",
      "        maxiter: 1000\n",
      "        atol: 1e-12\n",
      "        rtol: 1e-10\n",
      "        iprint: 1\n",
      "        err_on_non_converge: False\n",
      "        assemble_jac: False\n",
      "        solver: gmres\n",
      "        restart: 20\n",
      "        rhs_checking: False\n"
     ]
    }
   ],
   "source": [
    "# get/display options for initial run\n",
    "options = cr.list_solver_options()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3db53820",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.443861Z",
     "iopub.status.busy": "2026-10-02T14:46:14.443711Z",
     "iopub.status.idle": "2026-10-02T14:46:14.446522Z",
     "shell.execute_reply": "2026-10-02T14:46:14.445805Z"
    },
    "papermill": {
     "duration": 0.006588,
     "end_time": "2026-10-02T14:46:14.446995+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.440407+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['mda.BoundsEnforceLS', 'mda.NewtonSolver', 'mda.ScipyKrylov', 'root.NonlinearBlockGS', 'root.ScipyKrylov']\n"
     ]
    }
   ],
   "source": [
    "print(sorted(options.keys()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "40331bce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.455796Z",
     "iopub.status.busy": "2026-10-02T14:46:14.455547Z",
     "iopub.status.idle": "2026-10-02T14:46:14.458429Z",
     "shell.execute_reply": "2026-10-02T14:46:14.457685Z"
    },
    "papermill": {
     "duration": 0.008414,
     "end_time": "2026-10-02T14:46:14.458898+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.450484+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n"
     ]
    }
   ],
   "source": [
    "print(options['root.NonlinearBlockGS']['maxiter'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1ffa82bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.464137Z",
     "iopub.status.busy": "2026-10-02T14:46:14.463997Z",
     "iopub.status.idle": "2026-10-02T14:46:14.466558Z",
     "shell.execute_reply": "2026-10-02T14:46:14.466094Z"
    },
    "papermill": {
     "duration": 0.005793,
     "end_time": "2026-10-02T14:46:14.467019+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.461226+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000\n"
     ]
    }
   ],
   "source": [
    "print(options['root.ScipyKrylov']['maxiter'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "459deeeb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.535231Z",
     "iopub.status.busy": "2026-10-02T14:46:14.535025Z",
     "iopub.status.idle": "2026-10-02T14:46:14.538132Z",
     "shell.execute_reply": "2026-10-02T14:46:14.537467Z"
    },
    "papermill": {
     "duration": 0.054249,
     "end_time": "2026-10-02T14:46:14.538662+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.484413+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n"
     ]
    }
   ],
   "source": [
    "print(options['mda.NewtonSolver']['maxiter'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "96d11fdf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.549273Z",
     "iopub.status.busy": "2026-10-02T14:46:14.549104Z",
     "iopub.status.idle": "2026-10-02T14:46:14.551870Z",
     "shell.execute_reply": "2026-10-02T14:46:14.551154Z"
    },
    "papermill": {
     "duration": 0.006423,
     "end_time": "2026-10-02T14:46:14.552340+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.545917+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n"
     ]
    }
   ],
   "source": [
    "print(options['mda.NewtonSolver']['solve_subsystems'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "294c040f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.574367Z",
     "iopub.status.busy": "2026-10-02T14:46:14.574208Z",
     "iopub.status.idle": "2026-10-02T14:46:14.576894Z",
     "shell.execute_reply": "2026-10-02T14:46:14.576159Z"
    },
    "papermill": {
     "duration": 0.007844,
     "end_time": "2026-10-02T14:46:14.577590+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.569746+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4\n"
     ]
    }
   ],
   "source": [
    "print(options['mda.NewtonSolver']['max_sub_solves'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a2804eab",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.584676Z",
     "iopub.status.busy": "2026-10-02T14:46:14.584558Z",
     "iopub.status.idle": "2026-10-02T14:46:14.587124Z",
     "shell.execute_reply": "2026-10-02T14:46:14.586444Z"
    },
    "papermill": {
     "duration": 0.006695,
     "end_time": "2026-10-02T14:46:14.587624+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.580929+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vector\n"
     ]
    }
   ],
   "source": [
    "print(options['mda.BoundsEnforceLS']['bound_enforcement'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7ca69a03",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.592913Z",
     "iopub.status.busy": "2026-10-02T14:46:14.592773Z",
     "iopub.status.idle": "2026-10-02T14:46:14.595774Z",
     "shell.execute_reply": "2026-10-02T14:46:14.594958Z"
    },
    "papermill": {
     "duration": 0.006291,
     "end_time": "2026-10-02T14:46:14.596229+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.589938+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert sorted(options.keys()) == [\n",
    "    'mda.BoundsEnforceLS', 'mda.NewtonSolver', 'mda.ScipyKrylov',\n",
    "    'root.NonlinearBlockGS', 'root.ScipyKrylov'\n",
    "]\n",
    "assert options['root.NonlinearBlockGS']['maxiter'] == 10\n",
    "assert options['root.ScipyKrylov']['maxiter'] == 1000\n",
    "assert options['mda.NewtonSolver']['maxiter'] == 10\n",
    "assert options['mda.NewtonSolver']['solve_subsystems']\n",
    "assert options['mda.NewtonSolver']['max_sub_solves'] == 4\n",
    "assert options['mda.BoundsEnforceLS']['bound_enforcement'] == 'vector'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "baafc172",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.635426Z",
     "iopub.status.busy": "2026-10-02T14:46:14.635273Z",
     "iopub.status.idle": "2026-10-02T14:46:14.638473Z",
     "shell.execute_reply": "2026-10-02T14:46:14.637575Z"
    },
    "papermill": {
     "duration": 0.007851,
     "end_time": "2026-10-02T14:46:14.639022+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.631171+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wall\n"
     ]
    }
   ],
   "source": [
    "# get options for second run\n",
    "options = cr.list_solver_options(run_number=1, out_stream=None)\n",
    "print(options['mda.BoundsEnforceLS']['bound_enforcement'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "3c4ed853",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:46:14.644933Z",
     "iopub.status.busy": "2026-10-02T14:46:14.644785Z",
     "iopub.status.idle": "2026-10-02T14:46:14.647513Z",
     "shell.execute_reply": "2026-10-02T14:46:14.646925Z"
    },
    "papermill": {
     "duration": 0.006539,
     "end_time": "2026-10-02T14:46:14.648290+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:46:14.641751+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert options['mda.BoundsEnforceLS']['bound_enforcement'] == 'wall'"
   ]
  }
 ],
 "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.292998,
   "end_time": "2026-10-02T14:46:15.570081+00:00",
   "environment_variables": {},
   "exception": null,
   "input_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/openmdao_book/features/recording/case_reader_metadata.ipynb",
   "output_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/_executed_book/features/recording/case_reader_metadata.ipynb",
   "parameters": {},
   "start_time": "2026-10-02T14:46:06.277083+00:00",
   "version": "2.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}