def write(self, filename, idiotproof=True): if idiotproof and not filename.endswith('.ftd'): raise IOError('Filename must end with `.ftd`.') master = self.world.rank == 0 # Open writer on master and set parameters/dimensions if master: tar = Writer(filename) tar['DataType'] = {float: 'Float', complex: 'Complex'}[self.dtype] tar['Time'] = self.time tar['TimeStep'] = self.timestep #non-essential tar['Width'] = self.sigma tar.dimension('nw', self.nw) tar.dimension('nspins', self.nspins) # Create dimensions for varioius netCDF variables: ng = self.gd.get_size_of_global_array() tar.dimension('ngptsx', ng[0]) tar.dimension('ngptsy', ng[1]) tar.dimension('ngptsz', ng[2]) # Write frequencies tar.add('Frequency', ('nw', ), self.omega_w, dtype=float) # Write cumulative phase factors tar.add('PhaseFactor', ('nw', ), self.gamma_w, dtype=self.dtype) # Collect average densities on master and write if master: tar.add('Average', ( 'nspins', 'ngptsx', 'ngptsy', 'ngptsz', ), dtype=float) for s in range(self.nspins): big_Ant_G = self.gd.collect(self.Ant_sG[s]) if master: tar.fill(big_Ant_G) # Collect fourier transforms on master and write if master: tar.add('FourierTransform', ('nw', 'nspins', 'ngptsx', 'ngptsy', \ 'ngptsz', ), dtype=self.dtype) for w in range(self.nw): for s in range(self.nspins): big_Fnt_G = self.gd.collect(self.Fnt_wsG[w, s]) if master: tar.fill(big_Fnt_G) # Close to flush changes if master: tar.close() # Make sure slaves don't return before master is done self.world.barrier()
def write(self, filename): self.log('%s: Writing to %s' % (self.__class__.__name__, filename)) writer = Writer(filename, self.world, mode='w', tag=self.__class__.ulmtag) writer.write(version=self.__class__.version) writer.write(time=self.time) writer.write(foldedfreqs_f=[ff.todict() for ff in self.foldedfreqs_f]) wfs = self.wfs write_uMM(wfs, writer, 'rho0_uMM', self.rho0_uMM) wlist = range(self.Nw) write_wuMM(wfs, writer, 'FReDrho_wuMM', self.FReDrho_wuMM, wlist) write_wuMM(wfs, writer, 'FImDrho_wuMM', self.FImDrho_wuMM, wlist) writer.close()
def write(self, filename): self.log('%s: Writing to %s' % (self.__class__.__name__, filename)) writer = Writer(filename, self.world, mode='w', tag=self.__class__.ulmtag) writer.write(version=self.__class__.version) wfs = self.wfs writer.write(ha=Hartree) write_uMM(wfs, writer, 'S_uMM', self.S_uMM) wfs.write_wave_functions(writer) wfs.write_eigenvalues(writer) wfs.write_occupations(writer) # write_unM(wfs, writer, 'C0_unM', self.C0_unM) # write_un(wfs, writer, 'eig_un', self.eig_un) # write_un(wfs, writer, 'occ_un', self.occ_un) for arg in self.readwrite_attrs: writer.write(arg, getattr(self, arg)) writer.close()
def write(self, filename, mode='', idiotproof=True): """ Parameters ---------- mode: string or list of strings """ if idiotproof and not filename.endswith('.ind'): raise IOError('Filename must end with `.ind`.') writes = self._parse_readwritemode(mode) if 'field' in writes and self.fieldgd is None: raise IOError('field variables cannot be written ' + 'before they are calculated') from gpaw.io import Writer writer = Writer(filename, self.world, tag='INDUCEDFIELD') # Actual write self._write(writer, writes) # Make sure slaves don't return before master is done writer.close() self.world.barrier()
def _update(self, paw): # Write metadata to main writer self.writer.write(niter=paw.niter, time=paw.time, action=paw.action) if paw.action == 'kick': self.writer.write(kick_strength=paw.kick_strength) if self.split: # Use separate writer for actual data filename = self.split_filename_fmt % self.index writer = Writer(filename, paw.world, mode='w', tag=self.__class__.ulmtag_split) else: # Use the same writer for actual data writer = self.writer w = writer.child('wave_functions') paw.wfs.write_wave_functions(w) paw.wfs.write_occupations(w) if self.split: writer.close() # Sync the main writer self.writer.sync() self.index += 1
def write(self, filename, mode=''): self.log('Writing to {0} (mode={1!r})\n'.format(filename, mode)) writer = Writer(filename, self.world) self._write(writer, mode) writer.close() self.world.barrier()
class WaveFunctionWriter(TDDFTObserver): version = 3 ulmtag = 'WFW' ulmtag_split = ulmtag + 'split' def __init__(self, paw, filename, split=False, interval=1): TDDFTObserver.__init__(self, paw, interval) self.split = split if paw.niter == 0: self.writer = Writer(filename, paw.world, mode='w', tag=self.__class__.ulmtag) self.writer.write(version=self.__class__.version) self.writer.write(split=self.split) self.writer.sync() self.index = 1 else: # Check the earlier file reader = WaveFunctionReader(filename) assert reader.version == self.__class__.version self.split = reader.split # Use the earlier split value self.index = len(reader) reader.close() # Append to earlier file self.writer = Writer(filename, paw.world, mode='a', tag=self.__class__.ulmtag) if self.split: name, ext = tuple(filename.rsplit('.', 1)) self.split_filename_fmt = name + '-%06d.' + ext def _update(self, paw): # Write metadata to main writer self.writer.write(niter=paw.niter, time=paw.time, action=paw.action) if paw.action == 'kick': self.writer.write(kick_strength=paw.kick_strength) if self.split: # Use separate writer for actual data filename = self.split_filename_fmt % self.index writer = Writer(filename, paw.world, mode='w', tag=self.__class__.ulmtag_split) else: # Use the same writer for actual data writer = self.writer w = writer.child('wave_functions') paw.wfs.write_wave_functions(w) paw.wfs.write_occupations(w) if self.split: writer.close() # Sync the main writer self.writer.sync() self.index += 1 def __del__(self): self.writer.close() TDDFTObserver.__del__(self)