Ejemplo n.º 1
0
 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
Ejemplo n.º 3
0
 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: