def dump_EM_fields(self, file_name): """ This function is used to EM fields to a file for later usage. This dumps all the EM fields quantities E1, E2, E3, B1, B2, B3 which can then be used later for post-processing Parameters ---------- file_name : The EM_fields array will be dumped to this provided file name. Returns ------- This function returns None. However it creates a file 'file_name.h5', containing the data of the EM fields. Examples -------- >> solver.dump_EM_fields('data_EM_fields') The above statement will create a HDF5 file which contains the EM fields data. The data is always stored with the key 'EM_fields' This can later be accessed using >> import h5py >> h5f = h5py.File('data_EM_fields.h5', 'r') >> EM_fields = h5f['EM_fields'][:] >> E1 = EM_fields[:, :, 0] >> E2 = EM_fields[:, :, 1] >> E3 = EM_fields[:, :, 2] >> B1 = EM_fields[:, :, 3] >> B2 = EM_fields[:, :, 4] >> B3 = EM_fields[:, :, 5] >> h5f.close() Alternatively, it can also be used with the load function to resume a long-running calculation. >> solver.load_EM_fields('data_EM_fields') """ array_to_dump = 0.5 * self.N_q2 * self.N_q1 * af.real( ifft2(self.fields_solver.fields_hat)) array_to_dump.to_ndarray(self.fields_solver._glob_fields_array) viewer = PETSc.Viewer().createHDF5(file_name + '.h5', 'w') viewer(self.fields_solver._glob_fields) return
def simple_signal(verbose=False): display_func = _util.display_func(verbose) print_func = _util.print_func(verbose) a = af.randu(10, 1) pos0 = af.randu(10) * 10 display_func(af.approx1(a, pos0)) a = af.randu(3, 3) pos0 = af.randu(3, 3) * 10 pos1 = af.randu(3, 3) * 10 display_func(af.approx2(a, pos0, pos1)) a = af.randu(8, 1) display_func(a) display_func(af.fft(a)) display_func(af.dft(a)) display_func(af.real(af.ifft(af.fft(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft(a) af.ifft_inplace(b) display_func(b) af.fft_inplace(b) display_func(b) b = af.fft_r2c(a) c = af.fft_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4) display_func(a) display_func(af.fft2(a)) display_func(af.dft(a)) display_func(af.real(af.ifft2(af.fft2(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft2(a) af.ifft2_inplace(b) display_func(b) af.fft2_inplace(b) display_func(b) b = af.fft2_r2c(a) c = af.fft2_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4, 2) display_func(a) display_func(af.fft3(a)) display_func(af.dft(a)) display_func(af.real(af.ifft3(af.fft3(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft3(a) af.ifft3_inplace(b) display_func(b) af.fft3_inplace(b) display_func(b) b = af.fft3_r2c(a) c = af.fft3_c2r(b) display_func(b) display_func(c) a = af.randu(10, 1) b = af.randu(3, 1) display_func(af.convolve1(a, b)) display_func(af.fft_convolve1(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5) b = af.randu(3, 3) display_func(af.convolve2(a, b)) display_func(af.fft_convolve2(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5, 3) b = af.randu(3, 3, 2) display_func(af.convolve3(a, b)) display_func(af.fft_convolve3(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) b = af.randu(3, 1) x = af.randu(10, 1) a = af.randu(2, 1) display_func(af.fir(b, x)) display_func(af.iir(b, a, x))
def simple_arith(verbose=False): display_func = _util.display_func(verbose) a = af.randu(3, 3) b = af.constant(4, 3, 3) display_func(a) display_func(b) c = a + b d = a d += b display_func(c) display_func(d) display_func(a + 2) display_func(3 + a) c = a - b d = a d -= b display_func(c) display_func(d) display_func(a - 2) display_func(3 - a) c = a * b d = a d *= b display_func(c * 2) display_func(3 * d) display_func(a * 2) display_func(3 * a) c = a / b d = a d /= b display_func(c / 2.0) display_func(3.0 / d) display_func(a / 2) display_func(3 / a) c = a % b d = a d %= b display_func(c % 2.0) display_func(3.0 % d) display_func(a % 2) display_func(3 % a) c = a**b d = a d **= b display_func(c**2.0) display_func(3.0**d) display_func(a**2) display_func(3**a) display_func(a < b) display_func(a < 0.5) display_func(0.5 < a) display_func(a <= b) display_func(a <= 0.5) display_func(0.5 <= a) display_func(a > b) display_func(a > 0.5) display_func(0.5 > a) display_func(a >= b) display_func(a >= 0.5) display_func(0.5 >= a) display_func(a != b) display_func(a != 0.5) display_func(0.5 != a) display_func(a == b) display_func(a == 0.5) display_func(0.5 == a) a = af.randu(3, 3, dtype=af.Dtype.u32) b = af.constant(4, 3, 3, dtype=af.Dtype.u32) display_func(a & b) display_func(a & 2) c = a c &= 2 display_func(c) display_func(a | b) display_func(a | 2) c = a c |= 2 display_func(c) display_func(a >> b) display_func(a >> 2) c = a c >>= 2 display_func(c) display_func(a << b) display_func(a << 2) c = a c <<= 2 display_func(c) display_func(-a) display_func(+a) display_func(~a) display_func(a) display_func(af.cast(a, af.Dtype.c32)) display_func(af.maxof(a, b)) display_func(af.minof(a, b)) display_func(af.clamp(a, 0, 1)) display_func(af.clamp(a, 0, b)) display_func(af.clamp(a, b, 1)) display_func(af.rem(a, b)) a = af.randu(3, 3) - 0.5 b = af.randu(3, 3) - 0.5 display_func(af.abs(a)) display_func(af.arg(a)) display_func(af.sign(a)) display_func(af.round(a)) display_func(af.trunc(a)) display_func(af.floor(a)) display_func(af.ceil(a)) display_func(af.hypot(a, b)) display_func(af.sin(a)) display_func(af.cos(a)) display_func(af.tan(a)) display_func(af.asin(a)) display_func(af.acos(a)) display_func(af.atan(a)) display_func(af.atan2(a, b)) c = af.cplx(a) d = af.cplx(a, b) display_func(c) display_func(d) display_func(af.real(d)) display_func(af.imag(d)) display_func(af.conjg(d)) display_func(af.sinh(a)) display_func(af.cosh(a)) display_func(af.tanh(a)) display_func(af.asinh(a)) display_func(af.acosh(a)) display_func(af.atanh(a)) a = af.abs(a) b = af.abs(b) display_func(af.root(a, b)) display_func(af.pow(a, b)) display_func(af.pow2(a)) display_func(af.sigmoid(a)) display_func(af.exp(a)) display_func(af.expm1(a)) display_func(af.erf(a)) display_func(af.erfc(a)) display_func(af.log(a)) display_func(af.log1p(a)) display_func(af.log10(a)) display_func(af.log2(a)) display_func(af.sqrt(a)) display_func(af.cbrt(a)) a = af.round(5 * af.randu(3, 3) - 1) b = af.round(5 * af.randu(3, 3) - 1) display_func(af.factorial(a)) display_func(af.tgamma(a)) display_func(af.lgamma(a)) display_func(af.iszero(a)) display_func(af.isinf(a / b)) display_func(af.isnan(a / a)) a = af.randu(5, 1) b = af.randu(1, 5) c = af.broadcast(lambda x, y: x + y, a, b) display_func(a) display_func(b) display_func(c) @af.broadcast def test_add(aa, bb): return aa + bb display_func(test_add(a, b))
n_data_ls = np.zeros_like(time_array) n_data_nls = np.zeros_like(time_array) for time_index, t0 in enumerate(time_array): if(time_index%100 == 0): print('Computing For Time =', t0) nls.dump_distribution_function('dump_f/%04d'%time_index) # nls.dump_moments('dump_moments/%04d'%time_index) E_data_nls[time_index] = af.sum(nls.fields_solver.cell_centered_EM_fields[:, :, N_g:-N_g, N_g:-N_g]**2) E1_ls = af.real(0.5 * (ls.N_q1 * ls.N_q2) * ifft2(ls.fields_solver.E1_hat) ) E_data_ls[time_index] = af.sum(E1_ls**2) n_data_nls[time_index] = af.max(nls.compute_moments('density')) n_data_ls[time_index] = af.max(ls.compute_moments('density')) nls.strang_timestep(dt) ls.RK4_timestep(dt) h5f = h5py.File('data.h5', 'w') h5f.create_dataset('electrical_energy_ls', data = E_data_ls) h5f.create_dataset('electrical_energy_nls', data = E_data_nls) h5f.create_dataset('density_ls', data = n_data_ls) h5f.create_dataset('density_nls', data = n_data_nls)
def simple_signal(verbose=False): display_func = _util.display_func(verbose) signal = af.randu(10) x_new = af.randu(10) x_orig = af.randu(10) display_func(af.approx1(signal, x_new, xp=x_orig)) signal = af.randu(3, 3) x_new = af.randu(3, 3) x_orig = af.randu(3, 3) y_new = af.randu(3, 3) y_orig = af.randu(3, 3) display_func(af.approx2(signal, x_new, y_new, xp=x_orig, yp=y_orig)) a = af.randu(8, 1) display_func(a) display_func(af.fft(a)) display_func(af.dft(a)) display_func(af.real(af.ifft(af.fft(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft(a) af.ifft_inplace(b) display_func(b) af.fft_inplace(b) display_func(b) b = af.fft_r2c(a) c = af.fft_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4) display_func(a) display_func(af.fft2(a)) display_func(af.dft(a)) display_func(af.real(af.ifft2(af.fft2(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft2(a) af.ifft2_inplace(b) display_func(b) af.fft2_inplace(b) display_func(b) b = af.fft2_r2c(a) c = af.fft2_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4, 2) display_func(a) display_func(af.fft3(a)) display_func(af.dft(a)) display_func(af.real(af.ifft3(af.fft3(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft3(a) af.ifft3_inplace(b) display_func(b) af.fft3_inplace(b) display_func(b) b = af.fft3_r2c(a) c = af.fft3_c2r(b) display_func(b) display_func(c) a = af.randu(10, 1) b = af.randu(3, 1) display_func(af.convolve1(a, b)) display_func(af.fft_convolve1(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5) b = af.randu(3, 3) display_func(af.convolve2(a, b)) display_func(af.fft_convolve2(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5, 3) b = af.randu(3, 3, 2) display_func(af.convolve3(a, b)) display_func(af.fft_convolve3(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) b = af.randu(3, 1) x = af.randu(10, 1) a = af.randu(2, 1) display_func(af.fir(b, x)) display_func(af.iir(b, a, x)) display_func(af.medfilt1(a)) display_func(af.medfilt2(a)) display_func(af.medfilt(a))
def real(arr): return af.real(arr)
def df_hat_dt(f_hat, fields_hat, self): """ Returns the value of the derivative of the f_hat with respect to time respect to time. This is used to evolve the system in time. Input: ------ f_hat : Fourier mode values for the distribution function at which the slope is computed At t = 0 the initial state of the system is passed to this function: fields_hat : Fourier mode values for the fields at which the slope is computed At t = 0 the initial state of the system is passed to this function: Output: ------- df_dt : The time-derivative of f_hat """ (A_q1, A_q2) = self._A_q(self.time_elapsed, self.q1_center, self.q2_center, self.p1_center, self.p2_center, self.p3_center, self.physical_system.params) df_hat_dt = -1j * (multiply(self.k_q1, A_q1) + multiply(self.k_q2, A_q2)) * f_hat if (self.physical_system.params.source_enabled == True): # Scaling Appropriately: f = af.real(ifft2(0.5 * self.N_q2 * self.N_q1 * f_hat)) C_f_hat = 2 * fft2( self._source( f, self.time_elapsed, self.q1_center, self.q2_center, self.p1_center, self.p2_center, self.p3_center, self.compute_moments, self.physical_system.params)) / (self.N_q2 * self.N_q1) df_hat_dt += C_f_hat if (self.physical_system.params.fields_enabled == True): if (self.physical_system.params.fields_type == 'electrostatic'): rho_hat = multiply(self.physical_system.params.charge, self.compute_moments('density', f_hat=f_hat)) self.fields_solver.compute_electrostatic_fields(rho_hat) elif (self.physical_system.params.fields_type == 'electrodynamic'): # Handled by dfields_hat_dt pass # Used in debugging; advection tests for p-space where fields are to be held constant elif (self.physical_system.params.fields_type == 'None'): pass else: raise NotImplementedError('Invalid option for fields solver!') # get_fields for linear solver returns the mode amplitudes of the fields # So, we obtain A_p1_hat, A_p2_hat, A_p3_hat (A_p1_hat, A_p2_hat, A_p3_hat) = af.broadcast( self._A_p, self.time_elapsed, self.q1_center, self.q2_center, self.p1_center, self.p2_center, self.p3_center, self.fields_solver, self.physical_system.params) fields_term = multiply(A_p1_hat, self.dfdp1_background) \ + multiply(A_p2_hat, self.dfdp2_background) \ + multiply(A_p3_hat, self.dfdp3_background) # Including the mean magnetic field term: # TODO: Maybe wrong to add mean magnetic fields since e^{ikx} term won't cancel out. Check again # Multiplying by q_center**0 to get the values in the array of required dimension # Dividing by 2 to normalize appropriately(look at the initialization sector): B1_mean = af.mean( self.fields_solver.fields_hat[3, 0, 0, 0]) * self.q1_center**0 / 2 B2_mean = af.mean( self.fields_solver.fields_hat[4, 0, 0, 0]) * self.q1_center**0 / 2 B3_mean = af.mean( self.fields_solver.fields_hat[5, 0, 0, 0]) * self.q1_center**0 / 2 e = self.physical_system.params.charge m = self.physical_system.params.mass # Converting delta_f array to velocity_expanded form: f_hat_p_expanded = af.moddims(f_hat, self.N_p1, self.N_p2, self.N_p3, self.N_species * self.N_q1 * self.N_q2) # Computing ddelta_f_dp using a 4th order finite different stencil: ddelta_f_dp1 = multiply((-af.shift(f_hat_p_expanded, -2) + 8 * af.shift(f_hat_p_expanded, -1) + af.shift(f_hat_p_expanded, 2) - 8 * af.shift(f_hat_p_expanded, 1)), 1 / (12 * self.dp1)) ddelta_f_dp2 = multiply((-af.shift(f_hat_p_expanded, 0, -2) + 8 * af.shift(f_hat_p_expanded, 0, -1) + af.shift(f_hat_p_expanded, 0, 2) - 8 * af.shift(f_hat_p_expanded, 0, 1)), 1 / (12 * self.dp2)) ddelta_f_dp3 = multiply((-af.shift(f_hat_p_expanded, 0, 0, -2) + 8 * af.shift(f_hat_p_expanded, 0, 0, -1) + af.shift(f_hat_p_expanded, 0, 0, 2) - 8 * af.shift(f_hat_p_expanded, 0, 0, 1)), 1 / (12 * self.dp3)) # Converting back to positions expanded: ddelta_f_dp1 = af.moddims(ddelta_f_dp1, self.N_p1 * self.N_p2 * self.N_p3, self.N_species, self.N_q1, self.N_q2) ddelta_f_dp2 = af.moddims(ddelta_f_dp2, self.N_p1 * self.N_p2 * self.N_p3, self.N_species, self.N_q1, self.N_q2) ddelta_f_dp3 = af.moddims(ddelta_f_dp3, self.N_p1 * self.N_p2 * self.N_p3, self.N_species, self.N_q1, self.N_q2) fields_term_mean_magnetic_fields = \ multiply(e/m, ( (multiply(self.p2_center, B3_mean) - multiply(self.p3_center, B2_mean)) * ddelta_f_dp1 + (multiply(self.p3_center, B1_mean) - multiply(self.p1_center, B3_mean)) * ddelta_f_dp2 + (multiply(self.p1_center, B2_mean) - multiply(self.p2_center, B1_mean)) * ddelta_f_dp3 ) ) df_hat_dt -= fields_term + fields_term_mean_magnetic_fields af.eval(df_hat_dt) return (df_hat_dt)
def simple_signal(verbose=False): display_func = _util.display_func(verbose) print_func = _util.print_func(verbose) a = af.randu(10, 1) pos0 = af.randu(10) * 10 display_func(af.approx1(a, pos0)) a = af.randu(3, 3) pos0 = af.randu(3, 3) * 10 pos1 = af.randu(3, 3) * 10 display_func(af.approx2(a, pos0, pos1)) a = af.randu(8, 1) display_func(a) display_func(af.fft(a)) display_func(af.dft(a)) display_func(af.real(af.ifft(af.fft(a)))) display_func(af.real(af.idft(af.dft(a)))) a = af.randu(4, 4) display_func(a) display_func(af.fft2(a)) display_func(af.dft(a)) display_func(af.real(af.ifft2(af.fft2(a)))) display_func(af.real(af.idft(af.dft(a)))) a = af.randu(4, 4, 2) display_func(a) display_func(af.fft3(a)) display_func(af.dft(a)) display_func(af.real(af.ifft3(af.fft3(a)))) display_func(af.real(af.idft(af.dft(a)))) a = af.randu(10, 1) b = af.randu(3, 1) display_func(af.convolve1(a, b)) display_func(af.fft_convolve1(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5) b = af.randu(3, 3) display_func(af.convolve2(a, b)) display_func(af.fft_convolve2(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5, 3) b = af.randu(3, 3, 2) display_func(af.convolve3(a, b)) display_func(af.fft_convolve3(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) b = af.randu(3, 1) x = af.randu(10, 1) a = af.randu(2, 1) display_func(af.fir(b, x)) display_func(af.iir(b, a, x))
af.display(af.floor(a)) af.display(af.ceil(a)) af.display(af.hypot(a, b)) af.display(af.sin(a)) af.display(af.cos(a)) af.display(af.tan(a)) af.display(af.asin(a)) af.display(af.acos(a)) af.display(af.atan(a)) af.display(af.atan2(a, b)) c = af.cplx(a) d = af.cplx(a,b) af.display(c) af.display(d) af.display(af.real(d)) af.display(af.imag(d)) af.display(af.conjg(d)) af.display(af.sinh(a)) af.display(af.cosh(a)) af.display(af.tanh(a)) af.display(af.asinh(a)) af.display(af.acosh(a)) af.display(af.atanh(a)) a = af.abs(a) b = af.abs(b) af.display(af.root(a, b)) af.display(af.pow(a, b))
def df_hat_dt(f_hat, fields_hat, self): """ Returns the value of the derivative of the f_hat with respect to time respect to time. This is used to evolve the system in time. Input: ------ f_hat : Fourier mode values for the distribution function at which the slope is computed At t = 0 the initial state of the system is passed to this function: fields_hat : Fourier mode values for the fields at which the slope is computed At t = 0 the initial state of the system is passed to this function: Output: ------- df_dt : The time-derivative of f_hat """ (A_q1, A_q2) = self._A_q(f_hat, self.time_elapsed, self.q1_center, self.q2_center, self.p1, self.p2, self.p3, self.physical_system.params) df_hat_dt = -1j * (multiply(self.k_q1, A_q1) + multiply(self.k_q2, A_q2)) * f_hat if (self.physical_system.params.source_enabled == True): # Scaling Appropriately: f = af.real(ifft2(0.5 * self.N_q2 * self.N_q1 * f_hat)) C_f_hat = 2 * fft2( self._source( f, self.time_elapsed, self.q1_center, self.q2_center, self.p1, self.p2, self.p3, self.compute_moments, self.physical_system.params)) / (self.N_q2 * self.N_q1) df_hat_dt += C_f_hat if (self.physical_system.params.EM_fields_enabled == True): if (self.physical_system.params.fields_type == 'electrostatic'): rho = multiply(self.physical_system.params.charge, self.compute_moments('density', f_hat=f_hat)) self.fields_solver.compute_electrostatic_fields(rho) elif (self.physical_system.params.fields_type == 'electrodynamic'): # Handled by dfields_hat_dt pass elif (self.physical_system.params.fields_type == 'user-defined'): self.fields_solver.update_user_defined_fields(self.time_elapsed) # get_fields for linear solver returns the mode amplitudes of the fields # So, we obtain A_p1_hat, A_p2_hat, A_p3_hat (A_p1_hat, A_p2_hat, A_p3_hat) = af.broadcast(self._A_p, f_hat, self.time_elapsed, self.q1_center, self.q2_center, self.p1, self.p2, self.p3, self.fields_solver, self.physical_system.params) fields_term = multiply(A_p1_hat, self.dfdp1_background) \ + multiply(A_p2_hat, self.dfdp2_background) \ + multiply(A_p3_hat, self.dfdp3_background) df_hat_dt -= fields_term af.eval(df_hat_dt) return (df_hat_dt)
def compute_moments(self, moment_name, f=None, f_hat=None): """ Used in computing the moments of the distribution function. The moment definitions which are passed to physical system are used in computing these moment quantities. Parameters ---------- moments_name : str Pass the moment name which needs to be computed. It must be noted that this needs to be defined by the user under moments under src and passed to the physical_system object. f/f_hat: np.ndarray Pass this argument as well when you want to compute the moments of the input array and not the one stored by the state vector of the object. Examples -------- >> solver.compute_moments('density') Will return the density of the system at its current state. """ if(f_hat is None and f is None): # af.broadcast(function, *args) performs batched operations on function(*args): moment_hat = af.broadcast(getattr(self.physical_system.moments, moment_name ), self.f_hat, self.p1_center, self.p2_center, self.p3_center, self.dp3 * self.dp2 * self.dp1 ) # Scaling Appropriately: moment_hat = 0.5 * self.N_q2 * self.N_q1 * moment_hat moment = af.real(ifft2(moment_hat)) af.eval(moment) return(moment) elif(f_hat is not None and f is None): moment_hat = af.broadcast(getattr(self.physical_system.moments, moment_name ), f_hat, self.p1_center, self.p2_center, self.p3_center, self.dp3 * self.dp2 * self.dp1 ) af.eval(moment_hat) return(moment_hat) elif(f_hat is None and f is not None): moment = af.broadcast(getattr(self.physical_system.moments, moment_name ), f, self.p1_center, self.p2_center, self.p3_center, self.dp3 * self.dp2 * self.dp1 ) af.eval(moment) return(moment) else: raise BaseException('Invalid Option: Both f and f_hat cannot \ be provided as arguments' )
def computeProx(self, x): if type(x).__module__ == "arrayfire.array": x = af.real(x) + 1j * 0.0 else: x = x.real + 1j * 0.0 return x
dt = params.N_cfl * min(nls.dq1, nls.dq2) \ / max(domain.p1_end, domain.p2_end, domain.p3_end) time_array = np.arange(0, params.t_final + dt, dt) # Initializing Arrays used in storing the data: E_data_ls = np.zeros_like(time_array) E_data_nls = np.zeros_like(time_array) for time_index, t0 in enumerate(time_array): if (time_index % 100 == 0): print('Computing For Time =', t0) E_data_nls[time_index] = af.sum(nls.cell_centered_EM_fields[:, N_g:-N_g, N_g:-N_g]**2) E1_ls = af.real(0.5 * (ls.N_q1 * ls.N_q2) * af.ifft2(ls.E1_hat[:, :, 0])) E_data_ls[time_index] = af.sum(E1_ls**2) nls.strang_timestep(dt) ls.RK4_timestep(dt) h5f = h5py.File('data.h5', 'w') h5f.create_dataset('electrical_energy_ls', data=E_data_ls) h5f.create_dataset('electrical_energy_nls', data=E_data_nls) h5f.create_dataset('time', data=time_array) h5f.close() pl.plot(time_array, E_data_ls, '--', color='black', label='Linear Solver') pl.plot(time_array, E_data_nls, label='Nonlinear Solver') pl.ylabel(r'SUM($|E|^2$)')
def simple_signal(verbose=False): display_func = _util.display_func(verbose) print_func = _util.print_func(verbose) signal = af.randu(10) x_new = af.randu(10) x_orig = af.randu(10) display_func(af.approx1(signal, x_new, xp = x_orig)) signal = af.randu(3, 3) x_new = af.randu(3, 3) x_orig = af.randu(3, 3) y_new = af.randu(3, 3) y_orig = af.randu(3, 3) display_func(af.approx2(signal, x_new, y_new, xp = x_orig, yp = y_orig)) a = af.randu(8, 1) display_func(a) display_func(af.fft(a)) display_func(af.dft(a)) display_func(af.real(af.ifft(af.fft(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft(a) af.ifft_inplace(b) display_func(b) af.fft_inplace(b) display_func(b) b = af.fft_r2c(a) c = af.fft_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4) display_func(a) display_func(af.fft2(a)) display_func(af.dft(a)) display_func(af.real(af.ifft2(af.fft2(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft2(a) af.ifft2_inplace(b) display_func(b) af.fft2_inplace(b) display_func(b) b = af.fft2_r2c(a) c = af.fft2_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4, 2) display_func(a) display_func(af.fft3(a)) display_func(af.dft(a)) display_func(af.real(af.ifft3(af.fft3(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft3(a) af.ifft3_inplace(b) display_func(b) af.fft3_inplace(b) display_func(b) b = af.fft3_r2c(a) c = af.fft3_c2r(b) display_func(b) display_func(c) a = af.randu(10, 1) b = af.randu(3, 1) display_func(af.convolve1(a, b)) display_func(af.fft_convolve1(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5) b = af.randu(3, 3) display_func(af.convolve2(a, b)) display_func(af.fft_convolve2(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5, 3) b = af.randu(3, 3, 2) display_func(af.convolve3(a, b)) display_func(af.fft_convolve3(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) b = af.randu(3, 1) x = af.randu(10, 1) a = af.randu(2, 1) display_func(af.fir(b, x)) display_func(af.iir(b, a, x)) display_func(af.medfilt1(a)) display_func(af.medfilt2(a)) display_func(af.medfilt(a))
def fft_poisson(self, rho): """ Solves the Poisson Equation using FFTs: Used as a backup solver for low resolution runs (ie. used on a single node) with periodic boundary conditions. Parameters ---------- rho : af.Array Array that holds the charge density for each species """ if(self.performance_test_flag == True): tic = af.time() if (self._comm.size != 1): raise Exception('FFT solver can only be used when run in serial') else: N_g = self.N_g # Reorder from (1, N_s, N_q1, N_q2) --> (N_q1, N_q2, 1, N_s) rho = af.reorder(rho[:, :, N_g:-N_g, N_g:-N_g] , 2, 3, 0, 1) # Summing for all the species: rho = af.sum(rho, 3) k_q1 = np.fft.fftfreq(rho.shape[0], self.dq1) k_q2 = np.fft.fftfreq(rho.shape[1], self.dq2) k_q2, k_q1 = np.meshgrid(k_q2, k_q1) k_q1 = af.to_array(k_q1) k_q2 = af.to_array(k_q2) rho_hat = af.fft2(rho) potential_hat = rho_hat / (4 * np.pi**2 * (k_q1**2 + k_q2**2)) potential_hat[0, 0] = 0 E1_hat = -1j * 2 * np.pi * k_q1 * potential_hat E2_hat = -1j * 2 * np.pi * k_q2 * potential_hat # Non-inclusive of ghost-zones: E1_ifft = af.ifft2(E1_hat, scale=1)/(E1_hat.shape[0] * E1_hat.shape[1]) E2_ifft = af.ifft2(E2_hat, scale=1)/(E2_hat.shape[0] * E2_hat.shape[1]) E1_physical = af.reorder(af.real(E1_ifft), 2, 3, 0, 1) E2_physical = af.reorder(af.real(E2_ifft), 2, 3, 0, 1) self.cell_centered_EM_fields[0, 0, N_g:-N_g, N_g:-N_g] = E1_physical self.cell_centered_EM_fields[1, 0, N_g:-N_g, N_g:-N_g] = E2_physical af.eval(self.cell_centered_EM_fields) if(self.performance_test_flag == True): af.sync() toc = af.time() self.time_fieldsolver += toc - tic return
a = af.randu(10, 1) pos0 = af.randu(10) * 10 af.display(af.approx1(a, pos0)) a = af.randu(3, 3) pos0 = af.randu(3, 3) * 10 pos1 = af.randu(3, 3) * 10 af.display(af.approx2(a, pos0, pos1)) a = af.randu(8, 1) af.display(a) af.display(af.fft(a)) af.display(af.dft(a)) af.display(af.real(af.ifft(af.fft(a)))) af.display(af.real(af.idft(af.dft(a)))) a = af.randu(4, 4) af.display(a) af.display(af.fft2(a)) af.display(af.dft(a)) af.display(af.real(af.ifft2(af.fft2(a)))) af.display(af.real(af.idft(af.dft(a)))) a = af.randu(4, 4, 2) af.display(a) af.display(af.fft3(a)) af.display(af.dft(a))
def angle(arr): return af.atan2(af.imag(arr), af.real(arr))
def simple_arith(verbose = False): display_func = _util.display_func(verbose) print_func = _util.print_func(verbose) a = af.randu(3,3,dtype=af.Dtype.u32) b = af.constant(4, 3, 3, dtype=af.Dtype.u32) display_func(a) display_func(b) c = a + b d = a d += b display_func(c) display_func(d) display_func(a + 2) display_func(3 + a) c = a - b d = a d -= b display_func(c) display_func(d) display_func(a - 2) display_func(3 - a) c = a * b d = a d *= b display_func(c * 2) display_func(3 * d) display_func(a * 2) display_func(3 * a) c = a / b d = a d /= b display_func(c / 2.0) display_func(3.0 / d) display_func(a / 2) display_func(3 / a) c = a % b d = a d %= b display_func(c % 2.0) display_func(3.0 % d) display_func(a % 2) display_func(3 % a) c = a ** b d = a d **= b display_func(c ** 2.0) display_func(3.0 ** d) display_func(a ** 2) display_func(3 ** a) display_func(a < b) display_func(a < 0.5) display_func(0.5 < a) display_func(a <= b) display_func(a <= 0.5) display_func(0.5 <= a) display_func(a > b) display_func(a > 0.5) display_func(0.5 > a) display_func(a >= b) display_func(a >= 0.5) display_func(0.5 >= a) display_func(a != b) display_func(a != 0.5) display_func(0.5 != a) display_func(a == b) display_func(a == 0.5) display_func(0.5 == a) display_func(a & b) display_func(a & 2) c = a c &= 2 display_func(c) display_func(a | b) display_func(a | 2) c = a c |= 2 display_func(c) display_func(a >> b) display_func(a >> 2) c = a c >>= 2 display_func(c) display_func(a << b) display_func(a << 2) c = a c <<= 2 display_func(c) display_func(-a) display_func(+a) display_func(~a) display_func(a) display_func(af.cast(a, af.Dtype.c32)) display_func(af.maxof(a,b)) display_func(af.minof(a,b)) display_func(af.rem(a,b)) a = af.randu(3,3) - 0.5 b = af.randu(3,3) - 0.5 display_func(af.abs(a)) display_func(af.arg(a)) display_func(af.sign(a)) display_func(af.round(a)) display_func(af.trunc(a)) display_func(af.floor(a)) display_func(af.ceil(a)) display_func(af.hypot(a, b)) display_func(af.sin(a)) display_func(af.cos(a)) display_func(af.tan(a)) display_func(af.asin(a)) display_func(af.acos(a)) display_func(af.atan(a)) display_func(af.atan2(a, b)) c = af.cplx(a) d = af.cplx(a,b) display_func(c) display_func(d) display_func(af.real(d)) display_func(af.imag(d)) display_func(af.conjg(d)) display_func(af.sinh(a)) display_func(af.cosh(a)) display_func(af.tanh(a)) display_func(af.asinh(a)) display_func(af.acosh(a)) display_func(af.atanh(a)) a = af.abs(a) b = af.abs(b) display_func(af.root(a, b)) display_func(af.pow(a, b)) display_func(af.pow2(a)) display_func(af.exp(a)) display_func(af.expm1(a)) display_func(af.erf(a)) display_func(af.erfc(a)) display_func(af.log(a)) display_func(af.log1p(a)) display_func(af.log10(a)) display_func(af.log2(a)) display_func(af.sqrt(a)) display_func(af.cbrt(a)) a = af.round(5 * af.randu(3,3) - 1) b = af.round(5 * af.randu(3,3) - 1) display_func(af.factorial(a)) display_func(af.tgamma(a)) display_func(af.lgamma(a)) display_func(af.iszero(a)) display_func(af.isinf(a/b)) display_func(af.isnan(a/a)) a = af.randu(5, 1) b = af.randu(1, 5) c = af.broadcast(lambda x,y: x+y, a, b) display_func(a) display_func(b) display_func(c) @af.broadcast def test_add(aa, bb): return aa + bb display_func(test_add(a, b))
def simple_signal(verbose=False): display_func = _util.display_func(verbose) signal = af.randu(10) x_new = af.randu(10) x_orig = af.randu(10) display_func(af.approx1(signal, x_new, xp=x_orig)) signal = af.randu(3, 3) x_new = af.randu(3, 3) x_orig = af.randu(3, 3) y_new = af.randu(3, 3) y_orig = af.randu(3, 3) display_func(af.approx2(signal, x_new, y_new, xp=x_orig, yp=y_orig)) a = af.randu(8, 1) display_func(a) display_func(af.fft(a)) display_func(af.dft(a)) display_func(af.real(af.ifft(af.fft(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft(a) af.ifft_inplace(b) display_func(b) af.fft_inplace(b) display_func(b) b = af.fft_r2c(a) c = af.fft_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4) display_func(a) display_func(af.fft2(a)) display_func(af.dft(a)) display_func(af.real(af.ifft2(af.fft2(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft2(a) af.ifft2_inplace(b) display_func(b) af.fft2_inplace(b) display_func(b) b = af.fft2_r2c(a) c = af.fft2_c2r(b) display_func(b) display_func(c) a = af.randu(4, 4, 2) display_func(a) display_func(af.fft3(a)) display_func(af.dft(a)) display_func(af.real(af.ifft3(af.fft3(a)))) display_func(af.real(af.idft(af.dft(a)))) b = af.fft3(a) af.ifft3_inplace(b) display_func(b) af.fft3_inplace(b) display_func(b) b = af.fft3_r2c(a) c = af.fft3_c2r(b) display_func(b) display_func(c) a = af.randu(10, 1) b = af.randu(3, 1) display_func(af.convolve1(a, b)) display_func(af.fft_convolve1(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) a = af.randu(5, 5) b = af.randu(3, 3) display_func(af.convolve2(a, b)) display_func(af.fft_convolve2(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) c = af.convolve2NN(a, b) display_func(c) in_dims = c.dims() incoming_grad = af.constant(1, in_dims[0], in_dims[1]) g = af.convolve2GradientNN(incoming_grad, a, b, c) display_func(g) a = af.randu(5, 5, 3) b = af.randu(3, 3, 2) display_func(af.convolve3(a, b)) display_func(af.fft_convolve3(a, b)) display_func(af.convolve(a, b)) display_func(af.fft_convolve(a, b)) b = af.randu(3, 1) x = af.randu(10, 1) a = af.randu(2, 1) display_func(af.fir(b, x)) display_func(af.iir(b, a, x)) display_func(af.medfilt1(a)) display_func(af.medfilt2(a)) display_func(af.medfilt(a))