@@ -212,15 +212,17 @@ def read(self, filename=None):
212
212
if filename is not None :
213
213
self .filename = filename
214
214
215
- # Read OpenFAST files
215
+ # Read main file (.fst, or .drv) and store into key "Fst"
216
216
self .fst_vt ['Fst' ] = self ._read (self .FAST_InputFile , 'Fst' )
217
217
if self .fst_vt ['Fst' ] is None :
218
218
raise Exception ('Error reading main file {}' .format (self .filename ))
219
219
keys = self .fst_vt ['Fst' ].keys ()
220
220
221
-
221
+ # Detect driver or OpenFAST version
222
222
if 'NumTurbines' in keys :
223
223
self .version = 'AD_driver'
224
+ elif 'DynamicSolve' in keys :
225
+ self .version = 'BD_driver'
224
226
elif 'InterpOrder' in self .fst_vt ['Fst' ].keys ():
225
227
self .version = 'OF2'
226
228
else :
@@ -235,6 +237,18 @@ def read(self, filename=None):
235
237
236
238
self .readAD (key = 'AeroDyn15' )
237
239
240
+ elif self .version == 'BD_driver' :
241
+ # --- BD driver
242
+ self .fst_vt ['BeamDyn' ] = self ._read (self .fst_vt ['Fst' ]['InputFile' ],'BD' )
243
+ if self .fst_vt ['BeamDyn' ] is not None :
244
+ # Blades
245
+ bld_file = os .path .join (os .path .dirname (self .fst_vt ['Fst' ]['InputFile' ]), self .fst_vt ['BeamDyn' ]['BldFile' ])
246
+ print ('bld_file' , bld_file )
247
+ self .fst_vt ['BeamDynBlade' ]= self ._read (bld_file ,'BDbld' )
248
+
249
+ del self .fst_vt ['af_data' ]
250
+ del self .fst_vt ['ac_data' ]
251
+
238
252
elif self .version == 'OF2' :
239
253
# ---- Regular OpenFAST file
240
254
# ElastoDyn
@@ -336,85 +350,110 @@ def write(self, filename=None, prefix='', suffix='', directory=None):
336
350
self .filename = filename
337
351
if directory is None :
338
352
directory = os .path .dirname (filename )
353
+ else :
354
+ # Making sure filename is within directory
355
+ filename = os .path .join (directory , os .path .basename (filename ))
356
+ if not os .path .exists (directory ):
357
+ os .makedirs (directory )
358
+
339
359
basename = os .path .splitext (os .path .basename (filename ))[0 ]
340
360
341
361
342
362
fst = self .fst_vt ['Fst' ]
343
363
344
- # Filenames
345
- filename_ED = os .path .join (directory ,prefix + 'ED' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
346
- filename_IW = os .path .join (directory ,prefix + 'IW' + suffix + '.dat' ) if fst ['CompInflow' ]> 0 else 'none'
347
- filename_BD = os .path .join (directory ,prefix + 'BD' + suffix + '.dat' ) if fst ['CompElast' ]== 2 else 'none'
348
- filename_AD = os .path .join (directory ,prefix + 'AD' + suffix + '.dat' ) if fst ['CompAero' ]> 0 else 'none'
349
- filename_HD = os .path .join (directory ,prefix + 'HD' + suffix + '.dat' ) if fst ['CompHydro' ]> 0 else 'none'
350
- filename_SD = os .path .join (directory ,prefix + 'SD' + suffix + '.dat' ) if fst ['CompSub' ]> 0 else 'none'
351
- filename_MD = os .path .join (directory ,prefix + 'MD' + suffix + '.dat' ) if fst ['CompMooring' ]> 0 else 'none'
352
- filename_SvD = os .path .join (directory ,prefix + 'SvD' + suffix + '.dat' ) if fst ['CompServo' ]> 0 else 'none'
353
- filename_Ice = os .path .join (directory ,prefix + 'Ice' + suffix + '.dat' ) if fst ['CompIce' ]> 0 else 'none'
354
- filename_ED_bld = os .path .join (directory ,prefix + 'ED_bld' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
355
- filename_ED_twr = os .path .join (directory ,prefix + 'ED_twr' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
356
- filename_BD_bld = os .path .join (directory ,prefix + 'BD_bld' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
357
- # TODO AD Profiles and OLAF
358
-
359
- fst ['EDFile' ] = '"' + os .path .basename (filename_ED ) + '"'
360
- fst ['BDBldFile(1)' ] = '"' + os .path .basename (filename_BD ) + '"'
361
- fst ['BDBldFile(2)' ] = '"' + os .path .basename (filename_BD ) + '"'
362
- fst ['BDBldFile(3)' ] = '"' + os .path .basename (filename_BD ) + '"'
363
- fst ['InflowFile' ] = '"' + os .path .basename (filename_IW ) + '"'
364
- fst ['AeroFile' ] = '"' + os .path .basename (filename_AD ) + '"'
365
- fst ['ServoFile' ] = '"' + os .path .basename (filename_AD ) + '"'
366
- fst ['HydroFile' ] = '"' + os .path .basename (filename_HD ) + '"'
367
- fst ['SubFile' ] = '"' + os .path .basename (filename_SD ) + '"'
368
- fst ['MooringFile' ] = '"' + os .path .basename (filename_MD ) + '"'
369
- fst ['IceFile' ] = '"' + os .path .basename (filename_Ice )+ '"'
370
- fst .write (filename )
371
-
372
-
373
- ED = self .fst_vt ['ElastoDyn' ]
374
- if fst ['CompElast' ]> 0 :
375
- ED ['TwrFile' ] = '"' + os .path .basename (filename_ED_twr )+ '"'
376
- self .fst_vt ['ElastoDynTower' ].write (filename_ED_twr )
377
- if fst ['CompElast' ]== 1 :
378
- if 'BldFile1' in ED .keys ():
379
- ED ['BldFile1' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
380
- ED ['BldFile2' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
381
- ED ['BldFile3' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
382
- else :
383
- ED ['BldFile(1)' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
384
- ED ['BldFile(2)' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
385
- ED ['BldFile(3)' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
386
- self .fst_vt ['ElastoDynBlade' ].write (filename_ED_bld )
387
364
388
- elif fst ['CompElast' ]== 2 :
365
+ if self .version == 'AD_driver' :
366
+ raise NotImplementedError ()
367
+
368
+ elif self .version == 'BD_driver' :
369
+ # --- BD driver
370
+ filename_BD = os .path .join (directory , prefix + 'BD' + suffix + '.dat' )
371
+ filename_BD_bld = os .path .join (directory , prefix + 'BD_bld' + suffix + '.dat' )
372
+ fst ['InputFile' ] = '"' + os .path .basename (filename_BD ) + '"'
373
+ fst .write (filename )
389
374
BD = self .fst_vt ['BeamDyn' ]
390
375
BD ['BldFile' ] = '"' + os .path .basename (filename_BD_bld )+ '"'
391
376
self .fst_vt ['BeamDynBlade' ].write (filename_BD_bld ) # TODO TODO pick up the proper blade file!
392
377
BD .write (filename_BD )
393
- ED .write (filename_ED )
394
378
379
+ elif self .version == 'OF2' :
395
380
396
- if fst ['CompInflow' ]> 0 :
397
- self .fst_vt ['InflowWind' ].write (filename_IW )
398
-
399
- if fst ['CompAero' ]> 0 :
400
- self .fst_vt ['AeroDyn15' ].write (filename_AD )
401
- # TODO other files
402
-
403
- if fst ['CompServo' ]> 0 :
404
- self .fst_vt ['ServoDyn' ].write (filename_SvD )
405
-
406
- if fst ['CompHydro' ]== 1 :
407
- self .fst_vt ['HydroDyn' ].write (filename_HD )
408
-
409
- if fst ['CompSub' ]== 1 :
410
- self .fst_vt ['SubDyn' ].write (filename_SD )
411
- elif fst ['CompSub' ]== 2 :
412
- raise NotImplementedError ()
381
+ # Filenames
382
+ filename_ED = os .path .join (directory ,prefix + 'ED' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
383
+ filename_IW = os .path .join (directory ,prefix + 'IW' + suffix + '.dat' ) if fst ['CompInflow' ]> 0 else 'none'
384
+ filename_BD = os .path .join (directory ,prefix + 'BD' + suffix + '.dat' ) if fst ['CompElast' ]== 2 else 'none'
385
+ filename_AD = os .path .join (directory ,prefix + 'AD' + suffix + '.dat' ) if fst ['CompAero' ]> 0 else 'none'
386
+ filename_HD = os .path .join (directory ,prefix + 'HD' + suffix + '.dat' ) if fst ['CompHydro' ]> 0 else 'none'
387
+ filename_SD = os .path .join (directory ,prefix + 'SD' + suffix + '.dat' ) if fst ['CompSub' ]> 0 else 'none'
388
+ filename_MD = os .path .join (directory ,prefix + 'MD' + suffix + '.dat' ) if fst ['CompMooring' ]> 0 else 'none'
389
+ filename_SvD = os .path .join (directory ,prefix + 'SvD' + suffix + '.dat' ) if fst ['CompServo' ]> 0 else 'none'
390
+ filename_Ice = os .path .join (directory ,prefix + 'Ice' + suffix + '.dat' ) if fst ['CompIce' ]> 0 else 'none'
391
+ filename_ED_bld = os .path .join (directory ,prefix + 'ED_bld' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
392
+ filename_ED_twr = os .path .join (directory ,prefix + 'ED_twr' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
393
+ filename_BD_bld = os .path .join (directory ,prefix + 'BD_bld' + suffix + '.dat' ) if fst ['CompElast' ]> 0 else 'none'
394
+ # TODO AD Profiles and OLAF
395
+
396
+ fst ['EDFile' ] = '"' + os .path .basename (filename_ED ) + '"'
397
+ fst ['BDBldFile(1)' ] = '"' + os .path .basename (filename_BD ) + '"'
398
+ fst ['BDBldFile(2)' ] = '"' + os .path .basename (filename_BD ) + '"'
399
+ fst ['BDBldFile(3)' ] = '"' + os .path .basename (filename_BD ) + '"'
400
+ fst ['InflowFile' ] = '"' + os .path .basename (filename_IW ) + '"'
401
+ fst ['AeroFile' ] = '"' + os .path .basename (filename_AD ) + '"'
402
+ fst ['ServoFile' ] = '"' + os .path .basename (filename_AD ) + '"'
403
+ fst ['HydroFile' ] = '"' + os .path .basename (filename_HD ) + '"'
404
+ fst ['SubFile' ] = '"' + os .path .basename (filename_SD ) + '"'
405
+ fst ['MooringFile' ] = '"' + os .path .basename (filename_MD ) + '"'
406
+ fst ['IceFile' ] = '"' + os .path .basename (filename_Ice )+ '"'
407
+ fst .write (filename )
408
+
409
+
410
+ ED = self .fst_vt ['ElastoDyn' ]
411
+ if fst ['CompElast' ]> 0 :
412
+ ED ['TwrFile' ] = '"' + os .path .basename (filename_ED_twr )+ '"'
413
+ self .fst_vt ['ElastoDynTower' ].write (filename_ED_twr )
414
+ if fst ['CompElast' ]== 1 :
415
+ if 'BldFile1' in ED .keys ():
416
+ ED ['BldFile1' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
417
+ ED ['BldFile2' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
418
+ ED ['BldFile3' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
419
+ else :
420
+ ED ['BldFile(1)' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
421
+ ED ['BldFile(2)' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
422
+ ED ['BldFile(3)' ] = '"' + os .path .basename (filename_ED_bld )+ '"'
423
+ self .fst_vt ['ElastoDynBlade' ].write (filename_ED_bld )
424
+
425
+ elif fst ['CompElast' ]== 2 :
426
+ BD = self .fst_vt ['BeamDyn' ]
427
+ BD ['BldFile' ] = '"' + os .path .basename (filename_BD_bld )+ '"'
428
+ self .fst_vt ['BeamDynBlade' ].write (filename_BD_bld ) # TODO TODO pick up the proper blade file!
429
+ BD .write (filename_BD )
430
+ ED .write (filename_ED )
431
+
432
+
433
+ if fst ['CompInflow' ]> 0 :
434
+ self .fst_vt ['InflowWind' ].write (filename_IW )
435
+
436
+ if fst ['CompAero' ]> 0 :
437
+ self .fst_vt ['AeroDyn15' ].write (filename_AD )
438
+ # TODO other files
439
+
440
+ if fst ['CompServo' ]> 0 :
441
+ self .fst_vt ['ServoDyn' ].write (filename_SvD )
442
+
443
+ if fst ['CompHydro' ]== 1 :
444
+ self .fst_vt ['HydroDyn' ].write (filename_HD )
445
+
446
+ if fst ['CompSub' ]== 1 :
447
+ self .fst_vt ['SubDyn' ].write (filename_SD )
448
+ elif fst ['CompSub' ]== 2 :
449
+ raise NotImplementedError ()
450
+
451
+ if fst ['CompMooring' ]== 1 :
452
+ self .fst_vt ['MAP' ].write (filename_MD )
453
+ if self .fst_vt ['Fst' ]['CompMooring' ]== 2 :
454
+ self .fst_vt ['MoorDyn' ].write (filename_MD )
413
455
414
- if fst ['CompMooring' ]== 1 :
415
- self .fst_vt ['MAP' ].write (filename_MD )
416
- if self .fst_vt ['Fst' ]['CompMooring' ]== 2 :
417
- self .fst_vt ['MoorDyn' ].write (filename_MD )
456
+ return filename
418
457
419
458
420
459
0 commit comments