示例#1
0
        def __init__(self, deg, basis_type):
            deg = int(deg)
            if basis_type == 'L':  #1D Lagrange basis of degree deg
                z = Symbol('z')
                Xi = np.linspace(-1, 1, deg + 1)

                def lag_basis(k):
                    n = 1.
                    for i in range(len(Xi)):
                        if k != i:
                            n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                    return n

                N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
                dfN = diff(N, z) + 1.e-25 * N
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch
            elif basis_type == 'M':  #1D Legendre Polynomials (Fischer calls this spectral)
                z = Symbol('z')
                x = Symbol('x')

                def gen_legendre_basis(n):
                    if n == -2:
                        return (1 - 1 * z) / 2
                    elif n == -1:
                        return (1 + 1 * z) / 2
                    else:
                        return ((2 * (n + 3) - 3) / 2.)**0.5 * integrate(
                            legendre((n + 1), x), (x, -1, z))

                N = Array([gen_legendre_basis(i - 2) for i in range(deg + 1)])
                N2 = N.tolist()
                N2[-1] = N[1]
                N2[1] = N[-1]
                N = Array(N2)
                dfN = diff(N, z) + 1.e-25 * N
                #            print(N)
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch
            elif basis_type == 'G':  #1D GFEM Functions (degree denotes the total approximation space)
                z = Symbol('z')
                Xi = np.linspace(-1, 1, deg + 1)

                def lag_basis(k):
                    n = 1.
                    for i in range(len(Xi)):
                        if k != i:
                            n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                    return n

                N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
                dfN = diff(N, z) + 1.e-25 * N
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch  #Enrichment order corresponding to GFEM shape functions
            else:
                raise Exception('Element type not implemented yet')
示例#2
0
    def __init__(self,deg,basis_type):
        deg = int(deg)
        from sympy import Symbol,diff,Array,lambdify,legendre,integrate,simplify,permutedims
        if basis_type == 'L':                                                  #1D Lagrange basis of degree deg
            z=Symbol('z')
            Xi=np.linspace(-1,1,deg+1)
            def lag_basis(k):
                n = 1.
                for i in range(len(Xi)):
                    if k != i:
                        n *= (z-Xi[i])/(Xi[k]-Xi[i])
                return n
            N = Array([simplify(lag_basis(m)) for m in range(deg+1)])            
            dfN = diff(N,z)+1.e-25*N
            self.Ns=lambdify(z,N,'numpy')
            self.dN=lambdify(z,dfN,'numpy')
#            if deg==2.:     # denotes the number of nodes 
#                N=1/2*Array([1-z,1+z])
#                dfN=diff(N,z)
#                self.Ns=lambdify(z,N,'numpy')
#                self.dN=lambdify(z,dfN,'numpy')
#            elif deg==3.:
#                N=1/2*Array([z*(z-1),2*(1+z)*(1-z),z*(1+z)])
#                dfN=diff(N,z)
#                self.Ns=lambdify(z,N,'numpy')
#                self.dN=lambdify(z,dfN,'numpy')
#            elif deg==4.:                                                     #not implemented yet. the no. of nodes change. define a general geom.nNnodes (?)
#                N=1/2*Array([z*(z-1),2*(1+z)*(1-z),z*(1+z)])
#                dfN=diff(N,z)
#                self.Ns=lambdify(z,N,'numpy')
#                self.dN=lambdify(z,dfN,'numpy')
#            else:
#                raise Exception('Element type not implemented yet')
        elif basis_type == 'M':                                                #1D Legendre Polynomials (Fischer calls this spectral)
            z = Symbol('z')
            x=Symbol('x')
            def gen_legendre_basis(n):
                if n==-2:
                    return  (1-1*z)/2
                elif n==-1:
                    return (1+1*z)/2
                else:
                    return ((2*(n+3)-3)/2.)**0.5*integrate(legendre((n+1),x),(x,-1,z))
            N=Array([gen_legendre_basis(i-2) for i in range(deg+1)])
