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')
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')
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')
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')
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')