104 cout <<
"In Catenary. XF is " << XF <<
" and ZF is " << ZF << endl;
110 cout <<
"hi" << endl;
118 cout <<
" Warning from catenary: "
119 <<
"Anchor point is above the fairlead point" << endl;
136 LMax = XF - EA / W + sqrt((EA / W) * (EA / W) + 2.0 * ZF * EA / W);
137 if ((L >= LMax) && (CB >= 0.0)) {
141 cout <<
"Warning from Catenary: "
142 <<
"Unstretched line length too large." << endl
143 <<
" d (horiz) is " << XF <<
" and h (vert) is "
144 << ZF <<
" and L is " << L << endl;
156 unsigned int MaxIter = (
unsigned int)(1.0 / Tol);
159 bool FirstIter =
true;
202 T SQRT1VFMinWLOvrHF2;
204 T SQRT1VFMinWLsOvrHF2;
233 if (L <= sqrt(XF2 + ZF2)) {
238 Lamda0 = sqrt(3.0 * ((L * L - ZF2) / XF2 - 1.0));
241 HF = abs(0.5 * W * XF / Lamda0);
242 VF = 0.5 * W * (ZF / tanh(Lamda0) + L);
262 for (
unsigned int I = 1; I <= MaxIter; I++) {
267 VFOvrHF2 = VFOvrHF * VFOvrHF;
268 SQRT1VFOvrHF2 = sqrt(1.0 + VFOvrHF2);
273 LMinVFOvrW = L - VF / W;
274 VFMinWLOvrHF = VFMinWL / HF;
275 VFMinWLOvrHF2 = VFMinWLOvrHF * VFMinWLOvrHF;
276 SQRT1VFMinWLOvrHF2 = sqrt(1.0 + VFMinWLOvrHF2);
281 if ((CB < 0.0) || (W < 0.0) || (VFMinWL > 0.0)) {
283 EXF = (log(VFOvrHF + SQRT1VFOvrHF2) -
284 log(VFMinWLOvrHF + SQRT1VFMinWLOvrHF2)) *
287 EZF = (SQRT1VFOvrHF2 - SQRT1VFMinWLOvrHF2) * HFOvrW +
288 LOvrEA * (VF - 0.5 * WL) - ZF;
289 dXFdHF = (log(VFOvrHF + SQRT1VFOvrHF2) -
290 log(VFMinWLOvrHF + SQRT1VFMinWLOvrHF2)) /
292 ((VFOvrHF + VFOvrHF2 / SQRT1VFOvrHF2) /
293 (VFOvrHF + SQRT1VFOvrHF2) -
294 (VFMinWLOvrHF + VFMinWLOvrHF2 / SQRT1VFMinWLOvrHF2) /
295 (VFMinWLOvrHF + SQRT1VFMinWLOvrHF2)) /
299 ((1.0 + VFOvrHF / SQRT1VFOvrHF2) / (VFOvrHF + SQRT1VFOvrHF2) -
300 (1.0 + VFMinWLOvrHF / SQRT1VFMinWLOvrHF2) /
301 (VFMinWLOvrHF + SQRT1VFMinWLOvrHF2)) /
303 dZFdHF = (SQRT1VFOvrHF2 - SQRT1VFMinWLOvrHF2) / W -
304 (VFOvrHF2 / SQRT1VFOvrHF2 -
305 VFMinWLOvrHF2 / SQRT1VFMinWLOvrHF2) /
308 (VFOvrHF / SQRT1VFOvrHF2 - VFMinWLOvrHF / SQRT1VFMinWLOvrHF2) /
311 }
else if (-CB * VFMinWL < HF) {
314 EXF = log(VFOvrHF + SQRT1VFOvrHF2) * HFOvrW -
315 0.5 * CBOvrEA * W * LMinVFOvrW * LMinVFOvrW + LOvrEA * HF +
317 EZF = (SQRT1VFOvrHF2 - 1.0) * HFOvrW + 0.5 * VF * VFOvrWEA - ZF;
319 dXFdHF = log(VFOvrHF + SQRT1VFOvrHF2) / W -
320 ((VFOvrHF + VFOvrHF2 / SQRT1VFOvrHF2) /
321 (VFOvrHF + SQRT1VFOvrHF2)) /
325 ((1.0 + VFOvrHF / SQRT1VFOvrHF2) / (VFOvrHF + SQRT1VFOvrHF2)) /
327 CBOvrEA * LMinVFOvrW - 1.0 / W;
328 dZFdHF = (SQRT1VFOvrHF2 - 1.0 - VFOvrHF2 / SQRT1VFOvrHF2) / W;
329 dZFdVF = (VFOvrHF / SQRT1VFOvrHF2) / W + VFOvrWEA;
334 log(VFOvrHF + SQRT1VFOvrHF2) * HFOvrW -
336 (LMinVFOvrW * LMinVFOvrW -
337 (LMinVFOvrW - HFOvrW / CB) * (LMinVFOvrW - HFOvrW / CB)) +
338 LOvrEA * HF + LMinVFOvrW - XF;
339 EZF = (SQRT1VFOvrHF2 - 1.0) * HFOvrW + 0.5 * VF * VFOvrWEA - ZF;
340 dXFdHF = log(VFOvrHF + SQRT1VFOvrHF2) / W -
341 ((VFOvrHF + VFOvrHF2 / SQRT1VFOvrHF2) /
342 (VFOvrHF + SQRT1VFOvrHF2)) /
344 LOvrEA - (LMinVFOvrW - HFOvrW / CB) / EA;
346 ((1.0 + VFOvrHF / SQRT1VFOvrHF2) / (VFOvrHF + SQRT1VFOvrHF2)) /
349 dZFdHF = (SQRT1VFOvrHF2 - 1.0 - VFOvrHF2 / SQRT1VFOvrHF2) / W;
350 dZFdVF = (VFOvrHF / SQRT1VFOvrHF2) / W + VFOvrWEA;
355 DET = dXFdHF * dZFdVF - dXFdVF * dZFdHF;
359 dHF = (-dZFdVF * EXF + dXFdVF * EZF) / DET;
362 dVF = (dZFdHF * EXF - dXFdHF * EZF) / DET;
369 dHF = dHF * (1.0 - Tol * I);
375 dVF = dVF * (1.0 - Tol * I);
381 dHF = max(dHF, (T)(Tol - 1.0) * HF);
385 if ((abs(dHF) <= abs(Tol * HF)) && (abs(dVF) <= abs(Tol * VF))) {
391 else if ((I == MaxIter) && FirstIter) {
409 if (L <= sqrt(XF2 + ZF2)) {
414 Lamda0 = sqrt(3.0 * ((L * L - ZF2) / XF2 - 1.0));
419 HF = max((T)abs(0.5 * W * XF / Lamda0), Tol);
420 VF = 0.5 * W * (ZF / tanh(Lamda0) + L);
429 else if ((I == MaxIter) && (!FirstIter)) {
433 cout <<
"Reached max iterations without finding solution, "
434 <<
"aborting catenary solver ..." << endl;
450 if ((CB < 0.0) || (W < 0.0) || (VFMinWL > 0.0)) {
457 for (
unsigned int I = 0; I < Nnodes; I++) {
458 if ((s[I] < 0.0) || (s[I] > L)) {
460 cout <<
"Warning from Catenary: "
461 <<
"All line nodes must be located between the anchor "
462 <<
"and fairlead (inclusive) in routine Catenary()"
469 VFMinWLs = VFMinWL + Ws;
470 VFMinWLsOvrHF = VFMinWLs / HF;
472 SQRT1VFMinWLsOvrHF2 = sqrt(1.0 + VFMinWLsOvrHF * VFMinWLsOvrHF);
474 X[I] = (log(VFMinWLsOvrHF + SQRT1VFMinWLsOvrHF2) -
475 log(VFMinWLOvrHF + SQRT1VFMinWLOvrHF2)) *
478 Z[I] = (SQRT1VFMinWLsOvrHF2 - SQRT1VFMinWLOvrHF2) * HFOvrW +
479 sOvrEA * (VFMinWL + 0.5 * Ws);
480 Te[I] = sqrt(HF * HF + VFMinWLs * VFMinWLs);
482 }
else if (-CB * VFMinWL < HF) {
487 HA = HF + CB * VFMinWL;
491 for (
unsigned int I = 0; I < Nnodes; I++) {
492 if ((s[I] < 0.0) || (s[I] > L)) {
494 cout <<
"Warning from Catenary: "
495 <<
"All line nodes must be located between the anchor "
496 <<
"and fairlead (inclusive) in routine Catenary()"
503 VFMinWLs = VFMinWL + Ws;
504 VFMinWLsOvrHF = VFMinWLs / HF;
506 SQRT1VFMinWLsOvrHF2 = sqrt(1.0 + VFMinWLsOvrHF * VFMinWLsOvrHF);
508 if (s[I] <= LMinVFOvrW) {
511 X[I] = s[I] + sOvrEA * (HF + CB * VFMinWL + 0.5 * Ws * CB);
513 Te[I] = HF + CB * VFMinWLs;
516 X[I] = log(VFMinWLsOvrHF + SQRT1VFMinWLsOvrHF2) * HFOvrW +
517 sOvrEA * HF + LMinVFOvrW -
518 0.5 * CB * VFMinWL * VFMinWL / WEA;
519 Z[I] = (-1.0 + SQRT1VFMinWLsOvrHF2) * HFOvrW +
520 sOvrEA * (VFMinWL + 0.5 * Ws) +
521 0.5 * VFMinWL * VFMinWL / WEA;
522 Te[I] = sqrt(HF * HF + VFMinWLs * VFMinWLs);
535 for (
unsigned int I = 0; I < Nnodes; I++) {
536 if ((s[I] < 0.0) || (s[I] > L)) {
538 cout <<
"Warning from Catenary: "
539 <<
"All line nodes must be located between the anchor "
540 <<
"and fairlead (inclusive) in routine Catenary()"
547 VFMinWLs = VFMinWL + Ws;
548 VFMinWLsOvrHF = VFMinWLs / HF;
550 SQRT1VFMinWLsOvrHF2 = sqrt(1.0 + VFMinWLsOvrHF * VFMinWLsOvrHF);
552 if (s[I] <= LMinVFOvrW - HFOvrW / CB) {
558 }
else if (s[I] <= LMinVFOvrW) {
561 X[I] = s[I] - (LMinVFOvrW - 0.5 * HFOvrW / CB) * HF / EA +
562 sOvrEA * (HF + CB * VFMinWL + 0.5 * Ws * CB) +
563 0.5 * CB * VFMinWL * VFMinWL / WEA;
565 Te[I] = HF + CB * VFMinWLs;
568 X[I] = log(VFMinWLsOvrHF + SQRT1VFMinWLsOvrHF2) * HFOvrW +
569 sOvrEA * HF + LMinVFOvrW -
570 (LMinVFOvrW - 0.5 * HFOvrW / CB) * HF / EA;
571 Z[I] = (-1.0 + SQRT1VFMinWLsOvrHF2) * HFOvrW +
572 sOvrEA * (VFMinWL + 0.5 * Ws) +
573 0.5 * VFMinWL * VFMinWL / WEA;
574 Te[I] = sqrt(HF * HF + VFMinWLs * VFMinWLs);
585 reverse(s.begin(), s.end());
586 reverse(X.begin(), X.end());
587 reverse(Z.begin(), Z.end());
588 reverse(Te.begin(), Te.end());
589 for (
unsigned int I = 0; I < Nnodes; I++) {
int longwinded
switch to turn on excessive output for locating crashes
Definition: QSlines.hpp:54
int Catenary(T XF, T ZF, T L, T EA, T W, T CB, T Tol, T *HFout, T *VFout, T *HAout, T *VAout, unsigned int Nnodes, vector< T > &s, vector< T > &X, vector< T > &Z, vector< T > &Te)
Positions and tensions of a single mooring line.
Definition: QSlines.hpp:86