Changeset 26681


Ignore:
Timestamp:
11/30/21 08:52:19 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: done with load vector and element stiffness matrix

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  
    7777        #Retrieve all inputs and parameters
    7878        xyz_list = GetVerticesCoordinates(element.vertices)
    79         vx_input = GetInput(element, VxEnum)
    80         vy_input = GetInput(element, VyEnum)
    8179        H_input  = GetInput(element, ThicknessEnum)
    8280
    8381        #Prepare material object
    84         material = Matice()
     82        material = Matice(element)
    8583       
    8684        #Start integrating
    8785        gauss = GaussTria(2)
    88         for i in 1:gauss.numgauss
     86        for ig in 1:gauss.numgauss
    8987
    9088                Jdet = JacobianDeterminant(xyz_list, gauss)
    9189                NodalFunctionsDerivatives(element,dbasis,xyz_list,gauss)
    9290
    93                 H = GetInputValue(H_input, gauss, i)
     91                H  = GetInputValue(H_input, gauss, ig)
     92                mu = ViscositySSA(material, xyz_list, gauss, ig)
    9493
    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
    98102        end
    99103
     104        return Ke
     105end #}}}
     106function CreatePVector(analysis::StressbalanceAnalysis,element::Tria)# {{{
    100107
     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)
    101139        error("STOP")
    102140
    103         return Ke
     141        return Pe
    104142end #}}}
    105143function GetSolutionFromInputs(analysis::StressbalanceAnalysis,ug::Vector{Float64},element::Tria) #{{{
  • issm/trunk-jpl/src/jl/solve/elementmatrix.jl

    r26658 r26681  
    4343
    4444        #Initialize element matrix with zeros
    45         values = zeros(nrows,nrows)
     45        values = zeros(nrows)
    4646
    4747        #Get dof list
     
    5454        println(io,"ElementVector:")
    5555        println(io,"   nrows: ",this.nrows)
    56         println(io,"   gglobaldoflist: ",this.gglobaldoflist)
    5756        println(io,"   fglobaldoflist: ",this.fglobaldoflist)
    58         println(io,"   sglobaldoflist: ",this.sglobaldoflist)
    5957        print(io,"   values: ")
    6058        display(this.values)
  • issm/trunk-jpl/src/jl/solve/elements.jl

    r26675 r26681  
    8989
    9090end # }}}
     91function FindParam(element::Tria,enum::IssmEnum) # {{{
     92
     93        return FindParam(element.parameters, enum)
     94
     95end # }}}
    9196function InputServe!(element::Tria,input::ElementInput) # {{{
    9297
     
    145150        return Jinv
    146151end#}}}
     152function 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
     166end#}}}
    147167function NodalFunctionsDerivatives(element::Tria,dbasis::Matrix{Float64},xyz_list::Matrix{Float64}, gauss::GaussTria) #{{{
    148168
    149169        #Get nodal function derivatives in reference element
    150170        dbasis_ref = Matrix{Float64}(undef,3,2)
    151         NodalFunctionsDerivativesReference(dbasis_ref,gauss,P1Enum)
     171        NodalFunctionsDerivativesReferenceTria(dbasis_ref,gauss,P1Enum)
    152172
    153173        #Get invert of the Jacobian
     
    163183
    164184end#}}}
    165 function NodalFunctionsDerivativesReference(dbasis::Matrix{Float64}, gauss::GaussTria, finiteelement::IssmEnum) #{{{
     185function NodalFunctionsDerivativesReferenceTria(dbasis::Matrix{Float64}, gauss::GaussTria, finiteelement::IssmEnum) #{{{
    166186
    167187        if(finiteelement==P0Enum)
    168188                #Nodal function 1
    169                 dbasis[1,1]= 0.
    170                 dbasis[1,2]= 0.
     189                dbasis[1,1]= 0
     190                dbasis[1,2]= 0
    171191
    172192        elseif(finiteelement==P1Enum)
     
    184204        end
    185205end#}}}
     206function 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
     213end#}}}
  • issm/trunk-jpl/src/jl/solve/inputs.jl

    r26649 r26681  
    9797        input.values[indices] = values
    9898end#}}}
    99 function GetInputValue(input::ElementInput,gauss::GaussTria,i::Int64)
     99function 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
     110end#}}}
     111function GetInputValue(input::ElementInput,gauss::GaussTria,i::Int64) #{{{
    100112
    101113        if input.interp==P0Enum
    102                 return input.element_value
     114                return input.element_values
    103115        elseif input.interp==P1Enum
    104116                value = input.element_values[1]*gauss.coords1[i] +  input.element_values[2]*gauss.coords2[i] +  input.element_values[3]*gauss.coords3[i]
     
    110122
    111123end#}}}
     124function 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
     152end#}}}
  • issm/trunk-jpl/src/jl/solve/matice.jl

    r26675 r26681  
    11#Matice class definition
    2 mutable struct Matice#{{{
     2struct Matice#{{{
     3        vx_input::ElementInput
     4        vy_input::ElementInput
     5        B_input::ElementInput
     6        n_input::ElementInput
    37end# }}}
    48
     9function 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)
     17end#}}}
     18
    519#vertices functions
    6 function GetViscositySSA() #{{{
     20function ViscositySSA(matice::Matice, xyz_list::Matrix{Float64}, gauss::GaussTria, i::Int64) #{{{
    721
    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
    943        return mu
    1044end #}}}
  • issm/trunk-jpl/src/jl/solve/modules.jl

    r26659 r26681  
    7979        AddParam(parameters,md.materials.rho_water,MaterialsRhoSeawaterEnum)
    8080        AddParam(parameters,md.materials.rho_freshwater,MaterialsRhoFreshwaterEnum)
     81        AddParam(parameters,md.constants.g,ConstantsGEnum)
    8182end# }}}
    8283function CreateInputs(inputs::Inputs,elements::Vector{Tria},md::model) #{{{
Note: See TracChangeset for help on using the changeset viewer.