/*
 * disk_stack_heat_sink.java
 */

import com.comsol.model.*;
import com.comsol.model.util.*;

/** Model exported on May 13 2026, 09:07 by COMSOL 6.4.0.419. */
public class disk_stack_heat_sink {

  public static Model run() {
    Model model = ModelUtil.create("Model");

//    From the File menu, choose New.
//    In the New window, click Model Wizard.
//    In the Model Wizard window, click 3D.
//    In the Select Physics tree, select Heat Transfer > Heat Transfer in Solids (ht).
//    Click Add.
//    Click Study.
//    In the Select Study tree, select General Studies > Stationary.
//    Click Done.

    model.component().create("comp1", true);

    model.component("comp1").geom().create("geom1", 3);
    model.component("comp1").geom("geom1").geomRep("comsol");

    model.component("comp1").mesh().create("mesh1");
    model.component("comp1").mesh("mesh1").contribute("geom/detail", true);

    model.component("comp1").physics().create("ht", "HeatTransfer", "geom1");

    model.study().create("std1");
    model.study("std1").create("stat", "Stationary");

//    In the Model Builder window, under Global Definitions, click Parameters 1.
//    In the Settings window for Parameters, locate the Parameters section.
//    Click Load from File.
//    Browse to the model's Application Library folder and double-click the file disk_stack_heat_sink_parameters.txt.
//    To import content from file, use:
//    model.param().loadFile("FILENAME");
    model.param().set("CB_w", "150[mm]", "Circuit board width");
    model.param().set("CB_l", "150[mm]", "Circuit board length");
    model.param().set("CB_t", "3[mm]", "Circuit board thickness");
    model.param().set("IC1_w", "50[mm]", "IC 1 width");
    model.param().set("IC1_l", "50[mm]", "IC 1 length");
    model.param().set("IC1_t", "3[mm]", "IC 1 thickness");
    model.param().set("IC2_w", "15[mm]", "ICs 2 width");
    model.param().set("IC2_l", "20[mm]", "ICs 2 length");
    model.param().set("IC2_t", "3[mm]", "ICs 2 thickness");
    model.param().set("IC3_w", "15[mm]", "ICs 3 width");
    model.param().set("IC3_l", "40[mm]", "ICs 3 length");
    model.param().set("IC3_t", "3[mm]", "IC2 3 thickness");
    model.param().set("P1", "20[W]", "Power dissipated by IC 1");
    model.param().set("P2", "1[W]", "Power dissipated by ICs 2");
    model.param().set("P3", "2[W]", "Power dissipated by ICs 3");
    model.param().set("htc", "20[W/(m^2*K)]", "Heat transfer coefficient");
    model.param().set("T0", "273.15[K]", "Air flow temperature");
    model.param().set("e_fins", "0.3[mm]", "Fins thickness");
    model.param().set("i_radius", "5[mm]", "Inner radius");
    model.param().set("o_radius", "25[mm]", "Outer radius");
    model.param().set("air_sp", "3[mm]", "Air spacing between sink fins");
    model.param().set("n_fins", "10", "Number of fins");
    model.param().set("t_h", "air_sp*n_fins", "Heat sink tube height");

//    In the Model Builder window, under Component 1 (comp1), click Geometry 1.
//    In the Settings window for Geometry, locate the Units section.
//    From the Length unit list, select mm.

    model.component("comp1").geom("geom1").lengthUnit("mm");

//    In the Geometry toolbar, click Block.

    model.component("comp1").geom("geom1").create("blk1", "Block");

//    In the Settings window for Block, locate the Size and Shape section.
//    In the Width text field, type CB_w.

    model.component("comp1").geom("geom1").feature("blk1").set("size", new String[]{"CB_w", "1", "1"});

//    In the Depth text field, type CB_l.

    model.component("comp1").geom("geom1").feature("blk1").set("size", new String[]{"CB_w", "CB_l", "1"});

//    In the Height text field, type CB_t.

    model.component("comp1").geom("geom1").feature("blk1").set("size", new String[]{"CB_w", "CB_l", "CB_t"});

//    Locate the Position section.
//    In the x text field, type -CB_w/2.

    model.component("comp1").geom("geom1").feature("blk1").set("pos", new String[]{"-CB_w/2", "0", "0"});

//    In the y text field, type -CB_l/2.

    model.component("comp1").geom("geom1").feature("blk1").set("pos", new String[]{"-CB_w/2", "-CB_l/2", "0"});

//    In the z text field, type -CB_t.

    model.component("comp1").geom("geom1").feature("blk1").setIndex("pos", "-CB_t", 2);

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("blk1");

//    In the Geometry toolbar, click Block.

    model.component("comp1").geom("geom1").create("blk2", "Block");

//    In the Settings window for Block, locate the Size and Shape section.
//    In the Width text field, type IC1_w.

    model.component("comp1").geom("geom1").feature("blk2").set("size", new String[]{"IC1_w", "1", "1"});

//    In the Depth text field, type IC1_l.

    model.component("comp1").geom("geom1").feature("blk2").set("size", new String[]{"IC1_w", "IC1_l", "1"});

//    In the Height text field, type IC1_t.

    model.component("comp1").geom("geom1").feature("blk2").set("size", new String[]{"IC1_w", "IC1_l", "IC1_t"});

//    Locate the Position section.
//    In the x text field, type -CB_w/2+IC1_w.

    model.component("comp1").geom("geom1").feature("blk2").set("pos", new String[]{"-CB_w/2+IC1_w", "0", "0"});

//    In the y text field, type -CB_l/2+IC1_l.

    model.component("comp1").geom("geom1").feature("blk2").setIndex("pos", "-CB_l/2+IC1_l", 1);

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("blk2");

//    In the Geometry toolbar, click Block.

    model.component("comp1").geom("geom1").create("blk3", "Block");

//    In the Settings window for Block, locate the Size and Shape section.
//    In the Width text field, type IC2_l.

    model.component("comp1").geom("geom1").feature("blk3").set("size", new String[]{"IC2_l", "1", "1"});

//    In the Depth text field, type IC2_w.

    model.component("comp1").geom("geom1").feature("blk3").set("size", new String[]{"IC2_l", "IC2_w", "1"});

//    In the Height text field, type IC2_t.

    model.component("comp1").geom("geom1").feature("blk3").set("size", new String[]{"IC2_l", "IC2_w", "IC2_t"});

//    Locate the Position section.
//    In the x text field, type -60.

    model.component("comp1").geom("geom1").feature("blk3").set("pos", new double[]{-60, 0, 0});

//    In the y text field, type -60.

    model.component("comp1").geom("geom1").feature("blk3").set("pos", new double[]{-60, -60, 0});

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("blk3");

//    In the Geometry toolbar, click Transforms and choose Copy.

    model.component("comp1").geom("geom1").create("copy1", "Copy");

//    Select the object blk3.

    model.component("comp1").geom("geom1").feature("copy1").selection("input").set("blk3");

//    In the Settings window for Copy, locate the Displacement section.
//    In the x text field, type 0 0 0 0 range(30,30,60) 30.

    model.component("comp1").geom("geom1").feature("copy1").set("displx", "0 0 0 0 range(30,30,60) 30");

//    In the y text field, type range(25, 25, 100) 0 0 100.

    model.component("comp1").geom("geom1").feature("copy1").set("disply", "range(25, 25, 100) 0 0 100");

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("copy1");

//    In the Geometry toolbar, click Block.

    model.component("comp1").geom("geom1").create("blk4", "Block");

//    In the Settings window for Block, locate the Size and Shape section.
//    In the Width text field, type IC3_w.

    model.component("comp1").geom("geom1").feature("blk4").set("size", new String[]{"IC3_w", "1", "1"});

//    In the Depth text field, type IC3_l.

    model.component("comp1").geom("geom1").feature("blk4").set("size", new String[]{"IC3_w", "IC3_l", "1"});

//    In the Height text field, type IC3_t.

    model.component("comp1").geom("geom1").feature("blk4").set("size", new String[]{"IC3_w", "IC3_l", "IC3_t"});

//    Locate the Position section.
//    In the x text field, type 40.

    model.component("comp1").geom("geom1").feature("blk4").set("pos", new double[]{40, 0, 0});

//    In the y text field, type -50.

    model.component("comp1").geom("geom1").feature("blk4").set("pos", new double[]{40, -50, 0});

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("blk4");

//    In the Geometry toolbar, click Transforms and choose Copy.

    model.component("comp1").geom("geom1").create("copy2", "Copy");

//    Select the object blk4.

    model.component("comp1").geom("geom1").feature("copy2").selection("input").set("blk4");

//    In the Settings window for Copy, locate the Displacement section.
//    In the y text field, type 50.

    model.component("comp1").geom("geom1").feature("copy2").set("disply", 50);

//    In the Geometry toolbar, click Build All.

    model.component("comp1").geom("geom1").run("fin");

//    In the Definitions toolbar, click Explicit.

    model.component("comp1").selection().create("sel1", "Explicit");

//    In the Settings window for Explicit, type ICs, Type 1 in the Label text field.

    model.component("comp1").selection("sel1").label("ICs, Type 1");

//    Select Domain 9.

    model.component("comp1").selection("sel1").set(9);

//    It might be easier to select the correct domain by using the <l>Selection List</l> window. To open this window, in the <l>Home</l> toolbar click <l>Windows</l> and choose <l>Selection List</l>. (If you are running the cross-platform desktop, you find <l>Windows</l> in the main menu.)
//    In the Definitions toolbar, click Explicit.

    model.component("comp1").selection().create("sel2", "Explicit");

//    In the Settings window for Explicit, type ICs, Type 2 in the Label text field.

    model.component("comp1").selection("sel2").label("ICs, Type 2");

//    Select Domains 2, 3, 4, 5, 6, 7, 8, 10.

    model.component("comp1").selection("sel2").set(2, 3, 4, 5, 6, 7, 8, 10);

//    In the Definitions toolbar, click Explicit.

    model.component("comp1").selection().create("sel3", "Explicit");

//    In the Settings window for Explicit, type ICs, Type 3 in the Label text field.

    model.component("comp1").selection("sel3").label("ICs, Type 3");

//    Select Domains 11, 12.

    model.component("comp1").selection("sel3").set(11, 12);

//    In the Definitions toolbar, click Union.

    model.component("comp1").selection().create("uni1", "Union");

//    In the Settings window for Union, type ICs in the Label text field.

    model.component("comp1").selection("uni1").label("ICs");

//    Locate the Input Entities section.
//    Under Selections to add, click Add.
//    In the Add dialog, select ICs, Type 1 in the Selections to add list.
//    Click OK.

    model.component("comp1").selection("uni1").set("input", new String[]{"sel1"});

//    In the Settings window for Union, locate the Input Entities section.
//    Under Selections to add, click Add.
//    In the Add dialog, select ICs, Type 2 in the Selections to add list.
//    Click OK.

    model.component("comp1").selection("uni1").set("input", new String[]{"sel1", "sel2"});

//    In the Settings window for Union, locate the Input Entities section.
//    Under Selections to add, click Add.
//    In the Add dialog, select ICs, Type 3 in the Selections to add list.
//    Click OK.

    model.component("comp1").selection("uni1").set("input", new String[]{"sel1", "sel2", "sel3"});

//    In the Materials toolbar, click Add Material to open the Add Material window.
//    In the tree, select Built-in > Silica glass.
//    Click Add to Component in the window toolbar.

    model.component("comp1").material().create("mat1", "Common");
    model.component("comp1").material("mat1").propertyGroup()
         .create("Enu", "Enu", "Young's modulus and Poisson's ratio");
    model.component("comp1").material("mat1").propertyGroup()
         .create("RefractiveIndex", "RefractiveIndex", "Refractive index");
    model.component("comp1").material("mat1").label("Silica glass");
    model.component("comp1").material("mat1").set("family", "custom");
    model.component("comp1").material("mat1").set("diffuse", "custom");
    model.component("comp1").material("mat1").set("ambient", "custom");
    model.component("comp1").material("mat1").set("noise", true);
    model.component("comp1").material("mat1").set("fresnel", 0.99);
    model.component("comp1").material("mat1").set("roughness", 0.02);
    model.component("comp1").material("mat1").set("diffusewrap", 0);
    model.component("comp1").material("mat1").set("reflectance", 0);
    model.component("comp1").material("mat1").propertyGroup("def")
         .set("relpermeability", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat1").propertyGroup("def")
         .set("electricconductivity", new String[]{"1e-14[S/m]", "0", "0", "0", "1e-14[S/m]", "0", "0", "0", "1e-14[S/m]"});
    model.component("comp1").material("mat1").propertyGroup("def")
         .set("thermalexpansioncoefficient", new String[]{"0.55e-6[1/K]", "0", "0", "0", "0.55e-6[1/K]", "0", "0", "0", "0.55e-6[1/K]"});
    model.component("comp1").material("mat1").propertyGroup("def").set("heatcapacity", "703[J/(kg*K)]");
    model.component("comp1").material("mat1").propertyGroup("def")
         .set("relpermittivity", new String[]{"3.75", "0", "0", "0", "3.75", "0", "0", "0", "3.75"});
    model.component("comp1").material("mat1").propertyGroup("def").set("density", "2203[kg/m^3]");
    model.component("comp1").material("mat1").propertyGroup("def")
         .set("thermalconductivity", new String[]{"1.38[W/(m*K)]", "0", "0", "0", "1.38[W/(m*K)]", "0", "0", "0", "1.38[W/(m*K)]"});
    model.component("comp1").material("mat1").propertyGroup("Enu").set("E", "73.1[GPa]");
    model.component("comp1").material("mat1").propertyGroup("Enu").set("nu", "0.17");
    model.component("comp1").material("mat1").propertyGroup("RefractiveIndex")
         .set("n", new String[]{"1.45", "0", "0", "0", "1.45", "0", "0", "0", "1.45"});

//    In the tree, select Built-in > FR4 (Circuit Board).
//    Click Add to Component in the window toolbar.

    model.component("comp1").material().create("mat2", "Common");
    model.component("comp1").material("mat2").propertyGroup()
         .create("Enu", "Enu", "Young's modulus and Poisson's ratio");
    model.component("comp1").material("mat2").label("FR4 (Circuit Board)");
    model.component("comp1").material("mat2").set("family", "pcb");
    model.component("comp1").material("mat2").set("color", "custom");
    model.component("comp1").material("mat2").set("customcolor", "0 0.5019607843137255 0.25098039215686274");
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("relpermeability", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("electricconductivity", new String[]{"0.004[S/m]", "0", "0", "0", "0.004[S/m]", "0", "0", "0", "0.004[S/m]"});
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("relpermittivity", new String[]{"4.5", "0", "0", "0", "4.5", "0", "0", "0", "4.5"});
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("thermalexpansioncoefficient", new String[]{"18e-6[1/K]", "0", "0", "0", "18e-6[1/K]", "0", "0", "0", "18e-6[1/K]"});
    model.component("comp1").material("mat2").propertyGroup("def").set("heatcapacity", "1369[J/(kg*K)]");
    model.component("comp1").material("mat2").propertyGroup("def").set("density", "1900[kg/m^3]");
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("thermalconductivity", new String[]{"0.3[W/(m*K)]", "0", "0", "0", "0.3[W/(m*K)]", "0", "0", "0", "0.3[W/(m*K)]"});
    model.component("comp1").material("mat2").propertyGroup("Enu").set("E", "22[GPa]");
    model.component("comp1").material("mat2").propertyGroup("Enu").set("nu", "0.15");

//    In the Materials toolbar, click Add Material to close the Add Material window.
//    In the Settings window for Material, locate the Geometric Entity Selection section.
//    From the Selection list, select ICs.

    model.component("comp1").material("mat1").selection().named("uni1");

//    In the Model Builder window, click FR4 (Circuit Board) (mat2).
//    Select Domain 1.

    model.component("comp1").material("mat2").selection().set(1);

//    Here, the PC board needs to have an orthotropic thermal conductivity to account for conduction induced by several copper tracks in the \[xy\]-planes of the board.
//    In the Settings window for Material, locate the Material Contents section.
//    In the table, enter the following settings:

    model.component("comp1").material("mat2").propertyGroup("def")
         .set("thermalconductivity", new String[]{"80[W/(m*K)]", "80[W/(m*K)]", "0.3[W/(m*K)]"});

//    In the Model Builder window, under Component 1 (comp1) > Heat Transfer in Solids (ht), click Initial Values 1.
//    In the Settings window for Initial Values, locate the Initial Values section.
//    In the \[T\] text field, type T0.

    model.component("comp1").physics("ht").feature("init1").set("Tinit", "T0");

//    In the Physics toolbar, click Domains and choose Heat Source.

    model.component("comp1").physics("ht").create("hs1", "HeatSource", 3);

//    In the Settings window for Heat Source, locate the Domain Selection section.
//    From the Selection list, select ICs, Type 1.

    model.component("comp1").physics("ht").feature("hs1").selection().named("sel1");

//    Locate the Heat Source section.
//    From the Heat source list, select Heat rate.

    model.component("comp1").physics("ht").feature("hs1").set("heatSourceType", "HeatRate");

//    In the \[P_0\] text field, type P1.

    model.component("comp1").physics("ht").feature("hs1").set("P0", "P1");

//    In the Physics toolbar, click Domains and choose Heat Source.

    model.component("comp1").physics("ht").create("hs2", "HeatSource", 3);

//    In the Settings window for Heat Source, locate the Domain Selection section.
//    From the Selection list, select ICs, Type 2.

    model.component("comp1").physics("ht").feature("hs2").selection().named("sel2");

//    Locate the Heat Source section.
//    From the Heat source list, select Heat rate.

    model.component("comp1").physics("ht").feature("hs2").set("heatSourceType", "HeatRate");

//    In the \[P_0\] text field, type P2*8.

    model.component("comp1").physics("ht").feature("hs2").set("P0", "P2*8");

//    In the Physics toolbar, click Domains and choose Heat Source.

    model.component("comp1").physics("ht").create("hs3", "HeatSource", 3);

//    In the Settings window for Heat Source, locate the Domain Selection section.
//    From the Selection list, select ICs, Type 3.

    model.component("comp1").physics("ht").feature("hs3").selection().named("sel3");

//    Locate the Heat Source section.
//    From the Heat source list, select Heat rate.

    model.component("comp1").physics("ht").feature("hs3").set("heatSourceType", "HeatRate");

//    In the \[P_0\] text field, type P3*2.

    model.component("comp1").physics("ht").feature("hs3").set("P0", "P3*2");

//    In the Physics toolbar, click Boundaries and choose Heat Flux.

    model.component("comp1").physics("ht").create("hf1", "HeatFluxBoundary", 2);

//    In the Settings window for Heat Flux, locate the Heat Flux section.
//    From the Flux type list, select Convective heat flux.

    model.component("comp1").physics("ht").feature("hf1").set("HeatFluxType", "ConvectiveHeatFlux");

//    In the \[h\] text field, type htc.

    model.component("comp1").physics("ht").feature("hf1").set("h", "htc");

//    In the \[T_{\textrm{ext}}\] text field, type T0.

    model.component("comp1").physics("ht").feature("hf1").set("Text", "T0");

//    In the followings, select boundaries 1 to 72. For more convenience, use the <l>Paste Selection</l> button.
//    Locate the Boundary Selection section.
//    Click Paste Selection.
//    In the Paste Selection dialog, type 1-72 in the Selection text field.
//    Click OK.

    model.component("comp1").physics("ht").feature("hf1").selection()
         .set(1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 68, 69, 70, 71, 72);

//    In the Study toolbar, click Compute.

    model.study("std1").createAutoSequences("all");

    model.sol("sol1").runAll();

    model.result().create("pg1", "PlotGroup3D");
    model.result("pg1").label("Temperature (ht)");
    model.result("pg1").set("smooth", "internal");
    model.result("pg1").feature().create("vol1", "Volume");
    model.result("pg1").feature("vol1").set("solutionparams", "parent");
    model.result("pg1").feature("vol1").set("colortable", "HeatCameraLight");
    model.result("pg1").feature("vol1").set("smooth", "internal");
    model.result("pg1").feature("vol1").set("data", "parent");
    model.result("pg1").run();

//    In the Settings window for 3D Plot Group, type Temperature Without Heat Sink in the Label text field.

    model.result("pg1").label("Temperature Without Heat Sink");

//    This is the first temperature distribution. It clearly outlines that the main chip needs more efficient cooling. This is the aim of the next part in which a disk-stack heat sink will be added on the top of the central chip.
//    In the Geometry toolbar, click Block.

    model.component("comp1").geom("geom1").run("copy2");
    model.component("comp1").geom("geom1").create("blk5", "Block");

//    In the Settings window for Block, locate the Size and Shape section.
//    In the Width text field, type IC1_w.

    model.component("comp1").geom("geom1").feature("blk5").set("size", new String[]{"IC1_w", "1", "1"});

//    In the Depth text field, type IC1_l.

    model.component("comp1").geom("geom1").feature("blk5").set("size", new String[]{"IC1_w", "IC1_l", "1"});

//    In the Height text field, type IC1_t.

    model.component("comp1").geom("geom1").feature("blk5").set("size", new String[]{"IC1_w", "IC1_l", "IC1_t"});

//    Locate the Position section.
//    In the x text field, type -CB_w/2+IC1_w.

    model.component("comp1").geom("geom1").feature("blk5").set("pos", new String[]{"-CB_w/2+IC1_w", "0", "0"});

//    In the y text field, type -CB_l/2+IC1_l.

    model.component("comp1").geom("geom1").feature("blk5").setIndex("pos", "-CB_l/2+IC1_l", 1);

//    In the z text field, type IC1_t.

    model.component("comp1").geom("geom1").feature("blk5").setIndex("pos", "IC1_t", 2);

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("blk5");

//    In the Geometry toolbar, click Cylinder.

    model.component("comp1").geom("geom1").create("cyl1", "Cylinder");

//    In the Settings window for Cylinder, locate the Object Type section.
//    From the Type list, select Surface.

    model.component("comp1").geom("geom1").feature("cyl1").set("type", "surface");

//    Locate the Size and Shape section.
//    In the Radius text field, type i_radius.

    model.component("comp1").geom("geom1").feature("cyl1").set("r", "i_radius");

//    In the Height text field, type t_h.

    model.component("comp1").geom("geom1").feature("cyl1").set("h", "t_h");

//    Locate the Position section.
//    In the z text field, type IC1_t*2.

    model.component("comp1").geom("geom1").feature("cyl1").set("pos", new String[]{"0", "0", "IC1_t*2"});

//    Locate the Selections of Resulting Entities section.
//    Find the Cumulative selection subsection.
//    Click New.
//    In the New Cumulative Selection dialog, type Fins in the Name text field.
//    Click OK.

    model.component("comp1").geom("geom1").selection().create("csel1", "CumulativeSelection");
    model.component("comp1").geom("geom1").selection("csel1").label("Fins");
    model.component("comp1").geom("geom1").feature("cyl1").set("contributeto", "csel1");

//    In the Settings window for Cylinder, click Build Selected.

    model.component("comp1").geom("geom1").run("cyl1");

//    In the Geometry toolbar, click Work Plane.

    model.component("comp1").geom("geom1").create("wp1", "WorkPlane");
    model.component("comp1").geom("geom1").feature("wp1").set("unite", true);

//    In the Settings window for Work Plane, locate the Plane Definition section.
//    From the Plane type list, select Face parallel.

    model.component("comp1").geom("geom1").feature("wp1").set("planetype", "faceparallel");

//    On the object blk5, select Boundary 4.

    model.component("comp1").geom("geom1").feature("wp1").selection("face").set("blk5", 4);

//    In the Offset in normal direction text field, type air_sp.

    model.component("comp1").geom("geom1").feature("wp1").set("offset", "air_sp");

//    Click Go to Plane Geometry.
//    In the Work Plane toolbar, click Circle.

    model.component("comp1").geom("geom1").feature("wp1").geom().create("c1", "Circle");

//    In the Settings window for Circle, locate the Size and Shape section.
//    In the Radius text field, type i_radius.

    model.component("comp1").geom("geom1").feature("wp1").geom().feature("c1").set("r", "i_radius");

//    Click Build Selected.

    model.component("comp1").geom("geom1").feature("wp1").geom().run("c1");

//    Click the Zoom Extents button in the Graphics toolbar.
//    In the Work Plane toolbar, click Circle.

    model.component("comp1").geom("geom1").feature("wp1").geom().create("c2", "Circle");

//    In the Settings window for Circle, locate the Size and Shape section.
//    In the Radius text field, type o_radius.

    model.component("comp1").geom("geom1").feature("wp1").geom().feature("c2").set("r", "o_radius");

//    Click Build Selected.

    model.component("comp1").geom("geom1").feature("wp1").geom().run("c2");

//    Click the Zoom Extents button in the Graphics toolbar.
//    In the Work Plane toolbar, click Booleans and Partitions and choose Difference.

    model.component("comp1").geom("geom1").feature("wp1").geom().create("dif1", "Difference");

//    Select the object c2.

    model.component("comp1").geom("geom1").feature("wp1").geom().feature("dif1").selection("input").set("c2");

//    In the Settings window for Difference, locate the Difference section.
//    Select the Activate Selection toggle button for Objects to subtract.
//    Select the object c1.

    model.component("comp1").geom("geom1").feature("wp1").geom().feature("dif1").selection("input2").set("c1");

//    Click Build Selected.

    model.component("comp1").geom("geom1").feature("wp1").geom().run("dif1");

//    In the Model Builder window, under Component 1 (comp1) > Geometry 1, click Work Plane 1 (wp1).
//    In the Settings window for Work Plane, locate the Selections of Resulting Entities section.
//    Find the Cumulative selection subsection.
//    From the Contribute to list, select Fins.

    model.component("comp1").geom("geom1").feature("wp1").set("contributeto", "csel1");

//    Click Build Selected.

    model.component("comp1").geom("geom1").run("wp1");

//    In the Geometry toolbar, click Transforms and choose Array.

    model.component("comp1").geom("geom1").create("arr1", "Array");

//    Select the object wp1.

    model.component("comp1").geom("geom1").feature("arr1").selection("input").set("wp1");

//    In the Settings window for Array, locate the Size section.
//    From the Array type list, select Linear.

    model.component("comp1").geom("geom1").feature("arr1").set("type", "linear");

//    In the Size text field, type n_fins.

    model.component("comp1").geom("geom1").feature("arr1").set("linearsize", "n_fins");

//    Locate the Displacement section.
//    In the z text field, type air_sp.

    model.component("comp1").geom("geom1").feature("arr1").set("displ", new String[]{"0", "0", "air_sp"});

//    Locate the Selections of Resulting Entities section.
//    Find the Cumulative selection subsection.
//    From the Contribute to list, select Fins.

    model.component("comp1").geom("geom1").feature("arr1").set("contributeto", "csel1");

//    In the Geometry toolbar, click Build All.

    model.component("comp1").geom("geom1").run("fin");

//    In the Materials toolbar, click Add Material to open the Add Material window.
//    In the tree, select Built-in > Aluminum.
//    Click Add to Component in the window toolbar.

    model.component("comp1").material().create("mat3", "Common");
    model.component("comp1").material("mat3").propertyGroup()
         .create("Enu", "Enu", "Young's modulus and Poisson's ratio");
    model.component("comp1").material("mat3").propertyGroup().create("Murnaghan", "Murnaghan", "Murnaghan");
    model.component("comp1").material("mat3").label("Aluminum");
    model.component("comp1").material("mat3").set("family", "aluminum");
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("relpermeability", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat3").propertyGroup("def").set("heatcapacity", "900[J/(kg*K)]");
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("thermalconductivity", new String[]{"238[W/(m*K)]", "0", "0", "0", "238[W/(m*K)]", "0", "0", "0", "238[W/(m*K)]"});
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("electricconductivity", new String[]{"3.774e7[S/m]", "0", "0", "0", "3.774e7[S/m]", "0", "0", "0", "3.774e7[S/m]"});
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("relpermittivity", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("thermalexpansioncoefficient", new String[]{"23e-6[1/K]", "0", "0", "0", "23e-6[1/K]", "0", "0", "0", "23e-6[1/K]"});
    model.component("comp1").material("mat3").propertyGroup("def").set("density", "2700[kg/m^3]");
    model.component("comp1").material("mat3").propertyGroup("Enu").set("E", "70[GPa]");
    model.component("comp1").material("mat3").propertyGroup("Enu").set("nu", "0.33");
    model.component("comp1").material("mat3").propertyGroup("Murnaghan").set("l", "-250[GPa]");
    model.component("comp1").material("mat3").propertyGroup("Murnaghan").set("m", "-330[GPa]");
    model.component("comp1").material("mat3").propertyGroup("Murnaghan").set("n", "-350[GPa]");

//    In the tree, select Built-in > Aluminum.
//    Click Add to Component in the window toolbar.

    model.component("comp1").material().create("mat4", "Common");
    model.component("comp1").material("mat4").propertyGroup()
         .create("Enu", "Enu", "Young's modulus and Poisson's ratio");
    model.component("comp1").material("mat4").propertyGroup().create("Murnaghan", "Murnaghan", "Murnaghan");
    model.component("comp1").material("mat4").label("Aluminum 1");
    model.component("comp1").material("mat4").set("family", "aluminum");
    model.component("comp1").material("mat4").propertyGroup("def")
         .set("relpermeability", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat4").propertyGroup("def").set("heatcapacity", "900[J/(kg*K)]");
    model.component("comp1").material("mat4").propertyGroup("def")
         .set("thermalconductivity", new String[]{"238[W/(m*K)]", "0", "0", "0", "238[W/(m*K)]", "0", "0", "0", "238[W/(m*K)]"});
    model.component("comp1").material("mat4").propertyGroup("def")
         .set("electricconductivity", new String[]{"3.774e7[S/m]", "0", "0", "0", "3.774e7[S/m]", "0", "0", "0", "3.774e7[S/m]"});
    model.component("comp1").material("mat4").propertyGroup("def")
         .set("relpermittivity", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat4").propertyGroup("def")
         .set("thermalexpansioncoefficient", new String[]{"23e-6[1/K]", "0", "0", "0", "23e-6[1/K]", "0", "0", "0", "23e-6[1/K]"});
    model.component("comp1").material("mat4").propertyGroup("def").set("density", "2700[kg/m^3]");
    model.component("comp1").material("mat4").propertyGroup("Enu").set("E", "70[GPa]");
    model.component("comp1").material("mat4").propertyGroup("Enu").set("nu", "0.33");
    model.component("comp1").material("mat4").propertyGroup("Murnaghan").set("l", "-250[GPa]");
    model.component("comp1").material("mat4").propertyGroup("Murnaghan").set("m", "-330[GPa]");
    model.component("comp1").material("mat4").propertyGroup("Murnaghan").set("n", "-350[GPa]");

//    In the Materials toolbar, click Add Material to close the Add Material window.
//    Select Domain 10.

    return model;
  }

  public static Model run2(Model model) {

    model.component("comp1").material("mat3").selection().set(10);

//    In the Model Builder window, under Component 1 (comp1) > Materials, click Aluminum 1 (mat4).
//    In the Settings window for Material, type Aluminum Fins in the Label text field.

    model.component("comp1").material("mat4").label("Aluminum Fins");

//    Locate the Geometric Entity Selection section.
//    From the Geometric entity level list, select Boundary.

    model.component("comp1").material("mat4").selection().geom("geom1", 2);

//    From the Selection list, select Fins.

    model.component("comp1").material("mat4").selection().named("geom1_csel1_bnd");

//    It is necessary to add a second <l>Aluminum</l> material since the first one is used on a different geometric-entity level.
//    Add the newly created external boundaries of the heat sink base.
//    In the Model Builder window, under Component 1 (comp1) > Heat Transfer in Solids (ht), click Heat Flux 1.
//    In the Settings window for Heat Flux, locate the Boundary Selection section.
//    Click Paste Selection.
//    In the Paste Selection dialog, type 49 50 52 64 115 in the Selection text field.
//    Click OK.

    model.component("comp1").physics("ht").feature("hf1").selection()
         .set(1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 63, 64, 65, 66, 88, 89, 91, 92, 113, 114, 115, 116, 117, 119, 120, 121, 122, 124, 125, 126, 127, 128);

//    In the Physics toolbar, click Boundaries and choose Thermal Contact.

    model.component("comp1").physics("ht").create("tc1", "ThermalContact", 2);

//    In the Settings window for Thermal Contact, locate the Boundary Selection section.
//    Click Paste Selection.
//    In the Paste Selection dialog, type 51 in the Selection text field.
//    Click OK.

    model.component("comp1").physics("ht").feature("tc1").selection().set(51);

//    In the Settings window for Thermal Contact, locate the Thermal Contact section.
//    From the \[h_\textrm{g}\] list, select Parallel-plate gap gas conductance.

    model.component("comp1").physics("ht").feature("tc1").set("hgType", "PPG");

//    Locate the Contact Surface Properties section.
//    In the \[p\] text field, type 20[kPa].

    model.component("comp1").physics("ht").feature("tc1").set("Tn", "20[kPa]");

//    In the \[H_\textrm{c}\] text field, type 165[MPa].

    model.component("comp1").physics("ht").feature("tc1").set("Hmic", "165[MPa]");

//    Click to expand the Gap Properties section.
//    From the \[k_\textrm{gap}\] list, select User defined.

    model.component("comp1").physics("ht").feature("tc1").set("kgap_mat", "userdef");

//    In the Home toolbar, click Add Physics to open the Add Physics window.
//    In the tree, select Heat Transfer > Thin Structures > Heat Transfer in Shells (htlsh).
//    Click to expand the Dependent Variables section.
//    A new physics interface is required here to take into account out-of-plane convective cooling. In the physics interface selection, you have to use the same temperature variable, <c>T</c>, to couple the two physics interfaces.
//    Click Add to Component 1 in the window toolbar.

    model.component("comp1").physics().create("htlsh", "HeatTransferInShellsLM", "geom1");

//    In the Home toolbar, click Add Physics to close the Add Physics window.
//    In the Settings window for Heat Transfer in Shells, locate the Boundary Selection section.
//    From the Selection list, select Fins.

    model.component("comp1").physics("htlsh").selection().named("geom1_csel1_bnd");

//    In the Physics toolbar, click Boundaries and choose Heat Flux, Interface.

    model.component("comp1").physics("htlsh").create("hfi1", "HeatFluxInterface", 2);

//    In the Settings window for Heat Flux, Interface, locate the Boundary Selection section.
//    From the Selection list, select Fins.

    model.component("comp1").physics("htlsh").feature("hfi1").selection().named("geom1_csel1_bnd");

//    Locate the Heat Flux section.
//    From the Flux type list, select Convective heat flux.

    model.component("comp1").physics("htlsh").feature("hfi1").set("HeatFluxType", "ConvectiveHeatFlux");

//    In the \[h\] text field, type htc.

    model.component("comp1").physics("htlsh").feature("hfi1").set("h", "htc");

//    In the \[T_{\textrm{ext}}\] text field, type T0.

    model.component("comp1").physics("htlsh").feature("hfi1").set("Text", "T0");

//    In the Model Builder window, under Component 1 (comp1) > Materials, click Aluminum Fins (mat4).
//    In the Settings window for Material, locate the Material Contents section.
//    In the table, enter the following settings:

    model.component("comp1").material("mat4").propertyGroup().create("shell", "shell", "Shell");
    model.component("comp1").material("mat4").propertyGroup("shell").set("lth", new String[]{"e_fins"});

//    In the Physics toolbar, click Multiphysics Couplings and choose Edge > Thermal Connection, Layered Shell, Edges.

    model.component("comp1").multiphysics().create("tcls1", "ThermalConnectionLayeredShellEdges", 1);

//    In the Home toolbar, click Add Study to open the Add Study window.
//    Find the Studies subsection.
//    In the Select Study tree, select General Studies > Stationary.
//    Right-click and choose Add Study.

    model.study().create("std2");
    model.study("std2").create("stat", "Stationary");

//    In the Home toolbar, click Add Study to close the Add Study window.
//    In the Study toolbar, click Compute.

    model.study("std2").createAutoSequences("all");

    model.sol("sol2").runAll();

    model.result().create("pg2", "PlotGroup3D");
    model.result("pg2").label("Temperature (ht)");
    model.result("pg2").set("data", "dset2");
    model.result("pg2").set("smooth", "internal");
    model.result("pg2").feature().create("vol1", "Volume");
    model.result("pg2").feature("vol1").set("solutionparams", "parent");
    model.result("pg2").feature("vol1").set("colortable", "HeatCameraLight");
    model.result("pg2").feature("vol1").set("smooth", "internal");
    model.result("pg2").feature("vol1").set("data", "parent");
    model.result().dataset().create("lshl1", "LayeredMaterial");
    model.result().dataset("lshl1").set("data", "dset2");
    model.result().dataset("lshl1").selection().geom("geom1", 2);
    model.result().dataset("lshl1").selection()
         .set(53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112);
    model.result().create("pg3", "PlotGroup3D");
    model.result("pg3").label("Temperature, Shell (htlsh)");
    model.result("pg3").set("data", "dset2");
    model.result("pg3").set("smooth", "internal");
    model.result("pg3").feature().create("vol1", "Volume");
    model.result("pg3").feature("vol1").set("data", "lshl1");
    model.result("pg3").feature("vol1").set("solutionparams", "parent");
    model.result("pg3").feature("vol1").set("expr", "T2");
    model.result("pg3").feature("vol1").set("colortable", "HeatCameraLight");
    model.result("pg3").feature("vol1").set("smooth", "internal");
    model.result("pg3").feature("vol1").set("data", "lshl1");
    model.result("pg2").run();

//    In the Model Builder window, under Results, Ctrl-click to select Temperature (ht), Temperature, Shell (htlsh).
//    Right-click and choose Delete.

    model.result().remove("pg2");
    model.result().remove("pg3");

//    In the Results toolbar, click Result Templates to open the Result Templates window.
//    In the tree, select Study 2/Solution 2 (sol2) > Thermal Connection, Layered Shell, Edges 1 > Temperature (tcls1).
//    Click Add Result Template in the window toolbar.

    model.result().create("pg2", "PlotGroup3D");
    model.result("pg2").label("Temperature (tcls1)");
    model.result("pg2").set("data", "dset2");
    model.result("pg2").feature().create("vol1", "Volume");
    model.result("pg2").feature("vol1").set("solutionparams", "parent");
    model.result("pg2").feature("vol1").set("colortable", "HeatCameraLight");
    model.result("pg2").feature("vol1").set("smooth", "internal");
    model.result("pg2").feature("vol1").set("data", "parent");
    model.result("pg2").feature().create("vol2", "Volume");
    model.result("pg2").feature("vol2").set("solutionparams", "parent");
    model.result("pg2").feature("vol2").set("expr", "T2");
    model.result("pg2").feature("vol2").set("titletype", "none");
    model.result("pg2").feature("vol2").set("smooth", "internal");
    model.result("pg2").feature("vol2").set("data", "lshl1");
    model.result("pg2").feature("vol2").set("inheritplot", "vol1");
    model.result("pg2").feature().create("line1", "Line");
    model.result("pg2").feature("line1").set("solutionparams", "parent");
    model.result("pg2").feature("line1").set("expr", "1");
    model.result("pg2").feature("line1").set("titletype", "none");
    model.result("pg2").feature("line1").set("coloring", "uniform");
    model.result("pg2").feature("line1").set("color", "fromtheme");
    model.result("pg2").feature("line1").set("smooth", "internal");
    model.result("pg2").feature("line1").set("data", "lshl1");
    model.result("pg2").label("Temperature (tcls1)");
    model.result("pg2").run();

//    In the Results toolbar, click Result Templates to close the Result Templates window.
//    In the Settings window for 3D Plot Group, type Temperature With Heat Sink in the Label text field.

    model.result("pg2").label("Temperature With Heat Sink");

//    In the Temperature With Heat Sink toolbar, click Plot.

    model.result("pg2").run();

//    This is the temperature profile once the heat sink has been added. The heat sink significantly reduces the average temperature of the main chip.
//    In the Materials toolbar, click Add Material to open the Add Material window.
//    In the tree, select Built-in > Copper.
//    Click Add to Component in the window toolbar.

    model.component("comp1").material().create("mat5", "Common");
    model.component("comp1").material("mat5").propertyGroup()
         .create("Enu", "Enu", "Young's modulus and Poisson's ratio");
    model.component("comp1").material("mat5").propertyGroup().create("linzRes", "linzRes", "Linearized resistivity");
    model.component("comp1").material("mat5").label("Copper");
    model.component("comp1").material("mat5").set("family", "copper");
    model.component("comp1").material("mat5").propertyGroup("def")
         .set("relpermeability", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat5").propertyGroup("def")
         .set("electricconductivity", new String[]{"5.998e7[S/m]", "0", "0", "0", "5.998e7[S/m]", "0", "0", "0", "5.998e7[S/m]"});
    model.component("comp1").material("mat5").propertyGroup("def")
         .set("thermalexpansioncoefficient", new String[]{"17e-6[1/K]", "0", "0", "0", "17e-6[1/K]", "0", "0", "0", "17e-6[1/K]"});
    model.component("comp1").material("mat5").propertyGroup("def").set("heatcapacity", "385[J/(kg*K)]");
    model.component("comp1").material("mat5").propertyGroup("def")
         .set("relpermittivity", new String[]{"1", "0", "0", "0", "1", "0", "0", "0", "1"});
    model.component("comp1").material("mat5").propertyGroup("def").set("density", "8960[kg/m^3]");
    model.component("comp1").material("mat5").propertyGroup("def")
         .set("thermalconductivity", new String[]{"400[W/(m*K)]", "0", "0", "0", "400[W/(m*K)]", "0", "0", "0", "400[W/(m*K)]"});
    model.component("comp1").material("mat5").propertyGroup("Enu").set("E", "110[GPa]");
    model.component("comp1").material("mat5").propertyGroup("Enu").set("nu", "0.35");
    model.component("comp1").material("mat5").propertyGroup("linzRes").set("rho0", "1.72e-8[ohm*m]");
    model.component("comp1").material("mat5").propertyGroup("linzRes").set("alpha", "0.0039[1/K]");
    model.component("comp1").material("mat5").propertyGroup("linzRes").set("Tref", "298[K]");
    model.component("comp1").material("mat5").propertyGroup("linzRes").addInput("temperature");

//    In the Materials toolbar, click Add Material to close the Add Material window.
//    In the Physics toolbar, click Boundaries and choose Thin Layer.

    model.component("comp1").physics("ht").create("sls1", "SolidLayeredShell", 2);

//    In the Settings window for Thin Layer, locate the Layer Model section.
//    From the Layer type list, select Thermally thin approximation.

    model.component("comp1").physics("ht").feature("sls1").set("LayerType", "Conductive");

//    Select Boundary 3.

    model.component("comp1").physics("ht").feature("sls1").selection().set(3);

//    In the Model Builder window, under Component 1 (comp1) > Materials, click Copper (mat5).
//    In the Settings window for Material, locate the Geometric Entity Selection section.
//    From the Geometric entity level list, select Boundary.

    model.component("comp1").material("mat5").selection().geom("geom1", 2);

//    Select Boundary 3.

    model.component("comp1").material("mat5").selection().set(3);

//    Locate the Material Contents section.
//    In the table, enter the following settings:

    model.component("comp1").material("mat5").propertyGroup().create("shell", "shell", "Shell");
    model.component("comp1").material("mat5").propertyGroup("shell").set("lth", new String[]{"e_fins"});

//    In the Study toolbar, click Compute.

    model.study("std2").createAutoSequences("all");

    model.sol("sol2").runAll();

    model.result("pg2").run();

//    This is the temperature profile once the copper layer has been added. No significant effect due to this modification can be observed.
//    In order to visualize the temperature on each side of the thermal contact, follow the next steps.
//    In the Results toolbar, click Result Templates to open the Result Templates window.
//    In the tree, select Study 2/Solution 2 (sol2) > Heat Transfer in Solids > Contact Temperature (ht).
//    Click Add Result Template in the window toolbar.

    model.result().create("pg3", "PlotGroup3D");
    model.result("pg3").label("Contact Temperature (ht)");
    model.result("pg3").set("data", "dset2");
    model.result("pg3").set("smooth", "internal");
    model.result("pg3").feature().create("slit1", "SurfaceSlit");
    model.result("pg3").feature("slit1").set("solutionparams", "parent");
    model.result("pg3").feature("slit1").set("updescractive", true);
    model.result("pg3").feature("slit1").set("upexpr", "ht.Tu");
    model.result("pg3").feature("slit1").set("updescr", "Upside temperature");
    model.result("pg3").feature("slit1").set("downdescractive", true);
    model.result("pg3").feature("slit1").set("downexpr", "ht.Td");
    model.result("pg3").feature("slit1").set("downdescr", "Downside temperature");
    model.result("pg3").feature("slit1").set("colortable", "HeatCameraLight");
    model.result("pg3").feature("slit1").set("smooth", "internal");
    model.result("pg3").feature("slit1").set("data", "parent");
    model.result("pg3").feature("slit1").feature().create("sel1", "Selection");
    model.result("pg3").feature("slit1").feature("sel1").selection().geom("geom1", 2);
    model.result("pg3").feature("slit1").feature("sel1").selection().set(51);
    model.result("pg3").label("Contact Temperature (ht)");
    model.result("pg3").run();

//    In the Results toolbar, click Result Templates to close the Result Templates window.
//    In the Settings window for 3D Plot Group, type Contact Temperature With Heat Sink in the Label text field.

    model.result("pg3").label("Contact Temperature With Heat Sink");

//    Finally, check the maximum temperature over the component.
//    In the Results toolbar, click More Derived Values and choose Maximum > Volume Maximum.

    model.result().numerical().create("max1", "MaxVolume");

//    In the Settings window for Volume Maximum, type Maximum Temperature in the Label text field.

    model.result().numerical("max1").label("Maximum Temperature");

//    Locate the Data section.
//    From the Dataset list, select Study 2/Solution 2 (sol2).

    model.result().numerical("max1").set("data", "dset2");

//    Locate the Selection section.
//    From the Selection list, select All domains.

    model.result().numerical("max1").selection().all();

//    Locate the Expressions section.
//    In the table, enter the following settings:

    model.result().numerical("max1").setIndex("descr", "Maximum temperature", 0);

//    Click Evaluate.

    model.result().table().create("tbl1", "Table");
    model.result().table("tbl1").comments("Maximum Temperature");
    model.result().numerical("max1").set("table", "tbl1");
    model.result().numerical("max1").setResult();
    model.result("pg3").run();

    model.title("Disk-Stack Heat Sink");

    model
         .description("This example studies the cooling effects of a disk-stack heat sink on an electronic component. The heat sink consists of several thin aluminum disks piled up around a central hollow column. Such a configuration allows cooling of large surfaces of aluminum fins by air at ambient temperature.");

    return model;
  }

  public static void main(String[] args) {
    Model model = run();
    run2(model);
  }

}
