# Forward simulations -- Evaluating objective function only without design modules

 Register Blogs Members List Search Today's Posts Mark Forums Read

 April 16, 2020, 11:31 Forward simulations -- Evaluating objective function only without design modules #1 New Member   kensaii Join Date: Jul 2017 Posts: 3 Rep Power: 6 Hi, I'm brand new to SU2. I work more on the optimization field and I would like to use SU2 to benchmark some of my optimization algorithm if possible. My question is if I only want to enable forward evaluation in these modules, is there any way to do so? I only need a set of design variables and output objective. The rest can be considered as a black-box. Please let me know if it is possible. I have looked for a while but couldn't find anything feasible. Thank you in advance for your time and kind help. Best,

 April 16, 2020, 16:12 #2 Senior Member   Pedro Gomes Join Date: Dec 2017 Posts: 406 Rep Power: 10 Hello, By forward evaluation do you mean y = f(x) with no derivatives involved? (for us forward is usually the forward mode of differentiation). If this is what you are after you need to combine two modules, SU2_DEF that deforms a the grid according to some design variables, and SU2_CFD / SU2_GEO to evaluate fluid or geometric objective functions respectively.

April 21, 2020, 22:41
#3
New Member

kensaii
Join Date: Jul 2017
Posts: 3
Rep Power: 6
Quote:
 Originally Posted by pcg Hello, By forward evaluation do you mean y = f(x) with no derivatives involved? (for us forward is usually the forward mode of differentiation). If this is what you are after you need to combine two modules, SU2_DEF that deforms a the grid according to some design variables, and SU2_CFD / SU2_GEO to evaluate fluid or geometric objective functions respectively.
Dear Pedro,

Thank you very much for your answer. It was very helpful, and your interpretation is correct (for me, forward is used as opposed to inverse, i.e. forward problems vs. inverse problems). I looked particularly close to a few examples in evaluating objectives and their associated design optimization example

Code:
```cd Tutorials

meld ./incompressible_flow/Inc_Inviscid_Hydrofoil/inv_naca0012.cfg ./design/Inviscid_2D_Unconstrained_NACA0012/inv_NACA0012_basic.cfg

meld ./compressible_flow/Inviscid_Wedge/inv_wedge_HLLC.cfg ./design/Multi_Objective_Shape_Design/inv_wedge_ROE_multiobj_combo.cfg```
I stumbled on a concept that many people have had the same question, DEFINITION_DV, for example, in inv_NACA0012_basic.cfg and inv_wedge_ROE_multiobj_combo.cfg. I just couldn't find a way to explicitly define input design variables and dump output objectives (while they are explicitly defined in the .cfg file). This brings me back to the same question that I had before, can I explicitly define inputs/outputs and consider the rest as a black-box function?

I tried to follow your example, SU2_DEF to deform the grid and SU2_CFD to evaluate objectives. For example, said you have a baseline design in Tutorials/incompressible_flow/inv_inviscid_hydrofoil/inv_naca0012.cfg