#            print(N)
            N2 = N.tolist()
            N2[-1] = N[1]
            N2[1] = N[-1]
            #N[-1] = N[-1] - N[1]
            N=Array(N2)
            dfN=diff(N,z)+1.e-25*N
#            print(N)
            self.Ns=lambdify(z,N,'numpy')
            self.dN=lambdify(z,dfN,'numpy')
        else:
            raise Exception('Element type not implemented yet')
示例#3
0
    def __init__(self, deg, basis_type):
        deg = int(deg)
        from sympy import Symbol, diff, Array, lambdify, legendre, integrate, simplify
        if basis_type == 'L':  #1D Lagrange basis of degree deg
            z = Symbol('z')
            Xi = np.linspace(-1, 1, deg + 1)

            def lag_basis(k):
                n = 1.
                for i in range(len(Xi)):
                    if k != i:
                        n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                return n

            N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
            dfN = diff(N, z) + 1.e-25 * N
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')
        elif basis_type == 'M':  #1D Legendre Polynomials (Fischer calls this spectral)
            z = Symbol('z')
            x = Symbol('x')

            def gen_legendre_basis(n):
                if n == -2:
                    return (1 - 1 * z) / 2
                elif n == -1:
                    return (1 + 1 * z) / 2
                else:
                    return ((2 * (n + 3) - 3) / 2.)**0.5 * integrate(
                        legendre((n + 1), x), (x, -1, z))

            N = Array([gen_legendre_basis(i - 2) for i in range(deg + 1)])
            N2 = N.tolist()
            N2[-1] = N[1]
            N2[1] = N[-1]
            N = Array(N2)
            dfN = diff(N, z) + 1.e-25 * N
            #            print(N)
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')


#        elif basis_type == 'GFEM1D1':                                         #1D GFEM Linear Enrichment Functions
        else:
            raise Exception('Element type not implemented yet')
