From e2802f0d10f6d418debc8b8c8805e399c17d2ef1 Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Mon, 23 Jan 2023 13:45:27 +0100 Subject: [PATCH 01/16] Added python script which translates an MLP trained through Tensorflow to SU2 format --- .../MLP_Air/keras_metadata.pb | 7 + .../MLP_Air/saved_model.pb | Bin 0 -> 112848 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 28204 bytes .../MLP_Air/variables/variables.index | Bin 0 -> 1732 bytes common/multilayer_perceptron/README.md | 1 + .../multilayer_perceptron/Tensroflow2SU2.py | 69 +++++++++ common/multilayer_perceptron/write_SU2_MLP.py | 137 ++++++++++++++++++ 7 files changed, 214 insertions(+) create mode 100644 common/multilayer_perceptron/MLP_Air/keras_metadata.pb create mode 100644 common/multilayer_perceptron/MLP_Air/saved_model.pb create mode 100644 common/multilayer_perceptron/MLP_Air/variables/variables.data-00000-of-00001 create mode 100644 common/multilayer_perceptron/MLP_Air/variables/variables.index create mode 100644 common/multilayer_perceptron/README.md create mode 100644 common/multilayer_perceptron/Tensroflow2SU2.py create mode 100644 common/multilayer_perceptron/write_SU2_MLP.py diff --git a/common/multilayer_perceptron/MLP_Air/keras_metadata.pb b/common/multilayer_perceptron/MLP_Air/keras_metadata.pb new file mode 100644 index 0000000..3b0e6bd --- /dev/null +++ b/common/multilayer_perceptron/MLP_Air/keras_metadata.pb @@ -0,0 +1,7 @@ + +�'root"_tf_keras_sequential*�&{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "units": 50, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 30, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 6, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 10, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 2]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 2]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2]}, "float32", "dense_input"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2]}, "float32", "dense_input"]}, "keras_version": "2.9.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}, "shared_object_id": 0}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "units": 50, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 30, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 6, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9}]}}, "training_config": {"loss": "mean_squared_error", "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "mape", "dtype": "float32", "fn": "mean_absolute_percentage_error"}, "shared_object_id": 12}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": {"class_name": "ExponentialDecay", "config": {"initial_learning_rate": 0.001, "decay_steps": 100000, "decay_rate": 1.0, "staircase": false, "name": null}, "shared_object_id": 13}, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-08, "amsgrad": false}}}}2 +�root.layer_with_weights-0"_tf_keras_layer*�{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "units": 50, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2}}, "shared_object_id": 14}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2]}}2 +�root.layer_with_weights-1"_tf_keras_layer*�{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 30, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 50}}, "shared_object_id": 15}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 50]}}2 +�root.layer_with_weights-2"_tf_keras_layer*�{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 6, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 30}}, "shared_object_id": 16}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 30]}}2 +�Lroot.keras_api.metrics.0"_tf_keras_metric*�{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 17}2 +�Mroot.keras_api.metrics.1"_tf_keras_metric*�{"class_name": "MeanMetricWrapper", "name": "mape", "dtype": "float32", "config": {"name": "mape", "dtype": "float32", "fn": "mean_absolute_percentage_error"}, "shared_object_id": 12}2 \ No newline at end of file diff --git a/common/multilayer_perceptron/MLP_Air/saved_model.pb b/common/multilayer_perceptron/MLP_Air/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..c8c593fd07789b92d4ee68646506c09206478c20 GIT binary patch literal 112848 zcmeHwZEPG#b{KnxoEbiTNGwv)s40!O)c5R4oT(Xp&E4&;sMGFhKO`;1)!u%b=7wa8 zniGe^n;BBOdx?EM=j`*^XWaSD&UuqF5XEquwG#&p^5r0K&PiavKny2862p#z1aR!c zK@bF�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/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
    #Y>J;EIga0xkolsHa>cEI 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. + +import tensorflow as tf +import write_SU2_MLP + +# Input names for the SU2 MLP. For the CDataDrivenFluid class, these have to be "Density" and "Energy" +MLP_input_names = ["Density", "Energy"] +# The order of the input names should correspond to that of the trained model inputs. + +# Optional: give minimum and maximum input normalization values. These are required in case the MLP +# was trained on normalized input data. +input_min = [2.81038e-1, 1.79956e5] +input_max = [2.72979e+01, 4.48318e+05] + +# Output names for the SU2 MLP. For the CDataDrivenFluid class, these have to include the following: +MLP_output_names = ["s", # Entropy + "dsde_rho", # First entropy derivative w.r.t static energy + "dsdrho_e", # First entropy derivative w.r.t density + "d2sde2", # Second entropy derivative w.r.t static energy + "d2sdedrho",# Second entropy derivative w.r.t static energy and density + "d2sdrho2"] # Second entropy derivative w.r.t density +# The order of the output names should correspond to that of the trained model outputs. + +# Optional: give minimum and maximum output normalization values. These are required in case the MLP +# was trained on normalized training data. +output_min = [ 5.74729e+03, 1.66861e-03, -1.05632e+03, -2.15459e-08, + -4.20494e-06, 3.96917e-01] + +output_max = [ 7.77852e+03, 4.00000e-03, -1.07148e+01, -3.57370e-09, + -4.93767e-07, 3.75786e+03] + +# Saved Tensorflow model file name, saved with the "model.save" function after training. +Tensorflow_model_file = "MLP_Air" + +# SU2 MLP output file name (wo extension) +SU2_MLP_output_file = "MLP_Air_SU2" + +# Load the MLP trained through Tensorflow +Tensorflow_model = tf.keras.models.load_model(Tensorflow_model_file) + +# Write SU2 MLP input file +write_SU2_MLP(SU2_MLP_output_file, MLP_input_names, MLP_output_names, Tensorflow_model, input_min, input_max, output_min, output_max) + diff --git a/common/multilayer_perceptron/write_SU2_MLP.py b/common/multilayer_perceptron/write_SU2_MLP.py new file mode 100644 index 0000000..902fca5 --- /dev/null +++ b/common/multilayer_perceptron/write_SU2_MLP.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python + +## \file write_SU2_MLP.py +# \brief Python script for translating a trained Tensorflow model +# to an SU2 MLP input file. +# \author E.C.Bunschoten +# \version 7.5.0 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2012-2022, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + + +def write_SU2_MLP(file_out, input_names, output_names, model, input_min=[], input_max=[], output_min=[], output_max=[]): + # This function writes the MLP to a format which can be read by the SU2 MLP import tool + # Inputs: + # - file_out: output file name without extension + # - input_names: list of strings with the variable names of the MLP input(s) + # - output names: list of strings with the variable names of the MLP output(s) + # - model: tensorflow.keras.model; the trained model + # - input_min: lower normalization values for the input + # - input_max: upper normalization values for the input + # - output_min: lower normalization values for the output + # - output_max: upper normalization values for the output + + # MLP config + model_config = model.get_config() + + # Number of input variables in the model + n_inputs = model_config['layers'][0]['config']['batch_input_shape'][1] + # Number of output variables in the model + n_outputs = model_config['layers'][-1]['config']['units'] + + # Checking if number of provided input and output names are equal to those in the model + if not n_inputs == len(input_names): + raise Exception("Number of provided input names unequal to the number of inputs in the model") + if not n_outputs == len(output_names): + raise Exception("Number of provided output names unequal to the number of outputs in the model") + + if len(input_max) != len(input_min): + raise Exception("Upper and lower input normalizations should have the same length") + if len(output_max) != len(output_min): + raise Exception("Upper and lower output normalizations should have the same length") + + if len(input_max) > 0 and len(input_min) != n_inputs: + raise Exception("Input normalization not provided for all inputs") + + if len(output_max) > 0 and len(output_min) != n_outputs: + raise Exception("Output normalization not provided for all outputs") + + + # Creating output file + fid = open(file_out+'.mlp', 'w+') + fid.write("
    \n\n") + n_layers = len(model_config['layers']) + + # Writing number of neurons per layer + fid.write('[number of layers]\n%i\n\n' % n_layers) + fid.write('[neurons per layer]\n') + activation_functions = [] + + for iLayer in range(n_layers-1): + layer_class = model_config['layers'][iLayer]['class_name'] + if layer_class == 'InputLayer': + # In case of the input layer, the input shape is written instead of the number of units + activation_functions.append('linear') + n_neurons = model_config['layers'][iLayer]['config']['batch_input_shape'][1] + else: + activation_functions.append(model_config['layers'][iLayer]['config']['activation']) + n_neurons = model_config['layers'][iLayer]['config']['units'] + + fid.write('%i\n' % n_neurons) + fid.write('%i\n' % n_outputs) + + activation_functions.append('linear') + + # Writing the activation function for each layer + fid.write('\n[activation function]\n') + for iLayer in range(n_layers): + fid.write(activation_functions[iLayer] + '\n') + + # Writing the input and output names + fid.write('\n[input names]\n') + for input in input_names: + fid.write(input + '\n') + + if len(input_min) > 0: + fid.write('\n[input normalization]\n') + for i in range(len(input_names)): + fid.write('%+.16e\t%+.16e\n' % (input_min[i], input_max[i])) + + fid.write('\n[output names]\n') + for output in output_names: + fid.write(output+'\n') + + if len(output_min) > 0: + fid.write('\n[output normalization]\n') + for i in range(len(output_names)): + fid.write('%+.16e\t%+.16e\n' % (output_min[i], output_max[i])) + + fid.write("\n
    \n") + # Writing the weights of each layer + fid.write('\n[weights per layer]\n') + for layer in model.layers: + fid.write('\n') + weights = layer.get_weights()[0] + for row in weights: + fid.write("\t".join(f'{w:+.16e}' for w in row) + "\n") + fid.write('\n') + + # Writing the biases of each layer + fid.write('\n[biases per layer]\n') + + # Input layer biases are set to zero + fid.write('%+.16e\t%+.16e\t%+.16e\n' % (0.0, 0.0, 0.0)) + + for layer in model.layers: + biases = layer.get_weights()[1] + fid.write("\t".join([f'{b:+.16e}' for b in biases]) + "\n") + + fid.close() \ No newline at end of file From ac88f7ed0272441a870f6a102ecf6ae7d7bfcd0f Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Mon, 23 Jan 2023 14:16:42 +0100 Subject: [PATCH 02/16] Fixed bug with importing the SU2 MLP writing tool --- common/multilayer_perceptron/Tensroflow2SU2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/multilayer_perceptron/Tensroflow2SU2.py b/common/multilayer_perceptron/Tensroflow2SU2.py index d3dafbb..8f02f4a 100644 --- a/common/multilayer_perceptron/Tensroflow2SU2.py +++ b/common/multilayer_perceptron/Tensroflow2SU2.py @@ -27,7 +27,7 @@ # License along with SU2. If not, see . import tensorflow as tf -import write_SU2_MLP +from write_SU2_MLP import * # Input names for the SU2 MLP. For the CDataDrivenFluid class, these have to be "Density" and "Energy" MLP_input_names = ["Density", "Energy"] From 3fbbf69cb14334bc2f0beb628692da9e8c206a5c Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Fri, 27 Jan 2023 10:12:11 +0100 Subject: [PATCH 03/16] Fixed typo in MLP translation file --- .../{Tensroflow2SU2.py => Tensorflow2SU2.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename common/multilayer_perceptron/{Tensroflow2SU2.py => Tensorflow2SU2.py} (100%) diff --git a/common/multilayer_perceptron/Tensroflow2SU2.py b/common/multilayer_perceptron/Tensorflow2SU2.py similarity index 100% rename from common/multilayer_perceptron/Tensroflow2SU2.py rename to common/multilayer_perceptron/Tensorflow2SU2.py From 0b44489e72ce1b922cbbdbc959c0a98930876a9d Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Mon, 6 Feb 2023 12:30:51 +0100 Subject: [PATCH 04/16] Added to the Readme.md of the MLP tutorial --- common/multilayer_perceptron/README.md | 34 +++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/common/multilayer_perceptron/README.md b/common/multilayer_perceptron/README.md index 09a908a..0a62237 100644 --- a/common/multilayer_perceptron/README.md +++ b/common/multilayer_perceptron/README.md @@ -1 +1,33 @@ -Tutorial on how to use the multi-layer perceptron for data-driven fluid models in SU2 and how to generate the correct input format of the multi-layer peceptron input file. +# Multi-Layer Perceptrons in SU2 + +This tutorial explains how to use the multi-layer perceptron (MLP) class for data-driven methods in SU2. MLP's, or artificial neural networks, are being used in CFD calculations for a variety of regression processes. From turbulence closure models to data regression applications, MLP's have been shown to be a valuable tool in CFD. With the addition of the MLP classes in SU2, it is now possible to develop such models for use in the SU2 suite. In this tutorial, the code structure of the MLP classes in SU2 is explained, as well as an application in data-driven fluid property modeling. Supporting Python scripts are provided to prepare the necessary data files for the SU2 MLP classes to function. + + +# MLP class file structure + +The MLP class prototype files can be found under Common/include/toolboxes/multilayer_perceptron. +An MLP computes data by having its inputs manipulated by a series of operations, depending on the architecture of the network. Interpreting the network architecture and its respective input and output variables is therefore crucial for the MLP functionality. Information regarding the network architecture, input and output variables, and activation functions is provided to SU2 via a .mlp input file, of which an example is provided in this folder. More information regarding the file structure is provided in a later section. + +The main MLP class in SU2 which can be used for look-up operations is the CLookUp_ANN class. This class allows to load one or multiple networks given a list of input files. Each of these files is read by the CReadNeuralNetwork class. This class reads the .mlp input file and stores the architectural information listed in it. It will also run some compatibility checks on the file format. For example, the total layer count should be provided before listing the activation functions. For every read .mlp file, an MLP class is generated using the CNeuralNetwork class. This class stores the input and output variables, network architecture, activation functions, and weights and biases of every synapse and neuron. Currently, the CNeuralNetwork class only supports simple, feed-forward, dense neural network types. Supported activation function types are: +1: linear (y = x) +2: relu +3: elu +4: swish +5: sigmoid +6: tanh +7: selu +8: gelu +9: exponential (y = exp(x)) + +It is possible to load multiple networks with different input and output variables. In order to ensure the right CNeuralNetwork class(es) is/are selected when performing a regression given a set of input variables, the CIOMap class is used. To demonstrate what this class does, let's say you want to perform a regression operation predicting the temperature based on density and static energy. Two MLP files were loaded into the CLookUp_ANN class. MLP 1 has (ordered) inputs 1:static energy and 2:density and (ordered) outputs 1:specific heat, 2:speed of sound, 3:temperature. MLP 2 has the (ordered) inputs 1:pressure, 2:density and (ordered) outputs 1:temperature, 2:specific heat, 3:entropy. The CIOMap class checks which of the loaded MLPs have the same input variables (density and static energy) and include one or multiple of the output variables (temperature) of the desired regression operation. In this case, the CIOMap class will select MLP 1 only, since it has the same input variables as the regression operation and has temperature in its output variables. Although MLP 2 has temperature as one of its output variables, it is not included, as it does not include static energy in its input variables. An error will be raised if none of the loaded MLP's contains all the input variables or if some of the desired outputs are missing from the MLP output variables. + +In addition to loading multiple networks with different input and output variables, it is possible to load multple networks with the same input and output variables, but with different data ranges. When performing a regression operation, the CLookUp_ANN class will check which of the loaded MLPs with the right input and output variables has an input variable normalization range that includes the query point. The corresponding MLP will then be selected for regression. If the query point lies outside the data range of all loaded MLPs, extrapolation will be performed using the MLP with a data range close to the query point. For example, two MLPs are loaded with input variables 1:density, 2:static energy and output variables 1:temperature, 2:pressure, 3:speed of sound. MLP 1 has a density normalization range between 1.0 and 10.0 kg m^{-3}, whereas MLP 2 has a range between 10.0 and 100.0 kg m^{-3}. If regression is performed on a query point with a density value of 5.0 kg m^{-3}, MLP 1 will be selected for regression. If the density is for example 50 kg m^{-3}, MLP 2 will be selected. If the density is 0.5 kg m^{-3}, MLP 1 will be selected as its data range lies closer to the query point. Vice versa if the density is for example 150 kg m^{-3}. + +# Data-Driven Fluid Model Class + +The MLP class is implemented in the CDataDrivenFluid fluid model in SU2. Here, MLP's can be used to determine the thermodynamic state of complex fluids. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library or when computational performance is important. + +Currently, MLPs in SU2 can only be used in the context of a fluid model. The config option "DATADRIVEN_FLUID" for fluid model allows for the use of an MLP or look-up table for thermodynamic state evaluation. The option "INTERPOLATION_METHOD" refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are "LUT" for a look-up table based approach, or "MLP" for the use of an MLP. In this tutorial, focus lies on the latter option. + +The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables . The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. + From bdad9956aaf70f3ebc65a0566ad722a115d0d39e Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Thu, 16 Feb 2023 12:31:04 +0100 Subject: [PATCH 05/16] Added to description and added example MLP input file --- common/multilayer_perceptron/MLP_Air_SU2.mlp | 138 +++++++++++++++++++ common/multilayer_perceptron/README.md | 28 +++- 2 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 common/multilayer_perceptron/MLP_Air_SU2.mlp diff --git a/common/multilayer_perceptron/MLP_Air_SU2.mlp b/common/multilayer_perceptron/MLP_Air_SU2.mlp new file mode 100644 index 0000000..7a32f54 --- /dev/null +++ b/common/multilayer_perceptron/MLP_Air_SU2.mlp @@ -0,0 +1,138 @@ +
    + +[number of layers] +4 + +[neurons per layer] +2 +50 +30 +6 + +[activation function] +linear +swish +swish +linear + +[input names] +Density +Energy + +[input normalization] ++2.8103800000000001e-01 +2.7297899999999998e+01 ++1.7995600000000000e+05 +4.4831800000000000e+05 + +[output names] +s +dsde_rho +dsdrho_e +d2sde2 +d2sdedrho +d2sdrho2 + +[output normalization] ++5.7472900000000000e+03 +7.7785200000000004e+03 ++1.6686100000000001e-03 +4.0000000000000001e-03 +-1.0563199999999999e+03 -1.0714800000000000e+01 +-2.1545900000000001e-08 -3.5737000000000002e-09 +-4.2049399999999996e-06 -4.9376699999999998e-07 ++3.9691700000000002e-01 +3.7578600000000001e+03 + +
    + +[weights per layer] + ++3.6929151415824890e-01 +1.5270020230673254e-04 +2.4933646619319916e-01 +3.0354545742738992e-05 -1.0537925958633423e+00 +7.7660166425630450e-05 -1.2365056318230927e-04 -2.9453914612531662e-04 -3.5883159637451172e+01 -1.5378948211669922e+01 -6.8733987808227539e+00 -5.8702645301818848e+00 -1.9042372703552246e+00 -8.4316224092617631e-04 -4.9291334152221680e+00 +2.9914185870438814e-04 -5.3142815828323364e-01 +1.8670477867126465e+00 +5.4382234811782837e-01 +6.1831429600715637e-02 -2.4027202744036913e-04 -2.5781410217285156e+01 +9.7165042161941528e-01 +2.3599816486239433e-03 +9.3184804427437484e-05 -1.6268554687500000e+01 -3.8540887832641602e+00 -7.6959331636317074e-05 -7.1955889463424683e-01 -5.1619550504256040e-05 +2.7495259046554565e-01 +1.4827370643615723e+00 -1.1923433339688927e-04 -4.9090504035120830e-05 -3.3292938023805618e-02 +2.9765415191650391e-01 +1.7157747745513916e+00 +1.9207551667932421e-04 -3.3151943206787109e+01 -6.2643915414810181e-01 -3.5413293517194688e-04 +1.7423331155441701e-04 -1.2850399070885032e-04 +8.1385415792465210e-01 -3.3070361614227295e+00 -6.4246773719787598e-01 +9.1459321975708008e-01 +6.1090111732482910e-01 +2.7712251176126301e-04 -1.7471460103988647e+00 +-1.7781696319580078e+00 +2.5634345365688205e-04 -3.9426505565643311e+00 +1.3325139298103750e-04 +5.4886531829833984e-01 +3.2754268613643944e-04 -4.9537164159119129e-04 -3.2966319122351706e-04 +5.1735714077949524e-02 -3.1469173729419708e-02 -9.8991896957159042e-03 -3.9214271306991577e-01 +4.9450725317001343e-01 -4.7048303531482816e-04 +1.3683696091175079e-01 +2.2467868984676898e-04 -2.6647317409515381e+00 +3.8101166486740112e-01 -4.1199908256530762e+00 +5.2742868661880493e-02 -4.3708801968023181e-04 -2.9172554612159729e-01 +4.1963109374046326e-01 +6.6398701164871454e-05 -6.8769522476941347e-04 +1.2727175652980804e-01 -7.2043105959892273e-02 -2.0430759468581527e-04 +6.3315564393997192e-01 +1.4132642536424100e-04 +9.6133637428283691e-01 -3.7689182162284851e-01 +1.0792881221277639e-04 +2.4200728512369096e-04 -6.9551312923431396e-01 +4.3708702921867371e-01 +6.4779376983642578e-01 -2.5643486878834665e-04 +2.5780251622200012e-01 +9.3162471055984497e-01 -5.0407827075105160e-05 +1.5735172200948000e-04 -5.5459118448197842e-04 -2.3604583740234375e-01 -1.0009437799453735e+00 -3.6287491321563721e+00 +7.0432299375534058e-01 -1.9683406352996826e+00 +6.9983873981982470e-04 -3.1020140647888184e+00 + + ++4.3242743611335754e-01 -2.0152612030506134e-01 +4.2487236857414246e-01 -1.4060926437377930e-01 +3.5611391067504883e-01 +3.8416987657546997e-01 +3.4843605756759644e-01 +1.2965878844261169e-01 +1.7899769544601440e-01 +6.4167845249176025e-01 -1.8794016540050507e-01 -3.2068601250648499e-01 +5.5609565973281860e-01 +6.6185551881790161e-01 +7.7786153554916382e-01 +5.5007506161928177e-02 +1.0268911123275757e+00 +2.6148343086242676e-01 +3.0915755778551102e-02 +5.6253319978713989e-01 -1.0472400486469269e-01 +4.5771890878677368e-01 +5.6604319810867310e-01 +3.0647527892142534e-03 +7.8725802898406982e-01 +1.5767116546630859e+00 +1.0197539627552032e-01 +3.4826204180717468e-01 -9.3634910881519318e-02 +2.2516651451587677e-01 ++3.1858716160058975e-02 +4.7669652849435806e-03 +8.2218548050150275e-04 +2.2676573134958744e-03 +1.7562425928190351e-03 +8.5355812916532159e-04 -9.3853417783975601e-03 -4.5522991567850113e-03 +3.5094360355287790e-03 -1.4104201691225171e-03 +7.8038568608462811e-04 -1.0691713541746140e-03 +7.2273057885468006e-03 -4.9356865929439664e-04 -1.3735576532781124e-02 +4.9159475602209568e-03 -3.3829659223556519e-02 +4.6478039585053921e-03 -1.9656037329696119e-04 -1.8050285289064050e-03 +1.5193200670182705e-02 +2.1212650608504191e-05 -1.4283211203292012e-03 +1.0053974576294422e-02 +3.1864747870713472e-03 -2.3060729727149010e-03 +2.3312221746891737e-03 -2.6863340754061937e-03 +2.5018313899636269e-02 -1.9304169341921806e-02 +-3.2954218983650208e-01 +2.7149459347128868e-02 -9.2168031260371208e-03 +1.0021843761205673e-01 +9.6516169607639313e-02 +1.1407697200775146e+00 +2.2811387479305267e-01 +5.0422185659408569e-01 +2.0272505283355713e-01 -3.3762302994728088e-01 -2.3715513944625854e-01 +6.5728969871997833e-02 +2.9422479867935181e-01 -1.5325102210044861e-01 +8.5068903863430023e-02 -1.2669314444065094e-01 +5.3580486774444580e-01 -1.5196581184864044e-01 +2.2472904995083809e-02 +7.5135523080825806e-01 +2.9028221964836121e-01 +1.6049098968505859e-01 -1.0496000200510025e-01 -2.4076905846595764e-01 -8.1763714551925659e-02 -6.2937466427683830e-03 +5.1693111658096313e-02 -2.4052043259143829e-01 -9.1288462281227112e-02 +3.7583682686090469e-02 ++9.4578284770250320e-03 -6.6361445933580399e-03 -2.3258216679096222e-02 +1.9040144979953766e-02 -2.8450551908463240e-03 -3.9059817790985107e-03 +1.0820716619491577e-02 -4.7215702943503857e-03 +1.9566798582673073e-03 -1.7017377540469170e-03 -2.2400792222470045e-03 -3.0097963754087687e-03 +9.9388202652335167e-03 +2.6393039152026176e-02 +6.9663594476878643e-03 -3.6136090056970716e-04 -2.6950763538479805e-02 +8.3526335656642914e-03 -2.2521151549881324e-05 -8.7055889889597893e-04 +4.4280622154474258e-02 +5.4073007777333260e-04 +6.0210744850337505e-03 +1.5728175640106201e-02 +6.5129473805427551e-03 -1.3322118669748306e-02 -9.1222003102302551e-03 -6.3537438400089741e-03 +1.5694532543420792e-02 -4.9915206618607044e-03 ++2.5690364837646484e-01 -7.2131007909774780e-02 +9.6599012613296509e-02 -9.8132021725177765e-02 +6.6092878580093384e-01 -5.2847141027450562e-01 +3.1127160787582397e-01 -7.5855240225791931e-02 +4.2579567432403564e-01 +1.1811051368713379e+00 +1.6754950582981110e-01 +1.2146276980638504e-01 +7.7237445116043091e-01 +4.1062575578689575e-01 +7.2361618280410767e-01 -2.2506166994571686e-01 +8.6152184009552002e-01 +3.6085695028305054e-01 -8.6687561124563217e-03 -5.8607812970876694e-02 +1.5962829813361168e-02 -4.2869007587432861e-01 -2.6351806521415710e-01 +3.6850959062576294e-01 +5.9893167018890381e-01 -3.9734604954719543e-01 +4.7752622514963150e-02 +5.0842672586441040e-02 -2.8039854764938354e-01 -2.7658936381340027e-01 +-1.0025120340287685e-02 +3.7257978692650795e-03 +1.0542979463934898e-02 -2.6399022899568081e-03 -2.1860571578145027e-03 -1.0235457448288798e-03 -2.1643948275595903e-03 -3.0659113544970751e-03 -1.2330830097198486e-02 +8.2224135985597968e-04 +6.6285594366490841e-03 -3.5768099129199982e-02 -1.4918704517185688e-02 +2.8748167678713799e-03 +3.0586891807615757e-03 +3.8599178660660982e-03 -2.8484920039772987e-02 -4.0392396040260792e-03 +4.2457136441953480e-04 +2.1674760500900447e-04 -4.0382005274295807e-02 -1.9845709903165698e-04 -4.6479278244078159e-03 +1.5068056061863899e-02 -2.4174194550141692e-05 +3.5311139654368162e-03 +4.9875555559992790e-03 +1.2843634467571974e-03 -2.2264603525400162e-02 -1.3867511413991451e-02 ++6.8696779198944569e-03 +8.5102925077080727e-03 +1.0486470535397530e-02 -1.9548733253031969e-03 -1.5345842111855745e-03 -2.9227533377707005e-03 +6.4325015991926193e-03 +5.9908851981163025e-03 -1.0265110060572624e-02 -2.8397568967193365e-03 -1.3936941977590322e-03 -1.7847012728452682e-02 +3.0008300673216581e-03 -1.6013849526643753e-02 -1.4183917082846165e-02 +4.9886638298630714e-03 +2.5005167350172997e-02 -7.5786854140460491e-03 +3.0900651472620666e-04 -5.1418757066130638e-03 -7.0404484868049622e-03 +2.3911840980872512e-04 -5.9202280826866627e-03 -9.9647347815334797e-04 -8.2057033432647586e-04 -7.1103638038039207e-04 +7.7148922719061375e-03 +1.4406722038984299e-02 -1.9248669967055321e-02 -7.4602155946195126e-03 +-1.7049074172973633e-02 -2.5668699527159333e-04 +4.9923833459615707e-02 +3.1140292412601411e-04 +3.7120499182492495e-03 +1.7192844534292817e-03 -2.0293358713388443e-02 -4.0995092131197453e-03 +1.3460387475788593e-02 +2.7555064298212528e-03 -8.9676091447472572e-03 +1.6118723899126053e-02 +4.4113891199231148e-03 -2.5700574740767479e-02 -1.3135015964508057e-02 -1.8656749278306961e-02 -3.7989150732755661e-03 +5.1616663113236427e-03 -8.9734198991209269e-04 +5.7040606625378132e-03 -4.9555944278836250e-03 -4.2704996303655207e-05 +1.2272282503545284e-02 -4.7126691788434982e-03 +3.7109162658452988e-03 -5.8229877613484859e-03 -1.7677089199423790e-02 -1.1149644851684570e-02 -1.4098859392106533e-02 +1.9882855936884880e-02 ++8.2644015550613403e-01 +5.2394952774047852e+00 -3.4020537137985229e-01 +7.8135174512863159e-01 +2.2465181350708008e+00 -2.1459846198558807e-01 +3.6425748467445374e-01 -1.4376242458820343e-01 +2.6386327743530273e+00 -5.4195237159729004e-01 +1.5154919028282166e-01 +1.2620374560356140e-01 +8.7099895477294922e+00 -7.1400797367095947e-01 +6.0754280090332031e+00 +1.4186798036098480e-01 +3.9521465301513672e+00 +8.7538260221481323e-01 -1.3924016058444977e-01 -2.7620699256658554e-02 -9.5145292580127716e-02 -6.6411703824996948e-02 +3.6149901151657104e-01 +3.1425652503967285e+00 +4.5519962906837463e-01 -4.3223556131124496e-02 -1.2316905260086060e+00 -1.1227079480886459e-01 -8.7096095085144043e-02 -4.0298434905707836e-03 ++5.0322633981704712e-01 +9.7080171108245850e-01 +1.3065667450428009e-01 -4.7049796581268311e-01 +1.8514394760131836e+00 -4.0630023926496506e-02 -7.8300628811120987e-03 +1.2560769915580750e-01 -8.4785270690917969e-01 +4.8916995525360107e-02 +1.1186013370752335e-01 -2.3233082890510559e-01 +6.6069283485412598e+00 -1.7577530443668365e-01 +4.1280512809753418e+00 +8.5813246667385101e-02 +1.9183015823364258e+00 -3.3391037583351135e-01 +3.2626760005950928e-01 -5.4869156330823898e-02 +2.4028342962265015e-01 +1.5564958751201630e-01 +5.1082175970077515e-01 -1.5160245895385742e+00 +1.7351039648056030e+00 +4.5239481329917908e-01 +9.3585574626922607e-01 +5.8401602506637573e-01 +2.3770886659622192e-01 -6.1981849372386932e-02 ++1.0217906236648560e+00 +7.5205880403518677e-01 +4.2177858948707581e-01 +2.5080272555351257e-01 +2.0393788814544678e+00 +4.8246130347251892e-01 +2.8642457723617554e-01 +2.2898395359516144e-01 +1.5432484447956085e-01 +1.3003411889076233e-01 -2.0604547858238220e-01 -4.8750774003565311e-03 +2.9015355110168457e+00 +6.7537978291511536e-02 +2.7671551704406738e+00 -2.6387035846710205e-01 +1.4190884828567505e+00 -3.9204391837120056e-01 +5.6930955499410629e-02 -3.3001087605953217e-02 -1.7789073288440704e-01 -1.6580520197749138e-02 +9.1462463140487671e-01 -3.2010641694068909e-01 +2.1455535888671875e+00 +2.1523131430149078e-01 +5.9659928083419800e-01 -2.8201630711555481e-01 -1.7118807137012482e-01 -1.0804181918501854e-02 +-2.8766500949859619e-01 +6.7559343576431274e-01 -3.0623912811279297e-01 +1.3951915502548218e-01 +1.1241505146026611e+00 +2.3253284394741058e-01 -2.4459943175315857e-01 +1.0966902971267700e-01 +3.7887340784072876e-01 +1.3687340915203094e-01 +1.4313179254531860e-01 +2.0586932078003883e-02 +1.7451069355010986e+00 +1.4322732388973236e-01 +3.4329488873481750e-01 +3.2707672566175461e-02 +9.1477584838867188e-01 +2.1625246107578278e-01 -1.5616869926452637e-01 +1.5595932304859161e-01 -5.3291177749633789e-01 +3.7912249565124512e-02 +1.2653671205043793e-01 +9.7414374351501465e-01 +1.8958946466445923e+00 -5.3626742213964462e-02 +2.8034800291061401e-01 +1.7073439061641693e-01 -1.5496052801609039e-01 +1.8031270802021027e-01 ++1.4070086181163788e-01 +6.6577091813087463e-02 +3.9856258034706116e-01 -3.7496206164360046e-01 +6.4526325464248657e-01 -6.6198039054870605e-01 +1.3689357042312622e-01 -1.5149764949455857e-03 +1.3907298445701599e-01 +1.2429234981536865e+00 -2.5816580653190613e-01 -1.6181237995624542e-01 +9.7358369827270508e-01 -8.7058320641517639e-02 +8.1239694356918335e-01 -7.8995518386363983e-02 +9.2406255006790161e-01 +4.9234649538993835e-01 +7.3128700256347656e-02 -2.5518080592155457e-01 +3.1844237446784973e-01 -2.5507435202598572e-01 -3.5262075066566467e-01 +3.9172670245170593e-01 +8.2287526130676270e-01 +1.7247526347637177e-01 -3.6885634064674377e-02 +3.8126674294471741e-01 +1.3211488723754883e-01 +2.1772584319114685e-01 +-6.9556094706058502e-02 -2.3069661110639572e-02 -1.3717916794121265e-02 -8.8467756286263466e-03 +5.8716125786304474e-03 +3.7325602024793625e-03 -2.3324651643633842e-02 -9.2282500118017197e-03 -2.6207769289612770e-02 +1.1868415400385857e-02 -1.7062773928046227e-02 +2.8091033920645714e-02 +7.9705389216542244e-03 -1.1983542935922742e-04 +7.4014075100421906e-02 -1.6502235084772110e-02 +1.7324958741664886e-01 -2.1627815440297127e-02 -2.9407528927549720e-04 +5.5522815091535449e-04 +3.2693773508071899e-02 +3.5409576958045363e-04 -1.2929474934935570e-02 -2.4647574871778488e-02 -1.9493807107210159e-02 -2.7690066024661064e-02 -8.4063196554780006e-03 +3.3239950425922871e-03 -1.0655120946466923e-02 +2.0146470516920090e-02 ++1.2632469832897186e-01 +3.0848175287246704e-01 -3.8940477371215820e-01 -1.2781345844268799e-01 +9.1387313604354858e-01 -1.0384398698806763e+00 +2.7533778548240662e-01 +1.6096781194210052e-01 +3.7961357831954956e-01 +1.0714007616043091e+00 -1.9323191372677684e-03 -3.7156667560338974e-02 +1.8314037322998047e+00 -5.2726387977600098e-01 +1.2023153305053711e+00 +1.3361255824565887e-01 +1.0790827274322510e+00 +3.6944401264190674e-01 +6.0410622507333755e-02 -3.4766939282417297e-01 +1.5000268816947937e-01 -5.4297614842653275e-03 -9.0193641185760498e-01 +7.5848031044006348e-01 +1.7178032398223877e+00 -7.3888063430786133e-01 +9.1797173023223877e-01 -9.6498943865299225e-02 +2.4343954026699066e-01 -7.5070828199386597e-02 ++2.1885842084884644e-02 +8.5815665079280734e-04 -4.0311660617589951e-02 -2.2706279531121254e-02 -9.2475265264511108e-03 -5.1134112291038036e-03 +1.8633162602782249e-02 +6.8640534300357103e-04 -1.2986066751182079e-02 -4.0592500008642673e-03 -5.5782152339816093e-03 -6.4202570356428623e-03 -1.4777024276554585e-02 -1.8279050709679723e-03 +1.1453691869974136e-02 +2.5625347625464201e-03 +1.6111802309751511e-02 -5.8787576854228973e-03 +9.0200471458956599e-04 -6.0945535078644753e-03 +3.9568610372953117e-04 +3.1938657048158348e-04 -4.1791079565882683e-03 +8.3323456346988678e-03 -1.1005072155967355e-03 -5.2926735952496529e-03 +1.9864767789840698e-02 +1.0778944008052349e-02 +2.1666126325726509e-02 -1.1597739532589912e-02 +-8.9780308306217194e-02 -2.2871592640876770e-01 +5.5717045068740845e-01 -1.9903904199600220e-01 +4.6023389697074890e-01 +7.7365756034851074e-01 +4.9243980646133423e-01 +2.2273917496204376e-01 -7.0099465548992157e-02 +8.9606672525405884e-01 -4.6324637532234192e-01 -9.6243828535079956e-02 +4.0290156006813049e-01 +4.5849952101707458e-01 +1.0912569761276245e+00 +1.9171373546123505e-01 +6.8237400054931641e-01 +1.6148269176483154e-01 +2.7262729406356812e-01 +9.3199238181114197e-02 +1.1553884744644165e+00 +1.6186654567718506e-01 -9.2577584087848663e-02 -1.3240335509181023e-02 +4.8405319452285767e-01 +1.1149458885192871e+00 -2.1547761559486389e-01 +8.6845552921295166e-01 +8.7334521114826202e-02 -2.4317525327205658e-01 +-1.8448318541049957e-01 -3.2396599650382996e-01 -1.8721380829811096e-01 +2.2969193756580353e-01 -1.8044583797454834e+00 -4.3618008494377136e-01 -3.6017143726348877e-01 -1.1287555843591690e-01 -2.0601475238800049e-01 -8.2429099082946777e-01 +2.1034270524978638e-01 -8.6313843727111816e-02 -1.5807378292083740e+00 -7.3657087981700897e-02 -1.6987401247024536e+00 +1.6890159249305725e-01 -1.1385191679000854e+00 -6.3347977399826050e-01 +6.9977678358554840e-02 -4.4806292653083801e-01 +9.1111198067665100e-02 -1.1461255699396133e-01 +1.1853987723588943e-01 -1.4214818179607391e-01 -7.9828345775604248e-01 -3.8626524806022644e-01 -3.4143087267875671e-01 -4.3220424652099609e-01 +3.7050712853670120e-02 -2.0600962638854980e-01 ++4.1619628667831421e-02 +3.9472591876983643e-01 -2.4557344615459442e-01 -2.3395992815494537e-02 -3.7254017591476440e-01 +8.8917613029479980e-01 -8.3560094237327576e-02 +6.0579672455787659e-02 -7.1611218154430389e-02 -1.0868480056524277e-01 +9.2686951160430908e-02 +2.9761878773570061e-02 +3.3670842647552490e-01 +2.5912836194038391e-02 -3.6336049437522888e-01 +6.6540643572807312e-02 +1.2503598630428314e-01 +1.4717668294906616e-01 -1.2406145781278610e-01 +5.4155784845352173e-01 -4.3712845444679260e-01 +1.1439797282218933e-01 +7.0743668079376221e-01 +3.5722640156745911e-01 -2.0327972248196602e-02 +1.9909764826297760e-01 -4.5921418815851212e-02 -2.8185993432998657e-01 +1.9023196771740913e-02 -8.0230347812175751e-02 ++3.7672641873359680e-01 +3.8568828254938126e-02 +1.8125506117939949e-02 -9.5807366073131561e-02 -1.6087903082370758e-01 +6.0073994100093842e-02 +4.5122447609901428e-01 +1.7116349935531616e-01 +2.2953008115291595e-01 -2.9216760396957397e-01 -1.3550943136215210e-01 +5.1607489585876465e-02 -5.7626640796661377e-01 +4.2799834161996841e-02 -6.1495977640151978e-01 +1.0685689747333527e-01 -5.2511775493621826e-01 -2.8327611088752747e-01 +2.6085576042532921e-02 -8.1745393574237823e-02 -3.5303905606269836e-01 -3.9393627084791660e-03 +4.6102631837129593e-02 +9.0625435113906860e-01 -6.9486603140830994e-02 +1.0541830956935883e-01 +4.7364416718482971e-01 +9.5556393265724182e-02 -2.9053235054016113e-01 +3.3266907930374146e-01 ++1.5389764681458473e-02 -6.0746748931705952e-04 +2.0887984428554773e-03 +4.2621209286153316e-03 +8.2398410886526108e-03 +1.0672173229977489e-03 +4.6395962126553059e-03 +2.9176133102737367e-04 +1.9811611622571945e-02 +3.7213461473584175e-03 -1.4864127151668072e-02 +3.5249575972557068e-02 +4.0537230670452118e-03 -4.8736818134784698e-03 -1.7692517489194870e-02 -1.5383160673081875e-02 +1.4907143078744411e-02 +4.2439638637006283e-03 -4.0929732494987547e-04 +2.3251117672771215e-03 +1.8353665247559547e-02 +3.3202180929947644e-05 +1.6034625470638275e-02 -2.6675846427679062e-02 -4.2456937953829765e-03 +1.3329520588740706e-03 -2.0733807235956192e-02 -9.8759494721889496e-03 -4.6186018735170364e-03 +1.2911158613860607e-02 +-1.4638365507125854e+00 +3.3501489162445068e+00 -2.2936582565307617e-01 +2.2947183251380920e-01 +2.4654054641723633e+00 +2.0233616232872009e-01 +4.2737099528312683e-01 +3.1279101967811584e-01 +7.2994977235794067e-01 -2.0289359986782074e-01 -1.3197048008441925e-01 -2.2812297567725182e-02 +6.9165158271789551e+00 +5.4306015372276306e-02 +4.0104513168334961e+00 -2.8427172452211380e-02 +3.5124194622039795e+00 +7.7575123310089111e-01 -8.4104597568511963e-02 +2.9969789087772369e-02 -2.3851022124290466e-01 +3.4510742872953415e-02 -1.1141819953918457e+00 +6.7237126827239990e-01 +8.2878386974334717e-01 -4.9660682678222656e-01 -8.1865847110748291e-02 -9.5430493354797363e-02 -8.4612490609288216e-03 -4.5534893870353699e-02 ++5.0844246149063110e-01 +2.4691997468471527e-01 +3.7148728966712952e-01 +5.5299073457717896e-02 -6.7838823795318604e-01 +1.3662874698638916e-01 +2.2756466269493103e-01 -2.1192868053913116e-01 -3.0473971366882324e-01 -9.7320950031280518e-01 -2.0613543689250946e-01 -1.7510943114757538e-01 -1.0237567424774170e+00 +4.9310088157653809e-01 -1.0269379615783691e+00 -1.2902656197547913e-01 -2.6909506320953369e-01 -7.5939470529556274e-01 +1.5864387154579163e-01 -2.9121461510658264e-01 +2.3914352059364319e-01 -7.6181247830390930e-02 +1.1339659802615643e-02 +2.2767557203769684e-01 -6.4934235811233521e-01 -1.0728897154331207e-01 +3.8823238015174866e-01 -1.6091853380203247e-01 +8.6021358147263527e-03 -1.4532087743282318e-01 +-7.6555438339710236e-02 -9.8366037011146545e-02 +4.1555143892765045e-02 +1.6471862792968750e-01 +6.4567632973194122e-02 -6.7083358764648438e-02 +7.2992853820323944e-02 -1.2583509087562561e-01 -2.0025748014450073e-01 +1.8430523574352264e-02 +1.0594341158866882e-01 +1.9722625613212585e-01 +1.3014721870422363e-01 +4.6147695183753967e-01 +4.3574163317680359e-01 -4.1117284446954727e-02 +3.9647719264030457e-01 -1.6727466881275177e-01 +2.5370590388774872e-02 +1.3183316588401794e-01 +9.6268542110919952e-02 -9.6377357840538025e-03 +3.7073856592178345e-01 -1.3244037330150604e-01 -1.0428603738546371e-01 +3.5088351368904114e-01 -6.9975137710571289e-02 -9.3536570668220520e-02 +1.1087612062692642e-01 -1.1383305490016937e-01 ++1.4871504902839661e-01 +3.7300374358892441e-02 +2.6918750256299973e-02 -8.6467489600181580e-03 -5.3080040961503983e-03 -1.3176678679883480e-02 +4.0880274027585983e-02 +2.4948131293058395e-02 +5.1331818103790283e-02 -1.3456783257424831e-02 +1.2251485139131546e-02 +3.8877378683537245e-03 -3.4755703061819077e-02 -1.0992327705025673e-02 -1.6001084446907043e-01 +1.0568117722868919e-03 +6.3605904579162598e-02 +3.2510939985513687e-02 -4.0216333582066000e-04 -2.1404743194580078e-02 +7.2338521480560303e-02 +1.1087539605796337e-03 +3.2740321010351181e-02 -2.2275956347584724e-02 +3.2382709905505180e-03 +1.0061323642730713e-02 +7.4457940645515919e-03 -7.9635782167315483e-03 -2.3272452875971794e-02 -2.0542433485388756e-03 ++3.3843908458948135e-03 +7.3060256242752075e-01 -7.8909099102020264e-02 +1.0779818892478943e-01 +1.3727755546569824e+00 -7.6011553406715393e-02 -1.3950519263744354e-02 -5.7871502637863159e-01 -5.3153997659683228e-01 -4.6167621016502380e-01 +4.6223554760217667e-02 +2.5078773498535156e-01 +5.2004709243774414e+00 +3.3837649226188660e-01 +3.5922214984893799e+00 -1.4345894567668438e-02 +1.6385205984115601e+00 +2.8302103281021118e-01 -2.4124920368194580e-01 -7.0495009422302246e-02 +3.2020863145589828e-02 -2.0660427212715149e-01 -1.3223508000373840e-01 -3.8442531228065491e-01 +1.8902140855789185e+00 +3.2071074843406677e-01 +1.2260193824768066e+00 +8.5751992464065552e-01 -1.7537599802017212e-01 +5.2525248378515244e-02 ++1.8743954598903656e-01 +6.9431674480438232e-01 -7.5083561241626740e-02 -3.6359850317239761e-02 +1.5115967988967896e+00 -2.9325386509299278e-02 +4.3065011501312256e-02 +9.9857412278652191e-02 +4.7165906429290771e-01 +5.3162550926208496e-01 -2.7788601815700531e-02 +2.6942243799567223e-02 +1.7567702531814575e+00 +5.7660257816314697e-01 +8.2019025087356567e-01 +2.9188790917396545e-01 +7.5816059112548828e-01 +5.7481133937835693e-01 +1.0153243690729141e-01 +5.2750006318092346e-02 +1.9679915904998779e-01 -1.9795688986778259e-01 -1.1851257830858231e-01 +7.3801660537719727e-01 +1.5560950040817261e+00 +8.6965930461883545e-01 +4.3249520659446716e-01 +5.9190821647644043e-01 +2.6948991417884827e-01 -1.4213737845420837e-01 ++2.1382575854659081e-02 +1.1455680243670940e-02 +2.7920613065361977e-02 -1.3589557260274887e-02 +2.2927692625671625e-03 +3.8317343569360673e-04 -1.0043219663202763e-03 +8.5086990147829056e-03 +3.1917255837470293e-03 +6.1612378340214491e-04 +1.0800164192914963e-02 +2.8010990936309099e-03 -1.4516483061015606e-02 -1.4349453151226044e-02 -2.8494844213128090e-02 +6.4574077259749174e-04 +3.9310839027166367e-02 -5.2566425874829292e-03 +1.2734430492855608e-04 -3.2391943968832493e-03 -1.8419349566102028e-02 -3.1664303969591856e-04 +8.6383504094555974e-04 -1.8705921247601509e-02 -6.9088093005120754e-03 +1.4938511885702610e-02 +8.5803745314478874e-03 +5.3928247652947903e-03 -1.9518826156854630e-02 -8.0331470817327499e-03 ++3.9744186401367188e-01 -1.1274232715368271e-01 +4.0784427523612976e-01 -8.7947912514209747e-02 +6.4567536115646362e-01 +1.5512968599796295e-01 +2.2150103747844696e-01 -4.2508929967880249e-01 +3.4052318334579468e-01 +1.0027301311492920e+00 -2.0743829011917114e-01 +6.5476857125759125e-02 +9.3446326255798340e-01 -1.5888112783432007e-01 +8.2611846923828125e-01 +3.4851858019828796e-01 +9.9476718902587891e-01 +5.9589833021163940e-01 +1.4450119435787201e-01 -1.4966404438018799e-01 +4.1651469469070435e-01 -4.0305471420288086e-01 -1.3811372220516205e-01 +3.5220623016357422e-01 +9.0765261650085449e-01 +6.4664930105209351e-02 -1.0925571620464325e-01 +4.6061420440673828e-01 -2.0083251595497131e-01 +1.9136758148670197e-01 ++3.7694554775953293e-02 +1.2295386753976345e-02 -3.4607916604727507e-03 -1.1204814072698355e-03 -6.2105385586619377e-03 -1.9124059472233057e-03 +4.3877828866243362e-03 -8.0547668039798737e-03 -6.9600166752934456e-03 -6.0698837041854858e-03 -1.9216751679778099e-03 -9.6135372295975685e-03 -1.1382515542209148e-02 -1.4563473872840405e-02 -2.4659674614667892e-02 +1.3503335416316986e-02 -2.8502933681011200e-02 +6.8386616185307503e-03 +1.2676478945650160e-04 -3.5793092101812363e-03 +1.4395215548574924e-02 +1.6151752788573503e-04 -1.1406234465539455e-02 +2.0591527223587036e-02 +8.6150709539651871e-03 -1.0222361423075199e-02 +4.7322278842329979e-03 -2.4162000045180321e-03 +2.5431133806705475e-02 -1.9039165228605270e-02 +-7.2217792272567749e-01 -5.6431613862514496e-02 -2.5319325923919678e-01 +2.6395118329674006e-03 -1.2987446784973145e-01 -1.6099352389574051e-02 -4.6092981100082397e-01 +6.4759373664855957e-02 +3.8837943226099014e-02 -7.8832387924194336e-01 +1.7211009562015533e-01 +1.2426272034645081e-01 -5.2439278364181519e-01 -6.9532787799835205e-01 -1.2271389961242676e+00 -1.3677036762237549e-01 -5.6418007612228394e-01 +9.1029681265354156e-02 +3.2351097464561462e-01 +3.9058375358581543e-01 -1.1536664515733719e-01 -9.2557060718536377e-01 -2.7962899208068848e-01 -1.7256386578083038e-01 +4.8132959753274918e-02 -1.8724759817123413e+00 -4.9646294116973877e-01 +3.8981872797012329e-01 +1.2741783261299133e-01 -1.7756056785583496e-01 +-6.5485811233520508e-01 -3.3840993046760559e-01 -2.7605429291725159e-01 +2.0792575553059578e-02 -2.2019627094268799e+00 +5.6180972605943680e-02 -3.0154514312744141e-01 -9.5786890015006065e-03 -2.5096635799854994e-03 -1.3268771171569824e+00 -2.3655182123184204e-01 -8.8702719658613205e-03 -2.3146781921386719e+00 -2.1507918834686279e-01 -2.4016532897949219e+00 -1.2058544158935547e-01 -1.0457035303115845e+00 -8.3650958538055420e-01 -3.5155376791954041e-01 -4.4561415910720825e-02 -2.6544156670570374e-01 +1.2121592462062836e-01 -5.2005982398986816e-01 -2.9571610689163208e-01 -1.2499598264694214e+00 -1.7318071424961090e-01 -3.3464407920837402e-01 -9.0229719877243042e-02 -1.4002969861030579e-01 -2.2231009602546692e-01 ++2.1787650883197784e-02 +9.5681520178914070e-03 -1.8566088750958443e-02 -1.1081850156188011e-02 -6.4079384319484234e-03 -2.5484233628958464e-03 +1.1337304487824440e-02 -8.4354067221283913e-03 -1.2426209636032581e-02 -6.7330258898437023e-03 +7.0338282966986299e-04 -1.5579793602228165e-02 -9.2402836307883263e-03 -1.8162755295634270e-02 -1.2106900103390217e-02 +7.5380001217126846e-03 -1.6772061586380005e-02 +3.9850110188126564e-03 +5.0596083747223020e-04 -3.4903627820312977e-03 +6.5119983628392220e-03 +1.1264530621701851e-04 -1.2916454114019871e-02 +1.6887206584215164e-02 +6.4655905589461327e-03 -8.7561886757612228e-03 +8.6926436051726341e-03 +3.3706135582178831e-04 +2.1004186943173409e-02 -2.1905532106757164e-02 +-5.6634237989783287e-03 -7.1224244311451912e-03 -1.0562284849584103e-02 +1.4388359151780605e-02 +2.9140347032807767e-04 +6.1485293554142118e-04 +3.8897558115422726e-03 -1.3361346209421754e-03 +2.8336038812994957e-03 +2.0509962923824787e-03 -3.9599183946847916e-03 +9.8702916875481606e-04 +7.7210501767694950e-03 +8.1419460475444794e-03 +1.0984670370817184e-02 -6.9920136593282223e-03 -2.4801272898912430e-02 +4.8247505910694599e-03 -4.3199461651965976e-04 -9.3816546723246574e-05 +2.1972529590129852e-02 +2.7516909176483750e-04 -6.8993032909929752e-03 +9.6769751980900764e-03 +4.0064994245767593e-03 -9.5450598746538162e-03 -1.0042267851531506e-02 -2.0733149722218513e-03 +2.1881939843297005e-02 -4.4789426028728485e-03 ++2.8581765294075012e-01 +1.8308579921722412e-01 +4.3955859541893005e-01 -1.4931729435920715e-01 -4.6585161238908768e-02 +2.3932588100433350e-01 +1.0913845151662827e-01 +1.2568365037441254e-01 -3.6629343032836914e-01 +3.7640294432640076e-01 +2.5357693433761597e-01 +1.4927439391613007e-01 +1.9769534468650818e-01 +2.6422435045242310e-01 +5.7218629121780396e-01 -1.6097143292427063e-01 +8.7337189912796021e-01 +3.6470392346382141e-01 -4.9550282955169678e-01 +1.6658455133438110e-01 +2.3261860013008118e-01 +4.8887816071510315e-01 +2.8827059268951416e-01 +1.2845037877559662e-01 +8.3102606236934662e-02 +2.0202190876007080e+00 +1.2696665944531560e-03 -4.4398352503776550e-02 -3.7891563773155212e-01 -3.2855442166328430e-01 +-4.4146835803985596e-02 +3.1035311520099640e-02 +7.2691880166530609e-02 -6.6687658429145813e-02 +7.0398874580860138e-02 +2.0958472788333893e-01 +3.2406486570835114e-02 -8.5638219118118286e-01 -2.6206251978874207e-01 +6.9362455606460571e-01 +1.0906782001256943e-01 +1.4005034230649471e-02 +2.1699246764183044e-01 +2.1306501328945160e-01 +6.7023754119873047e-01 -1.6536328196525574e-01 +1.0238361358642578e+00 -3.1364938616752625e-01 +2.3178825154900551e-02 -6.5567485988140106e-02 +2.9934135079383850e-01 -8.0682046711444855e-02 +1.6856579482555389e-01 -3.5948258638381958e-01 +1.2747962772846222e-01 -2.8421980142593384e-01 -2.6373451948165894e-01 +2.4773855507373810e-01 +2.6753476262092590e-01 -2.9977548122406006e-01 ++4.4975351542234421e-02 -2.0270569249987602e-02 -6.1829589307308197e-02 -2.5708913803100586e-01 -1.5073320865631104e+00 -4.7895130515098572e-01 +2.0999360084533691e-01 +2.3344645276665688e-02 -2.1700535714626312e-01 -1.2655543088912964e+00 +6.8711236119270325e-02 +8.3118423819541931e-02 -1.2747603654861450e+00 +2.0275750756263733e-01 -1.4879069328308105e+00 -1.3921818137168884e-01 -1.3793485164642334e+00 -6.0084533691406250e-01 +2.2638720273971558e-01 +1.0417198389768600e-01 -1.3474091887474060e-01 -2.7610161900520325e-01 -3.6536961793899536e-01 -1.9947411119937897e-01 -4.5927035808563232e-01 -5.9283483028411865e-01 +9.9873118102550507e-02 -3.6105182766914368e-01 +4.4912200421094894e-02 +3.3943098783493042e-01 +-3.9940949529409409e-02 +1.5379023738205433e-02 +2.1354164928197861e-02 -1.1344857513904572e-02 +1.3336438685655594e-02 +7.7320374548435211e-03 -1.5639394521713257e-02 -5.6954449974000454e-04 +1.9191664177924395e-03 +4.4813244603574276e-03 -9.6058435738086700e-03 +1.7647471278905869e-02 +2.3130311165004969e-03 +1.8057685345411301e-02 -2.7973575517535210e-02 +1.6127682756632566e-03 -2.4857843294739723e-02 -1.4158660545945168e-02 +1.9550119759514928e-04 +1.1329974979162216e-02 -2.0458070561289787e-02 -1.1812822194769979e-03 -1.4369106851518154e-02 -2.1887466311454773e-02 -8.1136161461472511e-03 +2.1850083023309708e-02 -4.4734502444043756e-04 +6.1702155508100986e-03 -1.1778073385357857e-02 +1.7667256295681000e-02 ++7.2309863567352295e-01 +3.6342866420745850e+00 +6.1486262083053589e-01 -8.8953316211700439e-01 +1.6079396009445190e+00 +7.9899847507476807e-02 +3.8680693507194519e-01 +1.3645130395889282e-01 +1.8765307664871216e+00 -4.6681335568428040e-01 -9.4884112477302551e-02 -1.5357789397239685e-01 +6.0809803009033203e+00 +3.1634375452995300e-01 +4.2482986450195312e+00 -1.4843760430812836e-01 +2.1471140384674072e+00 +1.5934845209121704e+00 +1.8898105621337891e-01 -1.0105487704277039e-01 -3.3026535063982010e-02 +6.2929689884185791e-02 +3.7223041057586670e-01 +2.0802490711212158e+00 +5.4969108104705811e-01 +5.3945899009704590e-01 -1.4524851739406586e-01 +3.9488416165113449e-02 +9.0069718658924103e-02 +3.2591409981250763e-02 +-4.4754287600517273e-01 +1.9126231968402863e-01 -6.6004663705825806e-01 +3.6038476228713989e-01 +4.8215952515602112e-01 -9.1882146894931793e-02 -3.8763347268104553e-01 -2.0640857517719269e-01 +2.8513073921203613e-01 -5.7637706398963928e-02 +1.3678476214408875e-01 -4.8448178917169571e-02 -1.4364184439182281e-01 -2.6162910461425781e-01 -9.3286830186843872e-01 -2.6129540055990219e-02 +6.5801852941513062e-01 +8.3373957872390747e-01 +4.0429180860519409e-01 -4.0107548236846924e-01 -8.6187225580215454e-01 -6.0702329874038696e-01 -2.4046294391155243e-01 +1.4213190972805023e-01 +2.1454565227031708e-01 -2.0240015983581543e+00 +3.7484931945800781e-01 -3.9638713002204895e-01 -2.3119874298572540e-01 -1.6611157357692719e-01 +-8.8219687342643738e-02 -1.7160048708319664e-02 -2.7874011546373367e-02 +1.3897717930376530e-02 +9.0335318818688393e-03 +8.3471750840544701e-03 -2.1115550771355629e-02 -1.3481888920068741e-02 -2.2923937067389488e-02 +6.4043807797133923e-03 -5.1775970496237278e-03 -2.1282953675836325e-03 +2.9383582994341850e-02 +1.6964493319392204e-02 +8.0116234719753265e-02 +2.0926042925566435e-03 -6.5598182380199432e-02 -1.6077550128102303e-02 +3.3720594365149736e-04 +1.3854188844561577e-02 -2.0940167829394341e-02 -6.6884967964142561e-04 -1.5915501862764359e-02 +9.4698853790760040e-03 -2.0643780007958412e-03 -2.8858347795903683e-03 -7.3367361910641193e-03 +1.8310899613425136e-03 +1.9963297992944717e-02 +4.4198739342391491e-03 ++6.6600173711776733e-02 +1.1742531321942806e-02 -1.7243102192878723e-02 -1.2236875481903553e-02 -7.1319923736155033e-03 -4.8524322919547558e-03 +2.2439079359173775e-02 +2.2641653195023537e-03 +4.1750734671950340e-03 -7.7493698336184025e-03 +1.5841815620660782e-03 -2.0848989952355623e-03 -2.1386265754699707e-02 -1.8646452575922012e-02 -3.8798052817583084e-02 +1.0414324700832367e-02 -7.0495498366653919e-03 +9.8006008192896843e-03 +3.8670253707095981e-04 -8.5446350276470184e-03 +1.0828427039086819e-02 +2.7863035211339593e-04 -5.5682919919490814e-03 +5.1442896947264671e-03 +2.5295242667198181e-03 -1.3873226707801223e-03 +1.1706713587045670e-02 +4.5571930240839720e-04 +1.6882980242371559e-02 -1.5084611251950264e-02 ++5.5679719895124435e-02 +2.5385735556483269e-02 +4.2134068906307220e-02 -3.6616737488657236e-03 +3.6234201397746801e-03 -3.7519861944019794e-03 +1.5790756791830063e-02 +1.0550191625952721e-02 +1.6857037320733070e-02 -4.4076759368181229e-03 +7.8565295552834868e-04 +5.6406543590128422e-03 -1.1117538437247276e-02 +2.5667646899819374e-02 -8.6668737232685089e-02 +3.2111436594277620e-03 +2.6871554553508759e-02 +5.2703781984746456e-03 -2.1137821022421122e-05 -6.0791838914155960e-03 +2.8560100123286247e-02 +4.1120922105619684e-05 +2.5314732920378447e-03 -1.6175882890820503e-02 -2.4561756290495396e-03 +1.1210750788450241e-02 -2.0338610920589417e-04 +3.7259804084897041e-03 -2.2083019837737083e-02 +2.6983220595866442e-03 ++4.3620216846466064e-01 +6.3454866409301758e-02 +2.6649633049964905e-01 -2.6738956570625305e-01 -1.7269608974456787e+00 -2.8041002154350281e-01 +4.4748008251190186e-02 +4.3401437997817993e-01 -4.0010485798120499e-02 -9.3041545152664185e-01 -4.1092801094055176e-01 +2.0451858639717102e-01 -2.2551972866058350e+00 +6.4324207603931427e-02 -1.9353827238082886e+00 +1.9091403484344482e-01 -8.0695688724517822e-01 -6.2955647706985474e-01 -2.2548452019691467e-01 -4.7744387388229370e-01 +2.3918448016047478e-02 +1.6122759552672505e-04 -9.8681943491101265e-03 +4.9925380945205688e-01 -5.8461135625839233e-01 +2.7829456329345703e-01 -1.1083266697824001e-02 +1.9037833809852600e-01 -1.2854874134063721e-01 +6.1526495963335037e-02 +-2.0485018193721771e-01 +6.6328591108322144e-01 +3.5246539115905762e-01 -1.1257674545049667e-01 +5.1218092441558838e-01 +4.1066485643386841e-01 +2.4645142257213593e-01 -3.3090111613273621e-01 +4.1868507862091064e-01 +4.9968710541725159e-01 -3.5590897314250469e-03 +1.6845988109707832e-02 +5.2583378553390503e-01 -2.7791315317153931e-01 -1.1567089706659317e-01 -1.8182471394538879e-01 +6.5635883808135986e-01 +5.9798181056976318e-01 -2.0906144753098488e-02 +1.3193464279174805e-01 +2.7902085334062576e-02 +2.5296267867088318e-01 +6.0467705130577087e-02 +5.6239897385239601e-03 +9.3889307975769043e-01 +4.9214744567871094e-01 -3.7031140178442001e-02 +2.7873682975769043e-01 -4.5403987169265747e-02 -6.3034586608409882e-02 +-1.0780064761638641e-01 +4.7742852568626404e-01 +4.7690668702125549e-01 -3.3150005340576172e-01 +7.6951014995574951e-01 +6.8920159339904785e-01 +2.8688725829124451e-01 +2.6804422959685326e-02 +1.5037187933921814e-01 +7.7331274747848511e-01 +2.7249619364738464e-01 -8.1278868019580841e-03 +1.8084755539894104e-01 +2.4576716125011444e-01 +1.4304691553115845e+00 -2.2233968973159790e-01 +1.0929238796234131e+00 -1.4804743230342865e-01 +8.4936666488647461e-01 +3.7967261672019958e-01 +1.1196836233139038e+00 +1.3752491213381290e-02 +5.2162802219390869e-01 -8.3327174186706543e-02 +4.6690711379051208e-01 +1.2377120256423950e+00 +1.6049946844577789e-01 +6.5279066562652588e-01 -1.5116956830024719e-01 +7.5900726020336151e-02 ++8.8263005018234253e-01 +1.3667184114456177e-01 +7.0028299093246460e-01 +1.1234517209231853e-02 -3.2362163066864014e-01 +2.2542162332683802e-03 +3.0918401479721069e-01 -2.4474173784255981e-02 -2.5133645534515381e-01 +1.1908240616321564e-01 +7.7320806682109833e-02 +2.3981345817446709e-02 -4.5011949539184570e-01 -1.7775429785251617e-01 -5.0735134631395340e-02 +2.6023644208908081e-01 +2.7152696251869202e-01 -7.9665243625640869e-01 +7.2474509477615356e-02 -2.0261195302009583e-01 -1.3397435843944550e-01 -5.7959221303462982e-02 +3.6030656099319458e-01 -7.5765377841889858e-03 -2.3035912215709686e-01 -9.7711190581321716e-02 -6.7070201039314270e-02 -9.7478367388248444e-02 -1.6426551342010498e-01 +3.3682355284690857e-01 +-3.1259089708328247e-01 -6.6931322216987610e-02 +1.7439781129360199e-01 +1.2680228054523468e-01 -3.8320177793502808e-01 +7.7801543474197388e-01 +1.0670582205057144e-01 -6.6370397806167603e-01 -1.1109238862991333e-01 -4.1209420561790466e-01 +5.2455884218215942e-01 +9.9113196134567261e-02 +4.3116003274917603e-01 -4.5013281702995300e-01 +4.0763697028160095e-01 -1.1038153618574142e-01 +1.3874298334121704e-01 -3.0968791246414185e-01 -1.0018649101257324e+00 +6.2545377016067505e-01 +5.6162399053573608e-01 +1.0430735349655151e+00 -2.9224898666143417e-02 -8.3571016788482666e-02 -7.0866298675537109e-01 +1.5012816190719604e+00 +1.1686889827251434e-01 -2.6342177391052246e-01 +1.9288669526576996e-01 +1.3950078189373016e-01 ++3.7187809357419610e-04 -1.2521844357252121e-02 +3.8867627736181021e-03 +1.2459100224077702e-02 +2.3739752359688282e-03 +6.0739358887076378e-03 -8.7514976039528847e-03 -3.0389674939215183e-03 +5.2902437746524811e-03 +4.4741677120327950e-03 -8.5859615355730057e-03 +8.9740632101893425e-03 -2.8330141212791204e-03 -1.5329029411077499e-02 +2.3207245394587517e-02 +1.7675723647698760e-03 +1.6423910856246948e-02 +5.3154551424086094e-03 -6.8366451887413859e-04 +1.0000222828239202e-03 -7.5096660293638706e-03 -3.7181488005444407e-04 -7.4740652926266193e-03 -1.2547105550765991e-02 -6.9014881737530231e-03 +3.3085928298532963e-03 -1.1505768634378910e-03 -9.5235528424382210e-03 +7.8955981880426407e-03 +7.2914790362119675e-03 +-8.2130059599876404e-02 +1.9443358480930328e-01 +7.3950093984603882e-01 +1.9007514417171478e-01 +7.9908335208892822e-01 +3.6011341214179993e-01 +5.0023043155670166e-01 -2.2382985800504684e-02 +2.9829111695289612e-01 +6.4382076263427734e-01 -8.8155440986156464e-02 +6.4668640494346619e-02 +3.4399035573005676e-01 +5.3053641319274902e-01 +1.5071526765823364e+00 -3.5879701375961304e-01 +1.1229895353317261e+00 +4.7916957736015320e-01 +3.6486819386482239e-01 +5.5951014161109924e-02 +1.1913574934005737e+00 -3.9972594380378723e-01 +1.0686242580413818e+00 +4.0856274962425232e-01 +8.3602458238601685e-01 +1.3515902757644653e+00 +3.0011823773384094e-01 +7.2386604547500610e-01 -1.3667715713381767e-02 -4.5336332172155380e-02 + + +-3.7209364771842957e-01 -2.0884534716606140e-01 -2.9794359207153320e-01 -1.4170993864536285e-01 +2.2171740233898163e-01 -6.2805764377117157e-02 ++1.3708747923374176e-01 +1.6429275274276733e-02 -1.7202763259410858e-01 +3.8844158407300711e-03 +4.6976106241345406e-03 +2.9268357157707214e-01 +-2.9305326938629150e-01 +9.4806298613548279e-02 -5.5874133110046387e-01 +9.2896804213523865e-02 -4.0984922647476196e-01 -2.2635230794548988e-02 ++2.2920262999832630e-03 -6.3836295157670975e-03 +3.4658354707062244e-03 -1.0163272963836789e-03 -3.1607158016413450e-03 +8.6492272093892097e-03 +-6.1874264478683472e-01 +2.0005397498607635e-02 +1.2390928268432617e+00 +1.9011477008461952e-02 +8.6550479754805565e-03 -1.2961237430572510e+00 +-1.1133621633052826e-01 +3.4492340683937073e-01 -4.6911485493183136e-02 -1.7156480252742767e-01 -2.9269725084304810e-01 -5.3299475461244583e-02 +-1.0101699084043503e-01 +1.2806898355484009e-01 -2.6052641868591309e-01 -4.2877095937728882e-01 -4.4838017225265503e-01 -2.0553221926093102e-02 +-1.6265816986560822e-02 -7.5251907110214233e-02 -2.0111389458179474e-02 +5.1040532998740673e-03 -6.7644022405147552e-02 -8.7280012667179108e-03 ++7.9108625650405884e-02 +9.0959630906581879e-02 +4.6973984688520432e-02 +2.0177241414785385e-02 +1.2726534903049469e-01 +2.2549921274185181e-01 +-8.0764299631118774e-01 -4.2233452200889587e-02 +1.9660389423370361e-01 -2.9416212812066078e-02 -6.9327667355537415e-02 +3.3946213126182556e-01 ++5.4136686958372593e-03 +1.1507612653076649e-02 +7.3805763386189938e-03 +3.5453853197395802e-03 +1.0704366490244865e-02 +3.1153638847172260e-03 ++3.7469601375050843e-04 +1.6725444002076983e-03 +7.4567057890817523e-04 +6.1688050627708435e-03 -3.7376824766397476e-03 +2.3458761279471219e-04 ++1.6128344461321831e-02 -2.7513001114130020e-03 -7.5397059321403503e-02 +3.9521106518805027e-03 +2.0943935960531235e-03 +1.8602956831455231e-01 ++2.7817121148109436e-01 -3.9890283346176147e-01 -4.2974391579627991e-01 -1.7259593307971954e-01 -3.0211591720581055e-01 -1.0175350308418274e-01 ++6.6675174236297607e-01 +1.3838805258274078e-01 +4.0822172164916992e-01 +5.8878403156995773e-02 -1.4110053889453411e-03 -8.5932612419128418e-01 +-1.2595970183610916e-03 -2.5506720412522554e-03 -2.5164247490465641e-03 -6.6250110976397991e-03 +2.9601873829960823e-03 -1.6797006828710437e-03 +-2.4337677657604218e-01 -5.3381316363811493e-02 +6.4831763505935669e-02 -7.6824404299259186e-02 +5.1059704273939133e-02 -1.5402847528457642e-01 +-3.4434419870376587e-01 +5.9335000813007355e-02 -7.9067833721637726e-02 -5.0642054527997971e-02 +1.8358058878220618e-04 +1.0271523892879486e-01 ++2.5644633173942566e-01 -4.4736224412918091e-01 -3.5504631232470274e-03 +2.4592986702919006e-01 +1.5984594821929932e-01 -2.6496637612581253e-02 ++1.7608997225761414e-01 -2.0461499691009521e-01 +2.0925493910908699e-02 -2.0181791484355927e-01 -2.8165918588638306e-01 +3.6618921905755997e-02 ++1.6811880469322205e-01 -3.4518724679946899e-01 -1.3831096887588501e-01 -3.1209391355514526e-01 -3.6826348304748535e-01 +4.4895769096910954e-03 +-1.5860520303249359e-01 +5.8890718221664429e-01 +2.4785257875919342e-02 -7.0871192216873169e-01 -6.9104158878326416e-01 +1.5046536922454834e-02 +-3.8104894757270813e-01 +2.8367981314659119e-01 -2.9944822192192078e-01 -5.4359728097915649e-01 -1.2595027685165405e-01 +3.4227207303047180e-02 ++7.1558706462383270e-02 -9.9792681634426117e-02 -1.9019447267055511e-01 +1.3884398154914379e-02 -1.0976120829582214e-01 +2.6771573349833488e-02 +-5.4220473766326904e-01 +1.7357788980007172e-02 +1.1626181602478027e+00 +3.3580879680812359e-03 +1.0818851180374622e-02 -5.8732843399047852e-01 ++8.2582034170627594e-02 -3.8210359215736389e-01 +1.4124330878257751e-01 -2.9919723048806190e-02 +4.3221384286880493e-02 +8.3583876490592957e-02 ++1.9129854440689087e-01 +3.5183086991310120e-02 -1.8852937221527100e-01 -5.5564172565937042e-02 -2.8339305892586708e-02 -8.6140692234039307e-02 +-4.4070181250572205e-01 -1.7385990917682648e-01 -1.6920909285545349e-01 -3.1490609049797058e-02 -3.3170020580291748e-01 -6.7213013768196106e-02 +-1.3983215903863311e-03 -3.6923948209732771e-03 -2.0777590107172728e-03 -1.5961386263370514e-02 +1.1874640360474586e-02 -6.3403823878616095e-04 ++3.0688627157360315e-03 +6.2259295955300331e-03 +2.6527841109782457e-03 -1.9394939299672842e-03 +9.4658778980374336e-03 +2.8904713690280914e-03 + + +[biases per layer] ++0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 +-1.1157412827014923e-01 -3.3824679121607915e-05 +2.1104570478200912e-02 +3.9625403587706387e-05 -4.5578083395957947e-01 -5.2455189870670438e-04 -2.3049417359288782e-04 +4.1634793160483241e-04 +1.5791164338588715e-01 +2.8074260801076889e-02 -6.2261607497930527e-02 +3.4988370537757874e-01 -4.6014487743377686e-01 +3.4145047538913786e-04 -1.4810329675674438e-01 -4.2997466516681015e-04 -2.3796021938323975e-01 -4.2951647192239761e-02 -5.8298930525779724e-02 -4.3130002915859222e-02 +4.7358457231894135e-04 +3.1473326683044434e-01 -3.8577425479888916e-01 -2.0412791054695845e-03 +1.3597380893770605e-04 -2.4274310097098351e-02 -4.8377245664596558e-02 -4.9357535317540169e-05 -5.2535283565521240e-01 -3.6078499397262931e-04 -3.9361980557441711e-01 +4.2361000180244446e-01 -4.0288074524141848e-04 -9.1165740741416812e-05 +1.7448206245899200e-01 -3.7576428055763245e-01 -2.2696794569492340e-01 -7.2133647336158901e-05 -5.2956473082304001e-02 -5.4426586627960205e-01 +3.2629299676045775e-04 -4.1286041960120201e-04 -1.5940038429107517e-04 +1.7911648750305176e-01 +7.0670264959335327e-01 -1.7384408712387085e+00 -6.4279180765151978e-01 +3.6426132917404175e-01 -4.1978899389505386e-05 -2.1109967231750488e+00 +-6.5533941984176636e-01 -1.8055668473243713e-01 -6.5683960914611816e-01 -1.4364618062973022e-01 -9.9848681688308716e-01 -3.0490663647651672e-01 -4.6168187260627747e-01 +2.5001456961035728e-02 -1.5183533728122711e-01 -9.0511178970336914e-01 -8.7521433830261230e-02 -8.2068778574466705e-02 -3.5949289798736572e-01 -9.2117398977279663e-01 -1.5294542312622070e+00 +5.8807577006518841e-03 -1.3380171060562134e+00 -3.8957464694976807e-01 -1.2753565609455109e-01 -1.5386527776718140e-01 -6.4043277502059937e-01 +1.5060743689537048e-01 -7.4787741899490356e-01 -3.1262516975402832e-01 -8.8149094581604004e-01 -1.4836670160293579e+00 -1.4976370334625244e-01 -5.7535529136657715e-01 -1.4436234720051289e-02 +3.5216238349676132e-02 ++8.3585090935230255e-02 +1.5639360249042511e-01 +2.9334869980812073e-01 +1.9895148277282715e-01 +1.2395969033241272e-01 +6.4833834767341614e-02 diff --git a/common/multilayer_perceptron/README.md b/common/multilayer_perceptron/README.md index 0a62237..b98fe75 100644 --- a/common/multilayer_perceptron/README.md +++ b/common/multilayer_perceptron/README.md @@ -1,11 +1,14 @@ +--- +title: Multi-Layer Perceptrons and data-driven fluid model +permalink: /common/multilayer_peceptron/ +--- # Multi-Layer Perceptrons in SU2 This tutorial explains how to use the multi-layer perceptron (MLP) class for data-driven methods in SU2. MLP's, or artificial neural networks, are being used in CFD calculations for a variety of regression processes. From turbulence closure models to data regression applications, MLP's have been shown to be a valuable tool in CFD. With the addition of the MLP classes in SU2, it is now possible to develop such models for use in the SU2 suite. In this tutorial, the code structure of the MLP classes in SU2 is explained, as well as an application in data-driven fluid property modeling. Supporting Python scripts are provided to prepare the necessary data files for the SU2 MLP classes to function. -# MLP class file structure - -The MLP class prototype files can be found under Common/include/toolboxes/multilayer_perceptron. +# MLP class description +The MLP class prototype files can be found under SU2/Common/include/toolboxes/multilayer_perceptron. An MLP computes data by having its inputs manipulated by a series of operations, depending on the architecture of the network. Interpreting the network architecture and its respective input and output variables is therefore crucial for the MLP functionality. Information regarding the network architecture, input and output variables, and activation functions is provided to SU2 via a .mlp input file, of which an example is provided in this folder. More information regarding the file structure is provided in a later section. The main MLP class in SU2 which can be used for look-up operations is the CLookUp_ANN class. This class allows to load one or multiple networks given a list of input files. Each of these files is read by the CReadNeuralNetwork class. This class reads the .mlp input file and stores the architectural information listed in it. It will also run some compatibility checks on the file format. For example, the total layer count should be provided before listing the activation functions. For every read .mlp file, an MLP class is generated using the CNeuralNetwork class. This class stores the input and output variables, network architecture, activation functions, and weights and biases of every synapse and neuron. Currently, the CNeuralNetwork class only supports simple, feed-forward, dense neural network types. Supported activation function types are: @@ -19,15 +22,26 @@ The main MLP class in SU2 which can be used for look-up operations is the CLookU 8: gelu 9: exponential (y = exp(x)) -It is possible to load multiple networks with different input and output variables. In order to ensure the right CNeuralNetwork class(es) is/are selected when performing a regression given a set of input variables, the CIOMap class is used. To demonstrate what this class does, let's say you want to perform a regression operation predicting the temperature based on density and static energy. Two MLP files were loaded into the CLookUp_ANN class. MLP 1 has (ordered) inputs 1:static energy and 2:density and (ordered) outputs 1:specific heat, 2:speed of sound, 3:temperature. MLP 2 has the (ordered) inputs 1:pressure, 2:density and (ordered) outputs 1:temperature, 2:specific heat, 3:entropy. The CIOMap class checks which of the loaded MLPs have the same input variables (density and static energy) and include one or multiple of the output variables (temperature) of the desired regression operation. In this case, the CIOMap class will select MLP 1 only, since it has the same input variables as the regression operation and has temperature in its output variables. Although MLP 2 has temperature as one of its output variables, it is not included, as it does not include static energy in its input variables. An error will be raised if none of the loaded MLP's contains all the input variables or if some of the desired outputs are missing from the MLP output variables. +It is possible to load multiple networks with different input and output variables. An error will be raised if none of the loaded MLP's contains all the input variables or if some of the desired outputs are missing from the MLP output variables. +In addition to loading multiple networks with different input and output variables, it is possible to load multple networks with the same input and output variables, but with different data ranges. When performing a regression operation, the CLookUp_ANN class will check which of the loaded MLPs with the right input and output variables has an input variable normalization range that includes the query point. The corresponding MLP will then be selected for regression. If the query point lies outside the data range of all loaded MLPs, extrapolation will be performed using the MLP with a data range close to the query point. -In addition to loading multiple networks with different input and output variables, it is possible to load multple networks with the same input and output variables, but with different data ranges. When performing a regression operation, the CLookUp_ANN class will check which of the loaded MLPs with the right input and output variables has an input variable normalization range that includes the query point. The corresponding MLP will then be selected for regression. If the query point lies outside the data range of all loaded MLPs, extrapolation will be performed using the MLP with a data range close to the query point. For example, two MLPs are loaded with input variables 1:density, 2:static energy and output variables 1:temperature, 2:pressure, 3:speed of sound. MLP 1 has a density normalization range between 1.0 and 10.0 kg m^{-3}, whereas MLP 2 has a range between 10.0 and 100.0 kg m^{-3}. If regression is performed on a query point with a density value of 5.0 kg m^{-3}, MLP 1 will be selected for regression. If the density is for example 50 kg m^{-3}, MLP 2 will be selected. If the density is 0.5 kg m^{-3}, MLP 1 will be selected as its data range lies closer to the query point. Vice versa if the density is for example 150 kg m^{-3}. +# MLP Definition +In order to load an MLP architecture into SU2, an input file needs to be provided describing the network architecture, as well as the input and output variable names and ranges. An example of such an input file is provided in this folder (MLP_Air_SU2.mlp). This file can be generated from an MLP trained through Tensorflow using the "Tensorflow2SU2.py" script. Additional information regarding the translation from a Tensorflow model to an SU2 input file is provided in the python code. # Data-Driven Fluid Model Class -The MLP class is implemented in the CDataDrivenFluid fluid model in SU2. Here, MLP's can be used to determine the thermodynamic state of complex fluids. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library or when computational performance is important. +The MLP class is used in the CDataDrivenFluid fluid model class in SU2. Here, MLP's can be used to determine the thermodynamic state of complex fluids. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library or when computational performance is important. Currently, MLPs in SU2 can only be used in the context of a fluid model. The config option "DATADRIVEN_FLUID" for fluid model allows for the use of an MLP or look-up table for thermodynamic state evaluation. The option "INTERPOLATION_METHOD" refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are "LUT" for a look-up table based approach, or "MLP" for the use of an MLP. In this tutorial, focus lies on the latter option. -The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables . The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. +The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables. The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. +The input variables for the MLP should be named "Density" and "Energy". The output variables should be named: +"s": fluid entropy +"dsde_rho": first entropy derivative w.r.t. static energy +"dsdrho_e": first entropy derivative w.r.t. density +"d2sdedrho": second entropy derivative w.r.t density and static energy +"d2sde2": second entropy derivative w.r.t. static energy +"d2sdrho2": second entropy derivative w.r.t. density + +The order of the input or output variables in the input file does not affect the MLP or LUT regression processes. From 3dd1266402a96fad202d7c4d91592a1d78c472d2 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 26 Mar 2023 11:38:19 +0100 Subject: [PATCH 06/16] remove MUSCL_FLOW=YES from JST cases --- .../Turbulent_ONERAM6/turb_ONERAM6.cfg | 15 +-------------- .../turb_SA_RAE2822.cfg | 2 +- .../unsteady_naca0012_opt.cfg | 4 ---- multiphysics/unsteady_fsi_python/Ma01/fluid.cfg | 10 +--------- multiphysics/unsteady_fsi_python/Ma02/fluid.cfg | 8 -------- multiphysics/unsteady_fsi_python/Ma03/fluid.cfg | 8 -------- multiphysics/unsteady_fsi_python/Ma0357/fluid.cfg | 8 -------- multiphysics/unsteady_fsi_python/Ma0364/fluid.cfg | 8 -------- 8 files changed, 3 insertions(+), 60 deletions(-) diff --git a/compressible_flow/Turbulent_ONERAM6/turb_ONERAM6.cfg b/compressible_flow/Turbulent_ONERAM6/turb_ONERAM6.cfg index 88aaafc..bb50a15 100644 --- a/compressible_flow/Turbulent_ONERAM6/turb_ONERAM6.cfg +++ b/compressible_flow/Turbulent_ONERAM6/turb_ONERAM6.cfg @@ -185,22 +185,9 @@ MG_DAMP_PROLONGATION= 0.7 % -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% % -% Convective numerical method (JST, LAX-FRIEDRICH, CUSP, ROE, AUSM, HLLC, -% TURKEL_PREC, MSW) +% Convective numerical method CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -MUSCL_FLOW= YES -% -% Slope limiter (NONE, VENKATAKRISHNAN, VENKATAKRISHNAN_WANG, -% BARTH_JESPERSEN, VAN_ALBADA_EDGE) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% -% Coefficient for the Venkat's limiter (upwind scheme). A larger values decrease -% the extent of limiting, values approaching zero cause -% lower-order approximation to the solution (0.05 by default) -VENKAT_LIMITER_COEFF= 0.05 -% % 2nd and 4th order artificial dissipation coefficients for % the JST method ( 0.5, 0.02 by default ) JST_SENSOR_COEFF= ( 0.5, 0.02 ) diff --git a/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg b/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg index 28aa434..2077016 100644 --- a/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg +++ b/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg @@ -109,7 +109,7 @@ OBJECTIVE_FUNCTION= DRAG % % Monotonic Upwind Scheme for Conservation Laws (TVD) in the flow equations. % Required for 2nd order upwind schemes (NO, YES) -MUSCL_FLOW= YES +MUSCL_FLOW= NO % % Slope limiter (NONE, VENKATAKRISHNAN, VENKATAKRISHNAN_WANG, % BARTH_JESPERSEN, VAN_ALBADA_EDGE) diff --git a/design/Unsteady_Shape_Opt_NACA0012/unsteady_naca0012_opt.cfg b/design/Unsteady_Shape_Opt_NACA0012/unsteady_naca0012_opt.cfg index 284266b..b04aa84 100644 --- a/design/Unsteady_Shape_Opt_NACA0012/unsteady_naca0012_opt.cfg +++ b/design/Unsteady_Shape_Opt_NACA0012/unsteady_naca0012_opt.cfg @@ -136,10 +136,6 @@ LINEAR_SOLVER_ITER= 5 % TURKEL_PREC, MSW) CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -% -% MUSCL_FLOW= YES -% % 1st, 2nd and 4th order artificial dissipation coefficients JST_SENSOR_COEFF= ( 0.5, 0.01 ) % diff --git a/multiphysics/unsteady_fsi_python/Ma01/fluid.cfg b/multiphysics/unsteady_fsi_python/Ma01/fluid.cfg index 15dbd83..bcfb42c 100644 --- a/multiphysics/unsteady_fsi_python/Ma01/fluid.cfg +++ b/multiphysics/unsteady_fsi_python/Ma01/fluid.cfg @@ -121,18 +121,10 @@ LINEAR_SOLVER_ITER= 10 % % -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% % -% Convective numerical method (JST, LAX-FRIEDRICH, CUSP, ROE, AUSM, HLLC, +% Convective numerical method (JST, LAX-FRIEDRICH, ROE, AUSM, HLLC, % TURKEL_PREC, MSW) CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -% -% Monotonic Upwind Scheme for Conservation Laws (TVD) in the flow equations. -% Required for 2nd order upwind schemes (NO, YES) -MUSCL_FLOW= YES -% Slope limiter (VENKATAKRISHNAN, MINMOD) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% JST_SENSOR_COEFF= ( 0.5, 0.01 ) % Time discretization (RUNGE-KUTTA_EXPLICIT, EULER_IMPLICIT, EULER_EXPLICIT) TIME_DISCRE_FLOW= EULER_IMPLICIT diff --git a/multiphysics/unsteady_fsi_python/Ma02/fluid.cfg b/multiphysics/unsteady_fsi_python/Ma02/fluid.cfg index 0ad3f6f..80bd6f1 100644 --- a/multiphysics/unsteady_fsi_python/Ma02/fluid.cfg +++ b/multiphysics/unsteady_fsi_python/Ma02/fluid.cfg @@ -125,14 +125,6 @@ LINEAR_SOLVER_ITER= 10 % TURKEL_PREC, MSW) CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -% -% Monotonic Upwind Scheme for Conservation Laws (TVD) in the flow equations. -% Required for 2nd order upwind schemes (NO, YES) -MUSCL_FLOW= YES -% Slope limiter (VENKATAKRISHNAN, MINMOD) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% JST_SENSOR_COEFF= ( 0.5, 0.01 ) % Time discretization (RUNGE-KUTTA_EXPLICIT, EULER_IMPLICIT, EULER_EXPLICIT) TIME_DISCRE_FLOW= EULER_IMPLICIT diff --git a/multiphysics/unsteady_fsi_python/Ma03/fluid.cfg b/multiphysics/unsteady_fsi_python/Ma03/fluid.cfg index d7b86c5..4913d24 100644 --- a/multiphysics/unsteady_fsi_python/Ma03/fluid.cfg +++ b/multiphysics/unsteady_fsi_python/Ma03/fluid.cfg @@ -125,14 +125,6 @@ LINEAR_SOLVER_ITER= 10 % TURKEL_PREC, MSW) CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -% -% Monotonic Upwind Scheme for Conservation Laws (TVD) in the flow equations. -% Required for 2nd order upwind schemes (NO, YES) -MUSCL_FLOW= YES -% Slope limiter (VENKATAKRISHNAN, MINMOD) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% JST_SENSOR_COEFF= ( 0.5, 0.01 ) % Time discretization (RUNGE-KUTTA_EXPLICIT, EULER_IMPLICIT, EULER_EXPLICIT) TIME_DISCRE_FLOW= EULER_IMPLICIT diff --git a/multiphysics/unsteady_fsi_python/Ma0357/fluid.cfg b/multiphysics/unsteady_fsi_python/Ma0357/fluid.cfg index baa2370..f2d14ea 100644 --- a/multiphysics/unsteady_fsi_python/Ma0357/fluid.cfg +++ b/multiphysics/unsteady_fsi_python/Ma0357/fluid.cfg @@ -125,14 +125,6 @@ LINEAR_SOLVER_ITER= 10 % TURKEL_PREC, MSW) CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -% -% Monotonic Upwind Scheme for Conservation Laws (TVD) in the flow equations. -% Required for 2nd order upwind schemes (NO, YES) -MUSCL_FLOW= YES -% Slope limiter (VENKATAKRISHNAN, MINMOD) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% JST_SENSOR_COEFF= ( 0.5, 0.01 ) % Time discretization (RUNGE-KUTTA_EXPLICIT, EULER_IMPLICIT, EULER_EXPLICIT) TIME_DISCRE_FLOW= EULER_IMPLICIT diff --git a/multiphysics/unsteady_fsi_python/Ma0364/fluid.cfg b/multiphysics/unsteady_fsi_python/Ma0364/fluid.cfg index 8d1584c..6c3f9c7 100644 --- a/multiphysics/unsteady_fsi_python/Ma0364/fluid.cfg +++ b/multiphysics/unsteady_fsi_python/Ma0364/fluid.cfg @@ -125,14 +125,6 @@ LINEAR_SOLVER_ITER= 10 % TURKEL_PREC, MSW) CONV_NUM_METHOD_FLOW= JST % -% Spatial numerical order integration (1ST_ORDER, 2ND_ORDER, 2ND_ORDER_LIMITER) -% -% Monotonic Upwind Scheme for Conservation Laws (TVD) in the flow equations. -% Required for 2nd order upwind schemes (NO, YES) -MUSCL_FLOW= YES -% Slope limiter (VENKATAKRISHNAN, MINMOD) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% JST_SENSOR_COEFF= ( 0.5, 0.01 ) % Time discretization (RUNGE-KUTTA_EXPLICIT, EULER_IMPLICIT, EULER_EXPLICIT) TIME_DISCRE_FLOW= EULER_IMPLICIT From 54eda4f5807a494edc24e5d796b76a2e03f011b9 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Mon, 27 Mar 2023 08:25:07 +0100 Subject: [PATCH 07/16] more cases with MUSCL + JST --- .../inv_NACA0012_basic.cfg | 7 ------- .../Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/design/Inviscid_2D_Unconstrained_NACA0012/inv_NACA0012_basic.cfg b/design/Inviscid_2D_Unconstrained_NACA0012/inv_NACA0012_basic.cfg index 8224e98..18039e9 100644 --- a/design/Inviscid_2D_Unconstrained_NACA0012/inv_NACA0012_basic.cfg +++ b/design/Inviscid_2D_Unconstrained_NACA0012/inv_NACA0012_basic.cfg @@ -133,9 +133,6 @@ MG_DAMP_PROLONGATION= 1.0 % ROE-2ND_ORDER) CONV_NUM_METHOD_FLOW= JST % -% Slope limiter (VENKATAKRISHNAN) -SLOPE_LIMITER_FLOW= VENKATAKRISHNAN -% % 2nd and 4th order artificial dissipation coefficients JST_SENSOR_COEFF= ( 0.5, 0.02 ) % @@ -154,9 +151,6 @@ OBJECTIVE_FUNCTION= DRAG % ROE-2ND_ORDER) CONV_NUM_METHOD_ADJFLOW= JST % -% Slope limiter (VENKATAKRISHNAN, SHARP_EDGES) -SLOPE_LIMITER_ADJFLOW= VENKATAKRISHNAN -% % 2nd, and 4th order artificial dissipation coefficients ADJ_JST_SENSOR_COEFF= ( 0.0, 0.02 ) % @@ -278,7 +272,6 @@ SURFACE_FILENAME= surface_flow % Output file surface adjoint coefficient (w/o extension) SURFACE_ADJ_FILENAME= surface_adjoint % -% % Screen output SCREEN_OUTPUT= (INNER_ITER, RMS_DENSITY, RMS_ENERGY, LIFT, DRAG) % diff --git a/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg b/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg index 2077016..54edd22 100644 --- a/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg +++ b/design/Turbulent_2D_Constrained_RAE2822/turb_SA_RAE2822.cfg @@ -125,7 +125,7 @@ SLOPE_LIMITER_TURB= VENKATAKRISHNAN % % Monotonic Upwind Scheme for Conservation Laws (TVD) in the adjoint flow equations. % Required for 2nd order upwind schemes (NO, YES) -MUSCL_ADJFLOW= YES +MUSCL_ADJFLOW= NO % % Slope limiter (NONE, VENKATAKRISHNAN, BARTH_JESPERSEN, VAN_ALBADA_EDGE, % SHARP_EDGES, WALL_DISTANCE) From d749112f58153419f4f4fa81e778bd4f38603bab Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Mon, 17 Apr 2023 15:07:27 +0200 Subject: [PATCH 08/16] Added tutorial for data-driven fluid model under NICFD nozzle --- .../MLP_Air/keras_metadata.pb | 7 - .../MLP_Air/saved_model.pb | Bin 112848 -> 0 bytes .../variables/variables.data-00000-of-00001 | Bin 28204 -> 0 bytes .../MLP_Air/variables/variables.index | Bin 1732 -> 0 bytes common/multilayer_perceptron/MLP_Air_SU2.mlp | 138 ----- common/multilayer_perceptron/README.md | 47 -- .../multilayer_perceptron/Tensorflow2SU2.py | 69 --- common/multilayer_perceptron/write_SU2_MLP.py | 137 ----- .../DataDriven/Generate_Dataset.py | 141 ++++++ .../NICFD_nozzle/DataDriven/LUTWriter.m | 131 +++++ .../NICFD_nozzle/DataDriven/MLPTrainer.py | 476 ++++++++++++++++++ .../NICFD_nozzle/DataDriven/MLP_Air.mlp | 108 ++++ .../NICFD_nozzle/DataDriven/README.md | 32 ++ .../DataDriven/datadriven_nozzle.cfg | 130 +++++ 14 files changed, 1018 insertions(+), 398 deletions(-) delete mode 100644 common/multilayer_perceptron/MLP_Air/keras_metadata.pb delete mode 100644 common/multilayer_perceptron/MLP_Air/saved_model.pb delete mode 100644 common/multilayer_perceptron/MLP_Air/variables/variables.data-00000-of-00001 delete mode 100644 common/multilayer_perceptron/MLP_Air/variables/variables.index delete mode 100644 common/multilayer_perceptron/MLP_Air_SU2.mlp delete mode 100644 common/multilayer_perceptron/README.md delete mode 100644 common/multilayer_perceptron/Tensorflow2SU2.py delete mode 100644 common/multilayer_perceptron/write_SU2_MLP.py create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/Generate_Dataset.py create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/LUTWriter.m create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/MLPTrainer.py create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/MLP_Air.mlp create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/README.md create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg diff --git a/common/multilayer_perceptron/MLP_Air/keras_metadata.pb b/common/multilayer_perceptron/MLP_Air/keras_metadata.pb deleted file mode 100644 index 3b0e6bd..0000000 --- a/common/multilayer_perceptron/MLP_Air/keras_metadata.pb +++ /dev/null @@ -1,7 +0,0 @@ - -�'root"_tf_keras_sequential*�&{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "units": 50, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 30, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 6, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 10, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 2]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 2]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2]}, "float32", "dense_input"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2]}, "float32", "dense_input"]}, "keras_version": "2.9.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}, "shared_object_id": 0}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "units": 50, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 30, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6}, {"class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 6, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9}]}}, "training_config": {"loss": "mean_squared_error", "metrics": [[{"class_name": "MeanMetricWrapper", "config": {"name": "mape", "dtype": "float32", "fn": "mean_absolute_percentage_error"}, "shared_object_id": 12}]], "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Adam", "config": {"name": "Adam", "learning_rate": {"class_name": "ExponentialDecay", "config": {"initial_learning_rate": 0.001, "decay_steps": 100000, "decay_rate": 1.0, "staircase": false, "name": null}, "shared_object_id": 13}, "decay": 0.0, "beta_1": 0.8999999761581421, "beta_2": 0.9990000128746033, "epsilon": 1e-08, "amsgrad": false}}}}2 -�root.layer_with_weights-0"_tf_keras_layer*�{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2]}, "dtype": "float32", "units": 50, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2}}, "shared_object_id": 14}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2]}}2 -�root.layer_with_weights-1"_tf_keras_layer*�{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 30, "activation": "swish", "use_bias": true, "kernel_initializer": {"class_name": "HeUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 50}}, "shared_object_id": 15}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 50]}}2 -�root.layer_with_weights-2"_tf_keras_layer*�{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 6, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 7}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 8}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 9, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 30}}, "shared_object_id": 16}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 30]}}2 -�Lroot.keras_api.metrics.0"_tf_keras_metric*�{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 17}2 -�Mroot.keras_api.metrics.1"_tf_keras_metric*�{"class_name": "MeanMetricWrapper", "name": "mape", "dtype": "float32", "config": {"name": "mape", "dtype": "float32", "fn": "mean_absolute_percentage_error"}, "shared_object_id": 12}2 \ No newline at end of file diff --git a/common/multilayer_perceptron/MLP_Air/saved_model.pb b/common/multilayer_perceptron/MLP_Air/saved_model.pb deleted file mode 100644 index c8c593fd07789b92d4ee68646506c09206478c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112848 zcmeHwZEPG#b{KnxoEbiTNGwv)s40!O)c5R4oT(Xp&E4&;sMGFhKO`;1)!u%b=7wa8 zniGe^n;BBOdx?EM=j`*^XWaSD&UuqF5XEquwG#&p^5r0K&PiavKny2862p#z1aR!c zK@bF�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/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
      #Y>J;EIga0xkolsHa>cEI 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 - -[number of layers] -4 - -[neurons per layer] -2 -50 -30 -6 - -[activation function] -linear -swish -swish -linear - -[input names] -Density -Energy - -[input normalization] -+2.8103800000000001e-01 +2.7297899999999998e+01 -+1.7995600000000000e+05 +4.4831800000000000e+05 - -[output names] -s -dsde_rho -dsdrho_e -d2sde2 -d2sdedrho -d2sdrho2 - -[output normalization] -+5.7472900000000000e+03 +7.7785200000000004e+03 -+1.6686100000000001e-03 +4.0000000000000001e-03 --1.0563199999999999e+03 -1.0714800000000000e+01 --2.1545900000000001e-08 -3.5737000000000002e-09 --4.2049399999999996e-06 -4.9376699999999998e-07 -+3.9691700000000002e-01 +3.7578600000000001e+03 - - - -[weights per layer] - -+3.6929151415824890e-01 +1.5270020230673254e-04 +2.4933646619319916e-01 +3.0354545742738992e-05 -1.0537925958633423e+00 +7.7660166425630450e-05 -1.2365056318230927e-04 -2.9453914612531662e-04 -3.5883159637451172e+01 -1.5378948211669922e+01 -6.8733987808227539e+00 -5.8702645301818848e+00 -1.9042372703552246e+00 -8.4316224092617631e-04 -4.9291334152221680e+00 +2.9914185870438814e-04 -5.3142815828323364e-01 +1.8670477867126465e+00 +5.4382234811782837e-01 +6.1831429600715637e-02 -2.4027202744036913e-04 -2.5781410217285156e+01 +9.7165042161941528e-01 +2.3599816486239433e-03 +9.3184804427437484e-05 -1.6268554687500000e+01 -3.8540887832641602e+00 -7.6959331636317074e-05 -7.1955889463424683e-01 -5.1619550504256040e-05 +2.7495259046554565e-01 +1.4827370643615723e+00 -1.1923433339688927e-04 -4.9090504035120830e-05 -3.3292938023805618e-02 +2.9765415191650391e-01 +1.7157747745513916e+00 +1.9207551667932421e-04 -3.3151943206787109e+01 -6.2643915414810181e-01 -3.5413293517194688e-04 +1.7423331155441701e-04 -1.2850399070885032e-04 +8.1385415792465210e-01 -3.3070361614227295e+00 -6.4246773719787598e-01 +9.1459321975708008e-01 +6.1090111732482910e-01 +2.7712251176126301e-04 -1.7471460103988647e+00 --1.7781696319580078e+00 +2.5634345365688205e-04 -3.9426505565643311e+00 +1.3325139298103750e-04 +5.4886531829833984e-01 +3.2754268613643944e-04 -4.9537164159119129e-04 -3.2966319122351706e-04 +5.1735714077949524e-02 -3.1469173729419708e-02 -9.8991896957159042e-03 -3.9214271306991577e-01 +4.9450725317001343e-01 -4.7048303531482816e-04 +1.3683696091175079e-01 +2.2467868984676898e-04 -2.6647317409515381e+00 +3.8101166486740112e-01 -4.1199908256530762e+00 +5.2742868661880493e-02 -4.3708801968023181e-04 -2.9172554612159729e-01 +4.1963109374046326e-01 +6.6398701164871454e-05 -6.8769522476941347e-04 +1.2727175652980804e-01 -7.2043105959892273e-02 -2.0430759468581527e-04 +6.3315564393997192e-01 +1.4132642536424100e-04 +9.6133637428283691e-01 -3.7689182162284851e-01 +1.0792881221277639e-04 +2.4200728512369096e-04 -6.9551312923431396e-01 +4.3708702921867371e-01 +6.4779376983642578e-01 -2.5643486878834665e-04 +2.5780251622200012e-01 +9.3162471055984497e-01 -5.0407827075105160e-05 +1.5735172200948000e-04 -5.5459118448197842e-04 -2.3604583740234375e-01 -1.0009437799453735e+00 -3.6287491321563721e+00 +7.0432299375534058e-01 -1.9683406352996826e+00 +6.9983873981982470e-04 -3.1020140647888184e+00 - - -+4.3242743611335754e-01 -2.0152612030506134e-01 +4.2487236857414246e-01 -1.4060926437377930e-01 +3.5611391067504883e-01 +3.8416987657546997e-01 +3.4843605756759644e-01 +1.2965878844261169e-01 +1.7899769544601440e-01 +6.4167845249176025e-01 -1.8794016540050507e-01 -3.2068601250648499e-01 +5.5609565973281860e-01 +6.6185551881790161e-01 +7.7786153554916382e-01 +5.5007506161928177e-02 +1.0268911123275757e+00 +2.6148343086242676e-01 +3.0915755778551102e-02 +5.6253319978713989e-01 -1.0472400486469269e-01 +4.5771890878677368e-01 +5.6604319810867310e-01 +3.0647527892142534e-03 +7.8725802898406982e-01 +1.5767116546630859e+00 +1.0197539627552032e-01 +3.4826204180717468e-01 -9.3634910881519318e-02 +2.2516651451587677e-01 -+3.1858716160058975e-02 +4.7669652849435806e-03 +8.2218548050150275e-04 +2.2676573134958744e-03 +1.7562425928190351e-03 +8.5355812916532159e-04 -9.3853417783975601e-03 -4.5522991567850113e-03 +3.5094360355287790e-03 -1.4104201691225171e-03 +7.8038568608462811e-04 -1.0691713541746140e-03 +7.2273057885468006e-03 -4.9356865929439664e-04 -1.3735576532781124e-02 +4.9159475602209568e-03 -3.3829659223556519e-02 +4.6478039585053921e-03 -1.9656037329696119e-04 -1.8050285289064050e-03 +1.5193200670182705e-02 +2.1212650608504191e-05 -1.4283211203292012e-03 +1.0053974576294422e-02 +3.1864747870713472e-03 -2.3060729727149010e-03 +2.3312221746891737e-03 -2.6863340754061937e-03 +2.5018313899636269e-02 -1.9304169341921806e-02 --3.2954218983650208e-01 +2.7149459347128868e-02 -9.2168031260371208e-03 +1.0021843761205673e-01 +9.6516169607639313e-02 +1.1407697200775146e+00 +2.2811387479305267e-01 +5.0422185659408569e-01 +2.0272505283355713e-01 -3.3762302994728088e-01 -2.3715513944625854e-01 +6.5728969871997833e-02 +2.9422479867935181e-01 -1.5325102210044861e-01 +8.5068903863430023e-02 -1.2669314444065094e-01 +5.3580486774444580e-01 -1.5196581184864044e-01 +2.2472904995083809e-02 +7.5135523080825806e-01 +2.9028221964836121e-01 +1.6049098968505859e-01 -1.0496000200510025e-01 -2.4076905846595764e-01 -8.1763714551925659e-02 -6.2937466427683830e-03 +5.1693111658096313e-02 -2.4052043259143829e-01 -9.1288462281227112e-02 +3.7583682686090469e-02 -+9.4578284770250320e-03 -6.6361445933580399e-03 -2.3258216679096222e-02 +1.9040144979953766e-02 -2.8450551908463240e-03 -3.9059817790985107e-03 +1.0820716619491577e-02 -4.7215702943503857e-03 +1.9566798582673073e-03 -1.7017377540469170e-03 -2.2400792222470045e-03 -3.0097963754087687e-03 +9.9388202652335167e-03 +2.6393039152026176e-02 +6.9663594476878643e-03 -3.6136090056970716e-04 -2.6950763538479805e-02 +8.3526335656642914e-03 -2.2521151549881324e-05 -8.7055889889597893e-04 +4.4280622154474258e-02 +5.4073007777333260e-04 +6.0210744850337505e-03 +1.5728175640106201e-02 +6.5129473805427551e-03 -1.3322118669748306e-02 -9.1222003102302551e-03 -6.3537438400089741e-03 +1.5694532543420792e-02 -4.9915206618607044e-03 -+2.5690364837646484e-01 -7.2131007909774780e-02 +9.6599012613296509e-02 -9.8132021725177765e-02 +6.6092878580093384e-01 -5.2847141027450562e-01 +3.1127160787582397e-01 -7.5855240225791931e-02 +4.2579567432403564e-01 +1.1811051368713379e+00 +1.6754950582981110e-01 +1.2146276980638504e-01 +7.7237445116043091e-01 +4.1062575578689575e-01 +7.2361618280410767e-01 -2.2506166994571686e-01 +8.6152184009552002e-01 +3.6085695028305054e-01 -8.6687561124563217e-03 -5.8607812970876694e-02 +1.5962829813361168e-02 -4.2869007587432861e-01 -2.6351806521415710e-01 +3.6850959062576294e-01 +5.9893167018890381e-01 -3.9734604954719543e-01 +4.7752622514963150e-02 +5.0842672586441040e-02 -2.8039854764938354e-01 -2.7658936381340027e-01 --1.0025120340287685e-02 +3.7257978692650795e-03 +1.0542979463934898e-02 -2.6399022899568081e-03 -2.1860571578145027e-03 -1.0235457448288798e-03 -2.1643948275595903e-03 -3.0659113544970751e-03 -1.2330830097198486e-02 +8.2224135985597968e-04 +6.6285594366490841e-03 -3.5768099129199982e-02 -1.4918704517185688e-02 +2.8748167678713799e-03 +3.0586891807615757e-03 +3.8599178660660982e-03 -2.8484920039772987e-02 -4.0392396040260792e-03 +4.2457136441953480e-04 +2.1674760500900447e-04 -4.0382005274295807e-02 -1.9845709903165698e-04 -4.6479278244078159e-03 +1.5068056061863899e-02 -2.4174194550141692e-05 +3.5311139654368162e-03 +4.9875555559992790e-03 +1.2843634467571974e-03 -2.2264603525400162e-02 -1.3867511413991451e-02 -+6.8696779198944569e-03 +8.5102925077080727e-03 +1.0486470535397530e-02 -1.9548733253031969e-03 -1.5345842111855745e-03 -2.9227533377707005e-03 +6.4325015991926193e-03 +5.9908851981163025e-03 -1.0265110060572624e-02 -2.8397568967193365e-03 -1.3936941977590322e-03 -1.7847012728452682e-02 +3.0008300673216581e-03 -1.6013849526643753e-02 -1.4183917082846165e-02 +4.9886638298630714e-03 +2.5005167350172997e-02 -7.5786854140460491e-03 +3.0900651472620666e-04 -5.1418757066130638e-03 -7.0404484868049622e-03 +2.3911840980872512e-04 -5.9202280826866627e-03 -9.9647347815334797e-04 -8.2057033432647586e-04 -7.1103638038039207e-04 +7.7148922719061375e-03 +1.4406722038984299e-02 -1.9248669967055321e-02 -7.4602155946195126e-03 --1.7049074172973633e-02 -2.5668699527159333e-04 +4.9923833459615707e-02 +3.1140292412601411e-04 +3.7120499182492495e-03 +1.7192844534292817e-03 -2.0293358713388443e-02 -4.0995092131197453e-03 +1.3460387475788593e-02 +2.7555064298212528e-03 -8.9676091447472572e-03 +1.6118723899126053e-02 +4.4113891199231148e-03 -2.5700574740767479e-02 -1.3135015964508057e-02 -1.8656749278306961e-02 -3.7989150732755661e-03 +5.1616663113236427e-03 -8.9734198991209269e-04 +5.7040606625378132e-03 -4.9555944278836250e-03 -4.2704996303655207e-05 +1.2272282503545284e-02 -4.7126691788434982e-03 +3.7109162658452988e-03 -5.8229877613484859e-03 -1.7677089199423790e-02 -1.1149644851684570e-02 -1.4098859392106533e-02 +1.9882855936884880e-02 -+8.2644015550613403e-01 +5.2394952774047852e+00 -3.4020537137985229e-01 +7.8135174512863159e-01 +2.2465181350708008e+00 -2.1459846198558807e-01 +3.6425748467445374e-01 -1.4376242458820343e-01 +2.6386327743530273e+00 -5.4195237159729004e-01 +1.5154919028282166e-01 +1.2620374560356140e-01 +8.7099895477294922e+00 -7.1400797367095947e-01 +6.0754280090332031e+00 +1.4186798036098480e-01 +3.9521465301513672e+00 +8.7538260221481323e-01 -1.3924016058444977e-01 -2.7620699256658554e-02 -9.5145292580127716e-02 -6.6411703824996948e-02 +3.6149901151657104e-01 +3.1425652503967285e+00 +4.5519962906837463e-01 -4.3223556131124496e-02 -1.2316905260086060e+00 -1.1227079480886459e-01 -8.7096095085144043e-02 -4.0298434905707836e-03 -+5.0322633981704712e-01 +9.7080171108245850e-01 +1.3065667450428009e-01 -4.7049796581268311e-01 +1.8514394760131836e+00 -4.0630023926496506e-02 -7.8300628811120987e-03 +1.2560769915580750e-01 -8.4785270690917969e-01 +4.8916995525360107e-02 +1.1186013370752335e-01 -2.3233082890510559e-01 +6.6069283485412598e+00 -1.7577530443668365e-01 +4.1280512809753418e+00 +8.5813246667385101e-02 +1.9183015823364258e+00 -3.3391037583351135e-01 +3.2626760005950928e-01 -5.4869156330823898e-02 +2.4028342962265015e-01 +1.5564958751201630e-01 +5.1082175970077515e-01 -1.5160245895385742e+00 +1.7351039648056030e+00 +4.5239481329917908e-01 +9.3585574626922607e-01 +5.8401602506637573e-01 +2.3770886659622192e-01 -6.1981849372386932e-02 -+1.0217906236648560e+00 +7.5205880403518677e-01 +4.2177858948707581e-01 +2.5080272555351257e-01 +2.0393788814544678e+00 +4.8246130347251892e-01 +2.8642457723617554e-01 +2.2898395359516144e-01 +1.5432484447956085e-01 +1.3003411889076233e-01 -2.0604547858238220e-01 -4.8750774003565311e-03 +2.9015355110168457e+00 +6.7537978291511536e-02 +2.7671551704406738e+00 -2.6387035846710205e-01 +1.4190884828567505e+00 -3.9204391837120056e-01 +5.6930955499410629e-02 -3.3001087605953217e-02 -1.7789073288440704e-01 -1.6580520197749138e-02 +9.1462463140487671e-01 -3.2010641694068909e-01 +2.1455535888671875e+00 +2.1523131430149078e-01 +5.9659928083419800e-01 -2.8201630711555481e-01 -1.7118807137012482e-01 -1.0804181918501854e-02 --2.8766500949859619e-01 +6.7559343576431274e-01 -3.0623912811279297e-01 +1.3951915502548218e-01 +1.1241505146026611e+00 +2.3253284394741058e-01 -2.4459943175315857e-01 +1.0966902971267700e-01 +3.7887340784072876e-01 +1.3687340915203094e-01 +1.4313179254531860e-01 +2.0586932078003883e-02 +1.7451069355010986e+00 +1.4322732388973236e-01 +3.4329488873481750e-01 +3.2707672566175461e-02 +9.1477584838867188e-01 +2.1625246107578278e-01 -1.5616869926452637e-01 +1.5595932304859161e-01 -5.3291177749633789e-01 +3.7912249565124512e-02 +1.2653671205043793e-01 +9.7414374351501465e-01 +1.8958946466445923e+00 -5.3626742213964462e-02 +2.8034800291061401e-01 +1.7073439061641693e-01 -1.5496052801609039e-01 +1.8031270802021027e-01 -+1.4070086181163788e-01 +6.6577091813087463e-02 +3.9856258034706116e-01 -3.7496206164360046e-01 +6.4526325464248657e-01 -6.6198039054870605e-01 +1.3689357042312622e-01 -1.5149764949455857e-03 +1.3907298445701599e-01 +1.2429234981536865e+00 -2.5816580653190613e-01 -1.6181237995624542e-01 +9.7358369827270508e-01 -8.7058320641517639e-02 +8.1239694356918335e-01 -7.8995518386363983e-02 +9.2406255006790161e-01 +4.9234649538993835e-01 +7.3128700256347656e-02 -2.5518080592155457e-01 +3.1844237446784973e-01 -2.5507435202598572e-01 -3.5262075066566467e-01 +3.9172670245170593e-01 +8.2287526130676270e-01 +1.7247526347637177e-01 -3.6885634064674377e-02 +3.8126674294471741e-01 +1.3211488723754883e-01 +2.1772584319114685e-01 --6.9556094706058502e-02 -2.3069661110639572e-02 -1.3717916794121265e-02 -8.8467756286263466e-03 +5.8716125786304474e-03 +3.7325602024793625e-03 -2.3324651643633842e-02 -9.2282500118017197e-03 -2.6207769289612770e-02 +1.1868415400385857e-02 -1.7062773928046227e-02 +2.8091033920645714e-02 +7.9705389216542244e-03 -1.1983542935922742e-04 +7.4014075100421906e-02 -1.6502235084772110e-02 +1.7324958741664886e-01 -2.1627815440297127e-02 -2.9407528927549720e-04 +5.5522815091535449e-04 +3.2693773508071899e-02 +3.5409576958045363e-04 -1.2929474934935570e-02 -2.4647574871778488e-02 -1.9493807107210159e-02 -2.7690066024661064e-02 -8.4063196554780006e-03 +3.3239950425922871e-03 -1.0655120946466923e-02 +2.0146470516920090e-02 -+1.2632469832897186e-01 +3.0848175287246704e-01 -3.8940477371215820e-01 -1.2781345844268799e-01 +9.1387313604354858e-01 -1.0384398698806763e+00 +2.7533778548240662e-01 +1.6096781194210052e-01 +3.7961357831954956e-01 +1.0714007616043091e+00 -1.9323191372677684e-03 -3.7156667560338974e-02 +1.8314037322998047e+00 -5.2726387977600098e-01 +1.2023153305053711e+00 +1.3361255824565887e-01 +1.0790827274322510e+00 +3.6944401264190674e-01 +6.0410622507333755e-02 -3.4766939282417297e-01 +1.5000268816947937e-01 -5.4297614842653275e-03 -9.0193641185760498e-01 +7.5848031044006348e-01 +1.7178032398223877e+00 -7.3888063430786133e-01 +9.1797173023223877e-01 -9.6498943865299225e-02 +2.4343954026699066e-01 -7.5070828199386597e-02 -+2.1885842084884644e-02 +8.5815665079280734e-04 -4.0311660617589951e-02 -2.2706279531121254e-02 -9.2475265264511108e-03 -5.1134112291038036e-03 +1.8633162602782249e-02 +6.8640534300357103e-04 -1.2986066751182079e-02 -4.0592500008642673e-03 -5.5782152339816093e-03 -6.4202570356428623e-03 -1.4777024276554585e-02 -1.8279050709679723e-03 +1.1453691869974136e-02 +2.5625347625464201e-03 +1.6111802309751511e-02 -5.8787576854228973e-03 +9.0200471458956599e-04 -6.0945535078644753e-03 +3.9568610372953117e-04 +3.1938657048158348e-04 -4.1791079565882683e-03 +8.3323456346988678e-03 -1.1005072155967355e-03 -5.2926735952496529e-03 +1.9864767789840698e-02 +1.0778944008052349e-02 +2.1666126325726509e-02 -1.1597739532589912e-02 --8.9780308306217194e-02 -2.2871592640876770e-01 +5.5717045068740845e-01 -1.9903904199600220e-01 +4.6023389697074890e-01 +7.7365756034851074e-01 +4.9243980646133423e-01 +2.2273917496204376e-01 -7.0099465548992157e-02 +8.9606672525405884e-01 -4.6324637532234192e-01 -9.6243828535079956e-02 +4.0290156006813049e-01 +4.5849952101707458e-01 +1.0912569761276245e+00 +1.9171373546123505e-01 +6.8237400054931641e-01 +1.6148269176483154e-01 +2.7262729406356812e-01 +9.3199238181114197e-02 +1.1553884744644165e+00 +1.6186654567718506e-01 -9.2577584087848663e-02 -1.3240335509181023e-02 +4.8405319452285767e-01 +1.1149458885192871e+00 -2.1547761559486389e-01 +8.6845552921295166e-01 +8.7334521114826202e-02 -2.4317525327205658e-01 --1.8448318541049957e-01 -3.2396599650382996e-01 -1.8721380829811096e-01 +2.2969193756580353e-01 -1.8044583797454834e+00 -4.3618008494377136e-01 -3.6017143726348877e-01 -1.1287555843591690e-01 -2.0601475238800049e-01 -8.2429099082946777e-01 +2.1034270524978638e-01 -8.6313843727111816e-02 -1.5807378292083740e+00 -7.3657087981700897e-02 -1.6987401247024536e+00 +1.6890159249305725e-01 -1.1385191679000854e+00 -6.3347977399826050e-01 +6.9977678358554840e-02 -4.4806292653083801e-01 +9.1111198067665100e-02 -1.1461255699396133e-01 +1.1853987723588943e-01 -1.4214818179607391e-01 -7.9828345775604248e-01 -3.8626524806022644e-01 -3.4143087267875671e-01 -4.3220424652099609e-01 +3.7050712853670120e-02 -2.0600962638854980e-01 -+4.1619628667831421e-02 +3.9472591876983643e-01 -2.4557344615459442e-01 -2.3395992815494537e-02 -3.7254017591476440e-01 +8.8917613029479980e-01 -8.3560094237327576e-02 +6.0579672455787659e-02 -7.1611218154430389e-02 -1.0868480056524277e-01 +9.2686951160430908e-02 +2.9761878773570061e-02 +3.3670842647552490e-01 +2.5912836194038391e-02 -3.6336049437522888e-01 +6.6540643572807312e-02 +1.2503598630428314e-01 +1.4717668294906616e-01 -1.2406145781278610e-01 +5.4155784845352173e-01 -4.3712845444679260e-01 +1.1439797282218933e-01 +7.0743668079376221e-01 +3.5722640156745911e-01 -2.0327972248196602e-02 +1.9909764826297760e-01 -4.5921418815851212e-02 -2.8185993432998657e-01 +1.9023196771740913e-02 -8.0230347812175751e-02 -+3.7672641873359680e-01 +3.8568828254938126e-02 +1.8125506117939949e-02 -9.5807366073131561e-02 -1.6087903082370758e-01 +6.0073994100093842e-02 +4.5122447609901428e-01 +1.7116349935531616e-01 +2.2953008115291595e-01 -2.9216760396957397e-01 -1.3550943136215210e-01 +5.1607489585876465e-02 -5.7626640796661377e-01 +4.2799834161996841e-02 -6.1495977640151978e-01 +1.0685689747333527e-01 -5.2511775493621826e-01 -2.8327611088752747e-01 +2.6085576042532921e-02 -8.1745393574237823e-02 -3.5303905606269836e-01 -3.9393627084791660e-03 +4.6102631837129593e-02 +9.0625435113906860e-01 -6.9486603140830994e-02 +1.0541830956935883e-01 +4.7364416718482971e-01 +9.5556393265724182e-02 -2.9053235054016113e-01 +3.3266907930374146e-01 -+1.5389764681458473e-02 -6.0746748931705952e-04 +2.0887984428554773e-03 +4.2621209286153316e-03 +8.2398410886526108e-03 +1.0672173229977489e-03 +4.6395962126553059e-03 +2.9176133102737367e-04 +1.9811611622571945e-02 +3.7213461473584175e-03 -1.4864127151668072e-02 +3.5249575972557068e-02 +4.0537230670452118e-03 -4.8736818134784698e-03 -1.7692517489194870e-02 -1.5383160673081875e-02 +1.4907143078744411e-02 +4.2439638637006283e-03 -4.0929732494987547e-04 +2.3251117672771215e-03 +1.8353665247559547e-02 +3.3202180929947644e-05 +1.6034625470638275e-02 -2.6675846427679062e-02 -4.2456937953829765e-03 +1.3329520588740706e-03 -2.0733807235956192e-02 -9.8759494721889496e-03 -4.6186018735170364e-03 +1.2911158613860607e-02 --1.4638365507125854e+00 +3.3501489162445068e+00 -2.2936582565307617e-01 +2.2947183251380920e-01 +2.4654054641723633e+00 +2.0233616232872009e-01 +4.2737099528312683e-01 +3.1279101967811584e-01 +7.2994977235794067e-01 -2.0289359986782074e-01 -1.3197048008441925e-01 -2.2812297567725182e-02 +6.9165158271789551e+00 +5.4306015372276306e-02 +4.0104513168334961e+00 -2.8427172452211380e-02 +3.5124194622039795e+00 +7.7575123310089111e-01 -8.4104597568511963e-02 +2.9969789087772369e-02 -2.3851022124290466e-01 +3.4510742872953415e-02 -1.1141819953918457e+00 +6.7237126827239990e-01 +8.2878386974334717e-01 -4.9660682678222656e-01 -8.1865847110748291e-02 -9.5430493354797363e-02 -8.4612490609288216e-03 -4.5534893870353699e-02 -+5.0844246149063110e-01 +2.4691997468471527e-01 +3.7148728966712952e-01 +5.5299073457717896e-02 -6.7838823795318604e-01 +1.3662874698638916e-01 +2.2756466269493103e-01 -2.1192868053913116e-01 -3.0473971366882324e-01 -9.7320950031280518e-01 -2.0613543689250946e-01 -1.7510943114757538e-01 -1.0237567424774170e+00 +4.9310088157653809e-01 -1.0269379615783691e+00 -1.2902656197547913e-01 -2.6909506320953369e-01 -7.5939470529556274e-01 +1.5864387154579163e-01 -2.9121461510658264e-01 +2.3914352059364319e-01 -7.6181247830390930e-02 +1.1339659802615643e-02 +2.2767557203769684e-01 -6.4934235811233521e-01 -1.0728897154331207e-01 +3.8823238015174866e-01 -1.6091853380203247e-01 +8.6021358147263527e-03 -1.4532087743282318e-01 --7.6555438339710236e-02 -9.8366037011146545e-02 +4.1555143892765045e-02 +1.6471862792968750e-01 +6.4567632973194122e-02 -6.7083358764648438e-02 +7.2992853820323944e-02 -1.2583509087562561e-01 -2.0025748014450073e-01 +1.8430523574352264e-02 +1.0594341158866882e-01 +1.9722625613212585e-01 +1.3014721870422363e-01 +4.6147695183753967e-01 +4.3574163317680359e-01 -4.1117284446954727e-02 +3.9647719264030457e-01 -1.6727466881275177e-01 +2.5370590388774872e-02 +1.3183316588401794e-01 +9.6268542110919952e-02 -9.6377357840538025e-03 +3.7073856592178345e-01 -1.3244037330150604e-01 -1.0428603738546371e-01 +3.5088351368904114e-01 -6.9975137710571289e-02 -9.3536570668220520e-02 +1.1087612062692642e-01 -1.1383305490016937e-01 -+1.4871504902839661e-01 +3.7300374358892441e-02 +2.6918750256299973e-02 -8.6467489600181580e-03 -5.3080040961503983e-03 -1.3176678679883480e-02 +4.0880274027585983e-02 +2.4948131293058395e-02 +5.1331818103790283e-02 -1.3456783257424831e-02 +1.2251485139131546e-02 +3.8877378683537245e-03 -3.4755703061819077e-02 -1.0992327705025673e-02 -1.6001084446907043e-01 +1.0568117722868919e-03 +6.3605904579162598e-02 +3.2510939985513687e-02 -4.0216333582066000e-04 -2.1404743194580078e-02 +7.2338521480560303e-02 +1.1087539605796337e-03 +3.2740321010351181e-02 -2.2275956347584724e-02 +3.2382709905505180e-03 +1.0061323642730713e-02 +7.4457940645515919e-03 -7.9635782167315483e-03 -2.3272452875971794e-02 -2.0542433485388756e-03 -+3.3843908458948135e-03 +7.3060256242752075e-01 -7.8909099102020264e-02 +1.0779818892478943e-01 +1.3727755546569824e+00 -7.6011553406715393e-02 -1.3950519263744354e-02 -5.7871502637863159e-01 -5.3153997659683228e-01 -4.6167621016502380e-01 +4.6223554760217667e-02 +2.5078773498535156e-01 +5.2004709243774414e+00 +3.3837649226188660e-01 +3.5922214984893799e+00 -1.4345894567668438e-02 +1.6385205984115601e+00 +2.8302103281021118e-01 -2.4124920368194580e-01 -7.0495009422302246e-02 +3.2020863145589828e-02 -2.0660427212715149e-01 -1.3223508000373840e-01 -3.8442531228065491e-01 +1.8902140855789185e+00 +3.2071074843406677e-01 +1.2260193824768066e+00 +8.5751992464065552e-01 -1.7537599802017212e-01 +5.2525248378515244e-02 -+1.8743954598903656e-01 +6.9431674480438232e-01 -7.5083561241626740e-02 -3.6359850317239761e-02 +1.5115967988967896e+00 -2.9325386509299278e-02 +4.3065011501312256e-02 +9.9857412278652191e-02 +4.7165906429290771e-01 +5.3162550926208496e-01 -2.7788601815700531e-02 +2.6942243799567223e-02 +1.7567702531814575e+00 +5.7660257816314697e-01 +8.2019025087356567e-01 +2.9188790917396545e-01 +7.5816059112548828e-01 +5.7481133937835693e-01 +1.0153243690729141e-01 +5.2750006318092346e-02 +1.9679915904998779e-01 -1.9795688986778259e-01 -1.1851257830858231e-01 +7.3801660537719727e-01 +1.5560950040817261e+00 +8.6965930461883545e-01 +4.3249520659446716e-01 +5.9190821647644043e-01 +2.6948991417884827e-01 -1.4213737845420837e-01 -+2.1382575854659081e-02 +1.1455680243670940e-02 +2.7920613065361977e-02 -1.3589557260274887e-02 +2.2927692625671625e-03 +3.8317343569360673e-04 -1.0043219663202763e-03 +8.5086990147829056e-03 +3.1917255837470293e-03 +6.1612378340214491e-04 +1.0800164192914963e-02 +2.8010990936309099e-03 -1.4516483061015606e-02 -1.4349453151226044e-02 -2.8494844213128090e-02 +6.4574077259749174e-04 +3.9310839027166367e-02 -5.2566425874829292e-03 +1.2734430492855608e-04 -3.2391943968832493e-03 -1.8419349566102028e-02 -3.1664303969591856e-04 +8.6383504094555974e-04 -1.8705921247601509e-02 -6.9088093005120754e-03 +1.4938511885702610e-02 +8.5803745314478874e-03 +5.3928247652947903e-03 -1.9518826156854630e-02 -8.0331470817327499e-03 -+3.9744186401367188e-01 -1.1274232715368271e-01 +4.0784427523612976e-01 -8.7947912514209747e-02 +6.4567536115646362e-01 +1.5512968599796295e-01 +2.2150103747844696e-01 -4.2508929967880249e-01 +3.4052318334579468e-01 +1.0027301311492920e+00 -2.0743829011917114e-01 +6.5476857125759125e-02 +9.3446326255798340e-01 -1.5888112783432007e-01 +8.2611846923828125e-01 +3.4851858019828796e-01 +9.9476718902587891e-01 +5.9589833021163940e-01 +1.4450119435787201e-01 -1.4966404438018799e-01 +4.1651469469070435e-01 -4.0305471420288086e-01 -1.3811372220516205e-01 +3.5220623016357422e-01 +9.0765261650085449e-01 +6.4664930105209351e-02 -1.0925571620464325e-01 +4.6061420440673828e-01 -2.0083251595497131e-01 +1.9136758148670197e-01 -+3.7694554775953293e-02 +1.2295386753976345e-02 -3.4607916604727507e-03 -1.1204814072698355e-03 -6.2105385586619377e-03 -1.9124059472233057e-03 +4.3877828866243362e-03 -8.0547668039798737e-03 -6.9600166752934456e-03 -6.0698837041854858e-03 -1.9216751679778099e-03 -9.6135372295975685e-03 -1.1382515542209148e-02 -1.4563473872840405e-02 -2.4659674614667892e-02 +1.3503335416316986e-02 -2.8502933681011200e-02 +6.8386616185307503e-03 +1.2676478945650160e-04 -3.5793092101812363e-03 +1.4395215548574924e-02 +1.6151752788573503e-04 -1.1406234465539455e-02 +2.0591527223587036e-02 +8.6150709539651871e-03 -1.0222361423075199e-02 +4.7322278842329979e-03 -2.4162000045180321e-03 +2.5431133806705475e-02 -1.9039165228605270e-02 --7.2217792272567749e-01 -5.6431613862514496e-02 -2.5319325923919678e-01 +2.6395118329674006e-03 -1.2987446784973145e-01 -1.6099352389574051e-02 -4.6092981100082397e-01 +6.4759373664855957e-02 +3.8837943226099014e-02 -7.8832387924194336e-01 +1.7211009562015533e-01 +1.2426272034645081e-01 -5.2439278364181519e-01 -6.9532787799835205e-01 -1.2271389961242676e+00 -1.3677036762237549e-01 -5.6418007612228394e-01 +9.1029681265354156e-02 +3.2351097464561462e-01 +3.9058375358581543e-01 -1.1536664515733719e-01 -9.2557060718536377e-01 -2.7962899208068848e-01 -1.7256386578083038e-01 +4.8132959753274918e-02 -1.8724759817123413e+00 -4.9646294116973877e-01 +3.8981872797012329e-01 +1.2741783261299133e-01 -1.7756056785583496e-01 --6.5485811233520508e-01 -3.3840993046760559e-01 -2.7605429291725159e-01 +2.0792575553059578e-02 -2.2019627094268799e+00 +5.6180972605943680e-02 -3.0154514312744141e-01 -9.5786890015006065e-03 -2.5096635799854994e-03 -1.3268771171569824e+00 -2.3655182123184204e-01 -8.8702719658613205e-03 -2.3146781921386719e+00 -2.1507918834686279e-01 -2.4016532897949219e+00 -1.2058544158935547e-01 -1.0457035303115845e+00 -8.3650958538055420e-01 -3.5155376791954041e-01 -4.4561415910720825e-02 -2.6544156670570374e-01 +1.2121592462062836e-01 -5.2005982398986816e-01 -2.9571610689163208e-01 -1.2499598264694214e+00 -1.7318071424961090e-01 -3.3464407920837402e-01 -9.0229719877243042e-02 -1.4002969861030579e-01 -2.2231009602546692e-01 -+2.1787650883197784e-02 +9.5681520178914070e-03 -1.8566088750958443e-02 -1.1081850156188011e-02 -6.4079384319484234e-03 -2.5484233628958464e-03 +1.1337304487824440e-02 -8.4354067221283913e-03 -1.2426209636032581e-02 -6.7330258898437023e-03 +7.0338282966986299e-04 -1.5579793602228165e-02 -9.2402836307883263e-03 -1.8162755295634270e-02 -1.2106900103390217e-02 +7.5380001217126846e-03 -1.6772061586380005e-02 +3.9850110188126564e-03 +5.0596083747223020e-04 -3.4903627820312977e-03 +6.5119983628392220e-03 +1.1264530621701851e-04 -1.2916454114019871e-02 +1.6887206584215164e-02 +6.4655905589461327e-03 -8.7561886757612228e-03 +8.6926436051726341e-03 +3.3706135582178831e-04 +2.1004186943173409e-02 -2.1905532106757164e-02 --5.6634237989783287e-03 -7.1224244311451912e-03 -1.0562284849584103e-02 +1.4388359151780605e-02 +2.9140347032807767e-04 +6.1485293554142118e-04 +3.8897558115422726e-03 -1.3361346209421754e-03 +2.8336038812994957e-03 +2.0509962923824787e-03 -3.9599183946847916e-03 +9.8702916875481606e-04 +7.7210501767694950e-03 +8.1419460475444794e-03 +1.0984670370817184e-02 -6.9920136593282223e-03 -2.4801272898912430e-02 +4.8247505910694599e-03 -4.3199461651965976e-04 -9.3816546723246574e-05 +2.1972529590129852e-02 +2.7516909176483750e-04 -6.8993032909929752e-03 +9.6769751980900764e-03 +4.0064994245767593e-03 -9.5450598746538162e-03 -1.0042267851531506e-02 -2.0733149722218513e-03 +2.1881939843297005e-02 -4.4789426028728485e-03 -+2.8581765294075012e-01 +1.8308579921722412e-01 +4.3955859541893005e-01 -1.4931729435920715e-01 -4.6585161238908768e-02 +2.3932588100433350e-01 +1.0913845151662827e-01 +1.2568365037441254e-01 -3.6629343032836914e-01 +3.7640294432640076e-01 +2.5357693433761597e-01 +1.4927439391613007e-01 +1.9769534468650818e-01 +2.6422435045242310e-01 +5.7218629121780396e-01 -1.6097143292427063e-01 +8.7337189912796021e-01 +3.6470392346382141e-01 -4.9550282955169678e-01 +1.6658455133438110e-01 +2.3261860013008118e-01 +4.8887816071510315e-01 +2.8827059268951416e-01 +1.2845037877559662e-01 +8.3102606236934662e-02 +2.0202190876007080e+00 +1.2696665944531560e-03 -4.4398352503776550e-02 -3.7891563773155212e-01 -3.2855442166328430e-01 --4.4146835803985596e-02 +3.1035311520099640e-02 +7.2691880166530609e-02 -6.6687658429145813e-02 +7.0398874580860138e-02 +2.0958472788333893e-01 +3.2406486570835114e-02 -8.5638219118118286e-01 -2.6206251978874207e-01 +6.9362455606460571e-01 +1.0906782001256943e-01 +1.4005034230649471e-02 +2.1699246764183044e-01 +2.1306501328945160e-01 +6.7023754119873047e-01 -1.6536328196525574e-01 +1.0238361358642578e+00 -3.1364938616752625e-01 +2.3178825154900551e-02 -6.5567485988140106e-02 +2.9934135079383850e-01 -8.0682046711444855e-02 +1.6856579482555389e-01 -3.5948258638381958e-01 +1.2747962772846222e-01 -2.8421980142593384e-01 -2.6373451948165894e-01 +2.4773855507373810e-01 +2.6753476262092590e-01 -2.9977548122406006e-01 -+4.4975351542234421e-02 -2.0270569249987602e-02 -6.1829589307308197e-02 -2.5708913803100586e-01 -1.5073320865631104e+00 -4.7895130515098572e-01 +2.0999360084533691e-01 +2.3344645276665688e-02 -2.1700535714626312e-01 -1.2655543088912964e+00 +6.8711236119270325e-02 +8.3118423819541931e-02 -1.2747603654861450e+00 +2.0275750756263733e-01 -1.4879069328308105e+00 -1.3921818137168884e-01 -1.3793485164642334e+00 -6.0084533691406250e-01 +2.2638720273971558e-01 +1.0417198389768600e-01 -1.3474091887474060e-01 -2.7610161900520325e-01 -3.6536961793899536e-01 -1.9947411119937897e-01 -4.5927035808563232e-01 -5.9283483028411865e-01 +9.9873118102550507e-02 -3.6105182766914368e-01 +4.4912200421094894e-02 +3.3943098783493042e-01 --3.9940949529409409e-02 +1.5379023738205433e-02 +2.1354164928197861e-02 -1.1344857513904572e-02 +1.3336438685655594e-02 +7.7320374548435211e-03 -1.5639394521713257e-02 -5.6954449974000454e-04 +1.9191664177924395e-03 +4.4813244603574276e-03 -9.6058435738086700e-03 +1.7647471278905869e-02 +2.3130311165004969e-03 +1.8057685345411301e-02 -2.7973575517535210e-02 +1.6127682756632566e-03 -2.4857843294739723e-02 -1.4158660545945168e-02 +1.9550119759514928e-04 +1.1329974979162216e-02 -2.0458070561289787e-02 -1.1812822194769979e-03 -1.4369106851518154e-02 -2.1887466311454773e-02 -8.1136161461472511e-03 +2.1850083023309708e-02 -4.4734502444043756e-04 +6.1702155508100986e-03 -1.1778073385357857e-02 +1.7667256295681000e-02 -+7.2309863567352295e-01 +3.6342866420745850e+00 +6.1486262083053589e-01 -8.8953316211700439e-01 +1.6079396009445190e+00 +7.9899847507476807e-02 +3.8680693507194519e-01 +1.3645130395889282e-01 +1.8765307664871216e+00 -4.6681335568428040e-01 -9.4884112477302551e-02 -1.5357789397239685e-01 +6.0809803009033203e+00 +3.1634375452995300e-01 +4.2482986450195312e+00 -1.4843760430812836e-01 +2.1471140384674072e+00 +1.5934845209121704e+00 +1.8898105621337891e-01 -1.0105487704277039e-01 -3.3026535063982010e-02 +6.2929689884185791e-02 +3.7223041057586670e-01 +2.0802490711212158e+00 +5.4969108104705811e-01 +5.3945899009704590e-01 -1.4524851739406586e-01 +3.9488416165113449e-02 +9.0069718658924103e-02 +3.2591409981250763e-02 --4.4754287600517273e-01 +1.9126231968402863e-01 -6.6004663705825806e-01 +3.6038476228713989e-01 +4.8215952515602112e-01 -9.1882146894931793e-02 -3.8763347268104553e-01 -2.0640857517719269e-01 +2.8513073921203613e-01 -5.7637706398963928e-02 +1.3678476214408875e-01 -4.8448178917169571e-02 -1.4364184439182281e-01 -2.6162910461425781e-01 -9.3286830186843872e-01 -2.6129540055990219e-02 +6.5801852941513062e-01 +8.3373957872390747e-01 +4.0429180860519409e-01 -4.0107548236846924e-01 -8.6187225580215454e-01 -6.0702329874038696e-01 -2.4046294391155243e-01 +1.4213190972805023e-01 +2.1454565227031708e-01 -2.0240015983581543e+00 +3.7484931945800781e-01 -3.9638713002204895e-01 -2.3119874298572540e-01 -1.6611157357692719e-01 --8.8219687342643738e-02 -1.7160048708319664e-02 -2.7874011546373367e-02 +1.3897717930376530e-02 +9.0335318818688393e-03 +8.3471750840544701e-03 -2.1115550771355629e-02 -1.3481888920068741e-02 -2.2923937067389488e-02 +6.4043807797133923e-03 -5.1775970496237278e-03 -2.1282953675836325e-03 +2.9383582994341850e-02 +1.6964493319392204e-02 +8.0116234719753265e-02 +2.0926042925566435e-03 -6.5598182380199432e-02 -1.6077550128102303e-02 +3.3720594365149736e-04 +1.3854188844561577e-02 -2.0940167829394341e-02 -6.6884967964142561e-04 -1.5915501862764359e-02 +9.4698853790760040e-03 -2.0643780007958412e-03 -2.8858347795903683e-03 -7.3367361910641193e-03 +1.8310899613425136e-03 +1.9963297992944717e-02 +4.4198739342391491e-03 -+6.6600173711776733e-02 +1.1742531321942806e-02 -1.7243102192878723e-02 -1.2236875481903553e-02 -7.1319923736155033e-03 -4.8524322919547558e-03 +2.2439079359173775e-02 +2.2641653195023537e-03 +4.1750734671950340e-03 -7.7493698336184025e-03 +1.5841815620660782e-03 -2.0848989952355623e-03 -2.1386265754699707e-02 -1.8646452575922012e-02 -3.8798052817583084e-02 +1.0414324700832367e-02 -7.0495498366653919e-03 +9.8006008192896843e-03 +3.8670253707095981e-04 -8.5446350276470184e-03 +1.0828427039086819e-02 +2.7863035211339593e-04 -5.5682919919490814e-03 +5.1442896947264671e-03 +2.5295242667198181e-03 -1.3873226707801223e-03 +1.1706713587045670e-02 +4.5571930240839720e-04 +1.6882980242371559e-02 -1.5084611251950264e-02 -+5.5679719895124435e-02 +2.5385735556483269e-02 +4.2134068906307220e-02 -3.6616737488657236e-03 +3.6234201397746801e-03 -3.7519861944019794e-03 +1.5790756791830063e-02 +1.0550191625952721e-02 +1.6857037320733070e-02 -4.4076759368181229e-03 +7.8565295552834868e-04 +5.6406543590128422e-03 -1.1117538437247276e-02 +2.5667646899819374e-02 -8.6668737232685089e-02 +3.2111436594277620e-03 +2.6871554553508759e-02 +5.2703781984746456e-03 -2.1137821022421122e-05 -6.0791838914155960e-03 +2.8560100123286247e-02 +4.1120922105619684e-05 +2.5314732920378447e-03 -1.6175882890820503e-02 -2.4561756290495396e-03 +1.1210750788450241e-02 -2.0338610920589417e-04 +3.7259804084897041e-03 -2.2083019837737083e-02 +2.6983220595866442e-03 -+4.3620216846466064e-01 +6.3454866409301758e-02 +2.6649633049964905e-01 -2.6738956570625305e-01 -1.7269608974456787e+00 -2.8041002154350281e-01 +4.4748008251190186e-02 +4.3401437997817993e-01 -4.0010485798120499e-02 -9.3041545152664185e-01 -4.1092801094055176e-01 +2.0451858639717102e-01 -2.2551972866058350e+00 +6.4324207603931427e-02 -1.9353827238082886e+00 +1.9091403484344482e-01 -8.0695688724517822e-01 -6.2955647706985474e-01 -2.2548452019691467e-01 -4.7744387388229370e-01 +2.3918448016047478e-02 +1.6122759552672505e-04 -9.8681943491101265e-03 +4.9925380945205688e-01 -5.8461135625839233e-01 +2.7829456329345703e-01 -1.1083266697824001e-02 +1.9037833809852600e-01 -1.2854874134063721e-01 +6.1526495963335037e-02 --2.0485018193721771e-01 +6.6328591108322144e-01 +3.5246539115905762e-01 -1.1257674545049667e-01 +5.1218092441558838e-01 +4.1066485643386841e-01 +2.4645142257213593e-01 -3.3090111613273621e-01 +4.1868507862091064e-01 +4.9968710541725159e-01 -3.5590897314250469e-03 +1.6845988109707832e-02 +5.2583378553390503e-01 -2.7791315317153931e-01 -1.1567089706659317e-01 -1.8182471394538879e-01 +6.5635883808135986e-01 +5.9798181056976318e-01 -2.0906144753098488e-02 +1.3193464279174805e-01 +2.7902085334062576e-02 +2.5296267867088318e-01 +6.0467705130577087e-02 +5.6239897385239601e-03 +9.3889307975769043e-01 +4.9214744567871094e-01 -3.7031140178442001e-02 +2.7873682975769043e-01 -4.5403987169265747e-02 -6.3034586608409882e-02 --1.0780064761638641e-01 +4.7742852568626404e-01 +4.7690668702125549e-01 -3.3150005340576172e-01 +7.6951014995574951e-01 +6.8920159339904785e-01 +2.8688725829124451e-01 +2.6804422959685326e-02 +1.5037187933921814e-01 +7.7331274747848511e-01 +2.7249619364738464e-01 -8.1278868019580841e-03 +1.8084755539894104e-01 +2.4576716125011444e-01 +1.4304691553115845e+00 -2.2233968973159790e-01 +1.0929238796234131e+00 -1.4804743230342865e-01 +8.4936666488647461e-01 +3.7967261672019958e-01 +1.1196836233139038e+00 +1.3752491213381290e-02 +5.2162802219390869e-01 -8.3327174186706543e-02 +4.6690711379051208e-01 +1.2377120256423950e+00 +1.6049946844577789e-01 +6.5279066562652588e-01 -1.5116956830024719e-01 +7.5900726020336151e-02 -+8.8263005018234253e-01 +1.3667184114456177e-01 +7.0028299093246460e-01 +1.1234517209231853e-02 -3.2362163066864014e-01 +2.2542162332683802e-03 +3.0918401479721069e-01 -2.4474173784255981e-02 -2.5133645534515381e-01 +1.1908240616321564e-01 +7.7320806682109833e-02 +2.3981345817446709e-02 -4.5011949539184570e-01 -1.7775429785251617e-01 -5.0735134631395340e-02 +2.6023644208908081e-01 +2.7152696251869202e-01 -7.9665243625640869e-01 +7.2474509477615356e-02 -2.0261195302009583e-01 -1.3397435843944550e-01 -5.7959221303462982e-02 +3.6030656099319458e-01 -7.5765377841889858e-03 -2.3035912215709686e-01 -9.7711190581321716e-02 -6.7070201039314270e-02 -9.7478367388248444e-02 -1.6426551342010498e-01 +3.3682355284690857e-01 --3.1259089708328247e-01 -6.6931322216987610e-02 +1.7439781129360199e-01 +1.2680228054523468e-01 -3.8320177793502808e-01 +7.7801543474197388e-01 +1.0670582205057144e-01 -6.6370397806167603e-01 -1.1109238862991333e-01 -4.1209420561790466e-01 +5.2455884218215942e-01 +9.9113196134567261e-02 +4.3116003274917603e-01 -4.5013281702995300e-01 +4.0763697028160095e-01 -1.1038153618574142e-01 +1.3874298334121704e-01 -3.0968791246414185e-01 -1.0018649101257324e+00 +6.2545377016067505e-01 +5.6162399053573608e-01 +1.0430735349655151e+00 -2.9224898666143417e-02 -8.3571016788482666e-02 -7.0866298675537109e-01 +1.5012816190719604e+00 +1.1686889827251434e-01 -2.6342177391052246e-01 +1.9288669526576996e-01 +1.3950078189373016e-01 -+3.7187809357419610e-04 -1.2521844357252121e-02 +3.8867627736181021e-03 +1.2459100224077702e-02 +2.3739752359688282e-03 +6.0739358887076378e-03 -8.7514976039528847e-03 -3.0389674939215183e-03 +5.2902437746524811e-03 +4.4741677120327950e-03 -8.5859615355730057e-03 +8.9740632101893425e-03 -2.8330141212791204e-03 -1.5329029411077499e-02 +2.3207245394587517e-02 +1.7675723647698760e-03 +1.6423910856246948e-02 +5.3154551424086094e-03 -6.8366451887413859e-04 +1.0000222828239202e-03 -7.5096660293638706e-03 -3.7181488005444407e-04 -7.4740652926266193e-03 -1.2547105550765991e-02 -6.9014881737530231e-03 +3.3085928298532963e-03 -1.1505768634378910e-03 -9.5235528424382210e-03 +7.8955981880426407e-03 +7.2914790362119675e-03 --8.2130059599876404e-02 +1.9443358480930328e-01 +7.3950093984603882e-01 +1.9007514417171478e-01 +7.9908335208892822e-01 +3.6011341214179993e-01 +5.0023043155670166e-01 -2.2382985800504684e-02 +2.9829111695289612e-01 +6.4382076263427734e-01 -8.8155440986156464e-02 +6.4668640494346619e-02 +3.4399035573005676e-01 +5.3053641319274902e-01 +1.5071526765823364e+00 -3.5879701375961304e-01 +1.1229895353317261e+00 +4.7916957736015320e-01 +3.6486819386482239e-01 +5.5951014161109924e-02 +1.1913574934005737e+00 -3.9972594380378723e-01 +1.0686242580413818e+00 +4.0856274962425232e-01 +8.3602458238601685e-01 +1.3515902757644653e+00 +3.0011823773384094e-01 +7.2386604547500610e-01 -1.3667715713381767e-02 -4.5336332172155380e-02 - - --3.7209364771842957e-01 -2.0884534716606140e-01 -2.9794359207153320e-01 -1.4170993864536285e-01 +2.2171740233898163e-01 -6.2805764377117157e-02 -+1.3708747923374176e-01 +1.6429275274276733e-02 -1.7202763259410858e-01 +3.8844158407300711e-03 +4.6976106241345406e-03 +2.9268357157707214e-01 --2.9305326938629150e-01 +9.4806298613548279e-02 -5.5874133110046387e-01 +9.2896804213523865e-02 -4.0984922647476196e-01 -2.2635230794548988e-02 -+2.2920262999832630e-03 -6.3836295157670975e-03 +3.4658354707062244e-03 -1.0163272963836789e-03 -3.1607158016413450e-03 +8.6492272093892097e-03 --6.1874264478683472e-01 +2.0005397498607635e-02 +1.2390928268432617e+00 +1.9011477008461952e-02 +8.6550479754805565e-03 -1.2961237430572510e+00 --1.1133621633052826e-01 +3.4492340683937073e-01 -4.6911485493183136e-02 -1.7156480252742767e-01 -2.9269725084304810e-01 -5.3299475461244583e-02 --1.0101699084043503e-01 +1.2806898355484009e-01 -2.6052641868591309e-01 -4.2877095937728882e-01 -4.4838017225265503e-01 -2.0553221926093102e-02 --1.6265816986560822e-02 -7.5251907110214233e-02 -2.0111389458179474e-02 +5.1040532998740673e-03 -6.7644022405147552e-02 -8.7280012667179108e-03 -+7.9108625650405884e-02 +9.0959630906581879e-02 +4.6973984688520432e-02 +2.0177241414785385e-02 +1.2726534903049469e-01 +2.2549921274185181e-01 --8.0764299631118774e-01 -4.2233452200889587e-02 +1.9660389423370361e-01 -2.9416212812066078e-02 -6.9327667355537415e-02 +3.3946213126182556e-01 -+5.4136686958372593e-03 +1.1507612653076649e-02 +7.3805763386189938e-03 +3.5453853197395802e-03 +1.0704366490244865e-02 +3.1153638847172260e-03 -+3.7469601375050843e-04 +1.6725444002076983e-03 +7.4567057890817523e-04 +6.1688050627708435e-03 -3.7376824766397476e-03 +2.3458761279471219e-04 -+1.6128344461321831e-02 -2.7513001114130020e-03 -7.5397059321403503e-02 +3.9521106518805027e-03 +2.0943935960531235e-03 +1.8602956831455231e-01 -+2.7817121148109436e-01 -3.9890283346176147e-01 -4.2974391579627991e-01 -1.7259593307971954e-01 -3.0211591720581055e-01 -1.0175350308418274e-01 -+6.6675174236297607e-01 +1.3838805258274078e-01 +4.0822172164916992e-01 +5.8878403156995773e-02 -1.4110053889453411e-03 -8.5932612419128418e-01 --1.2595970183610916e-03 -2.5506720412522554e-03 -2.5164247490465641e-03 -6.6250110976397991e-03 +2.9601873829960823e-03 -1.6797006828710437e-03 --2.4337677657604218e-01 -5.3381316363811493e-02 +6.4831763505935669e-02 -7.6824404299259186e-02 +5.1059704273939133e-02 -1.5402847528457642e-01 --3.4434419870376587e-01 +5.9335000813007355e-02 -7.9067833721637726e-02 -5.0642054527997971e-02 +1.8358058878220618e-04 +1.0271523892879486e-01 -+2.5644633173942566e-01 -4.4736224412918091e-01 -3.5504631232470274e-03 +2.4592986702919006e-01 +1.5984594821929932e-01 -2.6496637612581253e-02 -+1.7608997225761414e-01 -2.0461499691009521e-01 +2.0925493910908699e-02 -2.0181791484355927e-01 -2.8165918588638306e-01 +3.6618921905755997e-02 -+1.6811880469322205e-01 -3.4518724679946899e-01 -1.3831096887588501e-01 -3.1209391355514526e-01 -3.6826348304748535e-01 +4.4895769096910954e-03 --1.5860520303249359e-01 +5.8890718221664429e-01 +2.4785257875919342e-02 -7.0871192216873169e-01 -6.9104158878326416e-01 +1.5046536922454834e-02 --3.8104894757270813e-01 +2.8367981314659119e-01 -2.9944822192192078e-01 -5.4359728097915649e-01 -1.2595027685165405e-01 +3.4227207303047180e-02 -+7.1558706462383270e-02 -9.9792681634426117e-02 -1.9019447267055511e-01 +1.3884398154914379e-02 -1.0976120829582214e-01 +2.6771573349833488e-02 --5.4220473766326904e-01 +1.7357788980007172e-02 +1.1626181602478027e+00 +3.3580879680812359e-03 +1.0818851180374622e-02 -5.8732843399047852e-01 -+8.2582034170627594e-02 -3.8210359215736389e-01 +1.4124330878257751e-01 -2.9919723048806190e-02 +4.3221384286880493e-02 +8.3583876490592957e-02 -+1.9129854440689087e-01 +3.5183086991310120e-02 -1.8852937221527100e-01 -5.5564172565937042e-02 -2.8339305892586708e-02 -8.6140692234039307e-02 --4.4070181250572205e-01 -1.7385990917682648e-01 -1.6920909285545349e-01 -3.1490609049797058e-02 -3.3170020580291748e-01 -6.7213013768196106e-02 --1.3983215903863311e-03 -3.6923948209732771e-03 -2.0777590107172728e-03 -1.5961386263370514e-02 +1.1874640360474586e-02 -6.3403823878616095e-04 -+3.0688627157360315e-03 +6.2259295955300331e-03 +2.6527841109782457e-03 -1.9394939299672842e-03 +9.4658778980374336e-03 +2.8904713690280914e-03 - - -[biases per layer] -+0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 --1.1157412827014923e-01 -3.3824679121607915e-05 +2.1104570478200912e-02 +3.9625403587706387e-05 -4.5578083395957947e-01 -5.2455189870670438e-04 -2.3049417359288782e-04 +4.1634793160483241e-04 +1.5791164338588715e-01 +2.8074260801076889e-02 -6.2261607497930527e-02 +3.4988370537757874e-01 -4.6014487743377686e-01 +3.4145047538913786e-04 -1.4810329675674438e-01 -4.2997466516681015e-04 -2.3796021938323975e-01 -4.2951647192239761e-02 -5.8298930525779724e-02 -4.3130002915859222e-02 +4.7358457231894135e-04 +3.1473326683044434e-01 -3.8577425479888916e-01 -2.0412791054695845e-03 +1.3597380893770605e-04 -2.4274310097098351e-02 -4.8377245664596558e-02 -4.9357535317540169e-05 -5.2535283565521240e-01 -3.6078499397262931e-04 -3.9361980557441711e-01 +4.2361000180244446e-01 -4.0288074524141848e-04 -9.1165740741416812e-05 +1.7448206245899200e-01 -3.7576428055763245e-01 -2.2696794569492340e-01 -7.2133647336158901e-05 -5.2956473082304001e-02 -5.4426586627960205e-01 +3.2629299676045775e-04 -4.1286041960120201e-04 -1.5940038429107517e-04 +1.7911648750305176e-01 +7.0670264959335327e-01 -1.7384408712387085e+00 -6.4279180765151978e-01 +3.6426132917404175e-01 -4.1978899389505386e-05 -2.1109967231750488e+00 --6.5533941984176636e-01 -1.8055668473243713e-01 -6.5683960914611816e-01 -1.4364618062973022e-01 -9.9848681688308716e-01 -3.0490663647651672e-01 -4.6168187260627747e-01 +2.5001456961035728e-02 -1.5183533728122711e-01 -9.0511178970336914e-01 -8.7521433830261230e-02 -8.2068778574466705e-02 -3.5949289798736572e-01 -9.2117398977279663e-01 -1.5294542312622070e+00 +5.8807577006518841e-03 -1.3380171060562134e+00 -3.8957464694976807e-01 -1.2753565609455109e-01 -1.5386527776718140e-01 -6.4043277502059937e-01 +1.5060743689537048e-01 -7.4787741899490356e-01 -3.1262516975402832e-01 -8.8149094581604004e-01 -1.4836670160293579e+00 -1.4976370334625244e-01 -5.7535529136657715e-01 -1.4436234720051289e-02 +3.5216238349676132e-02 -+8.3585090935230255e-02 +1.5639360249042511e-01 +2.9334869980812073e-01 +1.9895148277282715e-01 +1.2395969033241272e-01 +6.4833834767341614e-02 diff --git a/common/multilayer_perceptron/README.md b/common/multilayer_perceptron/README.md deleted file mode 100644 index b98fe75..0000000 --- a/common/multilayer_perceptron/README.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Multi-Layer Perceptrons and data-driven fluid model -permalink: /common/multilayer_peceptron/ ---- -# Multi-Layer Perceptrons in SU2 - -This tutorial explains how to use the multi-layer perceptron (MLP) class for data-driven methods in SU2. MLP's, or artificial neural networks, are being used in CFD calculations for a variety of regression processes. From turbulence closure models to data regression applications, MLP's have been shown to be a valuable tool in CFD. With the addition of the MLP classes in SU2, it is now possible to develop such models for use in the SU2 suite. In this tutorial, the code structure of the MLP classes in SU2 is explained, as well as an application in data-driven fluid property modeling. Supporting Python scripts are provided to prepare the necessary data files for the SU2 MLP classes to function. - - -# MLP class description -The MLP class prototype files can be found under SU2/Common/include/toolboxes/multilayer_perceptron. -An MLP computes data by having its inputs manipulated by a series of operations, depending on the architecture of the network. Interpreting the network architecture and its respective input and output variables is therefore crucial for the MLP functionality. Information regarding the network architecture, input and output variables, and activation functions is provided to SU2 via a .mlp input file, of which an example is provided in this folder. More information regarding the file structure is provided in a later section. - -The main MLP class in SU2 which can be used for look-up operations is the CLookUp_ANN class. This class allows to load one or multiple networks given a list of input files. Each of these files is read by the CReadNeuralNetwork class. This class reads the .mlp input file and stores the architectural information listed in it. It will also run some compatibility checks on the file format. For example, the total layer count should be provided before listing the activation functions. For every read .mlp file, an MLP class is generated using the CNeuralNetwork class. This class stores the input and output variables, network architecture, activation functions, and weights and biases of every synapse and neuron. Currently, the CNeuralNetwork class only supports simple, feed-forward, dense neural network types. Supported activation function types are: -1: linear (y = x) -2: relu -3: elu -4: swish -5: sigmoid -6: tanh -7: selu -8: gelu -9: exponential (y = exp(x)) - -It is possible to load multiple networks with different input and output variables. An error will be raised if none of the loaded MLP's contains all the input variables or if some of the desired outputs are missing from the MLP output variables. -In addition to loading multiple networks with different input and output variables, it is possible to load multple networks with the same input and output variables, but with different data ranges. When performing a regression operation, the CLookUp_ANN class will check which of the loaded MLPs with the right input and output variables has an input variable normalization range that includes the query point. The corresponding MLP will then be selected for regression. If the query point lies outside the data range of all loaded MLPs, extrapolation will be performed using the MLP with a data range close to the query point. - -# MLP Definition -In order to load an MLP architecture into SU2, an input file needs to be provided describing the network architecture, as well as the input and output variable names and ranges. An example of such an input file is provided in this folder (MLP_Air_SU2.mlp). This file can be generated from an MLP trained through Tensorflow using the "Tensorflow2SU2.py" script. Additional information regarding the translation from a Tensorflow model to an SU2 input file is provided in the python code. - -# Data-Driven Fluid Model Class - -The MLP class is used in the CDataDrivenFluid fluid model class in SU2. Here, MLP's can be used to determine the thermodynamic state of complex fluids. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library or when computational performance is important. - -Currently, MLPs in SU2 can only be used in the context of a fluid model. The config option "DATADRIVEN_FLUID" for fluid model allows for the use of an MLP or look-up table for thermodynamic state evaluation. The option "INTERPOLATION_METHOD" refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are "LUT" for a look-up table based approach, or "MLP" for the use of an MLP. In this tutorial, focus lies on the latter option. - -The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables. The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. -The input variables for the MLP should be named "Density" and "Energy". The output variables should be named: -"s": fluid entropy -"dsde_rho": first entropy derivative w.r.t. static energy -"dsdrho_e": first entropy derivative w.r.t. density -"d2sdedrho": second entropy derivative w.r.t density and static energy -"d2sde2": second entropy derivative w.r.t. static energy -"d2sdrho2": second entropy derivative w.r.t. density - -The order of the input or output variables in the input file does not affect the MLP or LUT regression processes. - diff --git a/common/multilayer_perceptron/Tensorflow2SU2.py b/common/multilayer_perceptron/Tensorflow2SU2.py deleted file mode 100644 index 8f02f4a..0000000 --- a/common/multilayer_perceptron/Tensorflow2SU2.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python - -## \file Tensroflow2SU2.py -# \brief Example of converting a trained Tensorflow MLP to SU2 .mlp -# format. -# \author E.C.Bunschoten -# \version 7.5.0 "Blackbird" -# -# SU2 Project Website: https://su2code.github.io -# -# The SU2 Project is maintained by the SU2 Foundation -# (http://su2foundation.org) -# -# Copyright 2012-2022, SU2 Contributors (cf. AUTHORS.md) -# -# SU2 is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# SU2 is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SU2. If not, see . - -import tensorflow as tf -from write_SU2_MLP import * - -# Input names for the SU2 MLP. For the CDataDrivenFluid class, these have to be "Density" and "Energy" -MLP_input_names = ["Density", "Energy"] -# The order of the input names should correspond to that of the trained model inputs. - -# Optional: give minimum and maximum input normalization values. These are required in case the MLP -# was trained on normalized input data. -input_min = [2.81038e-1, 1.79956e5] -input_max = [2.72979e+01, 4.48318e+05] - -# Output names for the SU2 MLP. For the CDataDrivenFluid class, these have to include the following: -MLP_output_names = ["s", # Entropy - "dsde_rho", # First entropy derivative w.r.t static energy - "dsdrho_e", # First entropy derivative w.r.t density - "d2sde2", # Second entropy derivative w.r.t static energy - "d2sdedrho",# Second entropy derivative w.r.t static energy and density - "d2sdrho2"] # Second entropy derivative w.r.t density -# The order of the output names should correspond to that of the trained model outputs. - -# Optional: give minimum and maximum output normalization values. These are required in case the MLP -# was trained on normalized training data. -output_min = [ 5.74729e+03, 1.66861e-03, -1.05632e+03, -2.15459e-08, - -4.20494e-06, 3.96917e-01] - -output_max = [ 7.77852e+03, 4.00000e-03, -1.07148e+01, -3.57370e-09, - -4.93767e-07, 3.75786e+03] - -# Saved Tensorflow model file name, saved with the "model.save" function after training. -Tensorflow_model_file = "MLP_Air" - -# SU2 MLP output file name (wo extension) -SU2_MLP_output_file = "MLP_Air_SU2" - -# Load the MLP trained through Tensorflow -Tensorflow_model = tf.keras.models.load_model(Tensorflow_model_file) - -# Write SU2 MLP input file -write_SU2_MLP(SU2_MLP_output_file, MLP_input_names, MLP_output_names, Tensorflow_model, input_min, input_max, output_min, output_max) - diff --git a/common/multilayer_perceptron/write_SU2_MLP.py b/common/multilayer_perceptron/write_SU2_MLP.py deleted file mode 100644 index 902fca5..0000000 --- a/common/multilayer_perceptron/write_SU2_MLP.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python - -## \file write_SU2_MLP.py -# \brief Python script for translating a trained Tensorflow model -# to an SU2 MLP input file. -# \author E.C.Bunschoten -# \version 7.5.0 "Blackbird" -# -# SU2 Project Website: https://su2code.github.io -# -# The SU2 Project is maintained by the SU2 Foundation -# (http://su2foundation.org) -# -# Copyright 2012-2022, SU2 Contributors (cf. AUTHORS.md) -# -# SU2 is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# SU2 is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with SU2. If not, see . - - -def write_SU2_MLP(file_out, input_names, output_names, model, input_min=[], input_max=[], output_min=[], output_max=[]): - # This function writes the MLP to a format which can be read by the SU2 MLP import tool - # Inputs: - # - file_out: output file name without extension - # - input_names: list of strings with the variable names of the MLP input(s) - # - output names: list of strings with the variable names of the MLP output(s) - # - model: tensorflow.keras.model; the trained model - # - input_min: lower normalization values for the input - # - input_max: upper normalization values for the input - # - output_min: lower normalization values for the output - # - output_max: upper normalization values for the output - - # MLP config - model_config = model.get_config() - - # Number of input variables in the model - n_inputs = model_config['layers'][0]['config']['batch_input_shape'][1] - # Number of output variables in the model - n_outputs = model_config['layers'][-1]['config']['units'] - - # Checking if number of provided input and output names are equal to those in the model - if not n_inputs == len(input_names): - raise Exception("Number of provided input names unequal to the number of inputs in the model") - if not n_outputs == len(output_names): - raise Exception("Number of provided output names unequal to the number of outputs in the model") - - if len(input_max) != len(input_min): - raise Exception("Upper and lower input normalizations should have the same length") - if len(output_max) != len(output_min): - raise Exception("Upper and lower output normalizations should have the same length") - - if len(input_max) > 0 and len(input_min) != n_inputs: - raise Exception("Input normalization not provided for all inputs") - - if len(output_max) > 0 and len(output_min) != n_outputs: - raise Exception("Output normalization not provided for all outputs") - - - # Creating output file - fid = open(file_out+'.mlp', 'w+') - fid.write("
      \n\n") - n_layers = len(model_config['layers']) - - # Writing number of neurons per layer - fid.write('[number of layers]\n%i\n\n' % n_layers) - fid.write('[neurons per layer]\n') - activation_functions = [] - - for iLayer in range(n_layers-1): - layer_class = model_config['layers'][iLayer]['class_name'] - if layer_class == 'InputLayer': - # In case of the input layer, the input shape is written instead of the number of units - activation_functions.append('linear') - n_neurons = model_config['layers'][iLayer]['config']['batch_input_shape'][1] - else: - activation_functions.append(model_config['layers'][iLayer]['config']['activation']) - n_neurons = model_config['layers'][iLayer]['config']['units'] - - fid.write('%i\n' % n_neurons) - fid.write('%i\n' % n_outputs) - - activation_functions.append('linear') - - # Writing the activation function for each layer - fid.write('\n[activation function]\n') - for iLayer in range(n_layers): - fid.write(activation_functions[iLayer] + '\n') - - # Writing the input and output names - fid.write('\n[input names]\n') - for input in input_names: - fid.write(input + '\n') - - if len(input_min) > 0: - fid.write('\n[input normalization]\n') - for i in range(len(input_names)): - fid.write('%+.16e\t%+.16e\n' % (input_min[i], input_max[i])) - - fid.write('\n[output names]\n') - for output in output_names: - fid.write(output+'\n') - - if len(output_min) > 0: - fid.write('\n[output normalization]\n') - for i in range(len(output_names)): - fid.write('%+.16e\t%+.16e\n' % (output_min[i], output_max[i])) - - fid.write("\n
      \n") - # Writing the weights of each layer - fid.write('\n[weights per layer]\n') - for layer in model.layers: - fid.write('\n') - weights = layer.get_weights()[0] - for row in weights: - fid.write("\t".join(f'{w:+.16e}' for w in row) + "\n") - fid.write('\n') - - # Writing the biases of each layer - fid.write('\n[biases per layer]\n') - - # Input layer biases are set to zero - fid.write('%+.16e\t%+.16e\t%+.16e\n' % (0.0, 0.0, 0.0)) - - for layer in model.layers: - biases = layer.get_weights()[1] - fid.write("\t".join([f'{b:+.16e}' for b in biases]) + "\n") - - fid.close() \ No newline at end of file diff --git a/compressible_flow/NICFD_nozzle/DataDriven/Generate_Dataset.py b/compressible_flow/NICFD_nozzle/DataDriven/Generate_Dataset.py new file mode 100644 index 0000000..c8549a1 --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/Generate_Dataset.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python + +## \file Generate_Dataset.py +# \brief Example python script for generating training data for +# data-driven fluid model in SU2 +# \author E.C.Bunschoten +# \version 7.5.1 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2012-2023, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + +# make print(*args) function available in PY2.6+, does'nt work on PY < 2.6 + +import CoolProp +import numpy as np +from tqdm import tqdm +import csv + +# Name of the fluid in the CoolProp library. +fluidName = 'Air' + +# Type of equation of state to be used by CoolProp. +CP_eos = "HEOS" + +# Minimum and maximum dataset temperatures [K]. +T_min = 280 +T_max = 1000 + +# Minimum and maximum dataset pressures [Pa]. +P_min = 5e4 +P_max = 2e6 + +# Number of data points along each axis. +Np_grid = 500 + +# Fraction of data points to be used as training data for MLP training (0-1). +f_train = 0.8 + +# Fraction of data poins to be used as test data for MLP validation (0-1). +f_test = 0.1 + + +# Prepare data grid +T_range = np.linspace(T_min, T_max, Np_grid) +P_range = np.linspace(P_min, P_max, Np_grid) + +T_grid, P_grid = np.meshgrid(T_range, P_range) + +T_dataset = T_grid.flatten() +P_dataset = P_grid.flatten() + +density_dataset = np.zeros(np.shape(T_dataset)) +energy_dataset = np.zeros(np.shape(T_dataset)) +s_dataset = np.zeros(np.shape(T_dataset)) +dsde_dataset = np.zeros(np.shape(T_dataset)) +dsdrho_dataset = np.zeros(np.shape(T_dataset)) +d2sde2_dataset = np.zeros(np.shape(T_dataset)) +d2sdedrho_dataset = np.zeros(np.shape(T_dataset)) +d2sdrho2_dataset = np.zeros(np.shape(T_dataset)) + +# Evaluate CoolProp on data grid. +fluid = CoolProp.AbstractState(CP_eos, fluidName) +idx_failed_below = [] +idx_failed_above = [] +print("Generating CoolProp data set...") +for i in tqdm(range(len(T_dataset))): + try: + fluid.update(CoolProp.PT_INPUTS, P_dataset[i], T_dataset[i]) + + density_dataset[i] = fluid.rhomass() + energy_dataset[i] = fluid.umass() + s_dataset[i] = fluid.smass() + dsde_dataset[i] = fluid.first_partial_deriv(CoolProp.iSmass, CoolProp.iUmass, CoolProp.iDmass) + dsdrho_dataset[i] = fluid.first_partial_deriv(CoolProp.iSmass, CoolProp.iDmass, CoolProp.iUmass) + d2sde2_dataset[i] = fluid.second_partial_deriv(CoolProp.iSmass, CoolProp.iUmass, CoolProp.iDmass, CoolProp.iUmass, CoolProp.iDmass) + d2sdedrho_dataset[i] = fluid.second_partial_deriv(CoolProp.iSmass, CoolProp.iUmass, CoolProp.iDmass, CoolProp.iDmass, CoolProp.iUmass) + d2sdrho2_dataset[i] = fluid.second_partial_deriv(CoolProp.iSmass, CoolProp.iDmass, CoolProp.iUmass, CoolProp.iDmass, CoolProp.iUmass) + except: + idx_failed_below.append(i) + print("CoolProp failed at temperature "+str(T_dataset[i]) + ", pressure "+str(P_dataset[i])) +print("Done!") + +# Collect all data arrays and fill in failed data points. +collected_data = np.vstack([density_dataset, + energy_dataset, + s_dataset, + dsde_dataset, + dsdrho_dataset, + d2sde2_dataset, + d2sdedrho_dataset, + d2sdrho2_dataset]).T +for i_failed in idx_failed_below: + collected_data[i_failed, :] = 0.5*(collected_data[i_failed+1, :] + collected_data[i_failed-1, :]) + +# Shuffle data set and extract training, validation, and test data. +np.random.shuffle(collected_data) +np_train = int(f_train*len(density_dataset)) +np_val = int(f_test*len(density_dataset)) +np_test = len(density_dataset) - np_train - np_val + +train_data = collected_data[:np_train, :] +dev_data = collected_data[np_train:(np_train+np_val), :] +test_data = collected_data[(np_train+np_val):, :] + +# Write output files. +with open(fluidName + "_dataset_full.csv", "w+") as fid: + fid.write("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n") + csvWriter = csv.writer(fid,delimiter=',') + csvWriter.writerows(collected_data) + +with open(fluidName + "_dataset_train.csv", "w+") as fid: + fid.write("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n") + csvWriter = csv.writer(fid,delimiter=',') + csvWriter.writerows(train_data) + +with open(fluidName + "_dataset_dev.csv", "w+") as fid: + fid.write("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n") + csvWriter = csv.writer(fid,delimiter=',') + csvWriter.writerows(dev_data) + +with open(fluidName + "_dataset_test.csv", "w+") as fid: + fid.write("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n") + csvWriter = csv.writer(fid,delimiter=',') + csvWriter.writerows(test_data) \ No newline at end of file diff --git a/compressible_flow/NICFD_nozzle/DataDriven/LUTWriter.m b/compressible_flow/NICFD_nozzle/DataDriven/LUTWriter.m new file mode 100644 index 0000000..591f14b --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/LUTWriter.m @@ -0,0 +1,131 @@ +%!/usr/bin/env matlab + +%% \file LUTWriter.m +% \brief Example MATLAB script for generating a look-up table file +% compatible with the CDataDriven_Fluid class in SU2. +% \author E.C.Bunschoten +% \version 7.5.1 "Blackbird" +% +% SU2 Project Website: https://su2code.github.io +% +% The SU2 Project is maintained by the SU2 Foundation +% (http://su2foundation.org) +% +% Copyright 2012-2023, SU2 Contributors (cf. AUTHORS.md) +% +% SU2 is free software; you can redistribute it and/or +% modify it under the terms of the GNU Lesser General Public +% License as published by the Free Software Foundation; either +% version 2.1 of the License, or (at your option) any later version. +% +% SU2 is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% Lesser General Public License for more details. +% +% You should have received a copy of the GNU Lesser General Public +% License along with SU2. If not, see . + +% make print(*args) function available in PY2.6+, does'nt work on PY < 2.6 + +% CoolProp input data file. +input_datafile = "Air_dataset_full.csv"; + +% Data point frequency (the larger, the coarser the table). +data_freq = 2; + +% LUT output file name. +output_LUTfile = "reftable.drg"; + +%% provide import data file +% space delimited +data_ref = importdata(input_datafile); + +% Identify data entries +rho = data_ref.data(1:data_freq:end, 1); +e = data_ref.data(1:data_freq:end, 2); +s = data_ref.data(1:data_freq:end, 3); +ds_de = data_ref.data(1:data_freq:end, 4); +ds_drho = data_ref.data(1:data_freq:end, 5); +d2s_de2 = data_ref.data(1:data_freq:end, 6); +d2s_dedrho = data_ref.data(1:data_freq:end, 7); +d2s_drho2 = data_ref.data(1:data_freq:end, 8); + +rho_min = min(rho); +rho_max = max(rho); +e_min = min(e); +e_max = max(e); + +% Normalize density and energy +rho_norm = (rho - rho_min)/(rho_max - rho_min); +e_norm = (e - e_min)/(e_max - e_min); + +%% Define table connectivity +T = delaunayTriangulation(rho_norm, e_norm); + +data_LUT = [rho, e, s, ds_de, ds_drho, d2s_de2, d2s_dedrho, d2s_drho2]; + +[~, boundNodes] = boundaryFacets(alphaShape(rho_norm, e_norm, 0.05)); +hullIDs = find(ismember([rho_norm, e_norm], boundNodes, "rows")); + +%% Write table data to output +fid = fopen(output_LUTfile, 'w+'); + +header = ['Dragon library' newline newline]; + +header = [header '
      ' newline]; + +header = [header '[Version]' newline '1.0.1' newline newline]; + +header = [header '[Number of points]' newline]; +header = [header sprintf('%3d',length(rho)) newline newline]; + +header = [header '[Number of triangles]' newline]; +header = [header sprintf('%3d',length(T.ConnectivityList)) newline newline]; + +header = [header '[Number of hull points]' newline]; +header = [header sprintf('%3d',length(hullIDs)) newline newline]; + +header = [header '[Number of variables]' newline]; +header = [header sprintf('%3d',8) newline newline]; + +header = [header '[Variable names]' newline]; +header = [header sprintf('1:Density\n2:Energy\n3:s\n4:dsde_rho\n5:dsdrho_e\n6:d2sde2\n7:d2sdedrho\n8:d2sdrho2\n')]; + +header = [header newline '
      ' newline newline]; +header = [header '']; + +fprintf(fid,'%s', header); +printformat = '\n'; +for iTabVar=1:8 + printformat = [printformat '%.14e\t']; +end +fprintf(fid,printformat,data_LUT'); +fprintf(fid,'%s', newline); +fprintf(fid,'%s', ''); + +fprintf(fid,'%s', newline); +fprintf(fid,'%s', newline); +fprintf(fid,'%s', ''); + +printformat = ['\n' '%5i\t' '%5i\t' '%5i\t']; + +fprintf(fid,printformat,T.ConnectivityList'); + +fprintf(fid,'%s', newline); +fprintf(fid,'%s', ''); + +%% print hull block +fprintf(fid,'%s', newline); +fprintf(fid,'%s', newline); +fprintf(fid,'%s', ''); + +printformat = ['\n' '%5i\t']; + +fprintf(fid,printformat,hullIDs); + +fprintf(fid,'%s', newline); +fprintf(fid,'%s', ''); + +%% close .dat file +fclose(fid); \ No newline at end of file diff --git a/compressible_flow/NICFD_nozzle/DataDriven/MLPTrainer.py b/compressible_flow/NICFD_nozzle/DataDriven/MLPTrainer.py new file mode 100644 index 0000000..4acd861 --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/MLPTrainer.py @@ -0,0 +1,476 @@ +#!/usr/bin/env python + +## \file Generate_Dataset.py +# \brief Example python script for training an MLP and writing an MLP +# input file formatted for the CDataDriven fluid model in SU2. +# \author E.C.Bunschoten +# \version 7.5.1 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2012-2023, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + +# make print(*args) function available in PY2.6+, does'nt work on PY < 2.6 + +seed_value = 2 +import os +from re import L +os.environ['PYTHONASHSEED'] = str(seed_value) +seed_value += 1 +import random +random.seed(seed_value) +seed_value += 1 +import numpy as np +np.random.seed(seed_value) +seed_value += 1 +import tensorflow as tf +tf.random.set_seed(seed_value) +config = tf.compat.v1.ConfigProto() +config.gpu_options.allow_growth = True +import time +from tensorflow import keras +import sys +import pickle +import matplotlib.pyplot as plt + +class Train_Flamelet_MLP: + # Description: + # Construct, train, and save an artificial neural network for data-driven NICFD simulations in SU2 + # + + # Training parameters: + n_epochs = 250 # Number of epochs to train for + alpha_expo = -3.0 # Alpha training exponent parameter + lr_decay = 1.0 # Learning rate decay parameter + batch_size = 10 # Mini-batch size exponent + + # Activation function options + activation_functions = [["relu"], + ["elu"], + ["selu"], + ["gelu"], + ["elu", "tanh"], + ["elu", "sigmoid"], + ["tanh"], + ["sigmoid"], + ["swish"]] + + i_activation_function = 0 # Activation function index + + hidden_layers = [] # Hidden layer architecture + train_name = "" + + # Hardware info: + kind_device = "CPU" # Device type used to train (CPU or GPU) + device_index = 0 # Device index (node index or GPU card index) + + # Controlling variables + controlling_vars = ["Density", + "Energy"] + + # Variable names to train for + train_vars = [] + + # Input data files: + Full_file = "" # Full data set file name + Train_file = "" # Train data set file name + Test_file = "" # Test data set file name + Val_file = "" # Validation data set file name + + save_dir = "/" # Directory to save trained network information to + + def __init__(self, kind_train): + + # Set train variables based on what kind of network is trained + self.train_name = kind_train + self.train_vars = ['s','dsde_rho','dsdrho_e','d2sde2','d2sdedrho','d2sdrho2'] + + # Setters/Getters: + def SetNEpochs(self, n_input): + self.n_epochs = n_input + def SetActivationIndex(self, i_input): + self.i_activation_function = i_input + def SetFullInputFile(self, input_file): + self.Full_file = input_file + def SetTrainInputFile(self, input_file): + self.Train_file = input_file + def SetTestInputFile(self, input_file): + self.Test_file = input_file + def SetValInputFile(self, input_file): + self.Val_file = input_file + def SetSaveDir(self, input_dir): + self.save_dir = input_dir + def SetDeviceKind(self, kind_device): + self.kind_device = kind_device + def SetDeviceIndex(self, device_index): + self.device_index = device_index + def SetControllingVariables(self, x_vars): + self.controlling_vars = x_vars + def SetLRDecay(self, lr_decay): + self.lr_decay = lr_decay + def SetAlphaExpo(self, alpha_expo): + self.alpha_expo = alpha_expo + def SetBatchSize(self, batch_size): + self.batch_size = batch_size + def SetHiddenLayers(self, hidden_layer_neurons): + self.hidden_layers = hidden_layer_neurons + def SetFreeFlameDir(self, freeflame_dir): + self.freeflame_dir = freeflame_dir + def SetBurnerFlameDir(self, burnerflame_dir): + self.burnerflame_dir = burnerflame_dir + def SetEquilibriumDir(self, equilibrium_dir): + self.equilibrium_dir = equilibrium_dir + def GetTestScore(self): + return self.test_score[0] + def GetTestTime(self): + return self.test_time + + # Obtain controlling variable data and train data from input file for + # a given set of variable names. + def GetReferenceData(self, dataset_file, x_vars, train_variables): + + # Open data file and get variable names from the first line + fid = open(dataset_file, 'r') + line = fid.readline() + fid.close() + line = line.strip() + line_split = line.split(',') + if(line_split[0][0] == '"'): + varnames = [s[1:-1] for s in line_split] + else: + varnames = line_split + + # Get indices of controlling and train variables + iVar_x = [varnames.index(v) for v in x_vars] + iVar_y = [varnames.index(v) for v in train_variables] + + # Retrieve respective data from data set + D = np.loadtxt(dataset_file, delimiter=',', skiprows=1) + X_data = D[:, iVar_x] + Y_data = D[:, iVar_y] + + return X_data, Y_data + + # Obtain and preprocess train, test, and validation data + def GetTrainData(self): + + # Retrieve full, train, test, and validation data + print("Reading train, test, and validation data...") + X_full, Y_full = self.GetReferenceData(self.Full_file, self.controlling_vars, self.train_vars) + self.X_train, self.Y_train = self.GetReferenceData(self.Train_file, self.controlling_vars, self.train_vars) + self.X_test, self.Y_test = self.GetReferenceData(self.Test_file, self.controlling_vars, self.train_vars) + self.X_val, self.Y_val = self.GetReferenceData(self.Val_file, self.controlling_vars, self.train_vars) + print("Done!") + + # Calculate normalization bounds of full data set + self.X_min, self.X_max = np.min(X_full, 0), np.max(X_full, 0) + self.Y_min, self.Y_max = np.min(Y_full, 0), np.max(Y_full, 0) + + # Free up memory + del X_full + del Y_full + + + # Normalize train, test, and validation controlling variables + self.X_train_norm = (self.X_train - self.X_min) / (self.X_max - self.X_min) + self.X_test_norm = (self.X_test - self.X_min) / (self.X_max - self.X_min) + self.X_val_norm = (self.X_val - self.X_min) / (self.X_max - self.X_min) + + # Normalize train, test, and validation data + self.Y_train_norm = (self.Y_train - self.Y_min) / (self.Y_max - self.Y_min) + self.Y_test_norm = (self.Y_test - self.Y_min) / (self.Y_max - self.Y_min) + self.Y_val_norm = (self.Y_val - self.Y_min) / (self.Y_max - self.Y_min) + + # Construct MLP based on architecture information + def DefineMLP(self): + + # Construct MLP on specified device + with tf.device("/"+self.kind_device+":"+str(self.device_index)): + + # Initialize sequential model + self.model = keras.models.Sequential() + self.history = None + + # Retrieve activation function(s) for the hidden layers + activation_functions_in_MLP = self.activation_functions[self.i_activation_function] + + # Add input layer + self.model.add(keras.layers.Dense(self.hidden_layers[0], input_dim=self.X_train.shape[1], activation=activation_functions_in_MLP[0], kernel_initializer='he_uniform')) + + # Add hidden layers + iLayer = 1 + while iLayer < len(self.hidden_layers): + activation_function = activation_functions_in_MLP[iLayer % len(activation_functions_in_MLP)] + self.model.add(keras.layers.Dense(self.hidden_layers[iLayer], activation=activation_function, kernel_initializer="he_uniform")) + iLayer += 1 + + # Add output layer + self.model.add(keras.layers.Dense(self.Y_train.shape[1], activation='linear')) + + # Define learning rate schedule and optimizer + lr_schedule = keras.optimizers.schedules.ExponentialDecay(10**self.alpha_expo, decay_steps=10000, + decay_rate=self.lr_decay, staircase=False) + opt = keras.optimizers.Adam(learning_rate=lr_schedule, beta_1=0.9, beta_2=0.999, epsilon=1e-8, amsgrad=False) + + # Compile model on device + self.model.compile(optimizer=opt, loss="mean_squared_error", metrics=["mape"]) + self.cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=self.save_dir, + save_weights_only=True, + verbose=0) + + # Load previously trained MLP (did not try this yet!) + def LoadMLP(self, model_filename): + with tf.device("/"+self.kind_device+":"+str(self.device_index)): + self.model = tf.keras.models.load_model(model_filename, compile=False) + lr_schedule = keras.optimizers.schedules.ExponentialDecay(10**self.alpha_expo, decay_steps=10000, + decay_rate=self.lr_decay, staircase=False) + opt = keras.optimizers.Adam(learning_rate=lr_schedule, beta_1=0.9, beta_2=0.999, epsilon=1e-8, amsgrad=False) + self.model.compile(optimizer=opt, loss="mean_squared_error", metrics=["mape"]) + + # Initialize MLP training + def Train_MLP(self): + with tf.device("/"+self.kind_device+":"+str(self.device_index)): + t_start = time.time() + self.history = self.model.fit(self.X_train_norm, self.Y_train_norm, epochs=self.n_epochs, batch_size=2**self.batch_size, + verbose=2, validation_data=(self.X_val_norm, self.Y_val_norm), shuffle=True,callbacks=[self.cp_callback]) + t_end = time.time() + # Store training time in minutes + self.train_time = (t_end - t_start) / 60 + + # Evaluate test set + def Evaluate_TestSet(self): + with tf.device("/"+self.kind_device+":"+str(self.device_index)): + t_start_test = time.time() + self.test_score = self.model.evaluate(self.X_test_norm, self.Y_test_norm, verbose=0) + t_end_test = time.time() + self.test_time = (t_end_test - t_start_test) + + # Write MLP input file for SU2 simulations + def write_SU2_MLP(self, file_out): + # This function writes the MLP to a format which can be read by the SU2 MLP import tool + # Inputs: + # - file_out: output file name without extension + # - input_names: list of strings with the variable names of the MLP input(s) + # - output names: list of strings with the variable names of the MLP output(s) + # - model: tensorflow.keras.model; the trained model + + # MLP config + model_config = self.model.get_config() + + # Number of input variables in the model + n_inputs = model_config['layers'][0]['config']['batch_input_shape'][1] + # Number of output variables in the model + n_outputs = model_config['layers'][-1]['config']['units'] + + # Checking if number of provided input and output names are equal to those in the model + # if not n_inputs == len(input_names): + # raise Exeption("Number of input names unequal to the number of inputs in the model") + # if not n_outputs == len(output_names): + # raise Exeption("Number of output names unequal to the number of outputs in the model") + + # Opening output file + fid = open(file_out+'.mlp', 'w+') + fid.write("
      \n\n") + n_layers = len(model_config['layers']) + + # Writing number of neurons per layer + fid.write('[number of layers]\n%i\n\n' % n_layers) + fid.write('[neurons per layer]\n') + activation_functions = [] + + for iLayer in range(n_layers-1): + layer_class = model_config['layers'][iLayer]['class_name'] + if layer_class == 'InputLayer': + # In case of the input layer, the input shape is written instead of the number of units + activation_functions.append('linear') + n_neurons = model_config['layers'][iLayer]['config']['batch_input_shape'][1] + else: + # try: + # activation_functions.append(model_config['layers'][iLayer]['config']['activation']['config']['activation']) + # except: + activation_functions.append(model_config['layers'][iLayer]['config']['activation'])#['config']['activation']) + #pass + + n_neurons = model_config['layers'][iLayer]['config']['units'] + + fid.write('%i\n' % n_neurons) + fid.write('%i\n' % n_outputs) + + activation_functions.append('linear') + + # Writing the activation function for each layer + fid.write('\n[activation function]\n') + for iLayer in range(n_layers): + fid.write(activation_functions[iLayer] + '\n') + + # Writing the input and output names + fid.write('\n[input names]\n') + for input in self.controlling_vars: + fid.write(input + '\n') + + fid.write('\n[input normalization]\n') + for i in range(len(self.controlling_vars)): + fid.write('%+.16e\t%+.16e\n' % (self.X_min[i], self.X_max[i])) + + fid.write('\n[output names]\n') + for output in self.train_vars: + fid.write(output+'\n') + + fid.write('\n[output normalization]\n') + for i in range(len(self.train_vars)): + fid.write('%+.16e\t%+.16e\n' % (self.Y_min[i], self.Y_max[i])) + + fid.write("\n
      \n") + # Writing the weights of each layer + fid.write('\n[weights per layer]\n') + for layer in self.model.layers: + fid.write('\n') + weights = layer.get_weights()[0] + for i in range(np.shape(weights)[0]): + weights_of_neuron = weights[i, :] + for j in range(len(weights_of_neuron)): + fid.write('%+.16e\t' % weights_of_neuron[j]) + fid.write('\n') + fid.write('\n') + + # Writing the biases of each layer + fid.write('\n[biases per layer]\n') + + # Input layer biases are set to zero + fid.write('%+.16e\t%+.16e\t%+.16e\n' % (0.0, 0.0, 0.0)) + + for layer in self.model.layers: + biases = layer.get_weights()[1] + for i in range(len(biases)): + fid.write('%+.16e\t' % biases[i]) + fid.write('\n') + + + fid.close() + + # Write an output file containing relevant training outcomes and network information + def Save_Relevant_Data(self): + + pickle.dump(self.history.history, open(self.save_dir + "/training_history_"+self.train_name, "wb")) + self.model.save(self.save_dir + "/MLP_"+self.train_name) + + fid = open(self.save_dir + "/MLP_"+self.train_name+"_performance.txt", "w+") + fid.write("Training time[minutes]: %+.3e\n" % self.train_time) + fid.write("Validation score: %+.16e\n" % self.test_score[0]) + fid.write("Total neuron count: %i\n" % np.sum(np.array(self.hidden_layers))) + fid.write("Evaluation time[seconds]: %+.3e\n" % (self.test_time)) + fid.write("Alpha exponent: %+.4e\n" % self.alpha_expo) + fid.write("Learning rate decay: %+.4e\n" % self.lr_decay) + fid.write("Batch size exponent: %i\n" % self.batch_size) + fid.write("Activation function index: %i\n" % self.i_activation_function) + fid.write("Number of hidden layers: %i\n" % len(self.hidden_layers)) + fid.write("Architecture: " + " ".join(str(n) for n in self.hidden_layers) + "\n") + fid.close() + + self.write_SU2_MLP(self.save_dir + "/MLP_"+self.train_name) + + # Plot training history trend + def Plot_and_Save_History(self): + History = pickle.load(open(self.save_dir + "/training_history_"+self.train_name, 'rb')) + + fig = plt.figure() + ax = plt.axes() + ax.plot(np.log10(History['loss']), 'b', label='Training score') + ax.plot(np.log10(History['val_loss']), 'r', label="Test score") + ax.plot([0, len(History['loss'])], [np.log10(self.test_score[0]), np.log10(self.test_score[0])], 'm--', label=r"Validation score") + ax.grid() + ax.legend(fontsize=20) + ax.set_xlabel("Iteration[-]", fontsize=20) + ax.set_ylabel("Training loss function [-]", fontsize=20) + ax.set_title(""+self.train_name+" Training History", fontsize=22) + ax.tick_params(axis='both', which='major', labelsize=18) + fig.savefig(self.save_dir + "/History_Plot_"+self.train_name+".png", format='png', bbox_inches='tight') + + # Visualize network architecture + def Plot_Architecture(self): + fig = plt.figure() + plt.plot(np.zeros(len(self.controlling_vars)), np.arange(len(self.controlling_vars)) - 0.5*len(self.controlling_vars), 'bo') + for i in range(len(self.hidden_layers)): + plt.plot((i+1)*np.ones(int(self.hidden_layers[i])), np.arange(int(self.hidden_layers[i])) - 0.5*self.hidden_layers[i], 'ko') + plt.plot((i+2)*np.ones(len(self.train_vars)), np.arange(len(self.train_vars)) - 0.5*len(self.train_vars), 'go') + plt.axis('equal') + fig.savefig(self.save_dir +"/"+self.train_name+"_architecture.png",format='png', bbox_inches='tight') + plt.close(fig) + + +# Define save directory +save_dir = "./" +# Directory containing full, train, test, and validation data +train_data_dir = "./" + +# Hardware to train on (CPU / GPU) +device = "CPU" + +# Hardware device index +device_index = 0 + +# Retrieve training parameters +alpha_expo = -3.1 +lr_decay = 0.99 +batch_size = 6 +i_activation_function = 2 + +# Network hidden layer architecture information (perceptron count per hidden layer) +NN = [15, 20, 10] + +fluidName = "Air" + +# Define MLP trainer object +T = Train_Flamelet_MLP(fluidName) + +# Set training parameters +T.SetNEpochs(350) +T.SetActivationIndex(i_activation_function) +T.SetBatchSize(batch_size) +T.SetLRDecay(lr_decay) +T.SetAlphaExpo(alpha_expo) +T.SetControllingVariables(["Density", "Energy"]) + +# Set train data file names +T.SetFullInputFile(train_data_dir + fluidName + "_dataset_full.csv") +T.SetTrainInputFile(train_data_dir + fluidName + "_dataset_train.csv") +T.SetTestInputFile(train_data_dir + fluidName + "_dataset_test.csv") +T.SetValInputFile(train_data_dir + fluidName + "_dataset_dev.csv") + + +T.SetSaveDir(save_dir) + +T.SetDeviceKind(device) +T.SetHiddenLayers(NN) +T.SetDeviceIndex(device_index) + +# Retrieve relevant data +T.GetTrainData() + +# Compile MLP on device +T.DefineMLP() + +# Start training and evaluate performance +T.Train_MLP() +T.Evaluate_TestSet() + +# Save relevant data and postprocess +T.Save_Relevant_Data() +T.Plot_and_Save_History() +T.Plot_Architecture() diff --git a/compressible_flow/NICFD_nozzle/DataDriven/MLP_Air.mlp b/compressible_flow/NICFD_nozzle/DataDriven/MLP_Air.mlp new file mode 100644 index 0000000..f16fa96 --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/MLP_Air.mlp @@ -0,0 +1,108 @@ +
      + +[number of layers] +5 + +[neurons per layer] +2 +15 +20 +10 +6 + +[activation function] +linear +gelu +gelu +gelu +linear + +[input names] +Density +Energy + +[input normalization] ++1.7415915518881592e-01 +2.5111225166498802e+01 ++3.2165306317505747e+05 +8.8539465646401467e+05 + +[output names] +s +dsde_rho +dsdrho_e +d2sde2 +d2sdedrho +d2sdrho2 + +[output normalization] ++2.9463614822899408e+03 +5.3560903213437250e+03 ++9.9999999999999980e-04 +3.5714285714285722e-03 +-1.6484560987282607e+03 -1.1327554484124706e+01 +-1.7789150880939358e-08 -1.1703687702199641e-09 +-3.1439422348520776e-06 -1.0887304013742184e-07 ++4.5412175143804584e-01 +9.4637571910618462e+03 + +
      + +[weights per layer] + ++8.3189833164215088e-01 +2.4360325187444687e-02 +9.7707062959671021e-01 -1.2345232069492340e-02 -2.9215031862258911e-01 -2.9611685276031494e+00 +2.0383414626121521e-01 -9.9647676944732666e-01 -6.6573948860168457e+00 -2.0399811267852783e+00 -4.2854586243629456e-01 -1.0035426616668701e+00 -1.3616700172424316e+01 -1.6206993103027344e+01 -1.6444923877716064e+00 +-3.1028425693511963e-01 -8.0309319496154785e-01 +1.2440043687820435e+00 +6.7310041189193726e-01 +3.3015012741088867e-01 +7.7720489352941513e-03 -2.7469534873962402e+00 +1.0604603290557861e+00 +4.1311588883399963e-01 +4.2180567979812622e-01 -1.7606079578399658e+00 -1.2516785860061646e+00 -1.7313229618594050e-03 +1.8466904759407043e-02 +9.4342261552810669e-01 + + ++1.2671764194965363e-01 -1.8266780376434326e+00 +4.5098075270652771e-01 -4.1970783472061157e-01 +2.2262683138251305e-02 -1.3785655498504639e+00 -2.2929574549198151e-01 +7.0164126157760620e-01 -2.0857352018356323e-01 +1.3381133079528809e+00 -5.4946625232696533e-01 +1.1290591210126877e-01 -2.5393629074096680e-01 +4.3327644467353821e-01 -2.5811696052551270e-01 -5.4948449134826660e-01 +1.9658945798873901e+00 -2.3211978375911713e-01 +7.0470392704010010e-01 +1.0347775369882584e-01 +-4.7119098901748657e-01 -9.4768993556499481e-02 +6.3686430454254150e-01 -2.1410700678825378e-01 +5.0014472007751465e-01 +4.5773684978485107e-01 -3.2236999273300171e-01 +3.9864891767501831e-01 -4.7597566246986389e-01 +2.3050796985626221e+00 +6.6121703386306763e-01 +5.9183914214372635e-02 -7.2147786617279053e-02 +1.5147539973258972e-01 +5.0518357753753662e-01 +1.6456981003284454e-01 +1.4601304531097412e+00 +7.3865301907062531e-02 +8.8795572519302368e-02 +5.1658850908279419e-01 ++2.8539058566093445e-01 -3.3595198392868042e-01 -7.7873903512954712e-01 +4.8598745465278625e-01 +3.2090932130813599e-01 -1.8747586011886597e-01 +2.6564034819602966e-01 -4.5581549406051636e-01 +4.1367557644844055e-01 -1.3443436622619629e+00 -4.0652289986610413e-01 -4.3078523874282837e-01 -6.4736980199813843e-01 +1.4654091000556946e-01 +2.4033172428607941e-01 -5.0277596712112427e-01 -7.5689059495925903e-01 -3.6107480525970459e-01 +7.3940621223300695e-04 -6.6149485111236572e-01 +-1.9496695697307587e-01 +2.8244624845683575e-03 -1.4492729306221008e-01 +3.9252611994743347e-01 -4.3490674346685410e-02 +3.1034186482429504e-01 +7.2382897138595581e-02 -9.4509638845920563e-02 +4.0807878971099854e-01 -1.9424710273742676e+00 -5.5980741977691650e-02 +1.1419963836669922e-01 -1.7739479243755341e-01 -3.7055251002311707e-01 +2.2675377130508423e-01 -4.1521918773651123e-01 +1.2799455225467682e-01 -1.2624530494213104e-01 -1.9770638644695282e-01 -1.9654132425785065e-01 ++4.2571529746055603e-01 +5.8648675680160522e-01 +6.3656000420451164e-03 -3.4227845072746277e-01 -6.8164592981338501e-01 -3.2352665066719055e-01 -1.2425225973129272e-01 -6.4097113907337189e-02 +1.1482629925012589e-01 -8.3119380474090576e-01 +2.9075515270233154e-01 -4.6910610795021057e-01 +4.1692364215850830e-01 -3.8320121169090271e-01 +5.3708368539810181e-01 +1.2222218513488770e-01 +2.9225397109985352e-01 -3.6609309911727905e-01 +3.0321422964334488e-02 -1.8383499979972839e-01 ++1.0946505516767502e-01 +2.3443622887134552e-01 +1.6104626655578613e-01 -4.9523472785949707e-01 -2.0512697100639343e-01 +1.0504413396120071e-01 +5.7075685262680054e-01 -2.1702742576599121e-01 -4.2540195584297180e-01 +3.4554854035377502e-01 -1.2561812996864319e-01 -1.6924200057983398e+00 +8.2237142324447632e-01 -2.2598077356815338e-01 -4.5798552036285400e-01 +1.0085639953613281e+00 -3.2769978046417236e-01 +6.2984257936477661e-01 -3.2380005717277527e-01 +3.2018640637397766e-01 +-5.0133413076400757e-01 +1.7135469913482666e+00 +3.4703001976013184e+00 -4.4624549150466919e-01 -3.4907063841819763e-01 -1.9941161572933197e-01 +3.6381298303604126e-01 +1.0495340824127197e+00 +9.3154743313789368e-02 +1.6024160385131836e+00 +5.9023177623748779e-01 +4.4321373105049133e-02 +3.2297858595848083e-01 +1.0061268806457520e+00 +4.0516072511672974e-01 +1.5158954262733459e-01 +3.1624364852905273e-01 +2.3541492223739624e-01 -8.2202929258346558e-01 +8.9111083745956421e-01 +-1.3641531765460968e-01 +2.4177990853786469e-01 -3.7618672847747803e-01 -3.4604027867317200e-01 -5.3753757476806641e-01 -2.6926660537719727e-01 -2.2961834073066711e-01 +3.2282969355583191e-01 -3.8071197271347046e-01 -6.6386234760284424e-01 +5.2901147864758968e-03 +4.2451430112123489e-02 -3.4727483987808228e-01 -4.1438218951225281e-01 +7.3989324271678925e-02 -3.1189326196908951e-02 -4.8651853203773499e-01 -1.7309622466564178e-01 +1.8827030062675476e-01 +3.7244164943695068e-01 +-1.1871234327554703e-01 +7.9447120428085327e-02 -2.2181269526481628e-01 -1.0935883969068527e-01 +5.6829992681741714e-02 +8.9580744504928589e-02 +2.0029288530349731e-01 +5.5052900314331055e-01 -1.9459363818168640e-01 -2.0172870159149170e-01 +3.7621203064918518e-01 +4.7160428762435913e-01 -1.0610114336013794e+00 -1.6349175572395325e-01 -7.8070771694183350e-01 +9.5123392343521118e-01 -1.2587261199951172e-01 -2.0239561796188354e-01 +2.6128085330128670e-02 +8.6509060859680176e-01 +-6.6607564687728882e-01 +6.8815660476684570e-01 -1.2259326875209808e-01 -4.1641753911972046e-01 -1.6845415532588959e-01 +6.2125480175018311e-01 +5.1497584581375122e-01 +6.7546433210372925e-01 +4.2517700791358948e-01 +2.3134332895278931e-01 +8.4953106939792633e-02 +2.6244616508483887e-01 +6.2022322416305542e-01 +1.8996278941631317e-01 +3.2571993768215179e-02 +2.9725074768066406e-01 -5.6376576423645020e-01 +7.1910697221755981e-01 -7.3800019919872284e-02 +8.7421797215938568e-02 ++1.9196066260337830e-01 -2.5707763433456421e-01 +1.2028281688690186e+00 -4.9794372916221619e-01 -5.7221579551696777e-01 -1.6068166494369507e-01 -3.0058667063713074e-01 +4.0411502122879028e-01 -6.7706561088562012e-01 +7.9482120275497437e-01 +8.4778390824794769e-02 +3.2887285947799683e-01 +8.1174862384796143e-01 +4.2346477508544922e-01 -2.0472085475921631e-01 +5.0644415616989136e-01 +7.6849955320358276e-01 -9.3665689229965210e-01 -4.8341527581214905e-01 +1.4117115736007690e-01 +-2.9069364070892334e-01 +1.3675889968872070e+00 +7.9628318548202515e-01 +5.5777251720428467e-01 -4.9216035008430481e-01 -3.9364516735076904e-01 +6.2846845388412476e-01 -1.0596232116222382e-01 -4.0042385458946228e-01 +7.2991651296615601e-01 -2.9488256573677063e-01 +4.7022944688796997e-01 +6.7533230781555176e-01 -2.4376918375492096e-01 +4.9040398001670837e-01 -3.0182367190718651e-02 +1.6438471078872681e+00 +1.0786532163619995e+00 +2.6507875323295593e-01 +1.8865522742271423e-01 ++5.8844089508056641e-01 -6.7196071147918701e-01 +4.7722464799880981e-01 +1.4196334779262543e-01 -7.3014509677886963e-01 +1.4272706210613251e-01 +7.0519083738327026e-01 -7.3207497596740723e-01 -5.5828666687011719e-01 +4.7240239381790161e-01 +4.8759069442749023e+00 +3.1473405361175537e+00 -1.6073256731033325e+00 +8.0116525292396545e-02 -7.2653526067733765e-01 +1.3131177425384521e+00 +8.7977267801761627e-02 -4.6832773089408875e-01 -1.3739584386348724e-01 +1.1401559114456177e+00 ++6.1726832389831543e-01 +5.5695962905883789e-01 -4.9429216980934143e-01 +1.6674274206161499e-01 -1.8071268498897552e-01 -6.2956020236015320e-02 +6.8190127611160278e-01 +1.0376520156860352e+00 -4.9343284964561462e-01 -5.1102572679519653e-01 +3.8847734928131104e+00 +3.8089091777801514e+00 +3.7172675132751465e-01 -6.2955417670309544e-03 -1.6707984209060669e+00 +2.5282790660858154e+00 +1.4855794608592987e-01 -2.8840228915214539e-01 -4.1574388742446899e-01 +7.4686273932456970e-02 +-1.9936434924602509e-01 -3.2982286810874939e-01 -4.2284306883811951e-01 -6.0190027952194214e-01 -3.6192491650581360e-02 +1.0197895765304565e-01 -2.5287309661507607e-02 -3.0848196148872375e-01 +4.9089935421943665e-01 -9.8292624950408936e-01 +4.9323087930679321e-01 +3.5580074787139893e-01 +6.6490244865417480e-01 -3.3077242970466614e-01 +5.7284835726022720e-02 +5.3051674365997314e-01 -9.6007549762725830e-01 +7.5076526403427124e-01 +4.6473911404609680e-01 -1.5601371228694916e-01 + + +-3.0170837044715881e-01 +7.6915688812732697e-02 -3.6323380470275879e-01 -8.1987410783767700e-02 +5.8737164735794067e-01 +2.1288475394248962e-01 +1.3999734818935394e-01 -1.4477537944912910e-02 -3.8366195559501648e-01 +2.7628245949745178e-01 +-4.9298065900802612e-01 +7.1744211018085480e-02 -9.1140484809875488e-01 +4.0871703624725342e-01 -7.2638124227523804e-01 +5.1287900656461716e-02 -5.8719980716705322e-01 -2.8210255503654480e-01 +1.2065146863460541e-01 -1.5844403207302094e-01 ++1.5045787394046783e-01 +2.1475519239902496e-01 -2.3714277148246765e-01 +9.0225833654403687e-01 -6.6289794445037842e-01 -2.1841837465763092e-01 +1.1645921468734741e+00 -2.6369076967239380e-01 +1.0150812864303589e+00 -4.3610000610351562e-01 +-3.8243392109870911e-01 +5.2422040700912476e-01 -1.0354539155960083e+00 -2.1356192231178284e-01 -2.7603408694267273e-01 +7.8330852091312408e-02 -4.4389730691909790e-01 +2.3024851083755493e-01 -4.9227750301361084e-01 -3.6274331808090210e-01 +-4.4488561153411865e-01 +1.3431280851364136e-01 -6.8945783376693726e-01 -5.3909307718276978e-01 +5.6848633289337158e-01 +2.5814577937126160e-01 -4.0482479333877563e-01 -1.4690902829170227e-01 +3.8733616471290588e-01 +4.1191309690475464e-01 ++9.5030784606933594e-01 +4.9329441040754318e-02 +6.2590652704238892e-01 -6.0731992125511169e-02 +3.0356884002685547e-01 +8.0745350569486618e-03 +1.0205841064453125e-01 +3.1406331062316895e-01 +4.1173595190048218e-01 -2.1476952731609344e-01 ++1.3379637897014618e-01 +1.5142989158630371e-01 -2.7185001969337463e-01 -3.8880314677953720e-02 -1.4730513095855713e-01 +3.4330704808235168e-01 -4.3363025784492493e-01 +4.7468748688697815e-01 +1.0036426782608032e-01 -3.2720685005187988e-01 +-2.9784267768263817e-02 -4.0209764242172241e-01 +4.3699020147323608e-01 +6.2906965613365173e-02 -3.8217192888259888e-01 -1.6591273248195648e-01 +8.8514155149459839e-01 +2.9556000232696533e-01 +8.5957425832748413e-01 -3.8072612881660461e-01 +-1.6700486838817596e-01 +3.7050578743219376e-02 -4.0714105963706970e-01 -5.5191898345947266e-01 +1.4483349025249481e-01 -8.7701179087162018e-02 -5.1860904693603516e-01 +1.7401486635208130e-01 -3.8173541426658630e-01 -5.2513760328292847e-01 +-4.6101239323616028e-01 -4.8938244581222534e-02 +1.3286030292510986e+00 +3.3797380328178406e-01 -9.2495359480381012e-02 +5.6875848770141602e-01 -1.1768547296524048e+00 -5.4860256612300873e-02 -1.0419830083847046e+00 -6.0084092617034912e-01 +-3.1412798166275024e-01 -2.0672358572483063e-01 +5.5496263504028320e-01 +2.2195336818695068e+00 -1.4060457050800323e-01 +9.1957867145538330e-01 -1.5775939822196960e-01 +4.5764753222465515e-01 +2.8174147009849548e-01 -4.5313954353332520e-02 ++2.9646211862564087e-01 -1.3258739374577999e-02 -2.4994933605194092e-01 +1.6421346664428711e+00 +2.1416942775249481e-01 +2.6032069325447083e-01 +1.9962693750858307e-01 -3.3637472987174988e-01 -2.8390151262283325e-01 +1.3316956162452698e-01 ++4.5846441388130188e-01 -8.6484462022781372e-01 +3.9236262440681458e-01 +2.6110070943832397e-01 -4.3285474181175232e-01 -2.3915094137191772e-01 -1.1928474903106689e-01 +3.4878674149513245e-01 +9.5887236297130585e-02 -2.7723997831344604e-02 +-5.7017827033996582e-01 +4.0155231952667236e-01 -7.1631860733032227e-01 +1.3063825666904449e-01 -5.5929476022720337e-01 -2.8212028741836548e-01 +7.2395575046539307e-01 -4.8445662856101990e-01 +3.5177272558212280e-01 +2.2905287146568298e-01 ++1.0999987833201885e-02 +3.1594970822334290e-01 -5.8221399784088135e-01 -1.1045650243759155e+00 -1.7205716669559479e-01 -5.1228982210159302e-01 +2.8194218873977661e-01 +1.8113629519939423e-01 +2.0927965641021729e-02 +1.5049912035465240e-02 ++6.1268042773008347e-02 -3.2032114267349243e-01 +4.5359694957733154e-01 -4.6679916977882385e-01 +8.8585443794727325e-02 +7.2091686725616455e-01 -1.0289754718542099e-01 -3.5061910748481750e-01 +1.1756399273872375e-01 -5.5597525089979172e-02 ++7.5021207332611084e-02 -7.6903682947158813e-01 +1.3238885439932346e-02 +1.6645556688308716e-01 -1.9177964329719543e-01 +6.3669621944427490e-02 -9.2113125324249268e-01 +9.6912138164043427e-02 -6.0029613971710205e-01 -1.3521659374237061e-01 ++3.3675971627235413e-01 -1.6087009012699127e-01 -1.0906817913055420e+00 +1.0048210620880127e-01 -4.2005112767219543e-01 -1.0576992481946945e-01 +7.1304939687252045e-02 -6.1840909719467163e-01 +9.0885944664478302e-02 -1.9212763011455536e-01 ++4.0743720531463623e-01 +2.9516917467117310e-01 -6.9643086194992065e-01 -4.5082813501358032e-01 +1.9877274334430695e-01 +2.3463843762874603e-01 +1.5944747626781464e-01 -1.6860195994377136e-01 -2.5292521715164185e-01 +2.2777123749256134e-01 +-2.3857752978801727e-01 +3.4513697028160095e-01 +1.8312393128871918e-01 -3.0646869912743568e-02 -6.1918503046035767e-01 -3.0041000247001648e-01 +5.8370064944028854e-02 -4.7104901075363159e-01 -6.0988360643386841e-01 +3.0400118231773376e-01 + + ++9.3217974901199341e-01 -2.2209948301315308e-01 -4.8535454273223877e-01 +2.5663039088249207e-01 +2.6703682541847229e-01 -2.8267901390790939e-02 +-2.5217276811599731e-01 +2.9466016218066216e-02 +5.8569425344467163e-01 +1.0606556385755539e-01 +9.0765081346035004e-02 -2.5554147362709045e-01 ++4.0240854024887085e-01 -1.0234528779983521e-01 -7.5306856632232666e-01 +1.5750269591808319e-01 +2.5551918148994446e-01 -3.1681455671787262e-02 ++5.5021122097969055e-02 -2.4351221509277821e-03 -4.3899568915367126e-01 -1.4826707541942596e-02 -1.0359151288866997e-02 +1.2408523559570312e+00 ++4.3519809842109680e-01 +1.6852436959743500e-01 +3.1545510888099670e-01 +4.3038123846054077e-01 +5.1619994640350342e-01 +8.8630527257919312e-02 +-9.9793449044227600e-02 +9.9180685356259346e-03 -4.5305061340332031e-01 -2.9788592830300331e-02 -6.9941937923431396e-02 +1.1063648462295532e+00 ++8.6284118879120797e-05 +6.4865452051162720e-01 +4.9347317218780518e-01 -9.4013345241546631e-01 -9.8375785350799561e-01 +1.0046683996915817e-01 ++5.4859185218811035e-01 -1.5914392471313477e-01 +1.7106632888317108e-01 +2.4464827775955200e-01 +3.1630045175552368e-01 +3.7722098827362061e-01 +-4.6650316566228867e-02 +7.6701915264129639e-01 -2.1900288760662079e-01 -5.2809679508209229e-01 -6.4607077836990356e-01 +2.2924181818962097e-01 +-9.2180609703063965e-01 +9.0118980407714844e-01 +1.3119752705097198e-01 -5.5733013153076172e-01 -2.3821175098419189e-01 +6.1467997729778290e-02 + + +[biases per layer] ++0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00 ++2.8398973867297173e-02 -5.2653890103101730e-02 +7.2251282632350922e-02 -1.5008391439914703e-01 -2.4311138689517975e-01 +2.4922281503677368e-02 -2.9253277182579041e-01 -3.8977432250976562e-01 -1.2477821111679077e-01 -2.5386825203895569e-01 +2.3223572969436646e-01 -8.2743084430694580e-01 +1.0815679281949997e-01 +2.2254261374473572e-01 -1.9538600742816925e-01 +-2.4459753185510635e-02 -5.3442329168319702e-01 +5.2759334444999695e-02 -1.0009699314832687e-01 +4.4059060513973236e-02 +5.6026265025138855e-02 -1.1409015953540802e-01 +1.6972656548023224e-01 -1.0456599295139313e-02 -8.6772751808166504e-01 -1.9689893722534180e-01 -3.6817491054534912e-01 -2.4563239514827728e-01 -3.9886855520308018e-03 +3.2684877514839172e-02 +3.1463623046875000e-01 -8.6215591430664062e-01 -4.4767320156097412e-01 -1.4762860536575317e-01 -3.5506153106689453e-01 ++2.4384185671806335e-01 +1.1348700523376465e-01 +7.0070214569568634e-02 -1.3836091756820679e-01 +2.5818932056427002e-01 +4.3969273567199707e-02 +2.3830464482307434e-01 +1.7758463323116302e-01 +1.9545859098434448e-01 -8.2950294017791748e-02 ++2.2509382665157318e-01 +2.7680635452270508e-01 +1.4246858656406403e-01 +2.6635000109672546e-01 +2.1496956050395966e-01 +1.4866390824317932e-01 diff --git a/compressible_flow/NICFD_nozzle/DataDriven/README.md b/compressible_flow/NICFD_nozzle/DataDriven/README.md new file mode 100644 index 0000000..4cbab51 --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/README.md @@ -0,0 +1,32 @@ +--- +title: Data-Driven Fluid Model +permalink: /SU2_CFD/src/fluid/CDataDrivenFluid.cpp +--- +# Using Data-Driven Fluid Models in SU2 +Modeling non-ideal fluid behavior can be difficult when limited to model equations or can be time consuming when performing large-scale simulations using the CoolProp fluid model. The data-driven fluid model class allows for the equation of state to be defined through a look-up table (LUT) or a set of multi-layer perceptrons (MLP), using an entropy-based equation of state. Given enough reference data and careful tuning of the initial conditions, it is possible to attain similar accuracies as the CoolProp library, while being compatible with the SU2 adjoint solver and a faster iteration time. + +# Data-Driven Fluid Model Class + +The data-driven fluid model class allows for the use of LUT or MLP to interpolate the entropy and its partial derivatives for a given density and static energy. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library, adjoint capability is required, or when computational performance is important. + +The data-driven fluid model is enabled through the config option "DATADRIVEN_FLUID". The option "INTERPOLATION_METHOD" refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are "LUT" for a look-up table based approach, or "MLP" for the use of an MLP. Information on these two regression methods is provided in later paragraphs. + +The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables. The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. +The input variables for the MLP should be named "Density" and "Energy". The output variables should be named: +"s": fluid entropy +"dsde_rho": first entropy derivative w.r.t. static energy +"dsdrho_e": first entropy derivative w.r.t. density +"d2sdedrho": second entropy derivative w.r.t density and static energy +"d2sde2": second entropy derivative w.r.t. static energy +"d2sdrho2": second entropy derivative w.r.t. density + +Based on the values for the partial derivatives of the entropy, it is possible to calculate the temperature, pressure, enthalpy, speed of sound, and secondary flow variables. Newton solver processes are used when the thermodynamic state is defined through variable pairs other than density and static energy. The initial values for density and static energy have to be defined by the user in the config file through "DATADRIVEN_FLUID_INITIAL_DENSITY" and "DATADRIVEN_FLUID_INITIAL_ENERGY". These values thave to be chosen carefully such that the initial condition of the simulation can be attained. The option "DATADRIVEN_NEWTON_RELAXATION" determines the relaxation factor for the Newton solver processes in the data-driven fluid model. Higher values result in faster convergence of the Newton solvers in stable regions. Lower values result in more iterations, but are more likely to avoid instabilities. + +# MLP Definition +Data regression using an MLP is enabled through selecting the "MLP" for the option "INTERPOLATION_METHOD" in the configuration file. In order to load an MLP architecture into SU2, an input file needs to be provided describing the network architecture, as well as the input and output variable names and ranges. An example of such an input file is provided in this folder (MLP_Air.mlp). This file can be generated from an MLP trained through Tensorflow using the "Tensorflow2SU2.py" script. Additional information regarding the translation from a Tensorflow model to an SU2 input file is provided in the python code. The script used to train the MLP is provided in "MLPTrainer.py" and the script used to generate the reference data from CoolProp in "Generate_Dataset.py". + +MLP regression is enabled through the MLPCpp submodule of SU2 (subprojects/MLPCpp). This submodule is enabled through the '-Denable-mlpcpp=true' meson command. The MLPCpp submodule can be used within any C++ code for MLP evaluation. Additional documentation regarding the MLPCpp module can be found on https://github.com/EvertBunschoten/MLPCpp + +# LUT Definition + +In some cases it may be more convenient to use an LUT instead of an MLP for data regression. The data-driven fluid model in SU2 is also compatible with using an unstructured table (Common/src/containers/CLookUpTable.cpp) for the regression of the entropy and its partial derivatives. Data regression using an LUT is enabled through selecting the "LUT" for the option "INTERPOLATION_METHOD" in the configuration file. Examples for the .drg table format file can be found under UnitTests/Common/containers/ or can be generated using the "LUTWriter.m" MATLAB script in this tutorial folder. \ No newline at end of file diff --git a/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg b/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg new file mode 100644 index 0000000..0f816b8 --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg @@ -0,0 +1,130 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% SU2 configuration file % +% Case description: Non-ideal compressible fluid flow in a converging- % +% diverging supersonic nozzle using a multi-layer perceptron % +% for thermodynamic state calculations. % +% Author: Evert Bunschoten % +% Institution: Delft University of Technology % +% Date: 2022.10.8 % +% File Version 7.4.0 Blackbird % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% +SOLVER= RANS +KIND_TURB_MODEL= SST +MATH_PROBLEM= DIRECT +RESTART_SOL= NO +SYSTEM_MEASUREMENTS= SI +% +% -------------------- COMPRESSIBLE FREE-STREAM DEFINITION --------------------% +% +% Mach number (non-dimensional, based on the free-stream values) +MACH_NUMBER= 1E-9 +AOA= 0.0 +SIDESLIP_ANGLE= 0.0 +INIT_OPTION= TD_CONDITIONS +FREESTREAM_OPTION= TEMPERATURE_FS +FREESTREAM_PRESSURE= 1.0e6 +% +% Free-stream temperature (288.15 K, 518.67 R by default) +FREESTREAM_TEMPERATURE= 400.0 +FREESTREAM_DENSITY= 2.0 +REF_DIMENSIONALIZATION= DIMENSIONAL + +% ---- DATADRIVEN FLUID MODEL DEFINITION -------% +% +FLUID_MODEL = DATADRIVEN_FLUID +INTERPOLATION_METHOD = MLP +FILENAMES_INTERPOLATOR = (MLP_Air.mlp) + +DATADRIVEN_NEWTON_RELAXATION = 0.99 +DATADRIVEN_FLUID_INITIAL_DENSITY = 8.8657 +DATADRIVEN_FLUID_INITIAL_ENERGY = 411176.41 + +% --------------------------- VISCOSITY MODEL ---------------------------------% +VISCOSITY_MODEL= CONSTANT_VISCOSITY +MU_CONSTANT= 1.21409E-05 + +% --------------------------- THERMAL CONDUCTIVITY MODEL ----------------------% +CONDUCTIVITY_MODEL= CONSTANT_CONDUCTIVITY +THERMAL_CONDUCTIVITY_CONSTANT= 0.030542828 + +% -------------------- BOUNDARY CONDITION DEFINITION --------------------------% +MARKER_SYM= ( SYMMETRY, WALL ) +MARKER_RIEMANN= ( INFLOW, TOTAL_CONDITIONS_PT, 1.8e6, 500, 1.0, 0.0, 0.0, OUTFLOW, STATIC_PRESSURE, 6e5, 0.0, 0.0, 0.0, 0.0 ) + +% ------------- COMMON PARAMETERS DEFINING THE NUMERICAL METHOD ---------------% +NUM_METHOD_GRAD= GREEN_GAUSS +CFL_NUMBER= 15 +CFL_ADAPT= YES +CFL_ADAPT_PARAM= ( 0.1, 2.0, 10.0, 1000.0 ) +MAX_DELTA_TIME= 1E6 + +% ----------- SLOPE LIMITER AND DISSIPATION SENSOR DEFINITION -----------------% +MUSCL_FLOW= NO +SLOPE_LIMITER_FLOW= NONE +MUSCL_TURB= NO + +% ------------------------ LINEAR SOLVER DEFINITION ---------------------------% +LINEAR_SOLVER= FGMRES +LINEAR_SOLVER_PREC= ILU +LINEAR_SOLVER_ILU_FILL_IN= 0 +LINEAR_SOLVER_ERROR= 1E-6 +LINEAR_SOLVER_ITER= 10 + +% -------------------------- MULTIGRID PARAMETERS -----------------------------% +% +% Multi-grid levels (0 = no multi-grid) +MGLEVEL= 0 + +% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% +CONV_NUM_METHOD_FLOW= ROE +ENTROPY_FIX_COEFF= 0.1 +TIME_DISCRE_FLOW= EULER_IMPLICIT + +% -------------------- TURBULENT NUMERICAL METHOD DEFINITION ------------------% +CONV_NUM_METHOD_TURB= SCALAR_UPWIND +TIME_DISCRE_TURB= EULER_IMPLICIT +CFL_REDUCTION_TURB= 1.0 + +% --------------------------- CONVERGENCE PARAMETERS --------------------------% +% +% Number of total iterations +ITER= 1000 +CONV_RESIDUAL_MINVAL= -24 +CONV_STARTITER= 10 + +% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% +% +% Mesh input file +MESH_FILENAME= ../NICFD_nozzle.su2 +% +% Mesh input file format (SU2, CGNS) +MESH_FORMAT= SU2 +% +% Mesh output file +MESH_OUT_FILENAME= mesh_out.su2 +% +% Restart flow input file +SOLUTION_FILENAME= solution_flow.dat +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 +OUTPUT_WRT_FREQ= 100 +% +% Screen output +SCREEN_OUTPUT= (INNER_ITER, RMS_DENSITY, RMS_TKE, RMS_DISSIPATION, LIFT, DRAG) From 2dd6d7e0d246c1d20c7cad2d02fcec6cadac493d Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Tue, 18 Apr 2023 09:41:20 +0200 Subject: [PATCH 09/16] Improved formatting of documentation --- .../NICFD_nozzle/DataDriven/README.md | 31 ++++++++++--------- .../DataDriven/datadriven_nozzle.cfg | 9 ++++++ 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/compressible_flow/NICFD_nozzle/DataDriven/README.md b/compressible_flow/NICFD_nozzle/DataDriven/README.md index 4cbab51..04bebb3 100644 --- a/compressible_flow/NICFD_nozzle/DataDriven/README.md +++ b/compressible_flow/NICFD_nozzle/DataDriven/README.md @@ -5,28 +5,29 @@ permalink: /SU2_CFD/src/fluid/CDataDrivenFluid.cpp # Using Data-Driven Fluid Models in SU2 Modeling non-ideal fluid behavior can be difficult when limited to model equations or can be time consuming when performing large-scale simulations using the CoolProp fluid model. The data-driven fluid model class allows for the equation of state to be defined through a look-up table (LUT) or a set of multi-layer perceptrons (MLP), using an entropy-based equation of state. Given enough reference data and careful tuning of the initial conditions, it is possible to attain similar accuracies as the CoolProp library, while being compatible with the SU2 adjoint solver and a faster iteration time. -# Data-Driven Fluid Model Class +## Data-Driven Fluid Model Class The data-driven fluid model class allows for the use of LUT or MLP to interpolate the entropy and its partial derivatives for a given density and static energy. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library, adjoint capability is required, or when computational performance is important. -The data-driven fluid model is enabled through the config option "DATADRIVEN_FLUID". The option "INTERPOLATION_METHOD" refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are "LUT" for a look-up table based approach, or "MLP" for the use of an MLP. Information on these two regression methods is provided in later paragraphs. +The data-driven fluid model is enabled through the config option ```DATADRIVEN_FLUID```. The option ```INTERPOLATION_METHOD``` refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are ```LUT``` for a look-up table based approach, or ```MLP``` for the use of an MLP. Information on these two regression methods is provided in later paragraphs. The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables. The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. -The input variables for the MLP should be named "Density" and "Energy". The output variables should be named: -"s": fluid entropy -"dsde_rho": first entropy derivative w.r.t. static energy -"dsdrho_e": first entropy derivative w.r.t. density -"d2sdedrho": second entropy derivative w.r.t density and static energy -"d2sde2": second entropy derivative w.r.t. static energy -"d2sdrho2": second entropy derivative w.r.t. density +The controlling variables for the MLP should be named "Density" and "Energy". The output variables should be named: -Based on the values for the partial derivatives of the entropy, it is possible to calculate the temperature, pressure, enthalpy, speed of sound, and secondary flow variables. Newton solver processes are used when the thermodynamic state is defined through variable pairs other than density and static energy. The initial values for density and static energy have to be defined by the user in the config file through "DATADRIVEN_FLUID_INITIAL_DENSITY" and "DATADRIVEN_FLUID_INITIAL_ENERGY". These values thave to be chosen carefully such that the initial condition of the simulation can be attained. The option "DATADRIVEN_NEWTON_RELAXATION" determines the relaxation factor for the Newton solver processes in the data-driven fluid model. Higher values result in faster convergence of the Newton solvers in stable regions. Lower values result in more iterations, but are more likely to avoid instabilities. +1. "s": fluid entropy +2. "dsde_rho": first entropy derivative w.r.t. static energy +3. "dsdrho_e": first entropy derivative w.r.t. density +4. "d2sdedrho": second entropy derivative w.r.t density and static energy +5. "d2sde2": second entropy derivative w.r.t. static energy +6. "d2sdrho2": second entropy derivative w.r.t. density -# MLP Definition -Data regression using an MLP is enabled through selecting the "MLP" for the option "INTERPOLATION_METHOD" in the configuration file. In order to load an MLP architecture into SU2, an input file needs to be provided describing the network architecture, as well as the input and output variable names and ranges. An example of such an input file is provided in this folder (MLP_Air.mlp). This file can be generated from an MLP trained through Tensorflow using the "Tensorflow2SU2.py" script. Additional information regarding the translation from a Tensorflow model to an SU2 input file is provided in the python code. The script used to train the MLP is provided in "MLPTrainer.py" and the script used to generate the reference data from CoolProp in "Generate_Dataset.py". +Based on the values for the partial derivatives of the entropy, it is possible to calculate the temperature, pressure, enthalpy, speed of sound, and secondary flow variables. Newton solver processes are used when the thermodynamic state is defined through variable pairs other than density and static energy. The initial values for density and static energy have to be defined by the user in the config file through ```DATADRIVEN_FLUID_INITIAL_DENSITY``` and ```DATADRIVEN_FLUID_INITIAL_ENERGY```. These values thave to be chosen carefully such that the initial condition of the simulation can be attained. The option ```DATADRIVEN_NEWTON_RELAXATION``` determines the relaxation factor for the Newton solver processes in the data-driven fluid model. Higher values result in faster convergence of the Newton solvers in stable regions. Lower values result in more iterations, but are more likely to avoid instabilities. -MLP regression is enabled through the MLPCpp submodule of SU2 (subprojects/MLPCpp). This submodule is enabled through the '-Denable-mlpcpp=true' meson command. The MLPCpp submodule can be used within any C++ code for MLP evaluation. Additional documentation regarding the MLPCpp module can be found on https://github.com/EvertBunschoten/MLPCpp +## MLP Definition +Data regression using an MLP is enabled through selecting the ```MLP``` for the option ```INTERPOLATION_METHOD``` in the configuration file. In order to load an MLP architecture into SU2, an input file needs to be provided describing the network architecture, as well as the input and output variable names and ranges. An example of such an input file is provided in this folder (```MLP_Air.mlp```). This file can be generated from an MLP trained through Tensorflow using the ```Tensorflow2SU2.py``` script. Additional information regarding the translation from a Tensorflow model to an SU2 input file is provided in the python code. The script used to train the MLP is provided in ```MLPTrainer.py``` and the script used to generate the reference data from CoolProp in "Generate_Dataset.py". -# LUT Definition +MLP regression is enabled through the MLPCpp submodule of SU2 (subprojects/MLPCpp). This submodule is enabled through the ```-Denable-mlpcpp=true``` meson command. The MLPCpp submodule can be used within any C++ code for MLP evaluation. Additional documentation regarding the MLPCpp module can be found on https://github.com/EvertBunschoten/MLPCpp -In some cases it may be more convenient to use an LUT instead of an MLP for data regression. The data-driven fluid model in SU2 is also compatible with using an unstructured table (Common/src/containers/CLookUpTable.cpp) for the regression of the entropy and its partial derivatives. Data regression using an LUT is enabled through selecting the "LUT" for the option "INTERPOLATION_METHOD" in the configuration file. Examples for the .drg table format file can be found under UnitTests/Common/containers/ or can be generated using the "LUTWriter.m" MATLAB script in this tutorial folder. \ No newline at end of file +## LUT Definition + +In some cases it may be more convenient to use an LUT instead of an MLP for data regression. The data-driven fluid model in SU2 is also compatible with using an unstructured table (```Common/src/containers/CLookUpTable.cpp```) for the regression of the entropy and its partial derivatives. Data regression using an LUT is enabled through selecting the ```LUT``` for the option ```INTERPOLATION_METHOD``` in the configuration file. Examples for the .drg table format file can be found under ```UnitTests/Common/containers/``` or can be generated using the ```LUTWriter.m``` MATLAB script in this tutorial folder. \ No newline at end of file diff --git a/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg b/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg index 0f816b8..e534e81 100644 --- a/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg +++ b/compressible_flow/NICFD_nozzle/DataDriven/datadriven_nozzle.cfg @@ -36,10 +36,19 @@ REF_DIMENSIONALIZATION= DIMENSIONAL % ---- DATADRIVEN FLUID MODEL DEFINITION -------% % FLUID_MODEL = DATADRIVEN_FLUID + +% Regression method for data set evaluation (MLP for multi-layer perceptron, +% LUT for look-up table). INTERPOLATION_METHOD = MLP + +% List of input files defining MLP architecture(s) or LUT geometry. FILENAMES_INTERPOLATOR = (MLP_Air.mlp) +% Newton solver relaxation factor for data-driven fluid model. DATADRIVEN_NEWTON_RELAXATION = 0.99 + +% Initial guess values for density and static energy in data-driven fluid model +% Newton solver functions. DATADRIVEN_FLUID_INITIAL_DENSITY = 8.8657 DATADRIVEN_FLUID_INITIAL_ENERGY = 411176.41 From 7d188141b53c0e770143ce2dd3e24a45f89fc828 Mon Sep 17 00:00:00 2001 From: EvertBunschoten Date: Thu, 20 Apr 2023 08:56:49 +0200 Subject: [PATCH 10/16] Removed README.md from datadriven tutorial --- .../NICFD_nozzle/DataDriven/README.md | 33 ----- .../NICFD_nozzle/DataDriven/Tensorflow2SU2.py | 69 +++++++++ .../NICFD_nozzle/DataDriven/write_SU2_MLP.py | 137 ++++++++++++++++++ 3 files changed, 206 insertions(+), 33 deletions(-) delete mode 100644 compressible_flow/NICFD_nozzle/DataDriven/README.md create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/Tensorflow2SU2.py create mode 100644 compressible_flow/NICFD_nozzle/DataDriven/write_SU2_MLP.py diff --git a/compressible_flow/NICFD_nozzle/DataDriven/README.md b/compressible_flow/NICFD_nozzle/DataDriven/README.md deleted file mode 100644 index 04bebb3..0000000 --- a/compressible_flow/NICFD_nozzle/DataDriven/README.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Data-Driven Fluid Model -permalink: /SU2_CFD/src/fluid/CDataDrivenFluid.cpp ---- -# Using Data-Driven Fluid Models in SU2 -Modeling non-ideal fluid behavior can be difficult when limited to model equations or can be time consuming when performing large-scale simulations using the CoolProp fluid model. The data-driven fluid model class allows for the equation of state to be defined through a look-up table (LUT) or a set of multi-layer perceptrons (MLP), using an entropy-based equation of state. Given enough reference data and careful tuning of the initial conditions, it is possible to attain similar accuracies as the CoolProp library, while being compatible with the SU2 adjoint solver and a faster iteration time. - -## Data-Driven Fluid Model Class - -The data-driven fluid model class allows for the use of LUT or MLP to interpolate the entropy and its partial derivatives for a given density and static energy. This type of fluid model can be used as an alternative to the CoolProp fluid model if the fluid in question is not included in the CoolProp library, adjoint capability is required, or when computational performance is important. - -The data-driven fluid model is enabled through the config option ```DATADRIVEN_FLUID```. The option ```INTERPOLATION_METHOD``` refers to which kind of interpolator is used for thermodynamic state evaluation. The available methods here are ```LUT``` for a look-up table based approach, or ```MLP``` for the use of an MLP. Information on these two regression methods is provided in later paragraphs. - -The datadriven fluid model in SU2 uses a general, entropic equation of state to calculate the primary and secondary flow variables. The fluid entropy and its first and second partial derivatives are determined through the interpolation algorithm (LUT or MLP) given the controlling variables density and static energy. The user should therefore supply an MLP or LUT that uses inputs density and static energy and predicts the fluid entropy and its first and second partial derivatives with respect to the inputs. -The controlling variables for the MLP should be named "Density" and "Energy". The output variables should be named: - -1. "s": fluid entropy -2. "dsde_rho": first entropy derivative w.r.t. static energy -3. "dsdrho_e": first entropy derivative w.r.t. density -4. "d2sdedrho": second entropy derivative w.r.t density and static energy -5. "d2sde2": second entropy derivative w.r.t. static energy -6. "d2sdrho2": second entropy derivative w.r.t. density - -Based on the values for the partial derivatives of the entropy, it is possible to calculate the temperature, pressure, enthalpy, speed of sound, and secondary flow variables. Newton solver processes are used when the thermodynamic state is defined through variable pairs other than density and static energy. The initial values for density and static energy have to be defined by the user in the config file through ```DATADRIVEN_FLUID_INITIAL_DENSITY``` and ```DATADRIVEN_FLUID_INITIAL_ENERGY```. These values thave to be chosen carefully such that the initial condition of the simulation can be attained. The option ```DATADRIVEN_NEWTON_RELAXATION``` determines the relaxation factor for the Newton solver processes in the data-driven fluid model. Higher values result in faster convergence of the Newton solvers in stable regions. Lower values result in more iterations, but are more likely to avoid instabilities. - -## MLP Definition -Data regression using an MLP is enabled through selecting the ```MLP``` for the option ```INTERPOLATION_METHOD``` in the configuration file. In order to load an MLP architecture into SU2, an input file needs to be provided describing the network architecture, as well as the input and output variable names and ranges. An example of such an input file is provided in this folder (```MLP_Air.mlp```). This file can be generated from an MLP trained through Tensorflow using the ```Tensorflow2SU2.py``` script. Additional information regarding the translation from a Tensorflow model to an SU2 input file is provided in the python code. The script used to train the MLP is provided in ```MLPTrainer.py``` and the script used to generate the reference data from CoolProp in "Generate_Dataset.py". - -MLP regression is enabled through the MLPCpp submodule of SU2 (subprojects/MLPCpp). This submodule is enabled through the ```-Denable-mlpcpp=true``` meson command. The MLPCpp submodule can be used within any C++ code for MLP evaluation. Additional documentation regarding the MLPCpp module can be found on https://github.com/EvertBunschoten/MLPCpp - -## LUT Definition - -In some cases it may be more convenient to use an LUT instead of an MLP for data regression. The data-driven fluid model in SU2 is also compatible with using an unstructured table (```Common/src/containers/CLookUpTable.cpp```) for the regression of the entropy and its partial derivatives. Data regression using an LUT is enabled through selecting the ```LUT``` for the option ```INTERPOLATION_METHOD``` in the configuration file. Examples for the .drg table format file can be found under ```UnitTests/Common/containers/``` or can be generated using the ```LUTWriter.m``` MATLAB script in this tutorial folder. \ No newline at end of file diff --git a/compressible_flow/NICFD_nozzle/DataDriven/Tensorflow2SU2.py b/compressible_flow/NICFD_nozzle/DataDriven/Tensorflow2SU2.py new file mode 100644 index 0000000..8f02f4a --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/Tensorflow2SU2.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +## \file Tensroflow2SU2.py +# \brief Example of converting a trained Tensorflow MLP to SU2 .mlp +# format. +# \author E.C.Bunschoten +# \version 7.5.0 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2012-2022, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + +import tensorflow as tf +from write_SU2_MLP import * + +# Input names for the SU2 MLP. For the CDataDrivenFluid class, these have to be "Density" and "Energy" +MLP_input_names = ["Density", "Energy"] +# The order of the input names should correspond to that of the trained model inputs. + +# Optional: give minimum and maximum input normalization values. These are required in case the MLP +# was trained on normalized input data. +input_min = [2.81038e-1, 1.79956e5] +input_max = [2.72979e+01, 4.48318e+05] + +# Output names for the SU2 MLP. For the CDataDrivenFluid class, these have to include the following: +MLP_output_names = ["s", # Entropy + "dsde_rho", # First entropy derivative w.r.t static energy + "dsdrho_e", # First entropy derivative w.r.t density + "d2sde2", # Second entropy derivative w.r.t static energy + "d2sdedrho",# Second entropy derivative w.r.t static energy and density + "d2sdrho2"] # Second entropy derivative w.r.t density +# The order of the output names should correspond to that of the trained model outputs. + +# Optional: give minimum and maximum output normalization values. These are required in case the MLP +# was trained on normalized training data. +output_min = [ 5.74729e+03, 1.66861e-03, -1.05632e+03, -2.15459e-08, + -4.20494e-06, 3.96917e-01] + +output_max = [ 7.77852e+03, 4.00000e-03, -1.07148e+01, -3.57370e-09, + -4.93767e-07, 3.75786e+03] + +# Saved Tensorflow model file name, saved with the "model.save" function after training. +Tensorflow_model_file = "MLP_Air" + +# SU2 MLP output file name (wo extension) +SU2_MLP_output_file = "MLP_Air_SU2" + +# Load the MLP trained through Tensorflow +Tensorflow_model = tf.keras.models.load_model(Tensorflow_model_file) + +# Write SU2 MLP input file +write_SU2_MLP(SU2_MLP_output_file, MLP_input_names, MLP_output_names, Tensorflow_model, input_min, input_max, output_min, output_max) + diff --git a/compressible_flow/NICFD_nozzle/DataDriven/write_SU2_MLP.py b/compressible_flow/NICFD_nozzle/DataDriven/write_SU2_MLP.py new file mode 100644 index 0000000..902fca5 --- /dev/null +++ b/compressible_flow/NICFD_nozzle/DataDriven/write_SU2_MLP.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python + +## \file write_SU2_MLP.py +# \brief Python script for translating a trained Tensorflow model +# to an SU2 MLP input file. +# \author E.C.Bunschoten +# \version 7.5.0 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2012-2022, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + + +def write_SU2_MLP(file_out, input_names, output_names, model, input_min=[], input_max=[], output_min=[], output_max=[]): + # This function writes the MLP to a format which can be read by the SU2 MLP import tool + # Inputs: + # - file_out: output file name without extension + # - input_names: list of strings with the variable names of the MLP input(s) + # - output names: list of strings with the variable names of the MLP output(s) + # - model: tensorflow.keras.model; the trained model + # - input_min: lower normalization values for the input + # - input_max: upper normalization values for the input + # - output_min: lower normalization values for the output + # - output_max: upper normalization values for the output + + # MLP config + model_config = model.get_config() + + # Number of input variables in the model + n_inputs = model_config['layers'][0]['config']['batch_input_shape'][1] + # Number of output variables in the model + n_outputs = model_config['layers'][-1]['config']['units'] + + # Checking if number of provided input and output names are equal to those in the model + if not n_inputs == len(input_names): + raise Exception("Number of provided input names unequal to the number of inputs in the model") + if not n_outputs == len(output_names): + raise Exception("Number of provided output names unequal to the number of outputs in the model") + + if len(input_max) != len(input_min): + raise Exception("Upper and lower input normalizations should have the same length") + if len(output_max) != len(output_min): + raise Exception("Upper and lower output normalizations should have the same length") + + if len(input_max) > 0 and len(input_min) != n_inputs: + raise Exception("Input normalization not provided for all inputs") + + if len(output_max) > 0 and len(output_min) != n_outputs: + raise Exception("Output normalization not provided for all outputs") + + + # Creating output file + fid = open(file_out+'.mlp', 'w+') + fid.write("
      \n\n") + n_layers = len(model_config['layers']) + + # Writing number of neurons per layer + fid.write('[number of layers]\n%i\n\n' % n_layers) + fid.write('[neurons per layer]\n') + activation_functions = [] + + for iLayer in range(n_layers-1): + layer_class = model_config['layers'][iLayer]['class_name'] + if layer_class == 'InputLayer': + # In case of the input layer, the input shape is written instead of the number of units + activation_functions.append('linear') + n_neurons = model_config['layers'][iLayer]['config']['batch_input_shape'][1] + else: + activation_functions.append(model_config['layers'][iLayer]['config']['activation']) + n_neurons = model_config['layers'][iLayer]['config']['units'] + + fid.write('%i\n' % n_neurons) + fid.write('%i\n' % n_outputs) + + activation_functions.append('linear') + + # Writing the activation function for each layer + fid.write('\n[activation function]\n') + for iLayer in range(n_layers): + fid.write(activation_functions[iLayer] + '\n') + + # Writing the input and output names + fid.write('\n[input names]\n') + for input in input_names: + fid.write(input + '\n') + + if len(input_min) > 0: + fid.write('\n[input normalization]\n') + for i in range(len(input_names)): + fid.write('%+.16e\t%+.16e\n' % (input_min[i], input_max[i])) + + fid.write('\n[output names]\n') + for output in output_names: + fid.write(output+'\n') + + if len(output_min) > 0: + fid.write('\n[output normalization]\n') + for i in range(len(output_names)): + fid.write('%+.16e\t%+.16e\n' % (output_min[i], output_max[i])) + + fid.write("\n
      \n") + # Writing the weights of each layer + fid.write('\n[weights per layer]\n') + for layer in model.layers: + fid.write('\n') + weights = layer.get_weights()[0] + for row in weights: + fid.write("\t".join(f'{w:+.16e}' for w in row) + "\n") + fid.write('\n') + + # Writing the biases of each layer + fid.write('\n[biases per layer]\n') + + # Input layer biases are set to zero + fid.write('%+.16e\t%+.16e\t%+.16e\n' % (0.0, 0.0, 0.0)) + + for layer in model.layers: + biases = layer.get_weights()[1] + fid.write("\t".join([f'{b:+.16e}' for b in biases]) + "\n") + + fid.close() \ No newline at end of file From 2ec28805da763ca357ecfaeec0a9724431ec1544 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 30 Apr 2023 14:19:29 -0700 Subject: [PATCH 11/16] remove config since it is in the code repo --- .../DAspecies3_primitiveVenturi.cfg | 142 ------------------ 1 file changed, 142 deletions(-) delete mode 100644 incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg diff --git a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg deleted file mode 100644 index 306294a..0000000 --- a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg +++ /dev/null @@ -1,142 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% SU2 configuration file % -% Case description: Discrete Adjiont Species mixing with 3 species % -% Author: T. Kattmann % -% Institution: Bosch Thermotechniek B.V. % -% Date: 2021/10/14 % -% File Version 7.2.1 "Blackbird" % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% -% -SOLVER= INC_RANS -KIND_TURB_MODEL= SST -% -OBJECTIVE_FUNCTION= SURFACE_SPECIES_VARIANCE -OBJECTIVE_WEIGHT= 1.0 -% -% ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% -% -INC_DENSITY_MODEL= CONSTANT -INC_DENSITY_INIT= 1.1766 -% -INC_VELOCITY_INIT= ( 1.00, 0.0, 0.0 ) -% -INC_ENERGY_EQUATION= YES -INC_TEMPERATURE_INIT= 300.0 -% -INC_NONDIM= INITIAL_VALUES -% -% -------------------- FLUID PROPERTIES ------------------------------------- % -% -FLUID_MODEL= CONSTANT_DENSITY -% -CONDUCTIVITY_MODEL= CONSTANT_CONDUCTIVITY -THERMAL_CONDUCTIVITY_CONSTANT= 0.0357 -% -PRANDTL_LAM= 0.72 -TURBULENT_CONDUCTIVITY_MODEL= NONE -PRANDTL_TURB= 0.90 -% -VISCOSITY_MODEL= CONSTANT_VISCOSITY -MU_CONSTANT= 1.716E-5 -% -% -------------------- BOUNDARY CONDITION DEFINITION --------------------------% -% -MARKER_HEATFLUX= ( wall, 0.0 ) -MARKER_SYM= ( axis ) -% -SPECIFIED_INLET_PROFILE= NO -INLET_FILENAME= inlet_venturi.dat -INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET -MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ - air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO -MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ - air_axial_inlet, 0.6, 0.0 ) -% -INC_OUTLET_TYPE= PRESSURE_OUTLET -MARKER_OUTLET= ( outlet, 0.0 ) -% -% ------------- COMMON PARAMETERS DEFINING THE NUMERICAL METHOD ---------------% -% -NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES -% -% Note that the CFL-Number was dramatically reduced compared to the primal. -% This was necessary to ensure proper convergence. It is not necessary to do -% this for a reasonably accurate gradient validation though. -CFL_NUMBER= 500 -CFL_REDUCTION_SPECIES= 1.0 -CFL_REDUCTION_TURB= 1.0 -% -% Run commented Iter for good results -ITER= 50 -% -% ------------------------ LINEAR SOLVER DEFINITION ---------------------------% -% -LINEAR_SOLVER= FGMRES -LINEAR_SOLVER_PREC= ILU -LINEAR_SOLVER_ERROR= 1E-8 -LINEAR_SOLVER_ITER= 20 - -% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% -% -CONV_NUM_METHOD_FLOW= FDS -MUSCL_FLOW= YES -SLOPE_LIMITER_FLOW = NONE -TIME_DISCRE_FLOW= EULER_IMPLICIT -% -% -------------------- SCALAR TRANSPORT ---------------------------------------% -% -KIND_SCALAR_MODEL= SPECIES_TRANSPORT -DIFFUSIVITY_MODEL= CONSTANT_DIFFUSIVITY -DIFFUSIVITY_CONSTANT= 0.001 -% -CONV_NUM_METHOD_SPECIES= SCALAR_UPWIND -MUSCL_SPECIES= NO -SLOPE_LIMITER_SPECIES = NONE -% -TIME_DISCRE_SPECIES= EULER_IMPLICIT -% -SPECIES_INIT= 1.0, 0.0 -SPECIES_CLIPPING= YES -SPECIES_CLIPPING_MIN= 0.0, 0.0 -SPECIES_CLIPPING_MAX= 1.0, 1.0 -% -% -------------------- TURBULENT TRANSPORT ---------------------------------------% -% -CONV_NUM_METHOD_TURB= SCALAR_UPWIND -MUSCL_TURB= NO -% -% --------------------------- CONVERGENCE PARAMETERS --------------------------% -% -CONV_FIELD= RMS_PRESSURE, RMS_VELOCITY-X, RMS_VELOCITY-Y, RMS_TKE, RMS_SPECIES -CONV_RESIDUAL_MINVAL= -18 -CONV_STARTITER= 10 -% -% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% -% -MESH_FILENAME= primitiveVenturi.su2 -% -SCREEN_OUTPUT= INNER_ITER WALL_TIME RMS_ADJ_PRESSURE RMS_ADJ_VELOCITY-X RMS_ADJ_VELOCITY-Y RMS_ADJ_TKE RMS_ADJ_DISSIPATION RMS_ADJ_SPECIES_0 RMS_ADJ_SPECIES_1 -SCREEN_WRT_FREQ_INNER= 10 -% -HISTORY_OUTPUT= ITER RMS_RES LINSOL -CONV_FILENAME= history -MARKER_ANALYZE= outlet -MARKER_ANALYZE_AVERAGE= MASSFLUX -% -OUTPUT_FILES= RESTART_ASCII, PARAVIEW_MULTIBLOCK -VOLUME_OUTPUT= RESIDUAL, PRIMITIVE -OUTPUT_WRT_FREQ= 1000 -% -GRAD_OBJFUNC_FILENAME= of_grad.csv -% -RESTART_SOL= NO -READ_BINARY_RESTART= NO -RESTART_FILENAME= restart -SOLUTION_FILENAME= solution -% -WRT_PERFORMANCE= YES From 46727496bfd371fb7e28b85e80fd54d0471a5424 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 30 Apr 2023 14:27:29 -0700 Subject: [PATCH 12/16] Revert "remove config since it is in the code repo" This reverts commit 2ec28805da763ca357ecfaeec0a9724431ec1544. --- .../DAspecies3_primitiveVenturi.cfg | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg diff --git a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg new file mode 100644 index 0000000..306294a --- /dev/null +++ b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg @@ -0,0 +1,142 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% SU2 configuration file % +% Case description: Discrete Adjiont Species mixing with 3 species % +% Author: T. Kattmann % +% Institution: Bosch Thermotechniek B.V. % +% Date: 2021/10/14 % +% File Version 7.2.1 "Blackbird" % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% +% +SOLVER= INC_RANS +KIND_TURB_MODEL= SST +% +OBJECTIVE_FUNCTION= SURFACE_SPECIES_VARIANCE +OBJECTIVE_WEIGHT= 1.0 +% +% ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% +% +INC_DENSITY_MODEL= CONSTANT +INC_DENSITY_INIT= 1.1766 +% +INC_VELOCITY_INIT= ( 1.00, 0.0, 0.0 ) +% +INC_ENERGY_EQUATION= YES +INC_TEMPERATURE_INIT= 300.0 +% +INC_NONDIM= INITIAL_VALUES +% +% -------------------- FLUID PROPERTIES ------------------------------------- % +% +FLUID_MODEL= CONSTANT_DENSITY +% +CONDUCTIVITY_MODEL= CONSTANT_CONDUCTIVITY +THERMAL_CONDUCTIVITY_CONSTANT= 0.0357 +% +PRANDTL_LAM= 0.72 +TURBULENT_CONDUCTIVITY_MODEL= NONE +PRANDTL_TURB= 0.90 +% +VISCOSITY_MODEL= CONSTANT_VISCOSITY +MU_CONSTANT= 1.716E-5 +% +% -------------------- BOUNDARY CONDITION DEFINITION --------------------------% +% +MARKER_HEATFLUX= ( wall, 0.0 ) +MARKER_SYM= ( axis ) +% +SPECIFIED_INLET_PROFILE= NO +INLET_FILENAME= inlet_venturi.dat +INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET +MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ + air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) +SPECIES_USE_STRONG_BC= NO +MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ + air_axial_inlet, 0.6, 0.0 ) +% +INC_OUTLET_TYPE= PRESSURE_OUTLET +MARKER_OUTLET= ( outlet, 0.0 ) +% +% ------------- COMMON PARAMETERS DEFINING THE NUMERICAL METHOD ---------------% +% +NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES +% +% Note that the CFL-Number was dramatically reduced compared to the primal. +% This was necessary to ensure proper convergence. It is not necessary to do +% this for a reasonably accurate gradient validation though. +CFL_NUMBER= 500 +CFL_REDUCTION_SPECIES= 1.0 +CFL_REDUCTION_TURB= 1.0 +% +% Run commented Iter for good results +ITER= 50 +% +% ------------------------ LINEAR SOLVER DEFINITION ---------------------------% +% +LINEAR_SOLVER= FGMRES +LINEAR_SOLVER_PREC= ILU +LINEAR_SOLVER_ERROR= 1E-8 +LINEAR_SOLVER_ITER= 20 + +% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% +% +CONV_NUM_METHOD_FLOW= FDS +MUSCL_FLOW= YES +SLOPE_LIMITER_FLOW = NONE +TIME_DISCRE_FLOW= EULER_IMPLICIT +% +% -------------------- SCALAR TRANSPORT ---------------------------------------% +% +KIND_SCALAR_MODEL= SPECIES_TRANSPORT +DIFFUSIVITY_MODEL= CONSTANT_DIFFUSIVITY +DIFFUSIVITY_CONSTANT= 0.001 +% +CONV_NUM_METHOD_SPECIES= SCALAR_UPWIND +MUSCL_SPECIES= NO +SLOPE_LIMITER_SPECIES = NONE +% +TIME_DISCRE_SPECIES= EULER_IMPLICIT +% +SPECIES_INIT= 1.0, 0.0 +SPECIES_CLIPPING= YES +SPECIES_CLIPPING_MIN= 0.0, 0.0 +SPECIES_CLIPPING_MAX= 1.0, 1.0 +% +% -------------------- TURBULENT TRANSPORT ---------------------------------------% +% +CONV_NUM_METHOD_TURB= SCALAR_UPWIND +MUSCL_TURB= NO +% +% --------------------------- CONVERGENCE PARAMETERS --------------------------% +% +CONV_FIELD= RMS_PRESSURE, RMS_VELOCITY-X, RMS_VELOCITY-Y, RMS_TKE, RMS_SPECIES +CONV_RESIDUAL_MINVAL= -18 +CONV_STARTITER= 10 +% +% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% +% +MESH_FILENAME= primitiveVenturi.su2 +% +SCREEN_OUTPUT= INNER_ITER WALL_TIME RMS_ADJ_PRESSURE RMS_ADJ_VELOCITY-X RMS_ADJ_VELOCITY-Y RMS_ADJ_TKE RMS_ADJ_DISSIPATION RMS_ADJ_SPECIES_0 RMS_ADJ_SPECIES_1 +SCREEN_WRT_FREQ_INNER= 10 +% +HISTORY_OUTPUT= ITER RMS_RES LINSOL +CONV_FILENAME= history +MARKER_ANALYZE= outlet +MARKER_ANALYZE_AVERAGE= MASSFLUX +% +OUTPUT_FILES= RESTART_ASCII, PARAVIEW_MULTIBLOCK +VOLUME_OUTPUT= RESIDUAL, PRIMITIVE +OUTPUT_WRT_FREQ= 1000 +% +GRAD_OBJFUNC_FILENAME= of_grad.csv +% +RESTART_SOL= NO +READ_BINARY_RESTART= NO +RESTART_FILENAME= restart +SOLUTION_FILENAME= solution +% +WRT_PERFORMANCE= YES From c16c67ee27aa5e3ba02a3a30b72f81c18fbd40ff Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 30 Apr 2023 14:33:52 -0700 Subject: [PATCH 13/16] use the config in tutorials instead --- .../DAspecies3_primitiveVenturi.cfg | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg index 306294a..0e1c929 100644 --- a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg @@ -5,7 +5,7 @@ % Author: T. Kattmann % % Institution: Bosch Thermotechniek B.V. % % Date: 2021/10/14 % -% File Version 7.2.1 "Blackbird" % +% File Version 7.5.1 "Blackbird" % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -14,7 +14,12 @@ SOLVER= INC_RANS KIND_TURB_MODEL= SST % -OBJECTIVE_FUNCTION= SURFACE_SPECIES_VARIANCE +CUSTOM_OUTPUTS= 'avg_species_0 : AreaAvg{SPECIES[0]}[outlet];\ + avg_species_1 : AreaAvg{SPECIES[1]}[outlet];\ + var_species : AreaAvg{pow(SPECIES[0] - avg_species_0, 2) +\ + pow(SPECIES[1] - avg_species_1, 2)}[outlet]' +CUSTOM_OBJFUNC= 'var_species' +OBJECTIVE_FUNCTION= CUSTOM_OBJFUNC OBJECTIVE_WEIGHT= 1.0 % % ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% @@ -80,7 +85,7 @@ LINEAR_SOLVER= FGMRES LINEAR_SOLVER_PREC= ILU LINEAR_SOLVER_ERROR= 1E-8 LINEAR_SOLVER_ITER= 20 - +% % -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% % CONV_NUM_METHOD_FLOW= FDS @@ -119,7 +124,6 @@ CONV_STARTITER= 10 % ------------------------- INPUT/OUTPUT INFORMATION --------------------------% % MESH_FILENAME= primitiveVenturi.su2 -% SCREEN_OUTPUT= INNER_ITER WALL_TIME RMS_ADJ_PRESSURE RMS_ADJ_VELOCITY-X RMS_ADJ_VELOCITY-Y RMS_ADJ_TKE RMS_ADJ_DISSIPATION RMS_ADJ_SPECIES_0 RMS_ADJ_SPECIES_1 SCREEN_WRT_FREQ_INNER= 10 % @@ -140,3 +144,4 @@ RESTART_FILENAME= restart SOLUTION_FILENAME= solution % WRT_PERFORMANCE= YES + From 79bffe32db405656241c20150dfc9d989b5df82d Mon Sep 17 00:00:00 2001 From: bigfooted Date: Tue, 30 May 2023 19:05:24 +0200 Subject: [PATCH 14/16] remove USE_SPECIES_STRONG_BC --- .../1__FFD-box-writing/species3_primitiveVenturi.cfg | 2 +- .../2__mesh-deform-test/species3_primitiveVenturi_deform.cfg | 2 +- .../3__gradient-validation/species3_primitiveVenturi.cfg | 2 +- .../4__optimization/species3_primitiveVenturi.cfg | 2 +- .../Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg | 2 +- .../Inc_Species_Transport/species3_primitiveVenturi.cfg | 2 +- .../kenics_mixer_tutorial.cfg | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/incompressible_flow/Inc_Species_Transport/1__FFD-box-writing/species3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/1__FFD-box-writing/species3_primitiveVenturi.cfg index 188aed9..721808d 100644 --- a/incompressible_flow/Inc_Species_Transport/1__FFD-box-writing/species3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/1__FFD-box-writing/species3_primitiveVenturi.cfg @@ -50,7 +50,7 @@ INLET_FILENAME= inlet_venturi.dat INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ air_axial_inlet, 0.6, 0.0 ) % diff --git a/incompressible_flow/Inc_Species_Transport/2__mesh-deform-test/species3_primitiveVenturi_deform.cfg b/incompressible_flow/Inc_Species_Transport/2__mesh-deform-test/species3_primitiveVenturi_deform.cfg index 97cd2fd..f90050f 100644 --- a/incompressible_flow/Inc_Species_Transport/2__mesh-deform-test/species3_primitiveVenturi_deform.cfg +++ b/incompressible_flow/Inc_Species_Transport/2__mesh-deform-test/species3_primitiveVenturi_deform.cfg @@ -51,7 +51,7 @@ INLET_FILENAME= inlet_venturi.dat INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ air_axial_inlet, 0.6, 0.0 ) % diff --git a/incompressible_flow/Inc_Species_Transport/3__gradient-validation/species3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/3__gradient-validation/species3_primitiveVenturi.cfg index 735308c..3601908 100644 --- a/incompressible_flow/Inc_Species_Transport/3__gradient-validation/species3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/3__gradient-validation/species3_primitiveVenturi.cfg @@ -54,7 +54,7 @@ INLET_FILENAME= inlet_venturi.dat INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ air_axial_inlet, 0.6, 0.0 ) % diff --git a/incompressible_flow/Inc_Species_Transport/4__optimization/species3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/4__optimization/species3_primitiveVenturi.cfg index c4e6e1d..18d9e81 100644 --- a/incompressible_flow/Inc_Species_Transport/4__optimization/species3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/4__optimization/species3_primitiveVenturi.cfg @@ -54,7 +54,7 @@ INLET_FILENAME= inlet_venturi.dat INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ air_axial_inlet, 0.6, 0.0 ) % diff --git a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg index 0e1c929..df25ad9 100644 --- a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg @@ -58,7 +58,7 @@ INLET_FILENAME= inlet_venturi.dat INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ air_axial_inlet, 0.6, 0.0 ) % diff --git a/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg index c8137a9..753bd02 100644 --- a/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg @@ -50,7 +50,7 @@ INLET_FILENAME= inlet_venturi.dat INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( gas_inlet, 300, 1.0, 1.0, 0.0, 0.0,\ air_axial_inlet, 300, 1.0, 0.0, -1.0, 0.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= (gas_inlet, 0.5, 0.5,\ air_axial_inlet, 0.6, 0.0 ) % diff --git a/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg b/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg index 06bc801..106fe08 100644 --- a/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg +++ b/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg @@ -60,7 +60,7 @@ SPECIFIED_INLET_PROFILE= NO % INC_INLET_TYPE= VELOCITY_INLET VELOCITY_INLET MARKER_INLET= ( inlet_gas, 300, 5.0, 0.0, 0.0, 1.0, inlet_air, 300, 5.0, 0.0, 0.0, 1.0 ) -SPECIES_USE_STRONG_BC= NO + MARKER_INLET_SPECIES= ( inlet_gas, 1.0, inlet_air, 0.0 ) % MARKER_INLET_TURBULENT= ( inlet_gas, 0.05, 10, inlet_air, 0.05, 10 ) From 09e5662c3f30ac430106af61a3b5d456b812d0cd Mon Sep 17 00:00:00 2001 From: Pedro Gomes <38071223+pcarruscag@users.noreply.github.com> Date: Sun, 2 Jul 2023 18:58:44 -0700 Subject: [PATCH 15/16] Sst consistency (#44) * set old SST version in configs * fix name --- compressible_flow/NICFD_nozzle/NICFD_nozzle.cfg | 3 ++- .../E387/transitional_SST_LM_model_ConfigFile.cfg | 1 + .../T3A-/transitional_LM_model_ConfigFile.cfg | 2 +- .../T3A/transitional_LM_model_ConfigFile.cfg | 2 +- .../Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg | 1 + .../Inc_Species_Transport/species3_primitiveVenturi.cfg | 3 ++- .../kenics_mixer_tutorial.cfg | 1 + .../Inc_Streamwise_Periodic/sp_pinArray_2d_dp_hf_tp.cfg | 1 + .../Inc_Streamwise_Periodic/sp_pinArray_2d_mf_hf.cfg | 1 + 9 files changed, 11 insertions(+), 4 deletions(-) diff --git a/compressible_flow/NICFD_nozzle/NICFD_nozzle.cfg b/compressible_flow/NICFD_nozzle/NICFD_nozzle.cfg index dd28e9d..23c4381 100644 --- a/compressible_flow/NICFD_nozzle/NICFD_nozzle.cfg +++ b/compressible_flow/NICFD_nozzle/NICFD_nozzle.cfg @@ -18,8 +18,9 @@ % POISSON_EQUATION) SOLVER= RANS % -% Specify turbulence model (NONE, SA, SA_NEG, SST, SA_E, SA_COMP, SA_E_COMP) +% Specify turbulence model (NONE, SA, SST) KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m % % Mathematical problem (DIRECT, CONTINUOUS_ADJOINT, DISCRETE_ADJOINT) MATH_PROBLEM= DIRECT diff --git a/compressible_flow/Transitional_Airfoil/Langtry_and_Menter/E387/transitional_SST_LM_model_ConfigFile.cfg b/compressible_flow/Transitional_Airfoil/Langtry_and_Menter/E387/transitional_SST_LM_model_ConfigFile.cfg index 06b538b..7b7357f 100644 --- a/compressible_flow/Transitional_Airfoil/Langtry_and_Menter/E387/transitional_SST_LM_model_ConfigFile.cfg +++ b/compressible_flow/Transitional_Airfoil/Langtry_and_Menter/E387/transitional_SST_LM_model_ConfigFile.cfg @@ -14,6 +14,7 @@ SOLVER= RANS % KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m KIND_TRANS_MODEL= LM FREESTREAM_TURBULENCEINTENSITY= 0.001 % diff --git a/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A-/transitional_LM_model_ConfigFile.cfg b/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A-/transitional_LM_model_ConfigFile.cfg index 1d86c2e..e1de701 100644 --- a/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A-/transitional_LM_model_ConfigFile.cfg +++ b/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A-/transitional_LM_model_ConfigFile.cfg @@ -13,7 +13,7 @@ SOLVER= RANS % KIND_TURB_MODEL= SST % -SST_OPTIONS= NONE +SST_OPTIONS= V1994m KIND_TRANS_MODEL= LM % MATH_PROBLEM= DIRECT diff --git a/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A/transitional_LM_model_ConfigFile.cfg b/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A/transitional_LM_model_ConfigFile.cfg index 8b5a848..eae87d3 100644 --- a/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A/transitional_LM_model_ConfigFile.cfg +++ b/compressible_flow/Transitional_Flat_Plate/Langtry_and_Menter/T3A/transitional_LM_model_ConfigFile.cfg @@ -13,7 +13,7 @@ SOLVER= RANS % KIND_TURB_MODEL= SST % -SST_OPTIONS= NONE +SST_OPTIONS= V1994m KIND_TRANS_MODEL= LM % MATH_PROBLEM= DIRECT diff --git a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg index df25ad9..b568b6e 100644 --- a/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/DAspecies3_primitiveVenturi.cfg @@ -13,6 +13,7 @@ % SOLVER= INC_RANS KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m % CUSTOM_OUTPUTS= 'avg_species_0 : AreaAvg{SPECIES[0]}[outlet];\ avg_species_1 : AreaAvg{SPECIES[1]}[outlet];\ diff --git a/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg b/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg index 753bd02..06a6ad3 100644 --- a/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg +++ b/incompressible_flow/Inc_Species_Transport/species3_primitiveVenturi.cfg @@ -5,7 +5,7 @@ % Author: T. Kattmann % % Institution: Bosch Thermotechniek B.V. % % Date: 2021/10/14 % -% File Version 7.2.1 "Blackbird" % +% File Version 7.5.1 "Blackbird" % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -13,6 +13,7 @@ % SOLVER= INC_RANS KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m % % ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% % diff --git a/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg b/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg index 106fe08..1a67e24 100644 --- a/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg +++ b/incompressible_flow/Inc_Species_Transport_Composition_Dependent_Model/kenics_mixer_tutorial.cfg @@ -16,6 +16,7 @@ % SOLVER= INC_RANS KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m % % ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% % diff --git a/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_dp_hf_tp.cfg b/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_dp_hf_tp.cfg index 0e94605..e63b744 100644 --- a/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_dp_hf_tp.cfg +++ b/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_dp_hf_tp.cfg @@ -12,6 +12,7 @@ % SOLVER= INC_RANS KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m % % ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% % diff --git a/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_mf_hf.cfg b/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_mf_hf.cfg index 8ebe723..c129a0e 100644 --- a/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_mf_hf.cfg +++ b/incompressible_flow/Inc_Streamwise_Periodic/sp_pinArray_2d_mf_hf.cfg @@ -12,6 +12,7 @@ % SOLVER= INC_RANS KIND_TURB_MODEL= SST +SST_OPTIONS= V1994m % % ---------------- INCOMPRESSIBLE FLOW CONDITION DEFINITION -------------------% % From 25d54dac480263eab3206f2cd631632e486cf78d Mon Sep 17 00:00:00 2001 From: Francesco Poli <126598275+frx-wintermute@users.noreply.github.com> Date: Fri, 21 Jul 2023 04:44:43 +0200 Subject: [PATCH 16/16] add files for QuickStart tutorial (#43) * add files for QuickStart tutorial Auxiliary source files were also included to automate the tutorial simulations and the visualization of results (with ParaView and LaTeX PGFPlots). * drop mesh and main config from QuickStart Those files have been moved back to the SU2 code repository. * strip out comments from QuickStart config files --- compressible_flow/QuickStart/Makefile | 73 ++++++++++ .../QuickStart/NACA0012_coef_pres.tex | 72 ++++++++++ .../QuickStart/NACA0012_surf_sens.tex | 85 +++++++++++ .../QuickStart/adj/inv_adj_NACA0012.cfg | 135 ++++++++++++++++++ .../QuickStart/dadj/inv_dadj_NACA0012.cfg | 135 ++++++++++++++++++ .../QuickStart/make_field_shots.py | 117 +++++++++++++++ 6 files changed, 617 insertions(+) create mode 100644 compressible_flow/QuickStart/Makefile create mode 100644 compressible_flow/QuickStart/NACA0012_coef_pres.tex create mode 100644 compressible_flow/QuickStart/NACA0012_surf_sens.tex create mode 100644 compressible_flow/QuickStart/adj/inv_adj_NACA0012.cfg create mode 100644 compressible_flow/QuickStart/dadj/inv_dadj_NACA0012.cfg create mode 100755 compressible_flow/QuickStart/make_field_shots.py diff --git a/compressible_flow/QuickStart/Makefile b/compressible_flow/QuickStart/Makefile new file mode 100644 index 0000000..3f3d1b5 --- /dev/null +++ b/compressible_flow/QuickStart/Makefile @@ -0,0 +1,73 @@ +## \file Makefile +# \brief Makefile for the QuickStart tutorial +# \author F. Poli +# \version 7.5.1 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2023, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + +TIME=/usr/bin/time + +all: restart_flow.dat NACA0012_coef_pres.pdf NACA0012_pressure_field.png \ + adj/restart_adj_cd.dat dadj/restart_adj_cd.dat \ + NACA0012_surf_sens.pdf \ + NACA0012_coef_pres.png NACA0012_surf_sens.png + +restart_flow.dat: inv_NACA0012.cfg mesh_NACA0012_inv.su2 + $(TIME) -o su2_cfd_time.out SU2_CFD $< | tee su2_cfd.log + +NACA0012_coef_pres.pdf: NACA0012_coef_pres.tex restart_flow.dat surface_flow.csv + texfot -q lualatex $< + +NACA0012_pressure_field.png: make_field_shots.py restart_flow.dat flow.vtu + python3 make_field_shots.py + +adj/restart_adj_cd.dat: adj/inv_adj_NACA0012.cfg mesh_NACA0012_inv.su2 \ + restart_flow.dat + cd adj \ + && ln -sf ../mesh_NACA0012_inv.su2 ./mesh_NACA0012_inv.su2 \ + && ln -sf ../restart_flow.dat ./solution_flow.dat \ + && $(TIME) -o su2_cfd_adj_time.out \ + SU2_CFD inv_adj_NACA0012.cfg | tee su2_cfd_adj.log + +dadj/restart_adj_cd.dat: dadj/inv_dadj_NACA0012.cfg mesh_NACA0012_inv.su2 \ + restart_flow.dat + cd dadj \ + && ln -sf ../mesh_NACA0012_inv.su2 ./mesh_NACA0012_inv.su2 \ + && ln -sf ../restart_flow.dat ./solution_flow.dat \ + && $(TIME) -o su2_cfd_ad_dadj_time.out \ + SU2_CFD_AD inv_dadj_NACA0012.cfg | tee su2_cfd_ad_dadj.log + +NACA0012_surf_sens.pdf: NACA0012_surf_sens.tex \ + adj/restart_adj_cd.dat dadj/restart_adj_cd.dat \ + adj/surface_adjoint.csv dadj/surface_adjoint.csv + texfot -q lualatex $< + +%.png: %.pdf + convert -density 154x154 $< $@ + +.PHONY: clean +clean: + -rm -f *.log *.aux *.out *adj/*.log *adj/*.out + -rm -f *adj/solution_flow.dat *adj/mesh_NACA0012_inv.su2 + +.PHONY: distclean +distclean: clean + -rm -f *.vtu *.csv *.dat *adj/*.csv *adj/*.dat *.png *.pdf diff --git a/compressible_flow/QuickStart/NACA0012_coef_pres.tex b/compressible_flow/QuickStart/NACA0012_coef_pres.tex new file mode 100644 index 0000000..c0695a4 --- /dev/null +++ b/compressible_flow/QuickStart/NACA0012_coef_pres.tex @@ -0,0 +1,72 @@ +\documentclass[tikz,margin=1pt]{standalone} + +%% \file NACA0012_coef_pres.tex +% \brief LaTeX code for the C_p plot in the QuickStart tutorial +% \author F. Poli +% \version 7.5.1 "Blackbird" +% +% SU2 Project Website: https://su2code.github.io +% +% The SU2 Project is maintained by the SU2 Foundation +% (http://su2foundation.org) +% +% Copyright 2023, SU2 Contributors (cf. AUTHORS.md) +% +% SU2 is free software; you can redistribute it and/or +% modify it under the terms of the GNU Lesser General Public +% License as published by the Free Software Foundation; either +% version 2.1 of the License, or (at your option) any later version. +% +% SU2 is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% Lesser General Public License for more details. +% +% You should have received a copy of the GNU Lesser General Public +% License along with SU2. If not, see . + +\usepackage{pgfplots} +\pgfplotsset{compat=1.17,trig format plots=rad,tick scale binop=\times, + /pgf/number format/sci generic={mantissa sep=\times,exponent={10^{#1}}}, + /pgf/number format/1000 sep={\,}} +%\usepgfplotslibrary{groupplots} +%\usepgfplotslibrary{patchplots} +\usepackage{pgfplotstable} +\begin{document} + \begin{tikzpicture} + \pagecolor{white} + \begin{axis} + [ + title={Coefficient of pressure for the NACA 0012 airfoil}, + width=108mm, + height=88mm, + xlabel={$x/c$}, + ylabel={$C_p$}, + enlarge x limits=false, + %enlarge y limits=true, + ymin=-1.5,ymax=1.5, + y dir=reverse, + %ymajorgrids=true, + legend cell align=left, + legend pos=south east, + table/col sep=comma, + ] + \addplot%+ + [ + blue!50!black, + thick, + mark=*, + mark size=0.7, + ] + table + [ + x="x", + y="Pressure_Coefficient", + ] + {surface_flow.csv}; + \addlegendentry{SU2} + \end{axis} + \end{tikzpicture} +\end{document} + + diff --git a/compressible_flow/QuickStart/NACA0012_surf_sens.tex b/compressible_flow/QuickStart/NACA0012_surf_sens.tex new file mode 100644 index 0000000..425e3fd --- /dev/null +++ b/compressible_flow/QuickStart/NACA0012_surf_sens.tex @@ -0,0 +1,85 @@ +\documentclass[tikz,margin=1pt]{standalone} + +%% \file NACA0012_surf_sens.tex +% \brief LaTeX code for the sensitivity plot in the QuickStart tutorial +% \author F. Poli +% \version 7.5.1 "Blackbird" +% +% SU2 Project Website: https://su2code.github.io +% +% The SU2 Project is maintained by the SU2 Foundation +% (http://su2foundation.org) +% +% Copyright 2023, SU2 Contributors (cf. AUTHORS.md) +% +% SU2 is free software; you can redistribute it and/or +% modify it under the terms of the GNU Lesser General Public +% License as published by the Free Software Foundation; either +% version 2.1 of the License, or (at your option) any later version. +% +% SU2 is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% Lesser General Public License for more details. +% +% You should have received a copy of the GNU Lesser General Public +% License along with SU2. If not, see . + +\usepackage{pgfplots} +\pgfplotsset{compat=1.17,trig format plots=rad,tick scale binop=\times, + /pgf/number format/sci generic={mantissa sep=\times,exponent={10^{#1}}}, + /pgf/number format/1000 sep={\,}} +%\usepgfplotslibrary{groupplots} +%\usepgfplotslibrary{patchplots} +\usepackage{pgfplotstable} +\begin{document} + \begin{tikzpicture} + \pagecolor{white} + \begin{axis} + [ + title={Surface sensitivities for the NACA 0012 airfoil}, + width=108mm, + height=88mm, + xlabel={$x/c$}, + ylabel={surface sensitivity}, + enlarge x limits=false, + %enlarge y limits=true, + ymin=-2,ymax=2, + %ymajorgrids=true, + legend cell align=left, + legend pos=south west, + table/col sep=comma, + ] + \addplot%+ + [ + blue!50!black, + thick, + mark=*, + mark size=0.7, + ] + table + [ + x="x", + y="Surface_Sensitivity", + ] + {adj/surface_adjoint.csv}; + \addlegendentry{SU2 continuous adjoint} + \addplot%+ + [ + blue!40!white, + thick, + mark=*, + mark size=0.7, + ] + table + [ + x="x", + y="Surface_Sensitivity", + ] + {dadj/surface_adjoint.csv}; + \addlegendentry{SU2 discrete adjoint} + \end{axis} + \end{tikzpicture} +\end{document} + + diff --git a/compressible_flow/QuickStart/adj/inv_adj_NACA0012.cfg b/compressible_flow/QuickStart/adj/inv_adj_NACA0012.cfg new file mode 100644 index 0000000..575236a --- /dev/null +++ b/compressible_flow/QuickStart/adj/inv_adj_NACA0012.cfg @@ -0,0 +1,135 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% SU2 configuration file % +% Case description: Transonic inviscid flow around a NACA0012 airfoil % +% Author: Thomas D. Economon % +% Institution: Stanford University % +% Date: 2014.06.11 % +% File Version 7.5.1 "Blackbird" % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% + +SOLVER= EULER +MATH_PROBLEM= CONTINUOUS_ADJOINT +RESTART_SOL= NO + +% ----------- COMPRESSIBLE AND INCOMPRESSIBLE FREE-STREAM DEFINITION ----------% + +MACH_NUMBER= 0.8 +AOA= 1.25 +FREESTREAM_PRESSURE= 101325.0 +FREESTREAM_TEMPERATURE= 273.15 + +% -------------- COMPRESSIBLE AND INCOMPRESSIBLE FLUID CONSTANTS --------------% + +GAMMA_VALUE= 1.4 +GAS_CONSTANT= 287.87 + +% ---------------------- REFERENCE VALUE DEFINITION ---------------------------% + +REF_ORIGIN_MOMENT_X = 0.25 +REF_ORIGIN_MOMENT_Y = 0.00 +REF_ORIGIN_MOMENT_Z = 0.00 +REF_LENGTH= 1.0 +REF_AREA= 1.0 +REF_DIMENSIONALIZATION= DIMENSIONAL + +% ----------------------- BOUNDARY CONDITION DEFINITION -----------------------% + +MARKER_EULER= ( airfoil ) +MARKER_FAR= ( farfield ) + +% ------------------------ SURFACES IDENTIFICATION ----------------------------% + +MARKER_PLOTTING = ( airfoil ) +MARKER_MONITORING = ( airfoil ) +MARKER_DESIGNING = ( airfoil ) + +% ------------- COMMON PARAMETERS TO DEFINE THE NUMERICAL METHOD --------------% + +NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES +OBJECTIVE_FUNCTION= DRAG +CFL_NUMBER= 1e3 +CFL_ADAPT= NO +CFL_ADAPT_PARAM= ( 0.1, 2.0, 10.0, 1e10 ) +ITER= 250 + +% ------------------------ LINEAR SOLVER DEFINITION ---------------------------% + +LINEAR_SOLVER= FGMRES +LINEAR_SOLVER_PREC= ILU +LINEAR_SOLVER_ERROR= 1E-10 +LINEAR_SOLVER_ITER= 10 + +% -------------------------- MULTIGRID PARAMETERS -----------------------------% + +MGLEVEL= 3 +MGCYCLE= W_CYCLE +MG_PRE_SMOOTH= ( 1, 2, 3, 3 ) +MG_POST_SMOOTH= ( 0, 0, 0, 0 ) +MG_CORRECTION_SMOOTH= ( 0, 0, 0, 0 ) +MG_DAMP_RESTRICTION= 1.0 +MG_DAMP_PROLONGATION= 1.0 + +% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% + +CONV_NUM_METHOD_FLOW= JST +JST_SENSOR_COEFF= ( 0.5, 0.02 ) +TIME_DISCRE_FLOW= EULER_IMPLICIT + +% ---------------- ADJOINT-FLOW NUMERICAL METHOD DEFINITION -------------------% + +CONV_NUM_METHOD_ADJFLOW= JST +CFL_REDUCTION_ADJFLOW= 0.01 +TIME_DISCRE_ADJFLOW= EULER_IMPLICIT + +% ----------------------- DESIGN VARIABLE PARAMETERS --------------------------% + +DV_KIND= HICKS_HENNE +DV_MARKER= ( airfoil ) +DV_PARAM= ( 1, 0.5 ) +DV_VALUE= 0.01 + +% ------------------------ GRID DEFORMATION PARAMETERS ------------------------% + +DEFORM_LINEAR_SOLVER_ITER= 500 +DEFORM_NONLINEAR_ITER= 1 +DEFORM_LINEAR_SOLVER_ERROR= 1E-14 +DEFORM_CONSOLE_OUTPUT= YES +DEFORM_STIFFNESS_TYPE= INVERSE_VOLUME + +% --------------------------- CONVERGENCE PARAMETERS --------------------------% + +CONV_FIELD= RMS_DENSITY +CONV_RESIDUAL_MINVAL= -8 +CONV_STARTITER= 10 +CONV_CAUCHY_ELEMS= 100 +CONV_CAUCHY_EPS= 1E-6 +SCREEN_OUTPUT=(INNER_ITER, WALL_TIME, RMS_RES, LIFT, DRAG, CAUCHY_SENS_PRESS, CAUCHY_DRAG RMS_ADJ_DENSITY RMS_ADJ_ENERGY) + +% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% + +MESH_FILENAME= mesh_NACA0012_inv.su2 +MESH_FORMAT= SU2 +MESH_OUT_FILENAME= mesh_out.su2 +SOLUTION_FILENAME= solution_flow.dat +SOLUTION_ADJ_FILENAME= solution_adj.dat +TABULAR_FORMAT= CSV +CONV_FILENAME= history +RESTART_FILENAME= restart_flow.dat +RESTART_ADJ_FILENAME= restart_adj.dat +VOLUME_FILENAME= flow +VOLUME_ADJ_FILENAME= adjoint +GRAD_OBJFUNC_FILENAME= of_grad.dat +SURFACE_FILENAME= surface_flow +SURFACE_ADJ_FILENAME= surface_adjoint +OUTPUT_WRT_FREQ= 250 +OUTPUT_FILES= (RESTART, SURFACE_CSV) + +% --------------------- OPTIMAL SHAPE DESIGN DEFINITION -----------------------% + +OPT_OBJECTIVE= DRAG * 0.001 +OPT_CONSTRAINT= ( LIFT > 0.328188 ) * 0.001; ( MOMENT_Z > 0.034068 ) * 0.001; ( AIRFOIL_THICKNESS > 0.11 ) * 0.001 +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 ) diff --git a/compressible_flow/QuickStart/dadj/inv_dadj_NACA0012.cfg b/compressible_flow/QuickStart/dadj/inv_dadj_NACA0012.cfg new file mode 100644 index 0000000..f0f3db2 --- /dev/null +++ b/compressible_flow/QuickStart/dadj/inv_dadj_NACA0012.cfg @@ -0,0 +1,135 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% SU2 configuration file % +% Case description: Transonic inviscid flow around a NACA0012 airfoil % +% Author: Thomas D. Economon % +% Institution: Stanford University % +% Date: 2014.06.11 % +% File Version 7.5.1 "Blackbird" % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% ------------- DIRECT, ADJOINT, AND LINEARIZED PROBLEM DEFINITION ------------% + +SOLVER= EULER +MATH_PROBLEM= DISCRETE_ADJOINT +RESTART_SOL= NO + +% ----------- COMPRESSIBLE AND INCOMPRESSIBLE FREE-STREAM DEFINITION ----------% + +MACH_NUMBER= 0.8 +AOA= 1.25 +FREESTREAM_PRESSURE= 101325.0 +FREESTREAM_TEMPERATURE= 273.15 + +% -------------- COMPRESSIBLE AND INCOMPRESSIBLE FLUID CONSTANTS --------------% + +GAMMA_VALUE= 1.4 +GAS_CONSTANT= 287.87 + +% ---------------------- REFERENCE VALUE DEFINITION ---------------------------% + +REF_ORIGIN_MOMENT_X = 0.25 +REF_ORIGIN_MOMENT_Y = 0.00 +REF_ORIGIN_MOMENT_Z = 0.00 +REF_LENGTH= 1.0 +REF_AREA= 1.0 +REF_DIMENSIONALIZATION= DIMENSIONAL + +% ----------------------- BOUNDARY CONDITION DEFINITION -----------------------% + +MARKER_EULER= ( airfoil ) +MARKER_FAR= ( farfield ) + +% ------------------------ SURFACES IDENTIFICATION ----------------------------% + +MARKER_PLOTTING = ( airfoil ) +MARKER_MONITORING = ( airfoil ) +MARKER_DESIGNING = ( airfoil ) + +% ------------- COMMON PARAMETERS TO DEFINE THE NUMERICAL METHOD --------------% + +NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES +OBJECTIVE_FUNCTION= DRAG +CFL_NUMBER= 1e3 +CFL_ADAPT= NO +CFL_ADAPT_PARAM= ( 0.1, 2.0, 10.0, 1e10 ) +ITER= 250 + +% ------------------------ LINEAR SOLVER DEFINITION ---------------------------% + +LINEAR_SOLVER= FGMRES +LINEAR_SOLVER_PREC= ILU +LINEAR_SOLVER_ERROR= 1E-10 +LINEAR_SOLVER_ITER= 10 + +% -------------------------- MULTIGRID PARAMETERS -----------------------------% + +MGLEVEL= 3 +MGCYCLE= W_CYCLE +MG_PRE_SMOOTH= ( 1, 2, 3, 3 ) +MG_POST_SMOOTH= ( 0, 0, 0, 0 ) +MG_CORRECTION_SMOOTH= ( 0, 0, 0, 0 ) +MG_DAMP_RESTRICTION= 1.0 +MG_DAMP_PROLONGATION= 1.0 + +% -------------------- FLOW NUMERICAL METHOD DEFINITION -----------------------% + +CONV_NUM_METHOD_FLOW= JST +JST_SENSOR_COEFF= ( 0.5, 0.02 ) +TIME_DISCRE_FLOW= EULER_IMPLICIT + +% ---------------- ADJOINT-FLOW NUMERICAL METHOD DEFINITION -------------------% + +CONV_NUM_METHOD_ADJFLOW= JST +CFL_REDUCTION_ADJFLOW= 0.01 +TIME_DISCRE_ADJFLOW= EULER_IMPLICIT + +% ----------------------- DESIGN VARIABLE PARAMETERS --------------------------% + +DV_KIND= HICKS_HENNE +DV_MARKER= ( airfoil ) +DV_PARAM= ( 1, 0.5 ) +DV_VALUE= 0.01 + +% ------------------------ GRID DEFORMATION PARAMETERS ------------------------% + +DEFORM_LINEAR_SOLVER_ITER= 500 +DEFORM_NONLINEAR_ITER= 1 +DEFORM_LINEAR_SOLVER_ERROR= 1E-14 +DEFORM_CONSOLE_OUTPUT= YES +DEFORM_STIFFNESS_TYPE= INVERSE_VOLUME + +% --------------------------- CONVERGENCE PARAMETERS --------------------------% + +CONV_FIELD= RMS_DENSITY +CONV_RESIDUAL_MINVAL= -8 +CONV_STARTITER= 10 +CONV_CAUCHY_ELEMS= 100 +CONV_CAUCHY_EPS= 1E-6 +SCREEN_OUTPUT=(INNER_ITER, WALL_TIME, RMS_RES, LIFT, DRAG, CAUCHY_SENS_PRESS, CAUCHY_DRAG RMS_ADJ_DENSITY RMS_ADJ_ENERGY) + +% ------------------------- INPUT/OUTPUT INFORMATION --------------------------% + +MESH_FILENAME= mesh_NACA0012_inv.su2 +MESH_FORMAT= SU2 +MESH_OUT_FILENAME= mesh_out.su2 +SOLUTION_FILENAME= solution_flow.dat +SOLUTION_ADJ_FILENAME= solution_adj.dat +TABULAR_FORMAT= CSV +CONV_FILENAME= history +RESTART_FILENAME= restart_flow.dat +RESTART_ADJ_FILENAME= restart_adj.dat +VOLUME_FILENAME= flow +VOLUME_ADJ_FILENAME= adjoint +GRAD_OBJFUNC_FILENAME= of_grad.dat +SURFACE_FILENAME= surface_flow +SURFACE_ADJ_FILENAME= surface_adjoint +OUTPUT_WRT_FREQ= 250 +OUTPUT_FILES= (RESTART, SURFACE_CSV) + +% --------------------- OPTIMAL SHAPE DESIGN DEFINITION -----------------------% + +OPT_OBJECTIVE= DRAG * 0.001 +OPT_CONSTRAINT= ( LIFT > 0.328188 ) * 0.001; ( MOMENT_Z > 0.034068 ) * 0.001; ( AIRFOIL_THICKNESS > 0.11 ) * 0.001 +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 ) diff --git a/compressible_flow/QuickStart/make_field_shots.py b/compressible_flow/QuickStart/make_field_shots.py new file mode 100755 index 0000000..52c02dd --- /dev/null +++ b/compressible_flow/QuickStart/make_field_shots.py @@ -0,0 +1,117 @@ +#!/usr/bin/python3 + +## \file make_field_shots.py +# \brief Paraview script for the visualizations in the QuickStart tutorial +# \author F. Poli +# \version 7.5.1 "Blackbird" +# +# SU2 Project Website: https://su2code.github.io +# +# The SU2 Project is maintained by the SU2 Foundation +# (http://su2foundation.org) +# +# Copyright 2023, SU2 Contributors (cf. AUTHORS.md) +# +# SU2 is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# SU2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with SU2. If not, see . + +import paraview.simple as pvs + +# load data file +flowdata = pvs.OpenDataFile('flow.vtu') + +# create rendering view +renderview = pvs.GetActiveViewOrCreate('RenderView') +renderview.SetPropertyWithName('UseFXAA', 0) +pvs.SetActiveView(renderview) + +# set 2D mode and camera +renderview.InteractionMode = '2D' +renderview.CameraFocalPoint = [0.4, 0.16, 0.0] +renderview.CameraParallelScale = 1.0 + +# set layout +layout = pvs.GetLayout() +layout.SetSize(820, 620) + +# set quantity to be shown +flowdisplay = pvs.Show() +pvs.ColorBy(flowdisplay, ('POINTS', 'Pressure')) + +# set range and color preset for quantity +pressurelut = pvs.GetColorTransferFunction('Pressure') +pressurelut.RescaleTransferFunction(50000.0, 155000.0) +pressurelut.NumberOfTableValues = 21 +pressurelut.ApplyPreset('Jet', True) + +# enable colorbar legend +flowdisplay.SetScalarBarVisibility(renderview, True) + +# customize colorbar legend +pressurelutbar = pvs.GetScalarBar(pressurelut, renderview) +pressurelutbar.WindowLocation = 'Upper Right Corner' +pressurelutbar.Title = 'Pressure [Pa]' +pressurelutbar.AutomaticLabelFormat = 0 +pressurelutbar.LabelFormat = '%-#.1f' +pressurelutbar.RangeLabelFormat = '%-#.1f' + +# create contours +pressurecontour = pvs.Contour(registrationName='pContour', Input=flowdata) +pressurecontour.ContourBy = ['POINTS', 'Pressure'] +pressurecontour.Isosurfaces = \ + [ 50e3, 55e3, 60e3, 65e3, 70e3, 75e3, 80e3, 85e3, 90e3, 95e3, 100e3, + 105e3, 110e3, 115e3, 120e3, 125e3, 130e3, 135e3, 140e3, 145e3, 150e3, 155e3] +pcontourdisplay = pvs.Show(pressurecontour, renderview, + 'GeometryRepresentation') + +# save screenshot +pvs.SaveScreenshot('NACA0012_pressure_field.png', renderview, + ImageResolution=[665, 500]) + +# hide what we no longer need +pvs.Hide(pressurecontour) +flowdisplay.SetScalarBarVisibility(renderview, False) + +# set quantity to be shown +pvs.ColorBy(flowdisplay, ('POINTS', 'Mach')) + +# set range and color preset for quantity +machlut = pvs.GetColorTransferFunction('Mach') +machlut.RescaleTransferFunction(0.0, 2.0) +machlut.NumberOfTableValues = 20 +machlut.ApplyPreset('Blue Orange (divergent)', True) + +# enable colorbar legend +flowdisplay.SetScalarBarVisibility(renderview, True) + +# customize colorbar legend +machlutbar = pvs.GetScalarBar(machlut, renderview) +machlutbar.WindowLocation = 'Upper Right Corner' +machlutbar.Title = 'Mach number' +machlutbar.AutomaticLabelFormat = 0 +machlutbar.LabelFormat = '%-#.1f' +machlutbar.RangeLabelFormat = '%-#.1f' + +# create contours +machcontour = pvs.Contour(registrationName='mContour', Input=flowdata) +machcontour.ContourBy = ['POINTS', 'Mach'] +machcontour.Isosurfaces = \ + [ 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, + 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0 ] +mcontourdisplay = pvs.Show(machcontour, renderview, + 'GeometryRepresentation') + +# save screenshot +pvs.SaveScreenshot('NACA0012_mach_field.png', renderview, + ImageResolution=[665, 500]) +