Exemple #1
0
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)