{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 3: Reading and running the modified OpenMDAO Assembly\n", "\n", "This is the last of three Jupyter Notebooks that show an example of the workflow pictured below:\n", "\n", "\n", "![Process showing separation of creation, editing, and use of MDAO models](workflow.drawio.svg)\n", "\n", "\n", "In this notebook engineer 3 is getting the modified assembly JSON file, and can load this in their Jupyter Notebook environment and create a new OpenMDAO assembly. This can now be executed. We also use the subset of the state from the original setup. Note that someone can even edit the HDF5 file separately and that would be reflected in this. \n", "\n", "
\n", "Note: Someone can even edit the HDF5 file separately and that would be reflected in this. \n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "metadata": {} }, "outputs": [], "source": [ "from standard_evaluator import load_assembly\n", "import openmdao.api as om" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "** This is a group, special handling needed for prep_geom in group \n", "Adding nacelles component\n", "Building class nacelles\n", "Importing class Nacelles from aviary.subsystems.geometry.flops_based.nacelle\n", "Adding canard component\n", "Building class canard\n", "Importing class Canard from aviary.subsystems.geometry.flops_based.canard\n", "Adding fuselage_prelim component\n", "Building class fuselage_prelim\n", "Importing class FuselagePrelim from aviary.subsystems.geometry.flops_based.fuselage\n", "Adding wing_prelim component\n", "Building class wing_prelim\n", "Importing class WingPrelim from aviary.subsystems.geometry.flops_based.wing\n", "Adding prelim component\n", "Building class prelim\n", "Importing class _Prelim from aviary.subsystems.geometry.flops_based.prep_geom\n", "Adding wing component\n", "Building class wing\n", "Importing class _Wing from aviary.subsystems.geometry.flops_based.prep_geom\n", "Adding tail component\n", "Building class tail\n", "Importing class _Tail from aviary.subsystems.geometry.flops_based.prep_geom\n", "Adding fuselage component\n", "Building class fuselage\n", "Importing class _Fuselage from aviary.subsystems.geometry.flops_based.prep_geom\n", "Adding total_wetted_area component\n", "Building class total_wetted_area\n", "Importing class TotalWettedArea from aviary.subsystems.geometry.flops_based.wetted_area_total\n" ] } ], "source": [ "new_file_name = \"after.json\"\n", "# Now loading the structure and state from these files\n", "new_problem = load_assembly(assembly_name=new_file_name, state_name='state.h5')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After loading and recreating the model we can run it and see its inputs and outputs." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "59 Input(s) in 'model'\n", "\n", "varname val units shape prom_name \n", "--------------------------------------------------- --------------- -------- ----- -----------------------------------------------\n", "prep_geom\n", " nacelles\n", " aircraft:nacelle:avg_diameter [7.94] ft (1,) aircraft:nacelle:avg_diameter \n", " aircraft:nacelle:avg_length [12.3] ft (1,) aircraft:nacelle:avg_length \n", " aircraft:nacelle:wetted_area_scaler [1.] unitless (1,) aircraft:nacelle:wetted_area_scaler \n", " canard\n", " aircraft:canard:area [0.] ft**2 (1,) aircraft:canard:area \n", " aircraft:canard:thickness_to_chord [0.] unitless (1,) aircraft:canard:thickness_to_chord \n", " aircraft:canard:wetted_area_scaler [1.] unitless (1,) aircraft:canard:wetted_area_scaler \n", " fuselage_prelim\n", " aircraft:fuselage:length [128.] ft (1,) aircraft:fuselage:length \n", " aircraft:fuselage:max_height [13.17] ft (1,) aircraft:fuselage:max_height \n", " aircraft:fuselage:max_width [12.33] ft (1,) aircraft:fuselage:max_width \n", " wing_prelim\n", " aircraft:wing:area [1370.] ft**2 (1,) aircraft:wing:area \n", " aircraft:wing:glove_and_bat [134.] ft**2 (1,) aircraft:wing:glove_and_bat \n", " aircraft:wing:span [117.83] ft (1,) aircraft:wing:span \n", " prelim\n", " aircraft:fuselage:avg_diameter [12.75] ft (1,) aircraft:fuselage:avg_diameter \n", " aircraft:fuselage:max_width [12.33] ft (1,) aircraft:fuselage:max_width \n", " aircraft:horizontal_tail:area [355.] ft**2 (1,) aircraft:horizontal_tail:area \n", " aircraft:horizontal_tail:aspect_ratio [6.] unitless (1,) aircraft:horizontal_tail:aspect_ratio \n", " aircraft:horizontal_tail:taper_ratio [0.22] unitless (1,) aircraft:horizontal_tail:taper_ratio \n", " aircraft:horizontal_tail:thickness_to_chord [0.125] unitless (1,) aircraft:horizontal_tail:thickness_to_chord \n", " aircraft:vertical_tail:area [284.] ft**2 (1,) aircraft:vertical_tail:area \n", " aircraft:vertical_tail:aspect_ratio [1.75] unitless (1,) aircraft:vertical_tail:aspect_ratio \n", " aircraft:vertical_tail:taper_ratio [0.33] unitless (1,) aircraft:vertical_tail:taper_ratio \n", " aircraft:vertical_tail:thickness_to_chord [0.1195] unitless (1,) aircraft:vertical_tail:thickness_to_chord \n", " aircraft:wing:area [1370.] ft**2 (1,) aircraft:wing:area \n", " aircraft:wing:glove_and_bat [134.] ft**2 (1,) aircraft:wing:glove_and_bat \n", " aircraft:wing:span [117.83] ft (1,) aircraft:wing:span \n", " aircraft:wing:taper_ratio [0.278] unitless (1,) aircraft:wing:taper_ratio \n", " aircraft:wing:thickness_to_chord [0.13] unitless (1,) aircraft:wing:thickness_to_chord \n", " wing\n", " prep_geom:_Names:CROOT [16.415788] unitless (1,) wing.prep_geom:_Names:CROOT \n", " prep_geom:_Names:CROOTB [15.13330021] unitless (1,) wing.prep_geom:_Names:CROOTB \n", " prep_geom:_Names:XDX [12.75] unitless (1,) wing.prep_geom:_Names:XDX \n", " prep_geom:_Names:XMULT [2.05031] unitless (1,) wing.prep_geom:_Names:XMULT \n", " aircraft:wing:area [1370.] ft**2 (1,) aircraft:wing:area \n", " aircraft:wing:wetted_area_scaler [1.] unitless (1,) aircraft:wing:wetted_area_scaler \n", " tail\n", " prep_geom:_Names:XMULTH [2.048375] unitless (1,) tail.prep_geom:_Names:XMULTH \n", " prep_geom:_Names:XMULTV [2.0462465] unitless (1,) tail.prep_geom:_Names:XMULTV \n", " aircraft:horizontal_tail:area [355.] ft**2 (1,) aircraft:horizontal_tail:area \n", " aircraft:horizontal_tail:vertical_tail_fraction [0.] unitless (1,) aircraft:horizontal_tail:vertical_tail_fraction\n", " aircraft:horizontal_tail:wetted_area_scaler [1.] unitless (1,) aircraft:horizontal_tail:wetted_area_scaler \n", " aircraft:vertical_tail:area [284.] ft**2 (1,) aircraft:vertical_tail:area \n", " aircraft:vertical_tail:wetted_area_scaler [1.] unitless (1,) aircraft:vertical_tail:wetted_area_scaler \n", " fuselage\n", " prep_geom:_Names:CROOTB [15.13330021] unitless (1,) fuselage.prep_geom:_Names:CROOTB \n", " prep_geom:_Names:CROTVT [19.15660306] unitless (1,) fuselage.prep_geom:_Names:CROTVT \n", " prep_geom:_Names:CRTHTB [13.50207305] unitless (1,) fuselage.prep_geom:_Names:CRTHTB \n", " aircraft:fuselage:avg_diameter [12.75] ft (1,) aircraft:fuselage:avg_diameter \n", " aircraft:fuselage:length [128.] ft (1,) aircraft:fuselage:length \n", " aircraft:fuselage:wetted_area_scaler [1.] unitless (1,) aircraft:fuselage:wetted_area_scaler \n", " aircraft:horizontal_tail:thickness_to_chord [0.125] unitless (1,) aircraft:horizontal_tail:thickness_to_chord \n", " aircraft:horizontal_tail:vertical_tail_fraction [0.] unitless (1,) aircraft:horizontal_tail:vertical_tail_fraction\n", " aircraft:vertical_tail:thickness_to_chord [0.1195] unitless (1,) aircraft:vertical_tail:thickness_to_chord \n", " aircraft:wing:area [1370.] ft**2 (1,) aircraft:wing:area \n", " aircraft:wing:aspect_ratio [11.232936] unitless (1,) aircraft:wing:aspect_ratio \n", " aircraft:wing:glove_and_bat [134.] ft**2 (1,) aircraft:wing:glove_and_bat \n", " aircraft:wing:thickness_to_chord [0.13] unitless (1,) aircraft:wing:thickness_to_chord \n", " total_wetted_area\n", " aircraft:canard:wetted_area [0.] ft**2 (1,) aircraft:canard:wetted_area \n", " aircraft:fuselage:wetted_area [4158.62066062] ft**2 (1,) aircraft:fuselage:wetted_area \n", " aircraft:horizontal_tail:wetted_area [592.64609688] ft**2 (1,) aircraft:horizontal_tail:wetted_area \n", " aircraft:nacelle:total_wetted_area [546.9072] ft**2 (1,) aircraft:nacelle:total_wetted_area \n", " aircraft:vertical_tail:wetted_area [581.134006] ft**2 (1,) aircraft:vertical_tail:wetted_area \n", " aircraft:wing:wetted_area [2396.55520449] ft**2 (1,) aircraft:wing:wetted_area \n", "\n", "\n" ] } ], "source": [ "new_problem.run_model()\n", "_ = new_problem.model.list_inputs(shape=True, units=True)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "25 Explicit Output(s) in 'model'\n", "\n", "varname val shape prom_name \n", "------------------------------------------- --------------- ----- ---------------------------------------\n", "prep_geom\n", " nacelles\n", " aircraft:nacelle:total_wetted_area [546.9072] (1,) aircraft:nacelle:total_wetted_area \n", " aircraft:nacelle:wetted_area [273.4536] (1,) aircraft:nacelle:wetted_area \n", " canard\n", " aircraft:canard:wetted_area [0.] (1,) aircraft:canard:wetted_area \n", " fuselage_prelim\n", " aircraft:fuselage:avg_diameter [12.75] (1,) aircraft:fuselage:avg_diameter \n", " aircraft:fuselage:planform_area [1578.24] (1,) aircraft:fuselage:planform_area \n", " wing_prelim\n", " aircraft:wing:aspect_ratio [11.232936] (1,) aircraft:wing:aspect_ratio \n", " prelim\n", " prep_geom:_Names:CROOT [16.415788] (1,) prelim.prep_geom:_Names:CROOT \n", " prep_geom:_Names:CROOTB [15.13330021] (1,) prelim.prep_geom:_Names:CROOTB \n", " prep_geom:_Names:CROTM [0.92187473] (1,) prelim.prep_geom:_Names:CROTM \n", " prep_geom:_Names:CROTVT [19.15660306] (1,) prelim.prep_geom:_Names:CROTVT \n", " prep_geom:_Names:CRTHTB [13.50207305] (1,) prelim.prep_geom:_Names:CRTHTB \n", " prep_geom:_Names:SPANHT [46.15192304] (1,) prelim.prep_geom:_Names:SPANHT \n", " prep_geom:_Names:SPANVT [22.29349681] (1,) prelim.prep_geom:_Names:SPANVT \n", " prep_geom:_Names:XDX [12.75] (1,) prelim.prep_geom:_Names:XDX \n", " prep_geom:_Names:XMULT [2.05031] (1,) prelim.prep_geom:_Names:XMULT \n", " prep_geom:_Names:XMULTH [2.048375] (1,) prelim.prep_geom:_Names:XMULTH \n", " prep_geom:_Names:XMULTV [2.0462465] (1,) prelim.prep_geom:_Names:XMULTV \n", " wing\n", " aircraft:wing:wetted_area [2396.55520449] (1,) aircraft:wing:wetted_area \n", " tail\n", " aircraft:horizontal_tail:wetted_area [592.64609688] (1,) aircraft:horizontal_tail:wetted_area \n", " aircraft:vertical_tail:wetted_area [581.134006] (1,) aircraft:vertical_tail:wetted_area \n", " fuselage\n", " aircraft:fuselage:cross_section [127.67628894] (1,) aircraft:fuselage:cross_section \n", " aircraft:fuselage:diameter_to_wing_span [0.10820674] (1,) aircraft:fuselage:diameter_to_wing_span\n", " aircraft:fuselage:length_to_diameter [10.03921569] (1,) aircraft:fuselage:length_to_diameter \n", " aircraft:fuselage:wetted_area [4158.62066062] (1,) aircraft:fuselage:wetted_area \n", " total_wetted_area\n", " aircraft:design:total_wetted_area [8275.86316799] (1,) aircraft:design:total_wetted_area \n", "\n", "\n", "0 Implicit Output(s) in 'model'\n", "\n", "\n" ] } ], "source": [ "_ = new_problem.model.list_outputs(shape=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now also look at the N2 diagram of the model, and see the re-ordering happened, and the `characteristic_lenghts` component is no longer in the model." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "metadata": {} }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import os\n", "# Check if running in VS Code\n", "if 'VSCODE_PID' in os.environ:\n", " display_in_notebook = False\n", "else:\n", " display_in_notebook = True\n", "om.n2(new_problem, 'after.n2.html', display_in_notebook=display_in_notebook, )" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.9" } }, "nbformat": 4, "nbformat_minor": 4 }