def calculate_viscous_effects(self, S_wave): """ Calculate viscous forces and damping with the given wave spectrum. Note that this can be iterative, as the transfer functions will be re-calculated using previously-calculated viscous effects. """ assert len(S_wave) == len(self.w) H_wave = self.transfer_function_from_wave_elevation() self.Bv, self.Fvc, self.Fvv = self.morison.total_drag(self.w, H_wave, S_wave) # Fvv is the actual force/unit wave height at each wave # frequency -- to get the spectrum, it's like the first-order # wave force spectrum. self.viscous_force_spectrum = response_spectrum(self.Fvv, S_wave)
def response_spectrum(self, S_wave, second_order=True, viscous=True): """Convenience method which calculates the response spectrum """ S1 = self.hydro_info.first_order_force_spectrum(self.w, S_wave) if second_order: S2 = self.hydro_info.second_order_force_spectrum(self.w, S_wave) else: S2 = zeros_like(S1) if viscous: self.calculate_viscous_effects(S_wave) Sv = self.viscous_force_spectrum else: Sv = zeros_like(S1) self.calculate_wave_drift_damping(S_wave) # XXX this doesn't work well if second_order or viscous is set # to False -- transfer_function() will use previously-calculated values H = self.transfer_function() SF = S1 + S2 + Sv Sx = response_spectrum(H[:, :, :6], SF) return Sx
def first_order_force_spectrum(self, w, S_wave, heading=0): # Interpolate complex wave excitation force X = self.X(w, heading) return response_spectrum(X, S_wave)