Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
1e93431
Connect WaveTankInit to SS and MD Init
rafmudaf Apr 2, 2025
d8c596c
Connect WaveTankInit to ADI Init
rafmudaf Apr 4, 2025
fcaba4f
Fix C-based ErrMsg handling
rafmudaf Apr 4, 2025
7b12023
Add type specifier to floating point constants
rafmudaf Apr 4, 2025
db2deb4
Add WaveTankEnd routine
rafmudaf Apr 4, 2025
41bb2c9
Call ADI Preinit and SetRotor
rafmudaf Apr 7, 2025
ed6ea91
Add MHK flag to ADI C interface
rafmudaf Apr 7, 2025
a712957
Add C and Fortran string error handling functions
rafmudaf Apr 7, 2025
bcd05d8
Add F to C string converter to fix ADI Init
rafmudaf Apr 7, 2025
e005c21
Update and clean up code comments
rafmudaf Apr 7, 2025
d9550a6
Move initial conditions to ADI C Preinit
rafmudaf Apr 8, 2025
0fc7257
Merge remote-tracking branch 'ryan/MD_SS_coupling' into dev-cbind-wav…
rafmudaf Apr 10, 2025
969fd43
Set SS WaveField data pointer onto MD
rafmudaf Apr 9, 2025
1b1290b
Add subroutines for debugging LabVIEW connection
rafmudaf Apr 14, 2025
9626245
Fix placement of implicit none
rafmudaf Apr 10, 2025
e404bbb
Add basic header file
rafmudaf Apr 11, 2025
03676bd
Export output sizes and allocate memory in driver
rafmudaf Apr 11, 2025
a98bd54
Extend CalcOutput routine
rafmudaf Apr 11, 2025
fbff4b2
Use floating MHK reg test files for dev testing
rafmudaf Apr 11, 2025
07fd9b1
Merge branch 'dev-cbind' into dev-cbind-wavetank
rafmudaf Apr 17, 2025
b1f97ef
Fix Python lib APIs
rafmudaf Apr 22, 2025
68871fd
Connect ADI SetRotorMotion, UpdateStates, CalcOutput
rafmudaf Apr 22, 2025
25e2717
Hard code IfW OutputAccel flag
rafmudaf Apr 22, 2025
c3d6e0f
Add check for initialized WaveField pointer
rafmudaf Apr 22, 2025
aa23bf4
Merge branch 'dev' into dev-cbind-wavetank
rafmudaf Apr 22, 2025
765de60
Add WaveTank module config file
rafmudaf Apr 23, 2025
bbd25a4
Extend C ErrMes length to 8196
rafmudaf Apr 23, 2025
87d25b7
Align Aerodyn Inflow C error handling
rafmudaf Apr 23, 2025
a647964
Remove implicit none’s to fix linting
rafmudaf Apr 23, 2025
34db52c
Merge branch 'dev-cbind' into dev-cbind-wavetank
rafmudaf Apr 23, 2025
a63de9f
ADI_c: set `OutputAccel` flag for IfW with MHK (#27)
andrew-platt Apr 23, 2025
b6e48df
Remove data that aren’t used
rafmudaf Apr 23, 2025
611c9b2
Add MHK flag to ADI C Preinit Python interface
rafmudaf Apr 23, 2025
cf50376
Streamline parts of the WaveTank module API
rafmudaf Apr 23, 2025
174436a
Get ADI rotor loads
rafmudaf Apr 24, 2025
e5f3af4
Bug fix when passing structure positions
rafmudaf Apr 24, 2025
f7df5e5
Update WaveTank model closer to RM1
rafmudaf Apr 25, 2025
44e86f0
Merge branch 'dev-cbind' into dev-cbind-wavetank
rafmudaf Apr 30, 2025
c98d7a4
Revert WaveTank module changes
rafmudaf May 6, 2025
fad6876
Add context to MHK flag comments
rafmudaf May 8, 2025
1c8ac55
Set C error message len to Fortran len + 1
rafmudaf May 8, 2025
84a3ca8
Remove unused function stub
rafmudaf May 8, 2025
42a180c
Add unit tests for NWTC C Bindings module
rafmudaf May 13, 2025
45f5305
Merge branch 'dev-cbind' into dev-cbind-wavetank
rafmudaf May 13, 2025
c7ba782
Use Fortran string for routine name in C errors
rafmudaf May 13, 2025
de37045
Add NWTC C Binding module to Visual Studio project
rafmudaf May 21, 2025
769887c
Merge remote-tracking branch 'OpenFAST/dev' into dev-cbind-wavetank
andrew-platt Jul 9, 2025
8d59c13
ADI cbind: remove stale/incomplete ADI_C_ReInit
andrew-platt Jul 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion glue-codes/labview/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,14 @@
add_library(wavetanktestinglib SHARED
src/WaveTank.f90
)
target_link_libraries(wavetanktestinglib aerodyn_inflow_c_binding moordyn_c_binding seastate_c_binding nwtclibs versioninfolib)
target_link_libraries(
wavetanktestinglib
aerodyn_inflow_c_binding
moordyn_c_binding
seastate_c_binding
nwtclibs
versioninfolib
)
if(APPLE OR UNIX)
target_compile_definitions(wavetanktestinglib PRIVATE IMPLICIT_DLLEXPORT)
endif()
Expand Down
505 changes: 345 additions & 160 deletions glue-codes/labview/src/WaveTank.f90

Large diffs are not rendered by default.

78 changes: 36 additions & 42 deletions glue-codes/python/WaveTankDriver.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,33 +37,28 @@ def __init__(self, library_path: str, input_file_names: dict):
super().__init__(library_path)

self.input_file_names = {
k: create_string_buffer(str(Path(v).absolute() ).encode('utf-8'))
for k,v in input_file_names.items()
k: str(Path(v).absolute()).encode('utf-8') for k,v in input_file_names.items()
}

self._initialize_routines()

# Create buffers for class data
self.ended = False # For error handling at end

# This buffer for the channel names and units is set arbitrarily large
# to start. Channel name and unit lengths are currently hard
# coded to 20 (this must match ChanLen in NWTC_Base.f90).
# self._channel_names_c = create_string_buffer(20 * 4000 + 1)
# self._channel_units_c = create_string_buffer(20 * 4000 + 1)

self.dt = c_double(0)
self.total_time = c_double(0)
self.numTimeSteps = c_int(0)
# Create buffers for class data
# These will generally be overwritten by the Fortran code
self.num_outs_c = c_int(0)
self.output_channel_names = []
self.output_channel_units = []
self.output_values = None

def _initialize_routines(self):
self.WaveTank_Init.argtypes = [
POINTER(c_char), # intent(in ) :: MD_InputFile_c(IntfStrLen)
POINTER(c_char), # intent(in ) :: SS_InputFile_c(IntfStrLen)
POINTER(c_char), # intent(in ) :: AD_InputFile_c(IntfStrLen)
POINTER(c_char), # intent(in ) :: IfW_InputFile_c(IntfStrLen)
POINTER(c_int), # intent(in ) :: IfW_InputFile_c(IntfStrLen)
POINTER(c_char_p), # intent(in ) :: MD_InputFile_c(IntfStrLen)
POINTER(c_char_p), # intent(in ) :: SS_InputFile_c(IntfStrLen)
POINTER(c_char_p), # intent(in ) :: AD_InputFile_c(IntfStrLen)
POINTER(c_char_p), # intent(in ) :: IfW_InputFile_c(IntfStrLen)
POINTER(c_int), # intent(in ) :: n_camera_points_c
POINTER(c_int), # intent( out) :: ErrStat_C
POINTER(c_char), # intent( out) :: ErrMsg_C(ErrMsgLen_C)
]
self.WaveTank_Init.restype = c_int
Expand All @@ -80,23 +75,21 @@ def _initialize_routines(self):
]
self.WaveTank_CalcOutput.restype = c_int

