tlogo.jl - Granular.jl - Julia package for granular dynamics simulation
(HTM) git clone git://src.adamsgaard.dk/Granular.jl
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
tlogo.jl (5220B)
---
1 #!/usr/bin/env julia
2
3 import Granular
4 using Random
5
6 let
7
8 verbose = true
9
10 text = "Granular.jl"
11
12 #forcing = "gyres"
13 forcing = "down"
14 #forcing = "convergent"
15
16 # Font created with `figlet` and the font 'pebbles'.
17 #logo_string = read(`figlet -f pebbles "$text"`, String)
18
19 # If figlet is not installed on your system, use the string below:
20 logo_string =
21 """ .oOOOo. o o
22 .O o O O O
23 o o o
24 O O O
25 O .oOOo `OoOo. .oOoO' 'OoOo. O o o .oOoO' `OoOo. 'o o
26 o. O o O o o O o O O O o o O O
27 O. oO O o O O o O o o o O O oO o o
28 `OooO' o `OoO'o o O `OoO'o Oo `OoO'o o Oo O Oo
29 o
30 oO' """
31
32 dx = 1.
33 dy = dx
34
35 logo_string_split = split(logo_string, '\n')
36
37 ny = length(logo_string_split)
38 maxwidth = 0
39 for i=1:ny
40 if maxwidth < length(logo_string_split[i])
41 maxwidth = length(logo_string_split[i])
42 end
43 end
44 nx = maxwidth + 1
45
46 Lx = nx*dx
47 Ly = (ny + 1)*dy
48
49 x = 0.
50 y = 0.
51 r = 0.
52 c = ' '
53 h = .5
54 youngs_modulus = 2e6
55
56 sim = Granular.createSimulation(id="logo")
57
58 print(logo_string)
59 @info "nx = $nx, ny = $ny"
60
61 for iy=1:length(logo_string_split)
62 for ix=1:length(logo_string_split[iy])
63
64 c = logo_string_split[iy][ix]
65
66 if c == ' '
67 continue
68 elseif c == 'O'
69 x = ix*dx - .5*dx
70 y = Ly - (iy*dy - .5*dy)
71 r = .5*dx
72 elseif c == 'o'
73 x = ix*dx - .5*dx
74 y = Ly - (iy*dy - .33*dy)
75 r = .33*dx
76 elseif c == 'o'
77 x = ix*dx - .5*dx
78 y = Ly - (iy*dy - .25*dy)
79 r = .25*dx
80 elseif c == '\''
81 x = ix*dx - .75*dx
82 y = Ly - (iy*dy - .75*dy)
83 r = .25*dx
84 elseif c == '`'
85 x = ix*dx - .25*dx
86 y = Ly - (iy*dy - .75*dy)
87 r = .25*dx
88 end
89
90 if r > 0.
91 Granular.addGrainCylindrical!(sim, [x + dx, y - dy], r, h,
92 tensile_strength=200e3,
93 youngs_modulus=youngs_modulus,
94 verbose=verbose)
95 end
96 r = -1.
97 end
98 end
99
100 # set ocean forcing
101 sim.ocean = Granular.createRegularOceanGrid([nx, ny, 1], [Lx, Ly, 1.],
102 name="logo_ocean")
103
104 if forcing == "gyres"
105 epsilon = 0.25 # amplitude of periodic oscillations
106 t = 0.
107 a = epsilon*sin(2.0*pi*t)
108 b = 1.0 - 2.0*epsilon*sin(2.0*pi*t)
109 for i=1:size(sim.ocean.u, 1)
110 for j=1:size(sim.ocean.u, 2)
111
112 x = sim.ocean.xq[i, j]/(Lx*.5) # x in [0;2]
113 y = sim.ocean.yq[i, j]/Ly # y in [0;1]
114
115 f = a*x^2.0 + b*x
116 df_dx = 2.0*a*x + b
117
118 sim.ocean.u[i, j, 1, 1] = -pi/10.0*sin(pi*f)*cos(pi*y) * 2e1
119 sim.ocean.v[i, j, 1, 1] = pi/10.0*cos(pi*f)*sin(pi*y)*df_dx * 2e1
120 end
121 end
122
123 elseif forcing == "down"
124 Random.seed!(1)
125 sim.ocean.u[:, :, 1, 1] = (rand(nx+1, ny+1) .- 0.5) .* 0.1
126 sim.ocean.v[:, :, 1, 1] .= -5.0
127
128 elseif forcing == "convergent"
129 Random.seed!(1)
130 sim.ocean.u[:, :, 1, 1] = (rand(nx+1, ny+1) .- 0.5) .* 0.1
131 for j=1:size(sim.ocean.u, 2)
132 sim.ocean.v[:, j, 1, 1] .= -(j/ny - 0.5)*10.0
133 end
134
135 else
136 error("Forcing not understood")
137 end
138
139 # Initialize confining walls, which are ice floes that are fixed in space
140 r = dx/4.
141
142 ## N-S wall segments
143 for y in range(r, stop=Ly-r, length=Int(round((Ly - 2.0*r)/(r*2))))
144 Granular.addGrainCylindrical!(sim, [r, y], r, h, fixed=true,
145 youngs_modulus=youngs_modulus,
146 verbose=false)
147 Granular.addGrainCylindrical!(sim, [Lx-r, y], r, h, fixed=true,
148 youngs_modulus=youngs_modulus,
149 verbose=false)
150 end
151
152 ## E-W wall segments
153 for x in range(3.0*r, stop=Lx-3.0*r, length=Int(round((Lx - 6.0*r)/(r*2))))
154 Granular.addGrainCylindrical!(sim, [x, r], r, h, fixed=true,
155 youngs_modulus=youngs_modulus,
156 verbose=false)
157 Granular.addGrainCylindrical!(sim, [x, Ly-r], r, h, fixed=true,
158 youngs_modulus=youngs_modulus,
159 verbose=false)
160 end
161
162
163 # Finalize setup and start simulation
164 Granular.setTimeStep!(sim, verbose=verbose)
165
166 Granular.setTotalTime!(sim, 5.)
167 Granular.setOutputFileInterval!(sim, .1)
168
169 Granular.removeSimulationFiles(sim)
170
171 while sim.time < sim.time_total
172 for i=1:100
173 Granular.run!(sim, single_step=true, verbose=verbose)
174 end
175 Granular.plotGrains(sim, show_figure=false)
176 end
177
178 # Granular.render(sim, images=true, animation=false, reverse=true)
179
180 # run(`convert -delay 100 logo/logo.0000.png -delay 10 logo/logo.'*'.png -trim
181 # +repage -delay 10 -transparent-color white -quiet -layers OptimizePlus
182 # -loop 0 logo.gif`)
183 end