Changeset 26731


Ignore:
Timestamp:
12/12/21 19:36:55 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: done with transient

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

Legend:

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

    r26730 r26731  
    3838        FetchDataToInput(md,inputs,elements,md.basalforcings.groundedice_melting_rate./md.constants.yts,BasalforcingsGroundediceMeltingRateEnum)
    3939        FetchDataToInput(md,inputs,elements,md.basalforcings.floatingice_melting_rate./md.constants.yts,BasalforcingsFloatingiceMeltingRateEnum)
     40        FetchDataToInput(md,inputs,elements,md.smb.mass_balance./md.constants.yts,SmbMassBalanceEnum)
    4041        FetchDataToInput(md,inputs,elements,md.mask.ice_levelset, MaskIceLevelsetEnum)
    4142        FetchDataToInput(md,inputs,elements,md.mask.ocean_levelset, MaskOceanLevelsetEnum)
     
    5455function Core(analysis::MasstransportAnalysis,femmodel::FemModel)# {{{
    5556
    56         error("not supported yet")
     57        println("   computing mass transport")
     58        SetCurrentConfiguration!(femmodel, analysis)
     59
     60        InputDuplicatex(femmodel, ThicknessEnum, ThicknessOldEnum)
     61        InputDuplicatex(femmodel, BaseEnum, BaseOldEnum)
     62        InputDuplicatex(femmodel, SurfaceEnum, SurfaceOldEnum)
     63
     64        solutionsequence_linear(femmodel,analysis)
    5765
    5866        #Save output
    59         RequestedOutputsx(femmodel, [ThicknessEnum, SurfaceEnum, BedEnum])
     67        RequestedOutputsx(femmodel, [ThicknessEnum, SurfaceEnum, BaseEnum])
    6068
    6169end #}}}
    6270function CreateKMatrix(analysis::MasstransportAnalysis,element::Tria)# {{{
    63 
    64         error("not supported")
    6571
    6672        #Internmediaries
     
    7076        Ke = ElementMatrix(element.nodes)
    7177        dbasis = Matrix{Float64}(undef,numnodes,2)
     78        basis  = Vector{Float64}(undef,numnodes)
    7279
    7380        #Retrieve all inputs and parameters
    7481        xyz_list = GetVerticesCoordinates(element.vertices)
    75         H_input  = GetInput(element, ThicknessEnum)
    76 
    77         #Prepare material object
    78         material = Matice(element)
    79        
     82        vx_input      = GetInput(element, VxEnum)
     83        vy_input      = GetInput(element, VyEnum)
     84        dt            = FindParam(element, TimesteppingTimeStepEnum)
     85        stabilization = FindParam(element, MasstransportStabilizationEnum)
     86
     87        h = CharacteristicLength(element)
     88
    8089        #Start integrating
    8190        gauss = GaussTria(2)
     
    8392
    8493                Jdet = JacobianDeterminant(xyz_list, gauss)
    85                 NodalFunctionsDerivatives(element,dbasis,xyz_list,gauss)
    86 
    87                 H  = GetInputValue(H_input, gauss, ig)
    88                 mu = ViscositySSA(material, xyz_list, gauss, ig)
    89 
     94                NodalFunctionsDerivatives(element, dbasis, xyz_list, gauss)
     95                NodalFunctions(element, basis, gauss, ig, P1Enum)
     96
     97      #Transient term
    9098                for i in 1:numnodes
    9199                        for j in 1:numnodes
    92                                 Ke.values[2*i-1,2*j-1] += gauss.weights[ig]*Jdet*mu*H*(4*dbasis[j,1]*dbasis[i,1] + dbasis[j,2]*dbasis[i,2])
    93                                 Ke.values[2*i-1,2*j  ] += gauss.weights[ig]*Jdet*mu*H*(2*dbasis[j,2]*dbasis[i,1] + dbasis[j,1]*dbasis[i,2])
    94                                 Ke.values[2*i  ,2*j-1] += gauss.weights[ig]*Jdet*mu*H*(2*dbasis[j,1]*dbasis[i,2] + dbasis[j,2]*dbasis[i,1])
    95                                 Ke.values[2*i  ,2*j  ] += gauss.weights[ig]*Jdet*mu*H*(4*dbasis[j,2]*dbasis[i,2] + dbasis[j,1]*dbasis[i,1])
     100                                Ke.values[i ,j] += gauss.weights[ig]*Jdet*basis[i]*basis[j]
    96101                        end
    97102                end
    98         end
    99 
    100         #Add basal friction
    101         phi=GetGroundedPortion(element, xyz_list)
    102 
    103         if(phi>0)
    104                 basis = Vector{Float64}(undef,numnodes)
    105                 friction = CoreFriction(element)
    106 
    107                 #Start integrating
    108                 gauss = GaussTria(2)
    109                 for ig in 1:gauss.numgauss
    110 
    111                         Jdet = JacobianDeterminant(xyz_list, gauss)
    112                         NodalFunctions(element, basis, gauss, ig, P1Enum)
    113 
    114                         alpha2 = Alpha2(friction, gauss, ig)
    115 
    116                         for i in 1:numnodes
    117                                 for j in 1:numnodes
    118                                         Ke.values[2*i-1,2*j-1] += gauss.weights[ig]*Jdet*phi*alpha2*basis[i]*basis[j]
    119                                         Ke.values[2*i  ,2*j  ] += gauss.weights[ig]*Jdet*phi*alpha2*basis[i]*basis[j]
    120                                 end
    121                         end
     103
     104      #Advection term
     105                vx  = GetInputValue(vx_input, gauss, ig)
     106      vy  = GetInputValue(vy_input, gauss, ig)
     107                dvx = GetInputDerivativeValue(vx_input, xyz_list, gauss, ig)
     108      dvy = GetInputDerivativeValue(vy_input, xyz_list, gauss, ig)
     109      for i in 1:numnodes
     110         for j in 1:numnodes
     111            #\phi_i \phi_j \nabla\cdot v
     112            Ke.values[i ,j] += dt*gauss.weights[ig]*Jdet*basis[i]*basis[j]*(dvx[1] + dvy[2])
     113            #\phi_i v\cdot\nabla\phi_j
     114            Ke.values[i ,j] += dt*gauss.weights[ig]*Jdet*basis[i]*(vx*dbasis[j,1] + vy*dbasis[j,2])
     115         end
     116      end
     117
     118                #Stabilization
     119                if(stabilization==0)
     120                        #do nothing
     121                elseif (stabilization==1)
     122                        vx = GetInputAverageValue(vx_input)
     123                        vy = GetInputAverageValue(vy_input)
     124                        D  = dt*gauss.weights[ig]*Jdet*[h/2*abs(vx) 0; 0 h/2*abs(vy)]
     125                        for i in 1:numnodes; for j in 1:numnodes
     126                                        Ke.values[i ,j] += (dbasis[i,1]*(D[1,1]*dbasis[j,1] + D[1,2]*dbasis[j,2]) +
     127                                                                                          dbasis[i,2]*(D[2,1]*dbasis[j,1] + D[2,2]*dbasis[j,2]))
     128                        end end
     129                else
     130                        error("Stabilization ",stabilization, " not supported yet")
    122131                end
    123132        end
     
    126135end #}}}
    127136function CreatePVector(analysis::MasstransportAnalysis,element::Tria)# {{{
    128 
    129         error("not supported")
    130137
    131138        #Internmediaries
     
    138145        #Retrieve all inputs and parameters
    139146        xyz_list = GetVerticesCoordinates(element.vertices)
    140         H_input  = GetInput(element, ThicknessEnum)
    141         s_input  = GetInput(element, SurfaceEnum)
    142         rho_ice  = FindParam(element, MaterialsRhoIceEnum)
    143         g        = FindParam(element, ConstantsGEnum)
     147        H_input         = GetInput(element, ThicknessEnum)
     148        gmb_input       = GetInput(element, BasalforcingsGroundediceMeltingRateEnum)
     149        fmb_input       = GetInput(element, BasalforcingsFloatingiceMeltingRateEnum)
     150   smb_input       = GetInput(element, SmbMassBalanceEnum)
     151        olevelset_input = GetInput(element, MaskOceanLevelsetEnum)
     152        dt            = FindParam(element, TimesteppingTimeStepEnum)
     153        stabilization = FindParam(element, MasstransportStabilizationEnum)
     154
     155   #How much is actually grounded?
     156        phi=GetGroundedPortion(element, xyz_list)
    144157
    145158        #Start integrating
    146         gauss = GaussTria(2)
     159        gauss = GaussTria(3)
    147160        for ig in 1:gauss.numgauss
    148161
     
    150163                NodalFunctions(element, basis, gauss, ig, P1Enum)
    151164
    152                 H  = GetInputValue(H_input, gauss, ig)
    153                 ds = GetInputDerivativeValue(s_input, xyz_list, gauss, ig)
     165                smb = GetInputValue(smb_input, gauss, ig)
     166      H   = GetInputValue(H_input, gauss, ig)
     167
     168      #Only apply melt on fully floating cells
     169      if(phi<0.00000001)
     170         mb = GetInputValue(fmb_input, gauss, ig)
     171      else
     172         mb = GetInputValue(gmb_input, gauss, ig)
     173      end
    154174
    155175                for i in 1:numnodes
    156                         pe.values[2*i-1] += -gauss.weights[ig]*Jdet*rho_ice*g*H*ds[1]*basis[i]
    157                         pe.values[2*i  ] += -gauss.weights[ig]*Jdet*rho_ice*g*H*ds[2]*basis[i]
    158                 end
    159         end
    160 
    161         if(IsIcefront(element))
    162 
    163                 #Get additional parameters and inputs
    164                 b_input   = GetInput(element, BaseEnum)
    165                 rho_water = FindParam(element, MaterialsRhoSeawaterEnum)
    166 
    167                 #Get normal and ice front coordinates
    168                 xyz_list_front = Matrix{Float64}(undef,2,3)
    169                 GetIcefrontCoordinates!(element, xyz_list_front, xyz_list, MaskIceLevelsetEnum)
    170                 nx, ny = NormalSection(element, xyz_list_front)
    171 
    172                 gauss = GaussTria(element, xyz_list, xyz_list_front, 3)
    173                 for ig in 1:gauss.numgauss
    174 
    175                         Jdet = JacobianDeterminantSurface(xyz_list_front, gauss)
    176                         NodalFunctions(element, basis, gauss, ig, P1Enum)
    177 
    178                         H  = GetInputValue(H_input, gauss, ig)
    179                         b  = GetInputValue(b_input, gauss, ig)
    180                         sl = 0
    181 
    182                         term = 0.5*g*rho_ice*H^2 + 0.5*g*rho_water*(min(0, H+b-sl)^2 - min(0, b-sl)^2)
    183 
    184                         for i in 1:numnodes
    185                                 pe.values[2*i-1] += gauss.weights[ig]*Jdet*term*nx*basis[i]
    186                                 pe.values[2*i  ] += gauss.weights[ig]*Jdet*term*ny*basis[i]
    187                         end
     176         pe.values[i] += gauss.weights[ig]*Jdet*(H + dt*(smb - mb))*basis[i]
    188177                end
    189178        end
     
    237226
    238227                #Enforce minimum thickness
    239                 if(thickness[i]<min_thickness)
    240                         thickness[i] = min_thickness
     228                if(thickness[i]<H_min)
     229                        thickness[i] = H_min
    241230                end
    242231        end
     
    255244   GetInputListOnVertices!(element, phi, MaskOceanLevelsetEnum)
    256245   sealevel = zeros(3)
     246        newsurface = Vector{Float64}(undef,3)
     247        newbase    = Vector{Float64}(undef,3)
    257248
    258249   for i in 1:3
  • TabularUnified issm/trunk-jpl/src/jl/core/analyses/stressbalanceanalysis.jl

    r26730 r26731  
    8282
    8383        #Call solution sequence to compute new speeds
     84        println("   computing stress balance");
    8485        solutionsequence_nonlinear(femmodel,analysis,maxiter,restol,reltol,abstol)
    8586
  • TabularUnified issm/trunk-jpl/src/jl/core/analyses/transientanalysis.jl

    r26730 r26731  
    66
    77        AddParam(parameters, md.constants.yts, ConstantsYtsEnum)
    8         AddParam(parameters, md.timestepping.start_time/md.constants.yts, TimeEnum)
    9         AddParam(parameters, md.timestepping.final_time/md.constants.yts, TimesteppingFinalTimeEnum)
    10         AddParam(parameters, md.timestepping.time_step/md.constants.yts,  TimesteppingTimeStepEnum)
     8        AddParam(parameters, md.timestepping.start_time*md.constants.yts, TimeEnum)
     9        AddParam(parameters, md.timestepping.final_time*md.constants.yts, TimesteppingFinalTimeEnum)
     10        AddParam(parameters, md.timestepping.time_step*md.constants.yts,  TimesteppingTimeStepEnum)
    1111        AddParam(parameters, md.transient.isstressbalance, TransientIsstressbalanceEnum)
    1212        AddParam(parameters, md.transient.ismasstransport, TransientIsmasstransportEnum)
     
    2626   while(time < finaltime - (yts*eps(Float64))) #make sure we run up to finaltime.
    2727
    28                 step+=1
    2928                time+=dt
    30                 AddParam(femmodel.parameters, time, TimeEnum);
    31                 AddParam(femmodel.parameters, step, StepEnum);
    32       println("iteration ", step, "/", ceil((finaltime-time)/dt)+step," time [yr]: ", time/yts, " (time step: ",  dt/yts, ")")
     29                AddParam(femmodel.parameters, time, TimeEnum)
     30                AddParam(femmodel.parameters, step, StepEnum)
     31                println("iteration ", step, "/", Int(ceil((finaltime-time)/dt))+step," time [yr]: ", time/yts, " (time step: ",  dt/yts, " [yr])")
    3332
    3433      if(isstressbalance) Core(StressbalanceAnalysis(), femmodel) end
    3534      if(ismasstransport) Core(MasstransportAnalysis(), femmodel) end
     35
     36                step+=1
    3637   end
    3738
  • TabularUnified issm/trunk-jpl/src/jl/core/elements.jl

    r26730 r26731  
    253253        return nx, ny
    254254end#}}}
     255function CharacteristicLength(element::Tria) #{{{
     256
     257        return sqrt(2*GetArea(element))
     258end#}}}
    255259
    256260#Finite Element stuff
  • TabularUnified issm/trunk-jpl/src/jl/core/inputs.jl

    r26699 r26731  
    9797        input.values[indices] = values
    9898end#}}}
    99 function GetInputAverageValue(input::ElementInput,gauss::GaussTria,i::Int64) #{{{
     99function GetInputAverageValue(input::ElementInput) #{{{
    100100
    101101        numnodes = NumberofNodesTria(input.interp)
     
    151151
    152152end#}}}
     153function DuplicateInput(inputs::Inputs, old::IssmEnum, new::IssmEnum)#{{{
     154
     155        #Fetch input that needs to be copied
     156        oldinput = inputs.lookup[old]
     157
     158        if typeof(oldinput)==ElementInput
     159                inputs.lookup[new] = ElementInput(new, oldinput.interp, copy(oldinput.values), copy(oldinput.element_values))
     160        end
     161
     162end#}}}
  • TabularUnified issm/trunk-jpl/src/jl/core/modules.jl

    r26730 r26731  
    115115        FetchDataToInput(md,inputs,elements,md.materials.rheology_n,MaterialsRheologyNEnum)
    116116end# }}}
    117 function OutputResultsx(femmodel::FemModel, md::model)# {{{
    118 
    119         output = Dict()
    120         for i in length(femmodel.results)
    121                 result = femmodel.results[i]
    122                 output[EnumToString(result.enum)] = result.value
    123         end
    124         md.results["Stressbalance"] = output
     117function OutputResultsx(femmodel::FemModel, md::model, solution::String)# {{{
     118
     119
     120        if solution=="TransientSolution"
     121
     122                #Compute maximum number of steps
     123                maxstep = 0
     124                for i in length(femmodel.results)
     125                        if(femmodel.results[i].step>maxstep) maxstep = femmodel.results[i].step end
     126                end
     127
     128                #Initialize vector now that we know the size
     129                output = Vector{Dict}(undef, maxstep)
     130                for i in 1:maxstep; output[i] = Dict() end
     131
     132                #Insert results in vector
     133                for i in 1:length(femmodel.results)
     134                        result = femmodel.results[i]
     135                        step   = femmodel.results[i].step
     136                        (output[step])[EnumToString(result.enum)] = result.value
     137                end
     138        else
     139                output = Dict()
     140                for i in length(femmodel.results)
     141                        result = femmodel.results[i]
     142                        output[EnumToString(result.enum)] = result.value
     143                end
     144        end
     145
     146        md.results[solution] = output
    125147
    126148end# }}}
     
    182204        return ug
    183205
     206end#}}}
     207function InputDuplicatex(femmodel::FemModel, oldenum::IssmEnum, newenum::IssmEnum) #{{{
     208        DuplicateInput(femmodel.inputs, oldenum, newenum)
    184209end#}}}
    185210function Reducevectorgtofx(ug::IssmVector,nodes::Vector{Node}) #{{{
     
    281306
    282307                        #Add to femmodel.results dataset
    283                         push!(femmodel.results,result)
     308                        push!(femmodel.results, result)
    284309
    285310                else
  • TabularUnified issm/trunk-jpl/src/jl/core/solutionsequences.jl

    r26710 r26731  
     1function solutionsequence_linear(femmodel::FemModel,analysis::Analysis) # {{{
     2
     3        #Get new matrices
     4        Kff, Kfs, pf = SystemMatricesx(femmodel,analysis)
     5
     6        #Enforce constraints
     7        ys = CreateNodalConstraintsx(femmodel.nodes)
     8        Reduceloadx!(pf, Kfs, ys)
     9
     10        #Solve!
     11        uf = Solverx(Kff, pf)
     12
     13        #Merge uf with ys and update inputs
     14        gsize = NumberOfDofs(femmodel.nodes,GsetEnum)
     15        ug = IssmVector(gsize)
     16        Mergesolutionfromftogx(ug, uf, ys, femmodel.nodes)
     17
     18        InputUpdateFromSolutionx(analysis, ug, femmodel)
     19
     20end# }}}
    121function solutionsequence_nonlinear(femmodel::FemModel,analysis::Analysis,maxiter::Int64,restol::Float64,reltol::Float64,abstol::Float64) # {{{
    222
  • TabularUnified issm/trunk-jpl/src/jl/core/solve.jl

    r26730 r26731  
    4141
    4242        #move results to md
    43         OutputResultsx(femmodel, md)
     43        OutputResultsx(femmodel, md, solutionstring)
    4444
    4545end# }}}
  • TabularUnified issm/trunk-jpl/src/jl/core/toolkits.jl

    r26729 r26731  
    125125
    126126end#}}}
    127 function Solverx(A::IssmMatrix,b::IssmVector,xold::IssmVector) #{{{
     127function Solverx(A::IssmMatrix, b::IssmVector, xold::IssmVector) #{{{
    128128
    129129        #Initialize output
    130130        #x = IssmVector(GetSize(xold))
     131       
     132        return Solverx(A, b)
     133
     134end#}}}
     135function Solverx(A::IssmMatrix, b::IssmVector) #{{{
     136
     137        #Initialize output
    131138        x = IssmVector(0)
    132139
     
    136143        return x
    137144
    138 
    139145end#}}}
Note: See TracChangeset for help on using the changeset viewer.