def rothe_time_int(problem='cylinderwake', nu=None, Re=None, Nts=256, t0=0.0, tE=0.2, Nll=[2], viniv=None, piniv=None, Nini=None, scheme=None, dtstrdct={}, method=2): trange = np.linspace(t0, tE, Nts+1) t = trange[0] dtstrdct.update(dict(t=0, N=Nll[0])) cdatstr = get_dtstr(**dtstrdct) dou.save_npa(viniv, cdatstr + '__vel') curvdict = {t: cdatstr + '__vel'} dou.save_npa(piniv, cdatstr + '__p') logger.info('v/p saved to ' + cdatstr + '__v/__p') curpdict = {t: cdatstr + '__p'} smaminex = True if method == 1 else False vcurvec = viniv logger.debug(' t={0}, |v|={1}'.format(t, npla.norm(vcurvec))) curmeshdict = get_curmeshdict(problem=problem, N=Nll[0], nu=nu, Re=Re, scheme=scheme, smaminex=smaminex) curmeshdict.update(coefalu=None) Vc = curmeshdict['V'] for tk, t in enumerate(trange[1:]): cts = t - trange[tk] if not Nll[tk+1] == Nll[tk]: curmeshdict = get_curmeshdict(problem=problem, N=Nll[tk+1], nu=nu, Re=Re, scheme=scheme, smaminex=smaminex) curmeshdict.update(coefalu=None) logger.info('changed the mesh from N={0} to N={1} at t={2}'. format(Nll[tk], Nll[tk+1], t)) # change in the mesh Nvc = curmeshdict['A'].shape[0] logger.debug("t={0}, dim V={1}".format(t, curmeshdict['V'].dim())) if smaminex: vpcur, coefalu = \ roth_upd_smmx(vvec=vcurvec, cts=cts, Vc=Vc, diribcsc=curmeshdict['diribcs'], nmd=curmeshdict, returnalu=True) else: # index 2 vpcur, coefalu = \ roth_upd_ind2(vvec=vcurvec, cts=cts, Vc=Vc, diribcsc=curmeshdict['diribcs'], nmd=curmeshdict, returnalu=True) dtstrdct.update(dict(t=t, N=Nll[tk+1])) cdatstr = get_dtstr(**dtstrdct) # add the boundary values to the velocity vcurvec = dts.append_bcs_vec(vpcur[:Nvc], **curmeshdict) logger.debug(' t={0}, |v|={1}'.format(t, npla.norm(vcurvec))) dou.save_npa(vcurvec, cdatstr+'__vel') curvdict.update({t: cdatstr+'__vel'}) dou.save_npa(vpcur[Nvc:, :], cdatstr+'__p') curpdict.update({t: cdatstr+'__p'}) curmeshdict.update(dict(coefalu=coefalu)) Vc = curmeshdict['V'] return curvdict, curpdict
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 check_the_sim(problem='cylinderwake', nswtchsl=[2], scheme='CR', nu=None, Re=None, Nts=None, paraout=False, t0=None, tE=None, plotit=False, dtstrdct={}, debug=False, Nref=3, method=2, refmethod=2): trange = np.linspace(t0, tE, Nts+1) refdtstrdct = dict(prefix=ddir+problem+scheme, method=refmethod, N=None, Nts=Nts, t0=t0, te=tE) refdatstr = get_dtstr(t=None, **refdtstrdct) compargs = dict(problem=problem, N=Nref, nu=nu, Re=Re, trange=trange, scheme=scheme, data_prefix=refdatstr, debug=debug) refvdict, refpdict = dou.load_or_comp(filestr=[refdatstr+'_refvdict', refdatstr+'_refpdict'], comprtn=gettheref, comprtnargs=compargs, debug=False, itsadict=True) viniv = dou.load_npa(refvdict['{0}'.format(t0)]) piniv = dou.load_npa(refpdict['{0}'.format(t0)]) # set up the list of the mesh parameters at every time step swl = Nts/len(nswtchsl) Nll = np.array([nswtchsl[0]]*(Nts+1)) for k, N in enumerate(nswtchsl[1:]): Nll[(k+1)*swl+1:] = N Nll[0] = Nref Nll = Nll.tolist() nswtchstr = 'Nswitches' + ''.join(str(e) for e in nswtchsl) dtstrdct['prefix'] = dtstrdct['prefix'] + nswtchstr dtstrdct.update(t=None) cdatstr = get_dtstr(**dtstrdct) compvpdargs = dict(problem=problem, scheme=scheme, Re=Re, nu=nu, t0=t0, tE=tE, Nts=Nts, viniv=viniv, piniv=piniv, Nini=Nref, Nll=Nll, dtstrdct=dtstrdct, method=method) logger.info('try to load `' + cdatstr + '_vdict`, `' + cdatstr + '_pdict`') vdict, pdict = dou.load_or_comp(filestr=[cdatstr+'_vdict', cdatstr+'_pdict'], comprtn=rtu.rothe_time_int, comprtnargs=compvpdargs, debug=debug, itsadict=True) # vdict, pdict = rtu.rothe_ind2(problem=problem, scheme=scheme, # Re=Re, nu=nu, # t0=t0, tE=tE, Nts=Nts, # viniv=viniv, piniv=piniv, Nini=Nref, # Nll=Nll, dtstrdct=dtstrdct) compvperrargs = dict(problem=problem, scheme=scheme, trange=trange.tolist(), rvd=refvdict, rpd=refpdict, Nref=Nref, cvd=vdict, cpd=pdict, Nll=Nll) errdict = dou.load_or_comp(filestr=[cdatstr+'_vperrdict'], comprtn=compvperr, debug=debug, comprtnargs=compvperrargs, itsadict=True) if plotit: rtu.plottimeerrs(trange=trange, perrl=[errdict['perrl']], verrl=[errdict['verrl']], showplot=True) return (errdict['verrl'], errdict['perrl'], errdict['verrint'], errdict['perrint'], trange.tolist())