def save_tstep_solution_h5(tstep, q_, u_, newfolder, tstepfiles, constrained_domain, output_timeseries_as_vector, u_components, scalar_components, NS_parameters): """Store solution on current timestep to XDMF file.""" timefolder = path.join(newfolder, 'Timeseries') if output_timeseries_as_vector: # project or store velocity to vector function space for comp, tstepfile in tstepfiles.iteritems(): if comp == "u": if not hasattr(tstepfile, 'uv'): # First time around only V = q_['u0'].function_space() Vv = VectorFunctionSpace(V.mesh(), V.ufl_element().family(), V.ufl_element().degree(), constrained_domain=constrained_domain) tstepfile.uv = Function(Vv) tstepfile.d = dict((ui, Vv.sub(i).dofmap().collapse(Vv.mesh())[1]) for i, ui in enumerate(u_components)) # The short but timeconsuming way: #tstepfile.uv.assign(project(u_, Vv)) # Or the faster, but more comprehensive way: for ui in u_components: q_[ui].update() vals = tstepfile.d[ui].values() keys = tstepfile.d[ui].keys() tstepfile.uv.vector()[vals] = q_[ui].vector()[keys] tstepfile << (tstepfile.uv, float(tstep)) elif comp in q_: tstepfile << (q_[comp], float(tstep)) else: tstepfile << (tstepfile.function, float(tstep)) else: for comp, tstepfile in tstepfiles.iteritems(): tstepfile << (q_[comp], float(tstep)) if MPI.rank(mpi_comm_world()) == 0: if not path.exists(path.join(timefolder, "params.dat")): f = open(path.join(timefolder, 'params.dat'), 'w') cPickle.dump(NS_parameters, f)