示例#4
0
    def __init__(self, deg, basis_type):
        #        print(basis_type)
        deg = int(deg)
        if basis_type == 'L':  # 1D Lagrange basis of degree deg
            z = Symbol('z')
            Xi = np.linspace(-1, 1, deg + 1)

            def lag_basis(k):
                n = 1.
                for i in range(len(Xi)):
                    if k != i:
                        n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                return n

            N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
            dfN = diff(N, z) + 1.e-25 * N
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')
            self.enrich = 1
        elif basis_type == 'M':  # 1D Legendre Polynomials
            z = Symbol('z')
            x = Symbol('x')

            def gen_legendre_basis(n):
                if n == -2:
                    return (1 - 1 * z) / 2
                elif n == -1:
                    return (1 + 1 * z) / 2
                else:
                    return ((2 * (n + 3) - 3) / 2.)**0.5 * integrate(
                        legendre((n + 1), x), (x, -1, z))

            N = Array([gen_legendre_basis(i - 2) for i in range(deg + 1)])
            N2 = N.tolist()
            N2[-1] = N[1]
            N2[1] = N[-1]
            N = Array(N2)
            dfN = diff(N, z) + 1.e-25 * N
            #            print(N)
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')
            self.enrich = 1
        elif basis_type == 'G':  #1D GFEM Functions (degree denotes the total approximation space)
            z = Symbol('z', real=True)
            Xi = np.linspace(-1, 1, deg + 1)

            def lag_basis(k):
                n = 1.
                for i in range(len(Xi)):
                    if k != i:
                        n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                return n

            N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
            dfN = diff(N, z) + 1.e-25 * N
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')
            self.enrich = enrch  #Enrichment order corresponding to GFEM shape functions
            xalph = Symbol('xalph', real=True)
            halph = Symbol('halph', real=True)
            N1 = Array([((z - xalph) / halph)**n + 1.e-26 * (z - xalph) / halph
                        for n in range(self.enrich + 1)
                        ])  #shape consistency take E_o = 1
            Nf1 = lambdify((z, xalph, halph), N1, 'numpy')
            dfN1 = lambdify((z, xalph, halph),
                            diff(N1, z) + 1.e-26 * N1, 'numpy')
            self.Np = Nf1
            self.dNp = dfN1
        elif basis_type == 'IF':
            #            print('here')
            z = Symbol('z', real=True)
            Xi = np.linspace(-1, 1, deg + 1)

            def lag_basis(k):
                n = 1.
                for i in range(len(Xi)):
                    if k != i:
                        n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                return n

            N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
            dfN = diff(N, z) + 1.e-25 * N
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')
            self.enrich = enrch  # Enrichment order corresponding to GFEM shape functions
            xalph = Symbol('xalph', real=True)
            halph = Symbol('halph', real=True)
            xgam = Symbol('xgam', real=True)

            Nf2 = simplify(
                Array([(abs(z - xgam))**m * ((z - xalph) / halph)**n + 1.e-26 *
                       (z - xalph) / halph for m in range(2)
                       for n in range(enrch + 1)
                       ]))  # Enrichment by non-polynomials (for interfaces)
            dfN2 = simplify(Nf2.diff(z) + 1.e-26 * Nf2)
            self.NIF = lambdify(
                (z, xgam, xalph, halph), Nf2, 'numpy'
            )  # Final enrichment functions including both polynomial and level set
            self.DNIF = lambdify((z, xgam, xalph, halph), dfN2, 'numpy')

        elif basis_type == 'IFM':
            #            print('here')
            z = Symbol('z', real=True)
            Xi = np.linspace(-1, 1, deg + 1)

            def lag_basis(k):
                n = 1.
                for i in range(len(Xi)):
                    if k != i:
                        n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                return n

            N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
            dfN = diff(N, z) + 1.e-25 * N
            self.Ns = lambdify(z, N, 'numpy')
            self.dN = lambdify(z, dfN, 'numpy')
            self.enrich = enrch  # Enrichment order corresponding to GFEM shape functions
            xalph = Symbol('xalph', real=True)
            halph = Symbol('halph', real=True)
            xgam = Symbol('xgam', real=True)

            Nf2 = simplify(
                Array([(abs(z - xalph))**m * ((z - xalph) / halph)**n +
                       1.e-26 * (z - xalph) / halph for m in range(2)
                       for n in range(enrch + 1)
                       ]))  # Enrichment by non-polynomials (for interfaces)
            dfN2 = simplify(Nf2.diff(z) + 1.e-26 * Nf2)

            Nf3 = simplify(
                Array([((z - xalph) / halph)**n + 1.e-26 * (z - xalph) / halph
                       for n in range(enrch + 1)
                       ]))  # Enrichment by non-polynomials (for interfaces)
            dfN3 = simplify(Nf3.diff(z) + 1.e-26 * Nf3)

            self.NIF = lambdify(
                (z, xgam, xalph, halph), Nf3, 'numpy'
            )  # Final enrichment functions including both polynomial and level set
            self.DNIF = lambdify((z, xgam, xalph, halph), dfN3, 'numpy')

        else:
            raise Exception('Element type not implemented yet')
