Changeset 26738


Ignore:
Timestamp:
12/17/21 12:21:15 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: account for passive elements now if the ice levelset crosses the domain

Location:
issm/trunk-jpl/src/jl/core
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/jl/core/analyses/masstransportanalysis.jl

    r26736 r26738  
    2222        numdof = 1
    2323        for i in 1:md.mesh.numberofvertices
    24                 push!(nodes,Node(i,i,true,numdof,-ones(Int64,numdof), ones(Int64,numdof), -ones(Int64,numdof), zeros(numdof)))
     24                push!(nodes,Node(i,i,true,true,numdof,-ones(Int64,numdof), ones(Int64,numdof), -ones(Int64,numdof), zeros(numdof)))
    2525        end
    2626end#}}}
     
    7070end #}}}
    7171function CreateKMatrix(analysis::MasstransportAnalysis,element::Tria)# {{{
     72
     73        #Return if there is no ice in this element
     74        if(!IsIceInElement(element)) return end
    7275
    7376        #Internmediaries
     
    136139end #}}}
    137140function CreatePVector(analysis::MasstransportAnalysis,element::Tria)# {{{
     141
     142        #Return if there is no ice in this element
     143        if(!IsIceInElement(element)) return end
    138144
    139145        #Internmediaries
     
    265271        AddInput(element, BaseEnum,    newbase,    P1Enum)
    266272end#}}}
     273function UpdateConstraints(analysis::MasstransportAnalysis, femmodel::FemModel) #{{{
     274        SetActiveNodesLSMx(femmodel)
     275end#}}}
  • issm/trunk-jpl/src/jl/core/analyses/stressbalanceanalysis.jl

    r26731 r26738  
    2727        numdof = 2
    2828        for i in 1:md.mesh.numberofvertices
    29                 push!(nodes,Node(i,i,true,numdof,-ones(Int64,numdof), ones(Int64,numdof), -ones(Int64,numdof), zeros(numdof)))
     29                push!(nodes,Node(i,i,true,true,numdof,-ones(Int64,numdof), ones(Int64,numdof), -ones(Int64,numdof), zeros(numdof)))
    3030        end
    3131end#}}}
     
    9191function CreateKMatrix(analysis::StressbalanceAnalysis,element::Tria)# {{{
    9292
     93        if(!IsIceInElement(element)) return end
     94
    9395        #Internmediaries
    9496        numnodes = 3
     
    153155end #}}}
    154156function CreatePVector(analysis::StressbalanceAnalysis,element::Tria)# {{{
     157
     158        if(!IsIceInElement(element)) return end
    155159
    156160        #Internmediaries
     
    271275        AddInput(element, VelEnum, vel, P1Enum)
    272276end#}}}
     277function UpdateConstraints(analysis::StressbalanceAnalysis, femmodel::FemModel) #{{{
     278        SetActiveNodesLSMx(femmodel)
     279end#}}}
  • issm/trunk-jpl/src/jl/core/elements.jl

    r26736 r26738  
    4646        end
    4747end #}}}
     48function InputUpdateFromVector(element::Tria, vector::Vector{Float64}, enum::IssmEnum, layout::IssmEnum) #{{{
     49
     50        lidlist = element.vertexids
     51        data = Vector{Float64}(undef, 3)
     52
     53        if(layout==VertexSIdEnum)
     54                for i in 1:3
     55                        data[i] = vector[element.vertices[i].sid]
     56                        @assert isfinite(data[i])
     57                end
     58                SetTriaInput(element.inputs, enum, P1Enum, lidlist, data)
     59        else
     60                error("layout ", layout, " not supported yet");
     61        end
     62end #}}}
    4863function Update(element::Tria, inputs::Inputs, index::Int64, md::model, finiteelement::IssmEnum) #{{{
    4964
     
    108123        InputServe!(element,input)
    109124        return input
     125
     126end # }}}
     127function GetInputListOnNodes!(element::Tria, vector::Vector{Float64}, enum::IssmEnum) # {{{
     128
     129        #Get Input first
     130        input = GetInput(element, enum)
     131
     132        #Get value at each vertex (i.e. P1 Nodes)
     133        gauss=GaussTria(P1Enum)
     134        for i in 1:gauss.numgauss
     135                vector[i] = GetInputValue(input, gauss, i)
     136        end
    110137
    111138end # }}}
     
    197224        end
    198225end#}}}
     226function IsIceInElement(element::Tria) #{{{
     227        #We consider that an element has ice if at least one of its nodes has a negative level set
     228
     229        input=GetInput(element, MaskIceLevelsetEnum)
     230
     231        if GetInputMin(input)<0
     232                return true
     233        else
     234                return false
     235        end
     236
     237end#}}}
    199238function GetIcefrontCoordinates!(element::Tria, xyz_front::Matrix{Float64}, xyz_list::Matrix{Float64}, levelsetenum::IssmEnum) #{{{
    200239
  • issm/trunk-jpl/src/jl/core/inputs.jl

    r26731 r26738  
    109109
    110110end#}}}
     111function GetInputMin(input::ElementInput) #{{{
     112
     113        return minimum(input.element_values)
     114
     115end#}}}
    111116function GetInputValue(input::ElementInput,gauss::GaussTria,i::Int64) #{{{
    112117
  • issm/trunk-jpl/src/jl/core/modules.jl

    r26736 r26738  
    4949                #Configure objects
    5050                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)
    5551        end
    5652
    5753        #Build FemModel
    58         return FemModel(analyses, elements, vertices,
    59                                                  Vector{Node}(undef,0), nodes,
    60                                                  parameters, inputs,
    61                                                  Vector{Constraint}(undef,0), constraints,
    62                                                  results)
     54        femmodel = FemModel(analyses, elements, vertices,
     55                                                          Vector{Node}(undef,0), nodes,
     56                                                          parameters, inputs,
     57                                                          Vector{Constraint}(undef,0), constraints,
     58                                                          results)
     59
     60        println("      detecting active vertices")
     61        GetMaskOfIceVerticesLSMx0(femmodel)
     62
     63        return femmodel
     64
    6365end# }}}
    6466function CreateElements(elements::Vector{Tria},md::model) #{{{
     
    205207
    206208end#}}}
     209function InputUpdateFromVectorx(femmodel::FemModel, vector::Vector{Float64}, enum::IssmEnum, layout::IssmEnum)
     210
     211        #Go through elements and plug in solution
     212        for i=1:length(femmodel.elements)
     213                InputUpdateFromVector(femmodel.elements[i], vector, enum, layout)
     214        end
     215
     216end#}}}
    207217function InputDuplicatex(femmodel::FemModel, oldenum::IssmEnum, newenum::IssmEnum) #{{{
    208218        DuplicateInput(femmodel.inputs, oldenum, newenum)
     
    266276                pe = CreatePVector(analysis,femmodel.elements[i])
    267277
    268                 AddToGlobal!(Ke,Kff,Kfs)
    269                 AddToGlobal!(pe,pf)
     278                if(!isnothing(Ke)) AddToGlobal!(Ke,Kff,Kfs) end
     279                if(!isnothing(pe)) AddToGlobal!(pe,pf) end
    270280        end
    271281
     
    320330
    321331end# }}}
     332function UpdateConstraintsx(femmodel::FemModel, analysis::Analysis)# {{{
     333
     334        #First, see if the analysis needs to change constraints
     335        UpdateConstraints(analysis, femmodel)
     336
     337        #Second, constraints might be time dependent
     338        SpcNodesx(femmodel.nodes, femmodel.constraints, femmodel.parameters)
     339
     340        #Now, update degrees of freedoms
     341        NodesDofx(femmodel.nodes, femmodel.parameters)
     342
     343end# }}}
     344function SetActiveNodesLSMx(femmodel::FemModel) #{{{
     345
     346        #Check mask of each element to see if element is active
     347        numnodes = 3
     348        mask = Vector{Float64}(undef, numnodes)
     349        for i in 1:length(femmodel.elements)
     350                GetInputListOnNodes!(femmodel.elements[i], mask, IceMaskNodeActivationEnum)
     351                for j in 1:numnodes
     352                        node = femmodel.elements[i].nodes[j]
     353                        if(mask[j]==1.) Activate!(node)
     354                        else             Deactivate!(node)
     355                        end
     356                end
     357
     358        end
     359end#}}}
     360function GetMaskOfIceVerticesLSMx0(femmodel::FemModel) #{{{
     361
     362        #Initialize vector with number of vertices
     363        numvertices=length(femmodel.vertices)
     364   if(numvertices==0) return end
     365
     366        #Initialize vector
     367        nbv = 3
     368        onesvec      = ones(nbv)
     369        vec_mask_ice = IssmVector(numvertices)
     370        vertexids    = Vector{Int64}(undef, nbv)
     371
     372        #Assign values to vector
     373        for i in 1:length(femmodel.elements)
     374                if (IsIceInElement(femmodel.elements[i]))
     375                        for j in 1:nbv
     376                                vertexids[j] = femmodel.elements[i].vertices[j].sid
     377                        end
     378                        SetValues!(vec_mask_ice, nbv, vertexids, onesvec)
     379                end
     380        end
     381        Assemble!(vec_mask_ice)
     382
     383        #Serialize vector
     384        vec_mask_ice_serial = ToSerial(vec_mask_ice)
     385
     386        #Update IceMaskNodeActivationEnum in elements
     387        InputUpdateFromVectorx(femmodel, vec_mask_ice_serial, IceMaskNodeActivationEnum, VertexSIdEnum)
     388end#}}}
  • issm/trunk-jpl/src/jl/core/nodes.jl

    r26698 r26738  
    44        sid::Int64
    55        indexingupdate::Bool
     6        active::Bool
    67        gsize::Int64
    78        gdoflist::Vector{Int64}
     
    2425        println(io,"   svalues: ",this.svalues)
    2526end# }}}
     27function Activate!(node::Node) #{{{
     28
     29        if(!node.active)
     30                node.indexingupdate = true
     31                node.active = true
     32                for i in 1:node.gsize
     33                        node.fdoflist[i]  = +1
     34                        node.sdoflist[i]  = -1
     35                        node.svalues[i]   = 0.0
     36                end
     37        end
     38
     39end# }}}
     40function Deactivate!(node::Node) #{{{
     41
     42        if(node.active)
     43                node.indexingupdate = true
     44                node.active = false
     45                for i in 1:node.gsize
     46                        node.fdoflist[i]  = -1
     47                        node.sdoflist[i]  = +1
     48                        node.svalues[i]   = 0.0
     49                end
     50        end
     51
     52end# }}}
    2653function ApplyConstraint(node::Node,dof::Int8,value::Float64) #{{{
    2754
     
    4269
    4370        if setenum==GsetEnum
    44                 for i=1:node.gsize
     71                for i in 1:node.gsize
    4572                        node.gdoflist[i] = dofcount
    4673                        dofcount += 1
    4774                end
    4875        elseif setenum==FsetEnum
    49                 for i=1:node.gsize
     76                for i in 1:node.gsize
    5077                        if  node.fdoflist[i]!=-1
    5178                                @assert node.sdoflist[i]==-1
     
    5582                end
    5683        elseif setenum==SsetEnum
    57                 for i=1:node.gsize
     84                for i in 1:node.gsize
    5885                        if  node.sdoflist[i]!=-1
    5986                                @assert node.fdoflist[i]==-1
  • issm/trunk-jpl/src/jl/core/solutionsequences.jl

    r26731 r26738  
    11function solutionsequence_linear(femmodel::FemModel,analysis::Analysis) # {{{
     2
     3        #First, update constraints in case the levelset has changed
     4        UpdateConstraintsx(femmodel, analysis)
    25
    36        #Get new matrices
     
    2023end# }}}
    2124function solutionsequence_nonlinear(femmodel::FemModel,analysis::Analysis,maxiter::Int64,restol::Float64,reltol::Float64,abstol::Float64) # {{{
     25
     26        #First, update constraints in case the levelset has changed
     27        UpdateConstraintsx(femmodel, analysis)
    2228
    2329        #Initialize number of iterations
  • issm/trunk-jpl/src/jl/core/toolkits.jl

    r26731 r26738  
    9292
    9393end#}}}
     94function ToSerial(vector::IssmVector)#{{{
     95
     96        return vector.vector
     97
     98end#}}}
    9499function Norm(x::IssmVector,type::Int64)#{{{
    95100
Note: See TracChangeset for help on using the changeset viewer.