self.WaveTank_End.argtypes = [
POINTER(c_int), # integer(c_int), intent( out) :: ErrStat_C
POINTER(c_char), # character(kind=c_char), intent( out) :: ErrMsg_C(ErrMsgLen_C)
]
self.WaveTank_End.restype = c_int

def init(self, n_camera_points):
_error_status = c_int(0)
_error_message = create_string_buffer(self.ERROR_MSG_C_LEN)

# Convert the string into a c_char byte array
# input_string = '\x00'.join(input_string_array)
# input_string = input_string.encode('utf-8')
# input_string_length = len(input_string)

# # Convert the initial positions array into c_float array
# init_positions_c = (c_float * 6)(0.0, )
# for i, p in enumerate(platform_init_pos):
# init_positions_c[i] = c_float(p)

# self._numChannels = c_int(0)

# gravity = c_float(9.80665)
# water_density = c_float(1025)
# water_depth = c_float(200)
Expand All @@ -107,10 +100,10 @@ def init(self, n_camera_points):
# time_interval = c_float(0.125)
# wave_elevation_series_flag = c_int(0)
self.WaveTank_Init(
self.input_file_names["MoorDyn"],
self.input_file_names["SeaState"],
self.input_file_names["AeroDyn"],
self.input_file_names["InflowWind"],
c_char_p(self.input_file_names["MoorDyn"]),
c_char_p(self.input_file_names["SeaState"]),
c_char_p(self.input_file_names["AeroDyn"]),
c_char_p(self.input_file_names["InflowWind"]),
byref(c_int(n_camera_points)),
# create_string_buffer(outrootname),
# byref(gravity),
Expand All @@ -127,6 +120,10 @@ def init(self, n_camera_points):
if self.fatal_error(_error_status):
raise RuntimeError(f"Error {_error_status.value}: {_error_message.value}")

# self.output_channel_names = [n.decode('UTF-8') for n in _channel_names.value.split()]
# self.output_channel_units = [n.decode('UTF-8') for n in _channel_units.value.split()]
# self.output_values = np.zeros( self.num_outs_c.value, dtype=c_float, order='C' )

def calc_output(
self,
frame_number: int,
Expand All @@ -152,21 +149,16 @@ def calc_output(
if self.fatal_error(_error_status):
raise RuntimeError(f"Error {_error_status.value}: {_error_message.value}")

@property
def output_channel_names(self):
if len(self._channel_names.value.split()) == 0:
return []
output_channel_names = self._channel_names.value.split()
output_channel_names = [n.decode('UTF-8') for n in output_channel_names]
return output_channel_names
def end(self):
_error_status = c_int(0)
_error_message = create_string_buffer(self.ERROR_MSG_C_LEN)

@property
def output_channel_units(self):
if len(self._channel_units.value.split()) == 0:
return []
output_channel_units = self._channel_units.value.split()
output_channel_units = [n.decode('UTF-8') for n in output_channel_units]
return output_channel_units
self.WaveTank_End(
byref(_error_status),
_error_message,
)
if self.fatal_error(_error_status):
raise RuntimeError(f"Error {_error_status.value}: {_error_message.value}")


if __name__=="__main__":
Expand Down Expand Up @@ -196,3 +188,5 @@ def output_channel_units(self):
rotation_matrix=rotation_matrix,
loads=loads,
)

wavetanklib.end()
Loading