示例#5
0
        def __init__(self, deg, basis_type):
            deg = int(deg)
            if basis_type == 'L':  #1D Lagrange basis of degree deg
                z = Symbol('z', real=True)
                Xi = np.linspace(-1, 1, deg + 1)

                def lag_basis(k):
                    n = 1.
                    for i in range(len(Xi)):
                        if k != i:
                            n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                    return n

                N = Array([lag_basis(m) for m in range(deg + 1)])
                dfN = diff(N, z) + 1.e-25 * N
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch
                ue = z**0.65 + sin(3 * pi * z / 2)
                uep = ue.diff(z)
                uepp = uep.diff(z)
                self.Tf = lambdify(z, -uepp, 'numpy')
                self.dE = float(integrate(0.5 * uep**2, (z, 0, 1)).evalf(20))
            elif basis_type == 'M':  #1D Legendre Polynomials (Fischer calls this spectral)
                z = Symbol('z', real=True)
                x = Symbol('x')

                def gen_legendre_basis(n):
                    if n == -2:
                        return (1 - 1 * z) / 2
                    elif n == -1:
                        return (1 + 1 * z) / 2
                    else:
                        return ((2 * (n + 3) - 3) / 2.)**0.5 * integrate(
                            legendre((n + 1), x), (x, -1, z))

                N = Array([gen_legendre_basis(i - 2) for i in range(deg + 1)])
                N2 = N.tolist()
                N2[-1] = N[1]
                N2[1] = N[-1]
                N = Array(N2)
                dfN = diff(N, z) + 1.e-25 * N
                #            print(N)
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch
                ue = z**0.65 + sin(3 * pi * z / 2)
                uep = ue.diff(z)
                uepp = uep.diff(z)
                self.Tf = lambdify(z, -uepp, 'numpy')
                self.dE = float(integrate(0.5 * uep**2, (z, 0, 1)).evalf(20))
            elif basis_type == 'G':  #1D GFEM Functions (degree denotes the total approximation space)
                z = Symbol('z', real=True)
                Xi = np.linspace(-1, 1, deg + 1)

                def lag_basis(k):
                    n = 1.
                    for i in range(len(Xi)):
                        if k != i:
                            n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                    return n

                N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
                dfN = diff(N, z) + 1.e-25 * N
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch  #Enrichment order corresponding to GFEM shape functions
                ue = z**0.65 + sin(3 * pi * z / 2)
                uep = ue.diff(z)
                uepp = uep.diff(z)
                self.Tf = lambdify(z, -uepp, 'numpy')
                self.dE = float(integrate(0.5 * uep**2, (z, 0, 1)).evalf(20))
            elif basis_type == 'Singl' or basis_type == 'SGFEMSingl' or basis_type == 'GeomSingl' or basis_type == 'GeomSGFEM':
                z = Symbol('z', real=True)
                xalph = Symbol('xalph', real=True)
                halph = Symbol('halph', real=True)
                Xi = np.linspace(-1, 1, deg + 1)

                def lag_basis(k):
                    n = 1.
                    for i in range(len(Xi)):
                        if k != i:
                            n *= (z - Xi[i]) / (Xi[k] - Xi[i])
                    return n

                N = Array([simplify(lag_basis(m)) for m in range(deg + 1)])
                dfN = diff(N, z) + 1.e-27 * N

                #                Manufactured solution

                ue = z**0.65 + sin(3 * pi * z / 2)
                uep = ue.diff(z)
                uepp = uep.diff(z)
                Nf2 = Array([
                    (ue)**m * ((z - xalph) / halph)**n + 1.e-27 *
                    (z - xalph) / halph for m in range(2)
                    for n in range(enrch + 1)
                ])  # Enrichment by non-polynomials (for interfaces)
                dfN2 = Nf2.diff(z) + 1.e-26 * Nf2

                #                Convert to numpy functions to do array operations (vectorized)
                self.Ns = lambdify(z, N, 'numpy')
                self.dN = lambdify(z, dfN, 'numpy')
                self.enrich = enrch
                self.Tf = lambdify(z, -uepp, 'numpy')
                self.dE = float(integrate(0.5 * uep**2, (z, 0, 1)).evalf(20))
                self.uexact = lambdify(z, ue, 'numpy')
                self.NIF = lambdify(
                    (z, xalph, halph), Nf2, 'numpy'
                )  # Final enrichment functions including both polynomial and exact soln
                self.DNIF = lambdify((z, xalph, halph), dfN2, 'numpy')
                self.enrich = enrch
            else:
                raise Exception('Element type not implemented yet')