@@ -182,8 +182,7 @@ def __init__(self):
182
182
self .fst_vt ['InflowWind' ] = {}
183
183
self .fst_vt ['AeroDyn' ] = {}
184
184
self .fst_vt ['AeroDisk' ] = {}
185
- self .fst_vt ['AeroDynBlade' ] = {}
186
- self .fst_vt ['AeroDynPolar' ] = {}
185
+ self .fst_vt ['AeroDynBlade' ] = [{}, {}, {}] # One dict per blade, We will reduce this down to one, if all the files are the same
187
186
self .fst_vt ['ServoDyn' ] = {}
188
187
self .fst_vt ['DISCON_in' ] = {}
189
188
self .fst_vt ['HydroDyn' ] = {}
@@ -1225,54 +1224,77 @@ def read_AeroDyn(self):
1225
1224
1226
1225
f .close ()
1227
1226
1228
- self .read_AeroDynBlade ()
1227
+ # Improved handling for multiple AeroDyn blade files
1228
+ ad_bld_file1 = os .path .join (self .FAST_directory , self .fst_vt ['Fst' ]['AeroFile_path' ], self .fst_vt ['AeroDyn' ]['ADBlFile1' ])
1229
+ ad_bld_file2 = os .path .join (self .FAST_directory , self .fst_vt ['Fst' ]['AeroFile_path' ], self .fst_vt ['AeroDyn' ]['ADBlFile2' ])
1230
+ ad_bld_file3 = os .path .join (self .FAST_directory , self .fst_vt ['Fst' ]['AeroFile_path' ], self .fst_vt ['AeroDyn' ]['ADBlFile3' ])
1231
+
1232
+ if ad_bld_file1 == ad_bld_file2 and ad_bld_file1 == ad_bld_file3 :
1233
+ # all blades are identical
1234
+ self .read_AeroDynBlade (ad_bld_file1 , BladeNumber = 0 )
1235
+ # Copy data into the generic AeroDynBlade
1236
+ self .fst_vt ['AeroDynBlade' ] = self .fst_vt ['AeroDynBlade' ][0 ]
1237
+ elif self .fst_vt ['ElastoDyn' ]['NumBl' ] == 2 and ad_bld_file1 == ad_bld_file2 :
1238
+ # 2 blades are identical
1239
+ self .read_AeroDynBlade (ad_bld_file1 , BladeNumber = 0 )
1240
+ self .fst_vt ['AeroDynBlade' ] = self .fst_vt ['AeroDynBlade' ][0 ]
1241
+ else :
1242
+ # all blades are different
1243
+ self .read_AeroDynBlade (ad_bld_file1 , BladeNumber = 0 )
1244
+ if self .fst_vt ['ElastoDyn' ]['NumBl' ] > 1 :
1245
+ self .read_AeroDynBlade (ad_bld_file2 , BladeNumber = 1 )
1246
+ if self .fst_vt ['ElastoDyn' ]['NumBl' ] > 2 :
1247
+ self .read_AeroDynBlade (ad_bld_file3 , BladeNumber = 2 )
1248
+ else :
1249
+ # we have a single blade
1250
+ self .fst_vt ['AeroDynBlade' ] = self .fst_vt ['AeroDynBlade' ][0 ]
1251
+
1229
1252
self .read_AeroDynPolar ()
1230
1253
self .read_AeroDynCoord ()
1231
1254
olaf_filename = os .path .join (self .FAST_directory , self .fst_vt ['AeroDyn' ]['OLAFInputFileName' ])
1232
1255
if os .path .isfile (olaf_filename ):
1233
1256
self .read_AeroDynOLAF (olaf_filename )
1234
1257
1235
- def read_AeroDynBlade (self ):
1258
+ def read_AeroDynBlade (self , ad_blade_file , BladeNumber = 0 ):
1236
1259
# AeroDyn v5.00 Blade Definition File
1237
1260
1238
- ad_blade_file = os .path .join (self .FAST_directory , self .fst_vt ['Fst' ]['AeroFile_path' ], self .fst_vt ['AeroDyn' ]['ADBlFile1' ])
1261
+ # ad_blade_file = os.path.join(self.FAST_directory, self.fst_vt['Fst']['AeroFile_path'], self.fst_vt['AeroDyn']['ADBlFile1'])
1239
1262
f = open (ad_blade_file )
1240
1263
1241
1264
f .readline ()
1242
1265
f .readline ()
1243
1266
f .readline ()
1244
1267
# Blade Properties
1245
- self .fst_vt ['AeroDynBlade' ]['NumBlNds' ] = int (f .readline ().split ()[0 ])
1246
- f .readline ()
1247
- f .readline ()
1248
- self .fst_vt ['AeroDynBlade' ]['BlSpn' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1249
- self .fst_vt ['AeroDynBlade' ]['BlCrvAC' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1250
- self .fst_vt ['AeroDynBlade' ]['BlSwpAC' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1251
- self .fst_vt ['AeroDynBlade' ]['BlCrvAng' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1252
- self .fst_vt ['AeroDynBlade' ]['BlTwist' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1253
- self .fst_vt ['AeroDynBlade' ]['BlChord' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1254
- self .fst_vt ['AeroDynBlade' ]['BlAFID' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1255
- self .fst_vt ['AeroDynBlade' ]['BlCb' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1256
- self .fst_vt ['AeroDynBlade' ]['BlCenBn' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1257
- self .fst_vt ['AeroDynBlade' ]['BlCenBt' ] = [None ]* self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]
1258
- for i in range (self .fst_vt ['AeroDynBlade' ]['NumBlNds' ]):
1268
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'NumBlNds' ] = int (f .readline ().split ()[0 ])
1269
+ f .readline ()
1270
+ f .readline ()
1271
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlSpn' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1272
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCrvAC' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1273
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlSwpAC' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1274
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCrvAng' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1275
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlTwist' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1276
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlChord' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1277
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlAFID' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1278
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCb' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1279
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCenBn' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1280
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCenBt' ] = [None ]* self .fst_vt ['AeroDynBlade' ][ BladeNumber ]['NumBlNds' ]
1281
+ for i in range (self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'NumBlNds' ]):
1259
1282
data = [float (val ) for val in f .readline ().split ()]
1260
- self .fst_vt ['AeroDynBlade' ]['BlSpn' ][i ] = data [0 ]
1261
- self .fst_vt ['AeroDynBlade' ]['BlCrvAC' ][i ] = data [1 ]
1262
- self .fst_vt ['AeroDynBlade' ]['BlSwpAC' ][i ] = data [2 ]
1263
- self .fst_vt ['AeroDynBlade' ]['BlCrvAng' ][i ]= data [3 ]
1264
- self .fst_vt ['AeroDynBlade' ]['BlTwist' ][i ] = data [4 ]
1265
- self .fst_vt ['AeroDynBlade' ]['BlChord' ][i ] = data [5 ]
1266
- self .fst_vt ['AeroDynBlade' ]['BlAFID' ][i ] = data [6 ]
1283
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlSpn' ][i ] = data [0 ]
1284
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCrvAC' ][i ] = data [1 ]
1285
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlSwpAC' ][i ] = data [2 ]
1286
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCrvAng' ][i ]= data [3 ]
1287
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlTwist' ][i ] = data [4 ]
1288
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlChord' ][i ] = data [5 ]
1289
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlAFID' ][i ] = data [6 ]
1267
1290
if len (data ) == 9 :
1268
- self .fst_vt ['AeroDynBlade' ]['BlCb' ][i ] = data [7 ]
1269
- self .fst_vt ['AeroDynBlade' ]['BlCenBn' ][i ] = data [8 ]
1270
- self .fst_vt ['AeroDynBlade' ]['BlCenBt' ][i ] = data [9 ]
1291
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCb' ][i ] = data [7 ]
1292
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCenBn' ][i ] = data [8 ]
1293
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ][ 'BlCenBt' ][i ] = data [9 ]
1271
1294
else :
1272
- self .fst_vt ['AeroDynBlade' ]['BlCb' ][i ] = 0.0
1273
- self .fst_vt ['AeroDynBlade' ]['BlCenBn' ][i ] = 0.0
1274
- self .fst_vt ['AeroDynBlade' ]['BlCenBt' ][i ] = 0.0
1275
-
1295
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ]['BlCb' ][i ] = 0.0
1296
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ]['BlCenBn' ][i ] = 0.0
1297
+ self .fst_vt ['AeroDynBlade' ][BladeNumber ]['BlCenBt' ][i ] = 0.0
1276
1298
1277
1299
f .close ()
1278
1300
@@ -3211,8 +3233,6 @@ def execute(self):
3211
3233
# Copy data to second blade slot
3212
3234
self .fst_vt ['BeamDyn' ] = self .fst_vt ['BeamDyn' ][0 ]
3213
3235
self .fst_vt ['BeamDynBlade' ] = self .fst_vt ['BeamDynBlade' ][0 ]
3214
- # Read unique third file
3215
- self .read_BeamDyn (bd_file3 , BladeNumber = 2 )
3216
3236
else :
3217
3237
# All blades unique or single blade
3218
3238
self .read_BeamDyn (bd_file1 , BladeNumber = 0 )
0 commit comments