Ejemplo n.º 1
0
 def fb_curr_in(self):
     self.Data['J_fb'] = chimera.fb_vec_in(self.Data['J_fb'],
                                           self.Data['J'],
                                           self.Args['leftX'],
                                           *self.Args['FBCurrIn'])
     self.Data['J_fb'] = chimera.omp_mult_vec(self.Data['J_fb'],
                                              self.Args['DepFact'])
Ejemplo n.º 2
0
 def divG_clean(self):
     self.Data['vec_fb'][:] = self.Data['EG_fb'][:, :, :, 3:]
     self.FBGradDiv()
     self.Data['vec_fb'] = chimera.omp_mult_vec(self.Data['vec_fb'],\
       self.Args['PoissFact'])
     self.Data['EG_fb'][:,:,:,3:] = chimera.omp_add_vec(\
       self.Data['EG_fb'][:,:,:,3:],self.Data['vec_fb'])
Ejemplo n.º 3
0
 def div_clean(self, vec):
     self.Data['vec_fb'][:] = vec
     self.FBGradDiv()
     self.Data['vec_fb'] = chimera.omp_mult_vec(self.Data['vec_fb'],\
       self.Args['PoissFact'])
     vec = chimera.omp_add_vec(vec, self.Data['vec_fb'])
     return vec
Ejemplo n.º 4
0
    def poiss_corr(self, poiss_corr_num=2):
        """
		Add the current Poisson correction

		Parameters
		----------
		poiss_corr_num: integer
		  number of iterations to do

		Comments
		--------
		wrapper for the OMP-vectorized Fortran subroutines

		"""

        if 'NoPoissonCorrection' in self.Args['Features']: return
        for corr in range(poiss_corr_num):
            self.Data['vec_fb'][:] = self.Data['J_fb']
            self.FBGradDiv()
            if 'SpaceCharge' in self.Args['Features']:
                self.Data['J_fb'] = chimera.poiss_corr(\
                  self.Data['J_fb'], self.Data['vec_fb'],\
                  self.Data['gradRho_fb_prv'], \
                  self.Data['gradRho_fb_nxt'], \
                  self.Args['dt_inv'],\
                  self.Args['PoissFact'])
            else:
                self.Data['vec_fb'] = chimera.omp_mult_vec(self.Data['vec_fb'],\
                  self.Args['PoissFact'])
                self.Data['J_fb'] = chimera.omp_add_vec(self.Data['J_fb'],\
                  self.Data['vec_fb'])
Ejemplo n.º 5
0
 def G2B_FBRot(self):
     if 'KxShift' in self.Configs:
         self.Data['B_fb'] = chimera.fb_rot_env(
             self.Data['B_fb'], self.Data['EG_fb'][:, :, :, 3:],
             *self.Args['FBDiff'])
     else:
         self.Data['B_fb'] = chimera.fb_rot(self.Data['B_fb'],
                                            self.Data['EG_fb'][:, :, :, 3:],
                                            *self.Args['FBDiff'])
     self.Data['B_fb'] = chimera.omp_mult_vec(self.Data['B_fb'],
                                              self.Args['PoissFact'])
Ejemplo n.º 6
0
    def fb_curr_in(self):
        """
		Project the current into the Fourier-Bessel space

		Comments
		--------
		wrapper for the OMP-vectorized Fortran subroutines

		"""

        self.Data['J_fb'] = chimera.fb_vec_in(self.Data['J_fb'],self.Data['J'],\
          self.Args['leftX'],*self.Args['FBCurrIn'])
        self.Data['J_fb'] = chimera.omp_mult_vec(self.Data['J_fb'],\
          self.Args['DepFact'])
Ejemplo n.º 7
0
    def add_gauss_beam(self, S):
        k0 = 2 * np.pi * S['k0']
        a0 = 2 * np.pi * S['a0']
        X_focus = S['x0'] - S['x_foc']
        kx_g, kr_g, w = self.Args['kx_g'], self.Args['kr_g'], self.Args['w']
        w = w[:, :, :, None]

        if 'KxShift' in self.Configs:
            e_s0 = a0 * 0.5 * (np.pi)**0.5 * S['Lx'] * S['LR']**2 * self.Args[
                'dkx'] / self.Args['lengthR']**2
            self.Data['vec_fb'][:,:,self.Args['Nko'],2] = e_s0/j1(self.Args['lengthR']*kr_g[:,:,self.Args['Nko']])**2*\
              np.exp(-1j*kx_g*S['x0'])*\
              np.exp(-0.25*(kx_g-k0)**2*S['Lx']**2 -0.25*kr_g[:,:,self.Args['Nko']]**2*S['LR']**2 )
            DT = -1.j * w
        else:
            Xgrid, Rgrid = self.Args['Xgrid'], self.Args[
                'Rgrid']  # sin laser phase
            self.Data['scl_spc'][:,:,0] = a0*np.sin(k0*(Xgrid[:,None]-S['x0']))*\
              np.exp(-(Xgrid[:,None]-S['x0'])**2/S['Lx']**2-Rgrid[None,:]**2/S['LR']**2)*\
              (abs(Xgrid[:,None]-S['x0'])<3.5*S['Lx'])*(abs(Rgrid[None,:])<3.5*S['LR'])
            self.Data['scl_spc'][:, 0, 0] = 0.0
            self.fb_scl_spc_in()
            self.Data['vec_fb'][:, :, :, 2] = self.Data['scl_fb'] / np.float(
                self.Args['Nx'])
            DT = -1.j * w * np.sign(kx_g[:, :, None, None] +
                                    (kx_g[:, :, None, None] == 0))

        EE = self.Data['vec_fb'].copy()
        self.FBDiv()
        self.FBGrad()
        self.Data['vec_fb'] = chimera.omp_mult_vec(self.Data['vec_fb'],
                                                   self.Args['PoissFact'])
        EE += self.Data['vec_fb']
        GG = DT * EE

        self.Data['vec_fb'][:] = np.cos(w * X_focus) * EE + np.sin(
            w * X_focus) / w * GG
        GG = -w * np.sin(w * X_focus) * EE + np.cos(w * X_focus) * GG
        EE[:] = self.Data['vec_fb']
        EE *= np.exp(1.j * kx_g[:, :, None, None] * X_focus)
        GG *= np.exp(1.j * kx_g[:, :, None, None] * X_focus)

        self.Data['EG_fb'][:, :, :, :3] += EE
        self.Data['EG_fb'][:, :, :, 3:] += GG
        self.Data['vec_fb'][:] = 0.0
        self.Data['scl_fb'][:] = 0.0
Ejemplo n.º 8
0
    def G2B_FBRot(self):
        """
		Calculate the magnetic field from G=rot(B);

		Comments
		--------
		wrapper for the OMP-vectorized Fortran subroutines

		"""

        if 'KxShift' in self.Args:
            self.Data['B_fb'] = chimera.fb_rot_env(self.Data['B_fb'],\
              self.Data['EG_fb'][:,:,:,3:],*self.Args['FBDiff'])
        else:
            self.Data['B_fb'] = chimera.fb_rot(self.Data['B_fb'],\
              self.Data['EG_fb'][:,:,:,3:],*self.Args['FBDiff'])
        self.Data['B_fb'] = chimera.omp_mult_vec(\
          self.Data['B_fb'], self.Args['PoissFact'])