Ignore:
Timestamp:
12/03/21 11:18:50 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: added subelement GL calculation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/jl/solve/elements.jl

    r26681 r26705  
    8989
    9090end # }}}
     91function GetInputListOnVertices!(element::Tria, vector::Vector{Float64}, enum::IssmEnum) # {{{
     92
     93        #Get Input first
     94        input = GetInput(element, enum)
     95
     96        #Get value at each vertex (i.e. P1 Nodes)
     97        gauss=GaussTria(P1Enum)
     98        for i in 1:gauss.numgauss
     99                vector[i] = GetInputValue(input, gauss, i)
     100        end
     101
     102end # }}}
    91103function FindParam(element::Tria,enum::IssmEnum) # {{{
    92104
     
    107119
    108120end # }}}
     121function GetGroundedPortion(element::Tria, xyz_list::Matrix{Float64}) #{{{
     122
     123        level = Vector{Float64}(undef,3)
     124        GetInputListOnVertices!(element, level, MaskOceanLevelsetEnum)
     125
     126        #Be sure that values are not zero
     127        epsilon = 1.e-15
     128        for i in 1:3
     129                if(level[i]==0.) level[i]=level[i]+epsilon end
     130        end
     131
     132        if level[1]>0 && level[2]>0 && level[3]>0
     133      #Completely grounded
     134                phi = 1.0
     135   elseif level[1]<0 && level[2]<0 && level[3]<0
     136      #Completely floating
     137      phi = 0.0
     138   else
     139                #Partially floating,
     140                if(level[1]*level[2]>0) #Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
     141                        s1=level[3]/(level[3]-level[2]);
     142                        s2=level[3]/(level[3]-level[1]);
     143                elseif(level[2]*level[3]>0) #Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
     144                        s1=level[1]/(level[1]-level[2]);
     145                        s2=level[1]/(level[1]-level[3]);
     146                elseif(level[1]*level[3]>0) #Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
     147                        s1=level[2]/(level[2]-level[1]);
     148                        s2=level[2]/(level[2]-level[3]);
     149                else
     150                        error("not supposed to be here...")
     151                end
     152
     153                if(level[1]*level[2]*level[3]>0)
     154                        phi = s1*s2
     155                else
     156                        phi = (1-s1*s2)
     157                end
     158        end
     159
     160        return phi
     161end#}}}
    109162
    110163#Finite Element stuff
Note: See TracChangeset for help on using the changeset viewer.