From a4548d5b5a755f413096788ba35940102cd8e557 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Mon, 21 Dec 2015 22:10:43 +0200 Subject: [PATCH] slanted support --- ...-12-18-normal-tangential-coordinates.ipynb | 1044 +++++++++++------ 1 file changed, 683 insertions(+), 361 deletions(-) diff --git a/notebooks/2015-12-18-normal-tangential-coordinates.ipynb b/notebooks/2015-12-18-normal-tangential-coordinates.ipynb index 63c8c63..fe2fb82 100644 --- a/notebooks/2015-12-18-normal-tangential-coordinates.ipynb +++ b/notebooks/2015-12-18-normal-tangential-coordinates.ipynb @@ -62,7 +62,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "image/svg+xml": [ "\n", "\n", - "\n", - " \n", + "\n", + " \n", " x\n", " \n", - " \n", + " \n", " -0.5\n", " 0.0\n", " 0.5\n", " 1.0\n", " \n", - "\n", - " \n", - " \n", + "\n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " n\n", + " \n", + " \n", + " n\n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " t\n", " \n", - " \n", - " 1\n", - " 2\n", - " 3\n", + " \n", + " 1\n", + " 2\n", + " 3\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", " \n", " \n", "\n", - " \n", + " \n", " -0.5\n", " 0.0\n", " 0.5\n", " 1.0\n", " \n", - " \n", + " \n", " y\n", " \n", "\n", "\n", - " \n", + " \n", " \n", "\n", - " \n", + " \n", " \n", " \n", "\n", @@ -167,12 +167,12 @@ " stroke-width=\"0.3\"\n", " font-size=\"3.88\"\n", "\n", - " id=\"img-1daa5f34\">\n", - "\n", - " \n", + " id=\"img-9c166513\">\n", + "\n", + " \n", " x\n", " \n", - " \n", + " \n", " -2.5\n", " -2.0\n", " -1.5\n", @@ -327,12 +327,12 @@ " 2.4\n", " 2.5\n", " \n", - "\n", - " \n", - " \n", + "\n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -487,7 +487,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -642,60 +642,60 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " n\n", + " \n", + " \n", + " n\n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " t\n", " \n", - " \n", - " 1\n", - " 2\n", - " 3\n", + " \n", + " 1\n", + " 2\n", + " 3\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", "\n", - " \n", + " \n", " -2.5\n", " -2.0\n", " -1.5\n", @@ -850,15 +850,15 @@ " 2.4\n", " 2.5\n", " \n", - " \n", + " \n", " y\n", " \n", "\n", "\n", - " \n", + " \n", " \n", "\n", - " \n", + " \n", " \n", " \n", "\n", @@ -1959,64 +1959,64 @@ " factory(glob.Snap, glob.Gadfly);\n", " }\n", "})(window, function (Snap, Gadfly) {\n", - " var fig = Snap(\"#img-1daa5f34\");\n", - "fig.select(\"#img-1daa5f34-5\")\n", + " var fig = Snap(\"#img-9c166513\");\n", + "fig.select(\"#img-9c166513-5\")\n", " .init_gadfly();\n", - "fig.select(\"#img-1daa5f34-7\")\n", + "fig.select(\"#img-9c166513-7\")\n", " .plotroot().data(\"unfocused_ygrid_color\", \"#D0D0E0\")\n", ";\n", - "fig.select(\"#img-1daa5f34-7\")\n", + "fig.select(\"#img-9c166513-7\")\n", " .plotroot().data(\"focused_ygrid_color\", \"#A0A0A0\")\n", ";\n", - "fig.select(\"#img-1daa5f34-8\")\n", + "fig.select(\"#img-9c166513-8\")\n", " .plotroot().data(\"unfocused_xgrid_color\", \"#D0D0E0\")\n", ";\n", - "fig.select(\"#img-1daa5f34-8\")\n", + "fig.select(\"#img-9c166513-8\")\n", " .plotroot().data(\"focused_xgrid_color\", \"#A0A0A0\")\n", ";\n", - "fig.select(\"#img-1daa5f34-20\")\n", + "fig.select(\"#img-9c166513-20\")\n", " .data(\"mouseover_color\", \"#CD5C5C\")\n", ";\n", - "fig.select(\"#img-1daa5f34-20\")\n", + "fig.select(\"#img-9c166513-20\")\n", " .data(\"mouseout_color\", \"#6A6A6A\")\n", ";\n", - "fig.select(\"#img-1daa5f34-20\")\n", + "fig.select(\"#img-9c166513-20\")\n", " .click(Gadfly.zoomslider_zoomin_click)\n", ".mouseenter(Gadfly.zoomslider_button_mouseover)\n", ".mouseleave(Gadfly.zoomslider_button_mouseout)\n", ";\n", - "fig.select(\"#img-1daa5f34-22\")\n", + "fig.select(\"#img-9c166513-22\")\n", " .data(\"max_pos\", 79)\n", ";\n", - "fig.select(\"#img-1daa5f34-22\")\n", + "fig.select(\"#img-9c166513-22\")\n", " .data(\"min_pos\", 62)\n", ";\n", - "fig.select(\"#img-1daa5f34-22\")\n", + "fig.select(\"#img-9c166513-22\")\n", " .click(Gadfly.zoomslider_track_click);\n", - "fig.select(\"#img-1daa5f34-23\")\n", + "fig.select(\"#img-9c166513-23\")\n", " .data(\"max_pos\", 79)\n", ";\n", - "fig.select(\"#img-1daa5f34-23\")\n", + "fig.select(\"#img-9c166513-23\")\n", " .data(\"min_pos\", 62)\n", ";\n", - "fig.select(\"#img-1daa5f34-23\")\n", + "fig.select(\"#img-9c166513-23\")\n", " .data(\"mouseover_color\", \"#CD5C5C\")\n", ";\n", - "fig.select(\"#img-1daa5f34-23\")\n", + "fig.select(\"#img-9c166513-23\")\n", " .data(\"mouseout_color\", \"#6A6A6A\")\n", ";\n", - "fig.select(\"#img-1daa5f34-23\")\n", + "fig.select(\"#img-9c166513-23\")\n", " .drag(Gadfly.zoomslider_thumb_dragmove,\n", " Gadfly.zoomslider_thumb_dragstart,\n", " Gadfly.zoomslider_thumb_dragend)\n", ";\n", - "fig.select(\"#img-1daa5f34-24\")\n", + "fig.select(\"#img-9c166513-24\")\n", " .data(\"mouseover_color\", \"#CD5C5C\")\n", ";\n", - "fig.select(\"#img-1daa5f34-24\")\n", + "fig.select(\"#img-9c166513-24\")\n", " .data(\"mouseout_color\", \"#6A6A6A\")\n", ";\n", - "fig.select(\"#img-1daa5f34-24\")\n", + "fig.select(\"#img-9c166513-24\")\n", " .click(Gadfly.zoomslider_zoomout_click)\n", ".mouseenter(Gadfly.zoomslider_button_mouseover)\n", ".mouseleave(Gadfly.zoomslider_button_mouseout)\n", @@ -2101,7 +2101,7 @@ "INFO: Assembling boundary problems...\n", "INFO: Assembling boundary 1: dirichlet boundary conditions\n", "INFO: Solving system\n", - "INFO: UMFPACK: solved in 0.2082831859588623 seconds. norm = 0.16197088596792505\n" + "INFO: UMFPACK: solved in 0.20885300636291504 seconds. norm = 0.16197088596792505\n" ] }, { @@ -2119,13 +2119,13 @@ "output_type": "stream", "text": [ "INFO: timing info for iteration:\n", - "INFO: boundary assembly : 0.1141359806060791\n", - "INFO: field assembly : 1.1088120937347412\n", + "INFO: boundary assembly : 0.11499595642089844\n", + "INFO: field assembly : 1.344099998474121\n", "INFO: dump matrices to disk : 1.1920928955078125e-6\n", - "INFO: solve problem : 0.38747596740722656\n", - "INFO: update element data : 0.030972003936767578\n", - "INFO: non-linear iteration : 1.6414198875427246\n", - "INFO: solver finished in 1.7901818752288818 seconds.\n" + "INFO: solve problem : 0.38971495628356934\n", + "INFO: update element data : 0.031152963638305664\n", + "INFO: non-linear iteration : 1.879986047744751\n", + "INFO: solver finished in 2.0280649662017822 seconds.\n" ] } ], @@ -2205,14 +2205,14 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAF6CAYAAAAXoJOQAAAABmJLR0QA/wD/AP+gvaeTAAAFlElEQVR4nO3YsU0DQRRF0WdMEe6/NiNRBNYSABIF2Frp6pxkfviiG8xl2zEAst7/3Y/TVgDwCte/49j2deIQAF7jvu14O3sFAK8l9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxAn9ABxQg8QJ/QAcUIPECf0AHFCDxB32Xb83h9nDgHg6W7brv9DD0CQrxuAuPff97Ht88whADzdbdt1+/m6uZ+7BYAXuG87fN0AxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxAk9QJzQA8QJPUCc0APECT1AnNADxF22Hdse2z5P3gLAc922Xf9CD0DUN3uKFY9lvC/DAAAAAElFTkSuQmCC", + "image/png": "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", "image/svg+xml": [ "\n", "\n", - "\n", + "\n", " \n", - " \n", + " \n", " \n", " \n", "\n", @@ -2245,10 +2245,10 @@ " stroke-width=\"0.3\"\n", " font-size=\"3.88\"\n", "\n", - " id=\"img-f5e637be\">\n", - "\n", + " id=\"img-3ca64326\">\n", + "\n", " \n", - " \n", + " \n", " \n", " \n", "\n", @@ -2401,10 +2401,10 @@ "\n" ], "text/plain": [ - "Compose.Context(Measures.BoundingBox{Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}},Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}}}((0.0w,0.0h),(1.0w,1.0h)),Nullable{Compose.UnitBox{S,T,U,V}}(),Nullable{Compose.Rotation{P<:NTuple{N,Measures.Measure}}}(),Nullable{Compose.Mirror}(),Compose.ListNode{Compose.Container}(Compose.Context(Measures.BoundingBox{Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}},Tuple{Measures.Length{:w,Float64},Measures.Length{:h,Float64}}}((0.0w,0.0h),(1.0w,1.0h)),Nullable{Compose.UnitBox{S,T,U,V}}(),Nullable{Compose.Rotation{P<:NTuple{N,Measures.Measure}}}(),Nullable{Compose.Mirror}(),Compose.ListNull{Compose.Container}(),Compose.ListNode{Compose.Form{P<:Compose.FormPrimitive}}(Compose.Form{Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}}([Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}([(0.0cx,0.0cy),(1.0277777777777777cx,0.0cy),(1.0277777777777777cx,0.8888888888888888cy),(0.0cx,0.8888888888888888cy)])],symbol(\"\")),Compose.ListNull{Compose.Form{P<:Compose.FormPrimitive}}()),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.StrokePrimitive}([Compose.StrokePrimitive(RGBA{Float64}(0.0,0.0,0.0,1.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.FillPrimitive}([Compose.FillPrimitive(RGBA{Float64}(0.0,0.0,0.0,0.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.LineWidthPrimitive}([Compose.LineWidthPrimitive(1.0mm)]),Compose.ListNull{Compose.Property{P<:Compose.PropertyPrimitive}}()))),0,false,false,false,false,nothing,nothing,0.0,symbol(\"\")),Compose.ListNull{Compose.Container}()),Compose.ListNode{Compose.Form{P<:Compose.FormPrimitive}}(Compose.Form{Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}}([Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}([(0.0cx,0.0cy),(1.0cx,0.0cy),(1.0cx,1.0cy),(0.0cx,1.0cy)])],symbol(\"\")),Compose.ListNull{Compose.Form{P<:Compose.FormPrimitive}}()),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.StrokePrimitive}([Compose.StrokePrimitive(RGBA{Float64}(0.0,0.0,0.0,1.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.FillPrimitive}([Compose.FillPrimitive(RGBA{Float64}(0.0,0.0,0.0,0.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.LineWidthPrimitive}([Compose.LineWidthPrimitive(1.0mm)]),Compose.ListNull{Compose.Property{P<:Compose.PropertyPrimitive}}()))),0,false,false,false,false,nothing,nothing,0.0,symbol(\"\"))" + "Compose.Context(Measures.BoundingBox{Tuple{Measures.Length{:cx,Int64},Measures.Length{:cy,Int64}},Tuple{Measures.Length{:cx,Int64},Measures.Length{:cy,Int64}}}((0cx,0cy),(1cx,1cy)),Nullable{Compose.UnitBox{S,T,U,V}}(),Nullable{Compose.Rotation{P<:NTuple{N,Measures.Measure}}}(),Nullable{Compose.Mirror}(),Compose.ListNode{Compose.Container}(Compose.Context(Measures.BoundingBox{Tuple{Measures.Length{:cx,Int64},Measures.Length{:cy,Int64}},Tuple{Measures.Length{:cx,Int64},Measures.Length{:cy,Int64}}}((0cx,0cy),(1cx,1cy)),Nullable{Compose.UnitBox{S,T,U,V}}(),Nullable{Compose.Rotation{P<:NTuple{N,Measures.Measure}}}(),Nullable{Compose.Mirror}(),Compose.ListNull{Compose.Container}(),Compose.ListNode{Compose.Form{P<:Compose.FormPrimitive}}(Compose.Form{Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}}([Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}([(0.0cx,0.0cy),(1.0277777777777777cx,0.0cy),(1.0277777777777777cx,0.8888888888888888cy),(0.0cx,0.8888888888888888cy)])],symbol(\"\")),Compose.ListNull{Compose.Form{P<:Compose.FormPrimitive}}()),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.StrokePrimitive}([Compose.StrokePrimitive(RGBA{Float64}(1.0,0.0,0.0,1.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.FillPrimitive}([Compose.FillPrimitive(RGBA{Float64}(0.0,0.0,0.0,0.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.LineWidthPrimitive}([Compose.LineWidthPrimitive(1.0mm)]),Compose.ListNull{Compose.Property{P<:Compose.PropertyPrimitive}}()))),0,false,false,false,false,nothing,nothing,0.0,symbol(\"\")),Compose.ListNull{Compose.Container}()),Compose.ListNode{Compose.Form{P<:Compose.FormPrimitive}}(Compose.Form{Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}}([Compose.SimplePolygonPrimitive{Tuple{Measures.Length{:cx,Float64},Measures.Length{:cy,Float64}}}([(0.0cx,0.0cy),(1.0cx,0.0cy),(1.0cx,1.0cy),(0.0cx,1.0cy)])],symbol(\"\")),Compose.ListNull{Compose.Form{P<:Compose.FormPrimitive}}()),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.StrokePrimitive}([Compose.StrokePrimitive(RGBA{Float64}(0.0,0.0,0.0,1.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.FillPrimitive}([Compose.FillPrimitive(RGBA{Float64}(0.0,0.0,0.0,0.0))]),Compose.ListNode{Compose.Property{P<:Compose.PropertyPrimitive}}(Compose.Property{Compose.LineWidthPrimitive}([Compose.LineWidthPrimitive(1.0mm)]),Compose.ListNull{Compose.Property{P<:Compose.PropertyPrimitive}}()))),0,false,false,false,false,nothing,nothing,0.0,symbol(\"\"))" ] }, - "execution_count": 7, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -2416,11 +2416,11 @@ "u = el1(\"displacement\", 0.0)\n", "x = X+u\n", "\n", - "root = context()\n", + "root = context(0, 0, 1, 1)\n", "p1 = polygon([tuple(X[i][1], X[i][2]) for i=1:4])\n", "p2 = polygon([tuple(x[i][1], x[i][2]) for i=1:4])\n", "undeformed = compose(root, p1, linewidth(1mm), fill(nothing), stroke(\"black\"))\n", - "deformed = compose(root, p2, linewidth(1mm), fill(nothing), stroke(\"black\"))\n", + "deformed = compose(root, p2, linewidth(1mm), fill(nothing), stroke(\"red\"))\n", "compose(undeformed, deformed)" ] }, @@ -2435,7 +2435,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 58, "metadata": { "collapsed": false }, @@ -2446,7 +2446,7 @@ "rot (generic function with 1 method)" ] }, - "execution_count": 7, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } @@ -2457,19 +2457,20 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { - "ename": "LoadError", - "evalue": "LoadError: MethodError: `*` has no method matching *(::Function, ::Array{Float64,1})\nClosest candidates are:\n *(::Any, ::Any, !Matched::Any, !Matched::Any...)\n *{T<:Union{Complex{Float32},Complex{Float64},Float32,Float64},S}(!Matched::Union{DenseArray{T<:Union{Complex{Float32},Complex{Float64},Float32,Float64},2},SubArray{T<:Union{Complex{Float32},Complex{Float64},Float32,Float64},2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, ::Union{DenseArray{S,1},SubArray{S,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}})\n *{TA,TB}(!Matched::Base.LinAlg.AbstractTriangular{TA,S<:AbstractArray{T,2}}, ::Union{DenseArray{TB,1},DenseArray{TB,2},SubArray{TB,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD},SubArray{TB,2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}})\n ...\nwhile loading In[9], in expression starting on line 10", - "output_type": "error", - "traceback": [ - "LoadError: MethodError: `*` has no method matching *(::Function, ::Array{Float64,1})\nClosest candidates are:\n *(::Any, ::Any, !Matched::Any, !Matched::Any...)\n *{T<:Union{Complex{Float32},Complex{Float64},Float32,Float64},S}(!Matched::Union{DenseArray{T<:Union{Complex{Float32},Complex{Float64},Float32,Float64},2},SubArray{T<:Union{Complex{Float32},Complex{Float64},Float32,Float64},2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, ::Union{DenseArray{S,1},SubArray{S,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}})\n *{TA,TB}(!Matched::Base.LinAlg.AbstractTriangular{TA,S<:AbstractArray{T,2}}, ::Union{DenseArray{TB,1},DenseArray{TB,2},SubArray{TB,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD},SubArray{TB,2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}})\n ...\nwhile loading In[9], in expression starting on line 10", - "" - ] + "data": { + "text/plain": [ + "false" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -2479,14 +2480,15 @@ "\n", "# 2d rotation matrix\n", "#ϕ = -pi/4\n", - "ϕ = 0\n", - "rmat(ϕ) = [cos(ϕ) -sin(ϕ); sin(ϕ) cos(ϕ)]\n", + "phi = pi/10\n", + "#phi = 0.0\n", + "rmat(phi) = [cos(phi) -sin(phi); sin(phi) cos(phi)]\n", "\n", "geometry = Dict{Int64, Node}(\n", - " 1 => rmat*[0.0, 0.0],\n", - " 2 => rmat*[1.0, 0.0],\n", - " 3 => rmat*[1.0, 1.0],\n", - " 4 => rmat*[0.0, 1.0])\n", + " 1 => rmat(phi)*[0.0, 0.0],\n", + " 2 => rmat(phi)*[1.0, 0.0],\n", + " 3 => rmat(phi)*[1.0, 1.0],\n", + " 4 => rmat(phi)*[0.0, 1.0])\n", "el1 = Quad4([1, 2, 3, 4])\n", "el2 = Seg2([3, 4]) # load\n", "el3 = Seg2([1, 2]) # symmetry 2\n", @@ -2510,12 +2512,12 @@ "push!(solver, boundary)\n", "solver.method = :UMFPACK\n", "solver.nonlinear_problem = false\n", - "call(solver, 0.0)" + "#call(solver, 0.0)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 77, "metadata": { "collapsed": false }, @@ -2523,41 +2525,14 @@ { "data": { "text/plain": [ - "7x7 Array{Float64,2}:\n", - " 0.333333 0.0 0.0 0.0 0.0 0.0 0.166667\n", - " 0.0 0.333333 0.0 0.166667 0.0 0.0 0.0 \n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - " 0.0 0.166667 0.0 0.333333 0.0 0.0 0.0 \n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", - " 0.166667 0.0 0.0 0.0 0.0 0.0 0.333333" + "8x1 sparse matrix with 4 Float64 entries:\n", + "\t[5, 1] = 15.4508\n", + "\t[6, 1] = -47.5528\n", + "\t[7, 1] = 15.4508\n", + "\t[8, 1] = -47.5528" ] }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "full(JuliaFEM.Core.assemble(boundary, 0.0).stiffness_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "8x1 sparse matrix with 2 Float64 entries:\n", - "\t[6, 1] = -50.0\n", - "\t[8, 1] = -50.0" - ] - }, - "execution_count": 6, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -2569,7 +2544,7 @@ }, { "cell_type": "code", - "execution_count": 264, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -2578,24 +2553,27 @@ "name": "stdout", "output_type": "stream", "text": [ + "B\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 4.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0\n", - " 0.0 4.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0\n", + "C\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 4.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0\n", - " 0.0 4.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "D\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", @@ -2609,168 +2587,224 @@ } ], "source": [ - "# normal version\n", - "m = 1/6*[2 1; 1 2]*6\n", - "C1 = spzeros(8, 8)\n", - "C1[[1,3],[1,3]] += m\n", - "C1[[2,4],[2,4]] += m\n", - "C1[[1,7],[1,7]] += m\n", - "C1[[2,8],[2,8]] += m\n", + "# biorthogonal version\n", + "m = [1 0; 0 1]\n", + "#m = 1/6*[2 1; 1 2]\n", "\n", + "\n", + "B = spzeros(8, 8)\n", + "C = spzeros(8, 8)\n", "D = spzeros(8, 8)\n", - "C2 = spzeros(8, 8)\n", - "C2[[1,3],[1,3]] += m\n", - "C2[[2,4],[2,4]] += m\n", - "C2[[1,7],[1,7]] += m\n", - "C2[[2,8],[2,8]] += m\n", "\n", - "#C1[:, [3,4]] = (rot(pi/2)'*C1[:, [3,4]]')'\n", - "#C2[:, [3,4]] = (rot(pi/2)'*C2[:, [3,4]]')'\n", - "#C1[[3,4], :] = rot(pi/2)'*C1[[3,4], :]\n", - "#C2[[3,4], :] = rot(pi/2)'*C2[[3,4], :]\n", + "B[[1,3],[1,3]] += m\n", + "B[[2,4],[2,4]] += m\n", "\n", - "# eliminate tangential constraint\n", - "C1[:, 3] = 0\n", - "C2[:, 3] = 0\n", - "#C1[3, :] = 0\n", - "#C2[3, :] = 0\n", + "B[[1,7],[1,7]] += m\n", + "B[[2,8],[2,8]] += m\n", "\n", - "C1[:, 8] = 0\n", - "C2[:, 8] = 0\n", - "#C1[8, :] = 0\n", - "#C2[8, :] = 0\n", + "B[[3,5],[3,5]] += m\n", + "B[[4,6],[4,6]] += m\n", "\n", - "dump(round(full(C1), 3))\n", - "dump(round(full(C2), 3))\n", + "B[[7,5],[7,5]] += m\n", + "B[[8,6],[8,6]] += m\n", + "\n", + "# version 1\n", + "\n", + "tangents = Vector{Float64}[\n", + " rmat(phi)*[1.0, 0.0],\n", + " rmat(phi)*[1.0, 0.0],\n", + " rmat(phi)*[0.0, 1.0],\n", + " rmat(phi)*[0.0, 1.0]]\n", + "\n", + "normals = Vector{Float64}[rot(pi/2)*t for t in tangents]\n", + "\n", + "#=\n", + "# fixed in every direction\n", + "C[1, [1,2]] = normals[1]\n", + "C[2, [1,2]] = tangents[1]\n", + "#C[1,1] = 1.0\n", + "#C[2,2] = 1.0\n", + "# normal fixed, tangential free\n", + "C[3, [3,4]] = normals[2]\n", + "D[4, [3,4]] = tangents[2]\n", + "# allowed to move in n and t directions (inactive)\n", + "D[5, [5,6]] = normals[3]\n", + "D[6, [5,6]] = tangents[3]\n", + "#D[5,5] = 1.0\n", + "#D[6,6] = 1.0\n", + "# normal fixed, tangential free\n", + "C[7, [7,8]] = normals[4]\n", + "D[8, [7,8]] = tangents[4]\n", + "=#\n", + "\n", + "println(\"B\")\n", + "dump(round(full(B), 3))\n", + "println(\"C\")\n", + "dump(round(full(C), 3))\n", + "println(\"D\")\n", "dump(round(full(D), 3))" ] }, { "cell_type": "code", - "execution_count": 371, + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "using JuliaFEM.Core: SparseMatrixCOO\n", + "\n", + "\"\"\"\n", + "For general problem type\n", + "Au + C₁'λ = f\n", + "C₂u + Dλ = g\n", + "\"\"\"\n", + "type BoundaryAssembly\n", + " C1 :: SparseMatrixCOO\n", + " C2 :: SparseMatrixCOO\n", + " D :: SparseMatrixCOO\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0\n" - ] + "data": { + "text/plain": [ + "BoundaryAssembly" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# biorthogonal version\n", - "m = [1 0; 0 1]\n", - "#m = 1/6*[2 1; 1 2]\n", - "C1 = spzeros(8, 8)\n", - "C1[[1,3],[1,3]] += m\n", - "C1[[2,4],[2,4]] += m\n", - "C1[[1,7],[1,7]] += m\n", - "C1[[2,8],[2,8]] += m\n", - "\n", - "C1[[3,5],[3,5]] += m\n", - "C1[[4,6],[4,6]] += m\n", - "C1[[7,5],[7,5]] += m\n", - "C1[[8,6],[8,6]] += m\n", - "\n", - "D = spzeros(8, 8)\n", - "C2 = spzeros(8, 8)\n", - "#C2[[1,3],[1,3]] += m\n", - "#C2[[2,4],[2,4]] += m\n", - "#C2[[1,7],[1,7]] += m\n", - "#C2[[2,8],[2,8]] += m\n", - "#C2[[3,4],:] = rot(pi/2)*C2[[3,4],:]\n", - "\n", - "# working\n", - "#=\n", - "C2[1, 1] = 1.0\n", - "C2[2, 2] = 1.0\n", - "D[3, 3] = 1.0\n", - "C2[4, 4] = 1.0\n", - "C2[7, 7] = 1.0\n", - "D[8, 8] = 1.0\n", - "=#\n", - "\n", - "tangents = Vector{Float64}[\n", - " [1.0, 0.0],\n", - " [1.0, 0.0],\n", - " [0.0, 1.0],\n", - " [0.0, 1.0]]\n", - "\n", - "normals = Vector{Float64}[rot(pi/2)*t for t in tangents]\n", - "\n", - "#t1 = [1, 0]\n", - "#n1 = rot(pi/2)*t1\n", - "# both N and T fixed\n", - "C2[1, [1,2]] = normals[1]\n", - "C2[2, [1,2]] = tangents[1]\n", - "\n", - "#t2 = [1, 0]\n", - "#n2 = rot(pi/2)*t2\n", - "# normal direction fixed, tangential allowed to move\n", - "C2[3, [3,4]] = normals[2]\n", - "D[4, [3,4]] = tangents[2]\n", - "#C1[4, :] = 0\n", - "\n", - "#t3 = [0, 1]\n", - "#n3 = rot(pi/2)*t3\n", - "# allowed to move in n and t directions\n", - "#D[5, [5,6]] = normals[3]\n", - "#D[6, [5,6]] = tangents[3]\n", - "D[5,5] = 1.0\n", - "D[6,6] = 1.0\n", - "\n", - "#t4 = [0, -1]\n", - "#n4 = rot(pi/2)*t4\n", - "# normal fixed, tangential free\n", - "C2[7, [7,8]] = normals[4]\n", - "D[8, [7,8]] = tangents[4]\n", - "#C2[6, :] = 0\n", - "\n", - "#D[4,:] = 0\n", - "#D[8,:] = 0\n", - "#C1[4,:] = 0\n", - "#C1[:,4] = 0\n", - "#C1[8,:] = 0\n", - "#C1[:,8] = 0\n", - "\n", - "\n", - "dump(round(full(C1), 3))\n", - "dump(round(full(C2), 3))\n", - "dump(round(full(D), 3))" + "function BoundaryAssembly()\n", + " return BoundaryAssembly(SparseMatrixCOO(), SparseMatrixCOO(), SparseMatrixCOO())\n", + "end" ] }, { "cell_type": "code", - "execution_count": 372, + "execution_count": 78, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: De = [0.49999999999999994 0.0\n", + " 0.0 0.49999999999999994]\n", + "INFO: De = [0.49999999999999994 0.0\n", + " 0.0 0.49999999999999994]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Array(Float64,(8,8)) 8x8 Array{Float64,2}" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: De = [0.49999999999999994 0.0\n", + " 0.0 0.49999999999999994]\n", + "INFO: De = [0.49999999999999994 0.0\n", + " 0.0 0.49999999999999994]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ":\n", + " 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0\n", + "Array(Float64,(7,8)) 7x8 Array{Float64,2}:\n", + " 1.28 2.52 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 -0.62 1.9 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.9 0.62\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 2.52 -1.28 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 1.9 0.62 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.62 -1.9\n" + ] + } + ], + "source": [ + "using JuliaFEM.Core: get_gdofs, get_integration_points, get_jacobian, add!, get_connectivity\n", + "\n", + "function do_boundary()\n", + " assembly = BoundaryAssembly()\n", + " field_dim = 2\n", + " time = 0.0\n", + " for element in [el3, el4]\n", + " gdofs = get_gdofs(element, field_dim)\n", + " for ip in get_integration_points(element, Val{2})\n", + " w = ip.weight\n", + " J = get_jacobian(element, ip, time)\n", + " N = element(ip, time)\n", + " N_bo = [1/2*(1-3*ip.xi[1]) 1/2*(1+3*ip.xi[1])]\n", + " #C1 = w*N_bo'*N*norm(J)\n", + " De = eye(2)*norm(J)\n", + " info(\"De = $De\")\n", + " # add to C1\n", + " for i=1:field_dim\n", + " ldofs = gdofs[i:field_dim:end]\n", + " add!(assembly.C1, ldofs, ldofs, De)\n", + " end\n", + " # add to C2\n", + " nt = element(\"normal-tangential coordinates\", ip, time)\n", + " nt = transpose(nt)\n", + " normal = nt[1,:]\n", + " tangent = nt[2,:]\n", + " for nid in get_connectivity(element)\n", + " ndofs = [2*(nid-1)+1, 2*(nid-1)+2]\n", + " add!(assembly.C2, [2*(nid-1)+1], ndofs, normal)\n", + " add!(assembly.D, [2*(nid-1)+2], ndofs, tangent)\n", + " end\n", + " end\n", + " end\n", + " return assembly\n", + "end\n", + "\n", + "ntass = do_boundary()\n", + "ENV[\"COLUMNS\"] = 300\n", + "dump(round(full(ntass.C1), 2))\n", + "dump(round(full(ntass.C2), 2))\n", + "dump(round(full(ntass.D), 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 98, "metadata": { "collapsed": false }, @@ -2791,7 +2825,7 @@ " 0.0 0.0 -0.111111 -0.111111 -25.0 -25.0 0.0 0.0" ] }, - "execution_count": 372, + "execution_count": 98, "metadata": {}, "output_type": "execute_result" }, @@ -2806,17 +2840,10 @@ ], "source": [ "g = spzeros(8, 1)\n", - "A = [K C1'; C2 D]\n", - "b = [f; g; h]\n", + "A = [K B'; C D]\n", + "b = [f; g]\n", "\n", "info(\"size of A = $(size(A))\")\n", - "E = spzeros(2, 16)\n", - "E[2,16] = 1.0\n", - "h = spzeros(2, 1)\n", - "#A = [A E'; E spzeros(2,2)]\n", - "#b = [b; h]\n", - "#full(A)\n", - "\n", "ENV[\"COLUMNS\"] = 300\n", "\n", "dim = size(A, 1)\n", @@ -2841,7 +2868,7 @@ }, { "cell_type": "code", - "execution_count": 373, + "execution_count": 87, "metadata": { "collapsed": false }, @@ -2854,7 +2881,7 @@ " -0.111111 " ] }, - "execution_count": 373, + "execution_count": 87, "metadata": {}, "output_type": "execute_result" } @@ -2865,16 +2892,179 @@ }, { "cell_type": "code", - "execution_count": 374, + "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: displacement on tip: [0.027777777777777783,-0.11111111111111115], magnitude = 0.11453071182271282\n" + "data": { + "text/plain": [ + "Test Passed\n", + " Expression: isapprox(norm(u[:,3]),0.11453071182271282)" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@test isapprox(norm(u[:,3]), 0.11453071182271282)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "16x16 Array{Int64,2}:\n", + " 440 150 -260 -30 -220 -150 40 30 2 0 0 0 0 0 0 0\n", + " 150 440 30 40 -150 -220 -30 -260 0 2 0 0 0 0 0 0\n", + " -260 30 440 -150 40 -30 -220 150 0 0 2 0 0 0 0 0\n", + " -30 40 -150 440 30 -260 150 -220 0 0 0 2 0 0 0 0\n", + " -220 -150 40 30 440 150 -260 -30 0 0 0 0 2 0 0 0\n", + " -150 -220 -30 -260 150 440 30 40 0 0 0 0 0 2 0 0\n", + " 40 -30 -220 150 -260 30 440 -150 0 0 0 0 0 0 2 0\n", + " 30 -260 150 -220 -30 40 -150 440 0 0 0 0 0 0 0 2\n", + " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0\n", + " 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "round(Int, T)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "16x16 Array{Float64,2}:\n", + " 351.832 121.353 -231.353 -118.168 -131.832 -121.353 11.3525 118.168 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 121.353 528.168 -58.1678 11.3525 -121.353 -308.168 58.1678 -231.353 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " -231.353 -58.1678 528.168 -121.353 11.3525 58.1678 -308.168 121.353 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 \n", + " -118.168 11.3525 -121.353 351.832 118.168 -231.353 121.353 -131.832 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 \n", + " -131.832 -121.353 11.3525 118.168 351.832 121.353 -231.353 -118.168 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " -121.353 -308.168 58.1678 -231.353 121.353 528.168 -58.1678 11.3525 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 11.3525 58.1678 -308.168 121.353 -231.353 -58.1678 528.168 -121.353 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 \n", + " 118.168 -231.353 121.353 -131.832 -118.168 11.3525 -121.353 351.832 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 \n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 -0.618034 1.90211 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.90211 0.618034 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.90211 0.618034 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.618034 -1.90211" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "C1 = sparse(ntass.C1, 8, 8)\n", + "C2 = sparse(ntass.C2, 8, 8)\n", + "D = sparse(ntass.D, 8, 8)\n", + "A = [K C1'; C2 D]\n", + "A[9,:] = 0\n", + "A[10,:] = 0\n", + "A[9, 1] = 1\n", + "A[10, 2] = 1\n", + "full(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2x8 Array{Float64,2}:\n", + " 0.0 0.0264182 0.0607535 0.0343352 7.72542 15.4508 0.0 0.0\n", + " 0.0 0.00858381 -0.0970891 -0.105673 -23.7764 -47.5528 0.0 0.0" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b = [f; spzeros(8, 1)]\n", + "nz1 = sort(unique(rowvals(A)))\n", + "nz2 = sort(unique(rowvals(A')))\n", + "sol = zeros(length(b))\n", + "sol[nz1] = A[nz1, nz2] \\ full(b)[nz1]\n", + "sol[abs(sol) .< 1.0e-9] = 0\n", + "sol = reshape(sol, 2, 8)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.11453071182271284" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "norm(sol[:,3])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "LoadError", + "evalue": "LoadError: KeyError: displacement not found\nwhile loading In[13], in expression starting on line 1", + "output_type": "error", + "traceback": [ + "LoadError: KeyError: displacement not found\nwhile loading In[13], in expression starting on line 1", + "", + " in getindex at /home/jukka/.julia/v0.4/JuliaFEM/src/elements.jl:94", + " in call at /home/jukka/.julia/v0.4/JuliaFEM/src/elements.jl:130 (repeats 2 times)" ] } ], @@ -2885,21 +3075,44 @@ }, { "cell_type": "code", - "execution_count": 375, + "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { - "data": { - "text/plain": [ - "Test Passed\n", - " Expression: isapprox(norm(u_tip),norm([1 / 36,-1 / 9]))" - ] - }, - "execution_count": 375, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Error During Test\n", + " Test threw an exception of type UndefVarError\n", + " Expression: isapprox(" + ] + }, + { + "ename": "LoadError", + "evalue": "LoadError: There was an error during testing\nwhile loading In[14], in expression starting on line 2", + "output_type": "error", + "traceback": [ + "LoadError: There was an error during testing\nwhile loading In[14], in expression starting on line 2", + "", + " in record at /home/jukka/.julia/v0.4/BaseTestNext/src/BaseTestNext.jl:290", + " in do_test at /home/jukka/.julia/v0.4/BaseTestNext/src/BaseTestNext.jl:192" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "norm(u_tip),norm([1 / 36,-1 / 9]))\n", + " UndefVarError: u_tip not defined\n", + " in anonymous at /home/jukka/.julia/v0.4/BaseTestNext/src/BaseTestNext.jl:165\n", + " in do_test at /home/jukka/.julia/v0.4/BaseTestNext/src/BaseTestNext.jl:181\n", + " in include_string at loading.jl:266\n", + " in execute_request_0x535c5df2 at /home/jukka/.julia/v0.4/IJulia/src/execute_request.jl:177\n", + " in eventloop at /home/jukka/.julia/v0.4/IJulia/src/IJulia.jl:141\n", + " in anonymous at task.jl:447\n" + ] } ], "source": [ @@ -2909,40 +3122,149 @@ }, { "cell_type": "code", - "execution_count": 376, + "execution_count": 108, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "using JuliaFEM.Core: Seg2, Element, update!\n", + "using JuliaFEM.Core: calculate_normal_tangential_coordinates!\n", + "typealias Node Vector{Float64}\n", + "\n", + "nodes = Dict{Int, Node}(\n", + "1 => [0.0, 0.1],\n", + "2 => [1.0, 0.3],\n", + "3 => [2.0, -0.1],\n", + "4 => [3.0, 0.6],\n", + "5 => [4.0, 0.3])\n", + "\n", + "s1 = Seg2([1, 2])\n", + "s2 = Seg2([2, 3])\n", + "s3 = Seg2([3, 4])\n", + "s4 = Seg2([4, 5])\n", + "elems = Element[s1, s2, s3, s4]\n", + "update!(elems, \"geometry\", nodes)\n", + "calculate_normal_tangential_coordinates!([s1, s2, s3, s4], 0.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 109, "metadata": { "collapsed": false }, "outputs": [ { "data": { + "image/png": "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", "text/plain": [ - "16x16 Array{Int64,2}:\n", - " 440 150 -260 -30 -220 -150 40 30 2 0 0 0 0 0 0 0\n", - " 150 440 30 40 -150 -220 -30 -260 0 2 0 0 0 0 0 0\n", - " -260 30 440 -150 40 -30 -220 150 0 0 2 0 0 0 0 0\n", - " -30 40 -150 440 30 -260 150 -220 0 0 0 2 0 0 0 0\n", - " -220 -150 40 30 440 150 -260 -30 0 0 0 0 2 0 0 0\n", - " -150 -220 -30 -260 150 440 30 40 0 0 0 0 0 2 0 0\n", - " 40 -30 -220 150 -260 30 440 -150 0 0 0 0 0 0 2 0\n", - " 30 -260 150 -220 -30 40 -150 440 0 0 0 0 0 0 0 2\n", - " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0\n", - " 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1" + "PyPlot.Figure(PyObject )" ] }, - "execution_count": 376, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(-0.5,4.5)" + ] + }, + "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "round(Int, T)" + "using PyPlot\n", + "fig = figure(figsize=(5, 3))\n", + "for s in [s1, s2, s3, s4]\n", + " X1 = s(\"geometry\", [-1.0], 0.0)\n", + " X2 = s(\"geometry\", [ 1.0], 0.0)\n", + " nt1 = s(\"normal-tangential coordinates\", [-1.0], 0.0)\n", + " nt2 = s(\"normal-tangential coordinates\", [ 1.0], 0.0)\n", + " plot([X1[1],X2[1]], [X1[2],X2[2]], \"-ko\")\n", + " X1N1 = X1 + nt1[:,1]*0.5\n", + " X1T1 = X1 + nt1[:,2]*0.5\n", + " plot([X1[1],X1N1[1]], [X1[2],X1N1[2]], \"-r\")\n", + " plot([X1[1],X1T1[1]], [X1[2],X1T1[2]], \"-g\")\n", + " X2N2 = X2 + nt2[:,1]*0.5\n", + " X2T2 = X2 + nt2[:,2]*0.5\n", + " plot([X2[1],X2N2[1]], [X2[2],X2N2[2]], \"-b\")\n", + " plot([X2[1],X2T2[1]], [X2[2],X2T2[2]], \"-y\")\n", + "end\n", + "axis(\"equal\")\n", + "ylim(-0.5, 1.0)\n", + "xlim(-0.5, 4.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i = 1, normal = [-0.19611613513818404,0.9805806756909202], tangent = [0.9805806756909202,0.19611613513818404], dot = 0" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvwAAAGWCAYAAAAE31cuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X1clHW+//H3IIrgDaZASIqVQoFKKoqoWWq7x7uw1sUbzpbpqeycMjfqhLatWWt1Nqt1zbLNjqmoh1+FtolrN1veVctqgakrkGEYyp2gSSo3CszvjwkSQeRu5hqueT0fj3kMXjPXxYfHqLznO9/v52uxWq1WAQAAADAlN6MLAAAAAGA/BH4AAADAxAj8AAAAgIkR+AEAAAATI/ADAAAAJkbgBwAAAEyMwA8AAACYGIEfAAAAMDECPwAAAGBiBH4AAADAxNztefEvv/xS69at044dO/T999+rR48eioyM1LPPPqugoKArnn/69GnFxcXpvffeU2lpqSIiIvTyyy9r8ODBlz2nqKhIH330ka699lp5enq25o8DAAAAGKa0tFRHjx7V+PHj5ePj0+jzLFar1WqvoqKjo5WcnKxp06YpLCxMeXl5evXVV3X27Fn985//VP/+/S97blVVlUaPHq0DBw4oLi5OPXr00MqVK3Xs2DGlpKSoX79+9Z63ceNG3XXXXfb6kQAAAABDbdiwQb/5zW8a/Xy7Bv7k5GQNGzZM7u4/f5CQmZmpgQMHKjo6WuvXr7/sue+8845mzpypxMRETZ06VZJt9D44OFgTJ07Uxo0b6z3viy++0M0336wNGzYoJCSkdX8gGCI2NlbLli0zugy0Il5Tc+H1NBdeT3Ph9TSX9PR03XXXXfr88881atSoRp9n1yk9I0aMqHOsX79+Cg0NVUZGRoPnJiYmyt/fvybsS5KPj4+mT5+uDRs26MKFC2rfvn2d86qn8YSEhGjIkCEt/AngDLy9vXktTYbX1Fx4Pc2F19NceD3NqanT1h2+aNdqtaqgoOCK84727dtX71/QYcOGqaSkRIcPH7ZXiQAAAIBpODzwb9y4Ubm5uZoxY0aDz8vLy1PPnj3rHK8+lpuba5f6AAAAADNxaODPyMjQQw89pJEjR+qee+5p8LllZWXy8PCoc7xjx46SbKuUAQAAADTMrnP4L5afn6/JkyfrqquuUmJioiwWS4PP9/T0VHl5eZ3jZWVlNY83JDY2Vt7e3rWOxcTEKCYmpomVw2i8ZubDa2ouvJ7mwutpLryebVdCQoISEhJqHSsuLm7WtezapadacXGxxowZo+PHj+uzzz7TjTfeeMVzgoODFRQUpL/97W+1jq9evVr333+/Dh48WG9bz9TUVIWHhyslJYVFKgAAADCN5uZcu0/pKSsrU1RUlDIzM7V169ZGhX1JGjRokFJTU3Xp+5E9e/aoU6dOCg4Otke5AAAAgKnYNfBXVlZqxowZ2rNnj959910NHz683ufl5+crIyNDFRUVNceio6NVUFCgzZs31xwrKirSu+++q6ioqHpbcgIAAACoza5z+B977DElJSUpKipKRUVF2rBhQ63Hq3fEXbhwoeLj43X06FEFBgZKsgX+yMhIzZkzR2lpaTU77VqtVj3zzDP2LBsAAAAwDbsG/v3798tisSgpKUlJSUm1HrNYLDWB32Kx1FnE6+bmpm3btunxxx/XK6+8otLSUkVERCg+Pl5BQUH2LBsAAAAwDYcs2nUkFu0CAADAjJx20S4AAAAA4xD4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATMzugf/cuXNavHixJkyYoO7du8vNzU3r1q1r1Llr166Vm5tbvbcTJ07YuXIAAACg7XO39zcoLCzUkiVL1KdPHw0aNEg7d+6UxWJp0jWWLFmi6667rtYxb2/v1iwTAAAAMCW7B/6AgADl5+fLz89PKSkpGjZsWJOvMXHiRA0ZMsQO1QEAAADmZvcpPR06dJCfn58kyWq1NusaVqtVZ86cUWVlZWuWBgAAAJhem1i0O3bsWHl7e6tTp0664447lJmZaXRJAAAAQJtg9yk9LdGpUyfNmTNHY8eOVdeuXfXVV1/pT3/6k0aOHKnU1FT16tXL6BIBAAAAp+bUgX/atGmaNm1azZ+nTJmi8ePH65ZbbtFzzz2n119/3cDqAAAAAOfn1IG/PqNGjdLw4cP1ySefNPi82NjYOp18YmJiFBMTY8/yAAAAgBZLSEhQQkJCrWPFxcXNulabC/yS1KtXLx0+fLjB5yxbtozOPgAAAGiT6huoTk1NVXh4eJOv1SYW7V7qu+++k6+vr9FlAAAAAE7PaQJ/fn6+MjIyVFFRUXOssLCwzvO2bdum1NRUTZgwwZHlAQAAAG2SQ6b0vPrqqzp9+rRyc3MlSVu2bFF2drYkaf78+eratasWLlyo+Ph4HT16VIGBgZKkkSNHasiQIQoPD5e3t7dSU1P11ltvKTAwUL/73e8cUToAAADQpjkk8L/88sv6/vvvJUkWi0XvvfeeNm/eLIvFolmzZqlr166yWCyyWCy1zps5c6b+9re/6eOPP1ZJSYkCAgL0wAMPaPHixUzpAQAAABrBYm3u9rdOqnoxQ0pKCot2AQAAYBrNzblOM4cfAAAAQOsj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAJid1Sp98YWUlWV0JQAMQOAHAMAVTJki/d//GV0FAAMQ+AEAMDuLRQoJkdLSjK4EgAEI/AAAuIKQECk93egqABiAwA8AgCsICZEyMqSqKqMrAeBgdg/8586d0+LFizVhwgR1795dbm5uWrduXaPPP336tObOnStfX1917txZ48aN0759++xYMQAAJhQSIpWWStnZRlcCwMHsHvgLCwu1ZMkSffPNNxo0aJAkyWKxNOrcqqoqTZ48WQkJCZo/f76WLl2qEydOaMyYMcrMzLRn2QAAmEtoqO2eefyAy7F74A8ICFB+fr6ysrL04osvNuncxMREJScna926dVq0aJEefPBB7dy5U+3atdPixYvtVDEAACbUu7fk5cU8fsAF2T3wd+jQQX5+fpIkq9XapHMTExPl7++vqVOn1hzz8fHR9OnT9f777+vChQutWisAAKbl5ibdeCOBH3BBTr1od9++fRoyZEid48OGDVNJSYkOHz5sQFUAALRRdOoBXJJTB/68vDz17NmzzvHqY7m5uY4uCQCAtqs68DfxE3cAbZtTB/6ysjJ5eHjUOd6xY0dJUmlpqaNLAgCg7QoNlX74QSooMLoSAA7kbnQBDfH09FR5eXmd42VlZTWPX05sbKy8vb1rHYuJiVFMTEzrFgkAQFsREmK7T0+X/P2NrQVAgxISEpSQkFDrWHFxcbOu5dSBv2fPnvVO28nLy5Nk6wB0OcuWLat3/j8AAC6rb1/J3d0W+MeONboaAA2ob6A6NTVV4eHhTb6WU0/pGTRokFJTU+t099mzZ486deqk4OBggyoDAKANat9eCgpi4S7gYpwm8Ofn5ysjI0MVFRU1x6Kjo1VQUKDNmzfXHCsqKtK7776rqKgotW/f3ohSAQBou0JD2XwLcDEOmdLz6quv6vTp0zXTc7Zs2aLsn7b2nj9/vrp27aqFCxcqPj5eR48eVWBgoCRb4I+MjNScOXOUlpamHj16aOXKlbJarXrmmWccUToAAOYSEiKtXm10FQAcyCGB/+WXX9b3338vSbJYLHrvvfe0efNmWSwWzZo1S127dpXFYpHFYql1npubm7Zt26bHH39cr7zyikpLSxUREaH4+HgFBQU5onQAAMwlJETKy5OKi6VLmlsAMCeHTOnJyspSVVWVqqqqVFlZqcrKypqvq0fz16xZU+vP1bp166Y333xThYWFOnv2rLZv385iXAAAmuviTj0AXILTzOEHAAAOcMMNksVC4AdcCIEfAABX4uUlXXstC3cBF0LgBwDA1YSEMMIPuBACPwAArobAD7gUAj8AAK4mJETKypJKS42uBIADEPgBAHA1oaGS1Sp9843RlQBwAAI/AACuhtacgEsh8AMA4Gq6dZP8/Qn8gIsg8AMA4IpYuAu4DAI/AACuiMAPuAwCPwAArig0VDp8WKqoMLoSAHZG4AcAwBWFhEgXLkhHjhhdCQA7I/ADAOCK6NQDuAwCPwAArsjfX/L2JvADLoDADwCAK7JYbPP409KMrgSAnRH4AQBwVXTqAVwCgR+A8UaOlF580egqANcTEiJlZEhVVUZXAsCOCPwAjHfokNEVAK4pJEQ6d046ftzoSgDYEYEfgLFKS6Uff7QtIATgWHTqwZU884y0bJnRVaCFCPwAjFVQYLu/+mpj6wBcUZ8+kqcnC3dRv6oq6fXXpbw8oytBCxH4ARirOvAzwg84Xrt20g03MMKP+n31le3/6KgooytBCxH4ARgrP992zwg/YAw69eBykpKkq66SRowwuhK0EIEfgLEKCiQ3N8nHx+hKANdE4MflJCVJkyZJ7u5GV4IWIvADMFZ+vuTra5taAMDxQkOlkyelwkKjK4EzOXZM2r+f6TwmQeAHYKyCAubvA0aq7tTDwl1cbOtW28j+hAlGV4JWQOAHYKz8fObvA0bq18/2CRvTenCxpCTpllskb2+jK0ErIPADMBYj/ICxOnSwhX4CP6qdOydt3y7dfrvRlaCVEPgBGIsRfsB4LNzFxf7+d6m8nPn7JkLgB2AsRvgB44WGMocfP9u6VbrxRtsnPzAFAj8A45w7J509ywg/YLSQECknR/rxR6MrsbvKSikz0+gqnFhVlS3wM7pvKjRWBWAcdtkFnEN1p56MDCkiwthaWkl5uXT4sO2Di/T0n2+HD9seO3HC1hEYl2B3XVMi8AMwDrvsAs7hxhtt9+npbS7w//ij7X1KdaCvDvjffWcbrJYkPz/be5pRo6T77rPNYOrSxdi6nRa765oSgR+AcRjhB5xDp05Snz5OvXC3sLDuaH1amm0mUrU+fWzBPirKdl9969HDuLrbHHbXNSVeTQDGyc+39f/u3t3oSgCEhBi+cNdqtW3wevFIffXt5Enbc9q1s60lDQmR7rnn51B/ww1S586Glt/2Ve+u+8QTRleCVkbgB2CcggLbdB43+gcAhgsJsY3uOkBFhXTkSN1pOBkZtrX8ktSxo22mUUiI9G//ZpuGExJiC/sdOjikTNfD7rqmReAHYBx68APOIyREWr5cKiuzpe1WUFoqffNN7ZH66oWzFy7YnuPtbQvzN90kzZz584h9nz620Xw4ELvrmhaBH4Bx6MEPOIX09HQ988wz+n9VVRrSpYsOubkpMDBQW7ZsUUh1B58GFBfXHa1PT5eysmzTdCTbP/WQEOnWW6X/+q+fg72/v2Sx2PkHxJVV7677P/9jdCWwAwI/AOPk5//cHQSAIQ4dOqRBgwapa0WFJCmookL7JGVmZiosLEwHDhxQSEiIrFbbe/RLR+vT0qS8PNu1LBbp2mttQf5Xv7Ldh4ba/plfdZVhPyIag911TY3AD8A4BQXSmDFGVwG4tDvvvFMVFRU6JalA0o2ySAqUFKqKihBFRh7UgAEhSk+XfvjBdo67uxQUZAvz995be+Gsl5dxPwtagN11TY3AD8AYVitz+AEnkJ2dXfP1vXpDn+g3kjr9dOSczpz5RtddZ+vUWL1wtm9fqX17Q8qFPVTvrjtrltGVwE4I/HC8e+6RIiNtkzjhus6eta3oYw4/YChr9SR7Sae0S/2VoVSlS0qTdEwWi0Vz5nys0aNHqwPtccyJ3XVNj8APxzt2zBb2CPyujV12AcOVlJSosrKy5s/J+r86z6mqsuoXv/iFunbtqvHjxysqKkqTJk1SD3azMg921zU9ml/D8YYOlVJSjK4CRmOXXcBQKSkpCg8PV1VVVYPP69u3r1JTU/XYY48pKytLs2bNkp+fn0aPHq2lS5cqLS2t1qcEaIPYXdf0CPxwvPBw6fvvpaIioyuBkRjhBwxRWVmp559/XpGRkfLy8lJSUpLcLxP03N3dlZSUpMGDB+upp57Sl19+qZycHL3xxhvq3r27nn76afXv31/9+vXTI488ok8//VTnz5938E+EFqneXZfpPKbmkMBfXl6uBQsWKCAgQF5eXoqMjNQnn3xyxfPWrl0rNze3em8nTpxwQOWwi/Bw2z2j/K6toMC26o9efYDDZGVl6dZbb9WiRYsUFxen5ORk3X777Tpw4ID69eunDh06qH379urQoYP69etX05LzYgEBAbrvvvv0/vvv6+TJk9q6dav+7d/+TYmJifrFL34hX19fTZ8+XevXr9fJkycN+knRaOyu6xIc8tnN7NmztWnTJsXGxiooKEhr1qzRpEmTtGPHDo0aNeqK5y9ZskTXXXddrWPe7ALXdvXta9vFLyVFGj/e6GpglOoOPey4A9id1WrV2rVrNX/+fPn4+GjXrl26+eabax4PCQnRt99+2+Trenp6avLkyZo8ebJWrlypr7/+WklJSUpKStKsWbPk5uamkSNHKioqSlFRUbrxxhtl4d+8c2F3XZdg98C/d+9evf3223rppZf06KOPSpLuvvtuDRgwQHFxcfriiy+ueI2JEydqyJAh9i4VjmKxSEOGMMLv6thlF3CIoqIiPfDAA9q8ebNmz56t5cuXq2vXrq3+fSwWiwYPHlwz/Sc3N1fbtm1TUlKSnn76aS1YsEDXX399Tfin648TYHddl2H3KT2JiYlyd3fX3Llza455eHjo3nvvVXJysnJycq54DavVqjNnztTqJIA2joW7oAc/YHcffvihBg4cqJ07d2rTpk1as2aNXcJ+fZj60wawu67LsHvg37dvn4KDg9W5c+dax4cNGyZJ+vrrr694jbFjx8rb21udOnXSHXfcoczMTLvUCgdi4S4Y4QfspqSkRPPmzdPEiRN100036eDBg5o6daph9VRP/Xn99dd17NixBrv+pKen0/XHUdhd12XYPfDn5eWpZ8+edY5XH8vNzb3suZ06ddKcOXO0cuVK/fWvf1VcXJw+/fRTjRw5UsePH7dbzXAAFu6CEX7ALqrbba5evVorVqzQBx98oICAAKPLqlE99edyXX9CQ0Pp+uMI1bvrMrrvEuwe+EtLS+Xh4VHneMeOHWsev5xp06Zp9erVuuuuuzRlyhT94Q9/0EcffaSTJ0/queees1vNcICLF+7C9VitjPADrezSdpupqamaN2+e0y+SbczUnxkzZjD1p7Wxu65LsfuiXU9PT5WXl9c5XlZWVvN4U4waNUrDhw+/YlvP2NjYOp18YmJiFBMT06TvBzth4a5rKy62zRtlhB9oFVlZWbr77ruVnJyshQsXavHixW1yQSxdfxyI3XWdXkJCghISEmodKy4ubta17B74e/bsWe+0nby8PElq1seMvXr10uHDhxt8zrJly+js4+yGDpXeecfoKmAEdtkFWsWV2m22ZXT9sTN213V69Q1Up6amKrx6WnQT2H1Kz+DBg3X48GGdOXOm1vE9e/ZIkgYNGtTka3733Xfy9fVtlfpgIBbuui522QVarKioSNHR0fqP//gPRUdHa//+/aYJ+/Vh6k8rYnddl2P3wB8dHa3KykqtWrWq5lh5ebnWrFmjyMhIXXPNNZKk/Px8ZWRkqKKiouZ5hYWFda63bds2paamagI7wrV9LNx1XYzwAy1iZLtNZ3C5rj/fffcdXX8ag911XY7dP8eJiIjQtGnT9MQTT+jEiRPq27ev1q1bp+zsbK1Zs6bmeQsXLlR8fLyOHj2qwMBASdLIkSM1ZMgQhYeHy9vbW6mpqXrrrbcUGBio3/3ud/YuHfbGjruuKz9f8vCQXCigAK2hpKREcXFxeu211zR+/Hi99dZbTtWBxwhM/WkGdtd1OQ6ZuBUfH69FixZp/fr1+uGHH3TTTTdp69attT56tFgsdRbezJw5U3/729/08ccfq6SkRAEBAXrggQe0ePFipvSYAQt3XVd1hx4W2wGNlpKSorvuuktHjx7VihUr9NBDD7FgtR7VU3/uu+8+lZaWavv27dq6dasSExNrdhmeMGGCoqKiNHHiRPXo0cPokh2L3XVdksVqss+5qhczpKSksGi3LYiLsy3cPXrU6ErgSPfeK/3rX9JPa3kAXF5lZaVeeOEFLV68WGFhYdqwYYNCQkKMLqvNsVqttbr+fPXVV67Z9eevf5V+9Svp22/ZcKsNam7OtfscfqBBLNx1TfTgBxolKytLt956qxYtWqS4uDglJycT9puJDb9+wu66LonAD2OxcNc1scsu0CCr1ao1a9YoLCxMOTk52rVrl5577jnmnreixnb92bBhg3m6/rC7rssi8MNY7LjrmhjhBy7L1dptOoOGuv7cfffd5un6w+66LovAD2OxcNf1WK22XziM8AN1uHq7TWfQmKk/QUFBbXPqD7vruiwCP4w3dCiB35X88IN04QIj/G3JkSP8G7WzkpISzZs3TxMnTtRNN92kgwcPaurUqUaXBdU/9eeXv/xl25z6w+66LovAD+OxcNe1sMtu2/P889KDDxpdhWmlpKQoPDxcq1ev1ooVK/TBBx+4fG99Z9Wmp/6wu65LI/DDeCzcdS3sstv29O5tCwtoVZWVlXr++ecVGRkpLy8vpaamat68eeZvC2kSjZ36Exsbq08//VQXLlwwtmB213VpBH4Yj4W7roUR/rYnMFDKy5PKy42uxDRot2k+l5v68+677+oXv/iFfHx8jJ36w+66Lo3AD+OxcNe1FBRIXl5S585GV4LGCgy03efkGFuHCdBu0zU43dSf6t11b7/dvt8HTovAD+fAwl3XUd2Dn2kLbUfv3rZ7pvW0CO02XZNTTP35+99tn9Axf99lEfjhHFi46zrowd/2VAf+7Gxj62jDaLeJaoZM/WF3XZdH4IdzYOGu62CX3bbHy0vq0YMR/mag3SYa4pCpP+yuCxH44SxYuOs6GOFvmwIDGeFvotTUVNptotHsNvWH3XUhAj+cBQt3TS89PV1BQUHK3bdPS1atkoeHh4KCgpSenm50aWgMAn+jVbfbHD58OO020WwtmfpTWFioOXPmqH///lo5caKK3dx07//+rwoLCw36aWA0Aj+cBwt3TevQoUMKCwvTkcxM+UnKqarS+fPnlZmZqbCwMEJ/W0Av/ka5uN3m448/TrtNtIqmTP35/PPPNWLECK1du1ZpaWkaeeqUkqqq9FZ8vEaMGEHod1EEfjgPFu6a1p133qmKigp1l0VSOxVc9FhFRYWmTJliVGloLEb4G1Rfu83nn3+edptodVea+jN69GgdOXJEknSNOipU7ZX007lHjhxRXFycccXDMO5GFwDUuHjh7vjxxtaCVlFaWqoDBw4oKytLktRN/dVB+9VOJyXlSyqQlK/vvivSiy/a1vL6+/987+MjtWtn5E+AGr17Sz/+KBUXs3HPJYqKivTAAw9o8+bNmj17tpYvX04HHjhM9dSf++67T6Wlpbrhhht07KdP467XbPnqjyrRR5KSJG3T3r17Da0XxiDww3lcvHCXwN/mVIf7lJSUmtu//vUvVVZW1jznlPI0SnP1lfxVoasl+UsKVFVVhJ591pYnL+bmJvn61n0jcOm9v7/Uvbvt+bCT6s23jh0j8F/kww8/1Jw5c3T+/Hlt2rSJDjwwlKenpzw9PWv+nK1PdZ1e1n5FSVovqVJZWfu0dKltD66QELZEcRUEfjgPFu62GQ2F+/bt22vAgAGKiIjQf/3Xfyk8PFyjRo3S+fPn9YNO6nOtrveaEyfO0D33/KduvPFWFRRYVFBg6+B58f2RI9I//mH787lztc9v1872BqC+NwWXHrvqKn7JNVl14M/OlgYMMLYWJ1BSUqK4uDi99tprGj9+vN566y068MApuLv/HO2+17f6XkskLZHUU9IktWv373r6aWnBAun6623Ne6KipNGjJWagmReBH85l6FDpnXeMrgIXaWq4HzhwoDw8PGpdIzAwUJmZmZf9Hj169ND+/fs1adJY9evXT3PnztU999wjPz+/y55z9qztTUB9bwzy86WMDGnnTtvXZWW1z23f/sqfGlTfd+3KmwNJUs+etndVLNxVamqqfvOb3+jo0aNasWKFHnroITrwwGlEREQoLS2tnkfyJK1WdHSlVq4cp+3bpaQkKTFRWr7c9n/d+PG28D9pkm3rDZiHxdqsXRycV3Xf45SUFA0ZMsToctBUb78tzZwpFRbaJnDDoRoT7ocOHarw8PDLhvv6pKenKywsTBUVFXUec3d314EDB3TjjTfq888/1xtvvKHExERVVVVp6tSpmjt3rsaOHdvsQGW1SmfO1H1DUN+bhIIC6fz52ud7eDTujcHVV0udO5v8zUGfPtJdd0nPPWd0JYaorKzUCy+8oMWLFyssLEwbNmygAw+cTmFhoUaMGFGzcPdiffv2VXJysnx9fWuOWa3S11/bwn9Skq2K8upnAAAeg0lEQVRtv5ubNHKkLfwz9ce5NDfnEvjhXDIzpaAg6cMPmcdvZ5eG+6+++kqHDh1qcbi/nPT0dE2ZMkXZ2dmyWq2yWCwKDAzUli1b6oSmkydPKj4+XqtWrVJGRkajR/1bymqVTp++/KcGF98XFEiXvn/x8qr9BuB//9dko2Q332ybAxAfb3QlDpeVlaW7775bycnJWrBggZ5++mk68MBpFRYWKi4uTnv37lVFRYXc3d0VERGhpUuX1gr79cnNlbZts4X/v/9dKi1l6o8zIfD/hMDfxlmttgnWcXHS735ndDWm4ehw31qsVqtdRv1bQ1WV9MMPDb8x2LRJ6tTJsBJb37//uy0N7NxpdCUOY7VatXbtWs2fP18+Pj5av369br75ZqPLAhyitFQ1U3+2bpVycpj6Y7Tm5lzm8MO5sHC3xRoT7ocPH64HH3zQqcJ9fSwWi0aPHq3Ro0dr+fLlNaP+t912m8NG/S/Hzc32i65HD6l/f4d/e2MEBkr//KfRVTgM7Tbh6jw9pcmTbbdLp/7MmsXUn7aEEX44n7g428Ldo0eNrsTptdWR+5Zw5lF/03vtNSk21rYK2uQ9UC9ut/nmm2/SbhO4BFN/jMGUnp8Q+E2Ahbv1csVwfyVGzfV3WUlJ0pQptt/0PXsaXY1d0G4TaDqm/jgOgf8nBH4TYOEu4b6JGPV3kK+/lgYPlvbskSIijK6m1V3cbvPFF1+k3SbQDHT9sS/m8MM8XGzH3VOnSvXxx9/q1KnP9dVXXyklJaXNzrk3ijPP9TeVizffMlHgv7TdZmpqKu02gWayWGzjAoMHS089VXvqDxt+GYcRfjinceNs3Xo2bTK6klZ16lSp3nvviD7++JT27bPo2DE/lZX1lVQid3dfDRzYn5H7VsKovx1YrVKXLtIf/iA9+qjR1bQK2m0CjsPUn5ZjhB/mYoIddy8f7gdIOi9PzyPq06dA4eEFGj/eR9Om/ShPT8J9a2HU3w4sFql3b1Pstntpu81du3bRbhOwM7r+GIcRfjinNrZw9/Lh3l3V4T4wsFDh4dL48T66886+6tqVcO9ojPq3gvHjbVsKt+FP32i3CTgfuv40DiP8MJfwcNu9E87jb+rIvS3ch0hiTrDRGPVvBb17SwcOGF1Fs13cbnPTpk202wScRECAdN99ttvFU38SE6Xly5n601LmbqSMtuvihbsGOnWqVKtX/0szZuxWcPBn8vT8Rj16tNd99w3QO+9E6vhxH/XpU6B///d/aN26NBUXW1VSEqKMjFu0ceMtmjUrlJF8J9WjRw/FxsYqLS1Nu3fv1vDhw7Vo0SL16tVLM2fO1Pbt22WyD0BbR2CgbdFuG1NSUqJ58+Zp4sSJuummm3Tw4EHCPuCkqqf+/OUvthmEqanSY49JWVm2qT9+frYR/6VLpW++MbratoERfjgnA3bcrR65/+ijk/r6azdG7l0Eo/5NFBgoFRRI5eVSG1lQfnG7zRUrVtBuE2hDrtT1Jy1NWrvW6CqdH4EfzsuOC3cJ96hP9aj/I488UjPXf9GiRXryySeZ61+td2/b/fHjtk/inBjtNgHzuXTqT3Gx0RW1DQR+OK/wcOnFF6WiohYt3CXco6kY9W/Axb34nTjw024TMD9PT9sNV0bgh1MqLCzUS++8oxck3TtokP7p7a2IiAgtXbpUvr6+lz2PcI/Wxqj/JXr1st07aWtOq9WqdevW6eGHH6bdJgD8hMAPp3PixAmNHDlSR44c0ROSrs7JUVpOjtLS0vTZZ58pOTlZvr6+hHs4FKP+P/H0lHx9nXLhLu02AaB+BH44nQULFujIkSOSpFRJtgadHSWF6ciRoerbd5cuXBhIuIdhXH7U3wk79VzcbjMxMVG//vWvjS4JAJwGgR9OZ+/evTVfr9Y0pepJSf1VvYnV2bOHFBxMuIfxXHbU34l22y0pKVFcXJxee+01jR8/Xm+99ZYCAgKMLgsAnAp9+OF0Kioqar5O1w/y0V5Z9JCkoZK6KChoJn3u4XRcqq+/k4zwV+84uXr1aq1YsUIffPABYR8A6kHgh9Nxd//5g6d9+kSfa66sWiUpRdL5Wo8DzqZ61H/Dhg3KycnRCy+8oP379+u2225TcHCwXnzxRZ04ccLoMlumd29b4DfoDUxlZaWef/55DR8+XF5eXkpNTdW8efPMO4UKAFqIwA+nExER0aLHAWdh2lH/wEDp7FlDGmBnZWXp1ltv1aJFi/T4448rOTmZ3voAcAUEfjidpUuXqu9l+nv37dtXS5cudXBFQMuYbtT/4l78DmK1WrV27VqFhYUpJydHu3bt0vPPP09vfQBoBLsH/vLyci1YsEABAQHy8vJSZGSkPvnkk0ade/r0ac2dO1e+vr7q3Lmzxo0bp3379tm5YhjN19dXycnJmj17tkJDQxUcHKzQ0FDNnj27piUn0FaZYtS/erddBy3cLSoqUnR0tObMmaPo6Gjt37+f3voA0AR2nww9e/Zsbdq0SbGxsQoKCtKaNWs0adIk7dixQ6NGjbrseVVVVZo8ebIOHDiguLg49ejRQytXrtSYMWOUkpKifv362bt0GMjX11dr1qwxugzAbtp0hx9/f8nd3SEj/LTbBICWs+sI/969e/X222/rj3/8o1544QXdd9992r59u/r06aO4uLgGz01MTFRycrLWrVunRYsW6cEHH9TOnTvVrl07LV682J5lA4BDtblR/3btpGuusesIf0lJiebNm6eJEyfqpptu0sGDBwn7ANBMdg38iYmJcnd319y5c2uOeXh46N5771VycrJycnIaPNff319Tp06tOebj46Pp06fr/fff14ULF+xZOgA4XJua62/H1py02wSA1mXXwL9v3z4FBwerc+fOtY4PGzZMkvT11183eO6QIUPqHB82bJhKSkp0+PDh1i0WAJyI04/62yHw024TAOzDroE/Ly9PPXv2rHO8+lhubq5dzgUAs3DaUf9W3m2XdpsAYD92DfylpaXy8Ki7C2rHjh1rHr+csrKyZp8LAGbkVKP+gYHS8eNSZWWLLkO7TQCwP7sGfk9PT5WXl9c5XlZWVvO4Pc4FADNzilH/3r2ligqpoKDZl6DdJgA4hl3bcvbs2bPeqTd5eXmS1OAirJacK0mxsbHy9vaudSwmJkYxMTFXrBsA2orqUf9HHnlEn3/+ud544w0tWrRITz75pKZOnaq5c+dq7NixrT8P/uLNt5qxoJZ2mwDQsISEBCUkJNQ6VtzMHc7tGvgHDx6snTt36syZM+rSpUvN8T179kiSBg0adNlzBw0apM8++0xWq7XWL6o9e/aoU6dOCg4ObvB7L1u2rN5FvwBgRg7v639x4I+MbPRpJSUliouL02uvvabx48frrbfe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v/9+o0tECxw/flzPP/+8OnXqxP+7bdxvf/tbDRs2rNaxvn37NupcU/fhP3v2rCoqKtStWzclJiZq+vTp2rlzp2655RajS0MD9u7dq8jISL300kt69NFHJdlG/AcMGCA/Pz998cUXBleIpjp//rxOnz4tPz8/paSkaNiwYVq7dq1mzZpldGlohuTkZA0bNkzu7j+PGWVmZmrgwIGKjo7W+vXrDawOraGqqkrh4eEqKytTenq60eWgBWbOnKmTJ0+qoqJCRUVFOnjwoNEloYl27typcePGKTExUVOnTm3WNUw9padz587q1q2b0WWgiRITE+Xu7q65c+fWHPPw8NC9996r5ORk5eTkGFgdmqNDhw7y8/OTJJl4jMFljBgxolbYl6R+/fopNDRUGRkZBlWF1uTm5qZevXqpuLjY6FLQArt379amTZv05z//WVarlRH+Ns5qterMmTOqqKho8rmmDvxom/bt26fg4GB17ty51vHqj7G+/vprI8oC0ACr1aqCgoImbfUO51JSUqKioiIdOXJEy5Yt04cffqjbbrvN6LLQTJWVlXr44Yd1//33M83OJObMmSNvb295enpq3LhxSklJafS5pp7Dj7YpLy9PPXv2rHO8+lhubq6jSwJwBRs3blRubq6effZZo0tBMz366KNatWqVJNsI/69//Wu9+uqrBleF5vrLX/6i7Oxsbd++3ehS0EIeHh6Kjo7WpEmT5OPjo0OHDumll17S6NGj9Y9//EODBg264jXaTOC3Wq0qLy9v1HM7duxo52pgT6WlpfLw8KhzvPp1LS0tdXRJABqQkZGhhx56SCNHjtQ999xjdDloptjYWE2fPl05OTl65513VFFR0ejfu3AuJ0+e1FNPPaWnnnpKPXr0MLoctNCIESM0YsSImj/ffvvtio6OVlhYmJ544gl98MEHV7xGm5nSs2vXLnl5eTXqdvjwYaPLRQt4enrW+0umrKys5nEAziE/P1+TJ0/WVVddpcTEROYIt2E33HCDxo0bp7vvvltJSUk6e/asoqKijC4LzfD73/9ePj4+evjhh40uBXbSt29f3XHHHdqxY0ej1sa1mRH+kJAQrV27tlHP9ff3t28xsKuePXvWO20nLy9PkhQQEODokgDUo7i4WBMnTtSPP/6ozz77jP97TebXv/61/vM//1PffvutgoKCjC4HjfTtt9/qzTff1J///GcdP3685nhZWZnOnz+v77//Xl27dtVVV11lYJVoDb169dL58+d17ty5OuseL9VmAv/VV19NCz8XMXjwYO3cuVNnzpxRly5dao7v2bNHkho1Vw2AfZWVlSkqKkqZmZn65JNPdOONNxpdElpZ9fRJOvW0LTk5OaqqqtL8+fM1f/78Oo9fd911euSRR/SnP/3JgOrQmr777jt5enpeMexLbSjww3VER0frpZde0qpVq/TYY49JsvXhX7NmjSIjI3XNNdcYXCHg2iorKzVjxgzt2bNH77//voYPH250SWiBwsJC+fr61jp24cIFxcfHy8vLS6GhoQZVhuYYOHCg3nvvvVrT66xWq37/+9/r7NmzWr58eaM3a4JzqO/f6P79+7VlyxZNnjy5UdcwfeCv7hhx6NAhSVJ8fLx2794tyTbHDc4nIiJC06ZN0xNPPKETJ06ob9++WrdunbKzs7VmzRqjy0Mzvfrqqzp9+nTNdK0tW7YoOztbkjR//nx17drVyPLQBI899piSkpIUFRWloqIibdiwodbjd911l0GVoTnmzp2rM2fO6JZbblFAQIDy8/O1ceNGHT58WC+//LK8vLyMLhFN0KNHD91xxx11ji9btkySNGXKFEeXhBaaMWOGvLy8NGLECPn5+SktLU2rVq1S586d9cc//rFR1zD1TruSrbWYxWKp2XCi+se1WCyqrKw0uDpcTnl5uRYtWqQNGzbohx9+0E033aQlS5bol7/8pdGloZmuu+46ff/995JUM/JU/e8yKytLgYGBRpaHJhg7dqx2795d70Ix/m9te95++22tXr1aBw8e1MmTJ9WlSxcNHTpUDz/8sG6//Xajy0MrGTt2rE6ePKkDBw4YXQqaaMWKFdq4caMyMzP1448/ys/PT7fddpsWL16s66+/vlHXMH3gBwAAAFxZm2nLCQAAAKDpCPwAAACAiRH4AQAAABMj8AMAAAAmRuAHAAAATIzADwAAAJgYgR8AAAAwMQI/AAAAYGIEfgAAAMDECPwAAACAiRH4AQAAABMj8AMAAAAm9v8BWaE+8WFgIKoAAAAASUVORK5CYII=", + "text/plain": [ + "PyPlot.Figure(PyObject )" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(-1.0,5.0,-0.2,1.2000000000000002)" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".0\n", + "i = 2, normal = [0.09142755332923394,0.9958117304451831], tangent = [0.9958117304451831,-0.09142755332923394], dot = 0.0\n", + "i = 3, normal = [-0.11485575612958872,0.9933821798703159], tangent = [0.9933821798703159,0.11485575612958872], dot = 0.0\n", + "i = 4, normal = [-0.15895744828402364,0.9872854347325458], tangent = [0.9872854347325458,0.15895744828402364], dot = 0.0\n", + "i = 5, normal = [0.28734788556634544,0.9578262852211514], tangent = [0.9578262852211514,-0.28734788556634544], dot = 0.0\n" + ] + } + ], + "source": [ + "for s in [s1, s2, s3, s4]\n", + " X1 = s(\"geometry\", [-1.0], 0.0)\n", + " X2 = s(\"geometry\", [ 1.0], 0.0)\n", + " plot([X1[1],X2[1]], [X1[2],X2[2]], \"-ko\")\n", + "end\n", + "for i=1:5\n", + " s = 4*(i-1)+1\n", + " e = s + 1\n", + " normal = vec(P[2*(i-1)+1, s:e])\n", + " s = 4*(i-1)+3\n", + " e = s + 1\n", + " tangent = vec(P[2*(i-1)+2, s:e])\n", + " println(\"i = $i, normal = $normal, tangent = $tangent, dot = \", dot(normal, tangent))\n", + " plot([nodes[i][1], nodes[i][1]+normal[1]*0.5], [nodes[i][2], nodes[i][2]+normal[2]*0.5], \"-r\")\n", + " plot([nodes[i][1], nodes[i][1]+tangent[1]*0.5], [nodes[i][2], nodes[i][2]+tangent[2]*0.5], \"-b\")\n", + "end\n", + "ylim(-0.5, 1.0)\n", + "xlim(-0.5, 4.5)\n", + "axis(\"equal\")" ] }, {