Changeset 26675


Ignore:
Timestamp:
11/29/21 07:03:55 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: done with nodal function derivatives

Location:
issm/trunk-jpl/src/jl/solve
Files:
1 added
4 edited

Legend:

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

    r26659 r26675  
    8181        H_input  = GetInput(element, ThicknessEnum)
    8282
     83        #Prepare material object
     84        material = Matice()
     85       
    8386        #Start integrating
    8487        gauss = GaussTria(2)
     
    8689
    8790                Jdet = JacobianDeterminant(xyz_list, gauss)
     91                NodalFunctionsDerivatives(element,dbasis,xyz_list,gauss)
    8892
    89                 println(Jdet)
     93                H = GetInputValue(H_input, gauss, i)
    9094
    9195                error("STOP")
  • issm/trunk-jpl/src/jl/solve/elements.jl

    r26659 r26675  
    129129
    130130        J[1,1] = .5*(x2-x1)
    131         J[1,2] = sqrt(3)/6*(2*x3 -x1 -x2)
    132         J[2,1] = .5*(y2-y1)
     131        J[1,2] = .5*(y2-y1)
     132        J[2,1] = sqrt(3)/6*(2*x3 -x1 -x2)
    133133        J[2,2] = sqrt(3)/6*(2*y3 -y1 -y2)
    134134
    135135        return J
    136136end#}}}
     137function JacobianInvert(xyz_list::Matrix{Float64}, gauss::GaussTria) #{{{
     138
     139        #Get Jacobian matrix
     140        J = Jacobian(xyz_list)
     141
     142        #Get its determinant
     143        Jinv = Matrix2x2Invert(J)
     144
     145        return Jinv
     146end#}}}
     147function NodalFunctionsDerivatives(element::Tria,dbasis::Matrix{Float64},xyz_list::Matrix{Float64}, gauss::GaussTria) #{{{
     148
     149        #Get nodal function derivatives in reference element
     150        dbasis_ref = Matrix{Float64}(undef,3,2)
     151        NodalFunctionsDerivativesReference(dbasis_ref,gauss,P1Enum)
     152
     153        #Get invert of the Jacobian
     154        Jinv = JacobianInvert(xyz_list,gauss)
     155
     156        #Build dbasis:
     157        #[ dNi/dx ] = Jinv * [dNhat_i/dr]
     158        #[ dNi/dy ] =        [dNhat_i/ds]
     159        for i in 1:3
     160                dbasis[i,1] = Jinv[1,1]*dbasis_ref[i,1]+Jinv[1,2]*dbasis_ref[i,2]
     161                dbasis[i,2] = Jinv[2,1]*dbasis_ref[i,1]+Jinv[2,2]*dbasis_ref[i,2]
     162        end
     163
     164end#}}}
     165function NodalFunctionsDerivativesReference(dbasis::Matrix{Float64}, gauss::GaussTria, finiteelement::IssmEnum) #{{{
     166
     167        if(finiteelement==P0Enum)
     168                #Nodal function 1
     169                dbasis[1,1]= 0.
     170                dbasis[1,2]= 0.
     171
     172        elseif(finiteelement==P1Enum)
     173                #Nodal function 1
     174                dbasis[1,1]= -.5
     175                dbasis[1,2]= -sqrt(3)/6
     176                #Nodal function 2
     177                dbasis[2,1]= .5
     178                dbasis[2,2]= -sqrt(3)/6
     179                #Nodal function 3
     180                dbasis[3,1]= 0
     181                dbasis[3,2]= sqrt(3)/3
     182        else
     183                error("Element type ",finiteelement," not supported yet")
     184        end
     185end#}}}
  • issm/trunk-jpl/src/jl/solve/solve.jl

    r26659 r26675  
    88include("./elements.jl")
    99include("./constraints.jl")
     10include("./matice.jl")
    1011include("./femmodel.jl")
    1112include("./analyses/analysis.jl")
  • issm/trunk-jpl/src/jl/solve/utils.jl

    r26659 r26675  
    44
    55end#}}}
     6function Matrix2x2Invert(A::Matrix{Float64}) #{{{
     7
     8        #Initialize output
     9        Ainv = Matrix{Float64}(undef,2,2)
     10
     11        #Compute determinant
     12        det = Matrix2x2Determinant(A)
     13        if(abs(det)<eps(Float64)) error("Determinant smaller than machine epsilon") end
     14
     15        #Multiplication is faster than divsion, so we multiply by the reciprocal
     16        det_reciprocal = 1/det
     17
     18        #compute invert matrix
     19        Ainv[1,1]=   A[2,2]*det_reciprocal # =  d/det
     20   Ainv[1,2]= - A[1,2]*det_reciprocal # = -b/det
     21   Ainv[2,1]= - A[2,1]*det_reciprocal # = -c/det
     22   Ainv[2,2]=   A[1,1]*det_reciprocal # =  a/det
     23
     24        return  Ainv
     25
     26end#}}}
Note: See TracChangeset for help on using the changeset viewer.