Exemplo n.º 1
0
    def _write(self, writer, writes):
        # Swap classical and quantum cells, and shift atom positions for
        # the time of writing
        qmcell = self.atoms.get_cell()
        self.atoms.set_cell(self.fdtd.cl.cell * Bohr)  # Set classical cell
        self.atoms.positions = (self.atoms.get_positions() +
                                self.fdtd.qm.corner1 * Bohr)
        BaseInducedField._write(self, writer, writes)
        self.atoms.set_cell(qmcell)  # Restore quantum cell to the atoms object
        self.atoms.positions = (self.atoms.get_positions() -
                                self.fdtd.qm.corner1 * Bohr)

        # Write time propagation status
        writer.write(time=self.time)

        # Mask, interpolation approach:
        # self.eps0_G = self.fdtd.classical_material.permittivityValue(
        # omega=0.0) - self.fdtd.classical_material.epsInfty
        # self.eps0_G= -interpolator.apply(self.eps0_G)

        # Mask, direct approach:
        self.eps0_G = self.fdtd.cl.gd.zeros()
        for component in self.fdtd.classical_material.components:
            self.eps0_G += 1.0 * component.get_mask(gd=self.fdtd.cl.gd)


#        def writearray(name, shape, dtype):
#            if name.split('_')[0] in writes:
#                writer.add_array(name, shape, dtype)
#            a_wxg = getattr(self, name)
#            for w in range(self.nw):
#                if self.fdtd.cl.gd == self.gd:
#                    writer.fill(self.gd.collect(a_wxg[w]))
#                else:
#                    writer.fill(self.gd.collect(Transformer(self.fdtd.cl.gd,
# self.gd, self.stencil, self.dtype).apply(a_wxg[w])))

        def writearray(name):
            if name.split('_')[0] in writes:
                a_xg = getattr(self, name)
                if self.fdtd.cl.gd != self.gd:
                    a_xg = Transformer(self.fdtd.cl.gd, self.gd, self.stencil,
                                       a_xg.dtype).apply(a_xg)
                writer.write(**{name: self.gd.collect(a_xg)})

        # Write time propagation arrays
        writearray('n0_G')
        writearray('Fn_wG')
        writearray('eps0_G')

        if hasattr(self.fdtd, 'qm') and hasattr(self.fdtd.qm, 'corner1'):
            writer.write(corner1_v=self.fdtd.qm.corner1)
            writer.write(corner2_v=self.fdtd.qm.corner2)

        self.fdtd.cl.gd.comm.barrier()
Exemplo n.º 2
0
    def _write(self, writer, writes):
        BaseInducedField._write(self, writer, writes)

        # Collect np_a to master
        if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:

            # Create empty dict on domain master
            if self.domain_comm.rank == 0:
                np_a = {}
                for a in range(self.na):
                    np_a[a] = np.empty(1, dtype=int)
            else:
                np_a = {}
            # Collect dict to master
            sendreceive_dict(self.domain_comm, np_a, 0, self.np_a, self.rank_a,
                             range(self.na))

        # Write time propagation status
        writer.write(time=self.time, np_a=np_a)

        def writearray(name, shape, dtype):
            if name.split('_')[0] in writes:
                writer.add_array(name, shape, dtype)
            a_wxg = getattr(self, name)
            for w in range(self.nw):
                writer.fill(self.gd.collect(a_wxg[w]))

        ng = tuple(self.gd.get_size_of_global_array())

        # Write time propagation arrays
        if 'n0t' in writes:
            writer.write(n0t_sG=self.gd.collect(self.n0t_sG))
        writearray('Fnt_wsG', (self.nw, self.nspins) + ng, self.dtype)

        if 'D0' in writes:
            # Collect D0_asp to world master
            if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
                # Create empty dict on domain master
                if self.domain_comm.rank == 0:
                    D0_asp = {}
                    for a in range(self.na):
                        npa = np_a[a]
                        D0_asp[a] = np.empty((self.nspins, npa[0]),
                                             dtype=float)
                else:
                    D0_asp = {}
                # Collect dict to master
                sendreceive_dict(self.domain_comm, D0_asp, 0, self.D0_asp,
                                 self.rank_a, range(self.na))
            # Write
            writer.write(D0_asp=D0_asp)

        if 'FD' in writes:
            # Collect FD_awsp to world master
            if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
                # Create empty dict on domain master
                if self.domain_comm.rank == 0:
                    FD_awsp = {}
                    for a in range(self.na):
                        npa = np_a[a]
                        FD_awsp[a] = np.empty((self.nw, self.nspins, npa[0]),
                                              dtype=complex)
                else:
                    FD_awsp = {}
                # Collect dict to master
                sendreceive_dict(self.domain_comm, FD_awsp, 0, self.FD_awsp,
                                 self.rank_a, range(self.na))
            # Write
            writer.write(FD_awsp=FD_awsp)
    def _write(self, tar, writes, ws, masters):
        # Swap classical and quantum cells, and shift atom positions for the time of writing
        qmcell = self.atoms.get_cell()
        self.atoms.set_cell(self.fdtd.cl.cell*Bohr) # Set classical cell
        self.atoms.positions = self.atoms.get_positions() + self.fdtd.qm.corner1*Bohr
        BaseInducedField._write(self, tar, writes, ws, masters)
        self.atoms.set_cell(qmcell) # Restore quantum cell to the atoms object
        self.atoms.positions = self.atoms.get_positions() - self.fdtd.qm.corner1*Bohr

        master, domainmaster, bandmaster, kptmaster = masters
        
        # Write time propagation status
        if master:
            tar['time'] = self.time
        
        # Mask, interpolation approach:
        #self.eps0_G = self.fdtd.classical_material.permittivityValue(omega=0.0) - self.fdtd.classical_material.epsInfty
        #self.eps0_G= -interpolator.apply(self.eps0_G)
        
        # Mask, direct approach:
        self.eps0_G = self.fdtd.cl.gd.zeros()
        for component in self.fdtd.classical_material.components:
            self.eps0_G += 1.0 * component.get_mask(gd = self.fdtd.cl.gd, verbose = False)
        
        # Write time propagation arrays
        if 'n0' in writes:
            
            if master:
                tar.add('n0_G',
                        ('ng0', 'ng1', 'ng2'),
                        dtype=float)
            
            if self.fdtd.cl.gd == self.gd:
                big_g = self.gd.collect(self.n0_G)
            else:
                big_g = self.gd.collect(Transformer(self.fdtd.cl.gd, self.gd, self.stencil, float).apply(self.n0_G))
            
            if master:
                tar.fill(big_g)
                
        if 'Fn' in writes:
            if master:
                tar.add('Fn_wsG',
                        ('nw', 'nspins', 'ng0', 'ng1', 'ng2'),
                        dtype=self.dtype)
            for w in ws:
                #big_g = self.gd.collect(self.Fn_wG[w])
                if self.fdtd.cl.gd == self.gd:
                    big_g = self.gd.collect(self.Fn_wsG[w])
                else:
                    big_g = self.gd.collect(Transformer(self.fdtd.cl.gd, self.gd, self.stencil, self.dtype).apply(self.Fn_wsG[w]))
                #big_g = self.gd.collect(interpolator_float.apply(self.n0_G.copy()))
                if master:
                    tar.fill(big_g)
         
        if 'eps0' in writes:
            if master:
                tar.add('eps0_G',
                        ('ng0', 'ng1', 'ng2'),
                        dtype=float)
            #big_g = self.fieldgd.collect(self.eps0_G)
            if self.fdtd.cl.gd == self.gd:
                big_g = self.gd.collect(self.eps0_G)
            else:
                big_g = self.gd.collect(Transformer(self.fdtd.cl.gd, self.gd, self.stencil, float).apply(self.eps0_G))
            if master:
                tar.fill(big_g)
        
        if master and hasattr(self.fdtd, 'qm') and hasattr(self.fdtd.qm, 'corner1'):
            tar.add('corner1_v', ('nv',), self.fdtd.qm.corner1, dtype=float)
            tar.add('corner2_v', ('nv',), self.fdtd.qm.corner2, dtype=float)
        
        self.fdtd.cl.gd.comm.barrier()
            
            
    def _write(self, tar, writes, ws, masters):
        BaseInducedField._write(self, tar, writes, ws, masters)

        master, domainmaster, bandmaster, kptmaster = masters

        # Collect np_a to master
        if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
            
            # Create empty dict on domain master
            if self.domain_comm.rank == 0:
                np_a = {}
                for a in range(self.na):
                    np_a[a] = np.empty((1), dtype=int)
            else:
                np_a = {}
            # Collect dict to master
            sendreceive_dict(self.domain_comm, np_a, 0,
                             self.np_a, self.rank_a, range(self.na))
        
        # Write time propagation status
        if master:
            tar['time'] = self.time
            for a in range(self.na):
                tar.dimension('np_%d' % a, int(np_a[a]))
          
        # Write time propagation arrays
        if 'n0t' in writes:
            if master:
                tar.add('n0t_sG',
                        ('nspins', 'ng0', 'ng1', 'ng2'),
                        dtype=float)
            for s in range(self.nspins):
                big_g = self.gd.collect(self.n0t_sG[s])
                if master:
                    tar.fill(big_g)
        
        if 'Fnt' in writes:
            if master:
                tar.add('Fnt_wsG',
                        ('nw', 'nspins', 'ng0', 'ng1', 'ng2'),
                        dtype=self.dtype)
            for w in ws:
                for s in range(self.nspins):
                    big_g = self.gd.collect(self.Fnt_wsG[w][s])
                    if master:
                        tar.fill(big_g)
        
        if 'D0' in writes:
            # Collect D0_asp to world master
            if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
                # Create empty dict on domain master
                if self.domain_comm.rank == 0:
                    D0_asp = {}
                    for a in range(self.na):
                        D0_asp[a] = np.empty((self.nspins, np_a[a]),
                                             dtype=float)
                else:
                    D0_asp = {}
                # Collect dict to master
                sendreceive_dict(self.domain_comm, D0_asp, 0,
                                 self.D0_asp, self.rank_a, range(self.na))
            # Write
            if master:
                for a in range(self.na):
                    tar.add('D0_%dsp' % a, ('nspins', 'np_%d' % a),
                            dtype=float)
                    tar.fill(D0_asp[a])
        
        if 'FD' in writes:
            # Collect FD_awsp to world master
            if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
                # Create empty dict on domain master
                if self.domain_comm.rank == 0:
                    FD_awsp = {}
                    for a in range(self.na):
                        FD_awsp[a] = np.empty((self.nw, self.nspins, np_a[a]),
                                              dtype=complex)
                else:
                    FD_awsp = {}
                # Collect dict to master
                sendreceive_dict(self.domain_comm, FD_awsp, 0,
                                 self.FD_awsp, self.rank_a, range(self.na))
            # Write
            if master:
                for a in range(self.na):
                    tar.add('FD_%dwsp' % a, ('nw', 'nspins', 'np_%d' % a),
                            dtype=self.dtype)
                    tar.fill(FD_awsp[a][ws])
Exemplo n.º 5
0
    def _write(self, tar, writes, ws, masters):
        BaseInducedField._write(self, tar, writes, ws, masters)

        master, domainmaster, bandmaster, kptmaster = masters

        # Collect np_a to master
        if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:

            # Create empty dict on domain master
            if self.domain_comm.rank == 0:
                np_a = {}
                for a in range(self.na):
                    np_a[a] = np.empty((1), dtype=int)
            else:
                np_a = {}
            # Collect dict to master
            sendreceive_dict(self.domain_comm, np_a, 0, self.np_a, self.rank_a,
                             range(self.na))

        # Write time propagation status
        if master:
            tar['time'] = self.time
            for a in range(self.na):
                tar.dimension('np_%d' % a, int(np_a[a]))

        # Write time propagation arrays
        if 'n0t' in writes:
            if master:
                tar.add('n0t_sG', ('nspins', 'ng0', 'ng1', 'ng2'), dtype=float)
            for s in range(self.nspins):
                big_g = self.gd.collect(self.n0t_sG[s])
                if master:
                    tar.fill(big_g)

        if 'Fnt' in writes:
            if master:
                tar.add('Fnt_wsG', ('nw', 'nspins', 'ng0', 'ng1', 'ng2'),
                        dtype=self.dtype)
            for w in ws:
                for s in range(self.nspins):
                    big_g = self.gd.collect(self.Fnt_wsG[w][s])
                    if master:
                        tar.fill(big_g)

        if 'D0' in writes:
            # Collect D0_asp to world master
            if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
                # Create empty dict on domain master
                if self.domain_comm.rank == 0:
                    D0_asp = {}
                    for a in range(self.na):
                        D0_asp[a] = np.empty((self.nspins, np_a[a]),
                                             dtype=float)
                else:
                    D0_asp = {}
                # Collect dict to master
                sendreceive_dict(self.domain_comm, D0_asp, 0, self.D0_asp,
                                 self.rank_a, range(self.na))
            # Write
            if master:
                for a in range(self.na):
                    tar.add('D0_%dsp' % a, ('nspins', 'np_%d' % a),
                            dtype=float)
                    tar.fill(D0_asp[a])

        if 'FD' in writes:
            # Collect FD_awsp to world master
            if self.kpt_comm.rank == 0 and self.band_comm.rank == 0:
                # Create empty dict on domain master
                if self.domain_comm.rank == 0:
                    FD_awsp = {}
                    for a in range(self.na):
                        FD_awsp[a] = np.empty((self.nw, self.nspins, np_a[a]),
                                              dtype=complex)
                else:
                    FD_awsp = {}
                # Collect dict to master
                sendreceive_dict(self.domain_comm, FD_awsp, 0, self.FD_awsp,
                                 self.rank_a, range(self.na))
            # Write
            if master:
                for a in range(self.na):
                    tar.add('FD_%dwsp' % a, ('nw', 'nspins', 'np_%d' % a),
                            dtype=self.dtype)
                    tar.fill(FD_awsp[a][ws])