Skip to content
Snippets Groups Projects
Commit 0145e006 authored by Elias Pipping's avatar Elias Pipping
Browse files

[Problem] Use the original coordinate system

The original coordinates are used and then rotated

This also reveals that the left angle is closer to 15.1 degrees than to
15; new calculations thus yield slightly different results
parent fb6e075c
Branches
No related tags found
No related merge requests found
...@@ -4,58 +4,50 @@ ...@@ -4,58 +4,50 @@
\usetikzlibrary{calc} \usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing} \usetikzlibrary{decorations.pathreplacing}
\usepackage{siunitx} \usepackage{siunitx}
\begin{document} \begin{document}
\begin{tikzpicture}[scale=12] \pgfmathsetmacro{\rightleg}{0.27}
\pgfmathsetmacro{\rightleg}{0.27}; \pgfmathsetmacro{\leftleg}{1.00}
\pgfmathsetmacro{\leftleg}{1.00}; \pgfmathsetmacro{\leftangle}{atan(\rightleg/\leftleg)}
\pgfmathsetmacro{\hypot}{sqrt(\leftleg^2+\rightleg^2)}; \begin{tikzpicture}[scale=12, rotate=\leftangle]
\pgfmathsetmacro{\myangle}{atan(\rightleg/\leftleg)}; \pgfmathsetmacro{\mysin}{sin(\leftangle)}
\pgfmathsetmacro{\ssin}{sin(\myangle)}; \pgfmathsetmacro{\mycos}{cos(\leftangle)}
\pgfmathsetmacro{\scos}{cos(\myangle)}; \pgfmathsetmacro{\viscoheight}{0.06}
\pgfmathsetmacro{\lsin}{sin(90-\myangle)}; \pgfmathsetmacro{\Zx}{0.35}
\pgfmathsetmacro{\weaklen}{0.20}
\coordinate (A) at (0,0); \coordinate (A) at (0,0);
\node at (A) [left] {A}; \node at (A) [left] {A};
\coordinate (B) at (\hypot,0); \coordinate (B) at (\leftleg,-\rightleg);
\node at (B) [right] {B}; \node at (B) [right] {B};
\coordinate (C) at (\lsin, \rightleg*\lsin); \coordinate (C) at (\leftleg,0);
\node at (C) [above] {C}; \node at (C) [right] {C};
\draw (A) \draw (A) -- (B) -- (C) -- node [above=.5cm, sloped] {$\overline{AC}=\SI{100}{cm}$} (A);
-- (B)
-- (C)
-- node [above=.5cm, sloped] {$\overline{AC}=\SI{100}{cm}$} (A);
\coordinate (Y) at ($(0.35/\lsin, 0)$); \coordinate (Z) at (\Zx,0);
\node at (Y) [below right] {Y};
\coordinate (Z) at ($(0.35*\lsin,0.35*\ssin)$);
\node at (Z) [above] {Z}; \node at (Z) [above] {Z};
\coordinate (X) at ($(Y) - (0.20,0)$); \coordinate (Y) at ($(\Zx,-\Zx/\leftleg * \rightleg)$);
\node at (X) [below left] {X}; \node at (Y) [below] {Y};
\path let \p1 = (X), \p2 = (Y), \p3 = (Z) in \coordinate (X) at ($(Y) + (-\weaklen*\mycos,\weaklen*\mysin)$);
coordinate (U) at ($(\x1 * \x3 / \x2, \x1 * \y3 / \x2)$); \node at (X) [below] {X};
\path let \p1 = (X) in coordinate (U) at ($(\x1, 0)$);
\node at (U) [above] {U}; \node at (U) [above] {U};
\path (A) -- node [above=.25cm, sloped] {$\overline{AZ} = \SI{35}{cm}$} (Z); \path (A) -- node [above=.25cm, sloped] {$\overline{AZ} = \SI{35}{cm}$} (Z);
\draw[color=red, thick] (X) \draw[color=red, thick] (X) -- node [below=.25cm] {$\overline{XY}=\SI{20}{cm}$} (Y);
-- node [below=.25cm, sloped] {$\overline{XY}=\SI{20}{cm}$} (Y);
\draw[dashed] (Y) -- (Z); \draw[dashed] (Y) -- (Z);
\draw[dashed] (U) -- (X); \draw[dashed] (U) -- (X);
\coordinate (K) at ($(B) - (0.06 / \ssin,0)$); \coordinate (K) at ($(B) + (-\leftleg * \viscoheight / \rightleg,\viscoheight)$);
\node at (K) [below] {K}; \node at (K) [below] {K};
\coordinate (M) at ($(B) + (-0.06 * \ssin, 0.06 * \lsin)$); \coordinate (M) at ($(B) + (0, \viscoheight)$);
\node at (M) [right] {M}; \node at (M) [right] {M};
\path (C) -- node [right=.5cm] {$\overline{CM} = \SI{21}{cm}$} (M); \path (C) -- node [right=.5cm] {$\overline{CM} = \SI{21}{cm}$} (M);
\draw[thick] (K) \path[fill=blue] (K) -- (B) -- node [right=.75cm] {$\overline{BM}=\SI{6}{cm}$} (M) -- cycle;
-- (B)
-- node [right=.75cm] {$\overline{BM}=\SI{6}{cm}$} (M) -- cycle;
\coordinate (G) at ($(A) ! 0.5 ! (X)$); \coordinate (G) at ($(A) ! 0.5 ! (X)$);
\node at (G) [below] {G}; \node at (G) [below] {G};
...@@ -67,11 +59,7 @@ ...@@ -67,11 +59,7 @@
\coordinate (I) at ($(Y) + (G)$); \coordinate (I) at ($(Y) + (G)$);
\node at (I) [below] {I}; \node at (I) [below] {I};
% Note: Lengths and position are arbitrarily chosen here \node[align=left] at (0.5,-0.225) {
\draw[->] (0.4,0.45) -- node [above, sloped] {vertical} +(-0.15*\ssin,0.15*\scos);
\draw[->] (0.4,0.45) -- node [above, sloped] {horizontal} +(-0.15*\scos,-0.15*\ssin);
\node[align=left] at (0.5,-0.125) {
$Z$: coast line\\ $Z$: coast line\\
$\overline{XY}$: velocity weakening zone\\ $\overline{XY}$: velocity weakening zone\\
$BKM$: visco-elastic domain}; $BKM$: visco-elastic domain};
......
...@@ -53,14 +53,13 @@ void MyGeometry::render() { ...@@ -53,14 +53,13 @@ void MyGeometry::render() {
cr->scale(widthScale, heightScale); cr->scale(widthScale, heightScale);
cr->translate(0.1, 0.1); cr->translate(0.1, 0.1);
cr->rotate(leftAngle);
cr->set_line_width(0.0025); cr->set_line_width(0.0025);
// triangle // triangle
{ {
moveTo(A); moveTo(reference::A);
lineTo(B); lineTo(reference::B);
lineTo(C); lineTo(reference::C);
cr->close_path(); cr->close_path();
cr->stroke(); cr->stroke();
} }
...@@ -70,10 +69,10 @@ void MyGeometry::render() { ...@@ -70,10 +69,10 @@ void MyGeometry::render() {
cr->save(); cr->save();
std::vector<double> dashPattern = { 0.005 }; std::vector<double> dashPattern = { 0.005 };
cr->set_dash(dashPattern, 0); cr->set_dash(dashPattern, 0);
moveTo(Z); moveTo(reference::Z);
lineTo(Y); lineTo(reference::Y);
moveTo(U); moveTo(reference::U);
lineTo(X); lineTo(reference::X);
cr->stroke(); cr->stroke();
cr->restore(); cr->restore();
} }
...@@ -82,9 +81,9 @@ void MyGeometry::render() { ...@@ -82,9 +81,9 @@ void MyGeometry::render() {
{ {
cr->save(); cr->save();
setRGBColor(0x0097E0); setRGBColor(0x0097E0);
moveTo(B); moveTo(reference::B);
lineTo(K); lineTo(reference::K);
lineTo(M); lineTo(reference::M);
cr->fill(); cr->fill();
cr->restore(); cr->restore();
} }
...@@ -94,8 +93,8 @@ void MyGeometry::render() { ...@@ -94,8 +93,8 @@ void MyGeometry::render() {
cr->save(); cr->save();
setRGBColor(0x7AD3FF); setRGBColor(0x7AD3FF);
cr->set_line_width(0.005); cr->set_line_width(0.005);
moveTo(X); moveTo(reference::X);
lineTo(Y); lineTo(reference::Y);
cr->stroke(); cr->stroke();
cr->restore(); cr->restore();
} }
...@@ -109,19 +108,19 @@ void MyGeometry::render() { ...@@ -109,19 +108,19 @@ void MyGeometry::render() {
cr->save(); cr->save();
setRGBColor(0x002F47); setRGBColor(0x002F47);
drawCircle(A); drawCircle(reference::A);
drawCircle(B); drawCircle(reference::B);
drawCircle(C); drawCircle(reference::C);
drawCircle(Y); drawCircle(reference::Y);
drawCircle(X); drawCircle(reference::X);
drawCircle(Z); drawCircle(reference::Z);
drawCircle(U); drawCircle(reference::U);
drawCircle(K); drawCircle(reference::K);
drawCircle(M); drawCircle(reference::M);
drawCircle(G); drawCircle(reference::G);
drawCircle(H); drawCircle(reference::H);
drawCircle(J); drawCircle(reference::J);
drawCircle(I); drawCircle(reference::I);
cr->restore(); cr->restore();
} }
...@@ -140,19 +139,19 @@ void MyGeometry::render() { ...@@ -140,19 +139,19 @@ void MyGeometry::render() {
cr->set_font_face(font); cr->set_font_face(font);
cr->set_font_size(0.03); cr->set_font_size(0.03);
label(A, "A"); label(reference::A, "A");
label(B, "B"); label(reference::B, "B");
label(C, "C"); label(reference::C, "C");
label(K, "K"); label(reference::K, "K");
label(M, "M"); label(reference::M, "M");
label(U, "U"); label(reference::U, "U");
label(X, "X"); label(reference::X, "X");
label(Y, "Y"); label(reference::Y, "Y");
label(Z, "Z"); label(reference::Z, "Z");
label(G, "G"); label(reference::G, "G");
label(H, "H"); label(reference::H, "H");
label(J, "J"); label(reference::J, "J");
label(I, "I"); label(reference::I, "I");
cr->restore(); cr->restore();
} }
......
#ifndef SRC_SAND_WEDGE_DATA_MYGEOMETRY_HH #ifndef SRC_MYGEOMETRY_HH
#define SRC_SAND_WEDGE_DATA_MYGEOMETRY_HH #define SRC_MYGEOMETRY_HH
#include <dune/common/fassign.hh>
#include <dune/common/fvector.hh> #include <dune/common/fvector.hh>
#include <dune/fufem/arithmetic.hh> #include <dune/fufem/arithmetic.hh>
...@@ -15,62 +14,93 @@ ...@@ -15,62 +14,93 @@
namespace MyGeometry { namespace MyGeometry {
namespace { namespace {
using LocalVector = Dune::FieldVector<double, 2>; using LocalVector = Dune::FieldVector<double, 2>;
using LocalMatrix = Dune::FieldMatrix<double, 2, 2>;
// kludge because fieldvectors have no initialiser_list constructor, see LocalVector createVector(double x, double y) {
// https://dune-project.org/flyspray/index.php?do=details&task_id=1166 LocalVector ret{ 0 };
LocalVector generateVector(double x, double y) { ret[0] = x;
LocalVector tmp; ret[1] = y;
tmp <<= x, y; return ret;
return tmp;
} }
double degreesToRadians(double degrees) { LocalMatrix createMatrix(double a11, double a12, double a21, double a22) {
return M_PI * degrees / 180; LocalMatrix ret{ 0 };
}; ret[0][0] = a11;
ret[0][1] = a12;
ret[1][0] = a21;
ret[1][1] = a22;
return ret;
}
LocalVector convexCombination(LocalVector const &x, LocalVector const &y) { LocalVector convexCombination(LocalVector const &x, LocalVector const &y) {
LocalVector ret; LocalVector ret{ 0 };
ret = 0.0;
Arithmetic::addProduct(ret, 0.5, x); Arithmetic::addProduct(ret, 0.5, x);
Arithmetic::addProduct(ret, 0.5, y); Arithmetic::addProduct(ret, 0.5, y);
return ret; return ret;
} }
}
double leftLeg = 1.00; namespace reference {
double rightLeg = 0.27; double const rightLeg = 0.27;
double leftAngle = degreesToRadians(15); double const leftLeg = 1.00;
double rightAngle = degreesToRadians(75); double const leftAngle = atan(rightLeg / leftLeg);
double const viscoHeight = 0.06; // Height of the viscous bottom layer
double const weakLen = 0.20; // Length of the weak zone
double const depth = 0.10; LocalVector const A = createVector(0, 0);
} LocalVector const B = createVector(leftLeg, -rightLeg);
LocalVector const C = createVector(leftLeg, 0);
LocalVector const A = generateVector(0, 0); LocalVector const Z = createVector(0.35, 0);
LocalVector const B = generateVector(std::hypot(leftLeg, rightLeg), 0); LocalVector const Y = createVector(0.35, -0.35 / leftLeg * rightLeg);
LocalVector const C = generateVector(leftLeg * std::sin(rightAngle), LocalVector const X = createVector(Y[0] - weakLen * std::cos(leftAngle),
leftLeg * std::sin(leftAngle)); Y[1] + weakLen * std::sin(leftAngle));
LocalVector const Y = generateVector(0.35 / std::sin(rightAngle), 0); LocalVector const U = createVector(X[0], 0);
LocalVector const X = generateVector(Y[0] - 0.20, 0);
LocalVector const Z =
generateVector(0.35 * std::sin(rightAngle), 0.35 * std::sin(leftAngle));
LocalVector const U = generateVector(Z[0] * X[0] / Y[0], Z[1] * X[0] / Y[0]); LocalVector const K =
createVector(B[0] - leftLeg * viscoHeight / rightLeg, B[1] + viscoHeight);
LocalVector const M = createVector(B[0], B[1] + viscoHeight);
LocalVector const K = generateVector(B[0] - 0.06 / std::sin(leftAngle), 0); LocalVector const G = convexCombination(A, X);
LocalVector const M = generateVector(B[0] - 0.06 * std::sin(leftAngle), LocalVector const H = convexCombination(X, Y);
0.06 * std::sin(rightAngle)); LocalVector const J = convexCombination(Y, B);
LocalVector const G = convexCombination(A, X); LocalVector const I = createVector(Y[0] + G[0], Y[1] + G[1]);
LocalVector const H = convexCombination(X, Y);
LocalVector const J = convexCombination(Y, B);
LocalVector const I = generateVector(Y[0] + G[0], 0); LocalVector const zenith = createVector(0, 1);
LocalVector const rotatedZenith = createVector(-1, 0);
LocalVector const zenith = LocalMatrix const rotation =
generateVector(-std::sin(leftAngle), std::cos(leftAngle)); createMatrix(std::cos(leftAngle), -std::sin(leftAngle),
std::sin(leftAngle), std::cos(leftAngle));
}
namespace {
LocalVector rotate(LocalVector const &x) {
LocalVector ret{ 0 };
reference::rotation.mv(x, ret);
return ret;
}
}
LocalVector const A = rotate(reference::A);
LocalVector const B = rotate(reference::B);
LocalVector const C = rotate(reference::C);
LocalVector const G = rotate(reference::G);
LocalVector const H = rotate(reference::H);
LocalVector const I = rotate(reference::I);
LocalVector const J = rotate(reference::J);
LocalVector const K = rotate(reference::K);
LocalVector const M = rotate(reference::M);
LocalVector const U = rotate(reference::U);
LocalVector const X = rotate(reference::X);
LocalVector const Y = rotate(reference::Y);
LocalVector const Z = rotate(reference::Z);
LocalVector const zenith = rotate(reference::zenith);
LocalVector const rotatedZenith = LocalVector const rotatedZenith =
generateVector(-std::cos(leftAngle), -std::sin(leftAngle)); rotate(reference::rotatedZenith); // FIXME: misnomer
double verticalProjection(LocalVector const &); double verticalProjection(LocalVector const &);
double horizontalProjection(LocalVector const &); double horizontalProjection(LocalVector const &);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment