1
+ #!/usr/bin/env python
2
+
3
+ ## \file Generate_Dataset.py
4
+ # \brief Example python script for generating training data for
5
+ # data-driven fluid model in SU2
6
+ # \author E.C.Bunschoten
7
+ # \version 7.5.1 "Blackbird"
8
+ #
9
+ # SU2 Project Website: https://su2code.github.io
10
+ #
11
+ # The SU2 Project is maintained by the SU2 Foundation
12
+ # (http://su2foundation.org)
13
+ #
14
+ # Copyright 2012-2023, SU2 Contributors (cf. AUTHORS.md)
15
+ #
16
+ # SU2 is free software; you can redistribute it and/or
17
+ # modify it under the terms of the GNU Lesser General Public
18
+ # License as published by the Free Software Foundation; either
19
+ # version 2.1 of the License, or (at your option) any later version.
20
+ #
21
+ # SU2 is distributed in the hope that it will be useful,
22
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
23
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24
+ # Lesser General Public License for more details.
25
+ #
26
+ # You should have received a copy of the GNU Lesser General Public
27
+ # License along with SU2. If not, see <http://www.gnu.org/licenses/>.
28
+
29
+ # make print(*args) function available in PY2.6+, does'nt work on PY < 2.6
30
+
31
+ import CoolProp
32
+ import numpy as np
33
+ from tqdm import tqdm
34
+ import csv
35
+
36
+ # Name of the fluid in the CoolProp library.
37
+ fluidName = 'Air'
38
+
39
+ # Type of equation of state to be used by CoolProp.
40
+ CP_eos = "HEOS"
41
+
42
+ # Minimum and maximum dataset temperatures [K].
43
+ T_min = 280
44
+ T_max = 1000
45
+
46
+ # Minimum and maximum dataset pressures [Pa].
47
+ P_min = 5e4
48
+ P_max = 2e6
49
+
50
+ # Number of data points along each axis.
51
+ Np_grid = 500
52
+
53
+ # Fraction of data points to be used as training data for MLP training (0-1).
54
+ f_train = 0.8
55
+
56
+ # Fraction of data poins to be used as test data for MLP validation (0-1).
57
+ f_test = 0.1
58
+
59
+
60
+ # Prepare data grid
61
+ T_range = np .linspace (T_min , T_max , Np_grid )
62
+ P_range = np .linspace (P_min , P_max , Np_grid )
63
+
64
+ T_grid , P_grid = np .meshgrid (T_range , P_range )
65
+
66
+ T_dataset = T_grid .flatten ()
67
+ P_dataset = P_grid .flatten ()
68
+
69
+ density_dataset = np .zeros (np .shape (T_dataset ))
70
+ energy_dataset = np .zeros (np .shape (T_dataset ))
71
+ s_dataset = np .zeros (np .shape (T_dataset ))
72
+ dsde_dataset = np .zeros (np .shape (T_dataset ))
73
+ dsdrho_dataset = np .zeros (np .shape (T_dataset ))
74
+ d2sde2_dataset = np .zeros (np .shape (T_dataset ))
75
+ d2sdedrho_dataset = np .zeros (np .shape (T_dataset ))
76
+ d2sdrho2_dataset = np .zeros (np .shape (T_dataset ))
77
+
78
+ # Evaluate CoolProp on data grid.
79
+ fluid = CoolProp .AbstractState (CP_eos , fluidName )
80
+ idx_failed_below = []
81
+ idx_failed_above = []
82
+ print ("Generating CoolProp data set..." )
83
+ for i in tqdm (range (len (T_dataset ))):
84
+ try :
85
+ fluid .update (CoolProp .PT_INPUTS , P_dataset [i ], T_dataset [i ])
86
+
87
+ density_dataset [i ] = fluid .rhomass ()
88
+ energy_dataset [i ] = fluid .umass ()
89
+ s_dataset [i ] = fluid .smass ()
90
+ dsde_dataset [i ] = fluid .first_partial_deriv (CoolProp .iSmass , CoolProp .iUmass , CoolProp .iDmass )
91
+ dsdrho_dataset [i ] = fluid .first_partial_deriv (CoolProp .iSmass , CoolProp .iDmass , CoolProp .iUmass )
92
+ d2sde2_dataset [i ] = fluid .second_partial_deriv (CoolProp .iSmass , CoolProp .iUmass , CoolProp .iDmass , CoolProp .iUmass , CoolProp .iDmass )
93
+ d2sdedrho_dataset [i ] = fluid .second_partial_deriv (CoolProp .iSmass , CoolProp .iUmass , CoolProp .iDmass , CoolProp .iDmass , CoolProp .iUmass )
94
+ d2sdrho2_dataset [i ] = fluid .second_partial_deriv (CoolProp .iSmass , CoolProp .iDmass , CoolProp .iUmass , CoolProp .iDmass , CoolProp .iUmass )
95
+ except :
96
+ idx_failed_below .append (i )
97
+ print ("CoolProp failed at temperature " + str (T_dataset [i ]) + ", pressure " + str (P_dataset [i ]))
98
+ print ("Done!" )
99
+
100
+ # Collect all data arrays and fill in failed data points.
101
+ collected_data = np .vstack ([density_dataset ,
102
+ energy_dataset ,
103
+ s_dataset ,
104
+ dsde_dataset ,
105
+ dsdrho_dataset ,
106
+ d2sde2_dataset ,
107
+ d2sdedrho_dataset ,
108
+ d2sdrho2_dataset ]).T
109
+ for i_failed in idx_failed_below :
110
+ collected_data [i_failed , :] = 0.5 * (collected_data [i_failed + 1 , :] + collected_data [i_failed - 1 , :])
111
+
112
+ # Shuffle data set and extract training, validation, and test data.
113
+ np .random .shuffle (collected_data )
114
+ np_train = int (f_train * len (density_dataset ))
115
+ np_val = int (f_test * len (density_dataset ))
116
+ np_test = len (density_dataset ) - np_train - np_val
117
+
118
+ train_data = collected_data [:np_train , :]
119
+ dev_data = collected_data [np_train :(np_train + np_val ), :]
120
+ test_data = collected_data [(np_train + np_val ):, :]
121
+
122
+ # Write output files.
123
+ with open (fluidName + "_dataset_full.csv" , "w+" ) as fid :
124
+ fid .write ("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n " )
125
+ csvWriter = csv .writer (fid ,delimiter = ',' )
126
+ csvWriter .writerows (collected_data )
127
+
128
+ with open (fluidName + "_dataset_train.csv" , "w+" ) as fid :
129
+ fid .write ("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n " )
130
+ csvWriter = csv .writer (fid ,delimiter = ',' )
131
+ csvWriter .writerows (train_data )
132
+
133
+ with open (fluidName + "_dataset_dev.csv" , "w+" ) as fid :
134
+ fid .write ("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n " )
135
+ csvWriter = csv .writer (fid ,delimiter = ',' )
136
+ csvWriter .writerows (dev_data )
137
+
138
+ with open (fluidName + "_dataset_test.csv" , "w+" ) as fid :
139
+ fid .write ("Density,Energy,s,dsde_rho,dsdrho_e,d2sde2,d2sdedrho,d2sdrho2\n " )
140
+ csvWriter = csv .writer (fid ,delimiter = ',' )
141
+ csvWriter .writerows (test_data )
0 commit comments