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