def pde_fem_hDt(u0, T, a, Nref, kappa, neref, L, epsilon, fhandle): """ A3.12 Page 123 """ ne = neref // L h = a / ne nvtx = ne + 1 dtref = T / Nref Dt = kappa * dtref t = np.linspace(0, T, Nref // kappa) p = epsilon q = 1 f = 1 uh, A, b, K, M = ch2.oned_linear_FEM(ne, p, q, f) EE = M + Dt * K ZM = 0 # set initial condition ut = np.zeros((nvtx, Nref // kappa + 1)) ut[:, 1] = u0 u = np.copy(u0) EEinv = sparse.linalg.factorized(EE) for n in range(Nref // kappa): # time loop fu = fhandle(u) b = oned_linear_FEM_b(ne, h, fu) u_new = EEinv(M.dot(u[1:-1]) + Dt * b) u = np.hstack([ZM, u_new, ZM]) ut[:, n + 1] = u return t, ut
def spde_fem_MhDt(u0,T,a,Nref,kappa,neref,L, epsilon,fhandle,ghandle,r,M,s0): """ Alg 10.12 Page 473 """ ne=neref // L; assert(ne%1 == 0) h=(a / ne); nvtx=ne + 1 dtref=T / Nref; Dt=kappa * dtref t=np.linspace(0,T,Nref//kappa+1) p=epsilon * np.ones(ne); q=np.ones(ne); f=np.ones(ne) uh,A,b,KK,MM=ch2.oned_linear_FEM(ne,p,q,f) EE=MM + Dt * KK # ZM=np.zeros((M,1)) # bj=get_onedD_bj(dtref,neref,a,r); bj[ne:-1]=0 iFspace=0 # u=np.matlib.repmat(u0,M,1) ut=np.zeros((nvtx,Nref // kappa + 1)); ut[:,0]=u[0,:] b=np.zeros(ne-1); gdw=np.copy(b) EEinv=sparse.linalg.factorized(EE) for k in range(Nref // kappa): dWJ=get_onedD_dW(bj,kappa,iFspace,M,s0) dWL=(np.hstack([ZM,dWJ,ZM])); dWL=dWL[:,::L] gdW=ghandle(u)*dWL fu=fhandle(u) for m in range(M): b=ch3.oned_linear_FEM_b(ne,h,fu[m,:]) gdw=ch3.oned_linear_FEM_b(ne,h,gdW[m,:]) u1=EEinv(MM.dot(u[m,1:-1]) + Dt * b+gdw) u[m,:]=np.hstack([0,u1,0]) ut[:,k + 1]=u[-1,:] return t,u,ut
def pde_fem(u0, T, a, N, ne, epsilon, fhandle): """ A3.11 Page 122 """ h = a / ne nvtx = ne + 1 Dt = T / N t = np.linspace(0, T, N + 1) p = epsilon q = 1 f = 1 uh, A, b, KK, MM = ch2.oned_linear_FEM(ne, p, q, f) EE = (MM + Dt * KK) ZM = 0 # set initial condition ut = np.zeros((nvtx, N + 1)) ut[:, 0] = u0 u = np.copy(u0) EEinv = sparse.linalg.factorized(EE) for n in range(N): # time loop fu = fhandle(u) b = oned_linear_FEM_b(ne, h, fu) u_new = EEinv(MM.dot(u[1:-1]) + Dt * b) u = np.hstack([ZM, u_new, ZM]) ut[:, n + 1] = u return t, ut