Changeset 26730


Ignore:
Timestamp:
12/12/21 14:16:13 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: adding mass transport, not quite working yet

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  
    3333
    3434        #Provide node indices to element
    35         for i in 1:md.mesh.numberofvertices
     35        for i in 1:md.mesh.numberofelements
    3636                Update(elements[i],inputs,i,md,P1Enum)
    3737        end
     
    7272function Core(analysis::StressbalanceAnalysis,femmodel::FemModel)# {{{
    7373
     74        #Set current analysis to Stressnalance
     75        SetCurrentConfiguration!(femmodel, analysis)
     76
    7477        #Fetch parameters relevant to solution sequence
    7578        maxiter = FindParam(femmodel.parameters,StressbalanceMaxiterEnum)
     
    7881        abstol  = FindParam(femmodel.parameters,StressbalanceAbstolEnum)
    7982
     83        #Call solution sequence to compute new speeds
    8084        solutionsequence_nonlinear(femmodel,analysis,maxiter,restol,reltol,abstol)
     85
     86        #Save output
     87        RequestedOutputsx(femmodel, [VxEnum,VyEnum,VelEnum])
    8188
    8289end #}}}
  • issm/trunk-jpl/src/jl/core/constraints.jl

    r26629 r26730  
    1414
    1515        #Apply Constraint
    16         ApplyConstraint(node,constraint.dof,constraint.value)
     16        ApplyConstraint(node, constraint.dof, constraint.value)
    1717
    1818end# }}}
  • issm/trunk-jpl/src/jl/core/elements.jl

    r26710 r26730  
    33        sid::Int64
    44        pid::Int64
     5
    56        #vertexids::Int64[3]
    67        #vertices::Vertex[3]
    78        vertexids::Vector{Int64}
    89        vertices::Vector{Vertex}
    9         nodeids::Vector{Int64}
     10
    1011        nodes::Vector{Node}
     12        nodes_list::Vector{Vector{Node}}
     13        nodes_ids_list::Vector{Vector{Int64}}
     14
    1115        parameters::Parameters
    1216        inputs::Inputs
    1317end# }}}
     18function 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
     28end #}}}
    1429
    1530#Element functions
     
    3146        end
    3247end #}}}
    33 function Update(element::Tria,inputs::Inputs,index::Int64,md::model,finiteelement::IssmEnum) #{{{
     48function Update(element::Tria, inputs::Inputs, index::Int64, md::model, finiteelement::IssmEnum) #{{{
    3449
    3550        if finiteelement==P1Enum
    3651                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))
    4159        else
    4260                error("not supported yet")
    4361        end
    4462end #}}}
    45 function Configure(element::Tria,nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) # {{{
     63function Configure(element::Tria,nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs,index::Int64) # {{{
    4664
    4765   #Configure vertices
     
    5169
    5270        #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]]
    5575        end
    5676
    5777        #Point to real datasets
     78        element.nodes      = element.nodes_list[index]
    5879        element.parameters = parameters
    5980        element.inputs     = inputs
  • issm/trunk-jpl/src/jl/core/femmodel.jl

    r26703 r26730  
    11#femmodel class definition
    22mutable struct FemModel #{{{
     3        analyses::Vector{Analysis}
    34        elements::Vector{Tria}
    45        vertices::Vector{Vertex}
     6
    57        nodes::Vector{Node}
     8        nodes_list::Vector{Vector{Node}}
     9
    610        parameters::Parameters
    711        inputs::Inputs
     12
    813        constraints::Vector{Constraint}
     14        constraints_list::Vector{Vector{Constraint}}
     15
    916        #loads::Vector{Loads}
     17
    1018        results::Vector{Result}
    1119end#}}}
    1220
    1321#femmodel functions
     22function SetCurrentConfiguration!(femmodel::FemModel, analysis::Analysis) #{{{
    1423
     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
     40end#}}}
  • issm/trunk-jpl/src/jl/core/modules.jl

    r26727 r26730  
    55        end
    66end#}}}
    7 function ModelProcessor(md::model) #{{{
     7function ModelProcessor(md::model, solutionstring::String) #{{{
    88
    99        #Initialize structures
    1010        elements    = Vector{Tria}(undef,0)
    1111        vertices    = Vector{Vertex}(undef,0)
    12         nodes       = Vector{Node}(undef,0)
    13         constraints = Vector{Constraint}(undef,0)
    1412        results     = Vector{Result}(undef,0)
    1513        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}())
    1715
    1816        #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
    2324
    2425        #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
    3756
    3857        #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)
    4063end# }}}
    4164function CreateElements(elements::Vector{Tria},md::model) #{{{
     
    4467        @assert length(elements)==0
    4568
    46         tempparams   = Parameters(Dict{IssmEnum,Parameter}())
    47         tempinputs   = Inputs(-1,-1,Dict{IssmEnum,Input}())
     69
    4870
    4971        count = 0
     
    5577
    5678                #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))
    5880        end
    5981
     
    85107        AddParam(parameters,1,StepEnum)
    86108        AddParam(parameters,0.0,TimeEnum)
     109
    87110end# }}}
    88111function CreateInputs(inputs::Inputs,elements::Vector{Tria},md::model) #{{{
     
    104127
    105128#Other modules
    106 function ConfigureObjectx(elements::Vector{Tria},nodes::Vector{Node},vertices::Vector{Vertex},parameters::Parameters,inputs::Inputs) #{{{
     129function ConfigureObjectx(elements::Vector{Tria}, nodes::Vector{Node}, vertices::Vector{Vertex}, parameters::Parameters, inputs::Inputs, analysis::Int64) #{{{
    107130
    108131        for i in 1:length(elements)
    109                 Configure(elements[i],nodes,vertices,parameters,inputs)
     132                Configure(elements[i], nodes, vertices, parameters, inputs, analysis)
    110133        end
    111134
  • issm/trunk-jpl/src/jl/core/parameters.jl

    r26629 r26730  
    88        enum::IssmEnum
    99        value::Int64
     10end# }}}
     11struct BoolParam <: Parameter #{{{
     12        enum::IssmEnum
     13        value::Bool
    1014end# }}}
    1115
     
    2226        return param.value
    2327end#}}}
     28function GetParameterValue(param::BoolParam) #{{{
     29        return param.value
     30end#}}}
    2431
    2532#Parameters functions
     
    2936
    3037end#}}}
    31 function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{
     38function AddParam(parameters::Parameters,value::Int64, enum::IssmEnum) #{{{
    3239
    3340        parameters.lookup[enum] = IntParam(enum,value)
    3441
    3542end#}}}
    36 function AddParam(parameters::Parameters,value::Int64,enum::IssmEnum) #{{{
     43function AddParam(parameters::Parameters,value::Bool, enum::IssmEnum) #{{{
    3744
    38         parameters.lookup[enum] = IntParam(enum,value)
     45        parameters.lookup[enum] = BoolParam(enum,value)
    3946
    4047end#}}}
  • issm/trunk-jpl/src/jl/core/solve.jl

    r26725 r26730  
    1212include("./matice.jl")
    1313include("./friction.jl")
     14include("./analyses/analysis.jl")
    1415include("./femmodel.jl")
    15 include("./analyses/analysis.jl")
     16
     17#All analyses
    1618include("./analyses/stressbalanceanalysis.jl")
     19include("./analyses/masstransportanalysis.jl")
     20include("./analyses/transientanalysis.jl")
     21
    1722include("./solutionsequences.jl")
    1823include("./modules.jl")
     
    2025include("./utils.jl")
    2126
    22 function IssmCore(md::model) #{{{
    23 
     27function IssmCore(md::model, solutionstring::String) #{{{
    2428
    2529        #Construct FemModel
    26         femmodel=ModelProcessor(md)
     30        femmodel=ModelProcessor(md, solutionstring)
    2731
    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
    3040        Core(analysis, femmodel)
    31 
    32         #Save output
    33         RequestedOutputsx(femmodel, [VxEnum,VyEnum,VelEnum])
    3441
    3542        #move results to md
  • issm/trunk-jpl/src/jl/tests/test.jl

    r26727 r26730  
    55
    66#Load model from MATLAB file
    7 file = matopen("./Pig.mat")
     7#file = matopen("./Pig.mat")
     8file = matopen("/Users/mmorligh/Desktop/issmuci/trunk-jpl/test/NightlyRun/temp.mat")
    89mat  = read(file, "md")
    910close(file)
  • issm/trunk-jpl/src/jl/tests/test101.jl

    r26725 r26730  
    2525vy    = archread(issmdir()*"/test/Data/SquareShelfConstrained.arch","vy")
    2626index = 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)
     27md.initialization.vx=0 .*InterpFromMeshToMesh2d(index,x,y,vx,md.mesh.x,md.mesh.y,0.0)
     28md.initialization.vy=0 .*InterpFromMeshToMesh2d(index,x,y,vy,md.mesh.x,md.mesh.y,0.0)
    2929
    3030md.materials.rheology_B=1.815730284801701e+08*ones(md.mesh.numberofvertices)
  • issm/trunk-jpl/src/jl/usr/classes.jl

    r26728 r26730  
    142142end
    143143# }}}
     144#Basalforcings {{{
     145mutable struct Basalforcings
     146        groundedice_melting_rate::Vector{Float64}
     147        floatingice_melting_rate::Vector{Float64}
     148end
     149function Basalforcings() #{{{
     150        return Basalforcings( Vector{Float64}(undef,0), Vector{Float64}(undef,0))
     151end# }}}
     152function Base.show(io::IO, this::Basalforcings)# {{{
     153        IssmStructDisp(io, this)
     154end# }}}
     155# }}}
     156#Surfaceforcings {{{
     157mutable struct SMBforcings
     158        mass_balance::Vector{Float64}
     159end
     160function SMBforcings() #{{{
     161        return SMBforcings( Vector{Float64}(undef,0))
     162end# }}}
     163function Base.show(io::IO, this::SMBforcings)# {{{
     164        IssmStructDisp(io, this)
     165end# }}}
     166# }}}
     167#Timestepping{{{
     168abstract type AbstractTimestepping end
     169mutable struct Timestepping <: AbstractTimestepping
     170        start_time::Float64
     171        final_time::Float64
     172        time_step::Float64
     173end
     174function Timestepping() #{{{
     175        return Timestepping( 0., 0., 0.)
     176end# }}}
     177function Base.show(io::IO, this::Timestepping)# {{{
     178        IssmStructDisp(io, this)
     179end# }}}
     180# }}}
     181#Masstransport {{{
     182mutable struct Masstransport
     183        spcthickness::Vector{Float64}
     184        min_thickness::Float64
     185        stabilization::Int64
     186end
     187function Masstransport() #{{{
     188        return Masstransport( Vector{Float64}(undef,0), 10.0, 1)
     189end# }}}
     190function Base.show(io::IO, this::Masstransport)# {{{
     191        IssmStructDisp(io, this)
     192end# }}}
     193# }}}
     194#Transient {{{
     195mutable struct Transient
     196        issmb::Bool
     197        ismasstransport::Bool
     198        isstressbalance::Bool
     199        isgroundingline::Bool
     200        ismovingfront::Bool
     201end
     202function Transient() #{{{
     203        return Transient( true, true, true, true, true)
     204end# }}}
     205function Base.show(io::IO, this::Transient)# {{{
     206        IssmStructDisp(io, this)
     207end# }}}
     208# }}}
    144209
    145210#Model structure
     
    154219        results::Dict
    155220        friction::AbstractFriction
     221        basalforcings::Basalforcings
     222        smb::SMBforcings
     223        timestepping::Timestepping
     224        masstransport::Masstransport
     225        transient::Transient
    156226end
    157227function 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())
    159232end#}}}
    160233function model(matmd::Dict) #{{{
     
    185258                                setfield!(mdfield, Symbol(name2), Int64(value_matlab))
    186259
     260                        elseif typeof(value_matlab)==Float64 && typeof(value_julia)==Bool
     261                                setfield!(mdfield, Symbol(name2), Bool(value_matlab))
     262
    187263                        elseif typeof(value_matlab)==Matrix{Float64} && typeof(value_julia)==Vector{Float64}
    188264                                if(size(value_matlab,2)!=1) error("only one column expected") end
     
    218294        @printf "%19s: %-26s -- %s\n" "materials" typeof(md.materials) "material properties"
    219295        @printf "%19s: %-26s -- %s\n" "initialization" typeof(md.initialization) "initial state"
    220         @printf "%19s: %-26s -- %s\n" "stressbalance" typeof(md.stressbalance) "stress balance parameters"
    221296        @printf "%19s: %-26s -- %s\n" "constants" typeof(md.constants) "physical constants"
    222297        @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
     305end# }}}
  • issm/trunk-jpl/src/jl/usr/utils.jl

    r26715 r26730  
    207207        if solution=="sb" || solution=="Stressbalance"
    208208                solutionstring = "StressbalanceSolution"
     209        elseif solution=="tr" || solution=="Transient"
     210                        solutionstring = "TransientSolution"
    209211        else
    210212                error("solutionstring "*solution*" not supported!");
    211213        end
    212214
    213         IssmCore(md)
     215        IssmCore(md, solutionstring)
    214216
    215217        return md
Note: See TracChangeset for help on using the changeset viewer.