Code:
```%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                              %
% SU2 configuration file                                                       %
% Case description: Incompressible flow hydrofoil 5 degrees                    %
% Author: Francisco Palacios & Thomas D. Economon                              %
% Date: 6.10.2018                                                              %
% File Version 6.1.0 "Falcon"                                                  %
%                                                                              %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------%
%
% Physical governing equations (EULER, NAVIER_STOKES,
%                               WAVE_EQUATION, HEAT_EQUATION, FEM_ELASTICITY,
%                               POISSON_EQUATION)
SOLVER= INC_EULER
%
MATH_PROBLEM= DIRECT
%
% Restart solution (NO, YES)
RESTART_SOL= NO

% ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------%
%
% Initial density for incompressible flows
% (1.2886 kg/m^3 by default (air), 998.2 Kg/m^3 (water))
INC_DENSITY_INIT= 998.2
%
% Initial velocity for incompressible flows (1.0,0,0 m/s by default)
INC_VELOCITY_INIT= ( 1.775, 0.0, 0.0 )
%
% List of inlet types for incompressible flows. List length must
% match number of inlet markers. Options: VELOCITY_INLET, PRESSURE_INLET.
INC_INLET_TYPE= VELOCITY_INLET
%
% Damping coefficient for iterative updates at pressure inlets. (0.1 by default)
INC_INLET_DAMPING= 0.1
%
% List of outlet types for incompressible flows. List length must
% match number of outlet markers. Options: PRESSURE_OUTLET, MASS_FLOW_OUTLET
INC_OUTLET_TYPE= PRESSURE_OUTLET
%
% Damping coefficient for iterative updates at mass flow outlets. (0.1 by default)
INC_OUTLET_DAMPING= 0.1

% ---------------------- REFERENCE VALUE DEFINITION ---------------------------%
%
% Reference origin for moment computation
REF_ORIGIN_MOMENT_X = 0.25
REF_ORIGIN_MOMENT_Y = 0.00
REF_ORIGIN_MOMENT_Z = 0.00
%
% Reference length for pitching, rolling, and yawing non-dimensional moment
REF_LENGTH= 1.0
%
% Reference area for force coefficients (0 implies automatic calculation)
REF_AREA= 1.0

% ----------------------- BOUNDARY CONDITION DEFINITION -----------------------%
%
% Euler wall boundary marker(s) (NONE = no marker)
MARKER_EULER= ( airfoil, lower_wall, upper_wall )
%
% Inlet boundary marker(s) with the following formats (NONE = no marker)
% Incompressible: (inlet marker, temperature, velocity magnitude, flow_direction_x,
%           flow_direction_y, flow_direction_z, ... ) where flow_direction is
%           a unit vector.
MARKER_INLET= ( inlet, 0.0, 1.775, 1.0, 0.0, 0.0 )
%
% Outlet boundary marker(s) (NONE = no marker)
MARKER_OUTLET= ( outlet, 0.0 )
%
% Marker(s) of the surface to be plotted or designed
MARKER_PLOTTING= ( airfoil )
%
% Marker(s) of the surface where the functional (Cd, Cl, etc.) will be evaluated
MARKER_MONITORING= ( airfoil )

% ------------- COMMON PARAMETERS TO DEFINE THE NUMERICAL METHOD --------------%
%
% Numerical method for spatial gradients (GREEN_GAUSS, WEIGHTED_LEAST_SQUARES)
%
% Courant-Friedrichs-Lewy condition of the finest grid
CFL_NUMBER= 1e6
%
% Adaptive CFL number (NO, YES)
%
% Parameters of the adaptive CFL number (factor down, factor up, CFL min value,
%                                        CFL max value )
CFL_ADAPT_PARAM= ( 1.5, 0.5, 1.0, 100.0 )
%
% Runge-Kutta alpha coefficients
RK_ALPHA_COEFF= ( 0.66667, 0.66667, 1.000000 )
%
% Number of total iterations
ITER= 9999

% ------------------------ LINEAR SOLVER DEFINITION ---------------------------%
%
% Linear solver or smoother for implicit formulations (BCGSTAB, FGMRES, SMOOTHER_JACOBI,
%                                                      SMOOTHER_ILU, SMOOTHER_LUSGS,
%                                                      SMOOTHER_LINELET)
LINEAR_SOLVER= FGMRES
%
% Preconditioner of the Krylov linear solver (ILU, LU_SGS, LINELET, JACOBI)
LINEAR_SOLVER_PREC= ILU
%
% Linael solver ILU preconditioner fill-in level (0 by default)
LINEAR_SOLVER_ILU_FILL_IN= 0
%
% Minimum error of the linear solver for implicit formulations
LINEAR_SOLVER_ERROR= 1E-15
%
% Max number of iterations of the linear solver for the implicit formulation
LINEAR_SOLVER_ITER= 25

% -------------------------- MULTIGRID PARAMETERS -----------------------------%
%
% Multi-Grid Levels (0 = no multi-grid)
MGLEVEL= 0
%
% Multi-grid cycle (V_CYCLE, W_CYCLE, FULLMG_CYCLE)
MGCYCLE= W_CYCLE
%
% Multi-grid pre-smoothing level
MG_PRE_SMOOTH= ( 1, 2, 3, 3 )
%
% Multi-grid post-smoothing level
MG_POST_SMOOTH= ( 1, 1, 1, 1 )
%
% Jacobi implicit smoothing of the correction
MG_CORRECTION_SMOOTH= ( 1, 1, 1, 1 )
%
% Damping factor for the residual restriction
MG_DAMP_RESTRICTION= 0.85
%
% Damping factor for the correction prolongation
MG_DAMP_PROLONGATION= 0.85

% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------%
%
% Convective numerical method (JST, LAX-FRIEDRICH, CUSP, ROE, AUSM, HLLC,
%                              TURKEL_PREC, MSW)
CONV_NUM_METHOD_FLOW= JST
%
% 2nd and 4th order artificial dissipation coefficients
JST_SENSOR_COEFF= ( 0.0, 0.02 )
%
% Time discretization (RUNGE-KUTTA_EXPLICIT, EULER_IMPLICIT, EULER_EXPLICIT)
TIME_DISCRE_FLOW= EULER_IMPLICIT

% --------------------------- CONVERGENCE PARAMETERS --------------------------%
% Convergence criteria (CAUCHY, RESIDUAL)
%
CONV_FIELD= RMS_PRESSURE
%
% Min value of the residual (log10 of the residual)
CONV_RESIDUAL_MINVAL= -15
%
% Start Cauchy criteria at iteration number
CONV_STARTITER= 10
%
% Number of elements to apply the criteria
CONV_CAUCHY_ELEMS= 50
%
% Epsilon to control the series convergence
CONV_CAUCHY_EPS= 1E-6
%

% ------------------------- INPUT/OUTPUT INFORMATION --------------------------%
%
% Mesh input file
MESH_FILENAME= mesh_NACA0012_5deg_6814.su2
%
% Mesh input file format (SU2, CGNS, NETCDF_ASCII)
MESH_FORMAT= SU2
%
% Restart flow input file
SOLUTION_FILENAME= solution_flow.dat
%
% Output tabular format (CSV, TECPLOT)
TABULAR_FORMAT= CSV
%
% Output file convergence history (w/o extension)
CONV_FILENAME= history
%
% Output file restart flow
RESTART_FILENAME= restart_flow.dat
%
% Output file flow (w/o extension) variables
VOLUME_FILENAME= flow
%
% Output file surface flow coefficient (w/o extension)
SURFACE_FILENAME= surface_flow
%
% Writing solution file frequency
WRT_SOL_FREQ= 50
%
% Writing convergence history frequency
WRT_CON_FREQ= 1
%
% Screen output
SCREEN_OUTPUT= (INNER_ITER, WALL_TIME, RMS_PRESSURE, RMS_VELOCITY-X, LIFT, DRAG)```
It seems to me like shape_optimization.py deforms the geometry on-the-fly, which is something I try to intervene. And also the design variables aren't explicitly defined.

