def app_pverr(tcur):
        cdatstr = get_dtstr(t=tcur, **dtstrdct)
        vp = np.load(cdatstr + '.npy')
        v, p = expand_vp_dolfunc(PrP, vp=vp)

        # vpref = np.load(cdatstrref + '.npy')
        # vref, pref = expand_vp_dolfunc(PrP, vp=vpref)
        vref = np.load(vdref[tcur] + '.npy')
        pref = np.load(pdref[tcur] + '.npy')
        # vpref = np.vstack([vref, pref])
        vreff, preff = expand_vp_dolfunc(PrP, vc=vref, pc=pref)
        # vdiff, pdiff = expand_vp_dolfunc(PrP, vc=vp[:Nv]-vref,
        #                                  pc=vp[Nv:]-pref)
        # prtrial = snu.get_pfromv(v=vref, **snsedict)
        # vrtrial, prtrial = expand_vp_dolfunc(PrP, vc=vref, pc=prtrial)
        # print 'pref', dolfin.norm(preff)
        # print 'p', dolfin.norm(p)
        # print 'p(v)', dolfin.norm(ptrial)
        # print 'p(vref){0}\n'.format(dolfin.norm(prtrial))

        elv.append(dolfin.errornorm(v, vreff))
        elp.append(dolfin.errornorm(p, preff))
        # elv.append(dolfin.norm(vdiff))
        # elp.append(dolfin.norm(pdiff))
        cres = J*vp[:Nv]-fpbc
        mpires = (Mpfac.solve(cres.flatten())).reshape((cres.size, 1))
        ncres = np.sqrt(np.dot(cres.T, mpires))[0][0]
        # ncres = np.sqrt(np.dot(cres.T, MP*cres))[0][0]
        # routine from time_int_schemes seems buggy for CR or 'g not 0'
        # ncres = comp_cont_error(v, fpbc, PrP.Q)
        elc.append(ncres)
예제 #2
0
def abetterworld(N = 20, Nts = [16, 32, 64, 128]):

    tip = time_int_params()
    prp = problem_params(N)

    fv, fp, sol_v, sol_p = prp['fv'], prp['fp'], prp['sol_v'], prp['sol_p']

    # fixing some parameters
    # fv.om, v_sol.om, p_sol.om = 1, 1, 1
    # fv.nu, v_sol.nu, p_sol.nu = 1, 1, 1

###
## start with the Stokes problem for initialization
###

    stokesmats = dtn.get_stokessysmats(prp['V'], prp['Q'],
                                         tip['nu'])
    rhsd_vf = dtn.setget_rhs(prp['V'], prp['Q'], 
                            prp['fv'], prp['fp'], t=0)

    # remove the freedom in the pressure 
    stokesmats['J'] = stokesmats['J'][:-1,:][:,:]
    stokesmats['JT'] = stokesmats['JT'][:,:-1][:,:]
    rhsd_vf['fp'] = rhsd_vf['fp'][:-1,:]

    # reduce the matrices by resolving the BCs
    (stokesmatsc, 
            rhsd_stbc, 
            INVINDS, 
            bcinds, 
            bcvals) = dtn.condense_sysmatsbybcs(stokesmats,
                                                prp['bc0'])

    # casting some parameters 
    NV, NP = len(INVINDS), stokesmats['J'].shape[0]
    M, A, J = stokesmatsc['M'], stokesmatsc['A'], stokesmatsc['J'] 


###
## Compute the time-dependent flow
###

    inivalvec = np.zeros((NV+NP,1))

    for nts in Nts:
        DT = (1.0*tip['t0'] - tip['tE'])/nts

        biga = sps.vstack([
                    sps.hstack([M+DT*A, J.T]),
                    sps.hstack([J, sps.csr_matrix((NP, NP))])
                        ])

        vp_old = inivalvec

        ContiRes, VelEr, PEr = [], [], []

        for tcur in np.linspace(tip['t0']+DT,tip['tE'],nts):

            fvpn = dtn.setget_rhs(prp['V'], prp['Q'], fv, fp, t=tcur)

            cur_rhs = np.vstack([fvpn['fv'][INVINDS,:],
                                np.zeros((NP,1))])

            vp_old = krypy.linsys.minres(biga, cur_rhs,
                    x0=vp_old, maxiter=100)['xk'] 

            vc = vp_old[:NV,]
            pc = vp_old[NV:,]

            v, p = tis.expand_vp_dolfunc(tip, vp=None, vc=vc, pc=pc)

            v_sol.t, p_sol.t = tcur

            # the errors  
            ContiRes.append(tis.comp_cont_error(v,fp,tip['Q']))
            VelEr.append(errornorm(vCur,v))
            PEr.append(errornorm(pCur,p))

        tip['Residuals'].ContiRes.append(ContiRes)
        tip['Residuals'].VelEr.append(VelEr)
        tip['Residuals'].PEr.append(PEr)