def execute(self): # water depth d = self.z_surface - self.z_floor # design wave height h = 1.1 * self.hs # circular frequency omega = 2.0 * math.pi / self.T # compute wave number from dispersion relationship k = brentq(lambda k: omega**2 - self.g * k * math.tanh(d * k), 0, 10 * omega**2 / self.g) # zero at surface z_rel = self.z - self.z_surface # maximum velocity self.U = h / 2.0 * omega * np.cosh(k * (z_rel + d)) / math.sinh( k * d) + self.Uc self.U0 = h / 2.0 * omega * np.cosh(k * (0. + d)) / math.sinh( k * d) + self.Uc # check heights self.U[np.logical_or(self.z < self.z_floor, self.z > self.z_surface)] = 0. # acceleration self.A = self.U * omega self.A0 = self.U0 * omega # angles self.beta = self.betaWave * np.ones_like(self.z) self.beta0 = self.betaWave # derivatives dU_dz = h / 2.0 * omega * np.sinh(k * (z_rel + d)) / math.sinh(k * d) * k dU_dUc = np.ones_like(self.z) idx = np.logical_or(self.z < self.z_floor, self.z > self.z_surface) dU_dz[idx] = 0.0 dU_dUc[idx] = 0.0 dA_dz = omega * dU_dz dA_dUc = omega * dU_dUc self.J = vstack([ hstack([np.diag(dU_dz), dU_dUc]), hstack([np.diag(dA_dz), dA_dUc]) ])
def provideJ(self): # rename z = self.z zref = self.zref z0 = self.z0 z_roughness = self.z_roughness/1e3 Uref = self.Uref n = len(z) dU_dUref = np.zeros(n) dU_dz_diag = np.zeros(n) dU_dzref = np.zeros(n) idx = [z - z0 > z_roughness] lt = np.log((z[idx] - z0)/z_roughness) lb = math.log((zref - z0)/z_roughness) dU_dUref[idx] = lt/lb dU_dz_diag[idx] = Uref/lb / (z[idx] - z0) dU_dzref[idx] = -Uref*lt / math.log((zref - z0)/z_roughness)**2 / (zref - z0) J = hstack([dU_dUref, np.diag(dU_dz_diag), dU_dzref]) return J
def provideJ(self): # rename z = self.z zref = self.zref z0 = self.z0 z_roughness = self.z_roughness / 1e3 Uref = self.Uref n = len(z) dU_dUref = np.zeros(n) dU_dz_diag = np.zeros(n) dU_dzref = np.zeros(n) idx = [z - z0 > z_roughness] lt = np.log((z[idx] - z0) / z_roughness) lb = math.log((zref - z0) / z_roughness) dU_dUref[idx] = lt / lb dU_dz_diag[idx] = Uref / lb / (z[idx] - z0) dU_dzref[idx] = -Uref * lt / math.log( (zref - z0) / z_roughness)**2 / (zref - z0) J = hstack([dU_dUref, np.diag(dU_dz_diag), dU_dzref]) return J
def execute(self): # water depth #CJB z_surface = wdepth+z_floor, so d = wdepth d = self.z_surface - self.z_floor # design wave height h = self.hmax # circular frequency omega = 2.0*math.pi/self.T # compute wave number from dispersion relationship k = brentq(lambda k: omega**2 - self.g*k*math.tanh(d*k), 0, 10*omega**2/self.g) # zero at surface z_rel = self.z - self.z_surface # maximum velocity self.U = h/2.0*omega*np.cosh(k*(z_rel + d))/math.sinh(k*d) + self.Uc self.U0 = h/2.0*omega*np.cosh(k*(0. + d))/math.sinh(k*d) + self.Uc # check heights self.U[np.logical_or(self.z < self.z_floor, self.z > self.z_surface)] = 0. # acceleration self.A = self.U * omega self.A0 = self.U0 * omega # angles self.beta = self.betaWave*np.ones_like(self.z) self.beta0 =self.betaWave # derivatives dU_dz = h/2.0*omega*np.sinh(k*(z_rel + d))/math.sinh(k*d)*k dU_dUc = np.ones_like(self.z) idx = np.logical_or(self.z < self.z_floor, self.z > self.z_surface) dU_dz[idx] = 0.0 dU_dUc[idx] = 0.0 dA_dz = omega*dU_dz dA_dUc = omega*dU_dUc dU0 = np.zeros(len(self.z) + 1) dU0[-1] = 1.0 dA0 = omega * dU0 self.J = vstack([hstack([np.diag(dU_dz), dU_dUc]), hstack([np.diag(dA_dz), dA_dUc]), np.transpose(dU0), np.transpose(dA0)])
def provideJ(self): G = self.G nu = self.nu h = self.depth r0 = self.r0 # vertical eta = 1.0 + 0.6 * (1.0 - nu) * h / r0 deta_dr0 = -0.6 * (1.0 - nu) * h / r0**2 dkz_dr0 = 4 * G / (1.0 - nu) * (eta + r0 * deta_dr0) deta_dh = 0.6 * (1.0 - nu) / r0 dkz_dh = 4 * G * r0 / (1.0 - nu) * deta_dh # horizontal eta = 1.0 + 0.55 * (2.0 - nu) * h / r0 deta_dr0 = -0.55 * (2.0 - nu) * h / r0**2 dkx_dr0 = 32.0 * (1.0 - nu) * G / (7.0 - 8.0 * nu) * (eta + r0 * deta_dr0) deta_dh = 0.55 * (2.0 - nu) / r0 dkx_dh = 32.0 * (1.0 - nu) * G * r0 / (7.0 - 8.0 * nu) * deta_dh # rocking eta = 1.0 + 1.2 * (1.0 - nu) * h / r0 + 0.2 * (2.0 - nu) * (h / r0)**3 deta_dr0 = -1.2 * (1.0 - nu) * h / r0**2 - 3 * 0.2 * (2.0 - nu) * ( h / r0)**3 / r0 dkthetax_dr0 = 8.0 * G / (3.0 * (1.0 - nu)) * (3 * r0**2 * eta + r0**3 * deta_dr0) deta_dh = 1.2 * (1.0 - nu) / r0 + 3 * 0.2 * (2.0 - nu) * (1.0 / r0)**3 * h**2 dkthetax_dh = 8.0 * G * r0**3 / (3.0 * (1.0 - nu)) * deta_dh # torsional dkphi_dr0 = 16.0 * G * 3 * r0**2 / 3.0 dkphi_dh = 0.0 dk_dr0 = np.array( [dkx_dr0, dkthetax_dr0, dkx_dr0, dkthetax_dr0, dkz_dr0, dkphi_dr0]) dk_dr0[self.rigid] = 0.0 dk_dh = np.array( [dkx_dh, dkthetax_dh, dkx_dh, dkthetax_dh, dkz_dh, dkphi_dh]) dk_dh[self.rigid] = 0.0 J = hstack((dk_dr0, dk_dh)) return J
def provideJ(self): # gradients dPbar_dPa = dPbar_dPbar1 * dPbar1_dPbar0 / rated_power dPbar_dPr = -dPbar_dPbar1 * dPbar1_dPbar0 * aero_power / rated_power**2 deff_dPa = dPbar_dPa * (constant / Pbar**2 - quadratic) deff_dPr = dPbar_dPr * (constant / Pbar**2 - quadratic) dP_dPa = eff + aero_power * deff_dPa dP_dPr = aero_power * deff_dPr self.J = hstack([np.diag(dP_dPa), dP_dPr]) return self.J
def provideJ(self): G = self.G nu = self.nu h = self.depth r0 = self.r0 # vertical eta = 1.0 + 0.6*(1.0-nu)*h/r0 deta_dr0 = -0.6*(1.0-nu)*h/r0**2 dkz_dr0 = 4*G/(1.0-nu)*(eta + r0*deta_dr0) deta_dh = 0.6*(1.0-nu)/r0 dkz_dh = 4*G*r0/(1.0-nu)*deta_dh # horizontal eta = 1.0 + 0.55*(2.0-nu)*h/r0 deta_dr0 = -0.55*(2.0-nu)*h/r0**2 dkx_dr0 = 32.0*(1.0-nu)*G/(7.0-8.0*nu)*(eta + r0*deta_dr0) deta_dh = 0.55*(2.0-nu)/r0 dkx_dh = 32.0*(1.0-nu)*G*r0/(7.0-8.0*nu)*deta_dh # rocking eta = 1.0 + 1.2*(1.0-nu)*h/r0 + 0.2*(2.0-nu)*(h/r0)**3 deta_dr0 = -1.2*(1.0-nu)*h/r0**2 - 3*0.2*(2.0-nu)*(h/r0)**3/r0 dkthetax_dr0 = 8.0*G/(3.0*(1.0-nu))*(3*r0**2*eta + r0**3*deta_dr0) deta_dh = 1.2*(1.0-nu)/r0 + 3*0.2*(2.0-nu)*(1.0/r0)**3*h**2 dkthetax_dh = 8.0*G*r0**3/(3.0*(1.0-nu))*deta_dh # torsional dkphi_dr0 = 16.0*G*3*r0**2/3.0 dkphi_dh = 0.0 dk_dr0 = np.array([dkx_dr0, dkthetax_dr0, dkx_dr0, dkthetax_dr0, dkz_dr0, dkphi_dr0]) dk_dr0[self.rigid] = 0.0 dk_dh = np.array([dkx_dh, dkthetax_dh, dkx_dh, dkthetax_dh, dkz_dh, dkphi_dh]) dk_dh[self.rigid] = 0.0 J = hstack((dk_dr0, dk_dh)) return J
def provideJ(self): # rename z = self.z zref = self.zref z0 = self.z0 shearExp = self.shearExp U = self.U Uref = self.Uref # gradients n = len(z) dU_dUref = np.zeros(n) dU_dz = np.zeros(n) dU_dzref = np.zeros(n) idx = z > z0 dU_dUref[idx] = U[idx]/Uref dU_dz[idx] = U[idx]*shearExp/(z[idx] - z0) dU_dzref[idx] = -U[idx]*shearExp/(zref - z0) # # cubic spline region # idx = np.logical_and(z > z0, z < zsmall) # # d w.r.t z # dU_dz[idx] = self.spline.eval_deriv(z[idx]) # # d w.r.t. Uref # df2_dUref = k**shearExp # dg2_dUref = k**shearExp*shearExp/(zsmall - z0) # dU_dUref[idx] = self.spline.eval_deriv_params(z[idx], 0.0, 0.0, 0.0, df2_dUref, 0.0, dg2_dUref) # # d w.r.t. zref # dx2_dzref = k # dg2_dzref = -Uref*k**shearExp*shearExp/k/(zref - z0)**2 # dU_dzref[idx] = self.spline.eval_deriv_params(z[idx], 0.0, dx2_dzref, 0.0, 0.0, 0.0, dg2_dzref) J = hstack([dU_dUref, np.diag(dU_dz), dU_dzref]) return J
def provideJ(self): # rename z = self.z zref = self.zref z0 = self.z0 shearExp = self.shearExp U = self.U Uref = self.Uref # gradients n = len(z) dU_dUref = np.zeros(n) dU_dz = np.zeros(n) dU_dzref = np.zeros(n) idx = z > z0 dU_dUref[idx] = U[idx] / Uref dU_dz[idx] = U[idx] * shearExp / (z[idx] - z0) dU_dzref[idx] = -U[idx] * shearExp / (zref - z0) # # cubic spline region # idx = np.logical_and(z > z0, z < zsmall) # # d w.r.t z # dU_dz[idx] = self.spline.eval_deriv(z[idx]) # # d w.r.t. Uref # df2_dUref = k**shearExp # dg2_dUref = k**shearExp*shearExp/(zsmall - z0) # dU_dUref[idx] = self.spline.eval_deriv_params(z[idx], 0.0, 0.0, 0.0, df2_dUref, 0.0, dg2_dUref) # # d w.r.t. zref # dx2_dzref = k # dg2_dzref = -Uref*k**shearExp*shearExp/k/(zref - z0)**2 # dU_dzref[idx] = self.spline.eval_deriv_params(z[idx], 0.0, dx2_dzref, 0.0, 0.0, 0.0, dg2_dzref) J = hstack([dU_dUref, np.diag(dU_dz), dU_dzref]) return J