commit 7fd087a23ee8be94a64d3247e6d46246c6bf07fe Author: yuloveyet Date: Fri Nov 4 09:01:06 2022 +0800 first commit diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..c409c3a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 LIYu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100755 index 0000000..186f396 --- /dev/null +++ b/README.md @@ -0,0 +1,122 @@ +# Topology-Optimization-in-Julia + +Julia Codes for Structural Topology Optimization Design + +## Codes + +A personal [Julia](https://epubs.siam.org/doi/10.1137/141000671) code is given mainly based on a compact and efficient Matlab implementation **top99neo** of compliance topology optimization (TO) for 2D continua[^1], which is a v3.0 version of the celebrated **top99** Matlab code developed by Sigmund[^2] and **top88** by its heir[^3]. + +Assemble just one half of the sysmetric stiffness matrix, thus substantial speedups are acheived. + +`top_oc/` and `top_mma/` contain corresponding files related to the TO with OC and MMA algorithms, respectively. + +Running codes could be tried out as: + +```julia +include("./top99neo_mma.jl") +setup = SetUp() # problem setup +mat = Mat() # material property +disfeature = DiscretizationFeature(setup, mat) # model discretization +load = LoadsSupportsBCs(setup, disfeature) # boudary conditions +ini = Initialization(setup, disfeature, mat) # initial conditions +filter = Filter(setup) # filtering +xPhys, opt_hist, vf_hist, anim = Optimization(setup, mat, load, filter, ini, disfeature) # optimization process +gif(anim, "./res/des_hist.gif", fps=20) # design result visulization +``` + +## Results + +A benchmark MBB example is presented. TO design results are saved in `./res/` folder and a evolution history is shown as below. + + + +
+ +👍 💯 +
+ +## Packages + +Run [the Julia REPL](https://docs.julialang.org/en/v1/stdlib/REPL/), enter `]` to bring up Julia's [package manager](https://docs.julialang.org/en/v1/stdlib/Pkg/), +and add the listed packages: + +> julia> ] +> +> (@v1.7) pkg> add #pkg_name# + +- Scientific computing + - LinearAlgebra + - SparseArrays + - Statistics : mean +- Image process + - ImageFiltering: imfilter +- Modelling + - [Gmsh](https://onlinelibrary.wiley.com/doi/10.1002/nme.2579) +- FEM + - [Gridap](https://joss.theoj.org/papers/10.21105/joss.02520) +- AD + - [ForwardDiff](https://arxiv.org/abs/1607.07892) + - [Zygote](https://arxiv.org/abs/1810.07951) +- Optimization + - [NLopt](https://github.com/stevengj/nlopt) +- Visualization + - Plots + +## TODOs + +- [x] [`top99neo.jl`](./top_oc/top99neo.jl) + top99neo.m rewritten in Julia +- [x] [`MMA.jl`](./top_mma/MMA.jl) + MMA algorithm (mmasub.m + subsolve.m) rewritten in Julia +- [x] [`top99neo_mma.jl`](./top_mma/top99neo_mma.jl) + 2D code (top99neo + MMA) written in Julia +- [ ] `top99neo_AD.jl` + Sensitivity Analysis using Automatic Differentiation +- [ ] `top99neo_NLopt.jl` + Optimization solved with NLopt +- [ ] `top3D.jl` + 3D code (top3D125 + MMA) written in Julia +- [ ] `top_flux.jl` + Combine TO with machine learning through [Flux](https://arxiv.org/abs/1811.01457) + +## Acknowledgements + +- [TopOpt Group](https://www.topopt.mek.dtu.dk/) 🇩🇰 +Matlab codes for topology optimization + + - v1.0 [**top99.m**](https://www.topopt.mek.dtu.dk/Apps-and-software/A-99-line-topology-optimization-code-written-in-MATLAB) + Educatianal TO enlightenment for every beginners + - v2.0 [**top88.m**](https://www.topopt.mek.dtu.dk/Apps-and-software/Efficient-topology-optimization-in-MATLAB) + Loop vectorization and memory preallocation + - v3.0 [**top99neo.m**](https://www.topopt.mek.dtu.dk/Apps-and-software/New-99-line-topology-optimization-code-written-in-MATLAB) + Half matrix assembly operation, filter implementation and volume-preserving density projection + +- Prof. [Krister Svanberg](https://people.kth.se/~krille/) 🇸🇪 + - Freely available [Matlab code](http://www.smoptit.se/) for CCSA/MMA[^4] and GCMMA + +## Author ©️ + +📧 Please contact to liyu_npu@outlook.com + +⚠️ Disclaimer: The author reserves all rights but does not guarantee that the code is free from errors. Furthermore, we shall not be liable in any event. + +| Name | Info. | Hobby | Food | +| ----- | :--------: | :-----------: | :-------: | +| Yu Li | 🇨🇳 🎓 1️⃣9️⃣9️⃣0️⃣ ♑ | 🎧 🃏 🎮 🏀 🏊 🏃 🚴‍♂️ | 🍦 🦞 🍣 🌽 🍌 | + +```bibtex +@misc{Yu2022, + author = {Yu Li}, + title = {Topology Optimization in Julia}, + year = {2022}, + publisher = {GitHub}, + journal = {GitHub repository}, + howpublished = {\url{https://github.com/yuloveyet/Topology-Optimization-in-Julia}}, + } +``` + +**References** +[^1]: Ferrari, F., & Sigmund, O. (2020). A new generation 99 line Matlab code for compliance topology optimization and its extension to 3D. Structural and Multidisciplinary Optimization, 62(4), 2211-2228. +[^2]:Sigmund, O. (2001). A 99 line topology optimization code written in Matlab. Structural and multidisciplinary optimization, 21(2), 120-127. +[^3]:Andreassen, E., Clausen, A., Schevenels, M., Lazarov, B. S., & Sigmund, O. (2011). Efficient topology optimization in MATLAB using 88 lines of code. Structural and Multidisciplinary Optimization, 43(1), 1-16. +[^4]: Svanberg, K. (2002). A class of globally convergent optimization methods based on conservative convex separable approximations. SIAM journal on optimization, 12(2), 555-573. diff --git a/top_mma/MMA.jl b/top_mma/MMA.jl new file mode 100755 index 0000000..123f458 --- /dev/null +++ b/top_mma/MMA.jl @@ -0,0 +1,407 @@ +######################################################################################################## +### MMA-Julia (1.7.1) +######################################################################################################## +### MODIFIED BY YULI 2022/5/4 +######################################################################################################## +export mmasub +# Loading modules +using LinearAlgebra +using SparseArrays + +######################################################################################################## +### MMA FUNCTIONS ### +######################################################################################################## + +# Function for the MMA sub problem +function mmasub(m::Int, n::Int, iter::Int, xval::Array{Float64}, xmin::Array{Float64}, + xmax::Array{Float64}, xold1::Array{Float64}, xold2::Array{Float64}, f0val, + df0dx::Array{Float64}, df0dx2:: Array{Float64}, + fval::Float64, dfdx::Array{Float64}, dfdx2::Array{Float64}, + low::Array{Float64}, upp::Array{Float64}, a0::Float64, + a::Array{Float64}, c::Array{Float64}, d::Array{Float64}) + + # """ + # This function mmasub performs one MMA-iteration, aimed at solving the nonlinear programming problem: + # + # Minimize f_0(x) + a_0*z + sum( c_i*y_i + 0.5*d_i*(y_i)^2 ) + # subject to f_i(x) - a_i*z - y_i < = 0, i = 1, ..., m + # xmin_j < = x_j < = xmax_j, j = 1, ..., n + # z > = 0, y_i > = 0, i = 1, ..., m + # INPUT: + # + # m = The number of general constraints. + # n = The number of variables x_j. + # iter = Current iteration number ( =1 the first time mmasub is called). + # xval = Column vector with the current values of the variables x_j. + # xmin = Column vector with the lower bounds for the variables x_j. + # xmax = Column vector with the upper bounds for the variables x_j. + # xold1 = xval, one iteration ago (provided that iter>1). + # xold2 = xval, two iterations ago (provided that iter>2). + # f0val = The value of the objective function f_0 at xval. + # df0dx = Column vector with the derivatives of the objective function + # f_0 with respect to the variables x_j, calculated at xval. + # fval = Column vector with the values of the constraint functions f_i, calculated at xval. + # dfdx = (m x n)-matrix with the derivatives of the constraint functions + # f_i with respect to the variables x_j, calculated at xval. + # dfdx(i,j) = the derivative of f_i with respect to x_j. + # low = Column vector with the lower asymptotes from the previous + # iteration (provided that iter>1). + # upp = Column vector with the upper asymptotes from the previous + # iteration (provided that iter>1). + # a0 = The constants a_0 in the term a_0*z. + # a = Column vector with the constants a_i in the terms a_i*z. + # c = Column vector with the constants c_i in the terms c_i*y_i. + # d = Column vector with the constants d_i in the terms 0.5*d_i*(y_i)^2. + # + # OUTPUT: + # + # xmma = Column vector with the optimal values of the variables x_j + # in the current MMA subproblem. + # ymma = Column vector with the optimal values of the variables y_i + # in the current MMA subproblem. + # zmma = Scalar with the optimal value of the variable z + # in the current MMA subproblem. + # lam = Lagrange multipliers for the m general MMA constraints. + # xsi = Lagrange multipliers for the n constraints alfa_j - x_j < = 0. + # eta = Lagrange multipliers for the n constraints x_j - beta_j < = 0. + # mu = Lagrange multipliers for the m constraints -y_i < = 0. + # zet = Lagrange multiplier for the single constraint -z < = 0. + # s = Slack variables for the m general MMA constraints. + # low = Column vector with the lower asymptotes, calculated and used + # in the current MMA subproblem. + # upp = Column vector with the upper asymptotes, calculated and used + # in the current MMA subproblem. + # """ + + epsimin = sqrt(m + n) * 10^(-9) + feps = 0.000001 + asyinit = 0.5 + asyincr = 1.05 + asydecr = 0.65 + albefa = 0.1 + een = ones(n, 1) + zeron = zeros(n, 1) + + + if iter <= 2 + low = xval - asyinit .* (xmax - xmin) + upp = xval + asyinit .* (xmax - xmin) + else + zzz = (xval - xold1) .* (xold1 - xold2) + factor = copy(een) + factor[findall(zzz .> 0.0)] .= asyincr + factor[findall(zzz .< 0.0)] .= asydecr + low = xval - factor .* (xold1 - low) + upp = xval + factor .* (upp - xold1) + lowmin = xval - 10.0 .* (xmax - xmin) + lowmax = xval - 0.01 .* (xmax - xmin) + uppmin = xval + 0.01 .* (xmax - xmin) + uppmax = xval + 10.0 .* (xmax - xmin) + low = max.(low, lowmin) + low = min.(low, lowmax) + upp = min.(upp, uppmax) + upp = max.(upp, uppmin) + end + + zzz = low + albefa .* (xval - low) + alfa = max.(zzz, xmin) + + zzz = upp - albefa .* (upp - xval) + beta = min.(zzz, xmax) + + + ux1 = upp - xval + ux2 = ux1 .* ux1 + ux3 = ux2 .* ux1 + xl1 = xval - low + xl2 = xl1 .* xl1 + xl3 = xl2 .* xl1 + ul1 = upp - low + ulinv1 = een ./ ul1 + + uxinv1 = een ./ ux1 + xlinv1 = een ./ xl1 + uxinv3 = een ./ ux3 + xlinv3 = een ./ xl3 + diap = (ux3 .* xl1) ./ (2 * ul1) + diaq = (ux1 .* xl3) ./ (2 * ul1) + + p0 = copy(zeron) + q0 = copy(zeron) + p0[findall(df0dx .> 0.0)] = df0dx[findall(df0dx .> 0.0)] + p0 = p0 + 0.001 .* abs.(df0dx) + feps * ulinv1 + p0 = p0 .* ux2 + # q0 = zeron + q0[findall(df0dx .< 0.0)] = -df0dx[findall(df0dx .< 0.0)] + q0 = q0 + 0.001 * abs.(df0dx) + feps * ulinv1 + q0 = q0 .* xl2 + dg0dx2 = 2 * (p0 ./ ux3 + q0 ./ xl3) + del0 = df0dx2 - dg0dx2 + delpos0 = copy(zeron) + delpos0[findall(del0 .> 0.0)] = del0[findall(del0 .> 0.0)] + p0 = p0 + delpos0 .* diap + q0 = q0 + delpos0 .* diaq + P = spzeros(m, n) + P[findall(dfdx .> 0.0)] = dfdx[findall(dfdx .> 0.0)] + # P = P * diag(ux2); + # P = P * spdiagm(n, n, 0 => ux2) + P = P * sparse(Diagonal(ux2[:])) + Q = spzeros(m, n) + Q[findall(dfdx .< 0.0)] = -dfdx[findall(dfdx .< 0.0)] + # Q = Q * diag(xl2); + # Q = Q * spdiagm(n, n, 0 => xl2) + Q = Q * sparse(Diagonal(xl2[:])) + # dgdx2 = 2.0*(P*diag(uxinv3) + Q*diag(xlinv3)); + # dgdx2 = P * spdiagm(n, n, 0 => uxinv3) + Q * spdiagm(n, n, 0 => xlinv3) + dgdx2 = P * sparse(Diagonal(uxinv3[:])) + Q * sparse(Diagonal(xlinv3[:])) + dgdx2 = 2.0 * dgdx2 + del = dfdx2 - dgdx2 + delpos = zeros(m, n) + delpos[findall(del .> 0.0)] = del[findall(del .> 0.0)] + # P = P + delpos*diag(diap); + # P = P + delpos * spdiagm(n, n, 0 => diap) + P = P + delpos * sparse(Diagonal(diap[:])) + # Q = Q + delpos*diag(diaq); + # Q = Q + delpos * spdiagm(n, n, 0 => diap) + Q = Q + delpos * sparse(Diagonal(diap[:])) + b = P * uxinv1 + Q * xlinv1 .- fval + + + # b = P * uxinv + Q * xlinv - fval + # Solving the subproblem by a primal-dual Newton method + xmma, ymma, zmma, lam, xsi, eta, mu, zet, s = + subsolv(m, n, epsimin, low, upp, alfa, beta, p0, q0, P, Q, a0, a, b, c, d) + # Return values + return xmma, ymma, zmma, lam, xsi, eta, mu, zet, s, low, upp +end + + +# Function for solving the subproblem (can be used for MMA and GCMMA) +function subsolv(m::Int, n::Int, epsimin::Float64, low::Array{Float64}, upp::Array{Float64}, + alfa::Array{Float64}, beta::Array{Float64}, p0::Array{Float64}, q0::Array{Float64}, + P::Array{Float64}, Q::Array{Float64}, a0::Float64, a::Array{Float64}, b::Array{Float64}, + c::Array{Float64}, d::Array{Float64}) + + # """ + # This function subsolv solves the MMA subproblem: + # + # minimize SUM[p0j/(uppj-xj) + q0j/(xj-lowj)] + a0*z + SUM[ci*yi + 0.5*di*(yi)^2], + # + # subject to SUM[pij/(uppj-xj) + qij/(xj-lowj)] - ai*z - yi < = bi, + # alfaj < = xj < = betaj, yi > = 0, z > = 0. + # + # Input : m, n, low, upp, alfa, beta, p0, q0, P, Q, a0, a, b, c, d. + # Output: xmma, ymma, zmma, slack variables and Lagrange multiplers. + # """ + + een = ones(Float64, n) + eem = ones(Float64, m) + epsi = 1.0 + epsvecn = epsi .* een + epsvecm = epsi .* eem + x = 0.5 .* (alfa + beta) + y = copy(eem) + z = 1.0 + lam = copy(eem) + xsi = een ./ (x - alfa) + xsi = max.(xsi, een) + eta = een ./ (beta - x) + eta = max.(eta, een) + mu = max.(eem, 0.5 .* c) + zet = 1.0 + s = copy(eem) + itera = 0 + + while epsi > epsimin # Start while epsi>epsimin + epsvecn = epsi .* een + epsvecm = epsi .* eem + ux1 = upp - x + xl1 = x - low + ux2 = ux1 .* ux1 + xl2 = xl1 .* xl1 + uxinv1 = een ./ ux1 + xlinv1 = een ./ xl1 + + plam = p0 + (P)' * lam + qlam = q0 + (Q)' * lam + gvec = P * uxinv1 + Q * xlinv1 + dpsidx = (plam ./ ux2) - (qlam ./ xl2) + + rex = dpsidx - xsi + eta + rey = c + d .* y - mu - lam + rez = a0 .- zet .- (a)' * lam + relam = gvec - a .* z - y + s - b + rexsi = xsi .* (x - alfa) - epsvecn + reeta = eta .* (beta - x) - epsvecn + remu = mu .* y - epsvecm + rezet = zet * z - epsi + res = lam .* s - epsvecm + + residu1 = [rex' rey' rez]' + residu2 = [relam' rexsi' reeta' remu' rezet res']' + residu = [residu1' residu2']' + residunorm = norm(residu, 2) + residumax = maximum(abs.(residu)) + + ittt = 0 + while (residumax > 0.9 * epsi) && (ittt < 100) # Start while (residumax>0.9*epsi) and (ittt<100) + ittt = ittt + 1 + itera = itera + 1 + + if ittt == 100 + println("max inner iter reached") + end + ux1 = upp - x + xl1 = x - low + ux2 = ux1 .* ux1 + xl2 = xl1 .* xl1 + ux3 = ux1 .* ux2 + xl3 = xl1 .* xl2 + uxinv1 = een ./ ux1 + xlinv1 = een ./ xl1 + uxinv2 = een ./ ux2 + xlinv2 = een ./ xl2 + plam = p0 + (P)' * lam + qlam = q0 + (Q)' * lam + gvec = P * uxinv1 + Q * xlinv1 + # GG = P .* transpose(uxinv2) - Q .* transpose(xlinv2) + # GG = P .* spdiagm(n,n, 0 => uxinv2) - Q .* spdiagm(n, n, 0 => xlinv2) + GG = P * sparse(Diagonal(uxinv2[:])) - Q * sparse(Diagonal(xlinv2[:])) + dpsidx = (plam ./ ux2) - (qlam ./ xl2) + delx = dpsidx - epsvecn ./ (x - alfa) + epsvecn ./ (beta - x) + dely = c + d .* y - lam - epsvecm ./ y + delz = a0 .- transpose(a) * lam .- epsi / z + dellam = gvec - a .* z - y - b + epsvecm ./ lam + diagx = plam ./ ux3 + qlam ./ xl3 + diagx = 2.0 .* diagx + xsi ./ (x - alfa) + eta ./ (beta - x) + diagxinv = een ./ diagx + diagy = d + mu ./ y + diagyinv = eem ./ diagy + diaglam = s ./ lam + diaglamyi = diaglam + diagyinv + + if m < n # Start if m < n + blam = dellam .+ dely ./ diagy .- GG * (delx ./ diagx) + bb = [blam' delz]' + # Alam = spdiagm(0 => diaglamyi) + (GG .* transpose(diagxinv)) * transpose(GG) + # Alam = spdiagm(m, m, 0 => diaglamyi) + (GG .* spdiagm(n, n, 0 => diagxinv)) * transpose(GG) + Alam = sparse(Diagonal(diaglamyi[:])) + (GG * sparse(Diagonal(diagxinv[:]))) * (GG)' + AA = [Alam a + a' -zet/z] + solut = AA \ bb + dlam = solut[1:m] + dz = solut[m+1] + dx = -delx ./ diagx - ((GG)' * dlam) ./ diagx + else + diaglamyiinv = eem ./ diaglamyi + dellamyi = dellam + dely ./ diagy + # Axx = spdiagm(0 => diagx) + (transpose(GG) .* transpose(diaglamyiinv)) * GG + # Axx = spdiagm(n,n, 0 => diagx) + (transpose(GG) .* spdiagm(m, m, 0 => diaglamyiinv)) * GG + Axx = sparse(Diagonal(diagx[:])) + ((GG)' .* sparse(Diagonal(diaglamyiinv[:]))) * GG + azz = zet / z + (a)' * (a ./ diaglamyi) + axz = -(GG)' * (a ./ diaglamyi) + bx = delx + (GG)' * (dellamyi ./ diaglamyi) + bz = delz - (a)' * (dellamyi ./ diaglamyi) + # AAr1 = [Axx axz] + # AAr2 = [transpose(axz) azz] + # AA = [AAr1; AAr2] + AA = [Axx axz + axz' azz] + bb = [-bx' -bz]' + solut = AA \ bb + dx = solut[1:n] + dz = solut[n+1] + dlam = (GG * dx) ./ diaglamyi - dz .* (a ./ diaglamyi) + dellamyi ./ diaglamyi + end # End if mresidunorm) and (itto<50) + while (resinew > residunorm) && (itto < 50) + itto = itto + 1 + + x = xold + steg .* dx + y = yold + steg .* dy + z = zold + steg * dz + lam = lamold + steg .* dlam + xsi = xsiold + steg .* dxsi + eta = etaold + steg .* deta + mu = muold + steg .* dmu + zet = zetold + steg * dzet + s = sold + steg .* ds + ux1 = upp - x + xl1 = x - low + ux2 = ux1 .* ux1 + xl2 = xl1 .* xl1 + uxinv1 = een ./ ux1 + xlinv1 = een ./ xl1 + plam = p0 + (P)' * lam + qlam = q0 + (Q)' * lam + gvec = P * uxinv1 + Q * xlinv1 + dpsidx = plam ./ ux2 - qlam ./ xl2 + + rex = dpsidx - xsi + eta + rey = c .+ d .* y - mu - lam + rez = a0 - zet .- (a)' * lam + relam = gvec - a .* z - y + s - b + rexsi = xsi .* (x - alfa) - epsvecn + reeta = eta .* (beta - x) - epsvecn + remu = mu .* y - epsvecm + rezet = zet * z - epsi + res = lam .* s - epsvecm + + residu1 = [rex' rey' rez]' + residu2 = [relam' rexsi' reeta' remu' rezet res']' + residu = [residu1' residu2']' + resinew = norm(residu, 2) + steg = steg / 2.0 + end # End: while (resinew>residunorm) and (itto<50) + residunorm = copy(resinew) + residumax = maximum(abs.(residu)) + steg = 2.0 * steg + end # End: while (residumax>0.9*epsi) and (ittt<200) + epsi = 0.1 * epsi + end # End: while epsi>epsimin + xmma = copy(x) + ymma = copy(y) + zmma = copy(z) + lamma = lam + xsimma = xsi + etamma = eta + mumma = mu + zetmma = zet + smma = s + # Return values + return xmma, ymma, zmma, lamma, xsimma, etamma, mumma, zetmma, smma +end + diff --git a/top_mma/TEST.ipynb b/top_mma/TEST.ipynb new file mode 100755 index 0000000..fb1a693 --- /dev/null +++ b/top_mma/TEST.ipynb @@ -0,0 +1,770 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# module TopOpt99neo\n", + "\n", + "# include(\"FastConv.jl/src/FastConv.jl\")\n", + "# import .FastConv.fastconv\n", + "\n", + "using LinearAlgebra, SparseArrays\n", + "using Plots\n", + "# : heatmap, savefig, @animate\n", + "using ImageFiltering: imfilter\n", + "using Statistics: mean\n", + "\n", + "using BenchmarkTools\n", + "using Zygote\n", + "\n", + "BLAS.set_num_threads(1)\n", + "\n", + "# abstract type top99neo end\n", + "\n", + "include(\"utils.jl\")\n", + "include(\"MMA.jl\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct SetUp\n", + " nelx::Int\n", + " nely::Int\n", + "\n", + " eta::Float64\n", + " beta::Int\n", + " betaCnt::NTuple{4,Int}\n", + "\n", + " move::Float64\n", + " maxit::Int\n", + " maxchang::Float64\n", + "\n", + " pasS::Array{Int}\n", + " pasV::Array{Int}\n", + "\n", + " function SetUp()\n", + " nelx = 30\n", + " nely = 10\n", + " # volfrac = 0.3\n", + " maxit = 300\n", + " move = 0.1\n", + " beta = 2\n", + " eta = 0.5\n", + " maxchang = 1e-6\n", + " # penalCnt = {maxit+1, 3, 25, 0.25}\n", + " betaCnt = (1, 32, 10, 2) # continuation scheme on beta parCont = { istart,maxPar,steps,deltaPar }\n", + " \n", + " # elNrs = reshape(1:nely*nelx, nely, nelx)\n", + " # a1 = elNrs[Int.(nely/4:nely/2), Int.(nelx/4:nelx/2)]\n", + " # pasS, pasV = Array([]), a1[:]\n", + " pasS, pasV = Array([]), Array([])\n", + " \n", + " new(nelx, nely, eta, beta, betaCnt, move, maxit, maxchang, pasS, pasV)\n", + " end\n", + "\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "setup = SetUp()\n", + "# setup.nelx = 20\n", + "# setup.nely = 10\n", + "# setup.maxit = 100\n", + "# typeof(setup.nodeNrs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "mutable struct Mat\n", + " E0::Float64\n", + " Emin::Float64\n", + " ν::Float64\n", + " penal::Float64\n", + " volfrac::Float64\n", + "\n", + " function Mat()\n", + " E0 = 1\n", + " Emin = 1e-9\n", + " ν = 0.3\n", + " penal = 3.0\n", + " volfrac = 0.3\n", + " new(E0, Emin, ν, penal, volfrac)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mat = Mat()\n", + "# mat.volfrac" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct DiscretizationFeature\n", + " nEl::Int\n", + " nodeNrs::Array{Int,2}\n", + " nDof::Int\n", + " act\n", + "\n", + " cMat::Array{Int}\n", + " Iar::Array{Int}\n", + " Ke::Array{Float64,1}\n", + " Ke0::Array{Float64,2}\n", + " \n", + " function DiscretizationFeature(setup::SetUp, mat::Mat)\n", + " nelx = setup.nelx\n", + " nely = setup.nely\n", + " pasS, pasV = setup.pasS, setup.pasV\n", + " ν = mat.ν\n", + " \n", + " nEl = nely * nelx\n", + " nodeNrs = reshape(1:(1+nelx)*(1+nely), nely + 1, nelx + 1)\n", + " nDof = (nely + 1) * (nelx + 1) * 2\n", + " act = setdiff(collect(1:nEl), union(pasS, pasV))\n", + " \n", + " cVec = reshape(2 * nodeNrs[1:end-1, 1:end-1] .+ 1, nEl, 1)\n", + " # cMat = cVec + Int.([0 1 2 * nely .+ [2 3 0 1] -2 -1])\n", + " cMat = Int.(repeat(cVec, 1, 8) + repeat([0 1 2 * nely .+ [2 3 0 1] -2 -1], nelx * nely, 1))\n", + " # nDof = (nely + 1) * (nelx + 1) * 2\n", + " FuckRow = [1 2 3 4 5 6 7 8]\n", + " sI::Array{Int}, sII::Array{Int} = copy(FuckRow), fill(1, 1, 8)\n", + " for j in 2:8\n", + " sI = cat(sI, FuckRow[j:8]'; dims=2)\n", + " # sI = append!(sI, convert(Array{Int},[j:8]))\n", + " # sII = cat(2, sII, repmat(j, 1, 8 - j + 1))\n", + " sII = cat(sII, fill(j, 1, 8 - j + 1); dims=2)\n", + " end\n", + " iK::Array{Int,2}, jK::Array{Int,2} = cMat[:, sI][:, 1, :]', cMat[:, sII][:, 1, :]'\n", + " Iar = sort([iK[:] jK[:]]; dims=2, rev=true) # comma is a newline\n", + " # iK[:], jK[:] .= 0.0, 0.0\n", + " c1 = [12, 3, -6, -3, -6, -3, 0, 3, 12, 3, 0, -3, -6, -3, -6, 12, -3, 0, -3, -6, 3, 12, 3, -6, 3, -6, 12, 3, -6, -3, 12, 3, 0, 12, -3, 12]\n", + " c2 = [-4, 3, -2, 9, 2, -3, 4, -9, -4, -9, 4, -3, 2, 9, -2, -4, -3, 4, 9, 2, 3, -4, -9, -2, 3, 2, -4, 3, -2, 9, -4, -9, 4, -4, -3, -4]\n", + " Ke = 1 / (1 - ν^2) / 24 .* (c1 .+ ν .* c2) # half-KE vector\n", + " # full KE\n", + " # Ke0::Array{Float64} = zeros(8, 8)\n", + " # start_id, end_id = 1, 8\n", + " # for i in 1:8\n", + " # Ke0[i:8, i] = Ke[start_id:end_id]\n", + " # start_id, end_id = end_id + 1, 2 * end_id - start_id\n", + " # end\n", + " \n", + " Ke0::Array{Float64} = zeros(8, 8)\n", + " # Index::Array{Int} = [sI' sII']\n", + " # Ke0[sI, sII] = Ke\n", + " Index = findall(isequal(1), tril(ones(8, 8)))\n", + " Ke0[Index] = Ke'\n", + " # Ke0 = reshape(Ke0, 8, 8)\n", + " Ke0 = Ke0 + Ke0' - diagm(diag(Ke0))\n", + " new(nEl, nodeNrs, nDof, act, cMat, Iar, Ke, Ke0)\n", + " end\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "disfeature = DiscretizationFeature(setup, mat)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct LoadsSupportsBCs\n", + " # setup::SetUp\n", + " lcDof::Array{Int}\n", + " F\n", + " free::Array{Int}\n", + " fixed::Array{Int}\n", + "\n", + " function LoadsSupportsBCs(setup::SetUp, disfeature::DiscretizationFeature)\n", + " nelx = setup.nelx\n", + " nely = setup.nely\n", + " nodeNrs = disfeature.nodeNrs\n", + " nDof = disfeature.nDof\n", + " \n", + " load_position::Symbol = :half_MBB\n", + " if load_position == :half_MBB\n", + " load_nodey, load_nodex = 1, 1\n", + " # fixed = union([1:2:2*(nely+1)], 2 * nodeNrs[nely+1, nelx+1])\n", + " fixed = union(collect(1:2:2*(nely+1)), 2 * nodeNrs[end, end])\n", + " elseif load_position == :cantilever\n", + " load_nodey = nely + 1\n", + " load_nodex = nelx / 2 + 1\n", + " fixed = 1:2*(nely+1)\n", + " end\n", + " \n", + " F = spzeros(nDof)\n", + " \n", + " load_type::Symbol = :pin\n", + " if load_type == :pin # 1 point\n", + " lcDof = collect(2 * nodeNrs[load_nodey, load_nodex])\n", + " F[2, 1] = -1.0\n", + " elseif load_type == :points # 5 points\n", + " lcDof = collect(2 * nodeNrs[load_nodey, load_nodex], nodeNrs[load_nodey, load_nodex-1], nodeNrs[load_nodey, load_nodex-2], nodeNrs[load_nodey, load_nodex+1], nodeNrs[load_nodey, load_nodex+2])\n", + " F[lcDof', ones(length(lcDof'))] .= -1.0\n", + " elseif load_type == :line\n", + " lcDof = [2:2*(nely+1):nDof]\n", + " F = spzeros(nDof, 1)\n", + " # F = sparse(lcDof', ones(length(lcDof')), -1.0)\n", + " end\n", + " all = collect(1:nDof)\n", + " free = setdiff(all, fixed)\n", + " \n", + " new(lcDof, F, free, fixed)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "load = LoadsSupportsBCs(setup, disfeature)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct Initialization \n", + " # setup::SetUp\n", + " x::Array{Float64}\n", + " xPhys::Array{Float64}\n", + " xOld::Array{Float64}\n", + " ch::Float64\n", + " loop::Int\n", + " # U::Array{Float64}\n", + " # dsK::Array{Float64}\n", + " # dV::Array{Float64}\n", + "\n", + " function Initialization(setup::SetUp, disfeature::DiscretizationFeature, mat::Mat)\n", + " pasV = setup.pasV\n", + " pasS = setup.pasS\n", + " act = disfeature.act\n", + " volfrac = mat.volfrac\n", + " nEl = disfeature.nEl\n", + " nDof = disfeature.nDof\n", + " # column vectors\n", + " x = zeros(nEl, 1)\n", + " # dV[act, 1] .= 1.0 / nEl / volfrac\n", + " x[act] .= volfrac\n", + " x[pasS] .= 1.0\n", + " xPhys, xOld, ch, loop = copy(x), ones(nEl, 1), 1.0, 0\n", + " # x̅ x̃\n", + " \n", + " new(x, xPhys, xOld, ch, loop)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ini = Initialization(setup, disfeature, mat)\n", + "# typeof(ini.x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct Filter \n", + " rmin::Float64\n", + " ft::Int\n", + " h::Array{Float64}\n", + " Hs::Array{Float64}\n", + " dHs::Array{Float64}\n", + "\n", + " function Filter(setup::SetUp)\n", + " nelx = setup.nelx\n", + " nely = setup.nely\n", + " # bcF = setup.bcF\n", + " rmin = 6.5\n", + " ft = 3\n", + " dy, dx = meshgrid(-ceil(rmin)+1:ceil(rmin)-1, -ceil(rmin)+1:ceil(rmin)-1)\n", + " h = max.(0, rmin .- sqrt.(dx .^ 2 + dy .^ 2))\n", + " Hs = imfilter(ones(nely, nelx), h, \"symmetric\")\n", + " dHs = Hs\n", + " new(rmin, ft, h, Hs, dHs)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "filter = Filter(setup)\n", + "# filter.Hs" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FiniteElementAnalasys (generic function with 1 method)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "function FiniteElementAnalasys(mat::Mat, disfeature::DiscretizationFeature, load::LoadsSupportsBCs, xPhys::Array{Float64})\n", + " nEl, nDof, Iar, Ke = disfeature.nEl, disfeature.nDof, disfeature.Iar, disfeature.Ke\n", + " act = disfeature.act\n", + " Emin, penal, E0 = mat.Emin, mat.penal, mat.E0\n", + " F, free = load.F, load.free\n", + "\n", + " sK = Emin .+ xPhys .^ penal .* (E0 - Emin)\n", + " sK = reshape(Ke[:] * sK', length(Ke) * nEl, 1)\n", + " K = sparse(Iar[:, 1], Iar[:, 2], vec(sK), nDof, nDof)\n", + " U = zeros(nDof)\n", + " #~\n", + " # U[free] = cholesky(Symmetric(K[free, free], :L), check=false) \\ F[free]\n", + " K0 = K + K' - diagm(diag(K))\n", + " U[free] = K0[free, free] \\ F[free]\n", + " #~\n", + " Obj = F' * U\n", + " Vf = mean(xPhys[act])\n", + " return U, Obj, Vf\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1-element Vector{Float64}:\n", + " 4558.123953305818" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "U, C, vf = FiniteElementAnalasys(mat, disfeature, load, xval)\n", + "C" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function SensitivityAnalasys(setup::SetUp, filter::Filter, mat::Mat, disfeature::DiscretizationFeature, \n", + " U::Array{Float64}, xPhys::Array{Float64})\n", + " nelx, nely, act = setup.nelx, setup.nely, disfeature.act\n", + " dHs, h = filter.dHs, filter.h\n", + " E0, Emin, penal = mat.E0, mat.Emin, mat.penal\n", + " nEl, cMat, Ke0 = disfeature.nEl, disfeature.cMat, disfeature.Ke0\n", + " act = disfeature.act\n", + "\n", + " dsK, dV = zeros(nEl, 1), zeros(nEl, 1)\n", + " dV[act, 1] .= 1.0 / length(act)\n", + " dsK[act] = -penal * (E0 - Emin) .* xPhys[act] .^ (penal - 1)\n", + "\n", + " dc = dsK .* sum((U[cMat] * Ke0) .* U[cMat], dims=2)\n", + " dc = imfilter(reshape(dc, nely, nelx) ./ dHs, h, \"symmetric\")\n", + " dV0 = imfilter(reshape(dV, nely, nelx) ./ dHs, h, \"symmetric\")\n", + "\n", + " return reshape(dc, nEl, 1), reshape(dV0, nEl, 1)\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function AutomaticDifferentiation(mat::Mat, disfeature::DiscretizationFeature, load::LoadsSupportsBCs, xPhys::Array{Float64})\n", + " # fea = FiniteElementAnalasys()\n", + " dc_AD = gradient(x -> FiniteElementAnalasys(mat, disfeature, load, x), xPhys)\n", + " # dv_AD = gradient(x)\n", + "\n", + " return dc_AD\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xval = ini.x\n", + "dc_AD = AutomaticDifferentiation(mat, disfeature, load, xval)\n", + "typeof(dc_AD)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "typeof(dc_AD)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function Visualization(setup::SetUp, x::Array{Float64}, loop::Int)\n", + " nelx, nely = setup.nelx, setup.nely\n", + " # cmap = cgrad(:Blues_9, rev=false)\n", + " plot = heatmap(reshape(x, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400,nely/nelx*400) , legend=:none, display_type=:gui)\n", + " display(plot)\n", + " savefig(plot, \"./top/res_$loop.pdf\")\n", + " # PLOT FINAL DESIGN\n", + " # heatmap(1.0 .- x[end:-1:1, :], yaxis=false, xaxis=false, legend=:none,color=:greys, grid=false, border=nothing, aspect_ratio=:equal)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function Optimization(setup::SetUp, mat::Mat, load::LoadsSupportsBCs,\n", + " filter::Filter, ini::Initialization, disfeature::DiscretizationFeature)\n", + " ch, loop = ini.ch, ini.loop\n", + " x, xPhys, xOld = ini.x, ini.xPhys, ini.xOld\n", + "\n", + " maxit, maxchang = setup.maxit, setup.maxchang\n", + " nely, nelx = setup.nely, setup.nelx\n", + " eta, beta, betaCnt = setup.eta, setup.beta, setup.betaCnt\n", + " volfrac, penal, nEl = mat.volfrac, mat.penal, disfeature.nEl\n", + " act = disfeature.act\n", + "\n", + " Hs, h, ft = filter.Hs, filter.h, filter.ft\n", + "\n", + " opt_hist = []\n", + " vf_hist = []\n", + "\n", + " ### Initiation of MMA ###\n", + " xval = copy(x[act])\n", + " xold1 = copy(xval)\n", + " xold2 = copy(xold1)\n", + "\n", + " low = copy(xval)\n", + " upp = copy(low)\n", + " #########################\n", + "\n", + " anim = @animate while ch > maxchang && loop < maxit || beta < betaCnt[2]\n", + " @time begin\n", + " loop = loop + 1\n", + " # COMPUTE PHYSICAL DENSITY FIELD \n", + " xTilde = imfilter(reshape(x, nely, nelx), h, \"symmetric\") ./ Hs\n", + " xPhys[act] = copy(xTilde[act])\n", + " if ft > 1\n", + " f = (mean(prj(xPhys[act], eta, beta)) .- volfrac) * (ft == 3)\n", + " while abs(f) > maxchang\n", + " eta = eta - f / mean(deta(xPhys[:], eta, beta))\n", + " f = mean(prj(xPhys[act], eta, beta)) - volfrac\n", + " end\n", + " filter.dHs = Hs ./ reshape(dprj(xTilde, eta, beta), nely, nelx)\n", + " xPhys = prj(xPhys, eta, beta)\n", + " end\n", + " ch = norm(xPhys - xOld) ./ sqrt(nEl)\n", + " xOld = copy(xPhys)\n", + " #~ SETUP AND SOLVE EQUILIBRIUM EQUATIONS\n", + " U, C, Vf = FiniteElementAnalasys(mat, disfeature, load, xPhys)\n", + " push!(opt_hist, C)\n", + " push!(vf_hist, Vf)\n", + " #~ COMPUTE SENSITIVITIES\n", + " dc, dV0 = SensitivityAnalasys(setup, filter, mat, disfeature, U, xPhys)\n", + " #~ MMA iteration\n", + " xmma, low, upp = MMAupdate(xval, low, upp, xold1, xold2, C, Vf, dc, dV0, loop, Mat().volfrac)\n", + " # Some vectors are updated:\n", + " xold2 = copy(xold1)\n", + " xold1 = copy(xval)\n", + " xval = copy(xmma)\n", + "\n", + " x[act] = xval\n", + "\n", + " #~ CONTINUATION\n", + " beta = cnt(beta, betaCnt, loop, ch, maxchang)\n", + "\n", + " heatmap(reshape(xPhys, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400, nely / nelx * 400), legend=:none)\n", + "\n", + " end\n", + " if mod(loop, 10) == 0\n", + " println(\"It.: $loop C.: $C Vf.: $Vf ch.: $ch, p.: $penal beta.:$beta eta.: $eta \")\n", + " Visualization(setup, xPhys, loop)\n", + " end\n", + " end\n", + " gif(anim, \"./top/top_hist.gif\", fps=8)\n", + " return xPhys, opt_hist, vf_hist, anim\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# @time xPhys, opt_hist, vf_hist, loop = Optimization(setup, mat, load, filter, ini, disfeature)\n", + "Optimization(setup, mat, load, filter, ini, disfeature)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function MMAupdate(xval::Array{Float64}, low::Array{Float64}, upp::Array{Float64}, \n", + " xold1::Array{Float64}, xold2::Array{Float64},\n", + " Obj::Float64, Vf::Float64, dc::Array{Float64}, dV0::Array{Float64}, loop::Int, volfrac::Float64)\n", + " move = 0.1\n", + " ### Initiation of MMA ###\n", + " m = 1\n", + " # active design variable\n", + " n = length(act)\n", + " onen = ones(n, 1)\n", + " onem = ones(m, 1)\n", + " zeron = zeros(n, 1)\n", + " zerom = zeros(m, 1)\n", + " a_mma = zerom\n", + " c_mma = 1.0e3 * onem\n", + " d_mma = zerom\n", + " a0 = 1.0\n", + " # column vector\n", + " # xval = xval\n", + " xmin = max.(xval .- move, zeron)\n", + " xmax = min.(xval .+ move, onen)\n", + "\n", + " # low = low\n", + " # upp = upp\n", + " # objective function \n", + " f0val = Obj\n", + " df0dx = dc[act]\n", + " df0dx2 = 0.0 * df0dx\n", + " # constraint function\n", + " fval = Vf / volfrac - 1.0 # column vector\n", + " dfdx = reshape(dV0[act], 1, length(act)) ./ volfrac # (m * n)\n", + " dfdx2 = 0.0 * dfdx\n", + "\n", + " # The MMA subproblem is solved at the point xval:\n", + " xmma, ymma, zmma, lam, xsi, eta, mu, zet, s, low, upp =\n", + " mmasub(m, n, loop, xval, xmin, xmax, xold1, xold2,\n", + " f0val, df0dx, df0dx2, fval, dfdx, dfdx2, low, upp, a0, a_mma, c_mma, d_mma)\n", + " \n", + " return xmma, low, upp\n", + " # xmma =\n", + " # mmasub(m, n, loop, xval, xmin, xmax, xold1, xold2,\n", + " # f0val, df0dx, df0dx2, fval, dfdx, dfdx2, low, upp, a0, a_mma, c_mma, d_mma)\n", + " # return xmma\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "include(\"MMA.jl\")\n", + "### Initiation of MMA ###\n", + "x = ones(disfeature.nEl, 1) * 0.5\n", + "act = disfeature.act\n", + "xval = copy(x[act])\n", + "xold1 = copy(xval)\n", + "xold2 = copy(xold1)\n", + "\n", + "low = copy(xval)\n", + "upp = copy(low)\n", + "\n", + "xval, low, upp = MMAupdate(xval, low, upp, xold1, xold2, 1.0, 0.3, x[act],\n", + " reshape(x[act], 1, length(act)) , 1, Mat().volfrac)\n", + "# ux2 = MMAupdate(xval, low, upp, xold1, xold2, 1.0, 0.3, x[act],\n", + "# reshape(x[act], 1, length(act)) , 1, Mat().volfrac)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "size(xval)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using NLopt\n", + "\n", + "function myfunc(x::Vector, grad::Vector)\n", + " if length(grad) > 0\n", + " grad[1] = 0\n", + " grad[2] = 0.5/sqrt(x[2])\n", + " end\n", + " return sqrt(x[2])\n", + "end\n", + "\n", + "function myconstraint(x::Vector, grad::Vector, a, b)\n", + " if length(grad) > 0\n", + " grad[1] = 3a * (a*x[1] + b)^2\n", + " grad[2] = -1\n", + " end\n", + " (a*x[1] + b)^3 - x[2]\n", + "end\n", + "\n", + "opt = Opt(:LD_MMA, 2)\n", + "opt.lower_bounds = [-Inf, 0.]\n", + "opt.xtol_rel = 1e-4\n", + "\n", + "opt.min_objective = myfunc\n", + "inequality_constraint!(opt, (x,g) -> myconstraint(x,g,2,0), 1e-8)\n", + "inequality_constraint!(opt, (x,g) -> myconstraint(x,g,-1,1), 1e-8)\n", + "\n", + "(minf,minx,ret) = optimize(opt, [1.234, 5.678])\n", + "numevals = opt.numevals # the number of function evaluations\n", + "println(\"got $minf at $minx after $numevals iterations (returned $ret)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using NLopt\n", + "function update_NLopt(act, xval, low, upp, C, Vf, dc, dV0)\n", + " alg = \":LD_MMA\"\n", + " n = length(act)\n", + " opt = Opt(alg, n)\n", + " opt.lower_bounds = low\n", + " opt.upper_bounds = upp\n", + "\n", + " opt.min_objective = ObjectiveFunction\n", + "\n", + " inequality_constraint!(opt, (x, g) -> VolumeConstraint(x, g;), 1e-8)\n", + "\n", + " return\n", + "end\n", + "\n", + "function ObjectiveFunction(x, grad; act, obj, dobj)\n", + " if length(grad) > 0\n", + " grad[:] = dobj[act]\n", + " end\n", + " return obj\n", + "end\n", + "\n", + "function VolumeConstraint(x, g; )\n", + " if length(grad) > 0\n", + " grad[:] = dV0\n", + " end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "f(x::Matrix, y) = sum(sin, x) + prod(tan, x) * sum(sqrt, x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using Zygote\n", + "grad = gradient(y -> f(y), rand(3))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "typeof(grad)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.7.2", + "language": "julia", + "name": "julia-1.7" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/top_mma/main_test.ipynb b/top_mma/main_test.ipynb new file mode 100755 index 0000000..557c146 --- /dev/null +++ b/top_mma/main_test.ipynb @@ -0,0 +1,682 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Filter(6.5, 3, [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766; 288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766; … ; 288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766; 288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766], [288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766; 288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766; … ; 288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766; 288.13372312595766 288.13372312595766 … 288.13372312595766 288.13372312595766])" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# module test\n", + "# export main\n", + "# push!(LOAD_PATH, \"C:/Users/Yu/Desktop/test/top_mma\")\n", + "push!(LOAD_PATH, \"/Users/yu/TopCodes/Julia/test/top_mma\")\n", + "include(\"top99neo_mma.jl\")\n", + "# include(joinpath(@__DIR__, \"top99neo.jl\"))\n", + "# using .TopOpt99neo_MMA\n", + "# function main()\n", + "setup = SetUp()\n", + "setup.nely = 40\n", + "setup.nelx = setup.nely * 3\n", + "mat = Mat()\n", + "mat.penal = 1.0\n", + "disfeature = DiscretizationFeature(setup, mat)\n", + "load = LoadsSupportsBCs(setup, disfeature)\n", + "ini = Initialization(setup, disfeature, mat)\n", + "filter = Filter(setup)\n", + " \n", + " # return xPhys, opt_hist, vf_hist, anim\n", + "# end\n", + "\n", + "# end" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 23.633891 seconds (32.13 M allocations: 1.795 GiB, 4.36% gc time, 89.25% compilation time)\n", + " 7.542493 seconds (5.40 M allocations: 417.024 MiB, 1.99% gc time, 66.27% compilation time)\n", + " 7.043414 seconds (4.24 M allocations: 351.043 MiB, 1.29% gc time, 64.35% compilation time)\n", + " 7.015602 seconds (4.24 M allocations: 342.473 MiB, 1.36% gc time, 64.18% compilation time)\n", + " 2.483729 seconds (35.93 k allocations: 166.313 MiB, 0.92% gc time)\n", + " 2.491934 seconds (36.24 k allocations: 167.530 MiB, 0.97% gc time)\n", + " 2.474496 seconds (33.89 k allocations: 158.970 MiB, 0.89% gc time)\n", + " 2.509636 seconds (33.89 k allocations: 158.970 MiB, 0.92% gc time)\n", + " 2.474636 seconds (33.90 k allocations: 158.971 MiB, 0.94% gc time)\n", + " 2.468103 seconds (32.68 k allocations: 154.140 MiB, 0.95% gc time)\n", + " 2.469903 seconds (32.99 k allocations: 155.356 MiB, 0.96% gc time)\n", + " 2.477608 seconds (31.51 k allocations: 149.860 MiB, 0.99% gc time)\n", + " 2.512768 seconds (36.50 k allocations: 168.197 MiB, 0.91% gc time)\n", + " 2.476235 seconds (33.86 k allocations: 158.420 MiB, 0.93% gc time)\n", + " 2.483626 seconds (35.03 k allocations: 162.700 MiB, 0.90% gc time)\n", + " 2.481973 seconds (35.03 k allocations: 162.700 MiB, 0.95% gc time)\n", + " 2.482441 seconds (36.20 k allocations: 166.980 MiB, 0.95% gc time)\n", + " 2.484969 seconds (36.50 k allocations: 168.197 MiB, 0.95% gc time)\n", + " 2.509633 seconds (39.46 k allocations: 179.191 MiB, 1.57% gc time)\n", + " 2.507952 seconds (39.46 k allocations: 179.191 MiB, 0.98% gc time)\n", + "It.: 20 C.: 252.06388217784087 Vf.: 0.3000000486842581 ch.: 0.005533489179191518, p.: 1.2 beta.:2.0 eta.: 0.335377776945556 \n", + " 2.495551 seconds (37.11 k allocations: 170.630 MiB, 1.24% gc time)\n", + " 2.508090 seconds (42.10 k allocations: 188.968 MiB, 0.98% gc time)\n", + " 2.554228 seconds (49.83 k allocations: 218.256 MiB, 0.90% gc time)\n", + " 2.542736 seconds (48.05 k allocations: 211.543 MiB, 1.48% gc time)\n", + " 2.549749 seconds (51.00 k allocations: 222.536 MiB, 1.49% gc time)\n", + " 2.532716 seconds (51.00 k allocations: 222.536 MiB, 0.89% gc time)\n", + " 2.538830 seconds (51.31 k allocations: 223.753 MiB, 0.87% gc time)\n", + " 2.552852 seconds (51.92 k allocations: 226.187 MiB, 1.45% gc time)\n", + " 2.565990 seconds (55.78 k allocations: 240.831 MiB, 1.50% gc time)\n", + " 2.560013 seconds (54.00 k allocations: 234.117 MiB, 1.48% gc time)\n", + " 2.582743 seconds (52.22 k allocations: 227.404 MiB, 1.45% gc time)\n", + " 2.566921 seconds (55.78 k allocations: 240.831 MiB, 0.92% gc time)\n", + " 2.542359 seconds (50.74 k allocations: 221.907 MiB, 0.94% gc time)\n", + " 2.699591 seconds (50.44 k allocations: 220.690 MiB, 1.65% gc time)\n", + " 2.599058 seconds (50.44 k allocations: 220.690 MiB, 0.92% gc time)\n", + " 2.507772 seconds (50.44 k allocations: 220.690 MiB, 1.55% gc time)\n", + " 2.487814 seconds (50.44 k allocations: 220.690 MiB, 1.51% gc time)\n", + " 2.451477 seconds (49.83 k allocations: 218.256 MiB, 0.89% gc time)\n", + " 2.613078 seconds (49.53 k allocations: 217.039 MiB, 2.27% gc time)\n", + " 2.613632 seconds (49.53 k allocations: 217.039 MiB, 1.03% gc time)\n", + "It.: 40 C.: 282.4183621732244 Vf.: 0.3000000015869856 ch.: 0.0018822135118330065, p.: 1.4 beta.:2.0 eta.: 0.32753725626501584 \n", + " 2.744842 seconds (49.83 k allocations: 218.256 MiB, 1.71% gc time)\n", + " 2.984513 seconds (53.09 k allocations: 230.470 MiB, 0.85% gc time)\n", + " 2.722451 seconds (57.60 k allocations: 248.132 MiB, 1.53% gc time)\n", + " 2.613040 seconds (51.92 k allocations: 226.187 MiB, 1.60% gc time)\n", + " 2.539466 seconds (51.92 k allocations: 226.187 MiB, 1.05% gc time)\n", + " 2.654197 seconds (49.27 k allocations: 216.410 MiB, 1.66% gc time)\n", + " 2.655350 seconds (50.44 k allocations: 220.690 MiB, 1.00% gc time)\n", + " 2.555461 seconds (50.44 k allocations: 220.690 MiB, 1.59% gc time)\n", + " 2.560210 seconds (50.44 k allocations: 220.690 MiB, 1.03% gc time)\n", + " 2.550502 seconds (49.83 k allocations: 218.256 MiB, 1.60% gc time)\n", + " 2.535319 seconds (49.83 k allocations: 218.256 MiB, 1.02% gc time)\n", + " 2.541149 seconds (48.66 k allocations: 213.976 MiB, 1.57% gc time)\n", + " 2.545415 seconds (49.83 k allocations: 218.256 MiB, 1.02% gc time)\n", + " 2.572688 seconds (49.83 k allocations: 218.256 MiB, 1.02% gc time)\n", + " 2.528090 seconds (49.83 k allocations: 218.256 MiB, 0.99% gc time)\n", + " 2.557792 seconds (52.18 k allocations: 226.817 MiB, 1.61% gc time)\n", + " 2.539763 seconds (52.18 k allocations: 226.817 MiB, 0.99% gc time)\n", + " 2.563995 seconds (53.35 k allocations: 231.097 MiB, 1.67% gc time)\n", + " 2.569799 seconds (53.35 k allocations: 231.097 MiB, 1.06% gc time)\n", + " 2.563906 seconds (53.35 k allocations: 231.097 MiB, 1.69% gc time)\n", + "It.: 60 C.: 321.96174126605825 Vf.: 0.30000000042517155 ch.: 0.0010504298988921721, p.: 1.5999999999999999 beta.:2.0 eta.: 0.32468471888413036 \n", + " 2.578507 seconds (59.56 k allocations: 254.301 MiB, 1.12% gc time)\n", + " 2.569300 seconds (60.47 k allocations: 257.952 MiB, 1.04% gc time)\n", + " 2.642531 seconds (70.89 k allocations: 297.604 MiB, 2.24% gc time)\n", + " 2.629846 seconds (71.76 k allocations: 300.668 MiB, 1.61% gc time)\n", + " 2.749413 seconds (71.45 k allocations: 299.451 MiB, 1.65% gc time)\n", + " 2.871839 seconds (71.45 k allocations: 299.451 MiB, 1.76% gc time)\n", + " 2.687989 seconds (69.67 k allocations: 292.737 MiB, 1.69% gc time)\n", + " 2.887680 seconds (67.59 k allocations: 284.807 MiB, 1.91% gc time)\n", + " 2.868877 seconds (65.50 k allocations: 276.876 MiB, 1.71% gc time)\n", + " 2.789235 seconds (63.12 k allocations: 267.729 MiB, 1.82% gc time)\n", + " 2.526885 seconds (61.34 k allocations: 261.015 MiB, 1.71% gc time)\n", + " 2.502833 seconds (61.34 k allocations: 261.015 MiB, 1.81% gc time)\n", + " 2.544037 seconds (61.34 k allocations: 261.015 MiB, 1.05% gc time)\n", + " 2.580909 seconds (61.34 k allocations: 261.015 MiB, 1.90% gc time)\n", + " 2.594493 seconds (61.34 k allocations: 261.015 MiB, 1.84% gc time)\n", + " 2.524158 seconds (61.03 k allocations: 259.798 MiB, 1.09% gc time)\n", + " 2.506165 seconds (62.20 k allocations: 264.078 MiB, 1.83% gc time)\n", + " 2.443902 seconds (59.56 k allocations: 254.301 MiB, 1.17% gc time)\n", + " 2.458091 seconds (59.56 k allocations: 254.301 MiB, 1.80% gc time)\n", + " 2.453842 seconds (59.56 k allocations: 254.301 MiB, 1.84% gc time)\n", + "It.: 80 C.: 367.10092322947565 Vf.: 0.3000000001615869 ch.: 0.0009730860406811991, p.: 1.7999999999999998 beta.:2.0 eta.: 0.32247505983507935 \n", + " 2.454556 seconds (59.86 k allocations: 255.518 MiB, 1.23% gc time)\n", + " 2.489507 seconds (61.64 k allocations: 262.232 MiB, 1.99% gc time)\n", + " 2.510904 seconds (75.06 k allocations: 313.465 MiB, 1.80% gc time)\n", + " 2.495871 seconds (76.53 k allocations: 318.962 MiB, 1.79% gc time)\n", + " 2.483227 seconds (76.53 k allocations: 318.962 MiB, 1.78% gc time)\n", + " 2.486615 seconds (76.53 k allocations: 318.962 MiB, 1.86% gc time)\n", + " 2.713940 seconds (77.70 k allocations: 323.243 MiB, 1.94% gc time)\n", + " 2.608192 seconds (77.40 k allocations: 322.026 MiB, 1.93% gc time)\n", + " 2.810418 seconds (77.40 k allocations: 322.026 MiB, 1.89% gc time)\n", + " 2.698368 seconds (75.62 k allocations: 315.312 MiB, 1.75% gc time)\n", + " 2.632153 seconds (75.62 k allocations: 315.312 MiB, 1.97% gc time)\n", + " 2.618081 seconds (77.40 k allocations: 322.026 MiB, 1.86% gc time)\n", + " 2.544162 seconds (77.40 k allocations: 322.026 MiB, 1.85% gc time)\n", + " 2.530027 seconds (77.40 k allocations: 322.026 MiB, 1.88% gc time)\n", + " 2.682546 seconds (78.88 k allocations: 327.523 MiB, 1.78% gc time)\n", + " 2.677404 seconds (77.40 k allocations: 322.026 MiB, 1.81% gc time)\n", + " 2.550289 seconds (73.23 k allocations: 306.165 MiB, 1.27% gc time)\n", + " 2.594195 seconds (75.01 k allocations: 312.878 MiB, 1.98% gc time)\n", + " 2.640601 seconds (75.01 k allocations: 312.878 MiB, 2.02% gc time)\n", + " 2.543590 seconds (73.23 k allocations: 306.165 MiB, 1.21% gc time)\n", + "It.: 100 C.: 416.1971100563556 Vf.: 0.3000000001854986 ch.: 0.0014653446652638112, p.: 1.9999999999999998 beta.:2.0 eta.: 0.3200760499923675 \n", + " 2.887247 seconds (69.98 k allocations: 293.954 MiB, 10.03% gc time)\n", + " 2.812550 seconds (78.62 k allocations: 326.893 MiB, 7.84% gc time)\n", + " 2.717321 seconds (100.37 k allocations: 409.849 MiB, 2.11% gc time)\n", + " 2.612134 seconds (100.37 k allocations: 409.849 MiB, 2.21% gc time)\n", + " 2.671393 seconds (100.37 k allocations: 409.849 MiB, 2.24% gc time)\n", + " 2.762367 seconds (99.20 k allocations: 405.569 MiB, 2.35% gc time)\n", + " 2.813349 seconds (102.45 k allocations: 417.780 MiB, 2.21% gc time)\n", + " 2.807382 seconds (102.45 k allocations: 417.780 MiB, 2.27% gc time)\n", + " 2.735045 seconds (102.45 k allocations: 417.780 MiB, 2.47% gc time)\n", + " 2.710863 seconds (100.98 k allocations: 412.283 MiB, 2.02% gc time)\n", + " 2.717637 seconds (100.98 k allocations: 412.283 MiB, 2.31% gc time)\n", + " 2.730000 seconds (100.98 k allocations: 412.283 MiB, 2.40% gc time)\n", + " 2.579725 seconds (100.98 k allocations: 412.283 MiB, 2.13% gc time)\n", + " 2.608467 seconds (99.20 k allocations: 405.569 MiB, 2.63% gc time)\n", + " 2.556019 seconds (99.20 k allocations: 405.569 MiB, 2.25% gc time)\n", + " 2.633828 seconds (102.15 k allocations: 416.563 MiB, 2.38% gc time)\n", + " 2.753143 seconds (99.20 k allocations: 405.569 MiB, 2.20% gc time)\n", + " 2.595887 seconds (102.15 k allocations: 416.563 MiB, 2.32% gc time)\n", + " 2.587585 seconds (102.15 k allocations: 416.563 MiB, 2.35% gc time)\n", + " 2.713205 seconds (103.32 k allocations: 420.843 MiB, 1.92% gc time)\n", + "It.: 120 C.: 465.3388211209528 Vf.: 0.30000000041901226 ch.: 0.002540014752051178, p.: 2.1999999999999997 beta.:2.0 eta.: 0.3171960041698332 \n", + " 2.766800 seconds (97.11 k allocations: 397.638 MiB, 2.65% gc time)\n", + " 2.647607 seconds (98.94 k allocations: 404.939 MiB, 2.10% gc time)\n", + " 2.860128 seconds (119.21 k allocations: 482.398 MiB, 2.58% gc time)\n", + " 2.860843 seconds (123.99 k allocations: 500.693 MiB, 2.97% gc time)\n", + " 3.022834 seconds (126.38 k allocations: 509.840 MiB, 3.23% gc time)\n", + " 2.901080 seconds (132.58 k allocations: 533.045 MiB, 2.77% gc time)\n", + " 2.895750 seconds (125.46 k allocations: 506.190 MiB, 3.34% gc time)\n", + " 2.856286 seconds (120.38 k allocations: 486.678 MiB, 2.97% gc time)\n", + " 3.010390 seconds (118.00 k allocations: 477.531 MiB, 2.26% gc time)\n", + " 2.799958 seconds (112.92 k allocations: 458.020 MiB, 2.98% gc time)\n", + " 2.746013 seconds (112.92 k allocations: 458.020 MiB, 2.23% gc time)\n", + " 2.671821 seconds (110.22 k allocations: 447.655 MiB, 2.26% gc time)\n", + " 2.700583 seconds (109.01 k allocations: 442.788 MiB, 2.44% gc time)\n", + " 2.662198 seconds (109.01 k allocations: 442.788 MiB, 2.50% gc time)\n", + " 2.725580 seconds (106.32 k allocations: 432.424 MiB, 2.70% gc time)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 2.891894 seconds (103.93 k allocations: 423.277 MiB, 2.73% gc time)\n", + " 2.780316 seconds (103.93 k allocations: 423.277 MiB, 2.66% gc time)\n", + " 2.817546 seconds (102.15 k allocations: 416.563 MiB, 2.64% gc time)\n", + " 2.954268 seconds (103.93 k allocations: 423.277 MiB, 2.75% gc time)\n", + " 2.865322 seconds (102.15 k allocations: 416.563 MiB, 1.99% gc time)\n", + "It.: 140 C.: 485.4863462826721 Vf.: 0.29999999678142314 ch.: 0.002157310008095807, p.: 2.4 beta.:2.0 eta.: 0.3129772980314933 \n", + " 2.777329 seconds (98.02 k allocations: 401.289 MiB, 2.81% gc time)\n", + " 2.761179 seconds (98.37 k allocations: 403.056 MiB, 2.10% gc time)\n", + " 2.928009 seconds (134.71 k allocations: 541.563 MiB, 3.34% gc time)\n", + " 2.921204 seconds (134.71 k allocations: 541.563 MiB, 3.48% gc time)\n", + " 3.021942 seconds (157.42 k allocations: 628.756 MiB, 3.37% gc time)\n", + " 2.975619 seconds (152.64 k allocations: 610.461 MiB, 3.42% gc time)\n", + " 2.969731 seconds (150.26 k allocations: 601.314 MiB, 3.47% gc time)\n", + " 2.988683 seconds (151.17 k allocations: 604.965 MiB, 3.49% gc time)\n", + " 3.006252 seconds (148.17 k allocations: 593.384 MiB, 3.68% gc time)\n", + " 3.039890 seconds (146.09 k allocations: 585.453 MiB, 9.10% gc time)\n", + " 2.884480 seconds (148.78 k allocations: 595.817 MiB, 3.37% gc time)\n", + " 2.856648 seconds (144.00 k allocations: 577.522 MiB, 2.74% gc time)\n", + " 2.884919 seconds (147.87 k allocations: 592.167 MiB, 3.22% gc time)\n", + " 2.845730 seconds (140.40 k allocations: 563.508 MiB, 3.05% gc time)\n", + " 2.923810 seconds (150.82 k allocations: 603.161 MiB, 3.76% gc time)\n", + " 2.894663 seconds (147.26 k allocations: 589.733 MiB, 3.08% gc time)\n", + " 2.873834 seconds (144.87 k allocations: 580.586 MiB, 3.18% gc time)\n", + " 2.905532 seconds (151.12 k allocations: 604.377 MiB, 3.22% gc time)\n", + " 2.906499 seconds (151.43 k allocations: 605.594 MiB, 3.25% gc time)\n", + " 2.909038 seconds (151.43 k allocations: 605.594 MiB, 3.30% gc time)\n", + "It.: 160 C.: 506.484108735154 Vf.: 0.29999999764667856 ch.: 0.0012929730417375583, p.: 2.6 beta.:2.0 eta.: 0.3123593961872853 \n", + " 2.835279 seconds (129.37 k allocations: 521.421 MiB, 2.68% gc time)\n", + " 2.940898 seconds (155.68 k allocations: 622.592 MiB, 3.48% gc time)\n", + " 3.046937 seconds (181.03 k allocations: 719.516 MiB, 3.85% gc time)\n", + " 3.011518 seconds (175.09 k allocations: 696.988 MiB, 3.46% gc time)\n", + " 3.009457 seconds (170.92 k allocations: 681.127 MiB, 3.59% gc time)\n", + " 3.031882 seconds (168.23 k allocations: 670.763 MiB, 3.65% gc time)\n", + " 2.998234 seconds (168.23 k allocations: 670.763 MiB, 3.77% gc time)\n", + " 3.007260 seconds (167.88 k allocations: 668.996 MiB, 3.82% gc time)\n", + " 2.985724 seconds (163.11 k allocations: 650.701 MiB, 3.36% gc time)\n", + " 2.974466 seconds (155.64 k allocations: 622.043 MiB, 3.40% gc time)\n", + " 2.942412 seconds (153.25 k allocations: 612.895 MiB, 3.02% gc time)\n", + " 2.932406 seconds (146.70 k allocations: 587.905 MiB, 3.63% gc time)\n", + " 2.933973 seconds (146.39 k allocations: 586.396 MiB, 3.17% gc time)\n", + " 2.895362 seconds (141.92 k allocations: 569.562 MiB, 3.21% gc time)\n", + " 2.918303 seconds (141.92 k allocations: 569.573 MiB, 3.29% gc time)\n", + " 2.902668 seconds (136.23 k allocations: 547.646 MiB, 2.81% gc time)\n", + " 2.868826 seconds (133.84 k allocations: 538.499 MiB, 2.93% gc time)\n", + " 2.831245 seconds (121.60 k allocations: 491.546 MiB, 2.94% gc time)\n", + " 2.817204 seconds (116.52 k allocations: 472.034 MiB, 3.02% gc time)\n", + " 2.758677 seconds (106.36 k allocations: 433.011 MiB, 2.36% gc time)\n", + "It.: 180 C.: 531.7174853082188 Vf.: 0.2999998676883111 ch.: 0.0008734051328254364, p.: 2.8000000000000003 beta.:2.0 eta.: 0.38681581566094736 \n", + " 2.743737 seconds (106.36 k allocations: 433.165 MiB, 2.47% gc time)\n", + " 2.840415 seconds (126.42 k allocations: 510.529 MiB, 2.95% gc time)\n", + " 2.884370 seconds (138.05 k allocations: 555.063 MiB, 2.89% gc time)\n", + " 2.876649 seconds (138.35 k allocations: 556.343 MiB, 2.93% gc time)\n", + " 2.871201 seconds (135.66 k allocations: 545.973 MiB, 3.01% gc time)\n", + " 2.866094 seconds (135.32 k allocations: 544.147 MiB, 3.04% gc time)\n", + " 2.855630 seconds (122.16 k allocations: 493.553 MiB, 2.43% gc time)\n", + " 2.855827 seconds (122.16 k allocations: 493.460 MiB, 3.16% gc time)\n", + " 2.803037 seconds (119.78 k allocations: 483.962 MiB, 2.58% gc time)\n", + " 2.818501 seconds (119.17 k allocations: 481.963 MiB, 2.68% gc time)\n", + " 2.812715 seconds (119.47 k allocations: 483.109 MiB, 2.58% gc time)\n", + " 2.819715 seconds (114.70 k allocations: 464.451 MiB, 2.66% gc time)\n", + " 2.796620 seconds (114.70 k allocations: 464.806 MiB, 2.77% gc time)\n", + " 2.797383 seconds (114.70 k allocations: 464.847 MiB, 2.05% gc time)\n", + " 2.827795 seconds (114.70 k allocations: 464.882 MiB, 2.87% gc time)\n", + " 2.826913 seconds (115.56 k allocations: 468.111 MiB, 2.93% gc time)\n", + " 2.814646 seconds (111.40 k allocations: 452.227 MiB, 2.24% gc time)\n", + " 3.091060 seconds (105.45 k allocations: 429.273 MiB, 13.66% gc time)\n", + " 2.685124 seconds (103.06 k allocations: 420.409 MiB, 2.10% gc time)\n", + " 2.700202 seconds (115.92 k allocations: 421.298 MiB, 2.13% gc time, 0.44% compilation time)\n", + "It.: 200 C.: 558.4819501817269 Vf.: 0.30000006191116096 ch.: 0.0006629482699576825, p.: 3.0000000000000004 beta.:2.0 eta.: 0.4956558115373888 \n", + " 2.716640 seconds (105.10 k allocations: 427.652 MiB, 2.45% gc time)\n", + " 2.710414 seconds (105.75 k allocations: 430.867 MiB, 2.25% gc time)\n", + " 2.724300 seconds (110.83 k allocations: 450.171 MiB, 2.34% gc time)\n", + " 2.719633 seconds (105.75 k allocations: 431.028 MiB, 2.35% gc time)\n", + " 2.714736 seconds (105.71 k allocations: 430.096 MiB, 2.41% gc time)\n", + " 2.875826 seconds (105.10 k allocations: 427.877 MiB, 2.56% gc time)\n", + " 2.761255 seconds (103.36 k allocations: 421.509 MiB, 2.22% gc time)\n", + " 2.750557 seconds (99.84 k allocations: 408.580 MiB, 2.29% gc time)\n", + " 2.766420 seconds (100.71 k allocations: 411.640 MiB, 2.27% gc time)\n", + " 2.764967 seconds (100.71 k allocations: 411.903 MiB, 2.36% gc time)\n", + " 2.756127 seconds (100.71 k allocations: 411.854 MiB, 2.39% gc time)\n", + " 2.755379 seconds (101.88 k allocations: 416.175 MiB, 2.42% gc time)\n", + " 2.752523 seconds (100.71 k allocations: 411.851 MiB, 2.03% gc time)\n", + " 2.778746 seconds (100.71 k allocations: 411.838 MiB, 2.55% gc time)\n", + " 2.768649 seconds (100.71 k allocations: 411.916 MiB, 2.61% gc time)\n", + " 2.763283 seconds (101.88 k allocations: 416.067 MiB, 2.62% gc time)\n", + " 2.771204 seconds (100.71 k allocations: 412.141 MiB, 2.00% gc time)\n", + " 2.753624 seconds (100.71 k allocations: 411.927 MiB, 2.66% gc time)\n", + " 2.733184 seconds (100.71 k allocations: 411.947 MiB, 2.09% gc time)\n", + " 2.732905 seconds (99.24 k allocations: 406.554 MiB, 2.23% gc time)\n", + "It.: 220 C.: 484.2853128321875 Vf.: 0.2999999996524318 ch.: 0.05545768358497312, p.: 3.0000000000000004 beta.:4.0 eta.: 0.5530403414702602 \n", + " 2.768047 seconds (101.28 k allocations: 414.564 MiB, 2.84% gc time)\n", + " 2.784755 seconds (111.14 k allocations: 451.500 MiB, 2.30% gc time)\n", + " 2.814559 seconds (115.00 k allocations: 466.305 MiB, 2.84% gc time)\n", + " 2.797690 seconds (111.14 k allocations: 451.274 MiB, 2.89% gc time)\n", + " 2.777880 seconds (105.75 k allocations: 430.680 MiB, 2.35% gc time)\n", + " 2.768970 seconds (103.37 k allocations: 421.404 MiB, 2.43% gc time)\n", + " 2.767990 seconds (103.37 k allocations: 422.107 MiB, 2.54% gc time)\n", + " 2.774871 seconds (103.67 k allocations: 422.960 MiB, 2.56% gc time)\n", + " 2.772815 seconds (103.67 k allocations: 422.744 MiB, 2.50% gc time)\n", + " 2.808310 seconds (100.41 k allocations: 410.984 MiB, 2.59% gc time)\n", + " 2.787294 seconds (100.41 k allocations: 410.612 MiB, 2.57% gc time)\n", + " 2.777564 seconds (103.37 k allocations: 421.606 MiB, 2.63% gc time)\n", + " 2.764378 seconds (103.67 k allocations: 423.028 MiB, 2.02% gc time)\n", + " 2.781587 seconds (101.59 k allocations: 414.829 MiB, 2.67% gc time)\n", + " 2.807668 seconds (101.59 k allocations: 414.883 MiB, 2.73% gc time)\n", + " 2.772745 seconds (99.50 k allocations: 406.969 MiB, 2.04% gc time)\n", + " 2.782651 seconds (100.67 k allocations: 411.409 MiB, 2.87% gc time)\n", + " 2.762864 seconds (99.20 k allocations: 405.727 MiB, 2.10% gc time)\n", + " 3.021428 seconds (96.25 k allocations: 394.740 MiB, 2.71% gc time)\n", + " 2.960838 seconds (99.46 k allocations: 406.908 MiB, 2.45% gc time)\n", + "It.: 240 C.: 415.08074138149163 Vf.: 0.2999996542927569 ch.: 0.044421757368782, p.: 3.0000000000000004 beta.:6.0 eta.: 0.5514174098451565 \n", + " 2.856999 seconds (109.31 k allocations: 443.841 MiB, 2.90% gc time)\n", + " 2.853918 seconds (117.35 k allocations: 474.344 MiB, 2.86% gc time)\n", + " 2.852463 seconds (122.12 k allocations: 492.539 MiB, 2.13% gc time)\n", + " 2.849461 seconds (119.73 k allocations: 483.568 MiB, 2.27% gc time)\n", + " 3.233889 seconds (112.87 k allocations: 457.380 MiB, 14.54% gc time)\n", + " 2.750043 seconds (111.40 k allocations: 451.876 MiB, 2.52% gc time)\n", + " 2.720483 seconds (107.23 k allocations: 436.902 MiB, 2.18% gc time)\n", + " 2.725903 seconds (105.15 k allocations: 427.947 MiB, 2.61% gc time)\n", + " 2.717881 seconds (105.15 k allocations: 428.939 MiB, 2.30% gc time)\n", + " 2.732698 seconds (105.15 k allocations: 428.087 MiB, 2.34% gc time)\n", + " 2.714888 seconds (104.54 k allocations: 425.657 MiB, 1.98% gc time)\n", + " 2.722403 seconds (100.67 k allocations: 411.472 MiB, 2.44% gc time)\n", + " 2.744401 seconds (107.79 k allocations: 437.874 MiB, 2.50% gc time)\n", + " 2.725835 seconds (108.40 k allocations: 440.273 MiB, 2.13% gc time)\n", + " 2.752625 seconds (109.88 k allocations: 445.834 MiB, 2.64% gc time)\n", + " 2.741217 seconds (106.32 k allocations: 432.527 MiB, 2.29% gc time)\n", + " 2.787592 seconds (110.53 k allocations: 449.221 MiB, 2.67% gc time)\n", + " 2.756697 seconds (110.53 k allocations: 449.008 MiB, 2.35% gc time)\n", + " 2.787903 seconds (115.31 k allocations: 467.221 MiB, 2.84% gc time)\n", + " 2.811796 seconds (119.47 k allocations: 483.434 MiB, 2.88% gc time)\n", + "It.: 260 C.: 378.5089343314532 Vf.: 0.29999999991624204 ch.: 0.03132870878007018, p.: 3.0000000000000004 beta.:8.0 eta.: 0.5546214369887977 \n", + " 2.862694 seconds (130.81 k allocations: 526.329 MiB, 2.89% gc time)\n", + " 2.943738 seconds (149.61 k allocations: 598.292 MiB, 3.35% gc time)\n", + " 2.919757 seconds (149.61 k allocations: 598.292 MiB, 2.89% gc time)\n", + " 2.949663 seconds (147.22 k allocations: 589.077 MiB, 3.42% gc time)\n", + " 2.937967 seconds (143.35 k allocations: 574.500 MiB, 3.00% gc time)\n", + " 2.884123 seconds (135.63 k allocations: 545.211 MiB, 3.13% gc time)\n", + " 2.843292 seconds (127.55 k allocations: 514.118 MiB, 2.67% gc time)\n", + " 2.877420 seconds (127.51 k allocations: 513.531 MiB, 3.25% gc time)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 2.811137 seconds (119.13 k allocations: 481.223 MiB, 2.74% gc time)\n", + " 2.848024 seconds (119.13 k allocations: 481.222 MiB, 2.87% gc time)\n", + " 2.816933 seconds (120.91 k allocations: 487.936 MiB, 2.27% gc time)\n", + " 2.822074 seconds (120.91 k allocations: 487.936 MiB, 2.88% gc time)\n", + " 2.828007 seconds (119.43 k allocations: 482.439 MiB, 2.95% gc time)\n", + " 2.850612 seconds (122.69 k allocations: 494.650 MiB, 2.98% gc time)\n", + " 2.853051 seconds (125.64 k allocations: 505.644 MiB, 3.02% gc time)\n", + " 2.828906 seconds (125.64 k allocations: 505.644 MiB, 2.44% gc time)\n", + " 2.890272 seconds (131.93 k allocations: 529.874 MiB, 3.03% gc time)\n", + " 2.896557 seconds (130.46 k allocations: 524.526 MiB, 3.15% gc time)\n", + " 2.878258 seconds (130.20 k allocations: 523.896 MiB, 3.21% gc time)\n", + " 2.849862 seconds (123.64 k allocations: 499.059 MiB, 2.56% gc time)\n", + "It.: 280 C.: 357.2256484209688 Vf.: 0.299999999824066 ch.: 0.022588191628482784, p.: 3.0000000000000004 beta.:10.0 eta.: 0.5578136018010208 \n", + " 2.990229 seconds (144.83 k allocations: 580.157 MiB, 3.20% gc time)\n", + " 3.000765 seconds (154.69 k allocations: 617.951 MiB, 3.87% gc time)\n", + " 2.982562 seconds (153.51 k allocations: 613.523 MiB, 3.24% gc time)\n", + " 2.975805 seconds (148.74 k allocations: 595.229 MiB, 3.25% gc time)\n", + " 2.981175 seconds (146.65 k allocations: 587.297 MiB, 3.31% gc time)\n", + " 2.950235 seconds (142.79 k allocations: 573.008 MiB, 3.32% gc time)\n", + " 2.973505 seconds (146.91 k allocations: 588.069 MiB, 3.33% gc time)\n", + " 2.970157 seconds (146.61 k allocations: 586.710 MiB, 2.68% gc time)\n", + " 2.967808 seconds (146.91 k allocations: 587.927 MiB, 2.80% gc time)\n", + " 2.977080 seconds (146.91 k allocations: 588.595 MiB, 3.56% gc time)\n", + " 2.988707 seconds (146.91 k allocations: 587.927 MiB, 3.54% gc time)\n", + " 2.985652 seconds (144.53 k allocations: 578.780 MiB, 3.74% gc time)\n", + " 3.252498 seconds (146.00 k allocations: 584.425 MiB, 14.27% gc time)\n", + " 2.884485 seconds (140.92 k allocations: 564.913 MiB, 2.66% gc time)\n", + " 2.833859 seconds (135.23 k allocations: 542.969 MiB, 2.83% gc time)\n", + " 2.839562 seconds (137.62 k allocations: 551.968 MiB, 2.87% gc time)\n", + " 2.895343 seconds (148.39 k allocations: 593.424 MiB, 2.94% gc time)\n", + " 2.897684 seconds (146.00 k allocations: 584.277 MiB, 3.02% gc time)\n", + " 2.888651 seconds (148.39 k allocations: 593.444 MiB, 3.07% gc time)\n", + " 2.893580 seconds (146.34 k allocations: 586.595 MiB, 3.13% gc time)\n", + "It.: 300 C.: 343.68547199745956 Vf.: 0.29999999990459136 ch.: 0.016997420934861212, p.: 3.0000000000000004 beta.:12.0 eta.: 0.5603002811326168 \n", + " 2.956780 seconds (151.69 k allocations: 606.383 MiB, 3.39% gc time)\n", + " 2.943691 seconds (160.98 k allocations: 642.343 MiB, 3.25% gc time)\n", + " 2.945438 seconds (158.59 k allocations: 633.181 MiB, 3.32% gc time)\n", + " 2.938848 seconds (158.59 k allocations: 633.286 MiB, 2.98% gc time)\n", + " 2.936004 seconds (156.51 k allocations: 625.356 MiB, 3.14% gc time)\n", + " 2.946696 seconds (149.35 k allocations: 597.823 MiB, 3.21% gc time)\n", + " 2.933589 seconds (149.35 k allocations: 597.912 MiB, 3.29% gc time)\n", + " 2.940946 seconds (147.26 k allocations: 589.959 MiB, 3.36% gc time)\n", + " 2.925719 seconds (146.96 k allocations: 588.743 MiB, 3.43% gc time)\n", + " 2.918412 seconds (146.96 k allocations: 588.720 MiB, 2.99% gc time)\n", + " 2.958671 seconds (146.96 k allocations: 588.950 MiB, 3.69% gc time)\n", + " 2.944889 seconds (146.96 k allocations: 588.676 MiB, 3.23% gc time)\n", + " 2.956998 seconds (151.13 k allocations: 604.627 MiB, 3.18% gc time)\n", + " 2.930835 seconds (146.96 k allocations: 588.676 MiB, 3.23% gc time)\n", + " 2.948490 seconds (146.96 k allocations: 588.676 MiB, 3.28% gc time)\n", + " 2.995130 seconds (151.13 k allocations: 604.536 MiB, 3.20% gc time)\n", + " 2.974932 seconds (156.21 k allocations: 624.048 MiB, 3.31% gc time)\n", + " 2.973642 seconds (151.13 k allocations: 605.224 MiB, 3.37% gc time)\n", + " 2.958699 seconds (151.13 k allocations: 604.431 MiB, 3.42% gc time)\n", + " 2.972236 seconds (151.16 k allocations: 605.718 MiB, 3.46% gc time)\n", + "It.: 320 C.: 334.40408460098314 Vf.: 0.2999999999662704 ch.: 0.013495841885321179, p.: 3.0000000000000004 beta.:14.0 eta.: 0.5621363365527481 \n", + " 3.039928 seconds (163.07 k allocations: 650.410 MiB, 4.06% gc time)\n", + " 3.147202 seconds (185.17 k allocations: 735.188 MiB, 4.02% gc time)\n", + " 3.137165 seconds (190.25 k allocations: 754.753 MiB, 4.07% gc time)\n", + " 3.144591 seconds (190.25 k allocations: 754.608 MiB, 4.08% gc time)\n", + " 3.136797 seconds (188.16 k allocations: 746.699 MiB, 4.15% gc time)\n", + " 3.127759 seconds (180.69 k allocations: 718.182 MiB, 3.58% gc time)\n", + " 3.089528 seconds (178.31 k allocations: 708.771 MiB, 3.63% gc time)\n", + " 3.121633 seconds (178.31 k allocations: 708.963 MiB, 4.32% gc time)\n", + " 3.096037 seconds (178.00 k allocations: 707.924 MiB, 3.69% gc time)\n", + " 3.134197 seconds (173.23 k allocations: 689.456 MiB, 3.73% gc time)\n", + " 3.068973 seconds (168.15 k allocations: 669.935 MiB, 3.85% gc time)\n", + " 3.078937 seconds (165.45 k allocations: 659.599 MiB, 3.32% gc time)\n", + " 3.054454 seconds (163.07 k allocations: 650.416 MiB, 3.98% gc time)\n", + " 3.041331 seconds (162.76 k allocations: 649.157 MiB, 3.33% gc time)\n", + " 3.024806 seconds (158.59 k allocations: 633.472 MiB, 3.42% gc time)\n", + " 3.013809 seconds (153.21 k allocations: 612.613 MiB, 3.43% gc time)\n", + " 3.031681 seconds (153.21 k allocations: 612.554 MiB, 3.58% gc time)\n", + " 3.012214 seconds (153.21 k allocations: 612.715 MiB, 3.51% gc time)\n", + " 3.014559 seconds (153.21 k allocations: 612.564 MiB, 3.54% gc time)\n", + " 3.031961 seconds (153.25 k allocations: 613.174 MiB, 3.78% gc time)\n", + "It.: 340 C.: 327.5280971107868 Vf.: 0.29999999998975985 ch.: 0.011214545146629855, p.: 3.0000000000000004 beta.:16.0 eta.: 0.563461511048329 \n", + " 3.405735 seconds (173.49 k allocations: 690.264 MiB, 14.44% gc time)\n", + " 3.094647 seconds (203.92 k allocations: 807.077 MiB, 3.65% gc time)\n", + " 3.120909 seconds (207.83 k allocations: 822.027 MiB, 4.09% gc time)\n", + " 3.145450 seconds (213.17 k allocations: 842.185 MiB, 4.18% gc time)\n", + " 3.162598 seconds (213.17 k allocations: 842.240 MiB, 3.92% gc time)\n", + " 3.148805 seconds (208.70 k allocations: 825.107 MiB, 4.06% gc time)\n", + " 3.154534 seconds (206.31 k allocations: 815.813 MiB, 4.17% gc time)\n", + " 3.143632 seconds (205.09 k allocations: 811.377 MiB, 4.32% gc time)\n", + " 3.136390 seconds (205.09 k allocations: 811.138 MiB, 3.94% gc time)\n", + " 3.142005 seconds (203.01 k allocations: 802.986 MiB, 4.13% gc time)\n", + " 3.121860 seconds (197.93 k allocations: 783.451 MiB, 4.17% gc time)\n", + " 3.116755 seconds (197.93 k allocations: 783.469 MiB, 3.82% gc time)\n", + " 3.134295 seconds (197.63 k allocations: 782.433 MiB, 3.89% gc time)\n", + " 3.107208 seconds (190.77 k allocations: 756.093 MiB, 4.05% gc time)\n", + " 3.110194 seconds (188.38 k allocations: 747.207 MiB, 4.09% gc time)\n", + " 3.112493 seconds (188.07 k allocations: 745.928 MiB, 3.84% gc time)\n", + " 3.136546 seconds (185.69 k allocations: 736.629 MiB, 4.22% gc time)\n", + " 3.084509 seconds (183.30 k allocations: 727.555 MiB, 3.83% gc time)\n", + " 3.089995 seconds (183.30 k allocations: 727.616 MiB, 3.94% gc time)\n", + " 3.105482 seconds (185.42 k allocations: 733.091 MiB, 3.48% gc time)\n", + "It.: 360 C.: 322.2361566263041 Vf.: 0.29999999999737204 ch.: 0.009432440649259376, p.: 3.0000000000000004 beta.:18.0 eta.: 0.5644105152488157 \n", + " 3.166705 seconds (200.62 k allocations: 791.035 MiB, 4.65% gc time)\n", + " 3.207829 seconds (215.25 k allocations: 846.865 MiB, 4.52% gc time)\n", + " 3.208013 seconds (217.64 k allocations: 856.175 MiB, 4.10% gc time)\n", + " 3.283984 seconds (220.03 k allocations: 865.237 MiB, 4.64% gc time)\n", + " 3.248593 seconds (218.86 k allocations: 861.202 MiB, 4.73% gc time)\n", + " 3.229041 seconds (216.47 k allocations: 852.136 MiB, 4.19% gc time)\n", + " 3.229439 seconds (216.47 k allocations: 852.098 MiB, 4.32% gc time)\n", + " 3.256648 seconds (217.64 k allocations: 856.334 MiB, 4.85% gc time)\n", + " 3.251724 seconds (217.64 k allocations: 856.405 MiB, 4.43% gc time)\n", + " 3.251480 seconds (217.64 k allocations: 856.704 MiB, 4.47% gc time)\n", + " 3.253525 seconds (217.64 k allocations: 856.414 MiB, 4.55% gc time)\n", + " 3.227747 seconds (215.25 k allocations: 847.223 MiB, 4.02% gc time)\n", + " 3.256640 seconds (215.25 k allocations: 847.180 MiB, 4.70% gc time)\n", + " 3.269801 seconds (215.25 k allocations: 847.204 MiB, 4.68% gc time)\n", + " 3.250006 seconds (215.25 k allocations: 847.183 MiB, 4.18% gc time)\n", + " 3.266634 seconds (210.78 k allocations: 830.096 MiB, 4.23% gc time)\n", + " 3.238350 seconds (210.74 k allocations: 829.751 MiB, 4.34% gc time)\n", + " 3.235989 seconds (210.74 k allocations: 829.727 MiB, 4.33% gc time)\n", + " 3.269812 seconds (210.74 k allocations: 829.573 MiB, 4.44% gc time)\n", + " 3.238799 seconds (210.78 k allocations: 830.098 MiB, 4.55% gc time)\n", + "It.: 380 C.: 318.1182992677304 Vf.: 0.2999994564015827 ch.: 0.007942650883332809, p.: 3.0000000000000004 beta.:20.0 eta.: 0.5650911207226489 \n", + " 3.274143 seconds (217.03 k allocations: 853.992 MiB, 4.62% gc time)\n", + " 3.400100 seconds (245.17 k allocations: 962.198 MiB, 5.15% gc time)\n", + " 3.574873 seconds (275.95 k allocations: 1.055 GiB, 5.55% gc time)\n", + " 3.624406 seconds (291.24 k allocations: 1.113 GiB, 5.50% gc time)\n", + " 3.609306 seconds (290.63 k allocations: 1.111 GiB, 5.55% gc time)\n", + " 3.546408 seconds (276.56 k allocations: 1.058 GiB, 5.12% gc time)\n", + " 3.508500 seconds (266.10 k allocations: 1.018 GiB, 5.22% gc time)\n", + " 3.482009 seconds (258.32 k allocations: 1012.766 MiB, 5.32% gc time)\n", + " 3.427681 seconds (247.25 k allocations: 970.221 MiB, 4.72% gc time)\n", + " 3.396692 seconds (244.56 k allocations: 959.664 MiB, 4.84% gc time)\n", + " 3.349867 seconds (224.50 k allocations: 882.241 MiB, 4.96% gc time)\n", + " 3.505269 seconds (224.50 k allocations: 882.368 MiB, 10.53% gc time)\n", + " 3.122810 seconds (224.50 k allocations: 882.217 MiB, 4.28% gc time)\n", + " 3.107517 seconds (219.72 k allocations: 863.790 MiB, 4.15% gc time)\n", + " 3.102803 seconds (219.69 k allocations: 863.560 MiB, 3.83% gc time)\n", + " 3.096997 seconds (219.69 k allocations: 863.564 MiB, 3.90% gc time)\n", + " 3.128069 seconds (219.69 k allocations: 863.565 MiB, 4.06% gc time)\n", + " 3.119673 seconds (217.60 k allocations: 855.690 MiB, 4.14% gc time)\n", + " 3.118781 seconds (215.52 k allocations: 847.645 MiB, 4.22% gc time)\n", + " 3.144952 seconds (217.64 k allocations: 856.190 MiB, 4.44% gc time)\n", + "It.: 400 C.: 314.8596621689841 Vf.: 0.2999997850258232 ch.: 0.006737333944051288, p.: 3.0000000000000004 beta.:22.0 eta.: 0.5655673549772373 \n", + " 3.191571 seconds (224.50 k allocations: 882.225 MiB, 4.48% gc time)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 3.404268 seconds (287.94 k allocations: 1.100 GiB, 4.95% gc time)\n", + " 3.620685 seconds (343.60 k allocations: 1.310 GiB, 5.84% gc time)\n", + " 3.744015 seconds (352.29 k allocations: 1.343 GiB, 6.00% gc time)\n", + " 3.684597 seconds (346.60 k allocations: 1.321 GiB, 6.19% gc time)\n", + " 3.618192 seconds (330.44 k allocations: 1.260 GiB, 5.60% gc time)\n", + " 3.614902 seconds (325.06 k allocations: 1.240 GiB, 6.12% gc time)\n", + " 3.565542 seconds (318.16 k allocations: 1.214 GiB, 5.41% gc time)\n", + " 3.591322 seconds (314.86 k allocations: 1.201 GiB, 5.88% gc time)\n", + " 3.603408 seconds (314.86 k allocations: 1.201 GiB, 5.66% gc time)\n", + " 3.557944 seconds (312.77 k allocations: 1.194 GiB, 5.28% gc time)\n", + " 3.581016 seconds (314.86 k allocations: 1.201 GiB, 5.35% gc time)\n", + " 3.597784 seconds (309.78 k allocations: 1.183 GiB, 6.01% gc time)\n", + " 3.514336 seconds (296.01 k allocations: 1.131 GiB, 5.22% gc time)\n", + " 3.493817 seconds (287.33 k allocations: 1.098 GiB, 5.38% gc time)\n", + " 3.482553 seconds (281.08 k allocations: 1.074 GiB, 5.43% gc time)\n", + " 3.408968 seconds (258.93 k allocations: 1014.873 MiB, 5.21% gc time)\n", + " 3.391438 seconds (256.24 k allocations: 1004.507 MiB, 4.87% gc time)\n", + " 3.260961 seconds (231.10 k allocations: 907.581 MiB, 4.38% gc time)\n", + " 3.321518 seconds (238.26 k allocations: 935.002 MiB, 4.93% gc time)\n", + "It.: 420 C.: 312.213568814291 Vf.: 0.29999992195488506 ch.: 0.005838325119809017, p.: 3.0000000000000004 beta.:24.0 eta.: 0.5658779376925755 \n", + " 3.434441 seconds (267.62 k allocations: 1.024 GiB, 4.82% gc time)\n", + " 3.851392 seconds (360.36 k allocations: 1.373 GiB, 6.26% gc time)\n", + " 3.960401 seconds (378.90 k allocations: 1.443 GiB, 6.21% gc time)\n", + " 3.932204 seconds (378.90 k allocations: 1.443 GiB, 6.27% gc time)\n", + " 3.933374 seconds (370.52 k allocations: 1.411 GiB, 6.50% gc time)\n", + " 3.907447 seconds (365.14 k allocations: 1.391 GiB, 6.05% gc time)\n", + " 3.837415 seconds (351.68 k allocations: 1.340 GiB, 6.23% gc time)\n", + " 3.801876 seconds (342.99 k allocations: 1.307 GiB, 5.83% gc time)\n", + " 3.782927 seconds (332.83 k allocations: 1.269 GiB, 5.98% gc time)\n", + " 3.716500 seconds (323.54 k allocations: 1.234 GiB, 5.56% gc time)\n", + " 3.663843 seconds (309.78 k allocations: 1.182 GiB, 5.66% gc time)\n", + " 3.607287 seconds (289.72 k allocations: 1.107 GiB, 5.34% gc time)\n", + " 3.497286 seconds (264.88 k allocations: 1.013 GiB, 5.00% gc time)\n", + " 3.335920 seconds (231.97 k allocations: 910.818 MiB, 4.57% gc time)\n", + " 3.347859 seconds (231.97 k allocations: 910.817 MiB, 4.65% gc time)\n", + " 3.336467 seconds (224.50 k allocations: 882.159 MiB, 4.75% gc time)\n", + " 3.300821 seconds (224.50 k allocations: 882.147 MiB, 4.19% gc time)\n", + " 3.326798 seconds (224.50 k allocations: 882.146 MiB, 4.89% gc time)\n", + " 3.702558 seconds (224.50 k allocations: 882.173 MiB, 15.07% gc time)\n", + " 3.126800 seconds (223.63 k allocations: 879.260 MiB, 4.23% gc time)\n", + "It.: 440 C.: 310.0156229023772 Vf.: 0.2999999797254422 ch.: 0.005116573678712227, p.: 3.0000000000000004 beta.:26.0 eta.: 0.5660585950328253 \n", + " 3.233456 seconds (251.42 k allocations: 986.469 MiB, 4.54% gc time)\n", + " 3.618405 seconds (351.98 k allocations: 1.342 GiB, 6.00% gc time)\n", + " 3.727749 seconds (378.29 k allocations: 1.440 GiB, 5.99% gc time)\n", + " 3.738851 seconds (380.68 k allocations: 1.449 GiB, 6.05% gc time)\n", + " 3.790438 seconds (380.68 k allocations: 1.450 GiB, 6.16% gc time)\n", + " 3.706503 seconds (367.22 k allocations: 1.399 GiB, 5.70% gc time)\n", + " 3.704693 seconds (361.84 k allocations: 1.379 GiB, 6.16% gc time)\n", + " 3.671323 seconds (356.45 k allocations: 1.358 GiB, 5.71% gc time)\n", + " 3.635570 seconds (341.78 k allocations: 1.303 GiB, 5.90% gc time)\n", + " 3.636467 seconds (336.66 k allocations: 1.283 GiB, 5.68% gc time)\n", + " 3.641096 seconds (331.27 k allocations: 1.263 GiB, 5.95% gc time)\n", + " 3.587355 seconds (322.29 k allocations: 1.229 GiB, 5.56% gc time)\n", + " 3.542006 seconds (303.14 k allocations: 1.157 GiB, 5.29% gc time)\n", + " 3.432158 seconds (280.99 k allocations: 1.074 GiB, 5.14% gc time)\n", + " 3.534994 seconds (278.61 k allocations: 1.065 GiB, 5.40% gc time)\n", + " 3.627488 seconds (283.69 k allocations: 1.084 GiB, 5.37% gc time)\n", + " 3.602926 seconds (280.99 k allocations: 1.074 GiB, 5.26% gc time)\n", + " 3.452102 seconds (262.15 k allocations: 1.003 GiB, 5.27% gc time)\n", + " 3.685309 seconds (263.67 k allocations: 1.009 GiB, 5.23% gc time)\n", + " 3.632310 seconds (273.87 k allocations: 1.047 GiB, 5.26% gc time)\n", + "It.: 460 C.: 308.255457632036 Vf.: 0.29999999469596245 ch.: 0.004462094127377467, p.: 3.0000000000000004 beta.:28.0 eta.: 0.5661941739787812 \n", + " 3.626899 seconds (296.93 k allocations: 1.135 GiB, 5.24% gc time)\n", + " 3.940196 seconds (369.61 k allocations: 1.407 GiB, 6.35% gc time)\n", + " 3.972303 seconds (394.14 k allocations: 1.500 GiB, 6.70% gc time)\n", + " 3.962256 seconds (394.10 k allocations: 1.499 GiB, 6.34% gc time)\n", + " 3.960124 seconds (388.11 k allocations: 1.477 GiB, 6.45% gc time)\n", + " 3.929533 seconds (370.79 k allocations: 1.412 GiB, 6.60% gc time)\n", + " 3.909596 seconds (369.57 k allocations: 1.407 GiB, 6.30% gc time)\n", + " 3.879363 seconds (366.57 k allocations: 1.396 GiB, 6.38% gc time)\n", + " 3.851237 seconds (354.59 k allocations: 1.350 GiB, 6.01% gc time)\n", + " 3.758345 seconds (335.14 k allocations: 1.277 GiB, 6.14% gc time)\n", + " 3.680884 seconds (321.11 k allocations: 1.225 GiB, 5.31% gc time)\n", + " 3.632713 seconds (301.36 k allocations: 1.150 GiB, 5.50% gc time)\n", + " 3.618993 seconds (298.67 k allocations: 1.140 GiB, 5.61% gc time)\n", + " 3.633018 seconds (295.97 k allocations: 1.130 GiB, 5.68% gc time)\n", + " 3.578093 seconds (288.77 k allocations: 1.103 GiB, 5.29% gc time)\n", + " 3.563222 seconds (285.21 k allocations: 1.090 GiB, 5.33% gc time)\n", + " 3.556202 seconds (282.21 k allocations: 1.078 GiB, 5.47% gc time)\n", + " 3.550007 seconds (279.82 k allocations: 1.069 GiB, 5.44% gc time)\n", + " 3.531790 seconds (274.13 k allocations: 1.048 GiB, 5.55% gc time)\n", + " 3.512562 seconds (273.87 k allocations: 1.047 GiB, 5.07% gc time)\n", + "It.: 480 C.: 306.8149335750237 Vf.: 0.2999999993143613 ch.: 0.003940290008221013, p.: 3.0000000000000004 beta.:30.0 eta.: 0.566290748820883 \n", + " 3.619640 seconds (294.23 k allocations: 1.124 GiB, 5.59% gc time)\n", + " 4.157837 seconds (372.00 k allocations: 1.416 GiB, 6.21% gc time)\n", + " 4.149579 seconds (394.14 k allocations: 1.500 GiB, 6.80% gc time)\n", + " 4.101276 seconds (394.10 k allocations: 1.499 GiB, 6.33% gc time)\n", + " 4.387298 seconds (386.94 k allocations: 1.472 GiB, 6.43% gc time)\n", + " 4.038902 seconds (374.95 k allocations: 1.427 GiB, 6.54% gc time)\n", + " 4.204323 seconds (369.27 k allocations: 1.406 GiB, 14.41% gc time)\n", + " 3.591830 seconds (353.42 k allocations: 1.346 GiB, 6.07% gc time)\n", + " 4.055418 seconds (353.11 k allocations: 1.345 GiB, 6.13% gc time)\n", + " 4.078036 seconds (339.35 k allocations: 1.293 GiB, 5.84% gc time)\n", + " 3.888227 seconds (318.07 k allocations: 1.213 GiB, 5.81% gc time)\n", + " 3.848059 seconds (310.00 k allocations: 1.183 GiB, 5.28% gc time)\n", + " 3.727023 seconds (304.92 k allocations: 1.164 GiB, 5.33% gc time)\n", + " 3.624231 seconds (302.83 k allocations: 1.156 GiB, 5.42% gc time)\n", + " 4.029414 seconds (302.23 k allocations: 1.154 GiB, 5.46% gc time)\n", + " 3.552889 seconds (291.15 k allocations: 1.112 GiB, 5.06% gc time)\n", + " 3.595443 seconds (286.38 k allocations: 1.094 GiB, 5.27% gc time)\n", + " 3.408583 seconds (275.00 k allocations: 1.051 GiB, 4.72% gc time)\n", + " 3.292193 seconds (257.94 k allocations: 1010.501 MiB, 4.47% gc time)\n", + " 3.333985 seconds (253.20 k allocations: 992.605 MiB, 4.76% gc time)\n", + "It.: 500 C.: 305.6008536187392 Vf.: 0.30000000039826014 ch.: 0.0035126680265421995, p.: 3.0000000000000004 beta.:32.0 eta.: 0.5663445093375037 \n" + ] + }, + { + "data": { + "text/plain": [ + "([0.9999999582493425, 0.9999996831692387, 0.9999757512312559, 0.9888300585909416, 0.06622862001967607, 5.2257460965756266e-5, 4.858260316269315e-8, 7.497230614112974e-11, 3.3828495560358443e-13, 7.382983113763821e-15 … 1.1686321133030153e-8, 6.076134416171764e-6, 0.0013072843016925702, 0.12258094846493357, 0.9094694510800831, 0.9972310443138285, 0.9996161778436916, 0.9998150426361447, 0.9999071368500351, 0.9999489034721819], Any[427.85127712828137, 378.9120256638644, 346.70258747789364, 323.59058745705596, 306.94467702244646, 294.9482389155855, 286.06894837990626, 279.3620395350813, 274.20529088242677, 270.15459626415907 … 306.78151798753646, 306.7791819336303, 306.7768888376776, 306.77461434588406, 306.7723507415415, 306.7700962347439, 306.76785020442344, 306.76561420991356, 306.76338908821106, 305.6008536187392], Any[0.30000000002692834, 0.3000000044638227, 0.30000000112555447, 0.3000000003307202, 0.30000000008242655, 0.30000000001945143, 0.3000000000050722, 0.3000000000014334, 0.3000000000004404, 0.3000006554780174 … 0.2999992846099255, 0.2999992969031774, 0.29999930742167824, 0.2999993109603209, 0.2999993139084618, 0.29999931623330706, 0.29999931907470045, 0.299999322788123, 0.29999932631771925, 0.30000000039826014], Animation(\"/var/folders/rz/3xbkhcks7cs3wq5cjqydndbw0000gn/T/jl_cjudQa\", [\"000001.png\", \"000002.png\", \"000003.png\", \"000004.png\", \"000005.png\", \"000006.png\", \"000007.png\", \"000008.png\", \"000009.png\", \"000010.png\" … \"000491.png\", \"000492.png\", \"000493.png\", \"000494.png\", \"000495.png\", \"000496.png\", \"000497.png\", \"000498.png\", \"000499.png\", \"000500.png\"]))" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xPhys, opt_hist, vf_hist, anim = Optimization(setup, mat, load, filter, ini, disfeature)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "305.6008536187392" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# using .test\n", + "# main()\n", + "opt_hist[end]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "┌ Info: Saved animation to \n", + "│ fn = /Users/yu/TopCodes/Julia/test/top_mma/res/des_hist.gif\n", + "└ @ Plots /Users/yu/.julia/packages/Plots/1KWPG/src/animation.jl:114\n" + ] + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "Plots.AnimatedGif(\"/Users/yu/TopCodes/Julia/test/top_mma/res/des_hist.gif\")" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# using Plots\n", + "gif(anim, \"./res/des_hist.gif\", fps=20)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.7.2", + "language": "julia", + "name": "julia-1.7" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.7.2" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/top_mma/res/des_hist.gif b/top_mma/res/des_hist.gif new file mode 100755 index 0000000..262e5ad Binary files /dev/null and b/top_mma/res/des_hist.gif differ diff --git a/top_mma/res/design_100.png b/top_mma/res/design_100.png new file mode 100755 index 0000000..7ebc5a1 Binary files /dev/null and b/top_mma/res/design_100.png differ diff --git a/top_mma/res/design_120.png b/top_mma/res/design_120.png new file mode 100755 index 0000000..2de892e Binary files /dev/null and b/top_mma/res/design_120.png differ diff --git a/top_mma/res/design_140.png b/top_mma/res/design_140.png new file mode 100755 index 0000000..0d109e1 Binary files /dev/null and b/top_mma/res/design_140.png differ diff --git a/top_mma/res/design_160.png b/top_mma/res/design_160.png new file mode 100755 index 0000000..51ee1ad Binary files /dev/null and b/top_mma/res/design_160.png differ diff --git a/top_mma/res/design_180.png b/top_mma/res/design_180.png new file mode 100755 index 0000000..490a5f1 Binary files /dev/null and b/top_mma/res/design_180.png differ diff --git a/top_mma/res/design_20.png b/top_mma/res/design_20.png new file mode 100755 index 0000000..261ad1b Binary files /dev/null and b/top_mma/res/design_20.png differ diff --git a/top_mma/res/design_200.png b/top_mma/res/design_200.png new file mode 100755 index 0000000..226f1a8 Binary files /dev/null and b/top_mma/res/design_200.png differ diff --git a/top_mma/res/design_220.png b/top_mma/res/design_220.png new file mode 100755 index 0000000..aa43807 Binary files /dev/null and b/top_mma/res/design_220.png differ diff --git a/top_mma/res/design_240.png b/top_mma/res/design_240.png new file mode 100755 index 0000000..307dd44 Binary files /dev/null and b/top_mma/res/design_240.png differ diff --git a/top_mma/res/design_260.png b/top_mma/res/design_260.png new file mode 100755 index 0000000..b52b3d4 Binary files /dev/null and b/top_mma/res/design_260.png differ diff --git a/top_mma/res/design_280.png b/top_mma/res/design_280.png new file mode 100755 index 0000000..0156d9b Binary files /dev/null and b/top_mma/res/design_280.png differ diff --git a/top_mma/res/design_300.png b/top_mma/res/design_300.png new file mode 100755 index 0000000..7c56474 Binary files /dev/null and b/top_mma/res/design_300.png differ diff --git a/top_mma/res/design_320.png b/top_mma/res/design_320.png new file mode 100755 index 0000000..a567478 Binary files /dev/null and b/top_mma/res/design_320.png differ diff --git a/top_mma/res/design_340.png b/top_mma/res/design_340.png new file mode 100755 index 0000000..5d5af72 Binary files /dev/null and b/top_mma/res/design_340.png differ diff --git a/top_mma/res/design_360.png b/top_mma/res/design_360.png new file mode 100755 index 0000000..3154a98 Binary files /dev/null and b/top_mma/res/design_360.png differ diff --git a/top_mma/res/design_380.png b/top_mma/res/design_380.png new file mode 100755 index 0000000..3867eac Binary files /dev/null and b/top_mma/res/design_380.png differ diff --git a/top_mma/res/design_40.png b/top_mma/res/design_40.png new file mode 100755 index 0000000..1a9a99a Binary files /dev/null and b/top_mma/res/design_40.png differ diff --git a/top_mma/res/design_400.png b/top_mma/res/design_400.png new file mode 100755 index 0000000..ad9f725 Binary files /dev/null and b/top_mma/res/design_400.png differ diff --git a/top_mma/res/design_420.png b/top_mma/res/design_420.png new file mode 100755 index 0000000..07abfe4 Binary files /dev/null and b/top_mma/res/design_420.png differ diff --git a/top_mma/res/design_440.png b/top_mma/res/design_440.png new file mode 100755 index 0000000..0fe44b0 Binary files /dev/null and b/top_mma/res/design_440.png differ diff --git a/top_mma/res/design_460.png b/top_mma/res/design_460.png new file mode 100755 index 0000000..e0ed2e1 Binary files /dev/null and b/top_mma/res/design_460.png differ diff --git a/top_mma/res/design_480.png b/top_mma/res/design_480.png new file mode 100755 index 0000000..e7a420f Binary files /dev/null and b/top_mma/res/design_480.png differ diff --git a/top_mma/res/design_500.png b/top_mma/res/design_500.png new file mode 100755 index 0000000..9a45095 Binary files /dev/null and b/top_mma/res/design_500.png differ diff --git a/top_mma/res/design_60.png b/top_mma/res/design_60.png new file mode 100755 index 0000000..20f7954 Binary files /dev/null and b/top_mma/res/design_60.png differ diff --git a/top_mma/res/design_80.png b/top_mma/res/design_80.png new file mode 100755 index 0000000..0407b0c Binary files /dev/null and b/top_mma/res/design_80.png differ diff --git a/top_mma/res/res_10.pdf b/top_mma/res/res_10.pdf new file mode 100755 index 0000000..b1b45e9 Binary files /dev/null and b/top_mma/res/res_10.pdf differ diff --git a/top_mma/res/res_100.pdf b/top_mma/res/res_100.pdf new file mode 100755 index 0000000..1ff8482 Binary files /dev/null and b/top_mma/res/res_100.pdf differ diff --git a/top_mma/res/res_110.pdf b/top_mma/res/res_110.pdf new file mode 100755 index 0000000..3d07eb6 Binary files /dev/null and b/top_mma/res/res_110.pdf differ diff --git a/top_mma/res/res_120.pdf b/top_mma/res/res_120.pdf new file mode 100755 index 0000000..ad00e58 Binary files /dev/null and b/top_mma/res/res_120.pdf differ diff --git a/top_mma/res/res_130.pdf b/top_mma/res/res_130.pdf new file mode 100755 index 0000000..c61ecf3 Binary files /dev/null and b/top_mma/res/res_130.pdf differ diff --git a/top_mma/res/res_140.pdf b/top_mma/res/res_140.pdf new file mode 100755 index 0000000..088b7fd --- /dev/null +++ b/top_mma/res/res_140.pdf @@ -0,0 +1,224 @@ +%PDF-1.2 +% +1 0 obj +<< +/Creator (GKS) +/CreationDate (D:20220504164635) +/Producer (GKS 5 PDF driver) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 4 0 R +/Outlines 3 0 R +>> +endobj +3 0 obj +<< +/Type /Outlines +/Count 0 +>> +endobj +4 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +7 0 obj +<< +/Length 12 +/Filter/ASCIIHexDecode +>> +stream +000000ffffff +endstream +5 0 obj +<< +/Type /Page +/Parent 4 0 R +/Resources << /Font << >> +/ExtGState << +/GS255 << /CA 1 /ca 1 >> +>> +/Pattern << +>> +/XObject << +>> +>> +/MediaBox [0 0 400 200] +/Contents 6 0 R +>> +endobj +6 0 obj +<< +/Length 39798 +/Filter [/FlateDecode] +>> +stream +x9+۶\8 ^GHzhFK"(9B%PjkP*E$pwfF5w?{f׻w e^_?1v_|v?_o?̷,׋n?3_Yfz_??n9w7G,)f+)P#+f`#a\o +?JFj;%>VHaӕh~:C8Or~&oy\S8EO||O|F4˜O h~]gB|Z~1`#BրLOˇLτw4FIWzn$i>3QP5U0`!Dnh۩LτLτ<#ADIWzndi>3ts>'KǾ +F002_#?5n|&TͧCW3<#!a'_^ #i~|v3c]#FB}/yDgB|&TͧC|k0|/l$*F025?[;mS5 UP5ߚg#D|R3uXv*Tͯ5 Ñ +<#La'^Yl{l F0z<=6c`읶Y#FBϷ{l91T{&l#F"|7a'_^ ;F0·wzl0|/܄`#o#B)iV,$^ޜYl.{"?V3o7iW j5SGh~đ{g;I<τw_r,LG0m4Y|&TgBW3LτS<#LGB,͟d[|滙'S_^]/Xa^HUfLgBN[E_<3<<#!S#{ζic0v]/$ ^]/Xa=O3懺u^<:HίqD;xl{| |~;$vRg\^wz=%iXtf[9DH.<ii{_I(oޟLDw$l;ޤ]L/L: 0EvDM-u475/AI8u=hݯOp^f+Q}&5asd0RkLDgB|&TgB|&TgB|Z>BLOL|&T͟u푰OOT>oTLN?t)S}YBgB|&Tg>H3j>OY0m3e_{awd{M|&T#TgB|&TͧC|fB[P5ޜ!HτLD?뿠̮;'i~F_"Svl!>}3m#L|&T͟}j>3j5F/'Ⱦo|fGdͧC|Z>TgB|&TO^v3O7糛yz5#i>3yRo<3Qy4ՃpuvXl!>sll^Hg&j>淛y25 UiP5̓S<#L!pl_Qӳr7/[8[P56Uk<3j~{!ǵ4?|v3OTg_U<7$j>Wy$u:]TlAs4%T͟55LL|fB5m3j>-OA0msdnNBNdgB|&TͧCF3O|/k~S5<ɚτ3ymo3O3jHٚ_es3;gh~m vBj缤i ;pj>WwJ_a7woĶyYv05̣i>vڪOOI^s5Ǜy5lI<3<kxNَdrecI~w4 U.UP5?|1hךygB5F6ߔꭰi];my흶vy@|Z>TgB4Fyc=6c_l!>R|7”H|ךy<6c!$GizlOU0m3{l$|ͯXdsIDwzl4F/=6c=6?zc=6B/. ;{l~\͟a3eg3O}/N|_m|/B?ߝ=6?I_aW.1#ž )W:|\7zG|]]ODTu(x9\c$o^vovet'//󀄿|@->0_GLr[mzϗ})7\^Ve3Qx9.Oyw;W' |vv]u'n+ʛZh{s;u'*o]4Y%薫h.vg3s(qI7ZoDqNzoz&a+zo^rWͯD##?\7dn;S򲼝kM=yF6B3f%i>-G:|fx4ͧC|&TgB|&TͧC|&TgB|f!C|&TgB|Z>TgB|&TͧC|&TgBč0τLτ|τL/P5ޛ'h>lIɤ'uj>3j~gi#5+,K?ӹ4 UiP59IO!Lτ!$ͧC|&TgB|TgBFj>3`agB|f*D5UP5 UigT5 Ugٚ򤰠j>旤yF4 ?~VBD+<3j>og7dj> |_m4 !KiP5Uy4 UP5̣h>)j#j~FtgBi~'SV!YP5̣i>3;#O5_mIzRXj~ggi#4m?~VBj~'_MK<;a25 UiP5 i>sh~G|&TgB|Z>Tͯ5(l#I|yF6Bw7l%\/dj>j~S5?}m5;aDgBz缠;m34 UIN|ͯ6Hl5jk|FLOˇF3O'k~m|̓&`$i~Uwi>3̓0IP5gi#i'C1[ 3k<9_ii>-< ];m4 U͛ɚ^HUۿdj>j~'WP56_km$3j~u|τL_i+i~Gdz +F^<淇Ήmy@F3OOI0mכygcЗ'GC|&Tͯ4?>Tͯ4U75z!{&T#j>3jG|&TgB|Z{8O3j~}NA;P5 UiP5 UO4V|Ӷ'{&TͧC)h?||||a|ͯ|||ij~y|||دoS5_ :wzl~{l;=6c=6c=66U#|awy,m4I{ӮΩgvis<'<_,oRL<_n^"f +cC<6|ӓ;xYݾ/I:Fq.nyHT4r+򻕨}rTO?J4Jq9vYm&]xs?nϗ\,5e0; e9y31Zm#YjlWD{e0@7yV&P56U󙩏ji~_{a3j>-3j#PyOˇLτ/ˏh>7e;[Ãy4UP5 UiIO +K9ٚόtx h>w5yfiOFB3j>HIτLO-RǂIOY|&{"O j>3yτLw=nf3j~ĶOFBL+<3j~1[QͧCZ3_4T`!umj~ׯY?B*X0bMwc[3<ɚτ4x8]y4?ts>G|&TͧC|Z>Tla2fb||v3O,ͧC|Z~'U#L!W_;mUͧ'>f+[P56_K?B*X04Vf3O3j~mW3w3O CJ3Lij~G|&TݼlgBOFL}F?;SۭUP5!9B*X024oJUS6uj>'gTgd;Wih4UP5 Ui_šj>yvB|&T/j!tiBA;yDwB|&T͏ݐA!p,ax3j~՝l~bkX_i{_i4cE|||/AG|`"xl{l{l#xlX0@<6c=6c=6 F<6c},a#>0P||t2Sr{>&o9_m8oqr7,ZI4?Z^v*'~THF00LL粿]y.VDM5SC|3#}LQY=(/9>ބ3GMUz&-VqήkVX(p6wTgB|&TgB|&T͏IQ_B!F0[ߙ+O3j!-ACov~~3j>=3j~^~`# !e)GV5 Ug24ޜ5 Uӛ{4 U;6ŒX(p6w6UiP5n|&TͧC^~d#@n~gjG!ՉO4fP5?|Z>Tͯ4X(p6w'M+텚^<3<ɚτg&?jDd#@n~L/[anw3Oʉ7DZS2&y&j>q,p8|츃];m4h|&T{mmGPHF00OAP5?VX\wڊz13SP5BwN[IiP5̣h>k_)d#@}8r5oe ځL}Wog^Ș)j>X(p6wr@0A]-3j F0 }8r\}+L U} 4j>-ȹA;: +8]| F0A|bg#|c=6ǂ`b<6c=6E|`#|/p6w<6c},F(c=6c9mtJ?_O<.΋xt|"y?L΃ٛwù+97FOI7`#5T󼼬pίx7in&%|'z!VVEf}8ἩHugǂFУLτx?kek>{l`#G|&TL7425 UP5ǂF|&TgB|&TͧC|&3=6F0ƅi쁪L:6?0=ps>zAO$τc:0JDͧCJ3̮f$ͧCC|7`q!$=w4i~ll~\<>e_ݜ@?Rj>X0(25 UiP5'KP5U=6F0Ɓy_i4X9/j~W?Rj>-cD5 UP5#i>3j~Qd#"dj>ıٚjNDgB|&T/X0;m4 UP5ifUP5B2`DgB|fLlg ځ?hB|&T/X0;m5ͧCC'_+O4VF3F0;m53&]l 4V|Z~'\_±`Q"xlX0`||#c=6ǂ`#t{la>`#;=6c=6#F|`#c=6c0b| F0ЍF0s~{=s̙yl:W)y?uBn7z iq_.D{&]A`#a Rw^E=h,%_ngesU] vLT42o9؏(/DⲼ]cF4 UP5 UP5߅d#D5 UcS߮TgBL_Ա`#\Lτyτ.$#FBdJTP5l~3;o$TgBYܼ}τ% F0Bf>TͧC|f'QP5da`# !2P%YP5=6?S;ofIv4?|Z>T`#t@|zމb]Lo.vpo/Tr +^'&oy]✒c: +8'yτ|τLB2` h>3j~{D3j>LFL?ci>`|τ.$#FSj>懟xτO +|~楌W5 Up,p8/U[j~G|f'UiP5Ueh>jg#B |?k忤LB2`a"τN[Qij|&To-?>?ҚUf Fv<4j>-滐`#a ;myfq&TͯU4̣j>̓;h\nϱPl?A|7`Q xl{l~1c=6F0FF|#F{ls8/<6c`#a_l@|7`q xl{l~1p]]Ja3ҝ3:fJ&ߜs$c2Ố`#'.= }ܾsmM5W!xqu^^ lk,;~o>nvp9/g}_R~"lW]jqs^]jGѱPl k~p4?C{5߅d#@C|&TgB|&TgBC035 UiHz4 UP5BpA|&T͏I.8Do>5υd#@h:=TͧC|&TgB|Pj~GTgBW3Lτyh' 'j>濚ys,p8a8m|h|&Tw!F0'bP5̓yOˇLτּ淟,L?cA迁jIN[Ii{uj F0!u.Tn|&Toz3LܚfQP5BoʇLzvWy3Uׅd#;hכygBN[UiP5̣h~ּͯU4i;hgB>hpUP5U]HF0~U,7e7 =+ 罕K%k +)ouy@.7Q6.%/z|NF(-LqL?B2`WQxݮiτ*$#Fy_-,h>#e}P! τxOˇL?#Cj>w<(<+'ߍx_ B2`@TgB|Z>Tͯ4huIBJ}GP5 UP5!$k>mWy4mI|&Tׅd#fUP5 UiP5󧅔BD+<3<ɚτ|F( ![P5?zs>'WP5߅d# _ih~G|&TgBli!%Nlo6dk>̓>PB{mӶG|&Tw!F0B !CP5UP5 U~_|&TͧGMP5߇@hUiB䝶|OOwB2`,AP5gcj>Q!% j>G@|F7{l`#"{ls8adF0_l!xlF0/"xl{l~1Fo#F{l`#"{ls8Xu8ؿ78oy;:ogxNlgp|\y;W]|%oZB2P,Bɳvhy s87dvU7Lk\oIyZofys\Wk +)a}:_xe|+-~J4?,2IH> +rgB|&TgBf|g F0B&OUP5UP5BJ|&Tͧ|&Tj*PHF&B3j>j>-3j +F0BI P5 UP5UP5xL쟳|&To_}z +($# !|?k4dk>j~Džd#X}]7f|gv5$i>mS_HHQgB9ۉȌBd"$j>mj>3j F0BYOǩuj>揿[0R41)Ms35 U? +L߱6Ok<3j F0B3j~TvB|&To!`h~|v8P5 UP5x,o\B2PBdI\'oNcy@|`2"H5̣j~W϶4Oc<RTj>vڪOˏPU(0L|#FxfdI7vzl )^p6<6c`#F"j5cv8F0Lځc8`|#F`&i>-cK($? ` +($#aP峙t:[[4KWQJce&Ou.$#"4Lτ.$#e"hτyτ]=.w&i>m3sÚτ^ +D蹁O +FDi<)τ.$#E!>6MP5 UiP5ڳBz|&TN|&T*PHF&B@_6O+<3j>滐3j~ǜ<ͧCaBda"$h>m淛y25w2O3j F0¨zi~&LL<3j fMw +j>滐`# +!m.TfH*y^;mEͯ4hτ8`ĬUiB|&Tͯ4B2P,Bޠ j>'oN4'RHnτ濚yF +o#aCX +D|70|*PHF&{l`<6c<6P@!aF0G|F!Bda"xlF(c=63=6P@!av7aw8-R~8oہE{2O2_m}3谿z F0>nb}>l7q + gǎ ;z_-| uԓzBy|Dq)vy^]5fs~ޜD󣶯tVB2@z 滐`# mP5 U#'k>]H?L_-$IP5P@!ac3j~`DgB|`O#j&LBy|gB|MJ3.o#m^<3k<9]8U(0TLgB|Z~3Y+<3j F0_!5UP5mj IFh;=T͏mَj>w.*PHF*LO܁ UP5߅d#5Vj3 τ.ln߷e;YiP53U(0Pƶ|9h濚y\HF0L cmޠBJFBUi_ +E|70XE!Bd"xlF,{l"xlVB2@<6c`# c=6w<6P@!aF0?U(0b庾v.fqJWCxbsJ>Jp~?j^7s$]HF0~av{=җv{܅]0~R}z b~;j^O|o [vy܄3rsI]a!vyNT0oUv^҅dI"t9=TͧC|&TgB|`@9={QIU|&TՅCgB|&Tw!aP5 UiI_m}7 U]HF0y3c΢Vτ. .j~3ms4UP5߅d)!tj<τI_m!5B2 uj~lYʩaP5̣j z5̣i>'IiP5_I]HFBj̓ͧ?:4߅d#!!|7,YP5U]H|Z>Tj|&TͿ~ywm +WLB2B|&TͧO ;pj>Dž1lgB|zNsכh?|6De]\*PH@8.놉wvH+r;N߬]8/H?WB2NUiP5 UP5߅d#L!TgB|Z~gB|HNO߼|&TgB|wLOˇLB2&mLLͧC|5 UP56UP5߅di!k~G|&TͧC|Z>Tw!AHx_o4iyB BXiP5jI|&Tͧz +($#!|_o4 UiP5߅d#LOOmxցLB8Bj>3jWB25 Uiǵ'LB2E|&To9R濚yTgB|@4VW3fE +FL?kW3LB2JC|&T͏5<'ځfOB4 M-j +($#V U.ӄf0qN[MiP59{&T*PH@fm&To!Bd#xlFzl旄CX +G|7p|/ c +Fo#_a +($#c=6F0c=6$*PHFt^xN%m폖"vy&o9U(`#guۉl0Q}Sͤj;%ԝfpb +( $\fpO<_Vm &u;Q}\VkJ^o=|L̺C|Z~^%TgB|P*B3j>3jVBB3j>-'Lτ.$#L>Tgj>3j F( 6j>-3j Cw@^jg P@!Exz +( MV3O%i>=Wy\HF0B!|wL?U(`"G4Vo|&Tw!o$l濚yT:4 Ui.$#!Mk;mo^gk>̓^ +F.BT70$h>-ךyư +@Fj?k i>滐`^T͟Uy*PHF0p;pj~wCvڪO*PHAv@|&T͟Uw*h|B4 U;m%ͧCABd# !}Tͯ70τ_ +i I;p[;ms4yiB|Z>Tw!L*PHF0€<6P@! c=6FHL*PHF0€<6P@! c=6FHzlVB2CX +i(F0B"a +($#a?U(o#"xlVB2CX +i F0B2Bʯ|'/]8c7)ډGj vމz` ܮ׸/o7ñ+~E4#w0?)yP5Uk 3j \@|&TgB|Z>T*PHF=B^^ͯ4hy_iq!ALOˇLB2µr3ךyn|TgB|&T5 { +(2Z6UiP5 UP5߅d #to4k6[<3j FBj>̓L?U(D轁jIN[IiP5 U]HF B[3j~?[_<滐`A#h~eW3L?U(D6C|&ToJ3WB2vB|f'{f^A;P5߅d# A|&TOl +(2@|&TgB|ZpWB2<6c`"xlVB*c +Fo#c +R?U(0z|#a?U(D!Bd#xlcD!BT&a +($#Lay;\¹\ /;Qyҿ}Z*Gnswy Fua돗,2x pݜ}n¹^ϧ7C pY.w3P.?n~Tf x +($#!YP5j j>3j F.BCvj>-wfj>滐OLτ^ +cF|&T͟y4 UP5߅d#wEͧC|&TgB|~!WP5 UP5P@!aKj|fdj>滐`\B|&TͧCZ3.$#,Lkj>-?QBd#lךy̓LOw!wLτ~w!GhP5̣i~_3OG9U(0fC|Z>T͟5y5̓.$#56_<3j~g?R滐-CflyVB2˜zuj~u|̓.$#25 UiϴU }7j~N|xVB2˜;pj>vڪ_i4߅d#8L?{5UÅ\HFMXk>TOi݁ Ui#X +cF|7c=6CX +cF|7c=6CX +cF|7<6cVHF#xlVB2ˆ<6c`D|7!xlVB2ˆ<6c`D|7 xlVB2Buu=|㰿g"yVY4/Dx=y{ҙ.$#;tlZDMW z|6]秔*PHFHM=z=N"cvh޿/~o<}9GcmjWB2ByO|τLB2zr5 UiP5 U +τL?{m5 U]HF0B A|&TͧC|&TgB|@P5 UP5U +z4@P4 UiP5U]HF0iP5 UP5U<.$#yj|&TgBϯBdP5h|&TͧC|PyjQ5 UP5߅d#|P5̣j>3j yOo?r.QP5 U]HF.BC|z;m4 U]HF0B&B5懟˓1hךy +RDgBk|_m*PHF(!m.Tg6yiB|Z>Tw!;p[;ms@|&Tͧx +($#$dufUfA;P5B2z<6c`B!Bd|7F0!xlVB2BBzlq|#<6P@!c=6F |#<6P@!!c=6FIrnÉy=#Uh~D;O9U(0Jrt +($#P5~/h>j0VB2Ÿ"'Tglk>-W=U(0 E%k>jVB26Ui}O͋j>3j cBhG0τBd) =7ek>'EiP5P@!a]fUfEP5߅d1 $h>m淛y25 U +Pij>-?0h+Lτ.$#L!ԭUP5U+-P@!OgBN[Ai);p +ցe ځf1BdQ" ډ ڊ6忛yyP5P@!/;myP5 U+;m5*PHFa +($#c +c +&CX +D!BdD!BdI xlVB2<6P@!O<6P@!a?U(0F*PHFS*PHF0Wk͇l߾y],C<&{ҕ)1X +p\S8{5\`Ds?7]n;nn8ۑq!aes]xth[$i~!G|؄r?zOLT4sثP@!a1ͧC|&TgBBdDP55g;WP5UX +cDh:=Tg\C|&Tw!TͧCdAP5P@!hP55g[yτ_ +D軁U{Z>TgB|ЃLOfM +P5U[<τ.$#L Ok<'h>mךy +j>3j>-h +($#!B |τfUP5߅d 4UP5 Ui^ +@U4̣i>̓LU(|l6$k~e|B2BifAP5P@!aMΝl|&Tw!a$;pj~'[P5V|JEN[UiA[P5P@!a}7j~}|τ.$# !wN[;ms@|&Tw!4UfA;=@BdI xlVB2_"xla?U(0 *PHFK|#Lc +CX +o"xlVB24<6P@!<6c0]*PHFa +($#xl揭0J*PHF}x9_yoY6iy;#,G*f~3Q}:FP@!nG?WO_n~fWǔ\ng=|0W~z +($#p槯DM;={_su%o6Iؠ}.$#LP5UP5 U]HFBEvj>-nΫτ.$#!SP5UP5kЖ4n˅d!LτLB2:j>-3j Fh"τLOˇ湐`Gk<3;yR46UiP5߅d 3j>=Wy4w!_{g;Q<τLt!1j~g3O3j>m滐  UP5 UiH1w!aw35իw3O3j F!$jkfEP5 U]HFͯU4#i>#j E轳-j~lVTgfQP5߅d#!dj>;m35̣i>滐τgڦ~\w!are ځf} Fx#τLOˇfBdB4 U{i;h7 }z +($#3j>;r0y|# c=6F"xlo!!xlA|#!?o!!xlA|#!c=6CB|7Bo#()oOVi۟xI9r8k.|O<_r1 }wi]m8i{r;NTlp/qQO?t]``Gxmϰ>VY(÷{yz9\vfr]u8 +PyτLτ|r:s#Lj>3j FMͧC|&TgBBdi t=Tͧw J|&TgB|rqP5 UiP5 U]HF0o (τ]?fi>l +($#L!ЭUO͋h>-Wy4w!!!_<3<ɚτ|B2~~A|&Tͯ\(i>-c +($#L!̣ؔj~S53'|B2B !IiP5h|f'GiP5߅d#Bj~G|&TͧC|;m4ԼL̓滐Ї?LB2P5|j^ךygB|BN[MgfQP5 U]HFh"Hτs@|&Tw!B>T͟vڊOˇLB2gv4i~}|τ.$#|e{2Owtӄf)MP5 Uk;m5 { +($#Lc=6B|7c +oo!xlCX +@|7·<6c`?D!Bdi xl[F0!xlVB2D<6c-|#<6P@!̤Ϝ7á/|y6\l.Dvr3j~{Fj F8B3j>-?jۯ?U(P8BͧC|&TgB|$OˇLxMj F(B3j,jU + +GH9h>j~G|RɚτfM;jLB2pA|&TgB|<e +($#:3j>j HlgB|~_ƆTGA|&Tw!@xz +($#>6_<3jk.;m4 UcC&cTv*hq!cCh;=TO3j FA|&Tͧwfj~G|&Tw!Pii~G!ɚτ|02n3hכyF +JGP5 Ugj>滐ƌrzOˇflgB|02\<#ek~)Bd<6c'o#c + +G|͟({l0^*PHF(c=6F0x<6P@!p"xlE!Bd#qܯ7I'fjn\^vV?xq!p>߮^|벙htϤ^n}m޼x\*PHF0g i}o/u<y?#]$xswr+P@!_xτW3yOw!p>C|&TgB|-3j FoCj>滐FvzO?A2Lτ.$#al_i4 UiP5xvaX]HF0B6B[ +τfU]H#Dց}}ɚOˇf1Bd#|!|_o4 U.L|)SP5V|҈;pj~U5?U(`!$k>Sgv@gi F" ځoG5Yk|&Tw!!}T*GP5P@!B|&TU+.4߅d#"h4j~}j3LB0Bo#${l~A?U(`!xl?_a +($#CF0O"xlCX +F{l]ϧy(o^|dDvpҝ?uw=җvy܄ͭ0ebJU¹3Q}S͔/Bd#r.G&o9wE$wvK4Sf 6c8ϻ'a +($#yόM#|&TgBOB=C|Z>T|&Tw!SFh;=j>W~4 U]HF0·NUcH߼LBB |τ OIP5߅d#L[P5 UiP59U(`fTF|_k uj>jG|0%j>̓L?U(`f)G|&TͧC|Z!|l6$k>w|04ͧCY'[P5ЫP@!̸j~G|&TͿz4VY'[f?ӫP@!F|&Tͧ'CABd#05VɚτLB%,gB|Z~ʅg5w?ӫP@!F4 Uf Z +F B3j>kza֠|7> i>\x&fOBd#6_<3;7ha +($#?|#?U(`{l<6c`#xl VB2@|7X +F`zlc=6F0b +($#Q !wea~;t%oRN'_{Fjt$kqϏB- v| +]mÙm_6❨a^g7s$? +`G7eO<_v +;߾#7)< t;/3m- +&pP5 UiO.$cyτLB2MC|Z~lcoh.$#!LO k~G{a3j )j>yτ.$#"B N{滐R4gB||dj F0B&BWy4o♭y_m*PHFBa5 U;i>m濚y> +wžU<3[yR56U]HF0Oˇ]4 Uy*PHFBɴP5)ɚτ_ +!YP59i.TgB|`B;m5#i>v +($#L!edޠ?k4dk>滐~![P59kTgB|`|gB|~7Bdi liB|Z~߃<@|!tuj~qR%%hr]7r}=ly^N[J#7\f=..LTT泄 mٮ]#^ߜ/m9yHd#!au߾y8l7|Xsf&xSɳ.$#46UP5 UP52p3j>389L?yHd#!![P5U_;TB2~!KP506[P5 U/ͧ;j>'mpR!FTgB|&TͧCk> F IP5?al~XiP5Dž owW3=L?yHd#!7_6Uk<3<ɚτ|}CJ3̮$ͧCJ3 "h~iOB|&T̓u8`#d#DwB|&T?0cTw!nτN[E_o#({l~==6c`#|c=6F|B|7|#g<6c=6c`# c=6FsPrO`)y;/n;_B\n7Vz· g3Ovc F"5UP5h|Z~d2O&Đ )j>I|Z>T/p60j<ͧC|Z~նGP55Džd#|!]P546:3W#yҧ5UP5 UiP5F0¨4gBxmDP5L?`"k>cCjQ5g2OC=THτ|_kQ4 U;`#iP5 U;oh>-j>h>=7&k +I|&TgB|Z>TgBbg#Fw|&Tw!BTͯ4U;yycs濛yDgBF0F3<4j>-?`{ls8F51|bg#Ft>B2_l#a?PHF0{lw8F3|bg#F1t>B2^t̯X2χu8l'XV;Q}Suvڅr庺%.)yw9fxtbq!uf/1fv؜LT4%>`#vlNyN~;"s0ڹ<߾*D] t~xJ`̓Jm4ͧC)[P56UiP5 UP5U;|&T͟l#aP5 UynH|&TgB=@|j~GyEiP5UP5?𽐦|?F0¨46UiP5 UP5߅d#5VW3LV|Z>T͗y7vk~?|8F5L_i+i~G[MP5߅d#t#dk>7.J3LτYj FhT<6c=6쇳`Q#xl?F0Fo#({ls8F5{l_l#aF0_#$͐|vu i=nOr/p%r9ùߞ6kW¹쯷?|Y_g*\vp.qWM?1%?},p8F(᲻ίgz\~FD=a_w&WupK<_Ӆd#NRfH5 UP5 UiP5 UP5?!M h>p60u.<_Cꏶ3j>O`̐L|z8U.HhI HOB|P52|\j> U;;#8»FH]"T'j>-P5!9#4!Y$TͧC|P56Uo<'H;.4U;;#8»EimG|P5U<ސo'aEIOB|Z>T'j> UiP50ScDž*'jwgGpGxͧC0$T'jm#8B*BLiP57S0OD[+m5ͧW5$TͿ |{wvGpG|7#+m4$TPj0OP5ҶR; U;;#8T#(OB@=rl.T'j7$GpAMI]i+h~gG|WڊOˇaEBET 0~J[Ogjvj>-Ҷh7$Gp6?*6Ύ0wm#8ƒ"6ߵ͟|;#<(k]Ύ0wm#8ƒ"6ߵ͟|;#<(k]Ύ0wm#8£"N1p&f|l3JvgGpG@y\݉cq.ǿj}LכO]9ۮw>}hy؞!9##Ti>mj> UIO$T'j>mj> U;;#8d#OB|j> U!9# #HOB| UIOˇ$T'j>mP5߻#8#L-OQIOB| U<ͧ_hpRIGj~kG|{wvGp0bP56U#j> UD fYiP55̣iwgGpGxiOB|Z>To hOy!9#$Ӂ$T/_rʢ4?Q|2QF/ځޝ"VB|P5U<ސ;P5~mrGr$Oj`Gӄݕ{wvGpPQUoT'j> UnCrGHh> UIO_M_|͖$TͧC|P5/L`wvGp Dh> UIOB|Z>T'jlH (OBJیP5Tj> UP5?S$TvgGpG@jmG|P56 !!|Q4?6y܆yD'-P5 Ύ0OB|z U!9##Tim|OB|4yfuj>k~k|vgGpG@AI^i+i}G|{CrGF4we[|G96SUUiE;o!9#FV*}P5J[O iB|Z~mu&T'jK ؝a+mUͧCaOVڪ}o!9#6ߵ͟|;#<(k]Ύ0wm#8ƒ"6ߵ͟|;#<(k]Ύ0wm#8ƒ"6ߵ͟|;»GXENyEhis^y6Njg8[i|QlyjÇf8$ͷ?q~w8>,,wgGpGpGG8Oy@׻a|lw}ˋoKnǥ UI]|ΎBP5yOB|oH#tj> UIOvVIOBle5UID]]o;;#8#E(i>-P5x n aP56̣j> Us0OO 4UWaMǾ#8#8£#D56U[ToxwvGpGxtZ'j>-wy'<ސazB+pj> UIߌ伶vd'Mom淇y$'j> UiޝA|VڪO˿07$G^Q4ݕ+m U!9#6ߵ͟Pw)Gpmk]?.k]S|62#8#8B]6wmdvgGpGpͿ9;ʶLoCW#8Ѻ3?Ngc>TEL>v/|cח9mJx8<|%!ѾAE 1_8?Rfq|9w0 z̳-S&~]E;屆a+#fY%}q1<4&^>rGgGpGpqռlc%}얛)f^zlr5/2qG +kx UIOˇ9'j>-P5yOˇ$T'j~rwj~[%'j~S|aMIOB|Z~!PUIOB|Z>T'j> Uii.h> UIOB|rT#OB|Z3Tͧ UIO$T'j`w|2wq>D_j \mP5ostvGpGqj> UIOB|dI' UiP5;#hmwV5?wqzGT3OXIOˇ$T͟*4xOB|LajvdžysBP5T⧆yOˇ$TO/D5|P0$TͧC|Z[0OBL4 Tk> UiP5U'{tvGpGqAIOB0}RS|Z>TOmLJy"F Wi~G[o;2J[Aoj|V AͧC0$T~ Fwyo_4lJih>T'j~{;:;#8#4Ho^X;<#<1﮴4 󈚟;*ځ|mmrB*vjW&y5/΋?<_|Vh> UIOvhn0Or_@m~l.T'j> UrtvGpGqJ[UiP5dNI[X4&avV&yP}핶R&T'jJ[OP5V0$TvUNd'{6Uɑ4#f?ڢ4yE;wmk]O6ߵo)\|6ߵwmR6ߵwm~Uюk]opGpwmk]/i6ߵ GpGxwmk]|I]| #8#rWius'w,M|,oyb!egR7 .²-jUUi> UI4"hD/EM^<$'j> UiP5Mfj|ʶ$T'j~6?|OB|r䳶cpGpJiP5UIObPQۂϊP5akC|P(i> U7 +'j> UIOfL5cT4B7j>9V|zmP5QېB|GyOˏ/dG]j>CMHc#Ui)Oyš0$T'j~6՘淇y$'j~S<_(h~{G*'j>-淆y4O~#dC|P5_`Hty'džyzx4wH'džyB9_+(vF0OX#U'mP5 Tk~6BDiP56̣j>i?bu۝CO/Wi~|!ͷCvm$T'j>-Ƃ2BjmG|ш?6Sm|emrJBH0OoHߞ49_Oh> U+m4;k~l6/0Q_iBP5鬴47S$T﮴4t`8#8_0P5V0P5=#i> UlWH?vPͨlWh>-ҶRXSUN|!>h> UIOˇ$TU@v j> k> UiP5$Tͷ`8#8ߌӁ$TYi[•OBh'<_6;U *vj>-?!T)i/#+m>MOBJ[Mi/ @|Ç?hdԧ U0Ч UiP5 GpG[B+pj> U[+m5on-j>y4]|^wmk] \擮wmk` k]ͯ|ҵwm~ӵ_pGpߎ|6ߵo\|;#8"6_7Cx }N%~򗿈2_C^ +k_FȘj[6l;CʝPVِ/Oh{0>syyS\`r~ܬƉC~m;;wnMq}Zsqvӡӏo}g:Ia?;BOgnG_(85'x9Pҿ/l,%U\KF؝f]+~whs:?yX63Ϗ򸛍s>.ևgՒDN#d:b*m߮橚OB|?2圩4+ۂ#56BP5|NK O>|a56UiP5$TͧC|?=S} Α*<#F($T'mwy'j> U0cWiM.W/3Gzޫ܏H!v8+U<՚O Ǯuz #%ToTg ++]>_gW<6Bv擥NclH'aP54Wbc揟/Tr{rґINTk!9՚O8_}ʶ竇yE;#_WWUI[ij~gG|擯+]>_gW<6 +T'Lh!U6JoHOB|j~kG|慬udmuf$ȴlWzui3J,ϏrݶCj{ q`{p{1M\nVvW`oC},>7fE\omf%bߜO +_n}K  + . +fXlNy~|.Ѻy_ٷy_+[l:C)\tZ_L0y)ʶ)ϫ +,HUOB|z<Qۚ'i> UiP5UIObPP3UP5D#j~,B@6j>F|2HSx$T'C͈P5)/WII_~;j> UIϭ<$T'j~L0y)$̫ +k%'j> UiP5$T͏] +h>-P5𡐝.C)O#dj擥E)$T'j>y8_j>JBPIOO# Uɑ}!|4P5?t9# ^UDO aI0OPIOˇ$T_ + h>=wy'j>m|?BI jB_8_=S1ٜ0O~⼨J'j>Y)NK_J'j~zG}NIO- -Ѓ"oypq« +_\ͷC0OP5aQ/Uh> Uiߝ4_ed(;$T 0$T41!t j>O Em՚OB;R-mMIOWV 5!烼/ j~4$Tonk~P%\UIOBJ[E<՚#,)], k> UIp}m<#EV&yP+m<՚j +k~{< P5V6#j>y|k#8x\{š?|G4j~|rLvj~wG|P5Uc$bfdh)OqJۊIeTͯI~UɚIљr faZ +"TDW&G띃+pj> U<|OT@|N0y)6]s|6ߵ|6ߵk_E#<7]|_|6wmM~).|6||k+m]aKKM~'.'|6ߵ>M6ߵ0WKśj#8#TD||]竏"7kכ$O<;zU('\/I 9;<"W"ך9~=lg~]{g??!gޝqx_:[O p9֫UU'E~OQ0#H:5$T'j> U%To7 UIOBj>y:R槾-S UOB|2*P0#/DP5 Tk> UiP5k> k> U';R擥Ij#wоPwj~|r|'W!X!?r|Z>T'j> UiP5ps)B&yBMZiP59.dtj~U `8#8oGF U+m%Ϳ\]:RENJ$5;BeEJ:P5v+m+5* GpGUE;C[J>E;P5[i[ߧ Uɱ窢rsIӌMOR#}UE;P5=#iqAӄ~;k]h#wQ]kH|6"o!/6ߵv$Gp7|6"!/6ߵv$Gp7|6"!/6ߵv$Gp7|6"!/6kq +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000113 00000 n +0000000178 00000 n +0000000224 00000 n +0000000359 00000 n +0000000547 00000 n +0000000281 00000 n +trailer +<< +/Size 8 +/Root 2 0 R +/Info 1 0 R +>> +startxref +40421 +%%EOF diff --git a/top_mma/res/res_150.pdf b/top_mma/res/res_150.pdf new file mode 100755 index 0000000..d872dec Binary files /dev/null and b/top_mma/res/res_150.pdf differ diff --git a/top_mma/res/res_160.pdf b/top_mma/res/res_160.pdf new file mode 100755 index 0000000..003a1c9 Binary files /dev/null and b/top_mma/res/res_160.pdf differ diff --git a/top_mma/res/res_170.pdf b/top_mma/res/res_170.pdf new file mode 100755 index 0000000..e640afb Binary files /dev/null and b/top_mma/res/res_170.pdf differ diff --git a/top_mma/res/res_180.pdf b/top_mma/res/res_180.pdf new file mode 100755 index 0000000..715313a Binary files /dev/null and b/top_mma/res/res_180.pdf differ diff --git a/top_mma/res/res_190.pdf b/top_mma/res/res_190.pdf new file mode 100755 index 0000000..7124001 Binary files /dev/null and b/top_mma/res/res_190.pdf differ diff --git a/top_mma/res/res_20.pdf b/top_mma/res/res_20.pdf new file mode 100755 index 0000000..2d03084 Binary files /dev/null and b/top_mma/res/res_20.pdf differ diff --git a/top_mma/res/res_200.pdf b/top_mma/res/res_200.pdf new file mode 100755 index 0000000..bdf644f Binary files /dev/null and b/top_mma/res/res_200.pdf differ diff --git a/top_mma/res/res_210.pdf b/top_mma/res/res_210.pdf new file mode 100755 index 0000000..d03b7ae Binary files /dev/null and b/top_mma/res/res_210.pdf differ diff --git a/top_mma/res/res_220.pdf b/top_mma/res/res_220.pdf new file mode 100755 index 0000000..ad9546d Binary files /dev/null and b/top_mma/res/res_220.pdf differ diff --git a/top_mma/res/res_230.pdf b/top_mma/res/res_230.pdf new file mode 100755 index 0000000..47662f0 Binary files /dev/null and b/top_mma/res/res_230.pdf differ diff --git a/top_mma/res/res_240.pdf b/top_mma/res/res_240.pdf new file mode 100755 index 0000000..a2873a9 Binary files /dev/null and b/top_mma/res/res_240.pdf differ diff --git a/top_mma/res/res_250.pdf b/top_mma/res/res_250.pdf new file mode 100755 index 0000000..364f8aa --- /dev/null +++ b/top_mma/res/res_250.pdf @@ -0,0 +1,262 @@ +%PDF-1.2 +% +1 0 obj +<< +/Creator (GKS) +/CreationDate (D:20220504164838) +/Producer (GKS 5 PDF driver) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 4 0 R +/Outlines 3 0 R +>> +endobj +3 0 obj +<< +/Type /Outlines +/Count 0 +>> +endobj +4 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +7 0 obj +<< +/Length 12 +/Filter/ASCIIHexDecode +>> +stream +000000ffffff +endstream +5 0 obj +<< +/Type /Page +/Parent 4 0 R +/Resources << /Font << >> +/ExtGState << +/GS255 << /CA 1 /ca 1 >> +>> +/Pattern << +>> +/XObject << +>> +>> +/MediaBox [0 0 400 200] +/Contents 6 0 R +>> +endobj +6 0 obj +<< +/Length 38678 +/Filter [/FlateDecode] +>> +stream +xKJ֜7_q;9'%lk1o#dOMn$q-T ~U?=U<QτLT i>p>Il`#DAP5 UP5 UyF0PE5_k\lj>s!̄l`#@H|5$j>jG|kPE5a}a"5v`#"DA;P5̣h>[`/1=;m4̓ů`#3js|n‘ +<#7Bdgzl|:F0—"4#yFxk/3=6߅d# |k #QM^F0An[`9`#c=6F>/\`#|!9{l}in—\Z-[^HF~?`#!A5ϧ`#|!9RDB|&TgV|τ<#"Eߜ>&59!~gO#h>sxS؛|:F0—#Vv3^3Oj>-[`GHI7υ "h7$7Lh>-?gy [B~F0eH τ|TyR5 UP5ߚgwG]9.LLIW3v'R󙡟>`#QϑgBVg3LτyFxoKm9~.Dj>sl fc=6Og#F2B=|7!.9я4|/F0 j~yo#xl{l`#t39RDzl߇"Eߜ>&5t6`/#D=GM|#;NTF¨&a[Mz?'o-q;T1s'Bߨ$i ]Hd!<$9|C;D͟hqgv󋑚τ3j>濳O~g"Ek>j>3j~P5d[|&TgB|Z #?|˓L|+c5 Uɤ/C?-d=6Q>~|B/&j>W'QτLgF_x&?YيxN3Oj>-3j>WU/N|f'R/Lh~G||r3OPisAR%}haz!fG?~|B/oI'IOfkj~O O~QgB|&TͧCv3n3O3j~mQ~!Dnl5d;R3j>-ߚg# $]':يtG|Z>TgB|&TͧC̓fޘN[Ag35 U̓C[4' ,3@H|f[h㝶 s3j>[`+WIO־-AC4h7y$gBN[Mi#_Nk>3JUP5mѝ 7IP4߲?B]DE`j?ՠl]3L?5U[<[`Bqs oh4H0yP5U<3jȗn4 U'z6τi+h>30/nn""w~N@k/F4z΢?wڪOˇ<#ᑼylwy<6cdd"xl濻>||濥lB]8Oc=6]50|Ej_E~_lB]cm6A=6c`dcWS[<6;8hc=6]4wE|ͯ<6c=6=d5[|50vzx/m E=bVa:\ù/SyY]Wj(:ޮa"O>5n׺u}MLC[?Et!?y7D׈`_ng# cP/'suD.: &ozm}.?^smOpļL4轵oRrH 'z*W]NZw爼<̓PSǡDY.1,Gyn7K0k >2j#LFּHbQd-NJuK<^}5LO˟ɚ_>|z3cwTf)bVX3j>-7 K6UAC3j~~!|D-LO|τL8P5 UP5 UP5 UiP5 UP5?yFAs{3hkCnP5 UK<#5 ~b3_W$6fn^p)bVLτ5Q%_H|=7yV]g׈3[?uE]iP5̓L?p>Gpy3QOfAP5 U<3j>j~GyτN3O3j>3<τxl4Hgo4دΣm%i>QcN?-y?i<WhgB|Z>TgBM|fJ3|τ[QfDgBNdo4h5jsNH=5 U_<3j>3j>3j~56A_'j$Oqm7y$gBw<#7˜3j5D\5 U;m5ͧtˆ;m#wBf`Tgvy5?+q-yR5 U;m5?g>To4UP5 U;m%o74k~ܯ`D}u.j~vi^o4Cw<#7”淛yv5L_;myP5 Uc:aĝvTͯ<A;6QE{6Oˇ=p0LτcSm5UP5 U'4 Uǿ:Ou|M6@}Q5BqcτL?CτLOw FPi3(#!RyA?x8|0|τ̡|5MCL_E%!Li~G|&TGj~G`Di +sDH|wm9=O_|&TͧCN|&TͧCV3f͏{5K?5/fЇC _TPBj~G|(ͧC|Z~`0oX#I3.#Arz8|Lފ|zww&k~G|&TU5̣hfL|&TE!τL|!i> M|Z>TϨ +80KӣV4h'i+hG|f'ZP5UP5[v^;m5(LJx8>0g͏|Z{l{lc=6ɚif_TP{l#c=6c=6c`A1y#̓W. <>NK 7e(8XOz_ݷ ΍|B2`!ln7vV̔S}_/D󠙋vy3j>}%`# a@P5 UiP5 U|_FCPmJEC|&v3j>=3j*$#FB@_ڎk>3j>-KS3y.TCݧC|櫙'QP56U;v~Ἠ?^j~s"9@3.JiP5z64k>ߩ`#an x|5$jf4#0ՔUP5hm3j>S!F0WfQ;a&Zqm5 U;P*B\τ͝j~Gw($#FBsm淚yg4i~{̴fi+j A|&T/\0Bv>wڎ\jIUikځ[b!F0;mUͧCf4gBfi;z4?yуvz.X| F0cfi;zƧ<6c}.FxGy~dLsF0["xl#;m'Z=6ߧD| F0cfic}:!aQD 88{2U9Wy;.&GyoM]sh0zQc>Vab +F0 +DkiMw&v.xrX n%zo}K3O_qwdy\_7|sD|&TgB|zVA9`#0̣j>WfQP5Gh<τoy.aτLτ~3j>ϡ`#@τqc#yп yDgB:0KHͧCF3̡f(7'j>-3<`#ѿx?̓1;p>Ss)RiP5-#!QP5Uy4ٛx,`#@HͧCF3n3O?OnyQHOE F%LτfI{PHF0P"L_=w~elA;-3j>v*iI9`#ihG}-ӌoj~}#c=6`# {la>`#a8=6c=63F|`#F1{l#F=6c=63F|`#o#0^¹ߜΗ3̓WVnNd^/ 69vžuB2`"4|>ډ[i9Q96CσkDO`X$u̟ki2۷<]5JߺU} +g h>j~c|LB2`<DgB| ͧMCB3jT?RtB|&T/\0 +3j>j>滐`#!+!gBτԼyLOˏea`#d36?FP5?6?QP5 +-\0zvj>=WfdgB_v!F0B1cS4 UCQlv=O5 =TgB9 F0B57vjOfE,B2`b+j39Mٖ4?fmܡ4a3O3j#!b.Tg4 /ہ U~Y؅d##DCTgB|&Tw!F0Ÿ h>'4 UiP5 UP5 UP5;6?YP5NB~A|&TUiP5 U]HF0_Z>TgB|&TͧC|&TgB|~M}~L?sxkI|j~Džd##Dj>m淚ygB|&TͧCV3yOk|Pl@h;=T6?tLOw!F0Bτ_h͇^3Oj>-?K|`i>=9 F P5wm{)τ.$#FA|&Tͯ;mEͧ?wڦj~'UP56UO4ͯ;mE\(t6o ujwmуvj~']]HF0BsfU&qT6τϝO@|fg>B~!nnomꠝwm4j>-滐`#! C滐`#hP5 UGwj>3'Zm5 UP5UP5 U\(t6B>%TgB<߁>,3j F0P5U{;mS5 U'Zm5 UP5 UiP5 U}:Cv3c{y56Ui.$#F P5 UP5 UP56U;<τLlϹPl|6Uiͯ:<ɚτ.$#F |n|Tgy5 Ugt.p:!fX|Z~c5 U]HF0;pj~5̓LifEP5V|&TgB Fa)?T5Cᩚh4߅d#:h淛ygBN[UiP5̣h>v*OMPl|@ ޱ_x F0RrCx:'/8ONb8Ἱ|7/Cy=ݴλh2}EymPF{ɱf[rz]nk<^Fҧ!ViP5 UP5 U]HF0ɚO?h>3j +P!%h>m?Ϋߙ̓LEH|&TͧCdMP5߅d#̾7,VÿiLτLͅ$h>Om͛|Z>TgB=P,Lτ|lq!F0B +B[3vFi>-7y4gy~6QP5lk^j~ǧ6U<3<τ`#!!bTiLOˇW3ϯRj~G|&TgB|ZOg#+Bj>=y5 U]HF07y$gB|&Tgr! 8=TͧOv3^3Ot6»"=ϝ3j>滐`#a +!AP5UP5 U;nSP5kIUiP5߅d#c3j~{|τTHMP5 UP5̣jOg# {l`#${l~cg{:X|#FH<6c<?"xlF0B2{lHώt6BF0?њ9P*{l`##xlGOg#0zEjiyY]Ἕ/^Éhu^^k8| +($# `||^]se4>bھom7S7~z9oSH¶r2][GvJt:\o3j>滐`#)BtgB τR3j>-iވ3j~P@!!Oo?gB|&TͧC|`7Cڸ UP5?bgXiP5BJ|&T͟~7L*PHF!bj>懛y"46U]HF0!z>j>xi>mSH1 ցO"56UY +"Dj>m瓛y4 U]HF0 +GH|Ͽb~A2|LP@!!SDgB|mLB2P(L3j| )$4V淟 τYBdL"4j>υ8ͧC|`"6U<li>滐Z3j>j~VP@!!SͧC~3O|&Tw!F5°C|z<淚yg4i>m +rEH|&Tͯ<滐`#yτc=њτ +(B3j~$gBlWB2BTgB|P5 U]HF0P5U_aDgB|#k>s<4/QS*PHF!6@|&Tw!F-iͧC|&Tg~N%ViٮB4}S[?j>滐PL܁ UP5߅d#56]<~N%U] +i,ǻujؖNTo7` +($#dӔUo@g3 F0Bnτa"wM*PHc9 +)iTͧg +2E|7- +g +2E|7- +( +2E|7- +( +2E|7- +Xzl~P@!aP_A?%Nz̨<"&z$ͼ!?@BB2=kXVx\7C^ۉ[{6|}$͌z)̅GGx eu?ɛB˨rWy*PHF1€C|Z>To4 U]HF0P5/τ.?D9=T*$>K|&Tw!-j>j>滐`#|a>Tͯbc見|&Tw!z U$i>-3j oi5k>3jG|`!ܭUĴT Jg3._DF3̡f(ͧC|Z~P@!aOˇW3O3j>m滐`#$ 5UDk~p滐`#D i~sU'Y#h~㧡~!ZP5#i> +f h>w +τLB2@H|&Tͧl C|P3 5 U >4or.To +($#6}&TTw! aXP5j2Ϥj~g#LޫP@!ah4 U'?ڦ4yq!#Lj>-淛yk!j i&aͧC<њτWB25U<uړ~хd#LOk!3j )s8ͧC̓L*PHF=B3j>->R5| FxwdgB|&kOUP5߅)B7wJOˇfE\ +GH|&T6U?.i F( 6MP5 ZihDžT̡fA;P5UZ +sGhiB/v*_?y\HF0›#4wjO_H] +R?#ӄ隟*PHF={l`c=6$a +($#c=6F0B_ +fo#|/ csX +G|7P{l旄9Bd@l/cY6$|64ۇDsX +Fᴸ,p.*ݖA+c.j4-?vlhB|&Tw!"k>3j>g +R&IτfIgB|Џ```?I UP5߅d#p)j>3j>m +R.3jX3OjЏ``?ցSccjgP@!"lWfQfgB^ +)'QkI|d(ͧCf3 F j>-7KτX +FP5? tSg3LB;$6?4'IP5߅d#L"i~k̔ffz +($#!_n~|j*PH >ٖ4Mf3LB2F4 USyP5?U(`|wB' ij>-?U(2A/TgBVN38.$#በi>4DYBd#?hV UP5?U(2Aځi:h̓j>3j FP5 U;WtͧC|5 Uy 5Di> +f i>j>-3j FK!QgB|L?̓|*PHF= j~G|&TͧCF3 FB>T͟~ fP5 U]HFj~G<њO +frzߺj>3j>-߅d#!)?|&T6 +R=|߽wN|&Tw!wy5Mv3LB2f| L*PHe">5j~s|τ.$#!B[3j>?/'TOi6hDžd#dHl5h~P@!0ٔUP56]3#GO±B2й@|Z>TM|&Tw!gb56U_<3j~ƫP@!aɚτLR=_o<]HF0#\fj>m濮H3j ?LOL*PHF1B柆yR4jHj~]HF0#LLP@!aS4U__h|ifAP5?U(0]MfTgB|!չ͝j@3O滐`CH|&TͧOh͇9Bd{UGځugP@!aP5 U󛿲-i~G|3j~dͧCVB2$Tk>TxAEOߺ qt!_A8.2;?̓h~ ?zq/yBdoB>N{ݩƶɻӼw 7cuvF?G?3] +sFH|滐`L!(ͧCVB27!(?yOˇBd#|-7y\HF0hP5̓C?䑤LP@!UN3O3j[m`#lfU_yEgB|EC#j~<$gB|iP5?67oRP5V[#!aj>=7y$gB| "=T.O nz +($#|B[Wϝj[m`x<3<4j>-{y`F݁i8h3j>-?U(M1;p~B"N3qT͟*PHF3{/=*PHF&a +($#cFa +($#| +c#| +<6c`oA|1csX +߄9Bd@E} 'f\Ndx ~#׫+ϻYBdY"\6m?̓WV'oD-g +~aj~xm'τ.$#!LOQgBLWB2UP5OyBd_EyOƞYUP5߅d# (τS?5|*PHF#Bj>-3j>滐0'?yTHgB|Z~P@!U滐0ͧC~3O3j~P@!Z;mUͧm5 UP5߅dwDu@V|Z>To4a +($#*B3j~l5 Us] +0dP5?0h+N[<3j 3-?U(3j~{|*PHFxPTgj^Ҡh*PHF%BʠoiBWB2o"4wڪ4j>7vj*PHFx a +($#csX +9Bd@VB2,<6?U(*PHFx a +($#csX +9Bd@VB2<6?U(*PHF0g^s3zOx3d/\pb +($#&TS8f{ډ[Q[f}(ߟk]sP@!aἝ)xhㆠhm7s8u}L4z*PHFx)ͧC|&TgBBdDP5 Uc4U3Z +sD:=Tgƍ|&TgB|0yߞ#h>g +~6U󙃝1?:6?VP5WB2,CͧC|&Tw!#τxh4?U(]1cS5 U]HFx71o5(ynz +($#Lτ|*PHFEP5j f|UP5߅dwA|Z>TgB|&Tͧg +VF3^3O3j߯BdDj͇cc05V|Z VB2,b56Q<3j~ƫP@!-NU kI|&Tw!a&;pj>3j VB2,R5z5UTo4 UP5߅dR@|Z~n*PHF%~3OOˇBd@VB2o"xl~P@!a*PHFxa +($#& +9Bd@VB2/"xl~P@!a*PHFxa +($#" +f9Bd@VB2{l +DVB2ey݇s;2b/χ`Tyl5̓W^o[1X + .\\ry"4 Us\ +F-3j F"τ`3Oj~NP@!3yb46UiP5?U(uj>sh#Lj~G|g +T4kdHgB VB2>P5'EP56UX +1fUP5 UiS$z +($#9_+NiSF5?'QP5߅d#|BkfEP5 U]HFoU4#i>O=U(P,1T͟5ճG|&Tw!_@2{OMf3LB2"$h>WɚiI +Eh{_KU[Tͯ;$z +($#3j>s^ +FLa +($#D{lDVB2>csX +o#<6?U(`a +($#D{lDVB2<6?U(zlVB2e<7|Ongv\}(('/Cy=< B3#j~G|bjQ4m|dͧC|wLl|Z>Tc +($# B)G|&TgB|Z>Tw!a +!JiP54$kdͧC| MfEP56U]HF0B BM|櫙'QP5V|4V|Z>Tͯ<3j FC|Z~NfEP5߅d#4V#j><ɚτ.$#t$gBN[IiP5 U]HF0zUΧfom3j FB49y@|&Tw!3;mS4 UP56]<.$#bj~NۘP5̓*PHFx|#| c=6FEa +($#{lo#" +c=6_B|7~csX +o/!xl9Bd7A|7—<6c`CVB2YRWxr.%'̓Կ8lw ̓n֋D +a{Lr[EvGyɘ9xޟ杮ǛG Fyw9_'v8xr/"&m'og$*PHF(cP5?p~Ry5 U]Ho0Lτs0šOˇ.$#!sxgB|Z>TgBlWB2B#NU~6Z c U]Ho0|τW)O.$#!StgB|&TgBVB2B>V3Ow6Y#šjQ4߅T4B3j~G9iτ.$#!/3_<τy*PHF(aB<3j~~!NiP5߅T$B3j*Q<3j FeP5z6l5h>*PHF(!RiP5p^45߅TBsm3jHoU4B2wzi+h~lQ4 U]HF0B3j>-a~A|&zoVV3]牚τ|03nτ|n*PHF(A|&Tͯ&"wB|&Tw!P5UB3j F\τϝ_ +#xl'{l0_a +($#F0|<6?U(P:{l{"xlEVB2Bo#csX +Fx"\Wk}g_ߌ(}QL׫P@!3+,MP5?9[xLP5߅d#j~?YiQ{C:P5߅4cC|ZfdgB|07Ya3jl)ͧ +n?+ۑ 76B!xT"+To5a +($#"<<淛ygf j~P@!$j~pw +B\}8ϝ_ +F#hgB|ZtDk>Tw +($#3@|f#ේyR4 U]H3@iS;m@WB2!YP5,jGVB2>yP5?Α"vB|&Tw!e>O6v@lWB2V U[m@lVB2_ +7*PHF0gzl9Bd# +!xl~P@!9Bd#|{l~A*PHF0!xl~P@!_ +G*PHF0BB^7ݿ]ZjK@{yP26 +ݵ}b֑vۄvyA3g +0o^'&}L?y! xu}C;}kP@!̗C|`'gњτ +ZNUiP53IP5߅d#3B Uq<3j FBj`τ.?B|UP5y)i>滐`wD|&T͏t\HLOˏl͇yBd#A|&T͏hہ UZ +F B^4h3_<.E4 UcGyBd#6][<_3̓6h +VB|7Ea +($#9B5a +($#a*PHF0csX +k*PHF0¼<6?U(` +<6?U(`y#xl~P@!Ie}=v-Dooy˛'_s0BGyxly/n}[p&twp.J4C}ȿ^ +F0G⺻'/C(l;滐`/#u3j )a DgB|Z>TgB|`a1'=3j FC3j )aT<3j>mj F0B"¸7y4~㙬ylz +($#ց߱jg0B|Z>To7τyB20|?4[8IP5WlWB2q;pjWbZHњτQ;pj>滐`#L k~ifIP5?U(`fڠLh~U^R3j~9iTgB|`tgBVg3٭Bd#@ Uy­P5?Ui!5wj4ja +($#9\ c=6F0!xl~P@!LaZHF0csX +F`zl~0B|7}*PHF0csX{l`CVB2qFn/۵;%:o-?.vf}y]\/%.DZpV꺯h2)l<7e8fpb +($#'}&L4s-n?z_1*PHF03JiP5 U{04 U]H=tgB|fpsHP5?U(`#|$k>Wf(gBVB2xLOˇUC|&Tw!1Wτ 1OBd#3~e;RP5H&5UY +Fx"HτyOˇ<.|滐wB|&TU5*PHF0>sr.T|㙮ϝ7y2_ +F`uj>W?yTw!M"yiB|&T~ +($#=h/iB|Z~P@!L|csX +F0gzl~P@!L|csX +F0 +|1=6?U(`#| +D||7 +pm} %j_1qEصV]5{?i58no7>Pqk!FQfVBSzL%/uS`Y#\O];k_s#wcs0WB2ӚOˇL|Zd)S#ͷ&ˇL'FiP5F0¬46Uӭ]P5?U(`f3j>jdSη"5UP5 UiP5F0¬4gBVۈrg +@tgB|T6?2'^s,DgB|Z]P5 U;`#aP5 U¤h>- +3j>j~g2OTH3j][ĄջC|&T/t60kCf3Uτ.$#[Z;m5o5(>N[MiP5?B,ftkN[E-5 Ut60kpT5`m3j Fƻuj~s|?̣ɵFnKj~s6QP5Ng#Fہ UfA;ہ*PHF0c=6c9`#csX +F`zl{l~1`Y#xl~P@!L|/t60ka +($#c=6c;`#csX +F`zl{l~1`Y#xl~P@!IM6Sy,q5wGd^w+bh<3vOVx =pܯݵwp7ht3/է`y"n +|لv /@R}m淚y>`#yx_uy59yϋ F2j>3j>-7y4o/nj>3j>-+F0fyOˇLτ.$#;m5τLO/SM|&oj~gm淛ygB|ݍEF0,$gBN[I<3j Fj~G|&TA;P5 UP5?=65EF0&`DLOˇfth}!)>τUm3j~ݕmu&T6τ;pj~+F00#R<3j>ק[u|/t6-Dͯ:;m=6m +FHA|bNg#"L<5c߮`|/t6-B7F0w"xl{l~1`l>=6qw!_GX{K8fd Ta_Om'odG3ޜP,9z]%zo]/.xY=̓f._m2p0@.ϻuȿ> +8`#z7!H48lo#]/zyy=]Dp^׏oϯt!ٲyτLτ|τLOU4 U}:Fxw!Tt|M?gB|&TB2zj>=3j>3j>3j>j>t6c UΧj>3jPh>3j> 3̓LOfUfXgB|Z/ jOg#g33j>-y\HF0є̣h>3j>-3j>j~'UP5ꗅ'5ߧ`wA|-wy59;m#5 UP5̣j>3 Pl#a)τ̨fPTgB|0ϝj~5̓LifEP5hsj~5ߧ`RgBfP5 U]HF0BA|&To4#h>vڊOˇfEë0h淛y\(t60{N[u&T6 ځNA;^HF0BF0o#|{ls:F?{l]_l#aF0w!xl{l~1`#xl߅ŜF0o#|¦>טkԫx.i9.u27U?1_La<ؿ5s~}:"r8[a1zH{o}d/|_b] FӹPl#3w"O h0f{&Ѷ|4y.y0f,ypp.yMbLD4lz׋Y#)/"s Uk녪j<fp:;#8 "OB|j> U} 9# #HOB| UIOˇ$T/šO\?q5$TͧC|Z>Tpj> UI)h~gG|rd'yOˇBZI+΅Ύ0-|?>̓|jHP52̣j> U0OEiP>T'j>=RYj> U}:;#8G1{OaAIOB= +3;P5V0Ӷ8|9݁ UI\vڊOˇa?t.tvGpDֹ d5|4 @rG(rrNP5~s>=̓b|h淆y4/`5q.tvGpD$T'j>-y| 9#8P5?Ӷ8#js^ӄZ fu(:#iBq.tvGpDH@0$T'je#8B1k]tm#8#8·EpmkOkk-k]Ƶ3|;#)k]?6?y:;#8 "6ߵw?v4OӜ˓ź!~r}}2 .Vy4޶)b{lw4q?Fsa#8# U}:;#8#LDj> UifP5> #$jOB|rl턻C|j~w$T'j>-o 38I"OBaj> U} 9EH OBNۀdžy&u=yҚOBq.tvGp@aURij>-ya'j0O@3M:P55V|Z>T NgGpGxP5V0$T0 i> UlPU#Mف UIi+i:fp:;#8sDC|r|'QUi٢HiOB|Z~nmqG|rl'U3Nt&T'j8fp:;#8“D\oև'긜fe}:;#8#=BsDvҼޗW˳/jb8/m.BH0D'j> U󧋶OB|OOˇ$T'jtvGpGP"4$TͧCM|H#tçάj>-P5Լd;D?^Hh>mj> UGlg4OgGpGpdj> UIO>F k> U/<|j^Nd;ΓCaP5U[<}OgGpGpGj>m淆y4'j> U} 9ߋ09UIOaM3P5=#i> UIOˇaΎw|j~wG|r0!P5NۄG&C;pj~i0$T'j>-ߧ#8#8]#OBN[UiK[e(@r!UU; U뗶\H0R&TͧC00OzeG4j>-P5ߧ#8#8="4j~Җ,3|66#8#8B.k]3|66#8#8B2k]3|66#8#8B2k]3|66#8#8B2k/<NܕS{#_HD'r"z sZ!Q"Ǘ61|·ӹqsx~}Ҭj;}xSr]|ޖcÿ/nfmc̗GB_ƉփXm#O}d߫4 ƿ/%|uvGpGHEǽ͋8޺Dj~|ߨ[ <_֋_LjSYم$T_/^KP5UIOB| UIOB|j> UIOB|r|P5yOB|?Ni> UIOB|wÚOB|nӒgQ)j~{G|ׇy*4$TͧC0$LL7<"5|OB_n|j> UI;i'Iil'uBUN0ORIOˇaMIi+i~wF|R)4U0$Toﴕ4vWgGpGp[#53̣h>92N[ANۨM5%S k2#j~z3AޜOk(ډ-OB|vf4?USvڦvƆyRE;P5UIOB\nij>- 4n^hwc牢Oݜ%OR&wVFj> UIiheGԧ959i+iB|v55̣i> U#f?@0w>M;wm~J]ߵkWgGpGp#6ߵts< ']|7cWgGpGp#6ߵts<6ߵo:7]Ύ7Gpmk7-ywmk]WgGpGp#6ߵts<-6ߵk]?׫#8#8\7Օh?FlX]).P}rIRd؏ꋕBrdcV>+TZbkjbr;/`׳߾}yc1lƉX/Uimj{S2 ΎV _>2qU&>}/vH :]s*C5]w]BqTyQ=7ASZP?f)'jؒ'S념7_UIg0O&?-P5X8|Z:@0RO|OBHוP5&u>2MU 'j~-P5],& FV7'j~;$To&d;$Q'vj> UG64w^g ?| UIL\H#{Ik>NTy-j> Uyb* UI$~`7 UihDO 4~; L5y5$4,MD:P5:BiP5?73qP52hM3;_o-F +i~{G|P5e;y~yбyQ5$Tͧ?Ar 70OJ U^\Z UNۉȒgrZOEH/5A|O$v E;P53mSi[54^|j> UIopGparNP5dmN0OR˟ ,*ivJngJ)S ՆyK[$RXihv.iBaOs*Bh.T'fkT'*|?>{?vz\h?p&V~9z[|p.|lblG >(T1=6UB w?{ 4*T5xOB|P5CHj>d^}߲^@lgE|rvNU8$'j> UiP5G#Ӽ#!pg;ݜj\[_Iҫ|j> UIOW5}s^ts^|G#90tzOaEIOB2#j`4oi Ln1@]nΧy"gd| #D~KtyOB|T'j> UiP53̣hعVܜO;peaz;m<};pj> U/;mUͧCa?6Լ#!SnΧy'a=ROBNۼ淆y4'ju`T|avs>^Heqz;mE'8sW!^U[ !w i> UIOˇaMI_;m<|z i]apv }}P5UIOB|Z#%vj`A͛:w7]|#N[)³"6ߵͷ:7FN6ߵ FR3;m].ۏ|6ߦ!pg;ݜOT_4zWyQIv|6ߦ!pg[|ҵwm6?kg^pmk]oSuo1Ho\|zϲ^pmk]oSuGxX7Z|.~ ]4_}&OV]LpqG7ߜ~!}j|ݬ +_6Qm.7{fw%Z\nUXb?/cB;jN3/ +OqTH[ +eh=8Uׇ.1|jq45^_x-Vl^1y۽/m~_*ݜrVEC>դn`8#8£#_Hk> U㗶P5$TͧC|ȪmZ 'j>F;.yD;R_1/y'шOBP|3$T'j>-Y$e'j> U'oG4j4wg#~ Tͯ_*Oˇ$T'j>rj>녀j> Uo_LjH炤a'5ʚ?IJBT/yh~]擅"k>-P5ix!OF|= GpGxt΁~淇y$/_ڂOB|Z>T$5!x4wo OvM5L̤jxODB/$yҚOy_Y/5W!$To<Ij~HOB0#;msOB|Z~}wa #8#<:BJkT?K[RIOB0I'j>Ͷ>vZ/OB|<QK0OB_P53^k>Zj> k> Uɱs!"k> UiP55̣i> UNTlARiX˟EM$L^Iih5p'㦚|Z~mX 'j~|4Ty:;m%ͧvF5$4Mi> U0Owع/vvڦ4$Tk[ML\yO3{ GpGxpPiZEN[IiP5$Tkp'ŁP5=#i> UNۉ c0?i0aoﴕ4UI?=ؖ(ځaEI[vB|:̓y#8#<:Bxh.ToufdlT|cD)ۑ"BH0šOB|=դP5xOFGw +#^/FR}>pGpGG FZI4CO5͗FwTh<)?XkvPl50 U']oGrGx+7aOm|,k> UiP5p' U]aROBN۬y +7j~{|O^y^tT%_7k<ƩE%OT4pwJ4tmaf$'j> U<|OBN[Ia X/-?ZkpP5?>(qmaBQ݁i wڊOMiB|5n7$ > +startxref +39301 +%%EOF diff --git a/top_mma/res/res_260.pdf b/top_mma/res/res_260.pdf new file mode 100755 index 0000000..b9372ef Binary files /dev/null and b/top_mma/res/res_260.pdf differ diff --git a/top_mma/res/res_270.pdf b/top_mma/res/res_270.pdf new file mode 100755 index 0000000..6e04499 Binary files /dev/null and b/top_mma/res/res_270.pdf differ diff --git a/top_mma/res/res_280.pdf b/top_mma/res/res_280.pdf new file mode 100755 index 0000000..1f3d28b Binary files /dev/null and b/top_mma/res/res_280.pdf differ diff --git a/top_mma/res/res_290.pdf b/top_mma/res/res_290.pdf new file mode 100755 index 0000000..fdf1c6c Binary files /dev/null and b/top_mma/res/res_290.pdf differ diff --git a/top_mma/res/res_30.pdf b/top_mma/res/res_30.pdf new file mode 100755 index 0000000..e590229 Binary files /dev/null and b/top_mma/res/res_30.pdf differ diff --git a/top_mma/res/res_300.pdf b/top_mma/res/res_300.pdf new file mode 100755 index 0000000..aa8f520 Binary files /dev/null and b/top_mma/res/res_300.pdf differ diff --git a/top_mma/res/res_40.pdf b/top_mma/res/res_40.pdf new file mode 100755 index 0000000..a761028 Binary files /dev/null and b/top_mma/res/res_40.pdf differ diff --git a/top_mma/res/res_50.pdf b/top_mma/res/res_50.pdf new file mode 100755 index 0000000..dec488e --- /dev/null +++ b/top_mma/res/res_50.pdf @@ -0,0 +1,130 @@ +%PDF-1.2 +% +1 0 obj +<< +/Creator (GKS) +/CreationDate (D:20220504164509) +/Producer (GKS 5 PDF driver) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 4 0 R +/Outlines 3 0 R +>> +endobj +3 0 obj +<< +/Type /Outlines +/Count 0 +>> +endobj +4 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +7 0 obj +<< +/Length 12 +/Filter/ASCIIHexDecode +>> +stream +000000ffffff +endstream +5 0 obj +<< +/Type /Page +/Parent 4 0 R +/Resources << /Font << >> +/ExtGState << +/GS255 << /CA 1 /ca 1 >> +>> +/Pattern << +>> +/XObject << +>> +>> +/MediaBox [0 0 400 200] +/Contents 6 0 R +>> +endobj +6 0 obj +<< +/Length 54062 +/Filter [/FlateDecode] +>> +stream +xIJ{+ } .-9,ig[ BrA$Y +Uy&q2~(f78o%VZ߱[[ƭc??f_/]WVs[쯞'Yhۢc|7l_mkkZot?_o*CW"XYnq"7<]b,cGb#xXuWXt<݉px'ncD}7!1*/){S /nH*YI/&auOtsW]~r؜3<z}c\ĺ>Tz͡.7DRnl@"x8b,qsmwfxlEYmN)K ʪL>S UW=ٖT_)_BrQ'j>yOˇ$T'j>mP5$T'j> UIOˇ$T'j>=[GX,'j>cXOB|P5l 5xyIS"D5UIOB| UIOˇ$T'j>mP5$T'j> UI5~wO>Ͼ_4$kY_=yD'~!9B5UIOB|Z>TOB|TOB| UIO05A?:3Xi+i>-| $_4_]i;9̓d'Y+m'j0Ϗ<Ͼ_] +m%#HOB|j~0̣i> U+mEͧW&k> UIOˇaEɑa4VjOM|P5osG N?6̓UJ̢vr4z<ٚOd@|򏯴_H.+m'R#tVfk~8#i>9-ځ|OB|Wfk~0̣i> U+mEͧCa<'j`mwy'j5a"g/Duj> U+m>M=p|OB|ïVIc4J,'j6[ UIOˇ0$T5?4j~wG|k#8B/g/6ߵO?v~A|6ߵwm#8GX6ߵ +d $Gpmk]|T;#~|k]|Aἤ)\|6ߵ6UG|8}|6ߵwmk]ҵV?p>wmk'o<|Br6ߵwmM6?e$1bD}8}P2&FJ3΍mQi;T](u"_دou~ ;XO"p3 nD97tHu~!#1K#ӱRFgd;%!'=\ip׺.1ꃇeBm=.~&u+w.1jwXFs9ǹ~r vU"!1j;;^_fRܮuYOc3l Wt8۽b]5W1Ɣ' ٜ7rYp6e +H$7I9#LEs$LP5[i)$ON'jTE'j> UIOB|WOBՇC|+QQ%I4Tmj> UIObaIIO|OB|j> UIosG0i0ٚO"_JBc I?|P5~UxP55$VP5-M|O'k> UIOB|j> UIO$T'j> UiP5E|k#8B/¼NdĆy i,'' 'YkP5?4z'QUٚ4OB|r|'A|0mI*a45,dk> UiP59#j>I|j> UIOˇ0`'UiP5aP5ߚp'}ys>k'Kc<70S5<`H|Z (k||4>aP5y8=ցwN| UiP50̓$TͧC|k#}kYi;9#i0OP5[i¹OB< 0di> Ui33P5+#MJ[A<毄-?ZބP5ݕ?yD'j>9̓cG|P57k#Saɇ9m+p UiP5;#h> U(ځ$T'jJ<'j> U;+m OyyO*<sT'<}CS,ځ+mWBJ[O9̳43ۙE;P5?4$TaOWڊ}P5ϕj~wG +}P5;#h> U󃕶j> UI]i+h~ǚ j23p^/6ߵwmk]|[扺k];]|6dǵ;#|Miևy<޵wmʵwmk]|Gpo06vN%_%ͬ޸i<1Ťy6nL}cλNw(bbs9WfEфl J?tcseTNd}pg+ߞVcj|u݅3lv7{ƃݩ뮍ힿ}s>pXO}UB5\n1<#p<8؈:uY7n&>LzW1M8n=KJYdF#<7k#}O5$TͧC^ fP5!OQIOB|Z>T_-$i F OB|P5՛ +|j> UIOB|Z>T'jk5!̼3O05$T'j> UI5~w)yOB25aFP5yONϩh> UIOˇ hiOˇ$T_gk>mj> UIOˇ$T'j>mg5l͟x3O05$TͧC|rrgNI5~wad'j>=? j>IaFj> UI?=$T'j> U

UiP5_8=TͧC0$TͧC|Z>TOBd{O05UIOB|-?euatZG^jyQ4dt.I/O@|槽 a3T'j> Usy&uj> UiP5?4yOˇ$T͏5y&i>-wy=||s<+p߿p'QIOˇ$T'j~m<5yfic|?6̓$T0<94ɚ;B'a5a,'Ǫvfj0WB|G^|?2̓`@0//J[AWaQ0vjgVWٚ?|wW +5$TͧCpG|?WڊHOBJ[UiP53̣h> Uy#?]kYUaIǪ¥>MO˟il_ UIXij~0̣iK0>ͱW e팶@|r|'h<I_=yD'j> U+m Oy4j>-5[+pj> UiP5?4 @|Z~mv&T_9¯@wmk|6ߵksa]|6ߵwmk]֚;Bѽk]|6ߵwmkUwG0O擮wmk]|6ߵͷ:OEh/[ŦqoG9F>R1b,bu'.wix}T^?M#麨q~UNa}hsamǡ~AեY_6Cbls^6Mq%clSfgѠZmUyl&pPg2z$W[(wӺFqq/elڃU8uݯաl)^T<sיcq,'l/ a/Ƭnm~ʟ񰻝`Dq:o7<N˝7:,!4jD`# /W1͹ϝ۬upHuݜ/6W[Nrf UIO|OB|j> UIOB|Z>T'j> UiP5S_H|I5/[$T'jŒP5$TͧC|P5;$T'Q$T'j> UiP5$TͧC|P5|OB|j>-P5$T![IT?੿Yͧ=NL͟_H|Z\Wl@OB| UiP5$TͧC`G|j>- i> UP5;#h> UP5UI|?B=yQ ?rs;ؠj`'WIO0 -TcsaGyR4VcG|?̓$TͧC|P5V0$T'j>-P5|H?-\i+j>-lm描dh> UiP5pekVBeOBOBk~gaUIOB7 UVfi7̓$TVjOˇ$T'jJ,'j> U;+m OB|jP025c+m4;F"h> UÕ_6?hwy'j~waQ{?khswV*|濑9P5?\i+i>-wy'j~V0$TWJOˇ$T'j~waUIOB`OBpٚHOB׬|k0gF+m3vƇy2v2v+msvj> UiP5oy#6?OӵwmkI6ߵas|6ߵ}6ߵwmM.k]|6ߵ͟tmk[WGpm~gǵwmk]k]֚;BZ=pN Ӧ587aFJ3/IOEϝoEQ#egGtjvi4Y"nyٴuj9O&_Ɠ) +Mu]h{MZ ϪMᦩ/E3x_ltj6<;ҡ.Kv8B<7.qzք;UyqW4[/4q_o.)&!1j=mCr]z~n3j;|9n K0>xWӸE+V'2~#_CSngXJ\9֧:Vy5roDn` '8%K 29RS)׆S{-YkSuVyOLΧi> U~5OB|S9ٿOB|j> UIOˇ$T'j>mj> UIOˇ A{K05~¨P5c}YG|j>9R:$T'j>-4oV,h> UG&4%93|OB<0~aTIOB|3?w|P5UIOB|z UiP5U}+G_j> UIrUUIOBҹ<'j> UH`I+{'zT'j59#j> UIQ5$TͧCpG|j>-<I|Z>Ty9rj>-P5?ͧ'~1>U@`OˇaAɱa$ͧC|Z>TY㙧$TͧCoIz䙡ˇ$T͟x]{j> UIOaUIOB|Z>T'j> UI-T|Vk~0̣i> U+mEa,͏#i~V0%4UIOBJ[E{ U+mEy4'jc|Q4?4WJSuODP5-<擃aܢOˇ#_|濐-TAVP56_ U+mUͧCaOVڪ}P5J[IiP5sOyem +\5$TͧC0ڧ U{+m5?4^`wmk]|6ߵwm#,.k]|6ߵwmk]|6ߵwmk]|;"6ߵwmk]|6ߵwmk]|6ߵwm#,.~}*۪-pɔêٟ?&Y6FEq~u*D]N7<7VcDSOoL8\$Z^D >1j2( #O~ml&pO"qu;YZ8A|l۽MO" 񉳸 7/ ׷CGt*7u++q7UlH}VզGŦ UIO{8$T?~,9}y~%-O +QmP5?d;EiP5$TͧC|P56UIOB|j9W';$S5UIOB| UIBSu==P5xOB|揽6KiP5dUI'ἠ[H:lmP5tvj> UIO|OB|j> UIOBG=\'j>-P5OOB|y[:'"mSh> UIOa|͟Xi$T'_XgO~0o!QIH?,'j>-wy'j>mwy'j> UiP5$T͟^aQIOBai?yͧC`G_kSu0#I|j~omc$)B|0O(P5$j>=T'j> UiP53̣h> UiP5UI?\xOB|Ć?yD͟t'j>-Tg# C4lmy5J[Mi/1 c![< RsׅP5E|Z>Tdj> U{+m5?4j~gG|+m5 (?VjOˇsG\o;53#_I]Q%hM~&B +\?<WJOˇaEI!lwHcv߶v~!h'ؖwlmVT'jsG|P5UaMI\i+j>-6YIOB|Zl=h>T'Gyvjs3:#<ɚOB|Z>T'j> Umrvj~6MɱaOˇ$T'j>- mBO]4j~o'_IYihsG|P5UIOBJly4'jc|?2̣iB|u0OP5?Xii>-P5ߦW=\?2|6ߵwmRM>}ǂk#wmk]|/TYi'ۯz,6?ak]|6ߵ 1UGD6{,6?hǵwmkWwm[#|"BujH jTQ]nšZř-qF<'fHt:Ιb;SKYUW1r tR0U (BdB/噩x,'/tYά_Hr +H,O[oGji~(β9]Cձ};wnNugyDo1SUSDqܶ[E^VV7ؖMѶ]_pr{XS$O6yl4~1mqz/Y0NtZZ8ǹ۝n UOBh>m'jo:!~!_ /diti/de$T5/_iP5i>mP5$TͧC|P5UIOB|?`aNIOBHpj~DžP5xݱs (BdB_H^UBϕ&9_H|OI| UiP5$TͧC伨$T'j>-P59FH|Z>Ty4͟|Qxj>-?P5?6h>~ST͟I{y<D͟*#^0UFph dj> UP5?4yOˇcI|~M%_l'j>my%2d'jsG|P5UaMIO0$T'j>-y5yOO_A|P51̣j> UG^מyI0Hcar)a.T'j>-?XiLdk> U;+mOy5|OB|j~8#i>96̓J[IiP5$TOMZK#|*J<'j> U+m ]yYOO"di>0$TͿ U+mdk> U;+m OB|QP56_aMI/5ߗ6GTj> UI?S̛^Uåy  )i;R +ڒV? +͇$T͟84j> UIOˇ$T'j~gaUIOQY_iݧ UIOˇ0]a9wFpmk},,9k]|6ߵ 9Bj6’#6ߵwmk]K#Fpmk},,9k]|6ߵ 9Bj6’#6ߵwmk]K#Fpmk},,9k]|6ߵ 9Bj"xW.8ۃiW_HOnOũZaw.gW8ب&v`U5]bՕjx9ߗ>8?ހSGp F/qO~ c֏Hsl$nLiJ#βjoCqEY^:vR{>nCSnpK?ƈeͩ#F鴚8߉pǔ';ai;F<7洩!1*\?9wP ;GC|P56UIOB|$cs"B~bDrDH25$T'j> UIOI|P5UIOB|;G993$T|P5|OB|Iuׅw0c U},8#h"¯>p>?fQB|=-)M<~'\9P>T'j>=wy'j>m㣶av=4ypP5rL (OB|233a:fl'j>=y25?XiHS?yT !u.T'jc|Q4Q!糇y& y5fiySXj~gGH3OOjV&i>I|r'e0$T͟x_[$ !h<擃aܢOˇ$T| ɚTySX?VڪOˇ#-y>M[i0Q[A},8#G||0OY?fP5?4<揌k}P5U<ٚOB`Jܢz'\9k]ctm`k]|;Gpmk},8##$#9?NIyu*OB|j~g_|j~>GD~!KIOˇ$T'j>mj> Uj0g5$T'j#iq3#EHˣA|P56UiP5$TͧXpGp~A|QiP5UIOB|z-P5?p$M}Fr?:DͧC0OP5UaMIc~,Bb Ϳm-<^}FrgQIOB0$T'j>-=wyKH06K{ UiP50̓$T0$TU5?_3#qd*P5IJʇ$T[ז}.ǂ#8#|K7Euj~U9E;P51̣j> UIQ5ϕj~0̣i>9-ڙ~3#qdžyvFW V@krvj> Uum -fHE;J[OP5d֧ UI]i+h~0̣i>9,ځ|?Q4>#9]| fHqmk]?4g$GǮwmGpG3g$A]|_z>#9k]c~8yɵwmk["6ߵ>wmkwEpmk},8#87FtmkWں6?Cg$G M}y{D/u +sn8s^SnzˇַS(j_*ΪDX~!bGZ0FJ9.W >mR8Q_hu]H;XHOnNSy)LqFuh/fx:u|mqNZ^ĈGu|#qEyܗۺWw֧h)loJoO6G{S|yg$Ggk +UIO$T'j>[xiǂ#8#dD|P56Uəi'j> UD'j\j> UIO>#9WDHyVVT'j> UiP5wؑp,8#8BFS^>NOBy'j> UiP5SMɚOB|Z>T'j> U}FrDHyVj~gG|j>--Îc2"$i~swy'jDcj> UIOal'j> U-wy'jt-Îc2"di~9R_>,wy0k>mj> UIOˇ$T'j>m?y^p^9+P5 jsP|Z>T'j~oB_GZ$yj0OP56ST'j> U_p^AfNj^T'O02vj~0̣i> U_GZ쬴pG|?Vڪ hOBGa+pj~gG|+m5ͧV@8pFrɚ?bZ&T>4j~]i0#-XpGptvïnL9 W*}P5|H?(,h+m4j> U+m>M3#|Kl͟;wmkXpGp_|6ߵ\| wmk#t&$%wmkq,8#8BF6ߵwW086ߵXpGpwmk]2_9$_y,JT4׻\Lվ:Rǐ~՞)"ql]fxS=—ŎcLUy6r]i~L:Us&ź,ciǂ#8#G UIO$T'j%(,I_bGZfy i> UiP5$T'j>-P5yOˇ$T UIOˇ0c²4ǂ#8#XÛC|P5UaI0Oj>-P5xQ4KEHI|Tdj> UP5?4$TͧC3W:pFrqtk> U+m k> U+m'cGZ5?yT'j> U UIOˇa\'j 8#9DQ4J[MiP5#-XpGpt}P5J[MiP5$TהּU47̓$T'jcG|yg$G|XpGp6ߵ3#LDpmk},8#8Bn6ߵwW|XpGpwmk]\|6^=k]c#6ߵwm#,"rjMS^O" 3TٞlrOm_ޔ?i'_Vզn/MՆ >?v$GpGXLOܞ<եٟK?ٞ7%$˳#z_Ǣ<Ź&?p]u:UPz)Ĉ#(nO#_W*Nu}Y݉p#ds=8Ӗ<"P5?Z|OB|/gGrGpDHO|j> UIO$T'j> UiP5$T24/G>#9g"<<P53GiP5UI;#8#,&BRm~z$T'j>-P5yOB|P5$T͟^9H|Q4yQ4}w$GpGXL6C00Oj>-P5|_vy5yQ5g$GT'j> UiP5һw5P>T'j~om-6UIOB|ZHvj> UIOˇ0$T!h'[86UIOˇ0`'hj> UI?XiaEI3#|k>MQ5$TͧC|ݧaUIOB|Z>T }P56_aMIXij>-wy%k]cwmk]:g$G 6ǂ#8#tmk]9#9'"6ߵ>!k]|>!]|6uHI'zl/;njwؑp,8#8ۉgxnn)jF!S71uu(۫$l%Τ]q:TE[W1r^+Ӽ^\[}ËnV|ujݕ=6McY7er>N ;g~pg{OqNV†ߟ>wEg$GDzdIIO$T'j>m$;GpGsRIOB|T'j> UiP5U˱9?|^}Fro\V<JOB|Z>T'j> U_GZwj>-P5DTͧC`G|j>-P5CbaEG>#9·FHvMGhcG|Oˇ$Tiǂ#8#ܙ$T OB|j`'WIO0$T''_=wy%B Oa|͟O|?yTiǂ#8#75IaUIOB0$T'j>-K| UiP5w$T﮴4ev pg6OILYOB|wV*5$TͧCӼ\'j~|>!9iY|+m5ͧC|#-XpGp;ÕwypT'j~wa|'j> UOT'j<[#$#g@0$TVjQ4v pj>-wy'džyv"i+p+m8P5UIOB@y>#9·Fpmk},8#8BH6ߵ3#|"k]cB6ߵwm뜑\| ҵwmk_|XpGp+6ߵ3#|"k]cwmk]:g$G7M +5C{m98vUMd#MAOu{Zw}}Lj^cEQDK{y-mƐi $|Fr׉0/BͧC|ZT1P5#-XpGxIyOBѕ9OB|Z>T'j> UiP5$T'j> UIOBu"$WEI?Ư$T'j;H 86BP5?!97s[ih> UiP5UIOB|Z>T'j> UiP5$T_^'Bj>-P5_̛|Q4w oA|2ɤ_Udžy4xQ4yOˇ$T'j>P57̓ ;#9D|j~0̣i[4j+H 85̻g44tHj>m-*D_^($T'j>-TtHj> Ui3+pj>9IJ[QiP5$T0Or4?\i+i{u"\v&uP5UOBؑp,8#m*I;+m OB?|Vk~0̣i> U+mEͧC#9D.diu[UIYih_|XpG?$T͟|mnJ۬OB0$T'j>-.:BR'L_7mN#zwX8ofi/$ OFj{;G#*qG⺖1f՞Vq)N?S!_g\͝7Bοy|ڮ~PbxnT7)$_v7c7,B./ _5?+_.q^N;YN/i}:uWO" mlSxKm\,BJ'LP5UfMI?#^#tTj> UIOˇ$T'j> 擸OB|zm?f0T'j> U<25ngViP5?4 j>mj> Uo!C'Vk>-P5#O041̣jH 8^1B|j> UIO$T'j>m?D͟I|j`'WIO0ςHf}D+m5ͧC|G#hJ,iǂ#8+FH`aEI4UIOB|u0OP5aUIOB|ZBH^•Q4J[M;<.Gp/#-XpGxYOB|Z>T (O @|Z`mnT]i;9|P5rvnT'jBH^•j> UIOˇaEɱawؑp,8#dIIXij>- h}P5Vӄٚy4SMY UK>M"6ߵ>^7k]|,k]cu#6ߵwm뜑"6ߵ>^7k]|,k]cu#6ߵwm뜑"6ߵ>^7k]|a;_ p9s +euiW18V8k~quNn\Źϻ ޵]x}DBOs]Õq[u#)OWx^pc_87ͱ)'ntde]U16ZNf;Y~)i*,fH"xr[EN!֫ۅ UIOBwڑ!dh> UiwT5$TͧC|Zzy'?-gB²5yOB|OjOCf4"OB|j> UI;#8#=B|GQ|OB|O^2q'j> UiP5\I9BUaMIO|?6̳B&ZN h?99y hOBޓ|ͧe/&i~›Oˇ$T'j>-?gP|T"dj> UiP5?4y y#9#8BUu:|J|Gi05OBc!YySXj~gG|'򤔛i'UG"OB|j> UIO_Ďa?&k~gaUI?N<ͧC0O|B%ySX?VڪOˇaE#9-ځ|?r˓/sFZIEaj> UIYihcGwޑ!dSUIOBZ&T'j$ԧBvDPzT }P56_[Mi'UG"6ߵ>:7Fpmk},8#|y6?hǵIP!_.[릾qնnp8)FkJimCڬrgQVFf4mY^lv8j1nźDbSuzl/[?^@v*F\i!̟=RQ6텨Wu՜/8r_cPi/~an"ա.˕UqTю#D$P5UIOB|Z>T#$XT'j> UϪP57|[  P5޼ +OB7ڑ|]Xx'P5$T'j> Ug~D# p,P5yOB|Ͻ&e{j0XI|P57/GiP5ّ|]Xzˇ$T'j>m?yT͟rv$Gp7yOˇ$T'j>=P5ɚblͧC0OO3UP5?4o}v$_!CiP5UIOB|z- #P5?Xii~wG|+m5ͧ/fGrGx3I+pj> UiP53̣h>92̓J[MiÕ?TB*|'j~gaUIOBڑ|]Xx1d'j> UiP53̣h>92̓Kّ<̨mVT'jc|?2̓$T̟=VB|P5?5[)CP5##c$ٚ hOBJ[UiP5d'O}GrGx3YOˇ0$TU5?4$Tc!h+msvj~5[9E;P5#wmGpQ[I]o;4ߵuFpmk},8#$Yk]:ǂwm ,k]c!͚>,ߵB*6ׅ_J[6ߵ-ώ#6ߵ>$wmkرĵuGH?#&)e:7J?Ƹ.e~TͰٟΛ!nlOũZY9?p˦lK~^R2͛bU7zxnj\sï֛}1ؖ4q(.զa}j~uYl =R]R'_8)n8W}yyۜ8CqnƉWǬc{n<^7BR揭|j> UIK#8·GH^o^P5yOˇ$T'=)ϑ5$TͧC|P59;#qnHOB| UiP5#9GHN|Z>Ty4'j>m<D'j> UiI±iOB|Z>T!9R't53̣h> UiP5?՛\~;#qnL'j>-P5|K#8WEi#0OP5?[8>1̣j> UI; )ϑ4?9|Q4Syz#9GH5?yD'j> UeGZ0r,i>-P5?-?yT'j)ϑ4J[QiP5<*w$GxE;P5$TהּU41̣j> U_}GZ0qhur4?Xii>-v h> UGVi> U},GHV Wk`'WI[i0c/\؎oAӄ|OB|揬4jH 8af3OB`aEI4no$T OB|ݕ,lGr7|XpGH\|/X|6¯|XpGH|6Yǂk]cGpmk},8#djk]c!9k]K j>|籐ɵ ǂ#$DȾRN= +;e|*q&]VĹ>KT֫fs1˺ícw^؎8c+8q8K}sݴγݯV~p8^8bS벌ES[S3q''`H?7/ٵWSH qn5coo6?A>mn7(Wsuiq;Aޛ2ŗx,,fGr ?? +K|?TU'j> Ui ڑ0BP5UI +K|mj> UI!;#{<{? $TͧC|P59;#8WF4yOˇ]a9OB|?"4>&'QIOB|z U#9GHZ|Z>T'j> UP5#9#|a (OB|Ty4>BZ$ͧC0$T'j>-?Qv$Gp/6ˇ$T'j>-wy'džydG}UiP51̣j> UI)')MsGr $TͧϾfn4#TdEN@|wW +|8R׎o!L|Ͼ&u.TأH_!2|j~8#i> U+mU'jw6hP5UIx^̎o!hg +pjarvj~0̣iأH_!a.T'j> UiP5$Tͧ 0iǂ!hwy'j~V|Z>T'jkH5ߵ_wmG(w|6"6ߵ>>U$ +p]|Gp/|XpmkoafIFюk]5\| |XprltmkwmGHow&(܎1Nc +brzλiE{r9nÐ~՞4g]7x%c;#8B7KSSEQv{'!7<ƈngJmful>݉p#d}j~%ʹI4yiwFH^^77TWUau>sUק2N?֛V@q.*DVחMӽycRyyv$GxP56UiP5$T_؎aDIOB|Z>Ty4'j~|#!wؑp,|c;j> UIOˇ$T'SV-fGrpxOB|j> UI!1BDIOB|j> UHfc#$-j> UIO|?~#9G8=TͧC|P5Ua߸#9#$FH| UIQ52m?5SU"#-X3*h>mj> UIH:P5?yT'j/ۑ#OB`T'jJ[Juv av$Tﭴ`G|_f#9GHZ UIOByOB_#9#1\iaEIPP5?u*o#-X +UIOB|Z>Ty4'/[̎o!hwy'j~V|Z>T_p|OBHm~^T (O Îc;#$[kgaUIOB|ZtKU +0bv$GxwmGwm͏Te,hGr|Xp|XwmGҵ?fL5hǵww|Xp|X3;6awFlKsA"賨U]ljMq,S7!}}ާp*VeM"xfg.'?8z`X؎ "h 󶪚7XeW ƿߞ).s9u~US8fc N;?!i ƍ͹8u{Drx]><"X_M=2$_5뛣$W%|1;#ٚOB| UI3łv$GXx 'j> UiP5UIOBwڑp,IK0$'j>=P5FCّWDA|P5UIOBH3Oˇ$T'j>mP5#-X'j> UIOˇ$T'~Eޙ$(dIxoa6E/J@hp? $ޢ?2ʴ $1I{T h?UVͿD6+>@ZZxsN[P5b_]iP5$T_΁#F|?wڊ4< ;<#tw*Q5*<ͧCWjdʌwG0}mii>-P5GOB|P5?gaGXxCN[ET (?hN[M{<9H;"dizm/t-x6k}-|F|_ ![6k*Nq}$O]]43/՝>js9aT;<}}>qs]r']M߂yi?K5g'C6UoR9jk!KiP5UIOBwX4y yό`8M4$TͧC|P5."Lܜ$TͧCl^P56vNGXzIIO$T'j~Hr4#|fQh?$T'j> UiP5~ -`-,,Bb~P56UiP5ι?#, UIOˇaM8<‡FUͧC0OP5a#m6C0$TͧC0$T͟ÁgP51̣j> UIOˇG4G?|'6$T'j8QiP5UIOB|Z>T/HaNU{;m OB|_N ͟>3Bwm>R4ik|Z>T'j(BP56_T (?N|47̣h? j> UIO} FVT'j$P5j> U=H3#LV< ij>-P5|{D̢OBз`H}P5K8<#xmZXp|_ ^k#"xmZXp|_ ^k#"xmZXp|_ ^k#^ka6k}-,2{m{m%G|^F܎ V;I\sYqmQ}U!tq^}ͱ؜.K1Et(Wy -`-|oY`޺O _fuYjrQwdx'u'c MlDI%p)9ik#=G>|j> UI?5/w<E| Uioi> UIyIւGE0T'j> UiP5yjgH X 3 i> UiP5ۚ|P5fyH X _4|P5?-yOˇ$T'1zi>ւGFP57̣h>i>mj~g;G?@ZZO 'j> Uc[L4oׂG":a Oa|| $T O>ys -`-xh,ͧC|Z>T i> UiP57̣hgH X &hcG|懶ei>-wy4'G,<ik{#XFms4V۴P5A9H X !A|?vڪ4$Tͧ +8!x74V0=v'j>-P5ׂGȋ`U4vͧC|P5NւGH)lGuj> UiP53̣i> U?9H X 3]OB@Fy5?yp -`-|o\Q4jy'jcƧ OB|40ikaFLA|Gߝsvj> UI?ik{#5V|Z>T|E֧0hyik#ĘA6kf>j^25k6k#Ę{mo-(B{m/x-|oQIŬ^kaQ$|_ZQ[oX ! ED֖{mFzmZ/`ykkr;44թzoCj(V]bҺlejF_F$~4jۥ)N&غUz\l+7{Uw{Um{=se_c,[EFT>75Nޮcl&p:٬r?$/ӡ*fԗS!L9bqGoj>mP5$TͧC92mP5$TͧC;<¯#OB| UIOH X !1jk$P5owP5$Tik#:0AIOB|5j> UI#|G7¨OB|j~gG|@ZZQ[0$T͏;4UIOBH X &<34UIO>.i>-y~\$ OaUIOB|Z>T'jH X !#C/?Fh>T;gh>mjsV|_ &<ͧC0 46Uis$24yOB\U49#jH X !C7XwB$T4?3ik#:B]qaP5U;jOBp+`.GP5V|Z>T.T57aiFH^]#H?0E;mP5$T;H X  j> UIOˇ$T͟˳#|E7¤Fj>+ځ|OB|`.ځoQ4GmE;P53̣i> U?@ZZQUM|,,w·j__bܜbk`@_Z7yHd/8^-NK=@Im'9}OwƙF+eY]bR]7e5W9 7涜z+Eyq)# #ߝ/Z=ժO _܄lߤ']n;/@_r+,GIOˇ$T'j>m^"hq[x>˜{QIOBG6ͧC|P5#AD'j> UiP5$T_ԁ"$'j>m'Hi'j> Ut -`-sz_1|OB靶FͧC|P5ׂGXJˮP5$T''ROB%H;"n $q>a<'jɮaEI?ika 0YIQ56SIOˇaH X s"XFm-Oˇ$T'jdU<@oi~gG|HOˇat˜iOB| U'z0Q4?=9oG^́#o4|4 U;_9i>-P59;pj> U=OˇaE/wH+"XXvv@|rB{T'jDž94|Q4jgH X s"d@0wgOj~y1G^&#H^>'{m`^i^Y "xmZ^sz/^ s"xmZ^^k#|N|_ XlqUcP|::@U-e>LNďȜox1.@]OZ]Nqu!1~7W?9}s~s[b]%é}Tee}^'G#L jk 벾w\q_zt;L'aSܟu<66I.@L|t|OB#i>mj\E0\]D'j|j> UI?ik#|NS'$TͧC|P5P#x2ѹ$TͧC#iOBm|͟ہ4&ͧC|?|j> U?@ZZ:VW5$TͧC|Gꑗs y@P5|OB|@],'j>-?4yOoa*QP53̣i> UiP5UC<9 U UIyA|P5UIOB|Z"$A|20̓WUi6\OBHs,ځ$T'j`mwy4.o_!40̓$TU41̣j> Up y@&q޴P5?FQUIiv#Ub&T OB|jG i>-P5?yT͟<^kk6ׂG^-{m^߹6k}-xO^k#4{mw|_ "xmZ/^kk6ׂG^edFN9Hfsܔ8OjS7}bR ;ޝs y|\h| UIzw^́"BsS{T'j>mP5$~sZ ٚOB|P5 OB|Z~{-P5?|T (O>.ÁIkIbJ|j$E'j>9v>ւGXb ͧC|Z>T͟ +3k> UP5#|E7~j~gG|j>->.ÁIkRB|P56UւGXbAIOîl'j> U#|E7KOB|Z>THOBm|OZ Hlii~oG|P5UI?Ga֮$T'j>-y' U'x|IkIP5U{YU<,4 T'jUiP5$:O} Mq/ߍ h> UiP5$T'j>-I#x7E9= UIOˇQ[AI?ٮ;<#OB|jh9WIOOOgHS_. Q'j> UiP5$TͧC|?z#Lj> UIO|OBKs@ Mj> UIOB0$TOɵ`wy4'j>mj~oG|I#x!|4y4? ;<# l>cY#P5yQ5jY?q-dj~'|4yOˇ$TꓪG"YIOˇ$T'j>-?0s$Ni~g|OB|vivZ5Ǯ$TͧC|P56_<>sR_D|v*5݅HaCP5y'j~gN,,K|'j~oaUIOB|k"twi> UIihcG݅v_΁P5|Q4 4'UG } M`=#d@|P5V0$TGV|Z>T'j> U;m>M?#,={mo;z"xmZ^6kgQի'/Y.v;3N#,jH_se!OlNۛjXݹs]r&PM{-b`kv'9:jn/yik#(BG6H4-OB|P5UɌ- ?hP5$TU5$T3N#45$TͧC|P5?=jk|}^A<͏4UIOB| +1TͷߜOD͏Fh>-?!|P56UMIYgT=GP#FmOˇ$T'j>=P5zik#(IMyyO||24 <Ij> UIv0 U}-xG|oxx4y4?4 <"(|-y'<6ͧC|ZwH X E,5|OB|-? (<#-<򡭦$TU5U<‹"X>|w +5$TIw&4jfT hOBwh>-y͟i'Ustomwy4'jcaMION;@ZZ/`ځ$TU41̣j> Us>{gbZ9#iB|Z>T hN[E;mUͧwfi~i'Uf'j>-P5|4ւGxQ|?y6k<#dk>^^k6?[6k<#xmZ^^9gT=G|>"{m~zk6O#xmwy5ׂGx{mMkmuuӔa}/1l}ixed^TǪ,DIV9ٞ4iͦ=BD&ĺQ]bM}>Djo7I\ʢ>n(TYW.wUqJQXٌfq#r}g$5JBl8[YH X !MmaP5UIOB|Z>T'j>_kP5UIkx6i>-P5x)[yF#$"HOB| Ui/i> UIO$T5-7--wy$͟j>m~F#szOˇ$T'j>-wy4' UiP5<3ik#"di> U;;m5SU4?5[9ii>-P5 X4V0OP5VDž$T_#xMiOBЄd?yT'j> U-y' UIihcGa.T'j~E;>#yvj~oGpݙЧ UiP5} -`-x46k6k?z{=ou?o" r_Tqnmِ>6uhpB6DK%y>7yH X E&Gj> UiP5$TͧC|Z>T'j> UiP5ܧ$TͧC|2j;_xF#X}l'jz!$T'j<mP5yOˇ$T'j>=P5yS5$TO&5H#|s_ 7-T'j~z|OB><‹"Xڻ hOB|Tik#(Y Oˇ$T'j>-wy4'T (OB-?Reہ UxF#.344wy4'jcq -`-xE*@|w +Q5 IEmܢOBN[OO՝eiB0$T5UIOr.hH#|sa8̓ݧ9u\cM@|7?Ł^k6k6sH#|s|_ 6k6k?<7G|^k6k6sH#|s|_ 6k6k?<7G|^!2qaj)΢W8v WaO6<Źo6#/m}y0dZ|,vUlCtiUNttߞs:PRlr":OCQ\OcTgb MΩl4X#xa9nؾ3Vw]}>WEݵcx}=%id*V˛?KDz-=$T'j~DmOB|j>-?6~F#(¤P5yOB|P5>Giaö~OB| U' ۭOB|d;OiP5$TJig$<‹"$5UIOB|Z>T'j> U?@_!1-lnj/}U'j> UP5\ͧC04|OB靶~F#(YIQ5$jhg9GżٚOaEIOB|Z>TOB| UIQ5|g$<‹"dk> UiP51̣j> UIY΁"¤@|j~oG|20cN[Mi㝶F'j> UiP5$TU4v3G5;m4$T|P59GIGF4j~`'OI?iaEIi+i>-b^UIg$<«"twjQ4j> U y`. @|?vڪ4ϝj~oG|O iB|#x#|Q4 @|Zhmn$6k6k?ushSˈ9DP!Nqʅ؞fv@tXQ6ձ*'}= ,\7M?C%HcSKMne]s{׶{a˨mDF6Ӧ,Itwq[6[\W70t<8Ӿ Kͩv.@T/i> UiP5UIOBQPP5 O|OB|#xQ['?]aP5|OBH;"XP5$TͧC|P5?Ma)ͧC|P56UIOB|?#y~2jk|Z>T'j> UiP5U{ y`|j> UIOˇaM')̪Oˇ$T'j>-y6#xayO||j$5$T OB|jh'W'OaMIO|#Q[MIOaIIOBH+"j:P5?yT'j> U<揚s5|4\)^ U;m4$TU41̣j> Uj> UC-U^!{m``^^/aOա(W&sq!}ҡza^q+xlOq^i}be>TNti;ocK|Ҿ#moKI6U{pwK3GF0ڮ\[XMq9Kũ(Źߜ몺']ns~dxkxe<9ES9<#X2j> UͧC|P5;P5|OB|#x"XoUIOB|Z>T'j~z!K?@`| +TͧC`m~P5UIOB| UiP5~F#y擸OB|>:Oj>-w$#>BP56U{ Uy?|P51̣j:7k> U<9<#HOB|j~oG|24c|lŇ,͇Lj> UIX yg$<«#Xjs:P5x?<[I#>TіM;T di~kLo + 4UIl3GFvކy'j~gUI?#>TVj~gG|?vڪ4?5[Y ++ځaA@i^T (l3GF@0d`'h- Ha&$'j>-Tց$TͧfK|r<̓YUiP5$TͧC0T h}̬i|$0^^sF# {m`:\6k6k=G3^k#X^^#xD|||AtlMq%;Sg[/'ynq1{0tv^W\lKUl}9\SDj-WӋ <_FN,d9wͳh~iOcCsS|'}Z{Uc*6:~}>5瓅)o^8#J7^0E՟ߍ$.j~瞪$TͧC|P5E'{OB|j> Ur8G3Gi>-?Y?$T'j>mP5#d} wEZ^ps$ۙD'j> UiP5$TͧngO5{G&R>_Tj> UiP0h#e} & ~0 ne/L8}hǤN[IiB\OBN,͏5i> U;m59#jD]IOˇd^m~4#x0v*Q5jh#e} Yaܜ4?e/${e/xm{m#y^^L<˙sM{\o+Ӧl)/UѬcD.ͺ=` lK1|jMZnљW _H#2$Ŭ$h!oe q݊ |R:wctT˶$Tͧ#$9Wm ͧC|Z>T'j> UP5$TͧC|P5}|OBwg擩yphG?sO}o|P5ӚOˇ$T7糯25SP5$TOGL P56UIOB|擓ż)'j> UiP5\'j> UΙON} i;1~钽%~\$TͧC|OT5'ޜϾ^5ȹOB|Z~|0jtn$T'j>-y'C<&͟,j>-P5|x_P5y|w5984#|waG|Z7O|P5U%OBO9m,'j>91k~|.'M?zO]Dy4'j>mj~h'KGżOaEIO|OB|ngy#$9̓$TͿ U?漨’w +?yICY j@%ORiP53̣i> U;mUH,5U UiP57̣h>i~aQ?|qYIOˏ˶an0H^8R5KP5UIOB|Z>THOy2vj>-P5|4TyfH <2v,9:oٞ ic||vjy{<5q(ڱ D&j~#TMj'[IihcG|?wڊOˇaOvk~gG|?vڪOO;;mɎAӌ-gx&wB|vTk~gG|?vڪ ^^^<6k6kLpʬ^^y# ^^^^<6k6k6k6k6;{m{m{m{m/RtT&:V)bC{U\[/4q{8Em8YC_j:#lO镸?X\usL~}izyDtWK`s_'}Boh ۋA'~_$~_ 3(I3{徜/gZz":O,[fgMgaǺ<4q}mΛ纾Lc?/{#^NߚdJezz;P|P5UIOB| UIOˇ$T'j>-P5yOˇ$T'j>-?8c|P5Y~[l' &ͧC|Hj>-P5xٚO$T'j>mj> UI9o'T'j> UI[ P5<#Y4$TͧC|P5?8̓|OB_̚~_ws>z!KIOO`KP5yOB|P5m<#|Q4y47sy[51j> Um5HOB)Gmj> UIOˇaE756UiP5dӠ4xO>y25zШyQ5$TͧCQ3OP5H39=.sn2]eʇ$T'jcG|Ss׫C0Ͽ9}ʇ$T0$T|Z>TyNU;;m5 (N[AWaQㅙOBN[A-y'<E;P5 *dh> UiP5$Tk0S4 #T &'j~wɲP5?6OIOBvs>z!O?yD'<}P5UGT>MoI$TU5UIOBN[OP5V|Z>T'j~w_i~7糯FO>y>T YQ43RNT'j~g}mP5og_/xm{m{mcgR2"^zs>^^^3Ijgdm޿vzk6k6k6k6k_|`0"{m{m{m{mk_{o5"{m~`gw9D0$~nͳ8;}2y}0{8o 4 <[6_2~{KjdqV݉>Z'[m+2c-X{{:=W%>^m=&×v wƏі<;&/NiUV$O\xEپ3),Д}bRl. 2DIU}zI[[ '2XFs'O"<L禾yr_q=Bɀ.!vjyd%/!?Y,ϓSo9 KŮm?nMdCU4!=owm0'}a 7׿!#O4_dޛ'i>6h> UBGh|Ág?I|Z>T'j> UZm͚?\ ٚOb%j> UP5OX5$T'j> UIOB|z~zP5d.jo"UiP5UI^0h>-P5ɘP56j> Uɗݜ|{34U[Bi5yOB|[m5P5yOBfjh'WizP5yOB|P5U7_/5UI?9yDP5Û/^|=<ٚl|C=r\iVۈP51,dk>91k> U`'SIoI{0j~N(j> UIO$TͧC0 9OB|aLai08?=̓UФ㫶L'jp0$T'j>-wy$'j>m+Q{G|r8̓=>5 c6x0sGFHq} j~gG|24c\/TaQIOB|Z>T (Oy,vzKc &O*~f؁ik|P5o] 4ɢy'C<&O"15k~9OíOˇaEIi+i>-懇ydmb4?a.T͟wfksGOG0i> UiP5?4̓^0$TU5U UIo] Ýf'jV|Zcm懆y4",ځaM_Qj~T'j~wa?ik܁$h'w$vj'Nh,'j> U7%׮NUiP53̣i> U;mU p>T4φy̚vrG`'[I_Z46[WIWmB&TͧC|ւhwy4͟ U;mUͧwfiB|`mfNh'hǺMur]i;9cF4$T 0Ov&TͧC|P5.`0d`57糇y559K||?i+izm^^axm{m{mrs>{Ǹk6|||||7nS5kumr{m35ksy6?k6k6kdG|{mdkWm^^^^zm{m~vm0' Mq)It()"ibI~ +)..I fksXΓ&?q,?N~کlO^he'/Ou{ :Owrp<.1~.kϧsk(ׇ~7M\vkDIOwE؟% Nn\&/83 +7 Kg?x1O^~?'7MU,qd{oM1B9M^ϏrnDɘi׮>'?# UcO&'j> U)P5UI`lg/TjP51^z!T'-Wm/9}㼨$T';^/dj> UiP5$TͧC#CI_Z4M_ߜ0|FBYw5Duj F_0T'.<?``~զi> Uז|Z>T'j> U7swgIC4?v[wM*h> Us^ [^v|P5|&j> UIOˇ$T'j>-?sT!h> Uzs>;¯og|0ßBwdjC jgmf'j~@|9̓OOmGJm%*$'j>-'a25ws^|BnIC_|gۢ U{%7s9m_ps^|j> UIOaUC;gi>9}7/aO]/|.vqnhfۤݝy'j>KƿяC`&[ZlWڿ0pǬ-sSmP5)Nj~0OjV|S^xg;SsvFGSw_ps^7{Wm/|N[P5V|Z~dف UIi\͟g|lz7'`QC3YOB|Z~!)h> U;m%ͧwwfi>9 +3k~|9gL_Hjp'[ߚݝj> Ud۬a-:OB5ִ߲w nK<ޜ%{owfj>i)LN@|rz-wvvj}OJz>UmܢOBN[M<'a'??,YUgdN۬C/.yϽ9?\twk~wG5UI˓UU{<擡a0"^ai+j^^^o9=c|k6k*^a?i;yyk6k6kLk6k6kp<vzA|͏G09ym{mjkK|ͷEa?i;y j{mf{m揇y4_9/]xm~tZk6j7&'Ju01 V"/)lie/n&id"~Xt&c6/OtiJ3Џ4^۵W5Ia~{naڗ.asS1x|8)b,B$"Eéh<vE&O68Ĺjb'/Xw`|j>D:1"#͹N;?DBT'j> UiP5$T͏ɶIIOB|J P5?&&'j> UIqww^ OI'j~j| Ub.oyo9o"T͏LOOjԔk![WS5DO)/9/i>K`=&摒OB|j>-P5yOBlgi>I75?ts>ɛ&v4?$YOB P5pix_ P5?u#$TT34$O35eFfUW UIO˷`$e[=դ5/CayIc7糇y$N$yR駐 ϼٜ0a-$'j j~*h>1h` +P5e}&uT'C<&}♫|T'j>-y'jeä϶ag3 :39<ɛܜ4?v 4?S|tsxi>=wy4Mgi>mj~x'Cm$S1xR͛l/¤ִ7?N je;CI4_9=cځxJ C';pj> U;mEͧC0 r;m'fk~xf[I d|Z\;m',͟)5 OMTHOBN[USIϿ]*Ÿ^0i>9}mvdi>91`/ځaIIi+j>-֬!|mx?h槆yvJX iߜ4)yGO![I9=̣i>91k> UiP5$Tͧ>w6dxe̚';m>͜B<GuYcfa>ͩvz!K5iaI'4j>-?4UUI?i]͓4xs>[bvr${?4#|2oGi͏}`)$`v>y25?cm|4? C|v*Q5ϝvҟ'tjy3Eps>{e?O{mT>MO~` |{m'"xm"Nh{m{m>^^?O{m^^z| i|nRi;9#|͏0xm36k{s>{'xk6kC0g|Ok ;p6k7~_i0{m{mwzm jf +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000113 00000 n +0000000178 00000 n +0000000224 00000 n +0000000359 00000 n +0000000547 00000 n +0000000281 00000 n +trailer +<< +/Size 8 +/Root 2 0 R +/Info 1 0 R +>> +startxref +54685 +%%EOF diff --git a/top_mma/res/res_60.pdf b/top_mma/res/res_60.pdf new file mode 100755 index 0000000..66d45d6 --- /dev/null +++ b/top_mma/res/res_60.pdf @@ -0,0 +1,145 @@ +%PDF-1.2 +% +1 0 obj +<< +/Creator (GKS) +/CreationDate (D:20220504164517) +/Producer (GKS 5 PDF driver) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 4 0 R +/Outlines 3 0 R +>> +endobj +3 0 obj +<< +/Type /Outlines +/Count 0 +>> +endobj +4 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +7 0 obj +<< +/Length 12 +/Filter/ASCIIHexDecode +>> +stream +000000ffffff +endstream +5 0 obj +<< +/Type /Page +/Parent 4 0 R +/Resources << /Font << >> +/ExtGState << +/GS255 << /CA 1 /ca 1 >> +>> +/Pattern << +>> +/XObject << +>> +>> +/MediaBox [0 0 400 200] +/Contents 6 0 R +>> +endobj +6 0 obj +<< +/Length 50943 +/Filter [/FlateDecode] +>> +stream +x͒ڜ7ϫctbOK@c _AZYUq< pw%ed7߹;[?7ps?/_Ɵgw旺`w>Mߟ?/??o)?_C_oϿoϿ.;:F|?h^628؝YN.1|i=B`y*Cf~ʻt} UiP5$T'j> UIOB|Z>T'j> U#@#doys^|g_UIdP5-$T'=St,~^/TFE^B|÷(ͧC|P5|OB|q5$T'j> UIosG#dxs>zap'RIOB|5̓0Ϭg_UYc"Čz}M OB|j~gG|j>-P5xOB|jsG|k#8Bbo'_/uj>|-wy'j>mwy'j> UiP5$TͧC|k#8Bdo'_/DT'1|+J[A0Oah﮴4+m'P_[iWFkX$f/<#W>Wڦj~wG|VڊOﯴ|P5U;-6VIOB|k#8Lo'_/$#jpmbT'1|+K*ځYo'YTvJ䖠EޜO扊 igbTͧWFk> UI_iaIIZi+jj0OP56U; U+m%ͧClЧWN^/eZ[i?vz!5d;rSӄɚ5$TͧC0$TU5=#i> U+mUͧC0[8 +4>;B7瓯\/j>|g vz!Zl'6ߵwm4>:B7Sd']|6ߵwG9/iVֵ͗4?_ vr4ߵwmkybo'_/6]z3s:wmy~s"$6ߵwm'i#|vlƑ'aƉ0ٛ7cHܜlD|}on/bV5?߈8Y^}fy>_D8ƀQ1(/P/84$A#"]#E2jIb1jU[T?6c+ߵk)7cpD]ba3,K ^r;pew{&;F㶹h÷6\z^=i4?nsՐs~:pF<^\m8R]lH7k]a\W/䱾4Ck#8T,Rd;j>96B󇷅5?͋|P5UIOb$,7GT'$5V*FS$͟^i$TͧC|P5UIOB|mj> U1eP5SO|cHII?zs>OQ?\i$T'j> UIOB|Z>T'j> UiP5$T'j>-P5ߚЋ?=̓83=̓c $4~j~gG|j~weP5,F}0Oē5[K2GQ0dSq :aD'j>m濆yD'j> UiP5$TͧC0`'ViP5Z|k#8ƒaa?#j|j> UIO˟o͇$T͏/))lh> U;C7瓯&+$͏[85Dk> UiP57̓$T'jsG|P5U;B&͏_i;9#jsy5rOy5x4?h'4W[i;9̓x'LBNU|O0O +ܸHP58ͧC0$To4UIOBIOB|wV*Q5X5LI^i;3Bsy5ʑ4j> UIOBltЧ4f04? ޜO4&AUQ+pJ녤W$+pj> U[+m5ͧC0$To4;#h> U+m%ͧC|P5V7csG5?}ǵwmk0k5ߵwmh#|vL^iwm~wm]/6_|6ߵ|6ߵ_9gGԕnhopR5>;B_4$T9OB|P5$T'j>-P5?J| UK0"4Us#]j> UI?S}tP5X8Y[j> UIOB|P5y~w\/L>V|rB05UIOB| U9繑*EIOˇ$T'T4|*+?!EIOˇ$T͟(| UIO$T'j>mP5y4?IܜO N@ | UP5S'A|P5U&a4?ݜO|P5A|j>-y54$TͧC|P56U<'h#|v9 7瓇yb|̘o5QC_T'j>m'y'j~3NiP5;#h>96yOˇ$T'j>-YvsώJDa(͏yf +\OB@=rj~gG|rd'NãOˇՅɚOB|;BP5Wy4{fVڦk~kGz4U5UGy4|6A+m% k>J[A0vOvb0W5'h淇y$'j`[tcy#WB|Vڊ4ϕj~gG|Q#OB,ps>yG`&i> UiP55̣i> U+mUo h?қiB|Z>Tz<ɚO$@|rlmRN'yj'h'*B%ڧ UJdo h?5ؖܧ9|,obZT'j>-淇y$';BP5U 'i> UP5$Tͧ;j> UIO$T'j> UiP5$Tq4'jT'LP5-ۚ揵T%i>-P5yi> UG#i> UiP5$T_9gGP5$To/4$TͧC|wn+_P5$TͧC|P56UiP5-G4U0ɚOBޜ2z!$'j>-P53R\C|j>-P5M-0I|ǞiaMIOB|Zlh>43@|Z>To hOB|=wy'j>mj0O7瓇y_4b*^I5䙨3<1Oyx UP5n ty6^5| $j3m46?Ly k> Ue;RyBWP5|4y4l$i> UiP53̣h> UiP58̓7瓇ybDw˟Z0t'j>w65jIP59̣j> UIOw.T#L90OwW +=yDo?Vgk>-P5(ۉ5J8'j> UiP5$TͧCSkG|r8Ӛ$T'jkG_ њOˇ$T'/ UI5xOUx.3դ镶+pjm~eh~ |OB|Z>T^x +?$i-ă4+mSvj> Ui핶R&T_9gG|6ߵwmkfv\|濭9gGHֵwmk] IE;wmkmTwmk]|6OӵwmM~ B6ֵwmk]|Qb?6Uh*S7;8)LܟCyb_yZ6#zo]C]Ys}%PsDroDkcwM ߺs{?m5g2T4/E(#o2m{D{/o΍f5RUTusQʛ 1|㲿ͥn/7宺NSY+ϗDF6e>o~F<^Ƹ+qٞEr!yp:ܯBܝvE7ܞa' gv}U7ec پLpsw T8[|;&p֫t ]S<T'j> UiP5=R%i> UiP5UIOB|Z>T'j~_5?|-T'j> UT4$TͧCg$T'j5o߈0 P5UJtw 'k>}'HOB P5$T'j> UIOˇ$T'j>=P5yOˇ$T^H|P5$T͏y8rWP5 OAIVi +L!VkG|P5U;-y5yQ5$TOB|j~kG|j>;$A^/OB|Z>Tz8r܇C9#j>I|j> Uy+0UGFXͧc33Uɱa(ͧC|Z>T'j~l5L46Ui_tj> UP5$T949̣j> UIOˇ$T'j~H4?ug򷁪yOˇcTI|Vڦk~kG4v &j> U#"[ UI^i+i>-P5?8y5ݕ?yT'jl'i~0WP5ϕ淇y$'j~{um1Q4핶濡TT͟^XUIW$iE;P5;#h~t.h+mSvj> UiP5$T͏xY79?#ے D@|P5?h>T'džyv&-MKmdžyvj~4+Oj0ԧ U+m>MOBJ[MiP5產|rCa>M5_G}4jdIujTo hOBy+0UGF6wmk]wmk][:7"6ߵtmk]k]h +Li~J[6ߵwmk]VSuoDpmkc4}s޵wmk]|/BV`wm~擮wmk]m6ߵoy+0UGF쳫ܓhoes 2;6y46,|%oOF@1dsrl *F4Gfl?X17&8TݸTukc{ᦾ]=yX5uyx`HcvLaNwnuA6)YsqE74WGU9˱7\73<÷n<E]Ua\]xro#U'/fgW迵OyɏK mf|7W<1漟ci÷spCi6]s~:peUQWyԻNԭ.NhsGP5$ToKOB|j~[$SfŘHK=ٿTOB|j~ɚOB| UIOˇ$T'j>-P5yOˇ$T'jZ>aP5$TͧC|P5|cus~M|eɚO} $TͧC|Z>T'j> UiP5$T'j> UIOB|Z>T'j> UP5$T_G#,=Bj>-P53#t:mwy'j> UiP5$TͧC0$T'j~{G|P5U[T'j>[>~'·n'$N |0 0OP5UIOB|Z>T (OB|T'G&a4?1[1+pjho43XvzAܑW&kp'QI_iaMI\ij>-wy'j~kaEI^i+i~5|j> UJ[E{abWBI4>f+hw"(OB>~-¯^5jGJğ.ځ$T'j>-+pj> U+mUͧC|P5U;-P5?4Tc#Jۙԕ;\I|M?VӄdgGӄ|?~em +\6ߵ']|:;3k]c"JĢ6ߵwmkk]c'"J[Oӵwmk]|:;k]c'"J[QH?ֵwmk]KhsGS3 o窬0ǢxnsU9]#xޗaHtߚ_ݜ6E7悠l>o"XUyUw婦/0şHvKN_Hru~bqyv]t~|E2|]kV,'V9E7]oE<\.E:Cms>.K˯Sy>׳;wթdq>^,¼]/j]_O_D{Rxw pX0KeTW!4$TͧC|P5NP5s[ǂ#8zǾ"I ZT'j> UiP5$T'j>-&S5xfP5{,:#-󤺂υ0$T'j> UiX'j> Ucf},8#LG;GJ?YFyOˇ$T'j>-P5yW5$TͧC|P5'|.|HXͧC0p'ROˇ$TͯXp3K#dc$T'j>=淆y4'j>mj0OP5U=淆y4!caks +haUIOB|Z7q4h0$T'jkG0OP56Ui_.υj> UI5䙪$TͯOݕɚ߾!ca*6Iɔ' :0Od3kaQ0O|㙦|OBɏXͧC00OWJO˟͛|P5?…TWFVڦi> UI[iaUIOB#XpGWJOˏ)# @|r4hgbuy5?yT|j> UigTE$TﯴM0$T'.\Iu ad|3]IYih~o']Ica,vǞ,P5buaj~ YIYihM|?Wڪ4C0vj~kG zR]gDpmk},8#+m'?]|6ߵ\wmGX{q䧳k]|6ٟ k 6ߵ\|GxwmGX{qm +\6ߵwm#i6ǂ#=6JI6ߵͧ6%B#oܐ2nH7^uRgzƦ8^.3'uJn0gCY]gx(.*SQ\b5zeSE4A42eu>F`<#=SHk]~MUnz sնHHQOB|j> UI?9jo#XpGp`B+d'j> UP5|?Rk$T͟v$ToM|{q'j> UiP5u6U},8#8# OB|j> UIOBV$T k>-ӚOBGTjGaͧ$T'j>-{> //Dk>-P5xOB|j~{GfX͟yj`'U?߈EAq?xPxwy'j>m]0Œ ~4JiP53̣h> UIOˇ$T'j>=yR5OB0uFroD\ UG:$4 v.T (OBcW&5H4cVB|rd'N;+m Oy5V0' k> UJ[A?߈XU[<擃aԢOˇ$T']A\iaI0OVUGy4#+m4?̓p'hj> UIu-;>MOˇaOVڦk~kGcz۩a41[Z&To hOBJ[MiP58#iBJ[MiE;aO?#97"6ߵ>;:#!ˊD{p=-\oA|P5UIOB#XpGp!1[Q_Y>T'j> UiP5UIOB|P5q $Wy8;»EvRIOB|T'j> UP5$TͧC|Z>T'j~x*gGxQȳOˇaT'j>=淆y4),gGZ#Bc$'j>m淆y4'j> UiHz<ɚOB|93aUIOB|Z>To#XpGp!nP5$TͧC00OCM/ˇ$T'j>=wyVy8;»EGNfxהּU49̣j> UIiǂ#8#њYihsG|P5!9;I|r3JV&i~wG|?WڪO_!j.T'j> U;+m k> U#XpGp!YIYihsG|tHk~{G&$'j>-淆y4'-P5w "D=f+8UI?Vӄ$TͧC00ORTͧC0ڧ.k]c\̵im\| "6ߵ_/k]Ύn\| "6ߵ_/k]Ύ1iGtߪ6m!ˋy<^ƹ9r|<^qq{9U0SIr x1iu;#8#8Pw<>cLE6&f-wuS ӾxCEO̧#+O ފ6D{c}g!r|U~#^X0Ǣ61|F:sni^W<"DuŒj> UIO$T'jzv$GpGp)¨C| UIj> UIOˇ$T'j~=@r#[Nj> UIOˇ$T_ Eu T'j>=P5xOLi> UIOˇ$T͟^ -BT'Lj~gG|j>-?kۑA (OB|j> UIOty5$T?-BT'LP5U;͉ YَpVӄ$T/+m5=#i䭰ԢOﯴMӄ$TU4j:gGxwmGpGk\|pvw|XpGpwmjgGxwmGpG{\|pvw|XpGpwmjgGXd l÷Uv=(2ͨ|e 7cUlTE͵72o5ǜjv$GpGp?84!^o^YV׬Lӹ8Ty\nM1XgXK}#/bĩ,m9]y.ݐhoOwQk&%ݷvư(Pxz32̕ΎP56UiP5$TͧdGrGpGGH| UP5$T_ǎ0 i> UiP5$T'j>-P5yOˇ$T_K0$R-淇y$'-yR5x4$TͧCeΎiOB|OBJ[A#9#8#9P5V0$T'jsG|P5U<擃aXU5#,2B +JԢO)ځ$T'j2v$GpGp>s:P5#+m4$TהּU45#j> UIOˇaT'jgGXdQ46_ӄ|OBޑZ UIZii>-P5y5$TOBeΎwmGpGpmk]>1k]c~%k]ΎwmGpGwmkWs8;#6ߵ>W"6ߵ_|XpGp_|65#7B;C >]5\p_y?̏a,ݜ6šOtO屪ü3D{ϘHQv=bVᱻ^ UIO$T'j>mP5$Tͧ-͛|P5Y +H0 c4LUI5YiP5UI>+BPIOB|j> UIO$T'jҼY'j> Uq8 ?0EiP53̣h> UiP53̣hrw$GpGQOˇaEɱa(ͧC|Z>T'j> UiP5SK56U<^~vyOˇ$T'j>-+HY46UiP5l'IIOaEIO|N|w)h{+8#98g8C|Vڦj~kG|~E>+$TU5=#i> U+mUͧC0$To4?Xi$T'j{+8#9?.y lZTU5U[-淆y4'9I-ځ|?\:>*paUI?]U!9k]|;»G#4]|GpGwmk]adD|6>&k]|;Š"`u6Wa_*PṟK#C~yu)9;Yegͥ$/+ۑ#̜ת>e SU^hͫ sS %0I6"p[&oڇYziV\KS7Ha~Gtw"XU]one q s:dVNߔ!͕~}E7| +z'q}߈ ]"$j> UP5$TͧC|V#9#8{G=/A|j> UIOB|Z>T'j> U +UiP5$TH.D'j> U<; _g$MI;ByaP5$TͧO0i> UIO|OBWqO$T'jH&l?yT'jZyͧC|aGrGp7$TOBXͧC0OP5U[<|u$TͧC0>#9_szOat͟X$T󨚿$m"L$TͧC|P5d][/qGrGp0sFX UI?6I{OSM|wV*5$TͧC0OP5G<]"̌C|wV*OˏXӁum/iGrGp0sFJ(ځ$To4UIOBJ[A{-wy'džyvj>-6hP5UIOBJ[E ¦y*|Wcx+:ߏl!|hG *|-ü۝8lGrGpa{Ҷjt%/mTmRC>Dzѿ,+x qsmn;E<^}Ynvyut0/q{wb&c"/Nž:ee^wñ;OeU^k=3#,+kyR46UiP5$T_ݎ-SBj~A|P5UIOB|$T'j!P5va UIO|OB|K0BOB|j> U󧮝}Fr%E<#%h>-P5|xRw$GpG{&j>- i> UP5;#h0O`h>-P5y߿va$h>=淇y$'j>mlGrGpaQj> UiP55̣i> UI_YaAɑ>8ͧC|ZDo޼P5|aI%OB|Z>To hOBԼd_ڎ/B<-淆y4'<60?ڛ#}iOB޼x (OB|aI"N#OK+ځ$TͧC|P5);#8#њ?ԢOB|j`'UVFy +\OBJ[QiP53̣hH E;P57̓$TהּU49̣j~/BuiB0$T'jsGJۄ`@0L,ځ@KU +\#6ߵ>wmkowmk]>g$GxwmGpGpmk]9#9Dpmk},8#, UlGrGp_3=|?HBXͧC|Oc;IOB|z UiP5g$GXXNUI?8HͧC|OYَ!ff;^IP5P$TͧCOAiRIOB|j> UI3#,,Bى;T kq*OB0õ<+ۑW"lk> UP59̣j> UI)|c9֯HO˟7U0Oj>-P5Yg$GXX'j>-"j> UG`ikge;#8#Jͬ3$T'j>=P5b5vh͟sP58̓$TͧC0ϊHP5V|Z>T'j~p9RsV#9#8¯DJ[M;-y5I+ځ3"VBڑ+m4w7/]IYihsG|ˊ0yF4j> UIOˇaE#9#8D4tͧCaO懟QPU#WjOΩƬ$TהּU47̓+;#9²"Lwmkg#Wں6ߵI]|T?,B|Ա:N|H:wmT?+Bɵc#ʦk]#ͮumk?Yv\U !(wm~hG.qmk?Y>M6ǂ#8;FZ|H}wmTϘf_1,vz1nӵ(rvyA/:<͡mwy'j> U#9#8B1i> UiP5$TͧC|Zrvo yP5U UiP5$T_Žm|i> UiP5UIOBH:b>KOB|j> U?dGrG|z<淆y4'j>m淆y4'jH:46UiP5Dk> UiP5;#,8BP5UTo 1}[BP5U<ɚOB| UIOˇ$T'j>?lV#9#8B;BP5V0$T'j~]L'5ώcA|?WڪOˇaEI!+,f(P5V0$T_Îmvz4$TהּU49̣j> UG;iH:y)4 js|OBuH᢭>MOB|wV*Q5;#8#ٖ4UIOBZ&T͟),gGֱ0S4UDLJy:RdaEy~6c9,aG0|)z$xq{>\.rޟ_:KS)?Vp#/clK#9‚#$|Ek> Uiky&C|z_ڎ C}㙤$T'joNBiOB|Z>T'j> U?pGrGHhK|Ǯ쁪$T͟d=;#8#hfP5?\_yOB/;; 1k4yOˇ$T! UI?g~~jsGHֳ#9#,-O|, +K|P56U-wy'Gy4o?},"$k> U+m OB|pGrFHhց$TͧC0#9#,\| ȵ<౺F<^Ƹy4gT'jwE~FA|j> UIa;#,>BZAIO|?r7/M?hGrGx#N[uj> UIO$3viq">=T'j> UiP5#9# <淆y4'j>mi;#8;F$TͧC|P5nwxQ4yO*GXih'j>-P5|#D C|P59̣j> U-4޼Y (OB޼ye;#,>BP5V0$T'1q +#Dh>-?C2<UIYihsG|w [I0OOEk>-P5w$GXzJ4'j> U;+mOBHo!A#VB|P5dm=GZ͎1;C|r!IE;P55̣iU#9#WjOˇ$T'j~a >qGrGxҊvj~gG|VjO-Z͎1;@`J}P5U_T}|XpFpmk?Xpmk},8wmGXm636ǂ#|XpFpmk?Xpmk},8wmGXm636ǂ#rW"/Vޅ?KYq88ܸ} +l%oΗMYǰʯ)zܑ~0Bu^:\1L<^(0!lDM 'y܄rw7 gn'Lxa"~S61|̫n .esWnSUmbVm>aN%wlGr0 +UIOB|P5a;#8F5UIl| UH?pGrψ|Z>T'j> UP5#9#`T'j>mwy'j3mi&a$T'j>-׭aܑ3"Di>mwy'j> UiP5;#8F9/5UIOB|Z>T (_n fGZe UiP5#ϴ4W#2BRT?y͟zfr&TͧWJ}+ݑ#"6ߵ>"6ߵ>ߵ>!?pmk},8»Epmk},LFpmk},8Bl6ǂ#[6]| 0E6ǂ#DGpmk},8»Epmk},Lѵ^61|Tkmy*o 盗ifaWv.R[M,¼x#w$Gp859cyVro,".7Y^2 ^XDRV m6Yu(w_ڎ1;9Ru|ߩ r7{oR އc\[Uy0gH~֎ i> UiP5UIOBHq>;*IIOˇ$T'j~=;ByTG9޼DͧOj> UgT_ώp|D5$TͧC|P5;#8BdP5$TͧC|OllGr; ϒw9hC046ZiP5yFR5;#,>B1|yͧC|P5U[<#9#DF| UIQ58Bڣ4U<[m56U<#9# k> U UiP5$TͧC|ru;#8y0yOˇ#N|?hGrGN@|wW +Q5#9#DF4濆yD/ƆyR4ۑ!/C|W&k~kG|ЎP5#+m4#9#qr][BT'j~kaEIvj> UIOˇaM?`GrGH*ځaEIZii>-|GrG6OP5|Q4;##$iB0d'O'H+pW#9#6ߵ>Fpmk},~6ǂ#6ߵ>Gpmk},z6ǂ#|Xp?\| pk]cd6¯Gpmk},8Bt]׼69_D{P:Ll朱3tjv5QΗsyüRW#9#LOzS_̷宺eF|RDs/?բE j>wOYz!#0BP56U_T'j> U#9$TͧC|P5'5/quD|P5U{I|gGrG!x UiP5$T_Ž0$T'j>-!ӚOB|/quDL0$T'j>-P5;#=Bj>-P5|Yَ.m?yT'-wy'Gy46Ui_mGrGH|j~wG|j>-U;#}y?I`k> U#}ގKU4V|Z>TI|G|EA|P5U[ U_<$Tav$T55̣i> U1GZَ+09aUIOB|Z>T'jv$GFj> U[+m5ͧC|ҎKsnVӄ$Tͧ-P5gh~H"EOB|j> UI-B'j>-v^{w5#9#HOBS05}/i> UGEHbqlP5$TͧC|!jἠ$T͟h|Z>T'jGH΢P5r6/ViP55̣iȄdcGr7$TͧC0OP5aHnbU$SQ4jyQ4#v$GXyC0$T'j>-淆y4_oA|P59̣j> UI-B?צj>-P5|Vaj~gaUIOB|Zt1o +eHE[q+pj> U[+m5ͧC|eGr$TﭴM0$T5;#T_!>R +\OByE;P5kؑa\| +]:V!>k]k]"Grmk#6ߵ>V!hǵ_1\|Gwm5G4]U +׵w|XXsA]U +X|;##욣fu}ue%+ab?fs F}&;}S~($/N 4c/3`'}ƝY +u.K 3+"n>\.wr;tc4ۻp IUYhvI*2M=0?ϫH[/p!9WFtו/\Fԟ|M䃺[v'.~uFx=P5$΢v!9F-t 2BD|w| Fj> UGa6Q<<1ͧC|Z>T'jP#eDT'j~;mc_+4[HOO<_ MI/Q5 FN@iP5LIOb.$GɢbUI9k>-׊y4BrP$Tͧk\IO]H0u;mUͯhOB|,t 2B@ߋyT9͋k> Ui'.$GP5i+i>-P5[H07>OB|Z>TͯhOB-$GOBf<ŚOBA;[HVbEɮ/)UTͯh?A|P5UI:Pif!97Fh|_|6J+A_0p_ };!w_a :"mmr|R/ҜWhmifr}fڒBrqDj>~{ߝ#o?šP5?1?G$\Hb|&LDiP5$T'j>-d ]j> UIOBQ.$GGB}wj>-P5cwz j!9B0%OB| UGP5yOB|j!98"zw.|j~G1.$GHEτQ4$Tͧ巊qad!9#.UIOB|Z>To(?P+wV5$Tͧ凾),ejP5 ͢bEI_4./$Gpj~G|j>- i#"B';#$T'j~"6ʅEU5U<'&y4<\T5|_+4{\H0^:pj> UV2hgT $'jV|Z>Ti~ƸB|U5UIOBA-$GEH/ӼA;P5U;)DG!LvP5Ӷ\kMz1#8B6RUIU4^̣j>(BrqD|#xlZpE|y|_ !c=6?k^c=6ׂ##xlZ<6c}-8‹"xlZp(=6c}-E<6c}-8B]5Vz$[NnCz_pnmgDb5m\U?8'Q;Ҭ,-́-FgX-uņU8_oc;<-lwi]'/fT2{#8B0Bpt$/]>7 |펴]ζ0i/jcyvT۟+Q#"Bo׹$TͧC|P5C4x#dtP5w|B|Z>T'j~I !A|P5UIOBA-$GEP56UiP5LDki7-F|ts3xxj> UP5;bP5$T'j> U󇰐a"T5y5y(BrqDj>m׊y4'j> UiP5Y34ŚOB|-7y'jV|Zh#dZ0P5N[Ey5YHR[AIqa7y'j##$T'j>-׊y4'jh#dZ0 +@|P5UI !!؁ UI/U Ui P5 i2-<O%vj> UkwH-$Gp`A;P5Ṿi~W4Oj#"Bc=6ׂc=6ׂ#eq{l#0Bc=6ׂc=6ׂ#eQ=6caB<##Jm=6cj7\i{l1{lGR[|Gp(]t#O<-O6Ot[~q{yi~:/-NNts]I^/gt]aON㩛htڜ<$8/|BrG!8/.v~X9a؞'$7ht^w4{8}'|:i}y Fc5$TͧC|Z>~w;u[Q!%OB| UiP58B<ҚOB|j> USΣZH0ف$T8/j> U?.BEOB|Z>T.)|j>-` ##bMIO|<O1O5'jGDž[H_A|j>-7y'j#8GHGj~G|j~yT @k,':mcOBF -B*bMIU5UI?_i> UiP5$Tͧf!98"Ov@btT'jҷEȔT5UIOBNrͯh #j> U'N[A U󇲐.BPߋyT'j> UiBrGvj> UIw*/Q5 FQF"j{lEȔTgwG<6c}-8Bt,v\ j51\ e<6c}-8O<6B"BH=6cGp-8wE||P"xlZppxlZ4c=6<6c}-8K#6n*SVjrmV7Ζݪ=e]?헶l=/Ml7UyfnI_E+4Mv yk ffϻ?s4CGawEԞ l!9#|bU?|t2iVwiEd=/ҼB,n克,wOa?Ms7;7X!B +sFH-| +sG 'j> UIOB|{V#.BP5?V̓|P5|FR|SW5$Tͯ$Tɨ !|OB|j> Uޝ.OBj~G|,?$SRj> UiP5^̣j~$K58 ##h>mj>\|jy0 zm?k/$Gp h> UiP5XIOB|!f!9#IP5Uo(OBz߷>1BӶ\k-wi/$Gp2=7>hP5RU4^̣j~dzT󇰐*B#MI_ﴕ4Um91ͧC|P5,$GpDh9= UIOˇ$T'j#8y]@|S OB|w|DR$Tͧw~mDIOB,$GpD|P56UiP5#ZHdꀪ$T'4^̣j> UG_i~#MI%OˇbE}!9#'BViP5Ṿi> UiP5Ṿi#8F3OBEOb#LogKy UIOtr!9#!ͯujOˇ_EZ$Tw鵐[x5|OB|?wk-$GpD(|7;mͯhOBLw(#8i> Uk7y'j~`&Lw` T'jSm?yD'j> Ue!9#&BӶLIOBFbU{ Ǹ$'j> UiP5Q̣h~b&L٠, |Dց$Tot*/Q5|.BrGMz|OB|wtj4j/$Gpc=6_] :#<6c}-8K#xlkc=67UGp9{lGxit-xl G|/qT<6cѵ?Λ#8c=6ׂ#4Bx8]-xayܟiO؜)ŢMՍq Ojpّ$yOIc=XdW;$n.{QpRhTÒDɃސvn~n;Yo6!O=]jCP$TͧCr'j> UiMaei[$T'j> UI?;#8#RԶ\ | UG_jC i> UIOv|P5QiR)L|Z>T'j> UiP5#9#8¯Km{ %OB|z-?U)'j> Ui8?;#8#d"46U-7y';ybO-$GEUq'{j0(ց$TͧCz%̧.`n;mcP5;J4U U띶j~G1OP5` F!AU`5i+hG|P5 pNfi 7J{|,Ҍ̐wB|;mUͯhOBa,$GGP.T(|7:mͿOBO\H UiP5^#iw/$GG|a!k<6c,,|wGp!c=6c=6sHk^c=6_XH=|Tq|_ Bmus89Ri5oSr[4"绳_܈:Wy<OFiW컈Ǔ z~]fV!7.SW#/MWy.d<$G\ͬZmIi&OB9R̀Hc }F_$qu~zyU!p }pcuoViq:m}}KqW,\ a'j>-P5|O^ց$T*,|Z~vdP5?)OHiP5|GrG{IIO|,\$T;%T4k^XIOB|ۑBOB|,P5wb[T3$sOB/G.|.4k^!2&|OB#IO$T'j~)bU[3$K5sP5l}9r鷳00q'jG|P5U<߰p-8‹"Df4ii~G|:m5ͧC| U4\I{{1$Ta"3a5N[A UIZH.T'jw,\ \OB{|Q̣ӄN[q&T'j~V|Z>Tl +SiB/0Evj~G|'dT'jg/\ sGrGs|_ sGrGs|_ sGrGq|_ sGrGs|_ sGrGs|_ WL2yu!n]}liNg.d&/-W6d3DI~~ܤy;#>pZ'խ* FnwVLs:.N +n.q&nzrN89-3yӜ֧D3wraiL_:V8KsYvnvț'.L4_{]1i]"BrG"'j>-P5yOˇH%OB|Z>TͿ/OBLy^ϺpGrGqLn'j> UP5=[g!9##HOB|-7y';yb9| l8=TͧC|P5Uk-P5|(Q4w$GpGP#Df”i>m;šQS;h>=BrG ;j~V{1$T'j>-淋y +5O_+4N[Ui)U\ߑ!!2F|?wTk~G!eU5{#8ց$Tov +/Q5$TOB|{P5N[Q}GrGphOB|j~G|U3@:pj> UIiӄ$T?mf'evj~BOB|st904{fH@xdu&Tͧg<| ||wGpOk<6c=6czGrGq|_ <6c}-8K#xl{l;#8'D|/.yaq;پ>\&OL&z]o-YC妺;&XT4Is?9VjE<;'U]܈:l^c<1J [&nDzx<~ꡟGv90-x<9wCms!O\̷*~|yH0_=il;/mVϏB9@f 5Y|P5UIOB|zmP5$T'j> UIOˇ$T'jw]#9#9BViP5$Tͧw|hڧP5#8(>ދOB|j> UIObUIOB|Z>T'jw\#9#9BXI/Q5ږi>-淊yȐj~G|P5UIOB|4b,$Gp>)|j~G|'N[MiNۨP5|OB|7;myw$GpGwږi> UIH.T'jp#8=$TO4Η ځ Uj~Gԗ ځbET<;#8˜#j~GίRi&>u:mK|BrG =6c=6c"xlZpF||wGpOk^c=6c=6>!{lGxi||GpG<6c=6c"xlZp?5jDx8Ϋ47?!lJ]Sq{#Ӭ`}|iv*Ga$'j~ͧ{{4$TͧC|P56UiP5!_w9I'j> U UiP5$TͧC|P5#.ܑ!!|OBԻsHiP5UaBct3xOB OLZ1d'yOˇ$T'j>-7yr246UiP5ݹHIO]H0a'jGDž̓|Z>Toj> UP5Ṿi> U]$1ͧ<;#8#d"HOB| U?>.5g2O\I(5$TͧCZ1]$e]HfӶDIOB|Z>TͯhOyƵaB-G*UIi[$T'j~V{1s1OXIOˇ.Mrlw*/Q5$TͧCV1ϸ##BѠDsP5i+i>-P5N[Ey5N[E<<;#8#P5ihG|P5^3c=6ׂ##xl{l;#8·D|Qzl{l;#8D|Qzl{l;#8D|'y{#4K}OzQ{94Yaq$T #j>-P5s9/;OB|j> UI?_!]|Z>T'j> U{/P5gVXAj>YMa P5UIyw$GpGxAC|P5xOB^H2݅ObEIߺK5Ufk~'%*)|P5Q:jG|P5^3_!](h> UiP5Q̣h~6/yOOh~" UP5s1OXG#d+/$'jV|Z~M5siC|kTWyZNUk7y'=6>;BѠ(Q4()Uiּdi@#|}yP5UIߦZ8h׋y$͏u:pj~i1OoT'j>-7y>r^A UiP5G U#y܁-$G/h{lv9H?0Ck.a{l;#8G|zl~G͎{l;#8F|zl~4c=6Z|GpG#ej' +_|!~.B6oZ)|}q5_w'q{:F^͍?sެ4塟rS~zړr=f9k&b{\i{yӬ~h^-wgn.Vuu:O#O<6ߎ^Uj37﴾|ݹEԟTnI~ ON"v?٤mg}fsв'/jOˇ$T'j>mP5$TͧC|P56UI}G`8#8»#)|OB|j> US +E<~~!T|j> UIOˇ$T'j>mj> UIOQ:#8—G9Rj>-P5x?2~_ϓByŚOB|ߋyT'j> UiP5]S$TͧCZ1$TQ:#8—G9$TͧCZ1$T'jHd}>O߷_|;rC4$TͧC{1$T'jG|P5Uk<{l#8#|O}6OB|j~G|Uc~sϓB~tjOˇ$T'j~WmP5N[A UIOˇb#|loP$Tͯuj(Q4N[I7BP5ihG|?:mEͿXe}IZ16Oj~G|hTͧ;m @|j> UI#K0BӁ$TiB|[em||;#8 "c=6ϓ<6c=6cHr$>O߷_||ͷ#9# *Bȑ<6c_<~~c=6c=6ߎ0!G56x>*ׇ}g eL TKׇCUӶI_pS+Qׇ]]eKs<'f\:/*CJ;Γ>WJs=Ogq=?lyjL=tsrJp]uzsr9?i0rw)/_= lv*_\=F_pvZW檲 >i"N5>4BM#8#3}t i~QgiV ùI<4~"QXׇfXmh:¦P5?.B-2xOB|j~s#h> UiP5UIOB| Uj>-P5yOB|P5$T'j~ROB|7΂擹)U~w#9#|yPsP56UI a'j> UbO://j> UiP5_+0{ORB.4"bO~SXDiP5$TMjc"@;RBIOB|zU P5D'yšOBbDTO/柃 ɢbMIO|?,)|GP'bA;)DiP5UI7*!p$Gp/)bEIOB|Z~DνT󛝶?p#EP5b@nl˓m4?|Z>TͯhOBGbAI"Bͧ姾7ԁ UI_4q-( UIOI|hN ځ$T'j>-7yL#9#|yI; 4?y\QS @e}<ΕyP5u4<vjBP5ihG|ߚ}tڊ4j~J4j~G|;mUͧߝB0H!BTռA;P5Ṿi~Gv$GpD??o·Ń?yist+!~ +=}0p{v=Lϓfud8gr=JwM"s.nO.&v8ͪK뇨?qNi.aCͺOI2lyڭKrXm7˕#fi3"/GL\nY n|yޭ#-}hTj!%Y-&ㅸ=t񰬶/:y&OΓ-z'wF*n\N[_:+L2 ~;?"଺̏]տs^o?5Rw很msW~PHVݮM_ޑ}]2bY'Y9=T'j>-wh> UiP5!ۢP5Aj> UIOB|Z>T'j> UiP5$TͧC|Z>T'j> UiP5$T͏9 c5UGEU1'j> Uy_|OB|j> UIOBW +OB| UiBj> UP5$TTͧC|d}#"BzyO$To|h>mP5$TͯHUS$TͧCf1$TO(\T$TͧC|P5U Ui'9'j> UiP5Q̣h>*j~pG|'$TͧwlG4(k~G|'yOˇ$T'j> 擏B/D5U\ߋyT'j> UiP5US%|USd''%_/4?i|US$Tͯuj(Q4N[E OBFO UiP5ϝK5ihG>k c5UGE6ہ UiP5DIi[䣘PIi+,)T"ӄN[AX?D߷_:/"A;P5ii~G|:m5͟܋yD'<y<6_|||9 c5UGEߌ鸜=6_ck'J3ͪ(_|@r`A2Ԏ;\d[|-llmUv!ni~r\.CA[~v}&Z/Qn07 nM4_nV!q}Iԟ<9_ϫ!;M >>þz6痎 U3>2]$'j> UIOB|P5~ UIOBh,j~W"2UBυɾ_xՖ'' 'j> UiP5$TͧC`O)$T'pxwP5ق4; 1ͯJOB|P5U1P5d'$Tx5HOˇ$T'j>m''j~vN/j~.BC%ΧO5UWmyr|2_!TͧC|Z>T'j> UP5HOBlpxgv1OPy/8/.)|냪js1OP5?p-JP5bj,wj>mj> UIbbͯlK*5/BXI=~|q1^v bAIObEIOB#O>y +5 v8__?y +5тh#G4|,4?q-4;ToO6y +4HUXHD'j>m7y'j~dPiP5X"vVbN_p8_\GWmyJ*烚/DX UiP5Q̣h>U|OE?<;mE'j~k?M"$%'jV|ZsmX;2'!ͧuOv4?R$T';&4U-sn^Dy4?}N2ۊyiۻ_(UiU{1OP5i[kAO:K-b"'Š@Z1$TͿwڪOˇJAIO<.H1O7!tR|~U[yQb|_+4N[Uwӄ$T͟TͯhOB{NyP5brCT1OѠTP9?h??//jS>O$yiB|Z>T'j~`I}dG1_iۻ_|{l{lTW|+ym4c=6c'/vxly^|o,|O8үy<6cOzl{l~:BxЎ{lu<6cpxN۠kc=6c=6?bWmyJ*=6c xl濪c=6c=6?/|~U[y|af6Q7x=EFĈD&OVg~ٍuEZ/K*&ֺUl~|9zMԞt$lw\ <5fF1'O\oYgYݼxW +w Fԟtԉ'ja3<\#<O/[ OO33*O@/x~X7췸=r^7)d^.gn2sZ6 +Osn]Df9L#ڜ'E9ϓ92y}yv5MfI~lo| +1~'WP~Y$B䯰TCOb"j~M5$T' +5*'j> UP5$Tͧ5C|Z>T'j> UiP5Q$TͧC|P5?3*ΒBP5$TE›C|P56UMaP5DIH?Y߷_(Rp¢B$BXLHLbzjP5A|MBj>GJj> UIOˇ$T'j>m/h> UIO gdP56UiP59LkQIO$T|j~B'j>- )h> UIPbHbͯkA| 2O>5)o:O~<>ӎԯbIbP5UIOB ͯhOBpDvHi()|j~PbȟSA+a5yXIOBgmP5sNQǣw/(y|q1OWH*T̈́|E_| +5DΣP3HyͧCbb'j> U-j> U?_j>-},z1AO#4Ṿi> UI(54#<[C|P5߮ j> UIObUIwh~[e}V<ӶwȿB3ašBͧC|ѵ i~pP5UIOBfbQ۟/j~XPbP5},\HeO. v>wچ5l5XI1ORH۝,4ɮj> UIi[䣘PߝϟB~VSSA;6Pa$TͯwJOO/:pѵP0hO5ii>-P5N[Ay5q,,j~VDZB]|zk;m{ w-"tڊOˇbA0;m%o(OB/ ډuޝ 5e}LQG(Eym/-UI_(kAKjs1OP5i+i~G|P5>.U5GvV<ӄbQɇlNdi~ \Oy +@|ZsmX;m&Tͧ'>_uB_i C΢lo|͟xl{lwwzlo%|!{ͯ_ /5_-\f{lK_ɾ{l~gmP||Z|n|Ms8_\̓|A|8{l._5|͟xl~c=6csP{lOWrBe")"y7ByI9; ib;7>`ߺI O> ";%Up^ ~l)rW)|i:_w WnG1]M~&d_. 7v$/peٜp{H0SM/6vMRoDBG5gӶr$nGrKrZ]HD nH'墺'=GzG:=ecv _)/סj~,Bx! OBtIUA+Z04'Y> }&j~WIUP5[OB|j> UIOB|Z~~У]W$~'7S4dז'fLRR /5?剘rm擘OBIvI|8_$TͧLUvBI;b'j~y5q8/jiP$/46UIOBЮ-$To 'Q߷_x|q1O0BP5[ٞ[0zjvyNjyB-ߞT|?y*)|'ϑ"\S$T'j>HpP A.!<-$T/-hW1Bx#h>u,|<&j> UI/| +U󓻶jC0>px 狋y'yB?l_v&[狎 U<ɋCI׮DI_ +GΗ+e}iۻ_E/DNHUn@bPi+j>-?)ʇ$T-z1]MaE5U_(|׏%'j~>B׋yNb?:mEoܑ'jgKm?/5?w~l,4pN$`smXIOB|Z>TͯHOB{vm᠝h~`N-ӶPIOtj~G|yR߷_bO/A;6vO<<`ځbMbyP5i[_H '=6c26???A +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000113 00000 n +0000000178 00000 n +0000000224 00000 n +0000000359 00000 n +0000000547 00000 n +0000000281 00000 n +trailer +<< +/Size 8 +/Root 2 0 R +/Info 1 0 R +>> +startxref +51566 +%%EOF diff --git a/top_mma/res/res_70.pdf b/top_mma/res/res_70.pdf new file mode 100755 index 0000000..4bd6094 Binary files /dev/null and b/top_mma/res/res_70.pdf differ diff --git a/top_mma/res/res_80.pdf b/top_mma/res/res_80.pdf new file mode 100755 index 0000000..efbca75 Binary files /dev/null and b/top_mma/res/res_80.pdf differ diff --git a/top_mma/res/res_90.pdf b/top_mma/res/res_90.pdf new file mode 100755 index 0000000..4646159 Binary files /dev/null and b/top_mma/res/res_90.pdf differ diff --git a/top_mma/res/top_hist.gif b/top_mma/res/top_hist.gif new file mode 100755 index 0000000..d7322b3 Binary files /dev/null and b/top_mma/res/top_hist.gif differ diff --git a/top_mma/top99neo_mma.jl b/top_mma/top99neo_mma.jl new file mode 100755 index 0000000..9327a8d --- /dev/null +++ b/top_mma/top99neo_mma.jl @@ -0,0 +1,402 @@ +# __precompile__() +# module TopOpt99neo_MMA + +using LinearAlgebra, SparseArrays +using Plots + # : heatmap, savefig, @animate +using ImageFiltering: imfilter +using Statistics: mean + +using BenchmarkTools + +BLAS.set_num_threads(1) + +# abstract type top99neo end + +include("utils.jl") +include("MMA.jl") + +export SetUp, Mat, DiscretizationFeature, LoadsSupportsBCs, Initialization, Filter +export Optimization, Visualization + +mutable struct SetUp + nelx:: Int + nely:: Int + + eta:: Float64 + beta:: Int + penalCnt:: Array + betaCnt:: Array + + move:: Float64 + maxit:: Int + maxchang:: Float64 + + pasS:: Array{Int} + pasV:: Array{Int} + + function SetUp() + nelx = 120 + nely = 40 + # volfrac = 0.3 + maxit = 500 + move = 0.1 + beta = 2 + eta = 0.5 + maxchang = 1e-6 + penalCnt = [1, 3, 20, 0.2] + betaCnt = [1, 32, 10, 2] + # continuation scheme on beta parCont = { istart,maxPar,steps,deltaPar } + + # elNrs = reshape(1:nely*nelx, nely, nelx) + # a1 = elNrs[Int.(nely/4:nely/2), Int.(nelx/4:nelx/2)] + # pasS, pasV = Array([]), a1[:] + pasS, pasV = Array([]), Array([]) + + new(nelx, nely, eta, beta, penalCnt, betaCnt, move, maxit, maxchang, pasS, pasV) + end + +end + +mutable struct Mat + E0:: Float64 + Emin:: Float64 + ν:: Float64 + penal:: Float64 + volfrac:: Float64 + + function Mat() + E0 = 1.0 + Emin = 1e-9 * E0 + ν = 0.3 + penal = 3.0 + volfrac = 0.3 + new(E0, Emin, ν, penal, volfrac) + end +end + +struct DiscretizationFeature + nEl:: Int + nodeNrs:: Array{Int,2} + nDof:: Int + act + + cMat:: Array{Int} + Iar:: Array{Int} + Ke:: Array{Float64,1} + Ke0:: Array{Float64,2} + + function DiscretizationFeature(setup::SetUp, mat::Mat) + nelx = setup.nelx + nely = setup.nely + pasS, pasV = setup.pasS, setup.pasV + ν = mat.ν + + nEl = nely * nelx + nodeNrs = reshape(1:(1+nelx)*(1+nely), nely + 1, nelx + 1) + nDof = (nely + 1) * (nelx + 1) * 2 + act = setdiff(collect(1:nEl), union(pasS, pasV)) + + cVec = reshape(2 * nodeNrs[1:end-1, 1:end-1] .+ 1, nEl, 1) + cMat = Int.(repeat(cVec, 1, 8) + repeat([0 1 2 * nely .+ [2 3 0 1] -2 -1], nelx * nely, 1)) + + FuckRow = [1 2 3 4 5 6 7 8] + sI::Array{Int}, sII::Array{Int} = copy(FuckRow), fill(1, 1, 8) + @inbounds for j in 2: 8 + sI = cat(sI, FuckRow[j:8]'; dims=2) + # sII = cat(2, sII, repmat(j, 1, 8 - j + 1)) + sII = cat(sII, fill(j, 1, 8 - j + 1); dims=2) + end + iK::Array{Int,2}, jK::Array{Int,2} = cMat[:, sI][:, 1, :]', cMat[:, sII][:, 1, :]' + Iar = sort([iK[:] jK[:]]; dims=2, rev=true) # comma is a newline + # iK[:], jK[:] .= 0.0, 0.0 + c1 = [12, 3, -6, -3, -6, -3, 0, 3, 12, 3, 0, -3, -6, -3, -6, 12, -3, 0, -3, -6, 3, 12, 3, -6, 3, -6, 12, 3, -6, -3, 12, 3, 0, 12, -3, 12] + c2 = [-4, 3, -2, 9, 2, -3, 4, -9, -4, -9, 4, -3, 2, 9, -2, -4, -3, 4, 9, 2, 3, -4, -9, -2, 3, 2, -4, 3, -2, 9, -4, -9, 4, -4, -3, -4] + Ke = 1 / (1 - ν^2) / 24 .* (c1 .+ ν .* c2) # half-KE vector + # full KE + # Ke0::Array{Float64} = zeros(8, 8) + # start_id, end_id = 1, 8 + # for i in 1: 8 + # Ke0[i:8, i] = Ke[start_id:end_id] + # start_id, end_id = end_id + 1, 2 * end_id - start_id + # end + + Ke0::Array{Float64} = zeros(8, 8) + # Index::Array{Int} = [sI' sII'] + # Ke0[sI, sII] = Ke + Index = findall(isequal(1), tril(ones(8, 8))) + Ke0[Index] = Ke' + # Ke0 = reshape(Ke0, 8, 8) + Ke0 = Ke0 + Ke0' - diagm(diag(Ke0)) + # diag return the diag of a matrix + # diagm build a matirx with a diag + new(nEl, nodeNrs, nDof, act, cMat, Iar, Ke, Ke0) + end +end + +mutable struct LoadsSupportsBCs + lcDof:: Array{Int} + F + free:: Array{Int} + fixed:: Array{Int} + + function LoadsSupportsBCs(setup::SetUp, disfeature::DiscretizationFeature) + nelx = setup.nelx + nely = setup.nely + nodeNrs = disfeature.nodeNrs + nDof = disfeature.nDof + + load_position::Symbol = :half_MBB + if load_position == :half_MBB + load_nodey , load_nodex = 1, 1 + # fixed = union([1:2:2*(nely+1)], 2 * nodeNrs[nely+1, nelx+1]) + fixed = union(collect(1:2:2*(nely+1)), 2 * nodeNrs[end, end]) + elseif load_position == :cantilever + load_nodey = nely + 1 + load_nodex = nelx / 2 + 1 + fixed = 1:2*(nely+1) + end + + F = spzeros(nDof) + + load_type::Symbol = :pin + if load_type == :pin # 1 point + lcDof = collect(2 * nodeNrs[load_nodey, load_nodex]) + F[2] = -1.0 + elseif load_type == :points # 5 points + # lcDof = collect(2 * nodeNrs[load_nodey, load_nodex], nodeNrs[load_nodey, load_nodex-1], nodeNrs[load_nodey, load_nodex-2], nodeNrs[load_nodey, load_nodex+1], nodeNrs[load_nodey, load_nodex+2]) + F[lcDof'] .= -1.0 + elseif load_type == :line + lcDof = [2:2*(nely+1):nDof] + F = spzeros(nDof, 1) + F[lcDof'] .= -1.0 + # F = sparse(lcDof', ones(length(lcDof')), -1.0) + end + all = collect(1:nDof) + free = setdiff(all, fixed) + + new(lcDof, F, free, fixed) + end +end + +struct Initialization + x:: Array{Float64} + xPhys:: Array{Float64} + xOld:: Array{Float64} + ch:: Float64 + loop:: Int + + function Initialization(setup::SetUp, disfeature::DiscretizationFeature, mat::Mat) + pasV = setup.pasV + pasS = setup.pasS + act = disfeature.act + volfrac = mat.volfrac + nEl = disfeature.nEl + # nDof = disfeature.nDof + # column vectors + x = zeros(nEl, 1) + x[act] .= volfrac + x[pasS] .= 1.0 + xPhys, xOld, ch, loop = copy(x), ones(nEl, 1), 1.0, 0 + # x̅ x̃ + + new(x, xPhys, xOld, ch, loop) + end +end + +mutable struct Filter + rmin:: Float64 + ft:: Int + h:: Array{Float64} + Hs:: Array{Float64} + dHs:: Array{Float64} + + function Filter(setup::SetUp) + nelx = setup.nelx + nely = setup.nely + # volfrac = mat.volfrac + # bcF = setup.bcF + rmin = 6.5 + ft = 3 # 1 density 2 projection 3 volume preserving + dy, dx = meshgrid(-ceil(rmin)+1:ceil(rmin)-1, -ceil(rmin)+1:ceil(rmin)-1) + h = max.(0, rmin .- sqrt.(dx .^ 2 + dy .^ 2)) + Hs = imfilter(ones(nely, nelx), h, "symmetric") + dHs = Hs + + new(rmin, ft, h, Hs, dHs) + end +end + + +function FiniteElementAnalasys(mat::Mat, disfeature::DiscretizationFeature, load::LoadsSupportsBCs, xPhys::Array{Float64}) + nEl , nDof, Iar, Ke = disfeature.nEl, disfeature.nDof, disfeature.Iar, disfeature.Ke + act = disfeature.act + Emin, penal, E0 = mat.Emin, mat.penal, mat.E0 + F , free = load.F, load.free + # Interplotation model + sK = Emin .+ xPhys .^ penal .* (E0 - Emin) + sK = reshape(Ke[:] * sK', length(Ke) * nEl, 1) + K = sparse(Iar[:, 1], Iar[:, 2], vec(sK), nDof, nDof) + U = zeros(nDof) + # U[free] = cholesky(Symmetric(K[free, free], :L), check=false) \ F[free + U[free] = cholesky(Symmetric(K, :L)[free, free], check=false) \ F[free] + Obj = F' * U + Vf = sum(xPhys[act])/length(act) + return U, Obj, Vf +end + +function SensitivityAnalasys(setup::SetUp, filter::Filter, mat::Mat, disfeature::DiscretizationFeature, U::Array{Float64}, xPhys::Array{Float64}) + nelx, nely, act = setup.nelx, setup.nely, disfeature.act + dHs , h = filter.dHs, filter.h + E0 , Emin, penal = mat.E0, mat.Emin, mat.penal + nEl , cMat, Ke0 = disfeature.nEl, disfeature.cMat, disfeature.Ke0 + act = disfeature.act + + dsK, dV = zeros(nEl), zeros(nEl) + dV[act] .= 1.0/length(act) + dsK[act] = -penal * (E0 - Emin) .* xPhys[act] .^ (penal - 1) + + dc = dsK .* sum((U[cMat] * Ke0) .* U[cMat], dims=2) + dc = imfilter(reshape(dc, nely, nelx) ./ dHs, h, "symmetric") + dV0 = imfilter(reshape(dV, nely, nelx) ./ dHs, h, "symmetric") + + return reshape(dc, nEl, 1), reshape(dV0, nEl, 1) +end + +function MMAupdate(act, xval::Array{Float64}, low::Array{Float64}, upp::Array{Float64}, + xold1:: Array{Float64}, xold2:: Array{Float64}, + Obj, Vf:: Float64, + dc:: Array{Float64}, dV0:: Array{Float64}, loop:: Int, volfrac:: Float64) + move = 0.1 + ### Initiation of MMA ### + m = 1 + # active design variable + n = length(act) + onen = ones(n, 1) + onem = ones(m, 1) + zeron = zeros(n, 1) + zerom = zeros(m, 1) + a_mma = zerom + c_mma = 1.0e3 * onem + d_mma = zerom + a0 = 1.0 + # column vector + # xval = xval + xmin = max.(xval .- move, zeron) + xmax = min.(xval .+ move, onen) + + # low = low + # upp = upp + # objective function + f0val = Obj + df0dx = dc[act] + df0dx2 = 0.0 * df0dx + # constraint function + fval = Vf / volfrac - 1.0 # column vector + dfdx = reshape(dV0[act], 1, length(act)) ./ volfrac # (m * n) + dfdx2 = 0.0 * dfdx + + # The MMA subproblem is solved at the point xval: + xmma, ymma, zmma, lam, xsi, eta, mu, zet, s, low, upp = + mmasub(m, n, loop, xval, xmin, xmax, xold1, xold2, + f0val, df0dx, df0dx2, fval, dfdx, dfdx2, low, upp, a0, a_mma, c_mma, d_mma) + return xmma, low, upp +end + +function Visualization(setup::SetUp, x::Array{Float64}, loop::Int) + nelx, nely = setup.nelx, setup.nely + # cmap = cgrad(:Blues_9, rev=false) + plot = heatmap(reshape(x, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400, nely / nelx * 400), legend=:none, display_type=:gui) + # display(plot) + # if mod(loop, 10) = = 0 + # savefig(plot, "./res/res_$loop.pdf") + savefig(plot, "./res/design_$loop.png") + # end + + # PLOT FINAL DESIGN + # heatmap(1.0 .- x[end:-1:1, :], yaxis=false, xaxis=false, legend=:none,color=:greys, grid=false, border=nothing, aspect_ratio=:equal) + nothing +end + + +function Optimization(setup::SetUp, mat::Mat, load::LoadsSupportsBCs, filter::Filter, ini::Initialization, disfeature::DiscretizationFeature) + ch, loop = ini.ch, ini.loop + x , xPhys, xOld = ini.x, ini.xPhys, ini.xOld + + maxit, maxchang = setup.maxit, setup.maxchang + nely, nelx = setup.nely, setup.nelx + eta, beta, penalCnt, betaCnt = setup.eta, setup.beta, setup.penalCnt, setup.betaCnt + volfrac, penal, nEl = mat.volfrac, mat.penal, disfeature.nEl + act = disfeature.act + + Hs, h, ft = filter.Hs, filter.h, filter.ft + + opt_hist = [] + vf_hist = [] + + ### Initiation of MMA ### + xval = copy(x[act]) + xold1 = copy(xval) + xold2 = copy(xold1) + + low = copy(xval) + upp = copy(low) + ######################### + loop_beta = 0 + anim = @animate while ch > maxchang && loop < maxit || beta < betaCnt[2] + @time begin + loop = loop + 1 + # COMPUTE PHYSICAL DENSITY FIELD + xTilde = imfilter(reshape(x, nely, nelx), h, "symmetric") ./ Hs + xPhys[act] = copy(xTilde[act]) + if ft > 1 + f = (mean(prj(xPhys[act], eta, beta)) .- volfrac) * (ft == 3) + while abs(f) > maxchang + eta = eta - f / mean(deta(xPhys[:], eta, beta)) + f = mean(prj(xPhys[act], eta, beta)) - volfrac + end + filter.dHs = Hs ./ reshape(dprj(xTilde, eta, beta), nely, nelx) + xPhys = prj(xPhys, eta, beta) + end + ch = norm(xPhys - xOld) ./ sqrt(nEl) + xOld = copy(xPhys) + #~ SETUP AND SOLVE EQUILIBRIUM EQUATIONS + U, C, Vf = FiniteElementAnalasys(mat, disfeature, load, xPhys) + push!(opt_hist, C) + push!(vf_hist, Vf) + #~ COMPUTE SENSITIVITIES + dc, dV0 = SensitivityAnalasys(setup, filter, mat, disfeature, U, xPhys) + #~ MMA iteration + xmma, low, upp = MMAupdate(act, xval, low, upp, xold1, xold2, C, Vf, dc, dV0, loop, Mat().volfrac) + # Some vectors are updated: + xold2 = copy(xold1) + xold1 = copy(xval) + xval = copy(xmma) + + x[act] = xval + + #~ CONTINUATION + # if mat.penal == 1.0 + mat.penal = cnt(mat.penal, penalCnt,loop, ch, maxchang) + # end + if mat.penal < 3.0 + beta = 2.0 + else + loop_beta = loop_beta + 1 + beta = cnt(beta, betaCnt, loop_beta, ch, maxchang) + # restart mma + end + + heatmap(reshape(xPhys, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400, nely / nelx * 400), legend=:none) + + end + if mod(loop, 20) == 0 + println("It.: $loop C.: $C Vf.: $Vf ch.: $ch, p.: $(mat.penal) beta.:$beta eta.: $eta ") + Visualization(setup, xPhys, loop) + end + end + # gif(anim, "./top/cantilever.gif", fps=8) + return xPhys, opt_hist, vf_hist, anim +end + +# end diff --git a/top_mma/utils.jl b/top_mma/utils.jl new file mode 100755 index 0000000..ca4371c --- /dev/null +++ b/top_mma/utils.jl @@ -0,0 +1,57 @@ +# export loads!, bcs!, passive_domain! +export prj, deta, dprj, cnt +export meshgrid +export Visualization + +function prj(v::Array{Float64}, eta::Float64, beta) + return (tanh(beta * eta) .+ tanh.(beta * (v[:] .- eta))) ./ (tanh(beta * eta) + tanh(beta * (1 - eta))) +end + +function deta(v::Array{Float64}, eta::Float64, beta) + return -beta * csch(beta) .* sech.(beta * (v[:] .- eta)) .^ 2 .* sinh.(v[:] * beta) .* sinh.((1 .- v[:]) * beta) +end + +function dprj(v::Array{Float64}, eta::Float64, beta) + return beta * (1 .- tanh.(beta * (v .- eta)) .^ 2) ./ (tanh(beta * eta) + tanh(beta * (1 - eta))) +end + +function cnt(v, vCnt::Array, l::Int, ch::Float64, maxchang::Float64) + return v + (l >= vCnt[1]) * (v < vCnt[2]) * (mod(l, vCnt[3]) == 0 || ch <= maxchang) * vCnt[4] +end + + +""" +meshgrid(vx) +Computes an (x,y)-grid from the vectors (vx,vx). +For more information, see the MATLAB documentation. +""" +meshgrid(v::AbstractVector) = meshgrid(v, v) + +""" +meshgrid(vx,vy) +Computes an (x,y)-grid from the vectors (vx,vy). +For more information, see the MATLAB documentation. +""" +function meshgrid(vx::AbstractVector{T}, vy::AbstractVector{T}) where {T} + m, n = length(vy), length(vx) + vx = reshape(vx, 1, n) + vy = reshape(vy, m, 1) + (repeat(vx, m, 1), repeat(vy, 1, n)) +end + +""" +meshgrid(vx,vy,vz) +Computes an (x,y,z)-grid from the vectors (vx,vy,vz). +For more information, see the MATLAB documentation. +""" +function meshgrid(vx::AbstractVector{T}, vy::AbstractVector{T}, + vz::AbstractVector{T}) where {T} + m, n, o = length(vy), length(vx), length(vz) + vx = reshape(vx, 1, n, 1) + vy = reshape(vy, m, 1, 1) + vz = reshape(vz, 1, 1, o) + om = ones(Int, m) + on = ones(Int, n) + oo = ones(Int, o) + (vx[om, :, oo], vy[:, on, oo], vz[om, on, :]) +end diff --git a/top_oc/TEST.ipynb b/top_oc/TEST.ipynb new file mode 100755 index 0000000..eeeabf7 --- /dev/null +++ b/top_oc/TEST.ipynb @@ -0,0 +1,689 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# module TopOpt99neo\n", + "\n", + "# include(\"FastConv.jl/src/FastConv.jl\")\n", + "# import .FastConv.fastconv\n", + "\n", + "using LinearAlgebra, SparseArrays\n", + "using Plots: heatmap, savefig\n", + "# using PlotUtils:cgrad\n", + "using ImageFiltering: imfilter\n", + "using Statistics: mean\n", + "\n", + "using ForwardDiff\n", + "\n", + "BLAS.set_num_threads(1)\n", + "\n", + "# abstract type top99neo end\n", + "# abstract type top_result end\n", + "\n", + "# abstract type Filter end\n", + "\n", + "include(\"utils.jl\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct SetUp\n", + "# mutable struct SetUp <: top99neo\n", + " nelx::Int\n", + " nely::Int\n", + " # volfrac::Float64\n", + " # rmin::Float64\n", + "\n", + " # ftBC::Symbol\n", + " eta::Float64\n", + " beta::Int\n", + " betaCnt::NTuple{4,Int}\n", + "\n", + " move::Float64\n", + " maxit::Int\n", + " maxchang::Float64\n", + "\n", + " pasS::Array{Int}\n", + " pasV::Array{Int}\n", + " # act\n", + "\n", + " function SetUp()\n", + " nelx = 100\n", + " nely = 50\n", + " # volfrac = 0.3\n", + " maxit = 300\n", + " move = 0.1\n", + " beta = 2\n", + " eta = 0.5\n", + " maxchang = 1e-6\n", + " # penalCnt = {maxit+1, 3, 25, 0.25}\n", + " betaCnt = (1, 50, 10, 2) # continuation scheme on beta parCont = { istart,maxPar,steps,deltaPar }\n", + " \n", + " pasS, pasV = Array([]), Array([])\n", + " # act = setdiff([1:nEl]', union(pasS, pasV))\n", + " \n", + " new(nelx, nely, eta, beta, betaCnt, move, maxit, maxchang, pasS, pasV)\n", + " end\n", + "\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "setup = SetUp()\n", + "# setup.nelx = 20\n", + "# setup.nely = 10\n", + "# setup.maxit = 100\n", + "# typeof(setup.nodeNrs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "mutable struct Mat\n", + " E0::Float64\n", + " Emin::Float64\n", + " ν::Float64\n", + " penal::Float64\n", + " volfrac::Float64\n", + "\n", + " function Mat()\n", + " # E0 = 1\n", + " # Emin = 1e-9\n", + " # nu = 0.3\n", + " E0 = 1\n", + " Emin = 1e-9\n", + " ν = 0.3\n", + " penal = 3.0\n", + " volfrac = 0.3\n", + " new(E0, Emin, ν, penal, volfrac)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mat = Mat()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct DiscretizationFeature\n", + " nEl::Int\n", + " nodeNrs::Array{Int,2}\n", + " nDof::Int\n", + " act\n", + "\n", + " cMat::Array{Int}\n", + " Iar::Array{Int}\n", + " Ke::Array{Float64,1}\n", + " Ke0::Array{Float64,2}\n", + " \n", + " function DiscretizationFeature(setup::SetUp, mat::Mat)\n", + " nelx = setup.nelx\n", + " nely = setup.nely\n", + " pasS, pasV = setup.pasS, setup.pasV\n", + " ν = mat.ν\n", + " \n", + " nEl = nely * nelx\n", + " nodeNrs = reshape(1:(1+nelx)*(1+nely), nely + 1, nelx + 1)\n", + " nDof = (nely + 1) * (nelx + 1) * 2\n", + " act = setdiff(collect(1:nEl), union(pasS, pasV))\n", + " \n", + " cVec = reshape(2 * nodeNrs[1:end-1, 1:end-1] .+ 1, nEl, 1)\n", + " # cMat = cVec + Int.([0 1 2 * nely .+ [2 3 0 1] -2 -1])\n", + " cMat = Int.(repeat(cVec, 1, 8) + repeat([0 1 2 * nely .+ [2 3 0 1] -2 -1], nelx * nely, 1))\n", + " # nDof = (nely + 1) * (nelx + 1) * 2\n", + " FuckRow = [1 2 3 4 5 6 7 8]\n", + " sI::Array{Int}, sII::Array{Int} = copy(FuckRow), fill(1, 1, 8)\n", + " for j in 2:8\n", + " sI = cat(sI, FuckRow[j:8]'; dims=2)\n", + " # sI = append!(sI, convert(Array{Int},[j:8]))\n", + " # sII = cat(2, sII, repmat(j, 1, 8 - j + 1))\n", + " sII = cat(sII, fill(j, 1, 8 - j + 1); dims=2)\n", + " end\n", + " iK::Array{Int,2}, jK::Array{Int,2} = cMat[:, sI][:, 1, :]', cMat[:, sII][:, 1, :]'\n", + " Iar = sort([iK[:] jK[:]]; dims=2, rev=true) # comma is a newline\n", + " # iK, jK .= 0 , 0\n", + " c1 = [12, 3, -6, -3, -6, -3, 0, 3, 12, 3, 0, -3, -6, -3, -6, 12, -3, 0, -3, -6, 3, 12, 3, -6, 3, -6, 12, 3, -6, -3, 12, 3, 0, 12, -3, 12]\n", + " c2 = [-4, 3, -2, 9, 2, -3, 4, -9, -4, -9, 4, -3, 2, 9, -2, -4, -3, 4, 9, 2, 3, -4, -9, -2, 3, 2, -4, 3, -2, 9, -4, -9, 4, -4, -3, -4]\n", + " Ke = 1 / (1 - ν^2) / 24 .* (c1 .+ ν .* c2) # half-KE vector\n", + " # full KE\n", + " # Ke0::Array{Float64} = zeros(8, 8)\n", + " # start_id, end_id = 1, 8\n", + " # for i in 1:8\n", + " # Ke0[i:8, i] = Ke[start_id:end_id]\n", + " # start_id, end_id = end_id + 1, 2 * end_id - start_id\n", + " # end\n", + " \n", + " Ke0::Array{Float64} = zeros(8, 8)\n", + " # Index::Array{Int} = [sI' sII']\n", + " # Ke0[sI, sII] = Ke\n", + " Index = findall(isequal(1), tril(ones(8, 8)))\n", + " Ke0[Index] = Ke'\n", + " # Ke0 = reshape(Ke0, 8, 8)\n", + " Ke0 = Ke0 + Ke0' - diagm(diag(Ke0))\n", + " new(nEl, nodeNrs, nDof, act, cMat, Iar, Ke, Ke0)\n", + " end\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "disfeature = DiscretizationFeature(setup, mat)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct LoadsSupportsBCs\n", + " # setup::SetUp\n", + " lcDof::Array{Int}\n", + " F::SparseMatrixCSC{Float64}\n", + " free::Array{Int}\n", + " fixed::Array{Int}\n", + "\n", + " function LoadsSupportsBCs(setup::SetUp, disfeature::DiscretizationFeature)\n", + " nelx = setup.nelx\n", + " nely = setup.nely\n", + " nodeNrs = disfeature.nodeNrs\n", + " nDof = disfeature.nDof\n", + " \n", + " load_position::Symbol = :half_MBB\n", + " if load_position == :half_MBB\n", + " load_nodey, load_nodex = 1, 1\n", + " # fixed = union([1:2:2*(nely+1)], 2 * nodeNrs[nely+1, nelx+1])\n", + " fixed = union(collect(1:2:2*(nely+1)), 2 * nodeNrs[end, end])\n", + " elseif load_position == :cantilever\n", + " load_nodey = nely + 1\n", + " load_nodex = nelx / 2 + 1\n", + " fixed = 1:2*(nely+1)\n", + " end\n", + " \n", + " F = spzeros(nDof, 1)\n", + " \n", + " load_type::Symbol = :pin\n", + " if load_type == :pin # 1 point\n", + " lcDof = collect(2 * nodeNrs[load_nodey, load_nodex])\n", + " F[2, 1] = -1.0\n", + " elseif load_type == :points # 5 points\n", + " lcDof = collect(2 * nodeNrs[load_nodey, load_nodex], nodeNrs[load_nodey, load_nodex-1], nodeNrs[load_nodey, load_nodex-2], nodeNrs[load_nodey, load_nodex+1], nodeNrs[load_nodey, load_nodex+2])\n", + " F[lcDof', ones(length(lcDof'))] .= -1.0\n", + " elseif load_type == :line\n", + " lcDof = [2:2*(nely+1):nDof]\n", + " F = spzeros(nDof, 1)\n", + " # F = sparse(lcDof', ones(length(lcDof')), -1.0)\n", + " end\n", + " all = collect(1:nDof)\n", + " free = setdiff(all, fixed)\n", + " \n", + " new(lcDof, F, free, fixed)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "load = LoadsSupportsBCs(setup, disfeature)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct Initialization \n", + " # setup::SetUp\n", + " x::Array{Float64}\n", + " xPhys::Array{Float64}\n", + " xOld::Array{Float64}\n", + " ch::Float64\n", + " loop::Int\n", + " # U::Array{Float64}\n", + " # dsK::Array{Float64}\n", + " # dV::Array{Float64}\n", + "\n", + " function Initialization(setup::SetUp, disfeature::DiscretizationFeature, mat::Mat)\n", + " pasV = setup.pasV\n", + " pasS = setup.pasS\n", + " act = disfeature.act\n", + " volfrac = mat.volfrac\n", + " nEl = disfeature.nEl\n", + " nDof = disfeature.nDof\n", + " # column vectors\n", + " x = zeros(nEl, 1)\n", + " # dV[act, 1] .= 1.0 / nEl / volfrac\n", + " x[act] .= (volfrac * (nEl - length(pasV)) - length(pasS)) / length(act)\n", + " x[pasS] .= 1.0\n", + " xPhys, xOld, ch, loop = copy(x), ones(nEl, 1), 1.0, 0\n", + " # x̅ x̃\n", + " \n", + " new(x, xPhys, xOld, ch, loop)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ini = Initialization(setup, disfeature, mat)\n", + "# typeof(ini.x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mutable struct Filter \n", + " rmin::Float64\n", + " ft::Int\n", + " h::Array{Float64}\n", + " Hs::Array{Float64}\n", + " dHs::Array{Float64}\n", + "\n", + " function Filter(setup::SetUp)\n", + " nelx = setup.nelx\n", + " nely = setup.nely\n", + " # bcF = setup.bcF\n", + " rmin = 2.5\n", + " ft = 1\n", + " dy, dx = meshgrid(-ceil(rmin)+1:ceil(rmin)-1, -ceil(rmin)+1:ceil(rmin)-1)\n", + " h = max.(0, rmin .- sqrt.(dx .^ 2 + dy .^ 2))\n", + " Hs = imfilter(ones(nely, nelx), h, \"symmetric\")\n", + " dHs = Hs\n", + " new(rmin, ft, h, Hs, dHs)\n", + " end\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "filter = Filter(setup)\n", + "# filter.Hs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function FiniteElementAnalasys(mat::Mat, disfeature::DiscretizationFeature, load::LoadsSupportsBCs, xPhys::Array{Float64})\n", + " nEl, nDof, Iar, Ke = disfeature.nEl, disfeature.nDof, disfeature.Iar, disfeature.Ke\n", + " Emin, penal, E0 = mat.Emin, mat.penal, mat.E0\n", + " F, free = load.F, load.free\n", + "\n", + " sK = Emin .+ xPhys .^ penal .* (E0 - Emin)\n", + " sK = reshape(Ke[:] * sK', length(Ke) * nEl, 1)\n", + " K::SparseMatrixCSC = sparse(Iar[:, 1], Iar[:, 2], vec(sK), nDof, nDof)\n", + " U = zeros(nDof, 1)\n", + " #~\n", + " U[free] = cholesky(Symmetric(K[free, free], :L), check=false) \\ F[free]\n", + " #~\n", + " Obj = F' * U\n", + " Vf = mean(xPhys)\n", + " return U, Obj, Vf\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# U, Obj, Vf = FiniteElementAnalasys(mat::Mat, disfeature::DiscretizationFeature, load::LoadsSupportsBCs, xPhys::Array{Float64})\n", + "# size(Obj)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function SensitivityAnalasys(setup::SetUp, filter::Filter, mat::Mat, disfeature::DiscretizationFeature, U::Array{Float64}, xPhys::Array{Float64})\n", + " nelx, nely, act = setup.nelx, setup.nely, disfeature.act\n", + " dHs, h = filter.dHs, filter.h\n", + " E0, Emin, volfrac, penal = mat.E0, mat.Emin, mat.volfrac, mat.penal\n", + " nEl, cMat, Ke0 = disfeature.nEl, disfeature.cMat, disfeature.Ke0\n", + "\n", + " dsK, dV = zeros(nEl, 1), zeros(nEl, 1)\n", + " dV[act, 1] .= 1.0 / nEl / volfrac\n", + " dsK[act] = -penal * (E0 - Emin) .* xPhys[act] .^ (penal - 1)\n", + "\n", + " dc = dsK .* sum((U[cMat] * Ke0) .* U[cMat], dims=2)\n", + " dc = imfilter(reshape(dc, nely, nelx) ./ dHs, h, \"symmetric\")\n", + " dV0 = imfilter(reshape(dV, nely, nelx) ./ dHs, h, \"symmetric\")\n", + "\n", + " return dc, dV0\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# UPDATE DESIGN VARIABLES AND APPLY CONTINUATION\n", + "function OCupdate!(x::Array{Float64}, setup::SetUp, mat::Mat, disfeature::DiscretizationFeature, dc::Array{Float64}, dV0::Array{Float64})\n", + " act, move, volfrac = disfeature.act, setup.move, mat.volfrac\n", + "\n", + " xT = x[act]\n", + " xU, xL = xT .+ move, xT .- move\n", + " ocP = xT .* real.(sqrt.(-dc[act] ./ dV0[act]))\n", + " l = [0 mean(ocP) / volfrac]\n", + " while (l[2] - l[1]) / (l[2] + l[1]) > 1e-4\n", + " lmid = 0.5 * (l[1] + l[2])\n", + " x[act] = max.(max.(min.(min.(ocP ./ lmid, xU), 1.0), xL), 0.0)\n", + " if mean(x) > volfrac\n", + " l[1] = lmid\n", + " else\n", + " l[2] = lmid\n", + " end\n", + " end\n", + " return x\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function Visualization(setup::SetUp, x::Array{Float64}, loop::Int)\n", + " nelx, nely = setup.nelx, setup.nely\n", + " # cmap = cgrad(:Blues_9, rev=false)\n", + " plot = heatmap(reshape(x, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400,nely/nelx*400) , legend=:none, display_type=:gui)\n", + " display(plot)\n", + " savefig(plot, \"./top/res_$loop.pdf\")\n", + " # PLOT FINAL DESIGN\n", + " # heatmap(1.0 .- x[end:-1:1, :], yaxis=false, xaxis=false, legend=:none,color=:greys, grid=false, border=nothing, aspect_ratio=:equal)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Optimization (generic function with 1 method)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "function Optimization(setup::SetUp, mat::Mat, load::LoadsSupportsBCs, filter::Filter, ini::Initialization, disfeature::DiscretizationFeature)\n", + " ch, loop, = ini.ch, ini.loop\n", + " x, xPhys, xOld = ini.x, ini.xPhys, ini.xOld\n", + " # U = ini.U\n", + "\n", + " maxit, maxchang = setup.maxit, setup.maxchang\n", + " nely, nelx = setup.nely, setup.nelx\n", + " eta, beta, betaCnt = setup.eta, setup.beta, setup.betaCnt\n", + " volfrac, penal, nEl = mat.volfrac, mat.penal, disfeature.nEl\n", + " act, move = disfeature.act, setup.move\n", + "\n", + " Hs, h, ft = filter.Hs, filter.h, filter.ft\n", + "\n", + " # Emin, E0, penal = mat.Emin, mat.E0, mat.penal\n", + "\n", + " # free = load.free\n", + "\n", + " opt_hist = []\n", + " vf_hist = []\n", + "\n", + " while ch > maxchang && loop < maxit\n", + " loop = loop + 1\n", + " # COMPUTE PHYSICAL DENSITY FIELD \n", + " xTilde = imfilter(reshape(x, nely, nelx), h, \"symmetric\") ./ Hs\n", + " xPhys[act] = xTilde[act]\n", + " if ft > 1\n", + " f = (mean(prj!(xPhys, eta, beta)) .- volfrac) * (ft == 3)\n", + " while abs(f) > maxchang\n", + " eta = eta - f / mean(deta!(xPhys[:], eta, beta))\n", + " f = mean(prj!(xPhys, eta, beta)) - volfrac\n", + " end\n", + " dHs = Hs ./ reshape(dprj(xTilde, eta, beta), nely, nelx)\n", + " xPhys = prj!(xPhys, eta, beta)\n", + " end\n", + " ch = norm(xPhys - xOld) ./ sqrt(nEl)\n", + " xOld = xPhys\n", + " # SETUP AND SOLVE EQUILIBRIUM EQUATIONS\n", + " # cMat, Iar, Ke, Ke0 = DiscretizationFeature(setup, mat)\n", + " # sK = Emin .+ xPhys .^ penal .* (E0 - Emin)\n", + " # dsK[act] = -penal * (E0 - Emin) .* xPhys[act] .^ (penal - 1)\n", + " # sK = reshape(Ke[:] * sK', length(Ke) * nEl, 1)\n", + " # K::SparseMatrixCSC = sparse(Iar[:, 1], Iar[:, 2], sK, nDof, nDof)\n", + " # U[free] = cholesky(Symmetric(K[free, free]), check=false) \\ F[free]\n", + " # C = F' * U\n", + " # Vf = mean(xPhys)\n", + " U, C, Vf = FiniteElementAnalasys(mat, disfeature, load, xPhys)\n", + " push!(opt_hist, C)\n", + " push!(vf_hist, Vf)\n", + " # COMPUTE SENSITIVITIES\n", + " # dc = dsK .* sum((U[cMat] * Ke0) .* U[cMat], dims=2)\n", + " # dc = imfilter(reshape(dc, nely, nelx) ./ dHs, h, \"symmetric\")\n", + " # dV0 = imfilter(reshape(dV, nely, nelx) ./ dHs, h, \"symmetric\")\n", + " dc, dV0 = SensitivityAnalasys(setup, filter, mat, disfeature, U, xPhys)\n", + " # OC iteration\n", + " x = OCupdate!(x, setup, mat, dc, dV0)\n", + " # CONTINUATION\n", + " beta = cnt!(beta, betaCnt, loop, ch, maxchang)\n", + "\n", + " @time println(\"It.: $loop C.: $C Vf.: $Vf ch.: $ch, p.: $penal beta.:$beta eta.: $eta \")\n", + "\n", + " Visualization(setup, xPhys, loop)\n", + " end\n", + " return xPhys, opt_hist, vf_hist, loop\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABLAAAAJYCAIAAAD9hIhNAAAABmJLR0QA/wD/AP+gvaeTAAANS0lEQVR4nO3XMQEAIAzAMMC/5yFjRxMFfXtn5gAAANDztgMAAADYYQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARBlCAACAKEMIAAAQZQgBAACiDCEAAECUIQQAAIgyhAAAAFGGEAAAIMoQAgAARH3D4getFtxM6QAAAABJRU5ErkJggg==", + "image/svg+xml": "\n\n\n \n \n \n\n\n\n \n \n \n\n\n\n \n \n \n\n\n\n\n\n", + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It.: 1 C.: [NaN;;] Vf.: NaN ch.: NaN, p.: 3.0 beta.:2 eta.: 0.5 \n", + " 0.000303 seconds (43 allocations: 3.281 KiB)\n" + ] + }, + { + "data": { + "text/plain": [ + "([NaN; NaN; … ; NaN; NaN;;], Any[[NaN;;]], Any[NaN], 1)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# @time xPhys, opt_hist, vf_hist, loop = Optimization(setup, mat, load, filter, ini, disfeature)\n", + "Optimization(setup, mat, load, filter, ini, disfeature)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.7.0", + "language": "julia", + "name": "julia-1.7" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/top_oc/main_test.ipynb b/top_oc/main_test.ipynb new file mode 100755 index 0000000..ef6b358 --- /dev/null +++ b/top_oc/main_test.ipynb @@ -0,0 +1,66 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "module test\n", + "export main\n", + "include(\"/Users/yu/TopCodes/Julia/test/top99neo.jl\")\n", + "# include(joinpath(@__DIR__, \"top99neo.jl\"))\n", + "using .TopOpt99neo\n", + "function main()\n", + " setup = SetUp()\n", + " mat = Mat()\n", + " disfeature = DiscretizationFeature(setup, mat)\n", + " load = LoadsSupportsBCs(setup, disfeature)\n", + " ini = Initialization(setup, disfeature, mat)\n", + " filter = Filter(setup)\n", + " xPhys, opt_hist, vf_hist, anim = Optimization(setup, mat, load, filter, ini, disfeature)\n", + " return xPhys, opt_hist, vf_hist, anim\n", + "end\n", + "\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using .test\n", + "\n", + "main()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using Plots\n", + "gif(anim, \"./top/top_hist.gif\", fps=8)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.7.0", + "language": "julia", + "name": "julia-1.7" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.7.0" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/top_oc/res/output.pdf b/top_oc/res/output.pdf new file mode 100755 index 0000000..7ecc0aa Binary files /dev/null and b/top_oc/res/output.pdf differ diff --git a/top_oc/res/output.svg.pdf b/top_oc/res/output.svg.pdf new file mode 100755 index 0000000..13b5a83 Binary files /dev/null and b/top_oc/res/output.svg.pdf differ diff --git a/top_oc/res/res_10.pdf b/top_oc/res/res_10.pdf new file mode 100755 index 0000000..2204a28 Binary files /dev/null and b/top_oc/res/res_10.pdf differ diff --git a/top_oc/res/res_100.pdf b/top_oc/res/res_100.pdf new file mode 100755 index 0000000..bef70cb Binary files /dev/null and b/top_oc/res/res_100.pdf differ diff --git a/top_oc/res/res_110.pdf b/top_oc/res/res_110.pdf new file mode 100755 index 0000000..83296bf Binary files /dev/null and b/top_oc/res/res_110.pdf differ diff --git a/top_oc/res/res_120.pdf b/top_oc/res/res_120.pdf new file mode 100755 index 0000000..6a1275d Binary files /dev/null and b/top_oc/res/res_120.pdf differ diff --git a/top_oc/res/res_130.pdf b/top_oc/res/res_130.pdf new file mode 100755 index 0000000..861f460 Binary files /dev/null and b/top_oc/res/res_130.pdf differ diff --git a/top_oc/res/res_140.pdf b/top_oc/res/res_140.pdf new file mode 100755 index 0000000..726a294 Binary files /dev/null and b/top_oc/res/res_140.pdf differ diff --git a/top_oc/res/res_150.pdf b/top_oc/res/res_150.pdf new file mode 100755 index 0000000..7fc4df3 Binary files /dev/null and b/top_oc/res/res_150.pdf differ diff --git a/top_oc/res/res_160.pdf b/top_oc/res/res_160.pdf new file mode 100755 index 0000000..7646890 Binary files /dev/null and b/top_oc/res/res_160.pdf differ diff --git a/top_oc/res/res_170.pdf b/top_oc/res/res_170.pdf new file mode 100755 index 0000000..0562e55 Binary files /dev/null and b/top_oc/res/res_170.pdf differ diff --git a/top_oc/res/res_180.pdf b/top_oc/res/res_180.pdf new file mode 100755 index 0000000..583f7ce Binary files /dev/null and b/top_oc/res/res_180.pdf differ diff --git a/top_oc/res/res_190.pdf b/top_oc/res/res_190.pdf new file mode 100755 index 0000000..212836b Binary files /dev/null and b/top_oc/res/res_190.pdf differ diff --git a/top_oc/res/res_20.pdf b/top_oc/res/res_20.pdf new file mode 100755 index 0000000..961cb4c Binary files /dev/null and b/top_oc/res/res_20.pdf differ diff --git a/top_oc/res/res_200.pdf b/top_oc/res/res_200.pdf new file mode 100755 index 0000000..b209369 Binary files /dev/null and b/top_oc/res/res_200.pdf differ diff --git a/top_oc/res/res_210.pdf b/top_oc/res/res_210.pdf new file mode 100755 index 0000000..3ab889f Binary files /dev/null and b/top_oc/res/res_210.pdf differ diff --git a/top_oc/res/res_220.pdf b/top_oc/res/res_220.pdf new file mode 100755 index 0000000..6319689 Binary files /dev/null and b/top_oc/res/res_220.pdf differ diff --git a/top_oc/res/res_230.pdf b/top_oc/res/res_230.pdf new file mode 100755 index 0000000..05f8767 Binary files /dev/null and b/top_oc/res/res_230.pdf differ diff --git a/top_oc/res/res_240.pdf b/top_oc/res/res_240.pdf new file mode 100755 index 0000000..eeb047a Binary files /dev/null and b/top_oc/res/res_240.pdf differ diff --git a/top_oc/res/res_250.pdf b/top_oc/res/res_250.pdf new file mode 100755 index 0000000..63546f1 Binary files /dev/null and b/top_oc/res/res_250.pdf differ diff --git a/top_oc/res/res_260.pdf b/top_oc/res/res_260.pdf new file mode 100755 index 0000000..fb07db4 Binary files /dev/null and b/top_oc/res/res_260.pdf differ diff --git a/top_oc/res/res_270.pdf b/top_oc/res/res_270.pdf new file mode 100755 index 0000000..b9887ee Binary files /dev/null and b/top_oc/res/res_270.pdf differ diff --git a/top_oc/res/res_280.pdf b/top_oc/res/res_280.pdf new file mode 100755 index 0000000..77e6303 Binary files /dev/null and b/top_oc/res/res_280.pdf differ diff --git a/top_oc/res/res_290.pdf b/top_oc/res/res_290.pdf new file mode 100755 index 0000000..2973166 Binary files /dev/null and b/top_oc/res/res_290.pdf differ diff --git a/top_oc/res/res_30.pdf b/top_oc/res/res_30.pdf new file mode 100755 index 0000000..e98fbed --- /dev/null +++ b/top_oc/res/res_30.pdf @@ -0,0 +1,215 @@ +%PDF-1.2 +% +1 0 obj +<< +/Creator (GKS) +/CreationDate (D:20220428110710) +/Producer (GKS 5 PDF driver) +>> +endobj +2 0 obj +<< +/Type /Catalog +/Pages 4 0 R +/Outlines 3 0 R +>> +endobj +3 0 obj +<< +/Type /Outlines +/Count 0 +>> +endobj +4 0 obj +<< +/Type /Pages +/Count 1 +/Kids [5 0 R] +>> +endobj +7 0 obj +<< +/Length 12 +/Filter/ASCIIHexDecode +>> +stream +000000ffffff +endstream +5 0 obj +<< +/Type /Page +/Parent 4 0 R +/Resources << /Font << >> +/ExtGState << +/GS255 << /CA 1 /ca 1 >> +>> +/Pattern << +>> +/XObject << +>> +>> +/MediaBox [0 0 400 133] +/Contents 6 0 R +>> +endobj +6 0 obj +<< +/Length 50463 +/Filter [/FlateDecode] +>> +stream +x;Lۜׯxb!eImIkN S 3Cjk [,Y\`X||\m7_/b?O~/,v[[﷫mW̷O\Yo?3_.?s_Ͽbw|5ߝa#F0&ڕe>lKGŦTͧCkLo xF2`#C@=TͧC|&TMTg$#F00ͷ'<#F0`A lM?F0`# arzsr:yN0C}q)0뛂UuZ7owaflﱩo<#F0`A <|Z>TͧC|=Tͷo<#F0`A $i> QP5 &MF0`# !KP5 UiP5ߦjEd#F0 i>-j>zM~3`#Fj>3j>-@7S5`#F0P5UiP5@7S5F0`#tB|=TgBkLo xF2`#@p|~3`#FTuHmx"yeBJg૳`#|!u /Z/M/\iqqYe3q})բ:YmnMAx:&3#ELo'§/m:F0ׅlg^$ͧC|~̌i1dsMl#o#N_y_|=TͧC|~鰙̌w5L:§/m:F0ɚ W4 UiP5ߦjEx:l&3#$gT' ۟CmWg#Fx![j|O6U#GG#MfFz9tM|Mu9O_&pu6`w [j>3mF B{4i23R/Ih!l#GH.<{E4UmF Bx،6T' CmWg#Fx!\hjM=3I|ӗ \`#mOT!4)<7mWg#Fx!4U#Pw~ۙ]NG܌={߅yEˮܬVFHKtjeё_Onj2/t䥕ve8zmg#חFZ׵w}7=x=}՛Aכu'Ւ٧γ7e;E +F׏tRA磬_a::R ~ۭO{r9eZUt䮾)iS5",25?>w=_jKˡj>~~!YP5 U3j>sB|&TgB|Z>`#|Ϯ/ijA_ΔVx# Oˇ6U#,Bnj ~3ju+m QP5 UiXOL?aG2F 3遰޼z/O6U#K|j|&o5?X4U_fUS6t5fU3j>k3Oy.lgB|&Tg>jj~Gw$#a?8}Љ< -/Fw:4{?gS5jP9o~=|LgB|fIͧ̓Ln4 UO>JL|vu##GH\̓ +o`?ꓭᡰ,gB9@XؚU`3O%TͧCΓ9τfIiP5y6CiXAU3j>9Nyd#~"qq>{3OeX.ȄP5 UdFxax3a3OݚUP5?i3O ܔOO&k> Q'mgB*IiP5y, w$#a?8}ٛy^޼ ȌB;P5~U`Fxa.Lw5Fxc ]?8/[_1U#p|4e]6?LkЍc ]?8[_1U#p؜/9EݟϺOV0~y3O2j:<Ų |S]iü"9׉Vx狯/;7mWNڝx6D_zzsxDQru# *0,okTͧC|&TgB|Z>T_|9=Tg"/uj.ۭLτe_Hu'~A|Z;TgB|A|Z~3Q {5?<$i~smEͧCHW{5 Uis6U#^Ƈm<} 0k>j>j>-j>3j>-j>3j>pq>~?|&TgZϾ_5 Uӓpw2{oW _j>ۇ’5~UP5k_j>TBߞO*LOˇ|OLτ|O4{τLLY̓d׋y4k }fj>3m3OөL>&j>-?E"ju(,[U`&j~`g~A|&T͟ W[j5UiP5UP5 UP5fUiP5 UP5 UiP58'K󇼙'Q6di%?8|f:<'afO˿?NEgfi>懛%ͧUl{H?3S½5 UdFx!.TgxdͧC|&T5UiP5 UP5 UP5UP5~U󕓶y$fL7Hٚ'm5 Uo؈ߵ'IP5?.LO}ے5I|&T_C|=T͟ B;P5_w_|&TͧC|f'TgB|&TgB|Z>TͧC|=TgB|&T9itk>T_Dc / }6YKg{Ҷ~!TgBq*vggځqf gB|Z>T͟ w|w|Nwl~do\6߲=w|w|e3O`q>~]6e]6e.o+UUGowan7\t +-8S?azϝ^rZH)Y/o#_^&/{$^c+7Dz5 +\]QV.qE;;NT}m ΍u#M_$y]N9wS5㪶?|Wó<3jOW2/|&TͧCDLτ"۟_x|Y;Tg=_H|&TͧC|&TgB|Z>TͧC|=TgB|&Tͧ-:8}LτLOˇ{?yI3j~|RB|&TgB|&TͧC|=TgB|&TͧC|=TyY3y BP5Vj7^h~i>$k>7Mu |B36$i>-j>3'8/iO,g/t-j>7"h>3j>j>淎`k~X-G$5~UgaFx!QiP5dk>S|Ƿ8}Ы8Gߵ'KP5 UiP5?8}_oya6d/~ j>3j>3j>-j>3j>j> (LgBI@|&TgZ,)h^j/gk>懛y$ͧC|Z>TͧCq/g#I[I_oIܡӵN&L̓|O{τLOˇ{#4 ); +TͧCI@5 +,e5 Udz8}?8}I9itk>TgB|&TgBq.g#ISfԍy~mVItgB<OLτ|O{τLOG$3jL:—@|=Tu6T~_Ͼ_?ӻ5IۤP5 UiP5NUǵ8'm{;P5?c'mz +@fAP5UP5~UP5UiP5-AɖA|ZMo lwq||6¯_p|w|?le]6C?i.s ~|w|w|7@bS弩'Cvq<|1fE{vgq]ifמׯHF0°vw!x狫ۤDžsF^XFscQK^, +&ovSY>u-ab{iq)}۠=o/)\LT\O0;Sf}\_vDfYQ=x\6so$9yV<>SU,F-~|Ruai> Loi/=ۂϺ#CAy~x~=Zτ4{oUBτ<) OT'p]/B4;w{^.j>-d# a_f-Bn QiP5 UP5|#-j>3j$ͧC|_BiP5ȹ'R5 UWgw$#a]ode{/5 UiP5~UP5 UiP5/Hl,Hfi>ɤ:|5fUxg ٚτHF08ߙ,ۣEH|=TͧC|&TͧC|Z>TͧCxAR.HJO~\' \拐L9eP5~Uݑ`!# wqiv/XGLOˇ|OLτINVW;W5#4DͧC|s>΋4j;0D.'e`+B߃< @|*:TgB|&TͧC|:=T-׻57K}zRua.o#aYqSlll F'Uw|#a^Mh\6e]6H#TXpTo;gk~'SP5d#F2kͧC|=TgB|&TͧC|:}Tg;U23j>f,L`8O!.TgB|fAB;P5F0d_%tgB|&TͧC|=TͧCv3j>]_Sh|,L`8O!Tͧ+k,C|&TwG2`#T5 UiP5fUP5 U󙝲ShCF4&0.o#Fp|w #lF0R\6e]62y[o 殺M*uNͬ{~ʌ]{}Oɋe3q})7eUÌ HF00kq"2F|.jP9X vyx}yOìnD}u(.aחMQudU,iWl;QT(aׇsqNFֲ}_-<~ٙflk_Й㪙.R7]1⿾}[rn1ܱ0<_ gB|ffރ0j;`#!YP5UP5UiP5~UP5]*-#F0P5UP5 UP5UP5fUgB "4vτ< Oˇ-@w$#F·C|&TgB|Z>ToTXp/BǞOo>u UP5a`#UǞτSOLτΣy)Oˇzw /l͇L#h>-#F0¬zGKavj>3j>j~[05~Uͧ{!.Tͧ姗ٳUiP5F0f.TgBGeQiP5~UP5q4O|&TͧC|6 lF0.Ep|7`#lld?{YIusߩ,\㥙~љyfZ~!۰mrۜXjfC=tG2`9 lneQjqղוښ]Gjmfy[A r?TwG2`)"lj>-j>3j>-j>3j>?J#F0e|τ4{OLτLOˇ4{OF oG%j>ky:@|=TwG2`1#n͇4{τLτ|O{:]|lw=;P5Uiyl͇L?d##Fxy3j>3j>e035 UiP5tajޭDx8oMy\l݋#F0¸:*0ܲe +s:Fn.~/Usqr;XFn׫ OKZfO_8>NzQd{"|Sv ?\n_#7ӹ*0UY֦dW#Y7r]1j:G]O3lZo)TL85cB4^fUP5 UP5F0ƌQA|&TͧC|=TgB|&TgB|Z>TͧCVq|{8z4 Uye;7OHF00fMߢj>3j>LdͧC|=TgB|&TͧC|g# ͧCxq>7Si>#F0z5~UP5 UiP5fUP5 UiP5dͧC|g#2Bj~󤭠ު4 Uݑ`#aL/5 UiP5~UP5 UP5UP5-ٚτF%LgBe4UM|=TwG2`1 $k>j>j>- QP5 UP5ٷ[j~A|Z>Tg̓Z6WP5F0LOˇ|OLτ|O}5 U=3_#ioIjj>-#F0P5UP5 UP5UiP5fUP5 Uxo5*l`#Le]6e'3 !lF0$\6e]62?m)]U'{Y v}f?̮]<2eYSKSxP;`# a~-Yǿs]˺å+Z6r}y>0k?<;Oewͩ؆Y⥾;r]˦,FcCl]*VW~ە sW\ rQPzq_/޼U-cyq~GGZ5e;Ņηo\Q=op6gruz߾<=τL?ӎd#{τLOˇ4{OLIEiߥ-_+P5 UP5TP5?<#i~fD8QHF008A|=TͧC|&TͧCɚOjZj>-lKͧC|g#:Bj>GMsهuy25?8Qi;`# !{τ|Oˇ{τL[wk>T+L?lC|=TgB|&TͧC|w$#F8BǞO{τLOˇ4{ڑ^lgBg#|O}|τHF01'[j>3j>-j>3j\hj>F56UP58/j>j;`#9B \τ4{OLτLבiB|&TgB g#l`#e]6e'3k.F00:w|͟p6"YvyA^ť\c~s}(rWy^ sV}Vq^gv$#F=h..}s?oCX_,6T0sr}ݱƹz5k<,u: +7ђWonnG$T͟mG2`_C{|AP56UP5Qt.MiP5RI|Z>TͧC|g#|o6s?f$QS6<|&TͧՑ`#ϝ5 UP5U;i>3jV|<=τFK'΢3j>k3Oj>#u$w$#Fj>3j~PtN|Z>To~Kae|τL?lDH|Z>Tͧ?Tej~f,gB{F0|τߛyTͧC|ff$ͧC,ف|OFK ͧC|&T7HOˇHF0 'pj>j>wm|&Tͯn)|OL?lD4 Uie{@|=TwG2`?C(UiP5 UP5?#i>-AGJ< UWhO~84j~z[j>#F0¯#4j>3j>-j>bG,U;C U';.F00pw|qg#!l`# e]6#l؇'NvrAѧVNomih8o.MR,/ R^Y7 +'nF0~ !lq)T'jߞy.ev},/0c ^ղxʎ _cqKEgX]u3-/"z>l.%Δ ;R(j]{"|߿7f:̮{g# ![P5'S05~Uݑ`#]h- +Oˇ{X5 UiP5)SP5 UiF&B#5Us6tj>3j;`#OLτ|O4{?$j>-j솳ȹLgBTgB|&TgB|Z>[HGj9 +TgB|Z>T͟p60zCAwo|&T +sG2`_B|=TgB|f{jj>;#فR3jd.TgBfAiP5F0~ A|&TͧCEkjO4 UyCGz53j>-On8aɅvj>-?퓭P5~Uݑ`#m$4j>3j>j:R \OUC+a.F0we +F1l`#|e]6eGr!&УTa粸'_Yς+H[zxwQbv9ie;w$#FEX& yN0my1xse#~ {Ʀg,j{>mmqyd}]߮Y_k#w_ +t|9ev#,og\k..3̾eѰEfA|&TtO*y|=TwG2`\'τL+U$5gB|:RGus5 Uik#A|Z>To/gk~_%dgB|w$#FHEH|Z>TͧCYτL?$iwmUiP5b`"=6UiP5l~3j>)HF03OL4UP5).ktτh#τyzCl#F0 τ|O{ϼ%wG(~/i>-揻0bªOˇWy^LW%kfF0>JO{όi|_g<5sTͧCG ?V0ˆ^l͇'̓\hs#F0»C|&TgBOL?tk>TgB|&TW+a'pj>mɮ Uݑ`#]=;P5UP5̓LO˿HI'pj>\zP5`#lF0¯#l e +F1l`#l#lZDղUu0/_YO^Ӻvރ0omw.Jznw֜#w$#F B4Uaibpw֎~ߙ +쒽·}pܮE3q}9f)f| f)ueU*a^;򰭻Pm+엸syOU,C +F=Bj~A6dk>suG2`[EOL4UHO#u dh>3jw©FLyg3O~!KP5F0nh>MϿUP59ӎԁ h>Ξj>-O0zQiP58Ld#a{vj>OG44UAiP5)j>agIOSi#,ͧCWe_j>j;`"<ݚUP58/j>-j:RC#Yτco#BIil'j~Id緄LTϺ#F#B \Oˇ]Lτ3Hqvف IiP5`#فlgj>f'pj~eE$ܑ`#; +@|&T{mj>O#dk>TͧC|=T[+a/Clj3OrT͟UG20G&TgB|ffB;P5 U'ڑL8 U4U +F=l`#..F.l`#h_.[ce +FB k(ss?/0S8' o9/}Ϯa4s>eq&ݻ 0-ͧC|=T̓LOwG20q$ͯ,S`vj3 +FBj>-?l~WgB|w$#E4U_|{τ5gvK|Z>T͟Z+aZO⼤LOˇHF0Q[8CiP5̓LOˇH?P6G|=T͟H+ab3j/5NU9jj;`i t4 Uۛy5N4ͧCwB#ۂj[B!i>O|&TgB|w$#Ft+LOŤP5 UgڑGڳUO%ͧ#@=TgB|-Ͼ#F)ӭP5~U]_*UiP5f}g[j>jZBp|70gw lZBp|70gw lZ@WoO6yZ_.:z"=7cΏ3c3O;?rf9,چy_pG20^|S;q/xͷ#sw9.&pn t$#heUͧC<τ HF0Ƌr6E4yͧC|&T͟uGAP5UD}+L#_|=TgBT͟eGNLͧC|:Tg&БDP5W6yNf$ͧC|w$#cDH9ih~PL懶j>Ϫ# +B¢3j>-揽&Б4{W6.TgB|w$#cBH8i{MτvdgB|&T͟EG=;P5dͧC:24 UP5?#i>-#FBj>gsh|&TͧCIw_Ax5#[P5l0dAP5q]5fUP5F025 U +Oˏ7gځ{?Ɏ+ 'pj>-?~Bf?V@G2_O槜M: UiP5F0DͧC|i呟lliB|Z;ү!dځzP50d.o#ar. .?V@G2t|709wB+L#A;C=Eye +sږחEV=(r*՞Nͱ )Ne#Iz\܋-? wG2Yؚz 󴸜/a"<.z6m0ͣ1F^"s8//kN5xno:d]'ܑ>-9r_m\\pe6l0{91V0, j>Sm gBw$#LU9KP5fUiP5sٚτ7' +FB<}=TͧC|ugTgvksG2YlgB|f"L|τL?1-Tͧz!O0^gB|&T|uF0G3Rj~"L3j>jt:3j>揿0τ|τ{_pG2QDU3jEOˇ{OwHC@|Z~)$oл5Ϩ.\|Z>TͧC;^Lτi#c#TOp3j;`?Gxy3j>-s~FY| : @|Z~[8T~+a.F0F.?Ch#e]6F0¨\6eG>\6`#4@ eYT07iqX5sڕ(ߕ={VVa۝N&Nt,%<"F0q5Km 8U.zj[s8i:^Nb=}u.r]ߥ,Go.<E8ݾWFŲ\U0X]wq;X{?V0¼25 U7tͯj~q*#FP"ͧC|Z>T̓Lτ|?4 +LgBǩsQyT+aj~$i>/?P5 Uݑ`#"j>3j~G|Z>TͧC|=TOG$ljZFh|P%h>B޼TͧC|w$#/5 U9朴`j>3j>-e&y|&T͟B+aUP53Oj>{`#Bj~Iۧ,TͧC|Z>Tw"Ăi>3j[FٳUyLτޛg#5 UvH&{τ u1 ف|Ocl#|+߹G|=TwG2[OˇvHfځLOˇH@x5j>揩0oP5?^iU|d#3j~I&TͧC|=TGB \τ|?V0¼\6e`#l|Ƃ0ow|#.H@p!'*V(f=}3;`<ƺq? [.ĩSmx vXlw$#) +Brpjrޟ[OsLzIlGWabq5 |*v9ΎJHngy)bQ+ߪXr˦2Rsu(SKMH;BZ_rQYD$ױp{y;0k#Fhd4{g3j>-j~|yicLτ;j#᫶{X5 UiP5F0-|gBOIiP5 UP5cic j>-jZ3Eh,C|&Tϯӳgj;`=;P5U)A5 UP5Uڑ&0l4qV|&T͟B+a{vj>Wy53jL;`'[j>Ǐ|&TͧC|=T[GXU]T%i>-揹0W[j>3H: UiHF0NBq$AP5UP5 Uґ&0ٳU>|&Tc+aI'pj>Lz]E$ +@|w$#ivj>-?ϧ[j>3j>-#M`,bk>T?4U +F+l`Ap|Xe +F+l`Ap|Xpad$_;$ÙwۭO8!o[QD"[xWХ떣;kayW~Gv\Ԣ"w$#a"C0TYE,P^ +ÏItSh겿Yk>j둩e^vT֋ Sleo/_y),7| (:B6B]QE6חR}<.^Vv66a}YUYE݅& +F+Bj>77OˇHF0,:5 +U Lj>goG|&Tg#M`,d#$i>-j~'j[sE4ܙ]ٱ?YiP5FSͧCC|&TgB|Z>TGGXF|=TgB|^' +F) i>槗lgB|w$#aIOW +|&Tw¤^_fUiP5ic!A|&TͧCf=TgBK[3;˛|?d#L!KP5mj>U+j>3j0;BnO|=TgBiбgLRiP5~Ugۑ`i#HOˇ}x&k>jτ|?4egs$h>-揻0W'[j>mI8 UiQ w$#aOQP5g3j~_+$k>SP5~Uё&0:@|Ol#!.TgB-[iP5?*"d#U vj>[![P5U=|߬R%h>揫0Ww|#ee7\6`"lFx\6;]6~c!e +F0«r] r{:.Ux]vͼnö]qMm)=߸#@K"\_$:Ǒ)ls8/·tM_ZU0tV+t|⹪>ˡ/loodq)O.jy)|jzPqN/0;w}cq\/8d!DO4{V3j>FB\/GiP5{#CP5?O<4{UGH|Z>TͧC|w$# WP5 Us"ͧC|w$#a +q?EP5!h>-槶B3j>Wߟ/x, !CP5 Uݑ0τ|֫{d#sTgvKԾJKOZ3j>-{, A|fGjZFhdͧC𙶒Z +{|d#|U/KP5 UZ!YP5~U=;O4{?V0Zٚτ̴KaɚOHF0˜NB|OV|&Tͧ7 qj~󤭠L?V0|v6c),[P5FBVIP5 J-;dځ՗C|!tف#$25U +F0B33jvj~!#CFiB|VXgsR[XO3jŸ#<ٚUP5~U +F0B3]6e`#l~ޯe;~e +F0B3]6e`#l~f+ldo"lZFx}jy}-<_}ysqخE3q饰8f{.epf=,U9o/,HͲ#pX,wxhz_DW+l}[h /)jqC }x:;]_y#oPSnMeQߥ\t 0wkRl%Mc3O- q6s}gdCw +HFeIU|Z/eh>3j,;ٚτ̴OˇXS|Z>TX|j>a0d_FTP5 )h>-uqG2!&Lj~'τ?hͧC|=TX i"|4{#&Б/4 U=Ac3Oj~P;105 Uo/L|Z>TVxLOˇ G|3j>? +HFmDͧC ٱ'[P5w$#C)5a4U3Rj/Bj>x,|×o3j>-揵&Бτ$;=5j;!0yO<B+dj~Š3]6<OC|:BdͧC:~A|Z>T^ +%k>#.TgB|Z>Tͯ`+Oˇv>dP5jXZa7ځiNB|&TwG2!TͧC|&TgB[Aṅvj n,|!TͧWiB:~oRu|7]Oe]6c.?V@G2/#M.F05eVpO#lZaAXf ](ծ懛y$ͧC?hτ|?0: gB|&TgN`=T~ +F3_tޣAjTZF:@|:=T:'j>3jL;![P5?§OˇCjQiP59206F}$QP5U +F0tk>TgBꜩLϋ;35$5U}\L?VT/;^L?0:=;P5UP5`#I'pj~L[IWgQP5Fτ]fi>d;W/4CrcatOC|&TgB dځ)'}3|VmUiP5cat 'pj>-sAg;V0w|#O\6Ch"lZF\6e`?Ap϶FCh#G7史߆syY쯉KGpʎŷ8ɼ:G =ڏ^"̢n__pxw$#! !h,va^O.kndOss[(xi9/׌E[!O=Yɾ*¬s_y9v&]q.0UYVkRV3jT45~Ui -[з `ǂtzLτHF0BՐτ̮IOˇCHj~ך:ֱ0MlgB|Z>TgP+_=TgB,i~xG|Z>޻.͸#a{v=۩Oޛ'|&T@G2O(7&?!UiP5~U +F0бg3;ϵhIOuiFx5/:'m%gBv2τIu&car5 UP5`#OC|Q'.Td# $ͽyZj:RϞOˇ Dj>-jx[FNB|&Tgvm*Uݑ`B;P5r|{IGz5{?0IޭP5fUP5|`#vj>-ѕ7TgB|w$#PO?*U9; L< UiP5ca/OB|&TgvxX+l6Ch lZF\6e`w|pGp!aY] A^6ũ,/_YiȧOn{k3O/Z{#i>-#aFO5UiO͋j?O|=TgBq"$j>-j>`A|&Tͧ忳q{d $i>3_=5WP5gj>3':拐LτIǩdj>槔LOˇHF0B3jIOˇaؑDͧC"OoM|=T͟T+*Bc۹L׫|OHF"|w{?Vо8ޏ{?0[mY>iL?V0d=;ǩOˇV^j>3jl;&S|=Togk>ĎG4U1бM|&TgB1 #<ٚUP5?e3O \T͟]G2c3j>-j[FNB|Z~<3 tm*U HF BO9XO揩#ؚUP5ca/CζXO;4L`#.F0BwlZAH.?V`e]6FcB+e +@p!{N_/sx=swe{3ϥ=fuᴼaZqVu;6:з]߹Vc7^e{xs}zἊfb\lS>iۋs]3'mwR¼KYY-nP BXRcQ&/rte=VOƹ^QY߹/c]}u6nj>P5'[iP5u"UG20V4 UY|Z>T͟TG5U|_!|Z>TͧCFHCxL)ߕOiۗ={vj>c,L`8|Oj#GDͧC|ffޭlk>#aIOˇy|G`+pGz5sEP5caj>O`AX +|=TO.TgB|w$# !KP5?m8'awP5fJa ?Bh-C|&TͧC1#Ka3j<Ʌvj>Ϻ#ajQh~#eځL?V0BϞ|jL?V0~e]6Fp!Ow$B+Le +F0 la.?VCh #lZFUeyV9\8?D?-߅yxFWeub^XRVfّѝ(ղuW^c3'm[^gq{UV85$K;Rk®uY^a{{|jfyQvUXpB4wŦ<zPo츳o\<1zn0sy=Yw~g}`# B|ո=TͧC|+xyj,;!QiP5?m_} >ё$ͧC! !!<|&T7HOooX+?УL4`>eP5HFKLgBW'm_j>->Бns4TͧC|4UP5jmX+?BiP5?_>H|&TonxDžF<|Y[jZ1_C|&T͟y+L!KP5 U;' +F0"$j>3j~[05 UiFKi>Ofk>->ё:@|=T͟i+LA|&TͧCτԓ[j>WEKj-VLͧCu[j>Ϭ&pTj>3j4ZFIQiP5 HτBٳU?k|&TgBtP5UscayHu%ͧCq&OEyi<NFys @|w$#1‹P5YLO{9َUh?V0B:Ol#\6e0:B+|#lZa.?V0~e]6Cp!':&Ch#WCKsQleݯ:sy03weQnLmjn>泍f +Bx{#h>-gy`tNo_5 U6<쿤|?dLdͧC|my㫳>7u/F*j>ϴ慐|Oˇ>c##<|'4 UmI|=Tot$#d"dk>3svف[mej>Ϭ慐{τɵI_}Y>TͧC-S6Rn͇LtG2лL;KOˇHYOL?VBѼ*L?V0~!ئӄ#TͧC|w$#([oaͧ`fӄLD4URP5b0+ye%ͧCq6w|#le?ޑbv lZFA=;.FeB;.?ێ˶t8Oe +F0g67 8jzqX/?2^wO-]'Xݬ%xsp>\_5N48zTջ#!>i_yZ^%Ku[p?FcƝU6 dl p^w`e*: +L$+a%l=$%SP'a'OTXLKϚTSP tJb>*m"ŕLgBeo 0 T>T"}Lt~{a:Pτ{  &l͇|&Tlz*?:WsK`>Tҥjp3*PoiX|**|l~29)|_(d0E.TS**|/&`D3BJXd v2'm'7H42Ce~KτGے@eFai)pOU`>**! \Hf>}QBJXd 6Za7mFJs &mͷ`mm?+a~k?Q`"Y J)۶9q8gw0fWa`>{nhv~n{ں#{6d82+_~+7w?~<;֣ 0\׏[6p9u~1WW'm_o2Ha<j7wUoص{?TmyVN&DVB2Pސ|y3|*# 3H|*PϴTӶgCe>}){̧G/g>*> +L$+aY% '1ʇwl)L?)3gѣDU`۹|&Tk3߳){*?r+Ab>k!=Tk2H|̧2?Q\||&TSP?R0nDU̧2|s^zL)Wm̧2_ gBe,F!46?=T32?QWX4y|*K &&Ce>tԼ;@e>*p"eV`P29^ +*{̷Z mτ|*?GJEe[`>K &> LO35*{Y =;P?^ +Pτ|HZ mESP2OQsq TĢ2DVBţim2y\m/TiBeLJx5*Pτ|**m"pk>T329Qs{/F?:Of>*6 +L$+aa%X|kokOk?Q`"Y96& 6Za2H6`%碵ͷd%b Sio5%?ԡ 2)FOm0*-iWC-,'J^֥9  +'?y˭~wll +I^BāMvM\?ʢ.}qܷk?˺s=6=*7#Sujg`%;:ns807݌[U?{4ѡ_$nf6 +VKHd>*ݧ %Q~7HPOCe~i %^lkgBe>?~-=TDzs |̧2?Q¿L̟|*? +VKOCe|2n$gBe>o/Lci %OCe>To%3 6SBM{gBe~`%L|*>gBe|GJq W%1τ|&T{9LELwwI̧2?iDzr8uPOCeGJ(!LgBe>(X V?.!9Lw$1_d>}L_DZD Q̧2/[2ُ4Q`"EN4){̧2`%sp|**{g+_0g'6T>T|3O"PO?"x"-$P?|V`>4ݼF!8 \'3 L?Y(X \KgBe>*? +VKx5v|~s>W ̿SOCe#'"JOCeWH$4ځyB)p8:\ +P(X POCe>e+J%D> "qg~PτG$O%p=̧2~)2  &d Iv2GJ|Qk+,&T/o+_`mmϬk?Q`"M`m0 +VB8mFJu 6Zs &d 6`%a+a%xgKc>QLj݃۝*5U gBe'm2ʇ9B32ʇFJ;;532ʷVJx|&T32d>LgBe2&ҿ*Ad>̧2NDzߜ-2|*s+aHSPs4T[KX+J%D1ʇ|*&2ؙG`>T>T{"|ˑ5揟Mf>3 &K%8v|&T7*WF0ʇ|*MTf>TGES]a̧2?#J8 +*PO$p`%L 2_IY`%̥Ļ2?dP̣2?JسTql͇|&TD%<ؚ=T+|%gBe~`%X s)]{ +{gBeIT>T7 c"l͇]aOBe>W:PD'%D< L%Qf'T32 K+JK 32ʇ|>Ce>*=U OBe>3+,TćW:PDh v2ʇGJ|*gb_(X V\J6Qka2H/`m0 +VB8mFJRͷZ 6Dzk?Q¿lm0 +V0׸w1H?nW7 +VD (tmY׼w!2̳/~nCr8+#oD2)!T>T|9=<*|̟DZOCeSĻ2?#Jlτ|&T/}τ|w3|*BG!d%dRB{gBe~q,2wf>}L̟DZd>*qOOCerdPIa>*+aT>TSP)^ &I |̧2|yPOCe&GSSP32 PBT>TP)Q72|&TKX(d0LJSOCe>*<\`>}=Tb"}f-D3 `>*B%<`>}Lgy;nwRτ|&TķQ`"Y _;+gBe>̧yτ|*߻ [mτ|fh3O|̟(d0\B|̧2?Q9ȩ̧2D2)!g*){̧2 Ļ2߻ [m׵6ځf$326Dzw ̧2 َ'[2o|&T/i2HVB&%<ܚLgBe|*P᭶~Pn摘OCeG!32ʇFJrPτ|**0 +L$+!6+ka2Ho.aX|HVB%$5ڱ6k?Q`"k?Q&JiZ|HV?[?{Z&0{lʶNDwρ vct󸺜#\k(_hgpAzqs]U]1qdWK yNi*&\SU7U=ql.y~FЙnq2zw/\?'/Mj˪Ob.Wm]Oܣ]w7UjK??vq4Sg ُp&|?N;77CXt輾M+l?ݮ{7rPeV6+q ̧2ʇ|*Pv摘OCe~=&T]!<3ʇГIgBeWĆ2+O׃|*Ҙk&`%KH`>}LgBe3|*{w;i"MefPτ|m~"PoG=T32~sN2 Lwni̧? +L$+Jτ|**iz)Ļ2ni0 LgBe>vD ̧2ʇGJ8S32 |*? +L$+J3|*Pg|**){̟D\ ̧2ʏy|gBe[B{gBe~`%3=ToLd>*; +L$+J辶3 LgG#2 L̟ZH`>}G`D= T,32ʇFJ8|&T3C¢OCeF!d%P r]Qτ|**P τ|**32#Iv2β)awjOCe>epA$SP|&Tf2HV/`k>TPOCe۹maT>T3Y ;42?O*9RvDZn 2 L_(X t`τ|V|**> +L$+J6k[`m0 +V9mF!d%R 6t-X|kmFJ8͟(d0_*a,n60ܾP= lOaݶ;'8'q(,ݮwx +{xAGܔ(۲&f_+?Cn^=qj&[ GS_✸~0SaWjQFݜvnU5n6e;sPOn.~4XW٣nk?D;Cef(dS?lw冘.庿, ~q9nնӿuǻyr3i|Pݖ+7 /G~6+3=$S~SP+,?TSPOCeGBP?}s>L7{.9#J`>T>Tg? +ٔ; +POCe>}?CeL$+J)l0?C2Rτ|t;OCe`T>TO?i|*g38"ͰPτlG!OCe>}=T32ʷd%X 0;=$5*0 ^aI̿_/gBe>HO&3|&T32ߎH 0 T>Tg7 +ٔ|*P 5b>6+0 T>TP +?|I`>_F28Ae>*yDPoG|Jf>e=T2 + 1ʇ|**CM璘?0&`%(%<ؚ=T32 3̧ox2̧2߿jKd>*툴-aτ|&T/})H)̧2 SPoJRJx*POCe>g<τ|&Tӵpk>T32~&2+#2Kف|&TSxe.q)H +POCe>M=TD@e>=T32|**e'k! \̧|g`iY%<ؚ=T~(dSBpN)v2|&T32G'`%D`mmׂͷ#Rv%X9B6%X'[m`%kom߸m+a)G>km+%L68uUVufOr|suݪ_7]QC>n ~ўϽnpj=Lp6θ=H#busvSmm}ƛ'Rp/i? +8߲$trr~Ҷp#=!Z-ԭNsOͥ*738"Ͱ . iwN\?N~ۓXG$'ˢ^FK?u[uAuٍ¼K]t^앛p@:0nW׃*(1?e"M=2vZ̧2 L̷#R%gBe>ٍ¼K?9ا*0|g|**|d%X o/a|&TsQKf>}L)P*<=2 'm5PoG|Jg ){̧2?Qy Oτ|**|̧2 ?1+%Lm;=#2q gBe>3⿸<{l|Db>=v= +Kf>Ӟ~|&T320"OCe>}LgޟkKd>YO$+Jx{ OCe>*o|** 揥|&TSoHI̧2OOCe=i%LSa>*|_(̼D32 T>TIYN$+Jx{ ̧2ʇ|?:Od>*<IQ̧2Ib>S?"f>es_WƒPOCeB_(̼T>TPOCe~VXPDD|Vτ|**){w{ KgBe;&R`){v2 s]WBPτ|*gf0M$SPτ|&TMOlD 0 T~mOܚ=T(TSPD +l~Q T>Tm9gpD_ v2ʇ|'¼KǠ2 Ļ2 Ae'`%komdm繜38"Ͱk?Qw 6ZYͷD\fX͟(̻komm-X +#\k]pRy^A@q>y9y*N/0qqs=l듛~/d.o ;e3Є~9lڮO,׏kr{8n_l.I[x@6m7;M ˫kӗE,g+%~1qOî9nͪkp0uDtq\`99uDܯe'WǓ9T9>V]q)Z7۶smy5r8Nom۪:Oʪ9htޕGmY훃޸Z~ =T%QO{b'P$32 T>T3OF3\τ|&Tg; +o+!T>TSPOCe>*POCe'RkJ;gBe~z 1Be)a&0m_ 1ʇ|*w̧2JD POCe~vOCe>*POCe>M=Tu"e(!g*|̏/aIT*0 *P/Ad>~b){_r>Px^0T2 ++A`>*|̧2|&T32n)`%D Ce>*?Ce>emIgBe>َd>81?)LgBeҖ{τ|*o#0A̧2 LgoD0ʇL ւ%D< T>TO|2S`>shSPNd~Ԗ|u*^/̧2)J@ =;POCe߰GFm%L5Ka>*Pτ|**7aOCe+!F;POxCe_B"|̧ ۣf+L?y|Ԧ1~^;5}9[ (|gBe>gFm%~ H*|̧2+,Û0M ւ%42sDSPτ|&T32~jO|BR̿l9[ (! \̧2gFm%<ؚ?~#&TM%32ʇ|**62X Vo`mmf9[ (aVͷ*[|kr>Q͟(komm-X ?Tg?*lN- DA˱Y]T|i5|U9'C3 +dO! :n,lvmt`7)ڪk׏sݪjB(~z\޲>mQU٭s7ڥm_r>Q'Hn/KKc}=T2 +Q%L0?Ļ2($0 L̷#`%(%OCe>*Qļf=T?9PO{?we>qO>`>*Pl%|O<τ|**> +Q%=TSPτ(gBe>?D0 T>T槌B'τMSm +?i|&TcW"{v2ʇ|: +Q%D2|&T32x*!=TPG$+JH*!=TSP3 +?RXSPfP{]m3CyOCe~J@ Ce>*?3 +Q%$2 $#OCe`?|*PO+#%$0 L4 +Q^j|&Tky{v2me>?3 +Q%̧2?PGb>T|+V32I/Lgmy5*-g+%$4ځ|* N%=T )0ʇ|**{ҙ+M$iBe[OCe>'m32Ge>K&T粜O ӄ|&Tg; +1x|**|̧2x3 x7؁!TJQͷ6?l%|k?QOmͷ`%X ô6g`m0 +Q%X|kokJŷNk˶LkW L(¦}eL'2 ?࿣*T>TP?Q`>e=T32 + B4y|*d%X Z ){̧2_Hy~|**){/&6D3 LgBe>?࿣* +Iwy6 + gBe>*POCeG!Ļϱ̷#`%0|&T32?m̧2 LnOCe>>iu*PCJ@ ;TSP!)m(gBe>=TPQXCe>?s4I#`%$gTr>P|̧2{(;3|*PO/G`|̿uxVG$+JH*!=Tߖǣ|**|S`>*Pd>}G0l9[ -Pτ|RG|&TSPOCe>jPg*|? #`%$|&TsQ ̧2 Ļ2|ID32ʷl%|F;POCeRG!g Fb̧2 ;ɭPOCe>L;"Y V+*|ϝ32ʇ|*{gBe>sm~PoJh 42ƒPτ|&TSPx.T32iG$+Jxkomm~6JD 6c`mmͷ`mmf9[ (nmͷVIWVquznvO?|D&τ|&Tnw0DSPτ|&T ̿߄?m${Sl%m$*|̧#2|_ 1 T>T^06k|**{#`%$Ļ2 gBe>*POCe>}LgBeno9[ (c>e=T32 2|̧2|(1ky*Pτ<"Y VBR ̧2|&TSPOGf>}LgBe}3|*m9[ I32 /B'LoT32ʇSQ\e>ώHVZ gBe>/HSPOCe~1z)kOCe>e=T32ߖOJx|&TSPQT|5j"|+?"7/T>T9LgBe>=T6gBe>*|̷l%|hPOCeFax =T32 }L/nm0ESidk>T32ߖτ|**(<9^Ce>*|̧2ߑ +nT>TJ^+!7Od>MI̧2 Ļm@e>sOBe>*x9[ (aT>TPF! \̧2|&TOmsZ ̧2|;"Y VV|kom kl%|kpX9d[+!OZ|kom󗲜`mB"m"O}#'ӻ#3FBZ VBz ao|/]s9ka]wnK*1yS]?MW~\ݻWM߷rGݖbۧǿ/1|{6e1J_?MG`I` + ﻰmw&G7ձmwׄ󿠹'ERe{)pܡٞ?b@rn6M{O0^v˿pyT8^r=ˬ¦?9yg׶\U3Hu1J9utId>}=T;POT3QOچg,wjl%|I32 yQ 6y1|m|**Z "|̧2d g%v ok#2 T9T>TP_ڈgBe;R2I {T /01ʇ|**YTd<__|&T .!Tw#T>T{Sτ|x{a4|̧2GU"?iK'm9-l%|hP*+߅-T>TPτ~$K^ Pτ|1JB%$0߻|fhyoUSPOCe~uId>*P?m$){y0o gg+s%$3 T׍$BԖU +POCe6K\ {v2ʇ|c`%JJd~hy){̧2 ŭ3|*h懟M`>s'Lw<|2ʇ|I*QDSPOCe>eL_Zx5*{7Y V#R"){wKgBe>T~U v23qy"6Ce>0ogg+c%Ke>*P: +w7y&6ځ|&T32y>;_If-D> T>Tb g%v #|&T32 =T32 Lg7$4_/$ӄ3ogg+c%SOCe>eq3T32hh*O߷*h*{yY ]ͷQym~6gg+c%XsZ|kom<+K6?j3l%|kNkom6/Nq|N?*aH<^7< ? 0`wM_i;m]Ӹ}֣,\ٜ8OiW~9!A)ڪk<&mI]WPmSn9i(mm{g{i?id缜Ϟu+5qhv? Om67f/Tm reU7mo_7v ;8ѷ?]x^塮Zu8Ǎ'ml}ٞT's_NK} I_v>US{q43"τ|T32 c{ >2ʇ|*|g;=T߮TfQO>}|**gpjl%|hPOCe>*|̧2|Džz-Lm`He>*sτ|f(SPOCe n'_/OCe>}LgBe>Sw}cϟoΧDgSP?_-l%|d32ʇ|:6u*!Pτ|&Tn:na߻^όC%$1|&T/i3󇏩 +gBe>c;C2̏ 3w01I[|2< gBem#OCe>}=POCe>es³ ?&賝|VX*]/Ld>fwKOCe>KT>TS^WXNd`|&T? w0b||DgT\Nmh|&T3';y>c>|*){gBe ,g0鳭1v+Le ɝ'=TPτ9od>e^WT߱-2 Ý0<OIhSG0ٞ-mES0g,wSτ|&T32ͳPOCe>}9ܜO.arf$32 To'_/$2 *|̧2yokP'm_ Hg Om05*/Ma3; +POCe>}@e~k!LgBeo'dS>7h46?a>=T||**;~6j?MgOBe>cy@eOm \Va>*|̧2|y%S' sS{v27K6[7D3[ ?Rͷ?mmͷ6<̷VB%X|k3ka~m_^z|ܐOwSǿ'^Y™ ܜpX?+/`l{%^ew-A#rXYQ~\rW;:؀1 #l'g~p[~ s7Nߊыҗpjl%|s| +kW]桬۶,m|'Mխbٵnqͩ߼_v:Ή ڇ?"noEeQnu{ӿw՗&'18+g>ika}*/wjn_.ڕEh/5¶jB$lOǯv1 +{"{oCe>\g~"xg[h4lz!|&T32N V«%60D2ʇ|*Pτ|**yPLE?_D"0̓~s>zaq7?P0.|{OP_*|3%RgBe>S[gg+τ|&TS7G3|*m-(%nCe>*녥ݜO^"=T3yus>z!||&T揥|cѽr]/D0ʇ%28;[ /i*| 7'3 L̿\ZH-abTP?mY녈Q(RD!2s̳ τ|̧C7磘?c{ gBeOmKܚ=T;532ʇPOyOE'[2 99|P@e~gz_SP_i$7~n|**tjl%\'p2 *|̧27Odjik! \%̧2yws>z!=T32,w||&Ty|._^ho +K`>}K8epv^.!N`|Z̧2|&TSP?赐hgRh327,|BPMl3כ POb{rkF<ܱ T#OmKH =T32ʇ|**{̟DZZiBe>s~OF37瓯S6[\/XV%X|kok[|kk?Xw`kl%X|k?Ŷ)}#22Ӆ?U  r̶I5l+7n6'eӴM{Jq pbF9c ;?]d~Օyi_}y/{L=ݬmsձ9tU,l_#4Wa58Wu/8j\?Yuͱq[7#{{˧v睻=TSPτ||[ _)߹v=To%1R+ K-!τ%ڬEwӾ/*< K( ۋ-!%S0"ofk|&T32ʇ|*o?"Qok។T>T<" s. ۋ-_Ce=ik%̵D7$36_d>=TSPτ|*{,Jd>eL/>%  )&τ|*?SDS38̧2|&T32ʇ|m-|D329f`^P ŖT>TgyjXB䓶Sys T32ʇ|**Pτ(ZC "|/"  *"τNmVK|v*=;POCe>}L̿mQOCeY7"Pޜuf`^P Ŗ|ko%,komm-kWa{A%[|ko%,komm-ol%X V_BzmS\?./wҗ5 +:;3G +lLHg%ߝݩr|[x{uv^d?dcM nG&/0ϸ;t|>An M_{D" Nl}A{7}[w㞇>ۺ:4lpX]wt7~l ~Qvq;ȐW0űZʮnl}흟LNZ /JϿj;c[ٟrr?m8;[ V`%\C32R2|*Pτ|&T32 LgBe>*|̧2_Ή)l'̧2GV`%X /|* ss>z!LgBe>*|̧2 LgBe>=TPτr^ ̧2?󳳕`%X V%$1 /dǰd32ʇ|**{gBe}3|**{̧2 T>TSP#Ž?a{%$2 +J^.Ab>؎d|oΧ߀1T>TPτ|&TSP?9/0|&TSPOi|*?4lϣT>Tgvv+JxOgBeD|2}|&T32ʇ|*{m|̧2;mτ|*?~998&1G!2?`%X V%LSMd>*b{ ~FT>TSPτ|&TSv6<ؚLgBe>=T/ ZB*1gg+JKx|**yv_E [2jt32ʇ|*'m~7D< T>TSPOCe>*/'il)42gg+JK߾^6[&omV`%|kkommz |ko%X VߖaVy3e]mgn$ZyQZA^6ghKOggn^[\?v9.Ήn۲k<۸96i.˲>GPoq$ ^f_az]QvU̺l#?nYUQi1'/Yr7Nܾ8r{F>)iz̧2 LgBe>T>TPτ|&T32|"|&TSPϣT?$_/|߻^H`>*PJ+$SP?9LgBesCRc>T>TPτ|&TSPτ|*8gBe>Bd>}LO9rD|r ﯨO?V`%X JN͏d~`IO gBe>u;e>˄|*P|**){̧2Ne>*G!2|&T32GjDSPOCe?o'oyL/n?V`%X J mESPϓT32\e>=TPτ|**|̧2 Ļ2ZHd>eBd>*//Hf~|jfps>'m#OCeͷ+JJx5*w32|*{gBe>T>TSPτ|ԓэv2||&T32Rh*_̓Md>*m`%X VBZ QOBe>G32 T>TS@e>*Pτ| +~mr?MgBe>*'mSPRӄ|ff n'|**l%X Vr Ivmͷ6/|r 6gg+JKiZ|komm_mV`%X *aoGl׏an7rs5m&/OUH'|1׺'.ݡe[F}ͱ,G/n\mbi"^\-_&2ƧyRZy$%׾"U(xW8g{Y/A3eɆG0J?qh/_ȉW~9ߟ^wA.UUUXcv:,W<Rzv+JxH7mxNb>*POO/Ae>*َSRM]/K}-d32ʇ|f# ߻^|̧2y(Lc~gg+JKHd>*POCe~|&T3ϣ 1ʇ|&TH g~|.y&3oT#OCe>e?~yAJK>~9w0|*y Y+J^.Ad>?v4y|&T7$ߏdSP_*{"c7L2xTa{ oyzA[{gBe>*o`n'Ļ2|]+J^-!$揱|&TSPOُf>}Bd>*Pl3SG녹ޜO^x%Sǖ0vOUd>3#|iBern'|:*P鳳`%X V%!1ʟ~=;Pv/Ad>*|"izg7D3yzs>z <VSSP^ מ#0cB2Oڊ̧2峳`%X V%LفW pk>T32|"/(gBe>fdTv7\$3hOH.gE|j9gy@eO+J^.aLgBe>4=T32yoF*ӄ|f쓶[ Ӥs9oy# uJjqOF< 9|*VB r?9uZȠ> +startxref +51086 +%%EOF diff --git a/top_oc/res/res_300.pdf b/top_oc/res/res_300.pdf new file mode 100755 index 0000000..bf9d550 Binary files /dev/null and b/top_oc/res/res_300.pdf differ diff --git a/top_oc/res/res_40.pdf b/top_oc/res/res_40.pdf new file mode 100755 index 0000000..f9ed5be Binary files /dev/null and b/top_oc/res/res_40.pdf differ diff --git a/top_oc/res/res_50.pdf b/top_oc/res/res_50.pdf new file mode 100755 index 0000000..25f8d08 Binary files /dev/null and b/top_oc/res/res_50.pdf differ diff --git a/top_oc/res/res_60.pdf b/top_oc/res/res_60.pdf new file mode 100755 index 0000000..f16fe26 Binary files /dev/null and b/top_oc/res/res_60.pdf differ diff --git a/top_oc/res/res_70.pdf b/top_oc/res/res_70.pdf new file mode 100755 index 0000000..203a267 Binary files /dev/null and b/top_oc/res/res_70.pdf differ diff --git a/top_oc/res/res_80.pdf b/top_oc/res/res_80.pdf new file mode 100755 index 0000000..38adff1 Binary files /dev/null and b/top_oc/res/res_80.pdf differ diff --git a/top_oc/res/res_90.pdf b/top_oc/res/res_90.pdf new file mode 100755 index 0000000..b3a964c Binary files /dev/null and b/top_oc/res/res_90.pdf differ diff --git a/top_oc/top99neo.jl b/top_oc/top99neo.jl new file mode 100755 index 0000000..777f668 --- /dev/null +++ b/top_oc/top99neo.jl @@ -0,0 +1,346 @@ +__precompile__() +module TopOpt99neo + +using LinearAlgebra, SparseArrays +using Plots +# : heatmap, savefig, @animate +using ImageFiltering: imfilter +using Statistics: mean + +using BenchmarkTools + +BLAS.set_num_threads(1) + +abstract type top99neo end + +include("utils.jl") + +export SetUp, Mat, DiscretizationFeature, LoadsSupportsBCs, Initialization, Filter +export Optimization, Visualization + +mutable struct SetUp <: top99neo + nelx::Int + nely::Int + + eta::Float64 + beta::Int + betaCnt::NTuple{4,Int} + + move::Float64 + maxit::Int + maxchang::Float64 + + pasS::Array{Int} + pasV::Array{Int} + + function SetUp() + nelx = 150 + nely = 50 + # volfrac = 0.3 + maxit = 300 + move = 0.1 + beta = 2 + eta = 0.5 + maxchang = 1e-6 + # penalCnt = {maxit+1, 3, 25, 0.25} + betaCnt = (2, 32, 10, 2) # continuation scheme on beta parCont = { istart,maxPar,steps,deltaPar } + + pasS, pasV = Array([]), Array([]) + + new(nelx, nely, eta, beta, betaCnt, move, maxit, maxchang, pasS, pasV) + end + +end + +mutable struct Mat <: top99neo + E0::Float64 + Emin::Float64 + ν::Float64 + penal::Float64 + volfrac::Float64 + + function Mat() + E0 = 1 + Emin = 1e-9 + ν = 0.3 + penal = 3.0 + volfrac = 0.3 + new(E0, Emin, ν, penal, volfrac) + end +end + +struct DiscretizationFeature <: top99neo + nEl::Int + nodeNrs::Array{Int,2} + nDof::Int + act + + cMat::Array{Int} + Iar::Array{Int} + Ke::Array{Float64,1} + Ke0::Array{Float64,2} + + function DiscretizationFeature(setup::SetUp, mat::Mat) + nelx = setup.nelx + nely = setup.nely + pasS, pasV = setup.pasS, setup.pasV + ν = mat.ν + + nEl = nely * nelx + nodeNrs = reshape(1:(1+nelx)*(1+nely), nely + 1, nelx + 1) + nDof = (nely + 1) * (nelx + 1) * 2 + act = setdiff(collect(1:nEl), union(pasS, pasV)) + + cVec = reshape(2 * nodeNrs[1:end-1, 1:end-1] .+ 1, nEl, 1) + cMat = Int.(repeat(cVec, 1, 8) + repeat([0 1 2 * nely .+ [2 3 0 1] -2 -1], nelx * nely, 1)) + + FuckRow = [1 2 3 4 5 6 7 8] + sI::Array{Int}, sII::Array{Int} = copy(FuckRow), fill(1, 1, 8) + @inbounds for j in 2:8 + sI = cat(sI, FuckRow[j:8]'; dims=2) + # sII = cat(2, sII, repmat(j, 1, 8 - j + 1)) + sII = cat(sII, fill(j, 1, 8 - j + 1); dims=2) + end + iK::Array{Int,2}, jK::Array{Int,2} = cMat[:, sI][:, 1, :]', cMat[:, sII][:, 1, :]' + Iar = sort([iK[:] jK[:]]; dims=2, rev=true) # comma is a newline + # iK, jK .= 0 , 0 + c1 = [12, 3, -6, -3, -6, -3, 0, 3, 12, 3, 0, -3, -6, -3, -6, 12, -3, 0, -3, -6, 3, 12, 3, -6, 3, -6, 12, 3, -6, -3, 12, 3, 0, 12, -3, 12] + c2 = [-4, 3, -2, 9, 2, -3, 4, -9, -4, -9, 4, -3, 2, 9, -2, -4, -3, 4, 9, 2, 3, -4, -9, -2, 3, 2, -4, 3, -2, 9, -4, -9, 4, -4, -3, -4] + Ke = 1 / (1 - ν^2) / 24 .* (c1 .+ ν .* c2) # half-KE vector + # full KE + # Ke0::Array{Float64} = zeros(8, 8) + # start_id, end_id = 1, 8 + # for i in 1:8 + # Ke0[i:8, i] = Ke[start_id:end_id] + # start_id, end_id = end_id + 1, 2 * end_id - start_id + # end + + Ke0::Array{Float64} = zeros(8, 8) + # Index::Array{Int} = [sI' sII'] + # Ke0[sI, sII] = Ke + Index = findall(isequal(1), tril(ones(8, 8))) + Ke0[Index] = Ke' + # Ke0 = reshape(Ke0, 8, 8) + Ke0 = Ke0 + Ke0' - diagm(diag(Ke0)) + new(nEl, nodeNrs, nDof, act, cMat, Iar, Ke, Ke0) + end +end + +mutable struct LoadsSupportsBCs <: top99neo + lcDof::Array{Int} + F + free::Array{Int} + fixed::Array{Int} + + function LoadsSupportsBCs(setup::SetUp, disfeature::DiscretizationFeature) + nelx = setup.nelx + nely = setup.nely + nodeNrs = disfeature.nodeNrs + nDof = disfeature.nDof + + load_position::Symbol = :half_MBB + if load_position == :half_MBB + load_nodey, load_nodex = 1, 1 + # fixed = union([1:2:2*(nely+1)], 2 * nodeNrs[nely+1, nelx+1]) + fixed = union(collect(1:2:2*(nely+1)), 2 * nodeNrs[end, end]) + elseif load_position == :cantilever + load_nodey = nely + 1 + load_nodex = nelx / 2 + 1 + fixed = 1:2*(nely+1) + end + + F = spzeros(nDof) + + load_type::Symbol = :pin + if load_type == :pin # 1 point + lcDof = collect(2 * nodeNrs[load_nodey, load_nodex]) + F[2] = -1.0 + elseif load_type == :points # 5 points + # lcDof = collect(2 * nodeNrs[load_nodey, load_nodex], nodeNrs[load_nodey, load_nodex-1], nodeNrs[load_nodey, load_nodex-2], nodeNrs[load_nodey, load_nodex+1], nodeNrs[load_nodey, load_nodex+2]) + F[lcDof'] .= -1.0 + elseif load_type == :line + lcDof = [2:2*(nely+1):nDof] + F = spzeros(nDof, 1) + F[lcDof'] .= -1.0 + # F = sparse(lcDof', ones(length(lcDof')), -1.0) + end + all = collect(1:nDof) + free = setdiff(all, fixed) + + new(lcDof, F, free, fixed) + end +end + +struct Initialization <: top99neo + x::Array{Float64} + xPhys::Array{Float64} + xOld::Array{Float64} + ch::Float64 + loop::Int + + function Initialization(setup::SetUp, disfeature::DiscretizationFeature, mat::Mat) + pasV = setup.pasV + pasS = setup.pasS + act = disfeature.act + volfrac = mat.volfrac + nEl = disfeature.nEl + # nDof = disfeature.nDof + # column vectors + x = zeros(nEl, 1) + # x[act] .= (volfrac * (nEl - length(pasV)) - length(pasS)) / length(act) + x[act] .= volfrac + x[pasS] .= 1.0 + xPhys, xOld, ch, loop = copy(x), ones(nEl, 1), 1.0, 0 + # x̅ x̃ + + new(x, xPhys, xOld, ch, loop) + end +end + +mutable struct Filter <: top99neo + rmin::Float64 + ft::Int + h::Array{Float64} + Hs::Array{Float64} + dHs::Array{Float64} + + function Filter(setup::SetUp) + nelx = setup.nelx + nely = setup.nely + # volfrac = mat.volfrac + # bcF = setup.bcF + rmin = nely / 20 + ft = 3 # 1 density 2 projection 3 volume preserving + dy, dx = meshgrid(-ceil(rmin)+1:ceil(rmin)-1, -ceil(rmin)+1:ceil(rmin)-1) + h = max.(0, rmin .- sqrt.(dx .^ 2 + dy .^ 2)) + Hs = imfilter(ones(nely, nelx), h, "symmetric") + dHs = Hs + + new(rmin, ft, h, Hs, dHs) + end +end + + +function FiniteElementAnalasys(mat::Mat, disfeature::DiscretizationFeature, load::LoadsSupportsBCs, xPhys::Array{Float64}) + nEl, nDof, Iar, Ke = disfeature.nEl, disfeature.nDof, disfeature.Iar, disfeature.Ke + Emin, penal, E0 = mat.Emin, mat.penal, mat.E0 + F, free = load.F, load.free + + sK = Emin .+ xPhys .^ penal .* (E0 - Emin) + sK = reshape(Ke[:] * sK', length(Ke) * nEl, 1) + K::SparseMatrixCSC = sparse(Iar[:, 1], Iar[:, 2], vec(sK), nDof, nDof) + U = zeros(nDof) + # U[free] = cholesky(Symmetric(K[free, free], :L), check=false) \ F[free + U[free] = cholesky(Symmetric(K, :L)[free, free], check=false) \ F[free] + Obj = F' * U + Vf = mean(xPhys) + return U, Obj, Vf +end + +function SensitivityAnalasys(setup::SetUp, filter::Filter, mat::Mat, disfeature::DiscretizationFeature, U::Array{Float64}, xPhys::Array{Float64}) + nelx, nely, act = setup.nelx, setup.nely, disfeature.act + dHs, h = filter.dHs, filter.h + E0, Emin, volfrac, penal = mat.E0, mat.Emin, mat.volfrac, mat.penal + nEl, cMat, Ke0 = disfeature.nEl, disfeature.cMat, disfeature.Ke0 + + dsK, dV = zeros(nEl, 1), zeros(nEl, 1) + #! active volume fraction in the design domain + # fval = sum(xPhys[act])./length( act )./volfrac.-1.0 + dV[act] .= 1.0 / length(act) / volfrac + dsK[act] = -penal * (E0 - Emin) .* xPhys[act] .^ (penal - 1) + + dc = dsK .* sum((U[cMat] * Ke0) .* U[cMat], dims=2) + dc = imfilter(reshape(dc, nely, nelx) ./ dHs, h, "symmetric") + dV0 = imfilter(reshape(dV, nely, nelx) ./ dHs, h, "symmetric") + + return dc, dV0 +end + +# UPDATE DESIGN VARIABLES AND APPLY CONTINUATION +function OCupdate(x::Array{Float64}, setup::SetUp, mat::Mat, disfeature::DiscretizationFeature, dc::Array{Float64}, dV0::Array{Float64}) + act, move, volfrac = disfeature.act, setup.move, mat.volfrac + xT = zeros(length(act), 1) + xT = x[act] + xU, xL = xT .+ move, xT .- move + ocP = xT .* real.(sqrt.(-dc[act] ./ dV0[act])) + l = [0 mean(ocP) / volfrac] + while (l[2] - l[1]) / (l[2] + l[1]) > 1e-4 + lmid = 0.5 * (l[1] + l[2]) + x[act] = max.(max.(min.(min.(ocP ./ lmid, xU), 1.0), xL), 0.0) + if mean(x) > volfrac + l[1] = lmid + else + l[2] = lmid + end + end + return x +end + +function Visualization(setup::SetUp, x::Array{Float64}, loop::Int) + nelx, nely = setup.nelx, setup.nely + # cmap = cgrad(:Blues_9, rev=false) + plot = heatmap(reshape(x, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400, nely / nelx * 400), legend=:none, display_type=:gui) + # display(plot) + # if mod(loop, 10) == 0 + savefig(plot, "./top/res_$loop.pdf") + # end + + # PLOT FINAL DESIGN + # heatmap(1.0 .- x[end:-1:1, :], yaxis=false, xaxis=false, legend=:none,color=:greys, grid=false, border=nothing, aspect_ratio=:equal) + nothing +end +function Optimization(setup::SetUp, mat::Mat, load::LoadsSupportsBCs, filter::Filter, ini::Initialization, disfeature::DiscretizationFeature) + ch, loop = ini.ch, ini.loop + x, xPhys, xOld = ini.x, ini.xPhys, ini.xOld + + maxit, maxchang = setup.maxit, setup.maxchang + nely, nelx = setup.nely, setup.nelx + eta, beta, betaCnt = setup.eta, setup.beta, setup.betaCnt + volfrac, penal, nEl = mat.volfrac, mat.penal, disfeature.nEl + act = disfeature.act + + Hs, h, ft = filter.Hs, filter.h, filter.ft + + opt_hist = [] + vf_hist = [] + + anim = @animate while ch > maxchang && loop < maxit || beta < betaCnt[2] + @time begin + loop = loop + 1 + # COMPUTE PHYSICAL DENSITY FIELD + xTilde = imfilter(reshape(x, nely, nelx), h, "symmetric") ./ Hs + xPhys[act] = copy(xTilde[act]) + if ft > 1 + f = (mean(prj(xPhys, eta, beta)) .- volfrac) * (ft == 3) + while abs(f) > maxchang + eta = eta - f / mean(deta(xPhys[:], eta, beta)) + f = mean(prj(xPhys, eta, beta)) - volfrac + end + filter.dHs = Hs ./ reshape(dprj(xTilde, eta, beta), nely, nelx) + xPhys = prj(xPhys, eta, beta) + end + ch = norm(xPhys - xOld) ./ sqrt(nEl) + xOld = copy(xPhys) + # SETUP AND SOLVE EQUILIBRIUM EQUATIONS + U, C, Vf = FiniteElementAnalasys(mat, disfeature, load, xPhys) + push!(opt_hist, C) + push!(vf_hist, Vf) + # COMPUTE SENSITIVITIES + dc, dV0 = SensitivityAnalasys(setup, filter, mat, disfeature, U, xPhys) + # OC iteration + x = OCupdate(x, setup, mat, disfeature, dc, dV0) + # CONTINUATION + beta = cnt(beta, betaCnt, loop, ch, maxchang) + + heatmap(reshape(xPhys, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400, nely / nelx * 400), legend=:none) + + end + if mod(loop, 10) == 0 + println("It.: $loop C.: $C Vf.: $Vf ch.: $ch, p.: $penal beta.:$beta eta.: $eta ") + Visualization(setup, xPhys, loop) + end + end + return xPhys, opt_hist, vf_hist, anim +end + +end diff --git a/top_oc/utils.jl b/top_oc/utils.jl new file mode 100755 index 0000000..b38c487 --- /dev/null +++ b/top_oc/utils.jl @@ -0,0 +1,71 @@ +# export loads!, bcs!, passive_domain! +export prj, deta, dprj, cnt +export meshgrid +export Visualization + +function prj(v::Array{Float64}, eta::Float64, beta::Int) + return (tanh(beta * eta) .+ tanh.(beta * (v[:] .- eta))) ./ (tanh(beta * eta) + tanh(beta * (1 - eta))) +end + +function deta(v::Array{Float64}, eta::Float64, beta::Int) + return -beta * csch(beta) .* sech.(beta * (v[:] .- eta)) .^ 2 .* sinh.(v[:] * beta) .* sinh.((1 .- v[:]) * beta) +end + +function dprj(v::Array{Float64}, eta::Float64, beta::Int) + return beta * (1 .- tanh.(beta * (v .- eta)) .^ 2) ./ (tanh(beta * eta) + tanh(beta * (1 - eta))) +end + +function cnt(v::Int, vCnt::NTuple{4,Int}, l::Int, ch::Float64, maxchang::Float64) + return v + (l >= vCnt[1]) * (v < vCnt[2]) * (mod(l, vCnt[3]) == 0 || ch <= maxchang) * vCnt[4] +end + + +""" +meshgrid(vx) +Computes an (x,y)-grid from the vectors (vx,vx). +For more information, see the MATLAB documentation. +""" +meshgrid(v::AbstractVector) = meshgrid(v, v) + +""" +meshgrid(vx,vy) +Computes an (x,y)-grid from the vectors (vx,vy). +For more information, see the MATLAB documentation. +""" +function meshgrid(vx::AbstractVector{T}, vy::AbstractVector{T}) where {T} + m, n = length(vy), length(vx) + vx = reshape(vx, 1, n) + vy = reshape(vy, m, 1) + (repeat(vx, m, 1), repeat(vy, 1, n)) +end + +""" +meshgrid(vx,vy,vz) +Computes an (x,y,z)-grid from the vectors (vx,vy,vz). +For more information, see the MATLAB documentation. +""" +function meshgrid(vx::AbstractVector{T}, vy::AbstractVector{T}, + vz::AbstractVector{T}) where {T} + m, n, o = length(vy), length(vx), length(vz) + vx = reshape(vx, 1, n, 1) + vy = reshape(vy, m, 1, 1) + vz = reshape(vz, 1, 1, o) + om = ones(Int, m) + on = ones(Int, n) + oo = ones(Int, o) + (vx[om, :, oo], vy[:, on, oo], vz[om, on, :]) +end + +function Visualization(setup::SetUp, x::Array{Float64}, loop::Int) + nelx, nely = setup.nelx, setup.nely + # cmap = cgrad(:Blues_9, rev=false) + plot = heatmap(reshape(x, nely, nelx), c=:Blues_9, aspect_ratio=:equal, yflip=true, grid=false, axis=:off, tick=false, colorbar=false, border=nothing, dpi=300, size=(400, nely / nelx * 400), legend=:none, display_type=:gui) + # display(plot) + # if mod(loop, 10) == 0 + savefig(plot, "./top_mma/res_$loop.pdf") + # end + + # PLOT FINAL DESIGN + # heatmap(1.0 .- x[end:-1:1, :], yaxis=false, xaxis=false, legend=:none,color=:greys, grid=false, border=nothing, aspect_ratio=:equal) + nothing +end \ No newline at end of file