Changeset 26518
- Timestamp:
- 10/28/21 06:59:39 (3 years ago)
- Location:
- issm/trunk-jpl/src/jl
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/jl/issm.jl
r26500 r26518 4 4 abstract type AbstractMesh end 5 5 mutable struct Mesh2dTriangle <: AbstractMesh 6 numberofvertices::Int 327 numberofelements::Int 326 numberofvertices::Int64 7 numberofelements::Int64 8 8 x::Vector{Float64} 9 9 y::Vector{Float64} 10 elements::Matrix{Int 32}10 elements::Matrix{Int64} 11 11 end 12 12 function Mesh2dTriangle() #{{{ 13 return Mesh2dTriangle( 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef, 0), Matrix{Int 32}(undef, 0, 0))13 return Mesh2dTriangle( 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef, 0), Matrix{Int64}(undef, 0, 0)) 14 14 end# }}} 15 15 function Base.show(io::IO, this::Mesh2dTriangle)# {{{ … … 27 27 end# }}} 28 28 mutable struct Mesh3dPrism{T} <: AbstractMesh 29 numberofvertices::Int 3230 numberofelements::Int 3231 numberoflayers::Int 3229 numberofvertices::Int64 30 numberofelements::Int64 31 numberoflayers::Int64 32 32 x::Vector{Float64} 33 33 y::Vector{Float64} 34 34 z::Vector{Float64} 35 elements::Matrix{Int 32}35 elements::Matrix{Int64} 36 36 end 37 37 function Mesh3dPrism() #{{{ 38 return Mesh3dPrism( 0, 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0), Matrix{Int 32}(undef, 0, 0))38 return Mesh3dPrism( 0, 0, 0, Vector{Float64}(undef,0), Vector{Float64}(undef,0), Vector{Float64}(undef,0), Matrix{Int64}(undef, 0, 0)) 39 39 end# }}} 40 40 mutable struct Geometry … … 67 67 reltol::Float64 68 68 abstol::Float64 69 maxiter::Int 3269 maxiter::Int64 70 70 end 71 71 function Stressbalance() #{{{ 72 72 return Stressbalance( Vector{Float64}(undef,0), Vector{Float64}(undef,0), 0., 0., 0., 0) 73 end# }}} 74 mutable struct Constants 75 g::Float64 76 yts::Float64 77 end 78 function Constants() #{{{ 79 return Constants( 9.81, 365*24*3600.) 73 80 end# }}} 74 81 mutable struct Materials … … 81 88 thermalconductivity::Float64 82 89 temperateiceconductivity::Float64 83 effectiveconductivity_averaging::Int 3290 effectiveconductivity_averaging::Int64 84 91 meltingpoint::Float64 85 92 beta::Float64 … … 101 108 initialization::Initialization 102 109 stressbalance::Stressbalance 110 constants::Constants 103 111 end 104 112 function model() #{{{ 105 return model( Mesh2dTriangle(), Geometry(), Mask(), Materials(), Initialization(),Stressbalance() )113 return model( Mesh2dTriangle(), Geometry(), Mask(), Materials(), Initialization(),Stressbalance(), Constants()) 106 114 end#}}} 107 115 function Base.show(io::IO, md::model)# {{{ … … 116 124 @printf "%19s: %-22s -- %s\n" "initialization" typeof(md.initialization) "initial state" 117 125 @printf "%19s: %-22s -- %s\n" "stressbalance" typeof(md.stressbalance) "stress balance parameters" 126 @printf "%19s: %-22s -- %s\n" "constants" typeof(md.constants) "physical constants" 118 127 119 128 end# }}} -
issm/trunk-jpl/src/jl/solve.jl
r26500 r26518 25 25 26 26 end#}}} 27 function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{ 28 29 parameters.lookup[enum] = IntParam(enum,value) 30 31 end#}}} 27 32 28 33 abstract type Input end … … 33 38 struct IntInput <: Input#{{{ 34 39 enum::IssmEnum 35 values::Matrix{Int 32}40 values::Matrix{Int64} 36 41 end# }}} 37 42 struct ElementInput <: Input#{{{ … … 41 46 end# }}} 42 47 mutable struct Inputs #{{{ 43 numberofelements::Int 3244 numberofvertices::Int 3248 numberofelements::Int64 49 numberofvertices::Int64 45 50 lookup::Dict{IssmEnum,Input} 46 51 end# }}} 47 function SetInput(inputs::Inputs,enum::IssmEnum,index::Int 32,value::Bool) #{{{52 function SetInput(inputs::Inputs,enum::IssmEnum,index::Int64,value::Bool) #{{{ 48 53 49 54 #Does this input exist … … 63 68 input.values[index] = value 64 69 end#}}} 65 function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,index::Int 32,value::Float64) #{{{70 function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,index::Int64,value::Float64) #{{{ 66 71 67 72 #Does this input exist … … 86 91 input.values[index] = value 87 92 end#}}} 88 function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,indices::Vector{Int 32},values::Vector{Float64}) #{{{93 function SetTriaInput(inputs::Inputs,enum::IssmEnum,interp::IssmEnum,indices::Vector{Int64},values::Vector{Float64}) #{{{ 89 94 90 95 #Does this input exist … … 109 114 110 115 mutable struct Node #{{{ 111 id::Int 32112 sid::Int 32116 id::Int64 117 sid::Int64 113 118 indexingupdate::Bool 114 gsize::Int 32115 gdoflist::Vector{Int 32}116 fdoflist::Vector{Int 32}117 sdoflist::Vector{Int 32}119 gsize::Int64 120 gdoflist::Vector{Int64} 121 fdoflist::Vector{Int64} 122 sdoflist::Vector{Int64} 118 123 svalues::Vector{Float64} 119 124 end# }}} 120 125 struct Constraint #{{{ 121 id::Int 32122 nodeid::Int 32126 id::Int64 127 nodeid::Int64 123 128 dof::Int8 124 129 value::Float64 125 130 end# }}} 126 131 mutable struct Vertex#{{{ 127 sid::Int 32132 sid::Int64 128 133 x::Float64 129 134 y::Float64 130 135 end# }}} 131 136 mutable struct Tria #{{{ 132 sid::Int 32133 pid::Int 32137 sid::Int64 138 pid::Int64 134 139 #vertexids::Int64[3] 135 140 #vertices::Vertex[3] 136 vertexids::Vector{Int32} 141 vertexids::Vector{Int64} 142 vertices::Vector{Vertex} 143 nodeids::Vector{Int64} 144 nodes::Vector{Node} 145 parameters::Parameters 146 inputs::Inputs 147 end# }}} 148 mutable struct FemModel #{{{ 149 elements::Vector{Tria} 137 150 vertices::Vector{Vertex} 138 151 nodes::Vector{Node} 139 152 parameters::Parameters 140 153 inputs::Inputs 141 end# }}}142 mutable struct FemModel #{{{143 elements::Vector{Tria}144 vertices::Vector{Vertex}145 nodes::Vector{Node}146 parameters::Vector{Parameter}147 inputs::Inputs148 154 constraints::Vector{Constraint} 149 155 #loads::Vector{Loads} 150 156 end#}}} 151 157 struct GaussTria #{{{ 152 numgauss::Int 32158 numgauss::Int64 153 159 weights::Vector{Float64} 154 160 coords1::Vector{Float64} … … 156 162 coords3::Vector{Float64} 157 163 end #}}} 158 function GaussTria(order::Int 32) #{{{164 function GaussTria(order::Int64) #{{{ 159 165 160 166 #=Gauss quadrature points for the triangle. … … 187 193 end# }}} 188 194 195 abstract type Analysis end 196 struct StressbalanceAnalysis#{{{ 197 end #}}} 198 189 199 #Modules 190 200 function FetchDataToInput(md::model,inputs::Inputs,elements::Vector{Tria},data::Vector{Float64},enum::IssmEnum) #{{{ … … 199 209 200 210 #Solve 211 error("not there yet") 201 212 Stressbalance(femmodel) 202 213 … … 207 218 208 219 #Initialize structures 209 elements = Vector{Tria}(undef,0) 210 vertices = Vector{Vertex}(undef,0) 211 parameters = Parameters(Dict{IssmEnum,Parameter}()) 212 inputs = Inputs(md.mesh.numberofelements,md.mesh.numberofvertices,Dict{IssmEnum,Input}()) 220 elements = Vector{Tria}(undef,0) 221 vertices = Vector{Vertex}(undef,0) 222 nodes = Vector{Node}(undef,0) 223 constraints = Vector{Constraint}(undef,0) 224 parameters = Parameters(Dict{IssmEnum,Parameter}()) 225 inputs = Inputs(md.mesh.numberofelements,md.mesh.numberofvertices,Dict{IssmEnum,Input}()) 213 226 214 227 #Create elements, vertices and materials (independent of the analysis) … … 219 232 220 233 #Now create analysis specific data structure 221 StressbalanceUpdateParameters(parameters,md) 234 analysis = StressbalanceAnalysis() 235 UpdateParameters(analysis,parameters,md) 236 CreateNodes(analysis,nodes,md) 237 UpdateElements(analysis,elements,inputs,md) 238 CreateConstraints(analysis,constraints,md) 239 240 #Build FemModel 241 return FemModel(elements,vertices,nodes,parameters,inputs,constraints) 222 242 end# }}} 223 243 function CreateElements(elements::Vector{Tria},md::model) #{{{ … … 233 253 count = 0 234 254 for i in 1:md.mesh.numberofelements 235 push!(elements,Tria(i,count,md.mesh.elements[i,:],tempvertices, tempnodes,tempparams,tempinputs))255 push!(elements,Tria(i,count,md.mesh.elements[i,:],tempvertices,Vector{Int64}(undef,0),tempnodes,tempparams,tempinputs)) 236 256 end 237 257 … … 262 282 263 283 #Only assume we have Matice for now 264 FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum); 265 FetchDataToInput(md,inputs,elements,md.materials.rheology_n,MaterialsRheologyNEnum); 266 end# }}} 284 FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum) 285 FetchDataToInput(md,inputs,elements,md.materials.rheology_n,MaterialsRheologyNEnum) 286 end# }}} 287 288 #Analyses 289 function UpdateParameters(analysis::StressbalanceAnalysis,parameters::Parameters,md::model) #{{{ 290 AddParam(parameters,md.stressbalance.restol,StressbalanceRestolEnum) 291 AddParam(parameters,md.stressbalance.reltol,StressbalanceReltolEnum) 292 AddParam(parameters,md.stressbalance.abstol,StressbalanceAbstolEnum) 293 AddParam(parameters,md.stressbalance.maxiter,StressbalanceMaxiterEnum) 294 end#}}} 295 function CreateNodes(analysis::StressbalanceAnalysis,nodes::Vector{Node},md::model) #{{{ 296 297 numdof = 2 298 for i in 1:md.mesh.numberofvertices 299 push!(nodes,Node(i,i,true,numdof,Vector{Int64}(undef,numdof), Vector{Int64}(undef,numdof), Vector{Int64}(undef,numdof), zeros(numdof))) 300 end 301 end#}}} 302 function UpdateElements(analysis::StressbalanceAnalysis,elements::Vector{Tria}, inputs::Inputs, md::model) #{{{ 303 304 #Provide node indices to element 305 for i in 1:md.mesh.numberofvertices 306 Update(elements[i],inputs,i,md,P1Enum) 307 end 308 309 #Add necessary inputs to perform this analysis 310 FetchDataToInput(md,inputs,elements,md.materials.rheology_B,MaterialsRheologyBEnum) 311 FetchDataToInput(md,inputs,elements,md.geometry.thickness,ThicknessEnum) 312 FetchDataToInput(md,inputs,elements,md.geometry.surface,SurfaceEnum) 313 FetchDataToInput(md,inputs,elements,md.geometry.base,BaseEnum) 314 FetchDataToInput(md,inputs,elements,md.initialization.vx./md.constants.yts,VxEnum) 315 FetchDataToInput(md,inputs,elements,md.initialization.vy./md.constants.yts,VyEnum) 316 317 end#}}} 318 function CreateConstraints(analysis::StressbalanceAnalysis,constraints::Vector{Constraint},md::model) #{{{ 319 error("stop") 320 end#}}} 267 321 268 322 #Element functions … … 276 330 end 277 331 end #}}} 332 function Update(element::Tria,inputs::Inputs,index::Int64,md::model,finiteelement::IssmEnum) #{{{ 333 334 if finiteelement==P1Enum 335 numnodes = 3 336 element.nodeids = Vector{Int64}(undef,numnodes) 337 element.nodeids[1] = md.mesh.elements[index,1] 338 element.nodeids[2] = md.mesh.elements[index,2] 339 element.nodeids[3] = md.mesh.elements[index,3] 340 else 341 error("not supported yet") 342 end 343 end #}}}
Note:
See TracChangeset
for help on using the changeset viewer.