예제 #1
0
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
예제 #2
0
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
예제 #3
0
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