Material Inversion Example: Convective Boundary Condition

Background

The MOOSE optimization module provides a flexible framework for solving inverse optimization problems in MOOSE. This page is part of a set of examples for different types of inverse optimization problems.

Example: Convective Boundary Condition

In this example, the convective coefficient from this equation Inverse Optimization, Eq. (12) is fit to experimental data. This is a nonlinear optimization problem but is limited to a boundary condition and will be easier to solve than material property inversion presented in Example 2: Constant Thermal Conductivity. This problem consists of a rectangular domain where the convective BC is applied to on the left. The top and bottom BCs are Dirichlet and the right BC is Neumann. This is a nonlinear optimization problem where the design parameters show up in the derivative of the PDE, see this section from the theory page. Getting a nonlinear optimization problem to converge is dependent on the initial guess and bounds for the design parameters. Convergence is limited to local minima and doesn't guarantee a global minimum. All of this makes material inversion problems more difficult to solve than the linear optimization problems for force inversion.

Main-App Optimization Executioner

The main input file containing the optimization reporter, executioner and transfers is shown in Listing 1. The adjoint problem will need the simulation temperature from the forward problem to evaluate Inverse Optimization, Eq. (31) for the convective BC. This requires us to transfer the forward simulation temperature field to the adjoint-app.

Listing 1:

[Optimization<<<{"href": "../../../syntax/Optimization/index.html"}>>>]
[]

