logo.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