Changeset 26730
- Timestamp:
- 12/12/21 14:16:13 (3 years ago)
- Location:
- issm/trunk-jpl/src/jl
- Files:
-
- 3 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/jl/core/analyses/stressbalanceanalysis.jl
r26717 r26730 33 33 34 34 #Provide node indices to element 35 for i in 1:md.mesh.numberof vertices35 for i in 1:md.mesh.numberofelements 36 36 Update(elements[i],inputs,i,md,P1Enum) 37 37 end … … 72 72 function Core(analysis::StressbalanceAnalysis,femmodel::FemModel)# {{{ 73 73 74 #Set current analysis to Stressnalance 75 SetCurrentConfiguration!(femmodel, analysis) 76 74 77 #Fetch parameters relevant to solution sequence 75 78 maxiter = FindParam(femmodel.parameters,StressbalanceMaxiterEnum) … … 78 81 abstol = FindParam(femmodel.parameters,StressbalanceAbstolEnum) 79 82 83 #Call solution sequence to compute new speeds 80 84 solutionsequence_nonlinear(femmodel,analysis,maxiter,restol,reltol,abstol) 85 86 #Save output 87 RequestedOutputsx(femmodel, [VxEnum,VyEnum,VelEnum]) 81 88 82 89 end #}}} -
issm/trunk-jpl/src/jl/core/constraints.jl
r26629 r26730 14 14 15 15 #Apply Constraint 16 ApplyConstraint(node, constraint.dof,constraint.value)16 ApplyConstraint(node, constraint.dof, constraint.value) 17 17 18 18 end# }}} -
issm/trunk-jpl/src/jl/core/elements.jl
r26710 r26730 3 3 sid::Int64 4 4 pid::Int64 5 5 6 #vertexids::Int64[3] 6 7 #vertices::Vertex[3] 7 8 vertexids::Vector{Int64} 8 9 vertices::Vector{Vertex} 9 nodeids::Vector{Int64} 10 10 11 nodes::Vector{Node} 12 nodes_list::Vector{Vector{Node}} 13 nodes_ids_list::Vector{Vector{Int64}} 14 11 15 parameters::Parameters 12 16 inputs::Inputs 13 17 end# }}} 18 function Tria(sid::Int64, pid::Int64, vertexids::Vector{Int64}) #{{{ 19 20 #This is the default constructor, at this point we don't have much information 21 tempparams = Parameters(Dict{IssmEnum,Parameter}()) 22 tempinputs = Inputs(-1,-1,Dict{IssmEnum,Input}()) 23 return Tria(sid, pid, 24 vertexids, Vector{Vertex}(undef,3), 25 Vector{Node}(undef,0), Vector{Vector{Node}}(undef,0), Vector{Vector{Int64}}(undef,0), 26 tempparams, tempinputs) 27 28 end #}}} 14 29 15 30 #Element functions … … 31 46 end 32 47 end #}}} 33 function Update(element::Tria, inputs::Inputs,index::Int64,md::model,finiteelement::IssmEnum) #{{{48 function Update(element::Tria, inputs::Inputs, index::Int64, md::model, finiteelement::IssmEnum) #{{{ 34 49 35 50 if finiteelement==P1Enum 36 51 numnodes = 3 37 element.nodeids = Vector{Int64}(undef,numnodes) 38 element.nodeids[1] = md.mesh.elements[index,1] 39 element.nodeids[2] = md.mesh.elements[index,2] 40 element.nodeids[3] = md.mesh.elements[index,3] 52 nodeids = Vector{Int64}(undef,numnodes) 53 nodeids[1] = md.mesh.elements[index,1] 54 nodeids[2] = md.mesh.elements[index,2] 55 nodeids[3] = md.mesh.elements[index,3] 56 57 push!(element.nodes_ids_list, nodeids) 58 push!(element.nodes_list, Vector{Node}(undef, numnodes)) 41 59 else 42 60 error("not supported yet") 43 61 end 44 62 end #}}} 45 function Configure(element::Tria,nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs ) # {{{63 function Configure(element::Tria,nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs,index::Int64) # {{{ 46 64 47 65 #Configure vertices … … 51 69 52 70 #Configure nodes (assuming P1 finite elements) 53 for i in 1:3 54 element.nodes[i] = nodes[element.nodeids[i]] 71 nodes_list = element.nodes_list[index] 72 nodes_ids_list = element.nodes_ids_list[index] 73 for i in 1:3 74 nodes_list[i] = nodes[nodes_ids_list[i]] 55 75 end 56 76 57 77 #Point to real datasets 78 element.nodes = element.nodes_list[index] 58 79 element.parameters = parameters 59 80 element.inputs = inputs -
issm/trunk-jpl/src/jl/core/femmodel.jl
r26703 r26730 1 1 #femmodel class definition 2 2 mutable struct FemModel #{{{ 3 analyses::Vector{Analysis} 3 4 elements::Vector{Tria} 4 5 vertices::Vector{Vertex} 6 5 7 nodes::Vector{Node} 8 nodes_list::Vector{Vector{Node}} 9 6 10 parameters::Parameters 7 11 inputs::Inputs 12 8 13 constraints::Vector{Constraint} 14 constraints_list::Vector{Vector{Constraint}} 15 9 16 #loads::Vector{Loads} 17 10 18 results::Vector{Result} 11 19 end#}}} 12 20 13 21 #femmodel functions 22 function SetCurrentConfiguration!(femmodel::FemModel, analysis::Analysis) #{{{ 14 23 24 #Find the index of this analysis 25 index = -1 26 for i in 1:length(femmodel.analyses) 27 if(typeof(femmodel.analyses[i]) == typeof(analysis)) index = i end 28 end 29 if(index<1) error("Could not find analysis ",analysis, " in femmodel") end 30 31 #Plug right nodes onto element 32 for i in 1:length(femmodel.elements) 33 femmodel.elements[i].nodes = femmodel.elements[i].nodes_list[index] 34 end 35 36 #Plug in nodes and other datasets 37 femmodel.nodes = femmodel.nodes_list[index] 38 femmodel.constraints = femmodel.constraints_list[index] 39 40 end#}}} -
issm/trunk-jpl/src/jl/core/modules.jl
r26727 r26730 5 5 end 6 6 end#}}} 7 function ModelProcessor(md::model ) #{{{7 function ModelProcessor(md::model, solutionstring::String) #{{{ 8 8 9 9 #Initialize structures 10 10 elements = Vector{Tria}(undef,0) 11 11 vertices = Vector{Vertex}(undef,0) 12 nodes = Vector{Node}(undef,0)13 constraints = Vector{Constraint}(undef,0)14 12 results = Vector{Result}(undef,0) 15 13 parameters = Parameters(Dict{IssmEnum,Parameter}()) 16 inputs = Inputs(md.mesh.numberofelements, md.mesh.numberofvertices,Dict{IssmEnum,Input}())14 inputs = Inputs(md.mesh.numberofelements, md.mesh.numberofvertices, Dict{IssmEnum,Input}()) 17 15 18 16 #Create elements, vertices and materials (independent of the analysis) 19 CreateElements(elements,md) 20 CreateVertices(vertices,md) 21 CreateParameters(parameters,md) 22 CreateInputs(inputs,elements,md) 17 CreateElements(elements, md) 18 CreateVertices(vertices, md) 19 CreateParameters(parameters, md) 20 CreateInputs(inputs,elements, md) 21 if solutionstring=="TransientSolution" 22 UpdateParameters(TransientAnalysis(), parameters, md) 23 end 23 24 24 25 #Now create analysis specific data structure 25 analysis = StressbalanceAnalysis() 26 UpdateParameters(analysis,parameters,md) 27 CreateNodes(analysis,nodes,md) 28 UpdateElements(analysis,elements,inputs,md) 29 CreateConstraints(analysis,constraints,md) 30 31 #Configure objects 32 ConfigureObjectx(elements,nodes,vertices,parameters,inputs) 33 34 #Constrain and Number nodes 35 SpcNodesx(nodes,constraints,parameters) 36 NodesDofx(nodes,parameters) 26 if solutionstring=="StressbalanceSolution" 27 analyses = [StressbalanceAnalysis()] 28 elseif solutionstring=="TransientSolution" 29 analyses = [StressbalanceAnalysis(), MasstransportAnalysis()] 30 else 31 error(solutionstring, " not supported by ModelProcessor") 32 end 33 34 #Initialize analysis specific datasets 35 numanalyses = length(analyses) 36 nodes = Vector{Vector{Node}}(undef,numanalyses) 37 constraints = Vector{Vector{Constraint}}(undef,numanalyses) 38 for i in 1:numanalyses 39 analysis = analyses[i] 40 println(" creating datasets for analysis ", typeof(analysis)) 41 nodes[i] = Vector{Node}(undef,0) 42 constraints[i] = Vector{Constraint}(undef,0) 43 44 UpdateParameters(analysis, parameters, md) 45 UpdateElements(analysis, elements, inputs, md) 46 CreateNodes(analysis, nodes[i], md) 47 CreateConstraints(analysis, constraints[i], md) 48 49 #Configure objects 50 ConfigureObjectx(elements, nodes[i], vertices, parameters, inputs, i) 51 52 #Constrain and Number nodes 53 SpcNodesx(nodes[i], constraints[i], parameters) 54 NodesDofx(nodes[i], parameters) 55 end 37 56 38 57 #Build FemModel 39 return FemModel(elements, vertices, nodes, parameters, inputs, constraints, results) 58 return FemModel(analyses, elements, vertices, 59 Vector{Node}(undef,0), nodes, 60 parameters, inputs, 61 Vector{Constraint}(undef,0), constraints, 62 results) 40 63 end# }}} 41 64 function CreateElements(elements::Vector{Tria},md::model) #{{{ … … 44 67 @assert length(elements)==0 45 68 46 tempparams = Parameters(Dict{IssmEnum,Parameter}()) 47 tempinputs = Inputs(-1,-1,Dict{IssmEnum,Input}()) 69 48 70 49 71 count = 0 … … 55 77 56 78 #Call constructor and add to dataset elements 57 push!(elements,Tria(i,count, vertexids,Vector{Vertex}(undef,3),nodeids,Vector{Node}(undef,3),tempparams,tempinputs))79 push!(elements,Tria(i,count, vertexids)) 58 80 end 59 81 … … 85 107 AddParam(parameters,1,StepEnum) 86 108 AddParam(parameters,0.0,TimeEnum) 109 87 110 end# }}} 88 111 function CreateInputs(inputs::Inputs,elements::Vector{Tria},md::model) #{{{ … … 104 127 105 128 #Other modules 106 function ConfigureObjectx(elements::Vector{Tria}, nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) #{{{129 function ConfigureObjectx(elements::Vector{Tria}, nodes::Vector{Node}, vertices::Vector{Vertex}, parameters::Parameters, inputs::Inputs, analysis::Int64) #{{{ 107 130 108 131 for i in 1:length(elements) 109 Configure(elements[i], nodes,vertices,parameters,inputs)132 Configure(elements[i], nodes, vertices, parameters, inputs, analysis) 110 133 end 111 134 -
issm/trunk-jpl/src/jl/core/parameters.jl
r26629 r26730 8 8 enum::IssmEnum 9 9 value::Int64 10 end# }}} 11 struct BoolParam <: Parameter #{{{ 12 enum::IssmEnum 13 value::Bool 10 14 end# }}} 11 15 … … 22 26 return param.value 23 27 end#}}} 28 function GetParameterValue(param::BoolParam) #{{{ 29 return param.value 30 end#}}} 24 31 25 32 #Parameters functions … … 29 36 30 37 end#}}} 31 function AddParam(parameters::Parameters,value::Int64, enum::IssmEnum) #{{{38 function AddParam(parameters::Parameters,value::Int64, enum::IssmEnum) #{{{ 32 39 33 40 parameters.lookup[enum] = IntParam(enum,value) 34 41 35 42 end#}}} 36 function AddParam(parameters::Parameters,value:: Int64,enum::IssmEnum) #{{{43 function AddParam(parameters::Parameters,value::Bool, enum::IssmEnum) #{{{ 37 44 38 parameters.lookup[enum] = IntParam(enum,value)45 parameters.lookup[enum] = BoolParam(enum,value) 39 46 40 47 end#}}} -
issm/trunk-jpl/src/jl/core/solve.jl
r26725 r26730 12 12 include("./matice.jl") 13 13 include("./friction.jl") 14 include("./analyses/analysis.jl") 14 15 include("./femmodel.jl") 15 include("./analyses/analysis.jl") 16 17 #All analyses 16 18 include("./analyses/stressbalanceanalysis.jl") 19 include("./analyses/masstransportanalysis.jl") 20 include("./analyses/transientanalysis.jl") 21 17 22 include("./solutionsequences.jl") 18 23 include("./modules.jl") … … 20 25 include("./utils.jl") 21 26 22 function IssmCore(md::model) #{{{ 23 27 function IssmCore(md::model, solutionstring::String) #{{{ 24 28 25 29 #Construct FemModel 26 femmodel=ModelProcessor(md )30 femmodel=ModelProcessor(md, solutionstring) 27 31 28 #Solve 29 analysis = StressbalanceAnalysis() 32 #Solve FIXME: to be improved later... 33 if(solutionstring=="StressbalanceSolution") 34 analysis = StressbalanceAnalysis() 35 elseif (solutionstring=="TransientSolution") 36 analysis = TransientAnalysis() 37 else 38 error("not supported") 39 end 30 40 Core(analysis, femmodel) 31 32 #Save output33 RequestedOutputsx(femmodel, [VxEnum,VyEnum,VelEnum])34 41 35 42 #move results to md -
issm/trunk-jpl/src/jl/tests/test.jl
r26727 r26730 5 5 6 6 #Load model from MATLAB file 7 file = matopen("./Pig.mat") 7 #file = matopen("./Pig.mat") 8 file = matopen("/Users/mmorligh/Desktop/issmuci/trunk-jpl/test/NightlyRun/temp.mat") 8 9 mat = read(file, "md") 9 10 close(file) -
issm/trunk-jpl/src/jl/tests/test101.jl
r26725 r26730 25 25 vy = archread(issmdir()*"/test/Data/SquareShelfConstrained.arch","vy") 26 26 index = Int.(archread(issmdir()*"/test/Data/SquareShelfConstrained.arch","index")) 27 md.initialization.vx= InterpFromMeshToMesh2d(index,x,y,vx,md.mesh.x,md.mesh.y,0.0)28 md.initialization.vy= InterpFromMeshToMesh2d(index,x,y,vy,md.mesh.x,md.mesh.y,0.0)27 md.initialization.vx=0 .*InterpFromMeshToMesh2d(index,x,y,vx,md.mesh.x,md.mesh.y,0.0) 28 md.initialization.vy=0 .*InterpFromMeshToMesh2d(index,x,y,vy,md.mesh.x,md.mesh.y,0.0) 29 29 30 30 md.materials.rheology_B=1.815730284801701e+08*ones(md.mesh.numberofvertices) -
issm/trunk-jpl/src/jl/usr/classes.jl
r26728 r26730 142 142 end 143 143 # }}} 144 #Basalforcings {{{ 145 mutable struct Basalforcings 146 groundedice_melting_rate::Vector{Float64} 147 floatingice_melting_rate::Vector{Float64} 148 end 149 function Basalforcings() #{{{ 150 return Basalforcings( Vector{Float64}(undef,0), Vector{Float64}(undef,0)) 151 end# }}} 152 function Base.show(io::IO, this::Basalforcings)# {{{ 153 IssmStructDisp(io, this) 154 end# }}} 155 # }}} 156 #Surfaceforcings {{{ 157 mutable struct SMBforcings 158 mass_balance::Vector{Float64} 159 end 160 function SMBforcings() #{{{ 161 return SMBforcings( Vector{Float64}(undef,0)) 162 end# }}} 163 function Base.show(io::IO, this::SMBforcings)# {{{ 164 IssmStructDisp(io, this) 165 end# }}} 166 # }}} 167 #Timestepping{{{ 168 abstract type AbstractTimestepping end 169 mutable struct Timestepping <: AbstractTimestepping 170 start_time::Float64 171 final_time::Float64 172 time_step::Float64 173 end 174 function Timestepping() #{{{ 175 return Timestepping( 0., 0., 0.) 176 end# }}} 177 function Base.show(io::IO, this::Timestepping)# {{{ 178 IssmStructDisp(io, this) 179 end# }}} 180 # }}} 181 #Masstransport {{{ 182 mutable struct Masstransport 183 spcthickness::Vector{Float64} 184 min_thickness::Float64 185 stabilization::Int64 186 end 187 function Masstransport() #{{{ 188 return Masstransport( Vector{Float64}(undef,0), 10.0, 1) 189 end# }}} 190 function Base.show(io::IO, this::Masstransport)# {{{ 191 IssmStructDisp(io, this) 192 end# }}} 193 # }}} 194 #Transient {{{ 195 mutable struct Transient 196 issmb::Bool 197 ismasstransport::Bool 198 isstressbalance::Bool 199 isgroundingline::Bool 200 ismovingfront::Bool 201 end 202 function Transient() #{{{ 203 return Transient( true, true, true, true, true) 204 end# }}} 205 function Base.show(io::IO, this::Transient)# {{{ 206 IssmStructDisp(io, this) 207 end# }}} 208 # }}} 144 209 145 210 #Model structure … … 154 219 results::Dict 155 220 friction::AbstractFriction 221 basalforcings::Basalforcings 222 smb::SMBforcings 223 timestepping::Timestepping 224 masstransport::Masstransport 225 transient::Transient 156 226 end 157 227 function model() #{{{ 158 return model( Mesh2dTriangle(), Geometry(), Mask(), Materials(), Initialization(),Stressbalance(), Constants(), Dict(), BuddFriction()) 228 return model( Mesh2dTriangle(), Geometry(), Mask(), Materials(), 229 Initialization(),Stressbalance(), Constants(), Dict(), 230 BuddFriction(), Basalforcings(), SMBforcings(), Timestepping(), 231 Masstransport(), Transient()) 159 232 end#}}} 160 233 function model(matmd::Dict) #{{{ … … 185 258 setfield!(mdfield, Symbol(name2), Int64(value_matlab)) 186 259 260 elseif typeof(value_matlab)==Float64 && typeof(value_julia)==Bool 261 setfield!(mdfield, Symbol(name2), Bool(value_matlab)) 262 187 263 elseif typeof(value_matlab)==Matrix{Float64} && typeof(value_julia)==Vector{Float64} 188 264 if(size(value_matlab,2)!=1) error("only one column expected") end … … 218 294 @printf "%19s: %-26s -- %s\n" "materials" typeof(md.materials) "material properties" 219 295 @printf "%19s: %-26s -- %s\n" "initialization" typeof(md.initialization) "initial state" 220 @printf "%19s: %-26s -- %s\n" "stressbalance" typeof(md.stressbalance) "stress balance parameters"221 296 @printf "%19s: %-26s -- %s\n" "constants" typeof(md.constants) "physical constants" 222 297 @printf "%19s: %-26s -- %s\n" "friction" typeof(md.friction) "basal friction" 223 224 end# }}} 225 226 298 @printf "%19s: %-26s -- %s\n" "basalforcings" typeof(md.basalforcings) "basal forcings" 299 @printf "%19s: %-26s -- %s\n" "smb" typeof(md.smb) "surface mass balance" 300 @printf "%19s: %-26s -- %s\n" "timestepping" typeof(md.timestepping) "time stepping for transient simulations" 301 @printf "%19s: %-26s -- %s\n" "stressbalance" typeof(md.stressbalance) "parameters stress balance simulations" 302 @printf "%19s: %-26s -- %s\n" "masstransport" typeof(md.masstransport) "parameters mass transport simulations" 303 @printf "%19s: %-26s -- %s\n" "transient" typeof(md.transient) "parameters for transient simulations" 304 305 end# }}} -
issm/trunk-jpl/src/jl/usr/utils.jl
r26715 r26730 207 207 if solution=="sb" || solution=="Stressbalance" 208 208 solutionstring = "StressbalanceSolution" 209 elseif solution=="tr" || solution=="Transient" 210 solutionstring = "TransientSolution" 209 211 else 210 212 error("solutionstring "*solution*" not supported!"); 211 213 end 212 214 213 IssmCore(md )215 IssmCore(md, solutionstring) 214 216 215 217 return md
Note:
See TracChangeset
for help on using the changeset viewer.