# materialNonLinearity.jl ###### tags: `Entregable 9` **Documento en construccion. Los detalles dependen del Entregable 8.** ## Materiales - (resuelto) En vez de: ```julia matName = "linearElastic" matName2 = "isotropicBiLinear" matParams = [10.0] matParams2 = [10.0, 1.0, 7] mat1 = MaterialModel(matName, matParams) mat2 = MaterialModel(matName2, matParams2) ``` Buscamos algo asi: ```julia mat1 = LinearElastic(E=10.0) mat2 = IsotropicBilinear(E=10.0, σY0=1.0, K=7) ``` Se deberan implementar structs para modelar los distintos materiales como subtypes de `MaterialModel`, que pasaria a ser abstracto. ## Secciones - (resuelto) En vez de ```julia secName = "rectangle" secParams = [0.1, 0.6] secStr = Section(secName, secParams) ``` ```julia secStr = Rectangle(A=0.1, Iy=0.6) ``` pasaria a ser una implementacion del tipo abstracto `Section`. ## Nota sobre `Array{Float64}` Observar que `Array{Float64}` es abtracto: ```julia julia> Matrix{Float64} Matrix{Float64} (alias for Array{Float64, 2}) ``` Para los campos de struct que son matrices, debe utilizar `Array{Float64, 2}` o simplemente `Matrix{Float64}`. ## Nota sobre los algoritmos - (resuelto) Definir un tipo abstracto de algoritmo y hacer structs para NR y AR. Sera necesario alinear las firmas de las funciones ```julia AL(Uₖ, ModelSol, KTₖ, Fintk, time, analysisSettings, dispIter, varFext, currδu, convδu) ``` ``` NR(Uk, ModelSol, KTk, Fintk) ``` Luego ```julia NR = NewtonRaphson() # instancia con parametros por defecto AL = ArcLength() # se pasan a step!(NR, Uk, ModelSol, KTk, Fintk, args...) # o sino step!(NR, Uk, ModelSol, ModelOpts) # donde ModelOpts es un struct con info adicional ``` El dispatch se hace en el primer argumento. ## Notas (viejas) sobre interfaces En esta etapa comenzamos una transicion hacia un codigo mas idiomatico. Se deberan definir distintas interfaces (abstract types, structs que las implementan), por ejemplo considerar: - geometria (grids) - algoritmos: iteracion de Newton-Rapshon, Arc-Length - modelos constitutivos - representacion de la solucion en una etapa intermedia (iteracion) - representacion de la solucion final (que puede ser la anterior) Para dar un ejemplo: Antes: ```julia if NRBool == 1 Uk, δUk = NR(Uk, modelSol, KTk, Fintk) #λk = strAnalysisSets.loadFactors[time] else Uk, δUk, λk = AL(Uk, modelSol, KTk, Fintk, time, analysisSettings, dispIter, varFext, currδu, convδu) currδu = δUk + currδu println(λk) end ``` Despues podria parecerse a algo asi, donde dispatch en `alg` determina si se utiliza `NR` o `AL`: ```julia Uk, δUk = step(alg, Uk, KTk, Fintk, cache; options) ```