def _append_bcs_ornot(vvec): if output_includes_bcs: # make the switch here for better readibility vwbcs = dts.append_bcs_vec(vvec, vdim=V.dim(), invinds=invinds, diribcs=diribcs) return vwbcs else: return vvec
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 _append_bcs_ornot(vvec): if output_includes_bcs: # make the switch here for better readibility vwbcs = dts.append_bcs_vec(vvec, vdim=V.dim(), invinds=invinds, diribcs=diribcs) return vwbcs else: return vvec
logger.addHandler(fh) problemname = 'cylinderwake' N = 2 Nref = 3 Re = 10 femp, stokesmatsc, rhsd = dnsps.get_sysmats(problem=problemname, N=N, Re=Re, mergerhs=True) soldict = stokesmatsc # containing A, J, JT soldict.update(femp) # adding V, Q, invinds, diribcs soldict.update(rhsd) # adding the discrete rhs v_ss_nse, list_norm_nwtnupd = snu.solve_steadystate_nse(N=N, **soldict) vwbc = dts.append_bcs_vec(v_ss_nse, **femp) vwbcf, _ = dts.expand_vp_dolfunc(vc=vwbc, V=femp['V']) fempref, stokesmatsc, rhsd = dnsps.get_sysmats(problem=problemname, N=Nref, Re=Re, mergerhs=True) Vref = fempref['V'] class ExtFunZero(dolfin.Expression): def __init__(self, vfun=None): self.vfun = vfun def eval(self, value, x): try: self.vfun.eval(value, x) except RuntimeError: