├── images ├── svd_explained.png ├── trasnpression.png ├── force_balance_1.png ├── force_balance_2.png └── stress_tensor_cartesian.png ├── pdfs └── strain_modelling.pdf ├── README.md ├── .gitignore ├── LICENSE ├── sg2lib.py ├── css └── sg2.css ├── calais2003proj.csv ├── custom.css ├── 15_Transpression.ipynb ├── 13_Superposed_deformation.ipynb ├── 20_Introduction_to_stress_in_geology.ipynb └── 00_Python_Crash_Course.ipynb /images/svd_explained.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ondrolexa/sg2/HEAD/images/svd_explained.png -------------------------------------------------------------------------------- /images/trasnpression.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ondrolexa/sg2/HEAD/images/trasnpression.png -------------------------------------------------------------------------------- /images/force_balance_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ondrolexa/sg2/HEAD/images/force_balance_1.png -------------------------------------------------------------------------------- /images/force_balance_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ondrolexa/sg2/HEAD/images/force_balance_2.png -------------------------------------------------------------------------------- /pdfs/strain_modelling.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ondrolexa/sg2/HEAD/pdfs/strain_modelling.pdf -------------------------------------------------------------------------------- /images/stress_tensor_cartesian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ondrolexa/sg2/HEAD/images/stress_tensor_cartesian.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Teaching materials for course "Stress and strain analysis of rocks" (Structural geology II) 2 | 3 | All teaching materials could be accessed from [this webpage](http://ondrolexa.github.io/sg2/) 4 | 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | *.*~ 3 | 4 | # C extensions 5 | *.so 6 | 7 | # Packages 8 | *.egg 9 | *.egg-info 10 | dist 11 | build 12 | eggs 13 | parts 14 | bin 15 | var 16 | sdist 17 | develop-eggs 18 | .installed.cfg 19 | lib 20 | lib64 21 | 22 | # Installer logs 23 | pip-log.txt 24 | 25 | # Unit test / coverage reports 26 | .coverage 27 | .tox 28 | nosetests.xml 29 | htmlcov 30 | 31 | # Translations 32 | *.mo 33 | 34 | # Mr Developer 35 | .mr.developer.cfg 36 | .project 37 | .pydevproject 38 | 39 | # Complexity 40 | output/*.html 41 | output/*/index.html 42 | 43 | # Sphinx 44 | docs/_build 45 | 46 | .ipynb_checkpoints/* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 ondrolexa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /sg2lib.py: -------------------------------------------------------------------------------- 1 | # Library of routines for 2D deformation visualization 2 | # 3 | # Ondrej Lexa 2017 4 | 5 | from pylab import * 6 | from scipy import linalg as la 7 | 8 | def def_ellipse(F): 9 | # Draw strain ellipse from deformation gradient 10 | theta = linspace(0, 2*pi, 180) 11 | xc, yc = cos(theta), sin(theta) 12 | x,y = dot(F, [xc,yc]) 13 | plot(xc, yc, 'r', x, y, 'g') 14 | u, s, v = svd(F) 15 | quiver(zeros(2), zeros(2), 16 | hstack((s*u[0],-s*u[0])), hstack((s*u[1],-s*u[1])), 17 | scale=1, units='xy') 18 | 19 | def def_square(F): 20 | # Draw square 21 | xc, yc = [-1, -1, 1, 1, -1], [-1, 1, 1, -1, -1] 22 | x,y = dot(F, [xc,yc]) 23 | plot(xc, yc, 'r', x, y, 'g') 24 | 25 | def dis_ellipse(J): 26 | # Draw strain ellipse from displacement gradient 27 | J = asarray(J) 28 | F = J + eye(2) 29 | def_ellipse(F) 30 | 31 | def dis_square(J): 32 | # Draw square 33 | J = asarray(J) 34 | F = J + eye(2) 35 | def_square(F) 36 | 37 | def dis_field(J): 38 | # Visualize displacement field from 39 | # displacement gradient 40 | X, Y = meshgrid(linspace(-3, 3, 21), 41 | linspace(-2, 2, 17)) 42 | u, v = tensordot(J, [X, Y], axes=1) 43 | quiver(X, Y, u, v, angles='xy') 44 | 45 | def def_field(F): 46 | # Visualize displacement field from 47 | # deformation gradient 48 | F = asarray(F) 49 | J = F - eye(2) 50 | dis_field(J) 51 | 52 | def dis_show(J): 53 | # Draw displacement field and deformation ellipse 54 | # from displacement gradient 55 | dis_field(J) 56 | dis_square(J) 57 | dis_ellipse(J) 58 | title(f"J = [[{J[0,0]:g}, {J[0,1]:g}], [{J[1,0]:g}, {J[1,1]:g}]]") 59 | axis('equal') 60 | show() 61 | 62 | def def_show(F): 63 | # Draw displacement field and deformation ellipse 64 | # from deformation gradient 65 | def_field(F) 66 | def_square(F) 67 | def_ellipse(F) 68 | axis('equal') 69 | title(f"F = [[{F[0,0]:g}, {F[0,1]:g}], [{F[1,0]:g}, {F[1,1]:g}]]") 70 | show() 71 | 72 | def vel_field(L, t=None): 73 | # Visualize velocity field from 74 | # spatial velocity gradient 75 | X, Y = meshgrid(linspace(-2, 2, 17), 76 | linspace(-2, 2, 17)) 77 | u, v = tensordot(L, [X, Y], axes=1) 78 | quiver(X, Y, u, v, angles='xy') 79 | if t is not None: 80 | F = la.expm(L*t) 81 | def_square(F) 82 | def_ellipse(F) 83 | axis('equal', adjustable='box') 84 | title('Spatial velocity gradient') 85 | show() 86 | 87 | def densify_list_xy(x, y, n=500, per=True): 88 | from scipy import interpolate 89 | if per and (x[0] != x[-1]) and (x[0] != x[-1]): 90 | x.append(x[0]) 91 | y.append(y[0]) 92 | tck, u = interpolate.splprep([x, y], s=0, k=1, per=per) 93 | return interpolate.splev(np.linspace(0, 1, n), tck) 94 | 95 | -------------------------------------------------------------------------------- /css/sg2.css: -------------------------------------------------------------------------------- 1 | 2 | 74 | 89 | -------------------------------------------------------------------------------- /calais2003proj.csv: -------------------------------------------------------------------------------- 1 | fid,Site,Longitude,Latitude,Ve,Vn,Se,Sn,Corr,X,Y 2 | 1,ALTA,96.25,46.55,3.9,2,0.4,0.3,0.039,10714500.9888526,5868929.46316788 3 | 2,ANGA,106.58,52.79,-0.9,1.5,0.5,0.4,-0.001,11864431.3287471,6944247.67943591 4 | 3,ARVA,102.79,46.26,6.1,-0.7,0.9,0.8,-0.067,11442530.4586406,5822112.7482758 5 | 4,ARVX,103.02,46.12,5.2,1,1,0.6,-0.045,11468133.941523,5799600.20186434 6 | 5,BADA,102.21,51.76,0.6,-0.5,0.3,0.3,-0.012,11377965.1539805,6756846.16547357 7 | 6,BATS,110.85,48.52,1,-3.5,0.7,0.5,0.087,12339765.5544344,6193804.45177003 8 | 7,BAYA,105.5,53.06,-2.2,3,0.6,0.6,-0.01,11744206.2786904,6994104.01722214 9 | 8,BOL1,98.05,49.21,2.3,-0.2,0.3,0.3,0.009,10914876.0722805,6310569.41153745 10 | 9,BOL2,97.98,49.08,3,1.4,0.4,0.4,0.004,10907083.7079249,6288446.63796879 11 | 10,BULG,103.52,48.8,1.5,0.5,0.3,0.3,-0.004,11523793.6869197,6240993.4634589 12 | 11,BZUR,98.98,50.18,1.6,-0.9,0.4,0.3,-0.023,11018403.1987182,6477507.223365 13 | 12,CHOI,114.58,48.09,2,-2.4,0.5,0.4,0.058,12754987.2550933,6121840.70979701 14 | 13,DALA,104.43,43.59,4.8,1.2,0.3,0.2,-0.015,11625094.4235416,5402211.42212132 15 | 14,ERBL,101.61,50.1,1.4,2.1,0.3,0.3,0.001,11311173.4595045,6463612.12425767 16 | 15,ERDE,104.22,49.04,-0.3,-2.6,1.4,1,-0.017,11601717.330475,6281651.28453134 17 | 16,HADR,103.22,52.26,-0.5,-0.9,0.4,0.5,0.037,11490397.8396817,6847274.00786381 18 | 17,HARA,102.35,51.6,0.8,1,1.1,0.9,-0.034,11393549.8826915,6728120.96814431 19 | 18,HOVD,91.63,47.76,2.1,4.7,0.5,0.3,0.025,10200204.9413877,6067019.85700956 20 | 19,IKUL,98.8,48.71,2.7,-0.1,0.5,0.3,-0.003,10998365.6903754,6225796.95392075 21 | 20,IRKT,104.32,52.22,-0.6,0.3,0.1,0.1,-0.052,11612849.2795543,6840002.44472608 22 | 21,KHAR,100.79,44.47,3.9,-0.1,0.5,0.4,0.015,11219891.477054,5538466.20295752 23 | 22,KIAT,106.49,50.74,1.8,-0.6,0.2,0.2,-0.022,11854412.5745757,6575430.95874858 24 | 23,KULT,103.74,51.77,0.7,0.2,0.3,0.3,0.004,11548283.9748942,6758644.86623307 25 | 24,LIST,104.89,51.85,0.1,2.1,0.3,0.2,-0.041,11676301.3893065,6773048.83963686 26 | 25,MAND,106.22,45.8,3.6,-0.2,0.4,0.3,-0.03,11824356.3120615,5748356.80160294 27 | 26,MOND,100.91,51.62,0.5,-0.4,0.4,0.3,-0.017,11233249.8159492,6731706.07355664 28 | 27,MURN,100.1,49.66,2.1,0.3,0.4,0.4,-0.041,11143081.0284067,6387600.71841345 29 | 28,NSEL,102.81,49.45,0.5,1.1,0.4,0.3,-0.013,11444756.8484565,6351564.79996172 30 | 29,NVSK,83.24,54.84,-0.7,1.3,0.7,0.5,0.014,9266234.41363209,7330875.09258369 31 | 30,ORLK,99.8,52.54,-0.4,2.2,0.4,0.3,-0.038,11109685.1811687,6898359.54435718 32 | 31,SLYU,103.7,51.65,0.9,0,0.3,0.2,-0.003,11543831.1952625,6737086.69550241 33 | 32,SSEL,102.96,49.29,1.4,0.5,0.4,0.4,0.011,11461454.7720754,6324212.35122849 34 | 33,SUKG,106.25,50.23,1.2,-1.5,0.3,0.3,-0.038,11827695.8967853,6486203.48010797 35 | 34,TEEG,101.44,45.67,2,-1.7,0.6,0.4,0.01,11292249.1460697,5727623.27676017 36 | 35,TES1,95.87,49.62,0.3,2.4,0.5,0.4,0.047,10672199.5823511,6380724.77358479 37 | 36,TSET,101.8,47.52,4.3,-1.4,0.5,0.4,-0.011,11332324.1627552,6027368.22106761 38 | 37,TURK,108.24,52.97,1,-0.3,0.3,0.3,-0.01,12049221.6834639,6977450.65910838 39 | 38,UDUN,106.01,51.17,1.5,-0.9,0.2,0.2,-0.036,11800979.2189949,6651420.02404798 40 | 39,ULA1,107.05,47.87,3.7,-1.8,0.3,0.2,-0.011,11916751.4894199,6085254.65218746 41 | 40,ULAA,92.08,49.97,0.8,2.8,0.4,0.3,0.032,10250298.7122446,6441081.98956829 42 | 41,ULGI,89.94,48.98,2.1,4.6,0.5,0.4,0.032,10012075.001947,6271468.49355998 43 | 42,ULIA,96.78,47.61,3.6,0.7,0.5,0.3,0.018,10773500.318973,6042216.25041143 44 | 43,UNDE,110.59,47.26,1.8,-0.6,0.6,0.4,0.071,12310822.4868281,5984616.43135255 45 | 44,UNDU,101.31,43.09,3.2,0.5,0.5,0.3,0.017,11277777.6122665,5325680.81312965 46 | 45,URUM,87.6,43.81,2.6,10,0.2,0.1,-0.001,9751587.39349076,5436086.17097514 47 | 46,UZUR,107.74,53.33,-0.8,2,0.4,0.4,0.04,11993561.9380673,7044273.80043242 48 | 47,ZAKM,103.28,50.38,2.5,0.8,0.5,0.6,0.06,11497077.0091293,6512347.09158884 49 | -------------------------------------------------------------------------------- /custom.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); 2 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); 3 | /** 4 | * Sky theme for reveal.js. 5 | * 6 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | .reveal a:not(.image) { 9 | line-height: 1.3em; } 10 | 11 | /********************************************* 12 | * GLOBAL STYLES 13 | *********************************************/ 14 | body { 15 | background: #add9e4; 16 | background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); 17 | background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4)); 18 | background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); 19 | background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); 20 | background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); 21 | background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); 22 | background-color: #f7fbfc; } 23 | 24 | .reveal { 25 | font-family: "Open Sans", sans-serif; 26 | font-size: 24px; 27 | font-weight: normal; 28 | letter-spacing: -0.02em; 29 | color: #333333; } 30 | 31 | ::selection { 32 | color: white; 33 | background: #134674; 34 | text-shadow: none; } 35 | 36 | /********************************************* 37 | * HEADERS 38 | *********************************************/ 39 | .reveal h1, 40 | .reveal h2, 41 | .reveal h3, 42 | .reveal h4, 43 | .reveal h5, 44 | .reveal h6 { 45 | margin: 0 0 0 0; 46 | color: #333333; 47 | font-family: "Quicksand", sans-serif; 48 | line-height: 0.9em; 49 | letter-spacing: -0.08em; 50 | text-transform: uppercase; 51 | text-shadow: none; } 52 | 53 | .reveal h1 { 54 | text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } 55 | 56 | /********************************************* 57 | * LINKS 58 | *********************************************/ 59 | .reveal a:not(.image) { 60 | color: #3b759e; 61 | text-decoration: none; 62 | -webkit-transition: color .15s ease; 63 | -moz-transition: color .15s ease; 64 | -ms-transition: color .15s ease; 65 | -o-transition: color .15s ease; 66 | transition: color .15s ease; } 67 | 68 | .reveal a:not(.image):hover { 69 | color: #74a7cb; 70 | text-shadow: none; 71 | border: none; } 72 | 73 | .reveal .roll span:after { 74 | color: #fff; 75 | background: #264c66; } 76 | 77 | /********************************************* 78 | * IMAGES 79 | *********************************************/ 80 | .reveal section img { 81 | margin: 10px 0px; 82 | background: rgba(255, 255, 255, 0.12); 83 | border: 3px solid #333333; 84 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); 85 | -webkit-transition: all .2s linear; 86 | -moz-transition: all .2s linear; 87 | -ms-transition: all .2s linear; 88 | -o-transition: all .2s linear; 89 | transition: all .2s linear; } 90 | 91 | .reveal a:hover img { 92 | background: rgba(255, 255, 255, 0.2); 93 | border-color: #3b759e; 94 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } 95 | 96 | /********************************************* 97 | * NAVIGATION CONTROLS 98 | *********************************************/ 99 | .reveal .controls div.navigate-left, 100 | .reveal .controls div.navigate-left.enabled { 101 | border-right-color: #3b759e; } 102 | 103 | .reveal .controls div.navigate-right, 104 | .reveal .controls div.navigate-right.enabled { 105 | border-left-color: #3b759e; } 106 | 107 | .reveal .controls div.navigate-up, 108 | .reveal .controls div.navigate-up.enabled { 109 | border-bottom-color: #3b759e; } 110 | 111 | .reveal .controls div.navigate-down, 112 | .reveal .controls div.navigate-down.enabled { 113 | border-top-color: #3b759e; } 114 | 115 | .reveal .controls div.navigate-left.enabled:hover { 116 | border-right-color: #74a7cb; } 117 | 118 | .reveal .controls div.navigate-right.enabled:hover { 119 | border-left-color: #74a7cb; } 120 | 121 | .reveal .controls div.navigate-up.enabled:hover { 122 | border-bottom-color: #74a7cb; } 123 | 124 | .reveal .controls div.navigate-down.enabled:hover { 125 | border-top-color: #74a7cb; } 126 | 127 | /********************************************* 128 | * PROGRESS BAR 129 | *********************************************/ 130 | .reveal .progress { 131 | background: rgba(0, 0, 0, 0.2); } 132 | 133 | .reveal .progress span { 134 | background: #3b759e; 135 | -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 136 | -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 137 | -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 138 | -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); 139 | transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } 140 | 141 | /********************************************* 142 | * SLIDE NUMBER 143 | *********************************************/ 144 | .reveal .slide-number { 145 | color: #3b759e; } 146 | -------------------------------------------------------------------------------- /15_Transpression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Transpressional deformation" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [ 17 | { 18 | "name": "stdout", 19 | "output_type": "stream", 20 | "text": [ 21 | "Populating the interactive namespace from numpy and matplotlib\n" 22 | ] 23 | } 24 | ], 25 | "source": [ 26 | "%pylab inline" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 2, 32 | "metadata": { 33 | "collapsed": true 34 | }, 35 | "outputs": [], 36 | "source": [ 37 | "from scipy import linalg as la" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "Here we will examine strain evolution during transpression deformation. Transpression (Sanderson and Marchini, 1984) is considered as a wrench or transcurrent shear accompanied by horizontal shortening across, and vertical lengthening along, the shear plane.\n", 45 | "\n", 46 | "\n", 47 | "\n", 48 | "Velocity gradient associated with transpressional deformation is defined as: $ \\mathbf{L} = \\begin{bmatrix} 0 & \\dot{\\gamma} & 0 \\\\ 0 & -\\dot{\\varepsilon} & 0 \\\\ 0 & 0 & \\dot{\\varepsilon} \\end{bmatrix} $, where $\\dot{\\gamma}$ and $\\dot{\\varepsilon}$ are components of bulk strain rate in direction of convergence." 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "At first, we will define function to calculate symmetry and intensity of deformation from defoirmation gradient." 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 3, 61 | "metadata": { 62 | "collapsed": true 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "def KDparams(F):\n", 67 | " u, s, v = svd(F)\n", 68 | " Rxy = s[0]/s[1]\n", 69 | " Ryz = s[1]/s[2]\n", 70 | " K = (Rxy-1)/(Ryz-1)\n", 71 | " D = sqrt((Rxy-1)**2 + (Ryz-1)**2)\n", 72 | " return K, D" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "Here we define some constants including bulk strain rate." 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 4, 85 | "metadata": { 86 | "collapsed": true 87 | }, 88 | "outputs": [], 89 | "source": [ 90 | "yearsec = 365.25*24*3600\n", 91 | "sr = 3e-15" 92 | ] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "metadata": {}, 97 | "source": [ 98 | "We define 2D arrays of angles and times to be examined..." 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 5, 104 | "metadata": { 105 | "collapsed": false 106 | }, 107 | "outputs": [], 108 | "source": [ 109 | "times = linspace(0.00000001,10,20)\n", 110 | "alphas = linspace(0,90,20)\n", 111 | "time, alpha = meshgrid(times, alphas)\n", 112 | "K = zeros_like(alpha)\n", 113 | "D = zeros_like(alpha)" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "and l;oop over to calculate symmetry and intensity for each combination" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": { 127 | "collapsed": false 128 | }, 129 | "outputs": [], 130 | "source": [ 131 | "for (r,c) in np.ndindex(alpha.shape):\n", 132 | " a = deg2rad(alpha[r,c])\n", 133 | " t = time[r,c]*1e6*yearsec\n", 134 | " edot = sr*sin(a)\n", 135 | " gdot = sr*cos(a)\n", 136 | " L = array([[0, gdot, 0], [0, -edot, 0],[0, 0, edot]])\n", 137 | " F = la.expm(L*t)\n", 138 | " K[r,c], D[r,c] = KDparams(F)\n", 139 | " " 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "Now we can plot results." 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 7, 152 | "metadata": { 153 | "collapsed": false 154 | }, 155 | "outputs": [ 156 | { 157 | "data": { 158 | "text/plain": [ 159 | "" 160 | ] 161 | }, 162 | "execution_count": 7, 163 | "metadata": {}, 164 | "output_type": "execute_result" 165 | }, 166 | { 167 | "data": { 168 | "image/png": "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\n", 169 | "text/plain": [ 170 | "" 171 | ] 172 | }, 173 | "metadata": {}, 174 | "output_type": "display_data" 175 | } 176 | ], 177 | "source": [ 178 | "contourf(time, alpha, K, linspace(0, 1, 11))\n", 179 | "colorbar()" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 8, 185 | "metadata": { 186 | "collapsed": false 187 | }, 188 | "outputs": [ 189 | { 190 | "data": { 191 | "text/plain": [ 192 | "" 193 | ] 194 | }, 195 | "execution_count": 8, 196 | "metadata": {}, 197 | "output_type": "execute_result" 198 | }, 199 | { 200 | "data": { 201 | "image/png": "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\n", 202 | "text/plain": [ 203 | "" 204 | ] 205 | }, 206 | "metadata": {}, 207 | "output_type": "display_data" 208 | } 209 | ], 210 | "source": [ 211 | "contourf(time, alpha, D, linspace(0, 2.5, 11))\n", 212 | "colorbar()" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 9, 218 | "metadata": { 219 | "collapsed": false 220 | }, 221 | "outputs": [ 222 | { 223 | "data": { 224 | "text/html": [ 225 | "\n", 226 | "\n", 298 | "\n" 313 | ], 314 | "text/plain": [ 315 | "" 316 | ] 317 | }, 318 | "execution_count": 9, 319 | "metadata": {}, 320 | "output_type": "execute_result" 321 | } 322 | ], 323 | "source": [ 324 | "from IPython.core.display import HTML\n", 325 | "def css_styling():\n", 326 | " styles = open(\"./css/sg2.css\", \"r\").read()\n", 327 | " return HTML(styles)\n", 328 | "css_styling()" 329 | ] 330 | } 331 | ], 332 | "metadata": { 333 | "kernelspec": { 334 | "display_name": "Python 3", 335 | "language": "python", 336 | "name": "python3" 337 | }, 338 | "language_info": { 339 | "codemirror_mode": { 340 | "name": "ipython", 341 | "version": 3 342 | }, 343 | "file_extension": ".py", 344 | "mimetype": "text/x-python", 345 | "name": "python", 346 | "nbconvert_exporter": "python", 347 | "pygments_lexer": "ipython3", 348 | "version": "3.4.4" 349 | } 350 | }, 351 | "nbformat": 4, 352 | "nbformat_minor": 0 353 | } 354 | -------------------------------------------------------------------------------- /13_Superposed_deformation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Superposed deformation" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "To understand deformation defined as superposition of two individual deformations $\\mathbf{F_1}$ and $\\mathbf{F_2}$, we can start to think about applying deformation on already deformed object,so:" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "$$ x=\\mathbf{F_2}\\left(\\mathbf{F_1}X\\right)=\\left(\\mathbf{F_2}\\mathbf{F_1}\\right)X = \\mathbf{F}X$$" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "where $\\mathbf{F}=\\mathbf{F_2}\\mathbf{F_1}$, i.e. superposition of deformation could be treated as left multiplication of deformation gradients, where first deformation gradient is on right side and late on left side. " 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "To demonstrate difference in order, we can explore superposition of pure shear and simple shear:" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 1, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "name": "stdout", 45 | "output_type": "stream", 46 | "text": [ 47 | "Populating the interactive namespace from numpy and matplotlib\n" 48 | ] 49 | } 50 | ], 51 | "source": [ 52 | "%pylab inline" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 2, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "PS = array([[2, 0], [0, 0.5]])\n", 62 | "SS = array([[1, 1], [0, 1]])" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "data": { 72 | "text/plain": [ 73 | "array([[ 2. , 2. ],\n", 74 | " [ 0. , 0.5]])" 75 | ] 76 | }, 77 | "execution_count": 3, 78 | "metadata": {}, 79 | "output_type": "execute_result" 80 | } 81 | ], 82 | "source": [ 83 | "# simple shear first\n", 84 | "dot(PS, SS)" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 4, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "data": { 94 | "text/plain": [ 95 | "array([[ 2. , 0.5],\n", 96 | " [ 0. , 0.5]])" 97 | ] 98 | }, 99 | "execution_count": 4, 100 | "metadata": {}, 101 | "output_type": "execute_result" 102 | } 103 | ], 104 | "source": [ 105 | "# pure shear first\n", 106 | "dot(SS, PS)" 107 | ] 108 | }, 109 | { 110 | "cell_type": "markdown", 111 | "metadata": {}, 112 | "source": [ 113 | "## Small deformations" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "Using above described concept, we can imagine that any deformation is composed from small deformation increments superposed on each other. So lets demonstrate how small increments of pure shear and simple shear accumulate with increasing amounts of steps. For this purpose we define incremental simple shear with $\\gamma=0.01$ and pure shear increment with $S_x=1.01$ and we will use `numpy.linalg.matrix_power` function to calculate total deformation." 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 5, 126 | "metadata": { 127 | "collapsed": true 128 | }, 129 | "outputs": [], 130 | "source": [ 131 | "PSi = array([[1.01, 0], [0, 1/1.01]])\n", 132 | "SSi = array([[1, 0.01], [0, 1]])" 133 | ] 134 | }, 135 | { 136 | "cell_type": "markdown", 137 | "metadata": {}, 138 | "source": [ 139 | "$$\\mathbf{F} = \\underset{n \\mathrm{\\, times}}{\\mathbf{F_i}\\mathbf{F_i}\\cdots\\mathbf{F_i}} = \\mathbf{F_i}^n$$" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 6, 145 | "metadata": {}, 146 | "outputs": [ 147 | { 148 | "data": { 149 | "text/plain": [ 150 | "array([[ 1.10462213, 0. ],\n", 151 | " [ 0. , 0.90528695]])" 152 | ] 153 | }, 154 | "execution_count": 6, 155 | "metadata": {}, 156 | "output_type": "execute_result" 157 | } 158 | ], 159 | "source": [ 160 | "matrix_power(PSi, 10)" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 7, 166 | "metadata": {}, 167 | "outputs": [ 168 | { 169 | "data": { 170 | "text/plain": [ 171 | "1.1046221254112045" 172 | ] 173 | }, 174 | "execution_count": 7, 175 | "metadata": {}, 176 | "output_type": "execute_result" 177 | } 178 | ], 179 | "source": [ 180 | "1.01**10" 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "metadata": {}, 186 | "source": [ 187 | "So for pure shear accumulated stretch growths exponentially with increasing amounts of steps, while" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 8, 193 | "metadata": {}, 194 | "outputs": [ 195 | { 196 | "data": { 197 | "text/plain": [ 198 | "array([[ 1. , 0.1],\n", 199 | " [ 0. , 1. ]])" 200 | ] 201 | }, 202 | "execution_count": 8, 203 | "metadata": {}, 204 | "output_type": "execute_result" 205 | } 206 | ], 207 | "source": [ 208 | "matrix_power(SSi, 10)" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 9, 214 | "metadata": {}, 215 | "outputs": [ 216 | { 217 | "data": { 218 | "text/plain": [ 219 | "10.1" 220 | ] 221 | }, 222 | "execution_count": 9, 223 | "metadata": {}, 224 | "output_type": "execute_result" 225 | } 226 | ], 227 | "source": [ 228 | "10*1.01" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "for simple shear accumulated simple shear growths linearly with amounts of steps." 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "To see how intensity of deformation i.e. axial ratio of strain ellipse evolves with accumulation of pure shear or simple shear, we have to understand how to calculate axial ration of strain ellipse from deformation gradient." 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "In linear algebra, the singular value decomposition (SVD) is a factorization of a real or complex matrix $\\mathbf{F} = \\mathbf{U} \\boldsymbol{\\Sigma} \\mathbf{V}^*$. For deformation gradient, where $\\mathbf{F}$ is an m × m real square matrix with positive determinant, $\\mathbf{U}$, $\\mathbf{V}^*$ and $\\boldsymbol{\\Sigma}$ are real m × m matrices as well, $\\boldsymbol{\\Sigma}$ can be regarded as a scaling matrix, and $\\mathbf{U}$, $\\mathbf{V}^*$ can be viewed as rotation matrices. Thus the expression $\\mathbf{U} \\boldsymbol{\\Sigma} \\mathbf{V}^*$ can be intuitively interpreted as a composition (or sequence) of three transformations: a rotation, a scaling, and another rotation. For instance, the figure above explains how a shear matrix can be described as such a sequence.\n", 250 | "" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": {}, 256 | "source": [ 257 | "Knowing that and using `numpy.linalg.svd` function, we can define functions to calculate axial ratio or orientation of strain ellipse" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 10, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [ 268 | "# function to calculate axial ratio of strain ellipse\n", 269 | "def axialratio(F):\n", 270 | " u,s,v = svd(F)\n", 271 | " return s[0]/s[1]\n", 272 | "# function to calculate orientation of long axis of the strain ellipse (counterclockwise from horizontal)\n", 273 | "def orientation(F):\n", 274 | " u,s,v = svd(F)\n", 275 | " return rad2deg(arctan2(u[1,0], u[0,0]))" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": 11, 281 | "metadata": {}, 282 | "outputs": [], 283 | "source": [ 284 | "F = array([[1, 1], [0, 1]])" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 12, 290 | "metadata": {}, 291 | "outputs": [ 292 | { 293 | "data": { 294 | "text/plain": [ 295 | "2.6180339887498953" 296 | ] 297 | }, 298 | "execution_count": 12, 299 | "metadata": {}, 300 | "output_type": "execute_result" 301 | } 302 | ], 303 | "source": [ 304 | "axialratio(F)" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": 13, 310 | "metadata": {}, 311 | "outputs": [ 312 | { 313 | "data": { 314 | "text/plain": [ 315 | "31.717474411461009" 316 | ] 317 | }, 318 | "execution_count": 13, 319 | "metadata": {}, 320 | "output_type": "execute_result" 321 | } 322 | ], 323 | "source": [ 324 | "orientation(F)" 325 | ] 326 | }, 327 | { 328 | "cell_type": "markdown", 329 | "metadata": {}, 330 | "source": [ 331 | "Now we can visualize accumulation of deformation for pure shear and simple shear increments. Firstly we will defined range of increments to be plotted." 332 | ] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "execution_count": 14, 337 | "metadata": { 338 | "collapsed": true 339 | }, 340 | "outputs": [], 341 | "source": [ 342 | "nrange = arange(1, 100)" 343 | ] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "metadata": {}, 348 | "source": [ 349 | "Now we calculate axial ratios of accumulated pure shear" 350 | ] 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": 15, 355 | "metadata": {}, 356 | "outputs": [], 357 | "source": [ 358 | "PSar = [axialratio(matrix_power(PSi, n)) for n in nrange]\n", 359 | "SSar = [axialratio(matrix_power(SSi, n)) for n in nrange]" 360 | ] 361 | }, 362 | { 363 | "cell_type": "code", 364 | "execution_count": 16, 365 | "metadata": {}, 366 | "outputs": [ 367 | { 368 | "data": { 369 | "text/plain": [ 370 | "" 371 | ] 372 | }, 373 | "execution_count": 16, 374 | "metadata": {}, 375 | "output_type": "execute_result" 376 | }, 377 | { 378 | "data": { 379 | "image/png": "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\n", 380 | "text/plain": [ 381 | "" 382 | ] 383 | }, 384 | "metadata": {}, 385 | "output_type": "display_data" 386 | } 387 | ], 388 | "source": [ 389 | "plot(nrange, PSar, label='pure shear')\n", 390 | "plot(nrange, SSar, label='simple shear')\n", 391 | "plt.legend(loc=2)" 392 | ] 393 | }, 394 | { 395 | "cell_type": "markdown", 396 | "metadata": {}, 397 | "source": [ 398 | "To visualize change of angle between long axis of strain ellipse and shear zone boundary during simple shear, we can use similar approach:" 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 17, 404 | "metadata": { 405 | "collapsed": true 406 | }, 407 | "outputs": [], 408 | "source": [ 409 | "nrange = arange(1, 1000)\n", 410 | "ang = [orientation(matrix_power(SSi, n)) for n in nrange]" 411 | ] 412 | }, 413 | { 414 | "cell_type": "code", 415 | "execution_count": 18, 416 | "metadata": {}, 417 | "outputs": [ 418 | { 419 | "data": { 420 | "text/plain": [ 421 | "[]" 422 | ] 423 | }, 424 | "execution_count": 18, 425 | "metadata": {}, 426 | "output_type": "execute_result" 427 | }, 428 | { 429 | "data": { 430 | "image/png": "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\n", 431 | "text/plain": [ 432 | "" 433 | ] 434 | }, 435 | "metadata": {}, 436 | "output_type": "display_data" 437 | } 438 | ], 439 | "source": [ 440 | "plot(nrange, ang)" 441 | ] 442 | }, 443 | { 444 | "cell_type": "code", 445 | "execution_count": 19, 446 | "metadata": {}, 447 | "outputs": [ 448 | { 449 | "data": { 450 | "text/html": [ 451 | "\n", 452 | "\n", 524 | "\n" 539 | ], 540 | "text/plain": [ 541 | "" 542 | ] 543 | }, 544 | "execution_count": 19, 545 | "metadata": {}, 546 | "output_type": "execute_result" 547 | } 548 | ], 549 | "source": [ 550 | "from IPython.core.display import HTML\n", 551 | "def css_styling():\n", 552 | " styles = open(\"./css/sg2.css\", \"r\").read()\n", 553 | " return HTML(styles)\n", 554 | "css_styling()" 555 | ] 556 | }, 557 | { 558 | "cell_type": "code", 559 | "execution_count": null, 560 | "metadata": { 561 | "collapsed": true 562 | }, 563 | "outputs": [], 564 | "source": [] 565 | } 566 | ], 567 | "metadata": { 568 | "kernelspec": { 569 | "display_name": "Python 3", 570 | "language": "python", 571 | "name": "python3" 572 | }, 573 | "language_info": { 574 | "codemirror_mode": { 575 | "name": "ipython", 576 | "version": 3 577 | }, 578 | "file_extension": ".py", 579 | "mimetype": "text/x-python", 580 | "name": "python", 581 | "nbconvert_exporter": "python", 582 | "pygments_lexer": "ipython3", 583 | "version": "3.6.3" 584 | } 585 | }, 586 | "nbformat": 4, 587 | "nbformat_minor": 1 588 | } 589 | -------------------------------------------------------------------------------- /20_Introduction_to_stress_in_geology.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Stress in geology" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "In continuum mechanics, the Cauchy **stress tensor** $\\boldsymbol\\sigma$ is a second order tensor, with nine components $\\sigma_{ij}$, that completely define the state of stress at a point inside a material in the deformed placement or configuration.\n", 15 | "\n", 16 | "\n", 17 | "\n", 18 | "$$\\boldsymbol{\\sigma} = \\sigma_{ij} = \\left[{\\begin{matrix} \\mathbf{T}^{(\\mathbf{e}_1)} & \\mathbf{T}^{(\\mathbf{e}_2)} & \\mathbf{T}^{(\\mathbf{e}_3)} \\end{matrix}}\\right] = \\left[{\\begin{matrix} \\sigma _{11} & \\sigma _{21} & \\sigma _{31} \\\\ \\sigma _{12} & \\sigma _{22} & \\sigma _{32} \\\\ \\sigma _{13} & \\sigma _{23} & \\sigma _{33} \\\\ \\end{matrix}}\\right]$$" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "where $\\sigma_{11}$, $\\sigma_{22}$, and $\\sigma_{33}$ are normal stresses, and $\\sigma_{12}$, $\\sigma_{13}$, $\\sigma_{21}$, $\\sigma_{23}$, $\\sigma_{31}$, and $\\sigma_{32}$ are shear stresses." 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "#### Note\n", 33 | "The first index $i$ indicates that the stress acts on a plane normal to the $x_i$-axis, and the second index $j$ denotes the direction in which the stress acts.\n", 34 | "A stress component is positive if it acts in the positive direction of the coordinate axes, and if the plane where it acts has an outward normal vector pointing in the positive coordinate direction." 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": {}, 40 | "source": [ 41 | "## Cauchy’s stress theorem—stress tensor\n", 42 | "According to Cauchy’s fundamental theorem, also called **Cauchy's stress theorem**, merely by knowing the stress vectors on three mutually perpendicular planes, the stress vector on any other plane passing through that point can be found through coordinate transformation equations.\n", 43 | "\n", 44 | "$$\\left[ {\\begin{array}{*{20}{c}}\n", 45 | " {T_1^{\\left( n \\right)}} \\\\\n", 46 | " {T_2^{\\left( n \\right)}} \\\\\n", 47 | " {T_3^{\\left( n \\right)}} \\\\\n", 48 | "\\end{array}} \\right] = \\left[ {\\begin{array}{*{20}{c}}\n", 49 | " {{\\sigma _{11}}} & {{\\sigma _{21}}} & {{\\sigma _{31}}} \\\\\n", 50 | " {{\\sigma _{12}}} & {{\\sigma _{22}}} & {{\\sigma _{32}}} \\\\\n", 51 | " {{\\sigma _{13}}} & {{\\sigma _{23}}} & {{\\sigma _{33}}} \\\\\n", 52 | "\\end{array}} \\right] \\cdot \\left[ {\\begin{array}{*{20}{c}}\n", 53 | " {{n_1}} \\\\\n", 54 | " {{n_2}} \\\\\n", 55 | " {{n_3}} \\\\\n", 56 | "\\end{array}} \\right] \\quad \\text{or} \\quad \\mathbf{T}^{(\\mathbf{n})} = \\sigma _{ij} \\cdot \\bf{n}$$\n", 57 | "\n", 58 | "This equation implies that the stress vector $\\bf{T}^{\\left( n \\right)}$ at any point $P$ in a continuum associated with a plane with normal unit vector $n$\n", 59 | "can be expressed as a function of the stress vectors on the planes perpendicular to the coordinate axes, i.e. in terms of the components $\\sigma_{ij}$ of the stress tensor $\\boldsymbol{\\sigma}$.\n" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "### 2D example\n", 67 | "Let's see how we can derive the Cauchy's stress theorem in 2D based on force balance on triangular element." 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": {}, 73 | "source": [ 74 | "" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "According to force balance $\\sum{\\mathbf{F}} = \\mathbf{0}$\n", 82 | "\n", 83 | "$$T_1\\cdot dA = \\sigma_1\\cdot dA_1 = \\sigma_1\\cdot dA\\cdot n_1$$\n", 84 | "$$T_2\\cdot dA = \\sigma_2\\cdot dA_2 = \\sigma_2\\cdot dA\\cdot n_2$$\n", 85 | "\n", 86 | "or\n", 87 | "\n", 88 | "$$\\left[ {\\begin{array}{}T_1 \\\\ T_2 \\end{array}} \\right] =\n", 89 | "\\left[ {\\begin{array}{}\\sigma_1 & 0 \\\\ 0 & \\sigma_2 \\end{array}} \\right]\n", 90 | "\\cdot \\left[ {\\begin{array}{} n_1 \\\\ n_2 \\end{array}} \\right]$$" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "Similarily, we can derive equation for triangular element which is not aligned with principal stresses." 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "According to force balance $\\sum{\\mathbf{F}} = \\mathbf{0}$\n", 112 | "\n", 113 | "$$T_1\\cdot dA = \\sigma_{11}\\cdot dA_1 + \\sigma_{21}\\cdot dA_2 = \\sigma_{11}\\cdot dA\\cdot n_1 + \\sigma_{21}\\cdot dA\\cdot n_2$$\n", 114 | "$$T_2\\cdot dA = \\sigma_{12}\\cdot dA_1 + \\sigma_{22}\\cdot dA_2 = \\sigma_{12}\\cdot dA\\cdot n_1 + \\sigma_{22}\\cdot dA\\cdot n_2$$\n", 115 | "\n", 116 | "or\n", 117 | "\n", 118 | "$$\\left[ {\\begin{array}{}T_1 \\\\ T_2 \\end{array}} \\right] =\n", 119 | "\\left[ {\\begin{array}{}\\sigma_{11} & \\sigma_{21} \\\\ \\sigma_{12} & \\sigma_{22} \\end{array}} \\right]\n", 120 | "\\cdot \\left[ {\\begin{array}{} n_1 \\\\ n_2 \\end{array}} \\right]$$" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "## Experiment 1\n", 128 | "Lets explore what is relation between normal and shear stress on randomly oriented planes in 2D." 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 1, 134 | "metadata": {}, 135 | "outputs": [ 136 | { 137 | "name": "stdout", 138 | "output_type": "stream", 139 | "text": [ 140 | "Populating the interactive namespace from numpy and matplotlib\n" 141 | ] 142 | } 143 | ], 144 | "source": [ 145 | "%pylab inline" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 2, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "data": { 155 | "image/png": "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\n", 156 | "text/plain": [ 157 | "
" 158 | ] 159 | }, 160 | "metadata": { 161 | "needs_background": "light" 162 | }, 163 | "output_type": "display_data" 164 | } 165 | ], 166 | "source": [ 167 | "S = array([[10, 0], [0, 5]])\n", 168 | "tau = []\n", 169 | "sn = []\n", 170 | "\n", 171 | "for theta in pi*uniform(size=5000):\n", 172 | " n = array([cos(theta), sin(theta)])\n", 173 | " sv = dot(S, n)\n", 174 | " sn.append(dot(sv, n))\n", 175 | " tau.append(norm(sv-n*dot(sv, n)))\n", 176 | "\n", 177 | "plot(sn, tau, 'k.')\n", 178 | "axis('equal')\n", 179 | "margins(x=0.1, y=0.1)\n", 180 | "show()" 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "metadata": {}, 186 | "source": [ 187 | "The above figure represents **Mohr circle**, named after Christian Otto Mohr, for stress in 2D" 188 | ] 189 | }, 190 | { 191 | "cell_type": "markdown", 192 | "metadata": {}, 193 | "source": [ 194 | "## Experiment 2\n", 195 | "Now we will explore what is relation between normal and shear stress on randomly oriented planes in 3D.\n", 196 | "Note that uniformly distributed unit vectors in 3D are calculated from properly scaled vectors with components chosen from normal distribution." 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 3, 202 | "metadata": {}, 203 | "outputs": [], 204 | "source": [ 205 | "def rand_vec():\n", 206 | " v = uniform(size=3)\n", 207 | " return v / norm(v)" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": 4, 213 | "metadata": {}, 214 | "outputs": [ 215 | { 216 | "data": { 217 | "image/png": "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\n", 218 | "text/plain": [ 219 | "
" 220 | ] 221 | }, 222 | "metadata": { 223 | "needs_background": "light" 224 | }, 225 | "output_type": "display_data" 226 | } 227 | ], 228 | "source": [ 229 | "S = array([[5, 0, 0], [0, 9, 0], [0, 0, 15]])\n", 230 | "tau = []\n", 231 | "sn = []\n", 232 | "\n", 233 | "for i in range(5000):\n", 234 | " n = rand_vec()\n", 235 | " sv = dot(S, n)\n", 236 | " sn.append(dot(sv, n))\n", 237 | " tau.append(norm(sv-n*dot(sv, n)))\n", 238 | "\n", 239 | "plot(sn, tau, 'k.')\n", 240 | "axis('equal')\n", 241 | "margins(x=0.1, y=0.1)\n", 242 | "show()\n" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "The above figure represents Mohr's circles for a three-dimensional state of stress" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 5, 255 | "metadata": {}, 256 | "outputs": [ 257 | { 258 | "data": { 259 | "text/html": [ 260 | "\n", 261 | "\n", 333 | "\n" 348 | ], 349 | "text/plain": [ 350 | "" 351 | ] 352 | }, 353 | "execution_count": 5, 354 | "metadata": {}, 355 | "output_type": "execute_result" 356 | } 357 | ], 358 | "source": [ 359 | "from IPython.core.display import HTML\n", 360 | "def css_styling():\n", 361 | " styles = open(\"./css/sg2.css\", \"r\").read()\n", 362 | " return HTML(styles)\n", 363 | "css_styling()" 364 | ] 365 | } 366 | ], 367 | "metadata": { 368 | "kernelspec": { 369 | "display_name": "Python 3", 370 | "language": "python", 371 | "name": "python3" 372 | }, 373 | "language_info": { 374 | "codemirror_mode": { 375 | "name": "ipython", 376 | "version": 3 377 | }, 378 | "file_extension": ".py", 379 | "mimetype": "text/x-python", 380 | "name": "python", 381 | "nbconvert_exporter": "python", 382 | "pygments_lexer": "ipython3", 383 | "version": "3.6.6" 384 | } 385 | }, 386 | "nbformat": 4, 387 | "nbformat_minor": 1 388 | } 389 | -------------------------------------------------------------------------------- /00_Python_Crash_Course.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Python Crash Course" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "### Ondrej Lexa 2017\n", 19 | "Hello! This is a quick intro to programming in Python to help you hit the ground running with the _Advanced Structural Geology_. " 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": { 25 | "slideshow": { 26 | "slide_type": "slide" 27 | } 28 | }, 29 | "source": [ 30 | "## Why Python ?\n", 31 | "[Python](http://www.python.org/) is a modern, general-purpose, object-oriented, high-level programming language. It is the programming language of choice for many scientists to a large degree because it offers a great deal of power to analyze and model scientific data with relatively little overhead in terms of learning, installation or development time. It is a language you can pick up in a weekend, and use for the rest of one's life." 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": { 37 | "slideshow": { 38 | "slide_type": "subslide" 39 | } 40 | }, 41 | "source": [ 42 | "### General characteristics of Python\n", 43 | "\n", 44 | "* **clean and simple language:** Easy-to-read and intuitive code, easy-to-learn minimalistic syntax, maintainability scales well with size of projects.\n", 45 | "* **expressive language:** Fewer lines of code, fewer bugs, easier to maintain." 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": { 51 | "slideshow": { 52 | "slide_type": "subslide" 53 | } 54 | }, 55 | "source": [ 56 | "### Advantages\n", 57 | "\n", 58 | "* The main advantage is ease of programming, minimizing the time required to develop, debug and maintain the code.\n", 59 | "* Well designed language that encourage many good programming practices:\n", 60 | " * Modular and object-oriented programming, good system for packaging and re-use of code. This often results in more transparent, maintainable and bug-free code.\n", 61 | " * Documentation tightly integrated with the code.\n", 62 | "* A large standard library, and a large collection of add-on packages." 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": { 68 | "slideshow": { 69 | "slide_type": "slide" 70 | } 71 | }, 72 | "source": [ 73 | "The first step in using Python for _Stress and strain analyses in geology_ is to get Python installed w/ the appropriate scientific dependencies." 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": { 79 | "slideshow": { 80 | "slide_type": "slide" 81 | } 82 | }, 83 | "source": [ 84 | "## Installation\n", 85 | "Configuration of Python for scientific computing has historically been a huge pain, but recently has gotten a whole lot easier with the advent of two scientific distributions for Python that come with package managers: [Canopy](https://www.enthought.com/products/canopy/) by [Enthought](www.enthought.com), and [Anaconda](http://docs.continuum.io/anaconda/) by [Continuum Analytics](http://continuum.io). I have used Anaconda extensively, and find it a little easier because it's lighter-weight and is self-contained: it stays in a folder where you place it, doesn't touch the system Python, and doesn't require root/sudo access to install or modify packages. This means it's easy to place on shared computing resources. Best of all, it uses a package manager called `conda` that is extremely easy to use." 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": { 91 | "slideshow": { 92 | "slide_type": "subslide" 93 | } 94 | }, 95 | "source": [ 96 | "### Which one to choose ?\n", 97 | "This guide will deal exclusively with **Anaconda Python**. Anaconda is one of several Python distributions that provide the Python interpreter, together with a list of Python packages and sometimes other related tools, such as editors. The Anaconda Python distribution is easy to install, but other distributions provide similar functionality.\n", 98 | "\n", 99 | "The [packages provide by the Anaconda Python distribution](http://docs.continuum.io/anaconda/pkgs.html) includes all of those that we need, and for that reason we suggest to use Anaconda here.\n", 100 | "\n", 101 | "A key part of the Anaconda Python distribution is Spyder, an interactive development environment for Python, including an editor." 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": { 107 | "slideshow": { 108 | "slide_type": "slide" 109 | } 110 | }, 111 | "source": [ 112 | "### Installing Anaconda Python\n", 113 | "\n", 114 | "Installation of the Python interpreter is fairly straightforward, but installation of additional packages can be a bit tedious.\n", 115 | "\n", 116 | "Instead, we suggest to install the Anaconda Python distribution using [these installation instructions](http://docs.continuum.io/anaconda/install.html), which provides the Python interpreter itself and all packages we need.\n", 117 | "\n", 118 | "It is available for [download](http://continuum.io/downloads) for Windows, OS X and Linux operating systems (and free)." 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": { 124 | "slideshow": { 125 | "slide_type": "subslide" 126 | } 127 | }, 128 | "source": [ 129 | "For Windows and OS X you are given a choice whether to download the graphical installer or the next based installer. If you don't know what the terminal (OS X) or command prompt (Windows) is, then you are better advised to choose the graphical version. There are two branches of current releases in Python: the older-syntax Python 2, and the newer-syntax Python 3. Recently, the Python 3 is mature enough, so you want to install the Python 3 version.\n", 130 | "\n", 131 | "Download the installer, start it, and follow instructions. Accept default values as suggested.\n", 132 | "\n", 133 | "(If you are using Linux and you are happy to use the package manager of your distribution -- you will know who you are --, then you may be better advised to install the required packages indivdually rather than installing the whole Anaconda distribution.)" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": { 139 | "slideshow": { 140 | "slide_type": "slide" 141 | } 142 | }, 143 | "source": [ 144 | "## Running Python code\n", 145 | "\n", 146 | "### The standard Python interpreter\n", 147 | "\n", 148 | "Start it by typing `python` on the command line:\n", 149 | "\n", 150 | " $ python\n", 151 | " Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06) \n", 152 | " [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux\n", 153 | " Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n", 154 | " >>>\n", 155 | "\n", 156 | "* It shows an interpreter prompt.\n", 157 | "* You can give it Python code to interpret." 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": { 163 | "slideshow": { 164 | "slide_type": "subslide" 165 | } 166 | }, 167 | "source": [ 168 | "### The IPython interpreter\n", 169 | "\n", 170 | "* Similar to the standard Python interpreter, but with\n", 171 | "* syntax highlighting, tab completion, cross-session history, etcetera...\n", 172 | "\n", 173 | "Start it by typing `ipython` on the command line:\n", 174 | "\n", 175 | " $ ipython\n", 176 | " Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06) \n", 177 | " Type \"copyright\", \"credits\" or \"license\" for more information.\n", 178 | "\n", 179 | " IPython 5.1.0 -- An enhanced Interactive Python.\n", 180 | " ? -> Introduction and overview of IPython's features.\n", 181 | " %quickref -> Quick reference.\n", 182 | " help -> Python's own help system.\n", 183 | " object? -> Details about 'object', use 'object??' for extra details.\n", 184 | "\n", 185 | " In [1]:" 186 | ] 187 | }, 188 | { 189 | "cell_type": "markdown", 190 | "metadata": { 191 | "slideshow": { 192 | "slide_type": "slide" 193 | } 194 | }, 195 | "source": [ 196 | "## Python as a calculator\n", 197 | "Position your cursor in the code cell below and hit **`[shift][enter]`**. The output should be `42` (btw. The answer to the ultimate question of life, the universe and everything) (-:" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": 1, 203 | "metadata": { 204 | "slideshow": { 205 | "slide_type": "-" 206 | } 207 | }, 208 | "outputs": [ 209 | { 210 | "data": { 211 | "text/plain": [ 212 | "42" 213 | ] 214 | }, 215 | "execution_count": 1, 216 | "metadata": {}, 217 | "output_type": "execute_result" 218 | } 219 | ], 220 | "source": [ 221 | "2 * (1 + 2 + 3 + 4 + 5 + 6)" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 2, 227 | "metadata": { 228 | "slideshow": { 229 | "slide_type": "-" 230 | } 231 | }, 232 | "outputs": [ 233 | { 234 | "data": { 235 | "text/plain": [ 236 | "55.5" 237 | ] 238 | }, 239 | "execution_count": 2, 240 | "metadata": {}, 241 | "output_type": "execute_result" 242 | } 243 | ], 244 | "source": [ 245 | "3.2 * 18 - 2.1" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": { 251 | "slideshow": { 252 | "slide_type": "-" 253 | } 254 | }, 255 | "source": [ 256 | "Scientific notation:" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 3, 262 | "metadata": {}, 263 | "outputs": [ 264 | { 265 | "data": { 266 | "text/plain": [ 267 | "1.5e-07" 268 | ] 269 | }, 270 | "execution_count": 3, 271 | "metadata": {}, 272 | "output_type": "execute_result" 273 | } 274 | ], 275 | "source": [ 276 | "1.5e-10 * 1000" 277 | ] 278 | }, 279 | { 280 | "cell_type": "markdown", 281 | "metadata": { 282 | "slideshow": { 283 | "slide_type": "slide" 284 | } 285 | }, 286 | "source": [ 287 | "Python has a number of defined operators for handling numbers through arithmetic calculations, logic operations (that test whether a condition is true or false) or bitwise processing (where the numbers are processed in binary form)." 288 | ] 289 | }, 290 | { 291 | "cell_type": "markdown", 292 | "metadata": { 293 | "slideshow": { 294 | "slide_type": "subslide" 295 | } 296 | }, 297 | "source": [ 298 | "### Arithmetic Operations\n", 299 | "\n", 300 | " * Sum (+)\n", 301 | " * Difference (-)\n", 302 | " * Multiplication (*)\n", 303 | " * Division (/)\n", 304 | " * Integer Division (//)\n", 305 | " * Module (%): returns the remainder of the division.\n", 306 | " * Power (\\**): can be used to calculate the root, through fractional exponents (eg `100 0.5`).\n", 307 | " * Positive (+)\n", 308 | " * Negative (-)" 309 | ] 310 | }, 311 | { 312 | "cell_type": "markdown", 313 | "metadata": { 314 | "slideshow": { 315 | "slide_type": "subslide" 316 | } 317 | }, 318 | "source": [ 319 | "### Logical Operations\n", 320 | "\n", 321 | " * Less than (<)\n", 322 | " * Greater than (>)\n", 323 | " * Less than or equal to (<=)\n", 324 | " * Greater than or equal to (>=)\n", 325 | " * Equal to (==)\n", 326 | " * Not equal to (!=)" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": { 332 | "slideshow": { 333 | "slide_type": "slide" 334 | } 335 | }, 336 | "source": [ 337 | "## Libraries and modules\n", 338 | "Python has a huge number of libraries included with the distribution. To keep things simple, most of these variables and functions are not accessible from a normal Python interactive session. Instead, you have to import the name. For example, there is a math module containing many useful functions. To access, say, the square root function, you have to import the math library and than call functions from imported library." 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 4, 344 | "metadata": {}, 345 | "outputs": [ 346 | { 347 | "data": { 348 | "text/plain": [ 349 | "1.4142135623730951" 350 | ] 351 | }, 352 | "execution_count": 4, 353 | "metadata": {}, 354 | "output_type": "execute_result" 355 | } 356 | ], 357 | "source": [ 358 | "import math\n", 359 | "math.sqrt(2)" 360 | ] 361 | }, 362 | { 363 | "cell_type": "markdown", 364 | "metadata": { 365 | "slideshow": { 366 | "slide_type": "slide" 367 | } 368 | }, 369 | "source": [ 370 | "## Variables\n", 371 | "You can define variables using the equals (=) sign:" 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": 5, 377 | "metadata": {}, 378 | "outputs": [ 379 | { 380 | "data": { 381 | "text/plain": [ 382 | "600" 383 | ] 384 | }, 385 | "execution_count": 5, 386 | "metadata": {}, 387 | "output_type": "execute_result" 388 | } 389 | ], 390 | "source": [ 391 | "width = 20\n", 392 | "length = 30\n", 393 | "area = length*width\n", 394 | "area" 395 | ] 396 | }, 397 | { 398 | "cell_type": "markdown", 399 | "metadata": {}, 400 | "source": [ 401 | "You can name a variable *almost* anything you want. It needs to start with an alphabetical character or \"\\_\", can contain alphanumeric characters plus underscores (\"\\_\"). Certain words, however, are reserved for the language:\n", 402 | "\n", 403 | " and, as, assert, break, class, continue, def, del,\n", 404 | " elif, else, except, exec, finally, for, from, global,\n", 405 | " if, import, in, is, lambda, not, or, pass, print,\n", 406 | " raise, return, try, while, with, yield" 407 | ] 408 | }, 409 | { 410 | "cell_type": "markdown", 411 | "metadata": { 412 | "slideshow": { 413 | "slide_type": "slide" 414 | } 415 | }, 416 | "source": [ 417 | "## Strings\n", 418 | "The *strings* are Python *builtins* for handling text. String inicialization i.e. to create a new *string*, can be made:\n", 419 | "\n", 420 | "+ With single or double quotes.\n", 421 | "+ In several consecutive lines, provided that it done between three single or double quotes." 422 | ] 423 | }, 424 | { 425 | "cell_type": "code", 426 | "execution_count": 6, 427 | "metadata": {}, 428 | "outputs": [ 429 | { 430 | "data": { 431 | "text/plain": [ 432 | "'I love Structural Geology!'" 433 | ] 434 | }, 435 | "execution_count": 6, 436 | "metadata": {}, 437 | "output_type": "execute_result" 438 | } 439 | ], 440 | "source": [ 441 | "'I love Structural Geology!'" 442 | ] 443 | }, 444 | { 445 | "cell_type": "code", 446 | "execution_count": 7, 447 | "metadata": {}, 448 | "outputs": [ 449 | { 450 | "data": { 451 | "text/plain": [ 452 | "'I love Structural Geology!'" 453 | ] 454 | }, 455 | "execution_count": 7, 456 | "metadata": {}, 457 | "output_type": "execute_result" 458 | } 459 | ], 460 | "source": [ 461 | "\"I love Structural Geology!\"" 462 | ] 463 | }, 464 | { 465 | "cell_type": "code", 466 | "execution_count": 8, 467 | "metadata": {}, 468 | "outputs": [ 469 | { 470 | "data": { 471 | "text/plain": [ 472 | "'I love\\nStructural\\nGeology'" 473 | ] 474 | }, 475 | "execution_count": 8, 476 | "metadata": {}, 477 | "output_type": "execute_result" 478 | } 479 | ], 480 | "source": [ 481 | "'''I love\n", 482 | "Structural\n", 483 | "Geology'''" 484 | ] 485 | }, 486 | { 487 | "cell_type": "markdown", 488 | "metadata": { 489 | "slideshow": { 490 | "slide_type": "subslide" 491 | } 492 | }, 493 | "source": [ 494 | "But not both at the same time, unless you want one of the symbols to be part of the string." 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "execution_count": 9, 500 | "metadata": {}, 501 | "outputs": [ 502 | { 503 | "data": { 504 | "text/plain": [ 505 | "\"He's a geologist\"" 506 | ] 507 | }, 508 | "execution_count": 9, 509 | "metadata": {}, 510 | "output_type": "execute_result" 511 | } 512 | ], 513 | "source": [ 514 | "\"He's a geologist\"" 515 | ] 516 | }, 517 | { 518 | "cell_type": "code", 519 | "execution_count": 10, 520 | "metadata": {}, 521 | "outputs": [ 522 | { 523 | "data": { 524 | "text/plain": [ 525 | "'She asked, \"Are you crazy?\"'" 526 | ] 527 | }, 528 | "execution_count": 10, 529 | "metadata": {}, 530 | "output_type": "execute_result" 531 | } 532 | ], 533 | "source": [ 534 | "'She asked, \"Are you crazy?\"'" 535 | ] 536 | }, 537 | { 538 | "cell_type": "markdown", 539 | "metadata": { 540 | "slideshow": { 541 | "slide_type": "subslide" 542 | } 543 | }, 544 | "source": [ 545 | "Just like the onumbers we're familiar with, you can assign a string to a variable" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 11, 551 | "metadata": { 552 | "collapsed": true 553 | }, 554 | "outputs": [], 555 | "source": [ 556 | "greeting = \"I love Structural Geology!\"" 557 | ] 558 | }, 559 | { 560 | "cell_type": "markdown", 561 | "metadata": {}, 562 | "source": [ 563 | "The print function is often used for printing character strings:" 564 | ] 565 | }, 566 | { 567 | "cell_type": "code", 568 | "execution_count": 12, 569 | "metadata": {}, 570 | "outputs": [ 571 | { 572 | "name": "stdout", 573 | "output_type": "stream", 574 | "text": [ 575 | "I love Structural Geology!\n" 576 | ] 577 | } 578 | ], 579 | "source": [ 580 | "print(greeting)" 581 | ] 582 | }, 583 | { 584 | "cell_type": "markdown", 585 | "metadata": { 586 | "slideshow": { 587 | "slide_type": "subslide" 588 | } 589 | }, 590 | "source": [ 591 | "But it can also print data types other than strings:" 592 | ] 593 | }, 594 | { 595 | "cell_type": "code", 596 | "execution_count": 13, 597 | "metadata": {}, 598 | "outputs": [ 599 | { 600 | "name": "stdout", 601 | "output_type": "stream", 602 | "text": [ 603 | "The area is 600\n" 604 | ] 605 | } 606 | ], 607 | "source": [ 608 | "print(\"The area is\", area)" 609 | ] 610 | }, 611 | { 612 | "cell_type": "markdown", 613 | "metadata": {}, 614 | "source": [ 615 | "You can use the + operator to concatenate strings together:" 616 | ] 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": 14, 621 | "metadata": {}, 622 | "outputs": [ 623 | { 624 | "data": { 625 | "text/plain": [ 626 | "'I love Structural Geology!'" 627 | ] 628 | }, 629 | "execution_count": 14, 630 | "metadata": {}, 631 | "output_type": "execute_result" 632 | } 633 | ], 634 | "source": [ 635 | "\"I \" + \"love \" + \"Structural \" + \"Geology!\"" 636 | ] 637 | }, 638 | { 639 | "cell_type": "markdown", 640 | "metadata": { 641 | "slideshow": { 642 | "slide_type": "subslide" 643 | } 644 | }, 645 | "source": [ 646 | "The operator `%` is used for string interpolation. The interpolation is more efficient in use of memory than the conventional concatenation.\n", 647 | "\n", 648 | "Symbols used in the interpolation:\n", 649 | "\n", 650 | "+ %s: *string*.\n", 651 | "+ %d: integer.\n", 652 | "+ %o: octal.\n", 653 | "+ %x: hexacimal.\n", 654 | "+ %f: real.\n", 655 | "+ %e: real exponential.\n", 656 | "+ %%: percent sign." 657 | ] 658 | }, 659 | { 660 | "cell_type": "markdown", 661 | "metadata": { 662 | "slideshow": { 663 | "slide_type": "subslide" 664 | } 665 | }, 666 | "source": [ 667 | "Symbols can be used to display numbers in various formats." 668 | ] 669 | }, 670 | { 671 | "cell_type": "code", 672 | "execution_count": 15, 673 | "metadata": {}, 674 | "outputs": [ 675 | { 676 | "name": "stdout", 677 | "output_type": "stream", 678 | "text": [ 679 | "Now is 16:30.\n", 680 | "Percent: 5.3%, Exponencial:3.14e-03\n", 681 | "Decimal: 10, Octal: 12, Hexadecimal: a\n" 682 | ] 683 | } 684 | ], 685 | "source": [ 686 | "# Zeros left\n", 687 | "print('Now is %02d:%02d.' % (16, 30))\n", 688 | "\n", 689 | "# Real (The number after the decimal point specifies how many decimal digits )\n", 690 | "print('Percent: %.1f%%, Exponencial:%.2e' % (5.333, 0.00314))\n", 691 | "\n", 692 | "# Octal and hexadecimal\n", 693 | "print('Decimal: %d, Octal: %o, Hexadecimal: %x' % (10, 10, 10))" 694 | ] 695 | }, 696 | { 697 | "cell_type": "markdown", 698 | "metadata": { 699 | "slideshow": { 700 | "slide_type": "subslide" 701 | } 702 | }, 703 | "source": [ 704 | "In addition to interpolation operator `%`, there is the string method and function `format()`.\n", 705 | "Examples:" 706 | ] 707 | }, 708 | { 709 | "cell_type": "code", 710 | "execution_count": 16, 711 | "metadata": {}, 712 | "outputs": [ 713 | { 714 | "name": "stdout", 715 | "output_type": "stream", 716 | "text": [ 717 | "The area of square with side 5 is 25\n", 718 | "Hi, it is 07:30AM\n", 719 | "Pi = 3.141592653589793\n" 720 | ] 721 | } 722 | ], 723 | "source": [ 724 | "# Parameters are identified by order\n", 725 | "print('The area of square with side {0} is {1}'.format(5, 5*5))\n", 726 | "\n", 727 | "# Parameters are identified by name\n", 728 | "print('{greeting}, it is {hour:02d}:{minute:02d}AM'.format(greeting='Hi', hour=7, minute=30))\n", 729 | "\n", 730 | "# Builtin function format()\n", 731 | "print('Pi =', format(math.pi, '.15f'))" 732 | ] 733 | }, 734 | { 735 | "cell_type": "markdown", 736 | "metadata": { 737 | "slideshow": { 738 | "slide_type": "slide" 739 | } 740 | }, 741 | "source": [ 742 | "### Slicing strings\n", 743 | "*Slices* of *strings* can be obtained by adding indexes between brackets after a *string*.\n", 744 | "\n", 745 | "Python indexes:\n", 746 | "\n", 747 | "+ Start with zero.\n", 748 | "+ Count from the end if they are negative.\n", 749 | "+ Can be defined as sections, in the form `[start: end + 1: step]`. If not set the start, it will be considered as zero. If not set end + 1, it will be considered the size of the object. The step (between characters), if not set, is 1." 750 | ] 751 | }, 752 | { 753 | "cell_type": "code", 754 | "execution_count": 17, 755 | "metadata": { 756 | "slideshow": { 757 | "slide_type": "subslide" 758 | } 759 | }, 760 | "outputs": [ 761 | { 762 | "data": { 763 | "text/plain": [ 764 | "'I love Structural Geology!'" 765 | ] 766 | }, 767 | "execution_count": 17, 768 | "metadata": {}, 769 | "output_type": "execute_result" 770 | } 771 | ], 772 | "source": [ 773 | "greeting" 774 | ] 775 | }, 776 | { 777 | "cell_type": "code", 778 | "execution_count": 18, 779 | "metadata": {}, 780 | "outputs": [ 781 | { 782 | "data": { 783 | "text/plain": [ 784 | "'S'" 785 | ] 786 | }, 787 | "execution_count": 18, 788 | "metadata": {}, 789 | "output_type": "execute_result" 790 | } 791 | ], 792 | "source": [ 793 | "greeting[7]" 794 | ] 795 | }, 796 | { 797 | "cell_type": "code", 798 | "execution_count": 19, 799 | "metadata": {}, 800 | "outputs": [ 801 | { 802 | "data": { 803 | "text/plain": [ 804 | "'love'" 805 | ] 806 | }, 807 | "execution_count": 19, 808 | "metadata": {}, 809 | "output_type": "execute_result" 810 | } 811 | ], 812 | "source": [ 813 | "greeting[2:6]" 814 | ] 815 | }, 816 | { 817 | "cell_type": "code", 818 | "execution_count": 20, 819 | "metadata": {}, 820 | "outputs": [ 821 | { 822 | "data": { 823 | "text/plain": [ 824 | "'Geology!'" 825 | ] 826 | }, 827 | "execution_count": 20, 828 | "metadata": {}, 829 | "output_type": "execute_result" 830 | } 831 | ], 832 | "source": [ 833 | "greeting[18:]" 834 | ] 835 | }, 836 | { 837 | "cell_type": "code", 838 | "execution_count": 21, 839 | "metadata": {}, 840 | "outputs": [ 841 | { 842 | "data": { 843 | "text/plain": [ 844 | "'Srcua'" 845 | ] 846 | }, 847 | "execution_count": 21, 848 | "metadata": {}, 849 | "output_type": "execute_result" 850 | } 851 | ], 852 | "source": [ 853 | "greeting[7:17:2]" 854 | ] 855 | }, 856 | { 857 | "cell_type": "markdown", 858 | "metadata": { 859 | "slideshow": { 860 | "slide_type": "subslide" 861 | } 862 | }, 863 | "source": [ 864 | "It is possible to invert *strings* by using a negative step:" 865 | ] 866 | }, 867 | { 868 | "cell_type": "code", 869 | "execution_count": 22, 870 | "metadata": {}, 871 | "outputs": [ 872 | { 873 | "data": { 874 | "text/plain": [ 875 | "'!ygoloeG larutcurtS evol I'" 876 | ] 877 | }, 878 | "execution_count": 22, 879 | "metadata": {}, 880 | "output_type": "execute_result" 881 | } 882 | ], 883 | "source": [ 884 | "greeting[::-1]" 885 | ] 886 | }, 887 | { 888 | "cell_type": "markdown", 889 | "metadata": { 890 | "slideshow": { 891 | "slide_type": "slide" 892 | } 893 | }, 894 | "source": [ 895 | "## Types\n", 896 | "Every value or variable in Python has a type. There are several pre-defined (builtin) simple types of data in the Python, such as:\n", 897 | "\n", 898 | " * Numbers: Integer (int), Floating Point real (float), Complex (complex)\n", 899 | " * Text\n", 900 | "\n", 901 | "You can view type of variable using function `type`:" 902 | ] 903 | }, 904 | { 905 | "cell_type": "code", 906 | "execution_count": 23, 907 | "metadata": {}, 908 | "outputs": [ 909 | { 910 | "data": { 911 | "text/plain": [ 912 | "int" 913 | ] 914 | }, 915 | "execution_count": 23, 916 | "metadata": {}, 917 | "output_type": "execute_result" 918 | } 919 | ], 920 | "source": [ 921 | "type(area)" 922 | ] 923 | }, 924 | { 925 | "cell_type": "code", 926 | "execution_count": 24, 927 | "metadata": {}, 928 | "outputs": [ 929 | { 930 | "data": { 931 | "text/plain": [ 932 | "float" 933 | ] 934 | }, 935 | "execution_count": 24, 936 | "metadata": {}, 937 | "output_type": "execute_result" 938 | } 939 | ], 940 | "source": [ 941 | "type(math.sqrt(2))" 942 | ] 943 | }, 944 | { 945 | "cell_type": "code", 946 | "execution_count": 25, 947 | "metadata": { 948 | "scrolled": true 949 | }, 950 | "outputs": [ 951 | { 952 | "data": { 953 | "text/plain": [ 954 | "str" 955 | ] 956 | }, 957 | "execution_count": 25, 958 | "metadata": {}, 959 | "output_type": "execute_result" 960 | } 961 | ], 962 | "source": [ 963 | "type(greeting)" 964 | ] 965 | }, 966 | { 967 | "cell_type": "markdown", 968 | "metadata": { 969 | "slideshow": { 970 | "slide_type": "subslide" 971 | } 972 | }, 973 | "source": [ 974 | "Furthermore, there are types that function as collections. The main ones are:\n", 975 | "\n", 976 | " * List\n", 977 | " * Tuple\n", 978 | " * Dictionary\n", 979 | "\n", 980 | "Python types can be:\n", 981 | "\n", 982 | " * Mutable: allow the contents of the variables to be changed.\n", 983 | " * Immutable: do not allow the contents of variables to be changed.\n", 984 | "\n", 985 | "The most common types and routines are implemented in the form of builtins, ie, they are always available at runtime, without the need to import any library." 986 | ] 987 | }, 988 | { 989 | "cell_type": "markdown", 990 | "metadata": { 991 | "slideshow": { 992 | "slide_type": "slide" 993 | } 994 | }, 995 | "source": [ 996 | "## Lists\n", 997 | "Very often in a programming language, one wants to keep a group of similar items together. Python does this using a data type called **lists**." 998 | ] 999 | }, 1000 | { 1001 | "cell_type": "code", 1002 | "execution_count": 26, 1003 | "metadata": { 1004 | "collapsed": true 1005 | }, 1006 | "outputs": [], 1007 | "source": [ 1008 | "planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']" 1009 | ] 1010 | }, 1011 | { 1012 | "cell_type": "markdown", 1013 | "metadata": {}, 1014 | "source": [ 1015 | "You can access members of the list using the index of that item:" 1016 | ] 1017 | }, 1018 | { 1019 | "cell_type": "code", 1020 | "execution_count": 27, 1021 | "metadata": {}, 1022 | "outputs": [ 1023 | { 1024 | "data": { 1025 | "text/plain": [ 1026 | "'Earth'" 1027 | ] 1028 | }, 1029 | "execution_count": 27, 1030 | "metadata": {}, 1031 | "output_type": "execute_result" 1032 | } 1033 | ], 1034 | "source": [ 1035 | "planets[2]" 1036 | ] 1037 | }, 1038 | { 1039 | "cell_type": "markdown", 1040 | "metadata": { 1041 | "slideshow": { 1042 | "slide_type": "subslide" 1043 | } 1044 | }, 1045 | "source": [ 1046 | "The -1 element of a list is the last element:" 1047 | ] 1048 | }, 1049 | { 1050 | "cell_type": "code", 1051 | "execution_count": 28, 1052 | "metadata": { 1053 | "scrolled": true 1054 | }, 1055 | "outputs": [ 1056 | { 1057 | "data": { 1058 | "text/plain": [ 1059 | "'Neptune'" 1060 | ] 1061 | }, 1062 | "execution_count": 28, 1063 | "metadata": {}, 1064 | "output_type": "execute_result" 1065 | } 1066 | ], 1067 | "source": [ 1068 | "planets[-1]" 1069 | ] 1070 | }, 1071 | { 1072 | "cell_type": "markdown", 1073 | "metadata": { 1074 | "slideshow": { 1075 | "slide_type": "-" 1076 | } 1077 | }, 1078 | "source": [ 1079 | "Lists can be sliced in the same way that the *strings*." 1080 | ] 1081 | }, 1082 | { 1083 | "cell_type": "code", 1084 | "execution_count": 29, 1085 | "metadata": {}, 1086 | "outputs": [ 1087 | { 1088 | "data": { 1089 | "text/plain": [ 1090 | "['Mercury', 'Venus', 'Earth', 'Mars']" 1091 | ] 1092 | }, 1093 | "execution_count": 29, 1094 | "metadata": {}, 1095 | "output_type": "execute_result" 1096 | } 1097 | ], 1098 | "source": [ 1099 | "planets[:4]" 1100 | ] 1101 | }, 1102 | { 1103 | "cell_type": "markdown", 1104 | "metadata": {}, 1105 | "source": [ 1106 | "Lists could collect objects of any type, including other lists." 1107 | ] 1108 | }, 1109 | { 1110 | "cell_type": "markdown", 1111 | "metadata": { 1112 | "slideshow": { 1113 | "slide_type": "slide" 1114 | } 1115 | }, 1116 | "source": [ 1117 | "## Whitespace in Python\n", 1118 | "Python uses indents and whitespace to group statements together. To write a short loop in C, you might use:\n", 1119 | "\n", 1120 | " for (i = 0, i < 5, i++){\n", 1121 | " printf(\"Stress and strain\\n\");\n", 1122 | " }" 1123 | ] 1124 | }, 1125 | { 1126 | "cell_type": "markdown", 1127 | "metadata": {}, 1128 | "source": [ 1129 | "Python does not use curly braces like C, so the same program as above is written in Python as follows:" 1130 | ] 1131 | }, 1132 | { 1133 | "cell_type": "code", 1134 | "execution_count": 30, 1135 | "metadata": {}, 1136 | "outputs": [ 1137 | { 1138 | "name": "stdout", 1139 | "output_type": "stream", 1140 | "text": [ 1141 | "Stress and strain\n", 1142 | "Stress and strain\n", 1143 | "Stress and strain\n" 1144 | ] 1145 | } 1146 | ], 1147 | "source": [ 1148 | "for i in range(3):\n", 1149 | " print(\"Stress and strain\")" 1150 | ] 1151 | }, 1152 | { 1153 | "cell_type": "markdown", 1154 | "metadata": { 1155 | "slideshow": { 1156 | "slide_type": "subslide" 1157 | } 1158 | }, 1159 | "source": [ 1160 | "If you have nested for-loops, there is a further indent for the inner loop." 1161 | ] 1162 | }, 1163 | { 1164 | "cell_type": "code", 1165 | "execution_count": 31, 1166 | "metadata": {}, 1167 | "outputs": [ 1168 | { 1169 | "name": "stdout", 1170 | "output_type": "stream", 1171 | "text": [ 1172 | "i:0 j:0\n", 1173 | "i:0 j:1\n", 1174 | "i:0 j:2\n", 1175 | "This statement is within the outer i-loop, but not the inner j-loop\n", 1176 | "i:1 j:0\n", 1177 | "i:1 j:1\n", 1178 | "i:1 j:2\n", 1179 | "This statement is within the outer i-loop, but not the inner j-loop\n", 1180 | "i:2 j:0\n", 1181 | "i:2 j:1\n", 1182 | "i:2 j:2\n", 1183 | "This statement is within the outer i-loop, but not the inner j-loop\n" 1184 | ] 1185 | } 1186 | ], 1187 | "source": [ 1188 | "for i in range(3):\n", 1189 | " for j in range(3):\n", 1190 | " print('i:{} j:{}'.format(i, j))\n", 1191 | " \n", 1192 | " print(\"This statement is within the outer i-loop, but not the inner j-loop\")" 1193 | ] 1194 | }, 1195 | { 1196 | "cell_type": "markdown", 1197 | "metadata": { 1198 | "slideshow": { 1199 | "slide_type": "slide" 1200 | } 1201 | }, 1202 | "source": [ 1203 | "## Scientific Python Environment\n", 1204 | "Python is a high-level open-source language. But the _Scientific Python Environment_ is inhabited by many packages or libraries that provide useful things like array operations, plotting functions, and much more. We can import libraries of functions to expand the capabilities of Python in our programs. \n", 1205 | "OK! We'll start by importing a few libraries to help us out. In most cases we will use `pylab` environment, which contains most important parts of `numpy` and `matplotlib`. To import it to our notebook, we can use `%pylab` magic with inline option for `inline` graphics." 1206 | ] 1207 | }, 1208 | { 1209 | "cell_type": "code", 1210 | "execution_count": 32, 1211 | "metadata": {}, 1212 | "outputs": [ 1213 | { 1214 | "name": "stdout", 1215 | "output_type": "stream", 1216 | "text": [ 1217 | "Populating the interactive namespace from numpy and matplotlib\n" 1218 | ] 1219 | } 1220 | ], 1221 | "source": [ 1222 | "%pylab inline" 1223 | ] 1224 | }, 1225 | { 1226 | "cell_type": "markdown", 1227 | "metadata": { 1228 | "slideshow": { 1229 | "slide_type": "subslide" 1230 | } 1231 | }, 1232 | "source": [ 1233 | "So what just happened? We just imported most of `numpy` and `matplotlib` into current workspace, so their functions are from now available to use. So if we want to use the numpy function `linspace`, for instance, we can call it by writing:" 1234 | ] 1235 | }, 1236 | { 1237 | "cell_type": "code", 1238 | "execution_count": 33, 1239 | "metadata": {}, 1240 | "outputs": [ 1241 | { 1242 | "data": { 1243 | "text/plain": [ 1244 | "array([-10., -8., -6., -4., -2., 0., 2., 4., 6., 8., 10.])" 1245 | ] 1246 | }, 1247 | "execution_count": 33, 1248 | "metadata": {}, 1249 | "output_type": "execute_result" 1250 | } 1251 | ], 1252 | "source": [ 1253 | "linspace(-10, 10, 11)" 1254 | ] 1255 | }, 1256 | { 1257 | "cell_type": "markdown", 1258 | "metadata": {}, 1259 | "source": [ 1260 | "> To learn new functions available to you, visit the [NumPy Reference](http://docs.scipy.org/doc/numpy/reference/) page. If you are a proficient MATLAB user, there is a wiki page that should prove helpful to you: [NumPy for Matlab Users](http://wiki.scipy.org/NumPy_for_Matlab_Users)" 1261 | ] 1262 | }, 1263 | { 1264 | "cell_type": "markdown", 1265 | "metadata": { 1266 | "slideshow": { 1267 | "slide_type": "slide" 1268 | } 1269 | }, 1270 | "source": [ 1271 | "## Slicing Arrays" 1272 | ] 1273 | }, 1274 | { 1275 | "cell_type": "markdown", 1276 | "metadata": {}, 1277 | "source": [ 1278 | "In NumPy, you can look at portions of arrays in the same way as in `Matlab`, with a few extra tricks thrown in. Let's take an array of values from 1 to 5." 1279 | ] 1280 | }, 1281 | { 1282 | "cell_type": "code", 1283 | "execution_count": 34, 1284 | "metadata": {}, 1285 | "outputs": [ 1286 | { 1287 | "data": { 1288 | "text/plain": [ 1289 | "array([1, 2, 3, 4, 5])" 1290 | ] 1291 | }, 1292 | "execution_count": 34, 1293 | "metadata": {}, 1294 | "output_type": "execute_result" 1295 | } 1296 | ], 1297 | "source": [ 1298 | "vals = array([1, 2, 3, 4, 5])\n", 1299 | "vals" 1300 | ] 1301 | }, 1302 | { 1303 | "cell_type": "markdown", 1304 | "metadata": {}, 1305 | "source": [ 1306 | "Python uses a **zero-based index**, so let's look at the first and last element in the array `myvals`" 1307 | ] 1308 | }, 1309 | { 1310 | "cell_type": "code", 1311 | "execution_count": 35, 1312 | "metadata": {}, 1313 | "outputs": [ 1314 | { 1315 | "data": { 1316 | "text/plain": [ 1317 | "(1, 5)" 1318 | ] 1319 | }, 1320 | "execution_count": 35, 1321 | "metadata": {}, 1322 | "output_type": "execute_result" 1323 | } 1324 | ], 1325 | "source": [ 1326 | "vals[0], vals[4]" 1327 | ] 1328 | }, 1329 | { 1330 | "cell_type": "markdown", 1331 | "metadata": { 1332 | "slideshow": { 1333 | "slide_type": "subslide" 1334 | } 1335 | }, 1336 | "source": [ 1337 | "There are 5 elements in the array `vals`, but if we try to look at `vals[5]`, Python will be unhappy, as `vals[5]` is actually calling the non-existant 6th element of that array." 1338 | ] 1339 | }, 1340 | { 1341 | "cell_type": "code", 1342 | "execution_count": 36, 1343 | "metadata": {}, 1344 | "outputs": [ 1345 | { 1346 | "ename": "IndexError", 1347 | "evalue": "index 5 is out of bounds for axis 0 with size 5", 1348 | "output_type": "error", 1349 | "traceback": [ 1350 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 1351 | "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", 1352 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mvals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 1353 | "\u001b[0;31mIndexError\u001b[0m: index 5 is out of bounds for axis 0 with size 5" 1354 | ] 1355 | } 1356 | ], 1357 | "source": [ 1358 | "vals[5]" 1359 | ] 1360 | }, 1361 | { 1362 | "cell_type": "markdown", 1363 | "metadata": { 1364 | "slideshow": { 1365 | "slide_type": "subslide" 1366 | } 1367 | }, 1368 | "source": [ 1369 | "Arrays can also be 'sliced', grabbing a range of values. Let's look at the first three elements" 1370 | ] 1371 | }, 1372 | { 1373 | "cell_type": "code", 1374 | "execution_count": 37, 1375 | "metadata": {}, 1376 | "outputs": [ 1377 | { 1378 | "data": { 1379 | "text/plain": [ 1380 | "array([1, 2, 3])" 1381 | ] 1382 | }, 1383 | "execution_count": 37, 1384 | "metadata": {}, 1385 | "output_type": "execute_result" 1386 | } 1387 | ], 1388 | "source": [ 1389 | "vals[0:3]" 1390 | ] 1391 | }, 1392 | { 1393 | "cell_type": "markdown", 1394 | "metadata": {}, 1395 | "source": [ 1396 | "Note here, the slice is inclusive on the front end and exclusive on the back, so the above command gives us the values of `vals[0]`, `vals[1]` and `vals[2]`, but not `vals[3]`." 1397 | ] 1398 | }, 1399 | { 1400 | "cell_type": "markdown", 1401 | "metadata": { 1402 | "slideshow": { 1403 | "slide_type": "slide" 1404 | } 1405 | }, 1406 | "source": [ 1407 | "## Assigning Array Variables" 1408 | ] 1409 | }, 1410 | { 1411 | "cell_type": "markdown", 1412 | "metadata": {}, 1413 | "source": [ 1414 | "One of the strange little quirks/features in Python that often confuses people comes up when assigning and comparing arrays of values. Here is a quick example. Let's start by defining a 1-D array called `a`:" 1415 | ] 1416 | }, 1417 | { 1418 | "cell_type": "code", 1419 | "execution_count": 38, 1420 | "metadata": {}, 1421 | "outputs": [], 1422 | "source": [ 1423 | "a = linspace(1,5,5)" 1424 | ] 1425 | }, 1426 | { 1427 | "cell_type": "code", 1428 | "execution_count": 39, 1429 | "metadata": {}, 1430 | "outputs": [ 1431 | { 1432 | "data": { 1433 | "text/plain": [ 1434 | "array([ 1., 2., 3., 4., 5.])" 1435 | ] 1436 | }, 1437 | "execution_count": 39, 1438 | "metadata": {}, 1439 | "output_type": "execute_result" 1440 | } 1441 | ], 1442 | "source": [ 1443 | "a" 1444 | ] 1445 | }, 1446 | { 1447 | "cell_type": "markdown", 1448 | "metadata": { 1449 | "slideshow": { 1450 | "slide_type": "subslide" 1451 | } 1452 | }, 1453 | "source": [ 1454 | "OK, so we have an array `a`, with the values 1 through 5. I want to make a copy of that array, called `b`, so I'll try the following:" 1455 | ] 1456 | }, 1457 | { 1458 | "cell_type": "code", 1459 | "execution_count": 40, 1460 | "metadata": {}, 1461 | "outputs": [], 1462 | "source": [ 1463 | "b = a" 1464 | ] 1465 | }, 1466 | { 1467 | "cell_type": "code", 1468 | "execution_count": 41, 1469 | "metadata": {}, 1470 | "outputs": [ 1471 | { 1472 | "data": { 1473 | "text/plain": [ 1474 | "array([ 1., 2., 3., 4., 5.])" 1475 | ] 1476 | }, 1477 | "execution_count": 41, 1478 | "metadata": {}, 1479 | "output_type": "execute_result" 1480 | } 1481 | ], 1482 | "source": [ 1483 | "b" 1484 | ] 1485 | }, 1486 | { 1487 | "cell_type": "markdown", 1488 | "metadata": { 1489 | "slideshow": { 1490 | "slide_type": "subslide" 1491 | } 1492 | }, 1493 | "source": [ 1494 | "Great. So `a` has the values 1 through 5 and now so does `b`. Now that I have a backup of `a`, I can change its values without worrying about losing data (or so I may think!)." 1495 | ] 1496 | }, 1497 | { 1498 | "cell_type": "code", 1499 | "execution_count": 42, 1500 | "metadata": {}, 1501 | "outputs": [], 1502 | "source": [ 1503 | "a[2] = 17" 1504 | ] 1505 | }, 1506 | { 1507 | "cell_type": "code", 1508 | "execution_count": 43, 1509 | "metadata": {}, 1510 | "outputs": [ 1511 | { 1512 | "data": { 1513 | "text/plain": [ 1514 | "array([ 1., 2., 17., 4., 5.])" 1515 | ] 1516 | }, 1517 | "execution_count": 43, 1518 | "metadata": {}, 1519 | "output_type": "execute_result" 1520 | } 1521 | ], 1522 | "source": [ 1523 | "a" 1524 | ] 1525 | }, 1526 | { 1527 | "cell_type": "markdown", 1528 | "metadata": { 1529 | "slideshow": { 1530 | "slide_type": "-" 1531 | } 1532 | }, 1533 | "source": [ 1534 | "Here, the 3rd element of `a` has been changed to 17. Now let's check on `b`." 1535 | ] 1536 | }, 1537 | { 1538 | "cell_type": "code", 1539 | "execution_count": 44, 1540 | "metadata": { 1541 | "slideshow": { 1542 | "slide_type": "fragment" 1543 | } 1544 | }, 1545 | "outputs": [ 1546 | { 1547 | "data": { 1548 | "text/plain": [ 1549 | "array([ 1., 2., 17., 4., 5.])" 1550 | ] 1551 | }, 1552 | "execution_count": 44, 1553 | "metadata": {}, 1554 | "output_type": "execute_result" 1555 | } 1556 | ], 1557 | "source": [ 1558 | "b" 1559 | ] 1560 | }, 1561 | { 1562 | "cell_type": "markdown", 1563 | "metadata": { 1564 | "slideshow": { 1565 | "slide_type": "subslide" 1566 | } 1567 | }, 1568 | "source": [ 1569 | "And that's how things go wrong! When you use a statement like `a = b`, rather than copying all the values of `a` into a new array called `b`, Python just creates an alias (or a pointer) called `b` and tells it to route us to `a`. So if we change a value in `a` then `b` will reflect that change (technically, this is called *assignment by reference*). If you want to make a true copy of the array, you have to tell Python to copy every element of `a` into a new array. Let's call it `c`. " 1570 | ] 1571 | }, 1572 | { 1573 | "cell_type": "code", 1574 | "execution_count": 45, 1575 | "metadata": { 1576 | "slideshow": { 1577 | "slide_type": "subslide" 1578 | } 1579 | }, 1580 | "outputs": [], 1581 | "source": [ 1582 | "c = a.copy()" 1583 | ] 1584 | }, 1585 | { 1586 | "cell_type": "markdown", 1587 | "metadata": {}, 1588 | "source": [ 1589 | "Now, we can try again to change a value in `a` and see if the changes are also seen in `c`." 1590 | ] 1591 | }, 1592 | { 1593 | "cell_type": "code", 1594 | "execution_count": 46, 1595 | "metadata": {}, 1596 | "outputs": [], 1597 | "source": [ 1598 | "a[2] = 3" 1599 | ] 1600 | }, 1601 | { 1602 | "cell_type": "code", 1603 | "execution_count": 47, 1604 | "metadata": {}, 1605 | "outputs": [ 1606 | { 1607 | "data": { 1608 | "text/plain": [ 1609 | "array([ 1., 2., 3., 4., 5.])" 1610 | ] 1611 | }, 1612 | "execution_count": 47, 1613 | "metadata": {}, 1614 | "output_type": "execute_result" 1615 | } 1616 | ], 1617 | "source": [ 1618 | "a" 1619 | ] 1620 | }, 1621 | { 1622 | "cell_type": "code", 1623 | "execution_count": 48, 1624 | "metadata": {}, 1625 | "outputs": [ 1626 | { 1627 | "data": { 1628 | "text/plain": [ 1629 | "array([ 1., 2., 3., 4., 5.])" 1630 | ] 1631 | }, 1632 | "execution_count": 48, 1633 | "metadata": {}, 1634 | "output_type": "execute_result" 1635 | } 1636 | ], 1637 | "source": [ 1638 | "b" 1639 | ] 1640 | }, 1641 | { 1642 | "cell_type": "code", 1643 | "execution_count": 49, 1644 | "metadata": {}, 1645 | "outputs": [ 1646 | { 1647 | "data": { 1648 | "text/plain": [ 1649 | "array([ 1., 2., 17., 4., 5.])" 1650 | ] 1651 | }, 1652 | "execution_count": 49, 1653 | "metadata": {}, 1654 | "output_type": "execute_result" 1655 | } 1656 | ], 1657 | "source": [ 1658 | "c" 1659 | ] 1660 | }, 1661 | { 1662 | "cell_type": "markdown", 1663 | "metadata": { 1664 | "slideshow": { 1665 | "slide_type": "slide" 1666 | } 1667 | }, 1668 | "source": [ 1669 | "## Plotting" 1670 | ] 1671 | }, 1672 | { 1673 | "cell_type": "markdown", 1674 | "metadata": {}, 1675 | "source": [ 1676 | "For scientific plotting we will use `matplotlib`, most commonly `plot` function." 1677 | ] 1678 | }, 1679 | { 1680 | "cell_type": "code", 1681 | "execution_count": 50, 1682 | "metadata": {}, 1683 | "outputs": [ 1684 | { 1685 | "data": { 1686 | "text/plain": [ 1687 | "[]" 1688 | ] 1689 | }, 1690 | "execution_count": 50, 1691 | "metadata": {}, 1692 | "output_type": "execute_result" 1693 | }, 1694 | { 1695 | "data": { 1696 | "image/png": "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\n", 1697 | "text/plain": [ 1698 | "" 1699 | ] 1700 | }, 1701 | "metadata": {}, 1702 | "output_type": "display_data" 1703 | } 1704 | ], 1705 | "source": [ 1706 | "x = linspace(-pi, pi, 150)\n", 1707 | "plot(x, sin(x))" 1708 | ] 1709 | }, 1710 | { 1711 | "cell_type": "markdown", 1712 | "metadata": { 1713 | "slideshow": { 1714 | "slide_type": "slide" 1715 | } 1716 | }, 1717 | "source": [ 1718 | "## Learn More" 1719 | ] 1720 | }, 1721 | { 1722 | "cell_type": "markdown", 1723 | "metadata": {}, 1724 | "source": [ 1725 | "There are a lot of resources online to learn more about using NumPy and other libraries. Well done are [Lectures on scientific computing with Python](https://github.com/jrjohansson/scientific-python-lectures)." 1726 | ] 1727 | }, 1728 | { 1729 | "cell_type": "code", 1730 | "execution_count": 51, 1731 | "metadata": { 1732 | "slideshow": { 1733 | "slide_type": "skip" 1734 | } 1735 | }, 1736 | "outputs": [ 1737 | { 1738 | "data": { 1739 | "text/html": [ 1740 | "\n", 1741 | "\n", 1813 | "\n" 1828 | ], 1829 | "text/plain": [ 1830 | "" 1831 | ] 1832 | }, 1833 | "execution_count": 51, 1834 | "metadata": {}, 1835 | "output_type": "execute_result" 1836 | } 1837 | ], 1838 | "source": [ 1839 | "from IPython.core.display import HTML\n", 1840 | "def css_styling():\n", 1841 | " styles = open(\"./css/sg2.css\", \"r\").read()\n", 1842 | " return HTML(styles)\n", 1843 | "css_styling()" 1844 | ] 1845 | }, 1846 | { 1847 | "cell_type": "markdown", 1848 | "metadata": { 1849 | "collapsed": true, 1850 | "slideshow": { 1851 | "slide_type": "skip" 1852 | } 1853 | }, 1854 | "source": [ 1855 | "Inspired by https://github.com/barbagroup/CFDPython" 1856 | ] 1857 | } 1858 | ], 1859 | "metadata": { 1860 | "kernelspec": { 1861 | "display_name": "Python 3", 1862 | "language": "python", 1863 | "name": "python3" 1864 | }, 1865 | "language_info": { 1866 | "codemirror_mode": { 1867 | "name": "ipython", 1868 | "version": 3 1869 | }, 1870 | "file_extension": ".py", 1871 | "mimetype": "text/x-python", 1872 | "name": "python", 1873 | "nbconvert_exporter": "python", 1874 | "pygments_lexer": "ipython3", 1875 | "version": "3.6.3" 1876 | } 1877 | }, 1878 | "nbformat": 4, 1879 | "nbformat_minor": 1 1880 | } 1881 | --------------------------------------------------------------------------------