Changeset 26731
- Timestamp:
- 12/12/21 19:36:55 (3 years ago)
- 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 38 38 FetchDataToInput(md,inputs,elements,md.basalforcings.groundedice_melting_rate./md.constants.yts,BasalforcingsGroundediceMeltingRateEnum) 39 39 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) 40 41 FetchDataToInput(md,inputs,elements,md.mask.ice_levelset, MaskIceLevelsetEnum) 41 42 FetchDataToInput(md,inputs,elements,md.mask.ocean_levelset, MaskOceanLevelsetEnum) … … 54 55 function Core(analysis::MasstransportAnalysis,femmodel::FemModel)# {{{ 55 56 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) 57 65 58 66 #Save output 59 RequestedOutputsx(femmodel, [ThicknessEnum, SurfaceEnum, B edEnum])67 RequestedOutputsx(femmodel, [ThicknessEnum, SurfaceEnum, BaseEnum]) 60 68 61 69 end #}}} 62 70 function CreateKMatrix(analysis::MasstransportAnalysis,element::Tria)# {{{ 63 64 error("not supported")65 71 66 72 #Internmediaries … … 70 76 Ke = ElementMatrix(element.nodes) 71 77 dbasis = Matrix{Float64}(undef,numnodes,2) 78 basis = Vector{Float64}(undef,numnodes) 72 79 73 80 #Retrieve all inputs and parameters 74 81 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 80 89 #Start integrating 81 90 gauss = GaussTria(2) … … 83 92 84 93 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 90 98 for i in 1:numnodes 91 99 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] 96 101 end 97 102 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") 122 131 end 123 132 end … … 126 135 end #}}} 127 136 function CreatePVector(analysis::MasstransportAnalysis,element::Tria)# {{{ 128 129 error("not supported")130 137 131 138 #Internmediaries … … 138 145 #Retrieve all inputs and parameters 139 146 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) 144 157 145 158 #Start integrating 146 gauss = GaussTria( 2)159 gauss = GaussTria(3) 147 160 for ig in 1:gauss.numgauss 148 161 … … 150 163 NodalFunctions(element, basis, gauss, ig, P1Enum) 151 164 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 154 174 155 175 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] 188 177 end 189 178 end … … 237 226 238 227 #Enforce minimum thickness 239 if(thickness[i]< min_thickness)240 thickness[i] = min_thickness228 if(thickness[i]<H_min) 229 thickness[i] = H_min 241 230 end 242 231 end … … 255 244 GetInputListOnVertices!(element, phi, MaskOceanLevelsetEnum) 256 245 sealevel = zeros(3) 246 newsurface = Vector{Float64}(undef,3) 247 newbase = Vector{Float64}(undef,3) 257 248 258 249 for i in 1:3 -
TabularUnified issm/trunk-jpl/src/jl/core/analyses/stressbalanceanalysis.jl ¶
r26730 r26731 82 82 83 83 #Call solution sequence to compute new speeds 84 println(" computing stress balance"); 84 85 solutionsequence_nonlinear(femmodel,analysis,maxiter,restol,reltol,abstol) 85 86 -
TabularUnified issm/trunk-jpl/src/jl/core/analyses/transientanalysis.jl ¶
r26730 r26731 6 6 7 7 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) 11 11 AddParam(parameters, md.transient.isstressbalance, TransientIsstressbalanceEnum) 12 12 AddParam(parameters, md.transient.ismasstransport, TransientIsmasstransportEnum) … … 26 26 while(time < finaltime - (yts*eps(Float64))) #make sure we run up to finaltime. 27 27 28 step+=129 28 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])") 33 32 34 33 if(isstressbalance) Core(StressbalanceAnalysis(), femmodel) end 35 34 if(ismasstransport) Core(MasstransportAnalysis(), femmodel) end 35 36 step+=1 36 37 end 37 38 -
TabularUnified issm/trunk-jpl/src/jl/core/elements.jl ¶
r26730 r26731 253 253 return nx, ny 254 254 end#}}} 255 function CharacteristicLength(element::Tria) #{{{ 256 257 return sqrt(2*GetArea(element)) 258 end#}}} 255 259 256 260 #Finite Element stuff -
TabularUnified issm/trunk-jpl/src/jl/core/inputs.jl ¶
r26699 r26731 97 97 input.values[indices] = values 98 98 end#}}} 99 function GetInputAverageValue(input::ElementInput ,gauss::GaussTria,i::Int64) #{{{99 function GetInputAverageValue(input::ElementInput) #{{{ 100 100 101 101 numnodes = NumberofNodesTria(input.interp) … … 151 151 152 152 end#}}} 153 function 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 162 end#}}} -
TabularUnified issm/trunk-jpl/src/jl/core/modules.jl ¶
r26730 r26731 115 115 FetchDataToInput(md,inputs,elements,md.materials.rheology_n,MaterialsRheologyNEnum) 116 116 end# }}} 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 117 function 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 125 147 126 148 end# }}} … … 182 204 return ug 183 205 206 end#}}} 207 function InputDuplicatex(femmodel::FemModel, oldenum::IssmEnum, newenum::IssmEnum) #{{{ 208 DuplicateInput(femmodel.inputs, oldenum, newenum) 184 209 end#}}} 185 210 function Reducevectorgtofx(ug::IssmVector,nodes::Vector{Node}) #{{{ … … 281 306 282 307 #Add to femmodel.results dataset 283 push!(femmodel.results, result)308 push!(femmodel.results, result) 284 309 285 310 else -
TabularUnified issm/trunk-jpl/src/jl/core/solutionsequences.jl ¶
r26710 r26731 1 function 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 20 end# }}} 1 21 function solutionsequence_nonlinear(femmodel::FemModel,analysis::Analysis,maxiter::Int64,restol::Float64,reltol::Float64,abstol::Float64) # {{{ 2 22 -
TabularUnified issm/trunk-jpl/src/jl/core/solve.jl ¶
r26730 r26731 41 41 42 42 #move results to md 43 OutputResultsx(femmodel, md )43 OutputResultsx(femmodel, md, solutionstring) 44 44 45 45 end# }}} -
TabularUnified issm/trunk-jpl/src/jl/core/toolkits.jl ¶
r26729 r26731 125 125 126 126 end#}}} 127 function Solverx(A::IssmMatrix, b::IssmVector,xold::IssmVector) #{{{127 function Solverx(A::IssmMatrix, b::IssmVector, xold::IssmVector) #{{{ 128 128 129 129 #Initialize output 130 130 #x = IssmVector(GetSize(xold)) 131 132 return Solverx(A, b) 133 134 end#}}} 135 function Solverx(A::IssmMatrix, b::IssmVector) #{{{ 136 137 #Initialize output 131 138 x = IssmVector(0) 132 139 … … 136 143 return x 137 144 138 139 145 end#}}}
Note:
See TracChangeset
for help on using the changeset viewer.