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