Code:
```% ----------------------- GEOMETRY EVALUATION PARAMETERS ----------------------%
%
% Marker(s) of the surface where geometrical based function will be evaluated
GEO_MARKER= ( airfoil )
%
% Description of the geometry to be analyzed (AIRFOIL, WING, FUSELAGE)
GEO_DESCRIPTION= AIRFOIL
%
% Geometrical evaluation mode (FUNCTION, GRADIENT)
GEO_MODE= FUNCTION

% ----------------------- DESIGN VARIABLE PARAMETERS --------------------------%
%
% Kind of deformation (FFD_SETTING, HICKS_HENNE, HICKS_HENNE_NORMAL, PARABOLIC,
%                      HICKS_HENNE_SHOCK, NACA_4DIGITS, DISPLACEMENT, ROTATION,
%                      FFD_CONTROL_POINT, FFD_DIHEDRAL_ANGLE, FFD_TWIST_ANGLE,
%                      FFD_ROTATION)
DV_KIND= HICKS_HENNE
%
% Marker of the surface in which we are going apply the shape deformation
DV_MARKER= ( airfoil )
%
% Parameters of the shape deformation
%     - HICKS_HENNE_FAMILY ( Lower(0)/Upper(1) side, x_Loc )
%     - NACA_4DIGITS ( 1st digit, 2nd digit, 3rd and 4th digit )
%     - PARABOLIC ( 1st digit, 2nd and 3rd digit )
%     - DISPLACEMENT ( x_Disp, y_Disp, z_Disp )
%     - ROTATION ( x_Orig, y_Orig, z_Orig, x_End, y_End, z_End )
DV_PARAM= ( 1, 0.5 )
%
% Value of the shape deformation deformation
DV_VALUE= 1.0

% ------------------------ GRID DEFORMATION PARAMETERS ------------------------%
%
% Number of smoothing iterations for FEA mesh deformation
DEFORM_LINEAR_SOLVER_ITER= 500
%
% Number of nonlinear deformation iterations (surface deformation increments)
DEFORM_NONLINEAR_ITER= 1
%
% Print the residuals during mesh deformation to the console (YES, NO)
DEFORM_CONSOLE_OUTPUT= YES
%
% Minimum residual criteria for the linear solver convergence of grid deformation
DEFORM_LINEAR_SOLVER_ERROR= 1E-14
%
% Type of element stiffness imposed for FEA mesh deformation (INVERSE_VOLUME,
%                                          WALL_DISTANCE, CONSTANT_STIFFNESS)
DEFORM_STIFFNESS_TYPE= INVERSE_VOLUME

% --------------------------- CONVERGENCE PARAMETERS --------------------------%
% Convergence criteria (CAUCHY, RESIDUAL)
%
CONV_CRITERIA= RESIDUAL
%
%
% Min value of the residual (log10 of the residual)
CONV_RESIDUAL_MINVAL= -13
%
% Start Cauchy criteria at iteration number
CONV_STARTITER= 10
%
% Number of elements to apply the criteria
CONV_CAUCHY_ELEMS= 100
%
% Epsilon to control the series convergence
CONV_CAUCHY_EPS= 1E-6

% ------------------------- INPUT/OUTPUT INFORMATION --------------------------%
%
% Mesh input file
MESH_FILENAME= mesh_NACA0012_inv.su2
%
% Mesh input file format (SU2, CGNS, NETCDF_ASCII)
MESH_FORMAT= SU2
%
% Mesh output file
MESH_OUT_FILENAME= mesh_out.su2
%
% Restart flow input file
SOLUTION_FILENAME= solution_flow.dat
%
%
% Output tabular format (CSV, TECPLOT)
TABULAR_FORMAT= CSV
%
% Output file convergence history (w/o extension)
CONV_FILENAME= history
%
% Output file restart flow
RESTART_FILENAME= restart_flow.dat
%
%
% Output file flow (w/o extension) variables
VOLUME_FILENAME= flow
%
% Output file adjoint (w/o extension) variables
%
%
% Output file surface flow coefficient (w/o extension)
SURFACE_FILENAME= surface_flow
%
% Output file surface adjoint coefficient (w/o extension)
%
% Writing solution file frequency
WRT_SOL_FREQ= 250
%
% Writing solution file frequency for physical time steps (dual time)
WRT_SOL_FREQ_DUALTIME= 1
%
% Writing convergence history frequency
WRT_CON_FREQ= 1
%
% Writing convergence history frequency (dual time, only written to screen)
WRT_CON_FREQ_DUALTIME= 10
%
% Output rind layers in the solution files
WRT_HALO= NO
%
% Screen output
SCREEN_OUTPUT= (INNER_ITER, RMS_DENSITY, RMS_ENERGY, LIFT, DRAG)
%
% Output files
OUTPUT_FILES = (RESTART, PARAVIEW, SURFACE_PARAVIEW, SURFACE_CSV)

% --------------------- OPTIMAL SHAPE DESIGN DEFINITION -----------------------%
%
% Available flow based objective functions or constraint functions
%    DRAG, LIFT, SIDEFORCE, EFFICIENCY, BUFFET,
%    FORCE_X, FORCE_Y, FORCE_Z,
%    MOMENT_X, MOMENT_Y, MOMENT_Z,
%    THRUST, TORQUE, FIGURE_OF_MERIT,
%    EQUIVALENT_AREA, NEARFIELD_PRESSURE,
%    TOTAL_HEATFLUX, MAXIMUM_HEATFLUX,
%    INVERSE_DESIGN_PRESSURE, INVERSE_DESIGN_HEATFLUX,
%    SURFACE_TOTAL_PRESSURE, SURFACE_MASSFLOW
%    SURFACE_STATIC_PRESSURE, SURFACE_MACH
%
% Available geometrical based objective functions or constraint functions
%    AIRFOIL_AREA, AIRFOIL_THICKNESS, AIRFOIL_CHORD, AIRFOIL_TOC, AIRFOIL_AOA,
%    WING_VOLUME, WING_MIN_THICKNESS, WING_MAX_THICKNESS, WING_MAX_CHORD, WING_MIN_TOC, WING_MAX_TWIST, WING_MAX_CURVATURE, WING_MAX_DIHEDRAL
%    STATION#_WIDTH, STATION#_AREA, STATION#_THICKNESS, STATION#_CHORD, STATION#_TOC,
%    STATION#_TWIST (where # is the index of the station defined in GEO_LOCATION_STATIONS)
%
% Available design variables
% 2D Design variables
%    FFD_CONTROL_POINT_2D   (  19, Scale | Mark. List | FFD_BoxTag, i_Ind, j_Ind, x_Mov, y_Mov )
%    FFD_CAMBER_2D          (  20, Scale | Mark. List | FFD_BoxTag, i_Ind )
%    FFD_THICKNESS_2D       (  21, Scale | Mark. List | FFD_BoxTag, i_Ind )
%    FFD_TWIST_2D           (  22, Scale | Mark. List | FFD_BoxTag, x_Orig, y_Orig )
%    HICKS_HENNE            (  30, Scale | Mark. List | Lower(0)/Upper(1) side, x_Loc )
%    ANGLE_OF_ATTACK        ( 101, Scale | Mark. List | 1.0 )
%
% 3D Design variables
%    FFD_CONTROL_POINT      (  11, Scale | Mark. List | FFD_BoxTag, i_Ind, j_Ind, k_Ind, x_Mov, y_Mov, z_Mov )
%    FFD_NACELLE            (  12, Scale | Mark. List | FFD_BoxTag, rho_Ind, theta_Ind, phi_Ind, rho_Mov, phi_Mov )
%    FFD_GULL               (  13, Scale | Mark. List | FFD_BoxTag, j_Ind )
%    FFD_CAMBER             (  14, Scale | Mark. List | FFD_BoxTag, i_Ind, j_Ind )
%    FFD_TWIST              (  15, Scale | Mark. List | FFD_BoxTag, j_Ind, x_Orig, y_Orig, z_Orig, x_End, y_End, z_End )
%    FFD_THICKNESS          (  16, Scale | Mark. List | FFD_BoxTag, i_Ind, j_Ind )
%    FFD_ROTATION           (  18, Scale | Mark. List | FFD_BoxTag, x_Axis, y_Axis, z_Axis, x_Turn, y_Turn, z_Turn )
%    FFD_ANGLE_OF_ATTACK    (  24, Scale | Mark. List | FFD_BoxTag, 1.0 )
%
% Global design variables
%    TRANSLATION            (   1, Scale | Mark. List | x_Disp, y_Disp, z_Disp )
%    ROTATION               (   2, Scale | Mark. List | x_Axis, y_Axis, z_Axis, x_Turn, y_Turn, z_Turn )
%
% Optimization objective function with scaling factor, separated by semicolons.
% To include quadratic penalty function: use OPT_CONSTRAINT option syntax within the OPT_OBJECTIVE list.
% ex= Objective * Scale
OPT_OBJECTIVE= DRAG
%
% Optimization constraint functions with pushing factors (affects its value, not the gradient
% in the python scripts), separated by semicolons
% ex= (Objective = Value ) * Scale, use '>','<','='
OPT_CONSTRAINT= NONE
%
% Factor to reduce the norm of the gradient (affects the objective function and gradient in the python scripts)
% In general, a norm of the gradient ~1E-6 is desired.
%
% Factor to relax or accelerate the optimizer convergence (affects the line search in SU2_DEF)
% In general, surface deformations of 0.01'' or 0.0001m are desirable
OPT_RELAX_FACTOR= 1E3
%
% Maximum number of optimizer iterations
OPT_ITERATIONS= 100
%
% Requested accuracy
OPT_ACCURACY= 1E-10
%
% Upper bound for each design variable
OPT_BOUND_UPPER= 0.1
%
% Lower bound for each design variable
OPT_BOUND_LOWER= -0.1
%
% Optimization design variables, separated by semicolons
DEFINITION_DV= ( 30, 1.0 | airfoil | 0, 0.05 ); ( 30, 1.0 | airfoil | 0, 0.10 ); ( 30, 1.0 | airfoil | 0, 0.15 ); ( 30, 1.0 | airfoil | 0, 0.20 ); ( 30, 1.0 | airfoil | 0, 0.25 ); ( 30, 1.0 | airfoil | 0, 0.30 ); ( 30, 1.0 | airfoil | 0, 0.35 ); ( 30, 1.0 | airfoil | 0, 0.40 ); ( 30, 1.0 | airfoil | 0, 0.45 ); ( 30, 1.0 | airfoil | 0, 0.50 ); ( 30, 1.0 | airfoil | 0, 0.55 ); ( 30, 1.0 | airfoil | 0, 0.60 ); ( 30, 1.0 | airfoil | 0, 0.65 ); ( 30, 1.0 | airfoil | 0, 0.70 ); ( 30, 1.0 | airfoil | 0, 0.75 ); ( 30, 1.0 | airfoil | 0, 0.80 ); ( 30, 1.0 | airfoil | 0, 0.85 ); ( 30, 1.0 | airfoil | 0, 0.90 ); ( 30, 1.0 | airfoil | 0, 0.95 ); ( 30, 1.0 | airfoil | 1, 0.05 ); ( 30, 1.0 | airfoil | 1, 0.10 ); ( 30, 1.0 | airfoil | 1, 0.15 ); ( 30, 1.0 | airfoil | 1, 0.20 ); ( 30, 1.0 | airfoil | 1, 0.25 ); ( 30, 1.0 | airfoil | 1, 0.30 ); ( 30, 1.0 | airfoil | 1, 0.35 ); ( 30, 1.0 | airfoil | 1, 0.40 ); ( 30, 1.0 | airfoil | 1, 0.45 ); ( 30, 1.0 | airfoil | 1, 0.50 ); ( 30, 1.0 | airfoil | 1, 0.55 ); ( 30, 1.0 | airfoil | 1, 0.60 ); ( 30, 1.0 | airfoil | 1, 0.65 ); ( 30, 1.0 | airfoil | 1, 0.70 ); ( 30, 1.0 | airfoil | 1, 0.75 ); ( 30, 1.0 | airfoil | 1, 0.80 ); ( 30, 1.0 | airfoil | 1, 0.85 ); ( 30, 1.0 | airfoil | 1, 0.90 ); ( 30, 1.0 | airfoil | 1, 0.95 )```
Please let me know if there is a way to truncate/intervene the automatic workflow.

 April 24, 2020, 12:26 #4 Senior Member   Pedro Gomes Join Date: Dec 2017 Posts: 406 Rep Power: 10 Yes, you can consider DV_VALUE the (geometric) inputs and anything computed by running SU2_CFD until convergence as an output, for example the lift or drag coefficients, which you can read from the history file by setting up HISTORY_OUTPUT adequately (see https://su2code.github.io/docs_v7/Cu...history-output) The typical shape optimization process will always include SU2_DEF and SU2_CFD, if you want to use just SU2_CFD as an example black-box function to test your algorithm you can use angle off attack as a variable (for example), it would not be a very representative optimization anymore, but I suppose it would do the job.

April 25, 2020, 15:12
#5
New Member

kensaii
Join Date: Jul 2017
Posts: 3
Rep Power: 6
Quote:
 Originally Posted by pcg Yes, you can consider DV_VALUE the (geometric) inputs and anything computed by running SU2_CFD until convergence as an output, for example the lift or drag coefficients, which you can read from the history file by setting up HISTORY_OUTPUT adequately (see https://su2code.github.io/docs_v7/Cu...history-output) The typical shape optimization process will always include SU2_DEF and SU2_CFD, if you want to use just SU2_CFD as an example black-box function to test your algorithm you can use angle off attack as a variable (for example), it would not be a very representative optimization anymore, but I suppose it would do the job.

 Tags design; optimization; su2