[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
  [gmg]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
    nx<<<{"description": "Number of elements in the X direction"}>>> = 10
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 20
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 1
    ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 2
  []
[]

[OptimizationReporter<<<{"href": "../../../syntax/OptimizationReporter/index.html"}>>>]
  type = GeneralOptimization
  objective_name = objective_value
  parameter_names = 'p1'
  num_values = '1'
  initial_condition = '9'
  upper_bounds = '10'
  lower_bounds = '1'
[]

[Reporters<<<{"href": "../../../syntax/Reporters/index.html"}>>>]
  [main]
    type = OptimizationData<<<{"description": "Reporter to hold measurement and simulation data for optimization problems", "href": "../../../source/reporters/OptimizationData.html"}>>>
    measurement_points<<<{"description": "Point locations corresponding to each measurement value"}>>> = '0.1  0  0
                        0.1  0.1  0
                        0.1  0.2  0
                        0.1  0.3  0
                        0.1  0.4  0
                        0.1  0.5  0
                        0.1  0.6  0
                        0.1  0.7  0
                        0.1  0.8  0
                        0.1  0.9  0
                        0.1  1  0
                        0.1  1.1  0
                        0.1  1.2  0
                        0.1  1.3  0
                        0.1  1.4  0
                        0.1  1.5  0
                        0.1  1.6  0
                        0.1  1.7  0
                        0.1  1.8  0
                        0.1  1.9  0
                        0.1  2    0'
    measurement_values<<<{"description": "Measurement values collected from locations given by measurement_points"}>>> = '500
                        472.9398111
                        450.8117197
                        434.9560747
                        423.3061045
                        414.9454912
                        409.3219399
                        406.1027006
                        405.0865428
                        406.1604905
                        409.2772668
                        414.4449772
                        421.7253934
                        431.2401042
                        443.1862012
                        457.8664824
                        475.7450186
                        497.5582912
                        524.4966003
                        559.1876637
                        600'
  []
[]

[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
  type = Optimize
  tao_solver = taoblmvm #taolmvm#taonm #taolmvm
  petsc_options_iname = '-tao_gatol' # -tao_fd_gradient -tao_fd_delta'
  petsc_options_value = '1e-4' #1e-1 '#true 1e-4'
[]

[MultiApps<<<{"href": "../../../syntax/MultiApps/index.html"}>>>]
  [forward]
    type = FullSolveMultiApp<<<{"description": "Performs a complete simulation during each execution.", "href": "../../../source/multiapps/FullSolveMultiApp.html"}>>>
    input_files<<<{"description": "The input file for each App.  If this parameter only contains one input file it will be used for all of the Apps.  When using 'positions_from_file' it is also admissable to provide one input_file per file."}>>> = forward.i
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "FORWARD"
    clone_parent_mesh<<<{"description": "True to clone parent app mesh and use it for this MultiApp."}>>> = true
  []
  [adjoint]
    type = FullSolveMultiApp<<<{"description": "Performs a complete simulation during each execution.", "href": "../../../source/multiapps/FullSolveMultiApp.html"}>>>
    input_files<<<{"description": "The input file for each App.  If this parameter only contains one input file it will be used for all of the Apps.  When using 'positions_from_file' it is also admissable to provide one input_file per file."}>>> = adjoint.i
    execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = "ADJOINT"
    clone_parent_mesh<<<{"description": "True to clone parent app mesh and use it for this MultiApp."}>>> = true
  []
[]

[Transfers<<<{"href": "../../../syntax/Transfers/index.html"}>>>]
  #these are usually the same for all input files.
  [toForward]
    type = MultiAppReporterTransfer<<<{"description": "Transfers reporter data between two applications.", "href": "../../../source/transfers/MultiAppReporterTransfer.html"}>>>
    to_multi_app<<<{"description": "The name of the MultiApp to transfer the data to"}>>> = forward
    from_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value from."}>>> = 'main/measurement_xcoord
                      main/measurement_ycoord
                      main/measurement_zcoord
                      main/measurement_time
                      main/measurement_values
                      OptimizationReporter/p1'
    to_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value to."}>>> = 'measure_data/measurement_xcoord
                    measure_data/measurement_ycoord
                    measure_data/measurement_zcoord
                    measure_data/measurement_time
                    measure_data/measurement_values
                    params/vals'
  []
  [fromForward]
    type = MultiAppReporterTransfer<<<{"description": "Transfers reporter data between two applications.", "href": "../../../source/transfers/MultiAppReporterTransfer.html"}>>>
    from_multi_app<<<{"description": "The name of the MultiApp to receive data from"}>>> = forward
    from_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value from."}>>> = 'measure_data/misfit_values measure_data/objective_value'
    to_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value to."}>>> = 'main/misfit_values OptimizationReporter/objective_value'
  []
  [toAdjoint]
    type = MultiAppReporterTransfer<<<{"description": "Transfers reporter data between two applications.", "href": "../../../source/transfers/MultiAppReporterTransfer.html"}>>>
    to_multi_app<<<{"description": "The name of the MultiApp to transfer the data to"}>>> = adjoint
    from_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value from."}>>> = 'main/measurement_xcoord
                      main/measurement_ycoord
                      main/measurement_zcoord
                      main/measurement_time
                      main/misfit_values
                      OptimizationReporter/p1'
    to_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value to."}>>> = 'misfit/measurement_xcoord
                    misfit/measurement_ycoord
                    misfit/measurement_zcoord
                    misfit/measurement_time
                    misfit/misfit_values
                    params/vals'
  []
  [fromAdjoint]
    type = MultiAppReporterTransfer<<<{"description": "Transfers reporter data between two applications.", "href": "../../../source/transfers/MultiAppReporterTransfer.html"}>>>
    from_multi_app<<<{"description": "The name of the MultiApp to receive data from"}>>> = adjoint
    from_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value from."}>>> = 'adjoint_pt/inner_product'
    to_reporters<<<{"description": "List of the reporter names (object_name/value_name) to transfer the value to."}>>> = 'OptimizationReporter/grad_p1'
  []

  # these are transferring data from subapp to subapp because the adjoint problem
  # needs the forward solution to compute the gradient.  Maybe this step could be
  # done on the main app.  The adjoint only passes the adjoint variable (whole mesh)
  # to the main app and the main app computes the gradient from this.
  [fromForwardtoAdjoint_temp]
    type = MultiAppCopyTransfer<<<{"description": "Copies variables (nonlinear and auxiliary) between multiapps that have identical meshes.", "href": "../../../source/transfers/MultiAppCopyTransfer.html"}>>>
    from_multi_app<<<{"description": "The name of the MultiApp to receive data from"}>>> = forward
    to_multi_app<<<{"description": "The name of the MultiApp to transfer the data to"}>>> = adjoint
    source_variable<<<{"description": "The variable to transfer from."}>>> = 'temperature'
    variable<<<{"description": "The auxiliary variable to store the transferred values in."}>>> = 'temperature_forward'
  []
[]

[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/test/tests/optimization/invOpt_bc_convective/main.i)

Forward Problem Sub-App

The forward input file containing the solution to the PDE of interest is shown in Listing 2. The optimization executioner is controlling the coefficient in [ConvectiveFluxFunction] boundary condition. The coefficient is controlled by transferring data from the main-app into a chain of objects on the forward-app. The main-app first transfers the convection coefficient into a [ConstantValuePostprocessor] on the forward-app, which is then transferred into a function that can finally be transferred into the ConvectiveFluxFunction BC.

Listing 2:

[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
  [gmg]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
    nx<<<{"description": "Number of elements in the X direction"}>>> = 10
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 20
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 1
    ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 2
  []
[]

[Variables<<<{"href": "../../../syntax/Variables/index.html"}>>>]
  [temperature]
  []
[]

[Kernels<<<{"href": "../../../syntax/Kernels/index.html"}>>>]
  [heat_conduction]
    type = ADHeatConduction<<<{"description": "Same as `Diffusion` in terms of physics/residual, but the Jacobian is computed using forward automatic differentiation", "href": "../../../source/kernels/ADHeatConduction.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
  []
[]

[BCs<<<{"href": "../../../syntax/BCs/index.html"}>>>]
  [left]
    type = ConvectiveFluxFunction<<<{"description": "Determines boundary value by fluid heat transfer coefficient and far-field temperature", "href": "../../../source/bcs/ConvectiveFluxFunction.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'left'
    T_infinity<<<{"description": "Function describing far-field temperature"}>>> = 100.0
    coefficient<<<{"description": "Function describing heat transfer coefficient"}>>> = function1
  []
  [right]
    type = NeumannBC<<<{"description": "Imposes the integrated boundary condition $\\frac{\\partial u}{\\partial n}=h$, where $h$ is a constant, controllable value.", "href": "../../../source/bcs/NeumannBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
    value<<<{"description": "For a Laplacian problem, the value of the gradient dotted with the normals on the boundary."}>>> = -100
  []
  [bottom]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = bottom
    value<<<{"description": "Value of the BC"}>>> = 500
  []
  [top]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = top
    value<<<{"description": "Value of the BC"}>>> = 600
  []
[]

[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
  [steel]
    type = ADGenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../../../source/materials/GenericConstantMaterial.html"}>>>
    prop_names<<<{"description": "The names of the properties this material will have"}>>> = thermal_conductivity
    prop_values<<<{"description": "The values associated with the named properties"}>>> = 5
  []
[]

[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
  type = Steady
  solve_type = PJFNK
  nl_abs_tol = 1e-6
  nl_rel_tol = 1e-8
  petsc_options_iname = '-pc_type'
  petsc_options_value = 'lu'
[]

[Functions<<<{"href": "../../../syntax/Functions/index.html"}>>>]
  [function1]
    type = ParsedOptimizationFunction<<<{"description": "Function used for optimization that uses a parsed expression with parameter dependence.", "href": "../../../source/functions/ParsedOptimizationFunction.html"}>>>
    expression<<<{"description": "The user defined function."}>>> = 'a'
    param_symbol_names<<<{"description": "Names of parameters in 'expression' being optimized."}>>> = 'a'
    param_vector_name<<<{"description": "Reporter or VectorPostprocessor vector containing parameter values."}>>> = 'params/vals'
  []
[]

[VectorPostprocessors<<<{"href": "../../../syntax/VectorPostprocessors/index.html"}>>>]
  [vertical]
    type = LineValueSampler<<<{"description": "Samples variable(s) along a specified line", "href": "../../../source/vectorpostprocessors/LineValueSampler.html"}>>>
    variable<<<{"description": "The names of the variables that this VectorPostprocessor operates on"}>>> = 'temperature'
    start_point<<<{"description": "The beginning of the line"}>>> = '0.1 0.0 0.0'
    end_point<<<{"description": "The ending of the line"}>>> = '0.1 2.0 0.0'
    num_points<<<{"description": "The number of points to sample along the line"}>>> = 21
    sort_by<<<{"description": "What to sort the samples by"}>>> = id
  []
[]

[Reporters<<<{"href": "../../../syntax/Reporters/index.html"}>>>]
  [measure_data]
    type = OptimizationData<<<{"description": "Reporter to hold measurement and simulation data for optimization problems", "href": "../../../source/reporters/OptimizationData.html"}>>>
    objective_name<<<{"description": "Name of reporter value defining the objective."}>>> = objective_value
    variable<<<{"description": "Vector of variable names to sample at measurement points."}>>> = temperature
  []
  [params]
    type = ConstantReporter<<<{"description": "Reporter with constant values to be accessed by other objects, can be modified using transfers.", "href": "../../../source/reporters/ConstantReporter.html"}>>>
    real_vector_names<<<{"description": "Names for each vector of reals value."}>>> = 'vals'
    real_vector_values<<<{"description": "Values for vectors of reals."}>>> = '0' # Dummy value
  []
[]

[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = false
  console<<<{"description": "Output the results using the default settings for Console output"}>>> = false
  file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = 'forward'
[]
(modules/combined/test/tests/optimization/invOpt_bc_convective/forward.i)

Adjoint Problem Sub-App

The adjoint input file shown in Listing 3 computes the adjoint of the forward PDE. The adjoint problem uses a Controls block to allow the main app to transfer the material property used in the forward problem to the adjoint problem. The temperature field computed in the forward problem was transferred back to the main app and is finally transferred from the main app into the adjoint problem using a MultiAppCopyTransfer. The gradient given by Inverse Optimization, Eq. (31) is computed on the left boundary using the SideIntegralVariablePostprocessor postprocessor.

Listing 3:

[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
  [gmg]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
    nx<<<{"description": "Number of elements in the X direction"}>>> = 10
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 20
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 1
    ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 2
  []
[]

[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
  [temperature_forward]
  []
  [T2]
  []
[]

[AuxKernels<<<{"href": "../../../syntax/AuxKernels/index.html"}>>>]
  [TT]
    type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
    args = 'temperature temperature_forward'
    variable<<<{"description": "The name of the variable that this object applies to"}>>> = T2
    function = 'temperature*(100-temperature_forward)'
  []
[]

[Variables<<<{"href": "../../../syntax/Variables/index.html"}>>>]
  [temperature]
  []
[]

[Kernels<<<{"href": "../../../syntax/Kernels/index.html"}>>>]
  [heat_conduction]
    type = ADHeatConduction<<<{"description": "Same as `Diffusion` in terms of physics/residual, but the Jacobian is computed using forward automatic differentiation", "href": "../../../source/kernels/ADHeatConduction.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
  []
[]

[DiracKernels<<<{"href": "../../../syntax/DiracKernels/index.html"}>>>]
  [pt]
    type = ReporterPointSource<<<{"description": "Apply a point load defined by Reporter.", "href": "../../../source/dirackernels/ReporterPointSource.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    x_coord_name<<<{"description": "reporter x-coordinate name.  This uses the reporter syntax <reporter>/<name>."}>>> = misfit/measurement_xcoord
    y_coord_name<<<{"description": "reporter y-coordinate name.  This uses the reporter syntax <reporter>/<name>."}>>> = misfit/measurement_ycoord
    z_coord_name<<<{"description": "reporter z-coordinate name.  This uses the reporter syntax <reporter>/<name>."}>>> = misfit/measurement_zcoord
    value_name<<<{"description": "reporter value name.  This uses the reporter syntax <reporter>/<name>."}>>> = misfit/misfit_values
  []
[]

[Reporters<<<{"href": "../../../syntax/Reporters/index.html"}>>>]
  [misfit]
    type = OptimizationData<<<{"description": "Reporter to hold measurement and simulation data for optimization problems", "href": "../../../source/reporters/OptimizationData.html"}>>>
  []
  [params]
    type = ConstantReporter<<<{"description": "Reporter with constant values to be accessed by other objects, can be modified using transfers.", "href": "../../../source/reporters/ConstantReporter.html"}>>>
    real_vector_names<<<{"description": "Names for each vector of reals value."}>>> = 'vals'
    real_vector_values<<<{"description": "Values for vectors of reals."}>>> = '0' # Dummy value
  []
[]

[BCs<<<{"href": "../../../syntax/BCs/index.html"}>>>]
  [left]
    type = ConvectiveFluxFunction<<<{"description": "Determines boundary value by fluid heat transfer coefficient and far-field temperature", "href": "../../../source/bcs/ConvectiveFluxFunction.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'left'
    T_infinity<<<{"description": "Function describing far-field temperature"}>>> = 0.0
    coefficient<<<{"description": "Function describing heat transfer coefficient"}>>> = function1
  []
  [right]
    type = NeumannBC<<<{"description": "Imposes the integrated boundary condition $\\frac{\\partial u}{\\partial n}=h$, where $h$ is a constant, controllable value.", "href": "../../../source/bcs/NeumannBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
    value<<<{"description": "For a Laplacian problem, the value of the gradient dotted with the normals on the boundary."}>>> = 0
  []
  [bottom]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = bottom
    value<<<{"description": "Value of the BC"}>>> = 0
  []
  [top]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = top
    value<<<{"description": "Value of the BC"}>>> = 0
  []
[]

[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
  [steel]
    type = ADGenericConstantMaterial<<<{"description": "Declares material properties based on names and values prescribed by input parameters.", "href": "../../../source/materials/GenericConstantMaterial.html"}>>>
    prop_names<<<{"description": "The names of the properties this material will have"}>>> = thermal_conductivity
    prop_values<<<{"description": "The values associated with the named properties"}>>> = 5
  []
[]

[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
  type = Steady
  solve_type = PJFNK
  nl_abs_tol = 1e-6
  nl_rel_tol = 1e-8
  petsc_options_iname = '-pc_type'
  petsc_options_value = 'lu'
[]

[Functions<<<{"href": "../../../syntax/Functions/index.html"}>>>]
  [function1]
    type = ParsedOptimizationFunction<<<{"description": "Function used for optimization that uses a parsed expression with parameter dependence.", "href": "../../../source/functions/ParsedOptimizationFunction.html"}>>>
    expression<<<{"description": "The user defined function."}>>> = 'a'
    param_symbol_names<<<{"description": "Names of parameters in 'expression' being optimized."}>>> = 'a'
    param_vector_name<<<{"description": "Reporter or VectorPostprocessor vector containing parameter values."}>>> = 'params/vals'
  []
[]

[VectorPostprocessors<<<{"href": "../../../syntax/VectorPostprocessors/index.html"}>>>]
  [adjoint_pt]
    type = SideOptimizationNeumannFunctionInnerProduct<<<{"description": "Computes the inner product of variable with parameterized Neumann function for optimization gradient computation.", "href": "../../../source/vectorpostprocessors/SideOptimizationNeumannFunctionInnerProduct.html"}>>>
    variable<<<{"description": "Variable used for inner product calculation, usually the adjoint variable."}>>> = T2
    function<<<{"description": "Optimization function."}>>> = function1
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = left
  []
[]

[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
  console<<<{"description": "Output the results using the default settings for Console output"}>>> = false
  exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = false
  file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = 'adjoint'
[]
(modules/combined/test/tests/optimization/invOpt_bc_convective/adjoint.i)