Changeset 26681
- Timestamp:
- 11/30/21 08:52:19 (3 years ago)
- Location:
- issm/trunk-jpl/src/jl/solve
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/jl/solve/analyses/stressbalanceanalysis.jl
r26675 r26681 77 77 #Retrieve all inputs and parameters 78 78 xyz_list = GetVerticesCoordinates(element.vertices) 79 vx_input = GetInput(element, VxEnum)80 vy_input = GetInput(element, VyEnum)81 79 H_input = GetInput(element, ThicknessEnum) 82 80 83 81 #Prepare material object 84 material = Matice( )82 material = Matice(element) 85 83 86 84 #Start integrating 87 85 gauss = GaussTria(2) 88 for i in 1:gauss.numgauss86 for ig in 1:gauss.numgauss 89 87 90 88 Jdet = JacobianDeterminant(xyz_list, gauss) 91 89 NodalFunctionsDerivatives(element,dbasis,xyz_list,gauss) 92 90 93 H = GetInputValue(H_input, gauss, i) 91 H = GetInputValue(H_input, gauss, ig) 92 mu = ViscositySSA(material, xyz_list, gauss, ig) 94 93 95 error("STOP") 96 vx = GetInputValue(vx_input, gauss, i) 97 vy = GetInputValue(vy_input, gauss, i) 94 for i in 1:numnodes 95 for j in 1:numnodes 96 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]) 97 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]) 98 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]) 99 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 end 101 end 98 102 end 99 103 104 return Ke 105 end #}}} 106 function CreatePVector(analysis::StressbalanceAnalysis,element::Tria)# {{{ 100 107 108 #Internmediaries 109 numnodes = 3 110 111 #Initialize Element vectro and basis functions 112 pe = ElementVector(element.nodes) 113 basis = Vector{Float64}(undef,numnodes) 114 115 #Retrieve all inputs and parameters 116 xyz_list = GetVerticesCoordinates(element.vertices) 117 H_input = GetInput(element, ThicknessEnum) 118 s_input = GetInput(element, SurfaceEnum) 119 rho_ice = FindParam(element, MaterialsRhoIceEnum) 120 g = FindParam(element, ConstantsGEnum) 121 122 #Start integrating 123 gauss = GaussTria(2) 124 for ig in 1:gauss.numgauss 125 126 Jdet = JacobianDeterminant(xyz_list, gauss) 127 NodalFunctions(element, basis, gauss, ig, P1Enum) 128 129 H = GetInputValue(H_input, gauss, ig) 130 ds = GetInputDerivativeValue(s_input, xyz_list, gauss, ig) 131 132 for i in 1:numnodes 133 pe.values[2*i-1] += -gauss.weights[ig]*Jdet*rho_ice*g*H*ds[1]*basis[i] 134 pe.values[2*i ] += -gauss.weights[ig]*Jdet*rho_ice*g*H*ds[2]*basis[i] 135 end 136 end 137 138 print(pe) 101 139 error("STOP") 102 140 103 return Ke141 return Pe 104 142 end #}}} 105 143 function GetSolutionFromInputs(analysis::StressbalanceAnalysis,ug::Vector{Float64},element::Tria) #{{{ -
issm/trunk-jpl/src/jl/solve/elementmatrix.jl
r26658 r26681 43 43 44 44 #Initialize element matrix with zeros 45 values = zeros(nrows ,nrows)45 values = zeros(nrows) 46 46 47 47 #Get dof list … … 54 54 println(io,"ElementVector:") 55 55 println(io," nrows: ",this.nrows) 56 println(io," gglobaldoflist: ",this.gglobaldoflist)57 56 println(io," fglobaldoflist: ",this.fglobaldoflist) 58 println(io," sglobaldoflist: ",this.sglobaldoflist)59 57 print(io," values: ") 60 58 display(this.values) -
issm/trunk-jpl/src/jl/solve/elements.jl
r26675 r26681 89 89 90 90 end # }}} 91 function FindParam(element::Tria,enum::IssmEnum) # {{{ 92 93 return FindParam(element.parameters, enum) 94 95 end # }}} 91 96 function InputServe!(element::Tria,input::ElementInput) # {{{ 92 97 … … 145 150 return Jinv 146 151 end#}}} 152 function NodalFunctions(element::Tria,basis::Vector{Float64}, gauss::GaussTria, ig::Int64, finiteelement::IssmEnum) #{{{ 153 154 if(finiteelement==P0Enum) 155 #Nodal function 1 156 basis[1]= 1 157 elseif(finiteelement==P1Enum) 158 basis[1] = gauss.coords1[ig] 159 basis[2] = gauss.coords2[ig] 160 basis[3] = gauss.coords3[ig] 161 else 162 error("Element type ",finiteelement," not supported yet") 163 end 164 165 166 end#}}} 147 167 function NodalFunctionsDerivatives(element::Tria,dbasis::Matrix{Float64},xyz_list::Matrix{Float64}, gauss::GaussTria) #{{{ 148 168 149 169 #Get nodal function derivatives in reference element 150 170 dbasis_ref = Matrix{Float64}(undef,3,2) 151 NodalFunctionsDerivativesReference (dbasis_ref,gauss,P1Enum)171 NodalFunctionsDerivativesReferenceTria(dbasis_ref,gauss,P1Enum) 152 172 153 173 #Get invert of the Jacobian … … 163 183 164 184 end#}}} 165 function NodalFunctionsDerivativesReference (dbasis::Matrix{Float64}, gauss::GaussTria, finiteelement::IssmEnum) #{{{185 function NodalFunctionsDerivativesReferenceTria(dbasis::Matrix{Float64}, gauss::GaussTria, finiteelement::IssmEnum) #{{{ 166 186 167 187 if(finiteelement==P0Enum) 168 188 #Nodal function 1 169 dbasis[1,1]= 0 .170 dbasis[1,2]= 0 .189 dbasis[1,1]= 0 190 dbasis[1,2]= 0 171 191 172 192 elseif(finiteelement==P1Enum) … … 184 204 end 185 205 end#}}} 206 function NumberofNodesTria(finiteelement) #{{{ 207 208 if (finiteelement==P0Enum) return 0 209 elseif(finiteelement==P1Enum) return 3 210 else 211 error("Element type ",finiteelement," not supported yet") 212 end 213 end#}}} -
issm/trunk-jpl/src/jl/solve/inputs.jl
r26649 r26681 97 97 input.values[indices] = values 98 98 end#}}} 99 function GetInputValue(input::ElementInput,gauss::GaussTria,i::Int64) 99 function GetInputAverageValue(input::ElementInput,gauss::GaussTria,i::Int64) #{{{ 100 101 numnodes = NumberofNodesTria(input.interp) 102 value = 0.0 103 104 for i in 1:numnodes 105 value+=input.element_values[i] 106 end 107 108 return value/numnodes 109 110 end#}}} 111 function GetInputValue(input::ElementInput,gauss::GaussTria,i::Int64) #{{{ 100 112 101 113 if input.interp==P0Enum 102 return input.element_value 114 return input.element_values 103 115 elseif input.interp==P1Enum 104 116 value = input.element_values[1]*gauss.coords1[i] + input.element_values[2]*gauss.coords2[i] + input.element_values[3]*gauss.coords3[i] … … 110 122 111 123 end#}}} 124 function GetInputDerivativeValue(input::ElementInput,xyz_list::Matrix{Float64},gauss::GaussTria,i::Int64) #{{{ 125 126 #Get nodal function derivatives in reference element 127 numnodes = NumberofNodesTria(input.interp) 128 dbasis_ref = Matrix{Float64}(undef,numnodes,2) 129 NodalFunctionsDerivativesReferenceTria(dbasis_ref,gauss,input.interp) 130 131 #Get invert of the Jacobian 132 Jinv = JacobianInvert(xyz_list,gauss) 133 134 #Build dbasis: 135 #[ dNi/dx ] = Jinv * [dNhat_i/dr] 136 #[ dNi/dy ] = [dNhat_i/ds] 137 dbasis = Matrix{Float64}(undef,numnodes,2) 138 for i in 1:3 139 dbasis[i,1] = Jinv[1,1]*dbasis_ref[i,1]+Jinv[1,2]*dbasis_ref[i,2] 140 dbasis[i,2] = Jinv[2,1]*dbasis_ref[i,1]+Jinv[2,2]*dbasis_ref[i,2] 141 end 142 143 #Get derivatives: dp/dx dp/dy 144 dp = [0.0;0.0] 145 for i in 1:3 146 dp[1] += dbasis[i,1]*input.element_values[i] 147 dp[2] += dbasis[i,2]*input.element_values[i] 148 end 149 150 return dp 151 152 end#}}} -
issm/trunk-jpl/src/jl/solve/matice.jl
r26675 r26681 1 1 #Matice class definition 2 mutable struct Matice#{{{ 2 struct Matice#{{{ 3 vx_input::ElementInput 4 vy_input::ElementInput 5 B_input::ElementInput 6 n_input::ElementInput 3 7 end# }}} 4 8 9 function Matice(element::Tria) #{{{ 10 11 vx_input = GetInput(element, VxEnum) 12 vy_input = GetInput(element, VyEnum) 13 B_input = GetInput(element, MaterialsRheologyBEnum) 14 n_input = GetInput(element, MaterialsRheologyNEnum) 15 16 return Matice(vx_input, vy_input, B_input, n_input) 17 end#}}} 18 5 19 #vertices functions 6 function GetViscositySSA() #{{{20 function ViscositySSA(matice::Matice, xyz_list::Matrix{Float64}, gauss::GaussTria, i::Int64) #{{{ 7 21 8 error("not implemented") 22 #Get strain rate 23 dvx = GetInputDerivativeValue(matice.vx_input,xyz_list,gauss,i) 24 dvy = GetInputDerivativeValue(matice.vy_input,xyz_list,gauss,i) 25 eps_xx = dvx[1] 26 eps_yy = dvy[2] 27 eps_xy = 0.5*(dvx[2] + dvy[1]) 28 29 #In SSA, eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy 30 eps_eff = sqrt(eps_xx*eps_xx + eps_yy*eps_yy + eps_xy*eps_xy + eps_xx*eps_yy) 31 32 #Get B and n 33 n = GetInputValue(matice.n_input, gauss, i) 34 B = GetInputValue(matice.B_input, gauss, i) 35 36 #Compute viscosity 37 if eps_eff==0. 38 mu = 1.e+14/2 39 else 40 mu = B/(2*eps_eff^((n-1)/n)) 41 end 42 9 43 return mu 10 44 end #}}} -
issm/trunk-jpl/src/jl/solve/modules.jl
r26659 r26681 79 79 AddParam(parameters,md.materials.rho_water,MaterialsRhoSeawaterEnum) 80 80 AddParam(parameters,md.materials.rho_freshwater,MaterialsRhoFreshwaterEnum) 81 AddParam(parameters,md.constants.g,ConstantsGEnum) 81 82 end# }}} 82 83 function CreateInputs(inputs::Inputs,elements::Vector{Tria},md::model) #{{{
Note:
See TracChangeset
for help on using the changeset viewer.