Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

plot applied field #4950

Open
rl3418 opened this issue May 24, 2024 · 8 comments
Open

plot applied field #4950

rl3418 opened this issue May 24, 2024 · 8 comments
Assignees
Labels
component: diagnostics all types of outputs

Comments

@rl3418
Copy link

rl3418 commented May 24, 2024

According to the manual, the external fields applied to the grid can be seen in the diagnostics that output the fields on the grid. I performed a boosted frame simulation with sinusoidal B fields in the lab frame.

I tried to plot the B fields in the boosted frame using
diag1.diag_type = Full
diag1.fields_to_plot = Bx By Bz

The boost was along z, so I was expecting the field to be proportional to cos(gamma_f*k_u*(z+beta_f*t*clight)). This doesn't seem to be consistent. What diagnostic should I use to plot the applied field.

Here is a lineout of the field and the input I used

By lineout

test_3d.txt

@rl3418
Copy link
Author

rl3418 commented May 28, 2024

I am do a 3d boosted frame simulation of an electron beam travelling through a 3d undulator field. The boost is along the z direction and this is the field I used

#boost along z
warpx.gamma_boost = gamma_f
warpx.boost_direction = z
#field in lab frame
warpx.B_ext_grid_init_style = parse_B_ext_grid_function
warpx.Bx_external_grid_function(x,y,z) = if((z>(0.0)),if(z<2.15,-(k_x/k_y)\*sin(k_x\*x)*sinh(k_y\*y)*cos(k_u\*z),0.0),0.0)
warpx.By_external_grid_function(x,y,z) = if((z>(0.0)),if(z<2.15,B_0*cos(k_x\*x)\*cosh(k_y\*y)\*cos(k_u\*z),0.0),0.0)
warpx.Bz_external_grid_function(x,y,z) = if((z>(0.0)),if(z<2.15,-(k_u/k_y)\*B_0\*cos(k_x\*x)*sinh(k_y\*y)*sin(k_u\*z),0.0),0.0)
warpx.E_ext_grid_init_style = parse_E_ext_grid_function
warpx.Ex_external_grid_function(x,y,z) = 0
warpx.Ey_external_grid_function(x,y,z) = 0
warpx.Ez_external_grid_function(x,y,z) = 0

Below is a comparision between the z phase space predicted by the osiris simulation and the Warpx simulation

osiris
osiris z pz
warpx
warpx z pz

The external field should sinusoidally modulate the z phase space. This is seen in the osiris code. Seems that the field is not applied properly in the WarpX code. Is there additional parameter that I need to specify?

@rl3418
Copy link
Author

rl3418 commented May 28, 2024

external_particle_function seems to work. I guess external_grid_function doesn't include any time dependence. It doesn't know how to handle the time dependence after Lorentz transformation.

@rl3418
Copy link
Author

rl3418 commented May 29, 2024

<species_name>.zinject_plane only have spatial dependence as well. Does it transform properly when warpx.gamma_boost is set?

@ax3l ax3l added the component: diagnostics all types of outputs label May 29, 2024
@RemiLehe
Copy link
Member

@rl3418
Thanks for your questions, and sorry for the late reply!

You had a number of different questions, so here are a few corresponding answers:

  • In general, the external_particle fields cannot be visualized in the WarpX output. We might fix this in the near future, but again the current status is that these fields do not show up in the diagnostics (but yet they are indeed applied to the particles during the simulation). You mentioned that the WarpX document suggests otherwise: could you point me to the corresponding part of the documentation?
  • I would strongly recommend to use the external_particle fields instead of the external_grid fields. The external_grid fields actually add the fields to the Maxwell grid, and the fields are then self-consistently updated, which can be problematic if the fields that you impose do not satisfy the right boundary conditions. It is much simpler to use external_particle fields.
  • One key point: You should not apply the Lorentz transform in the fields that you pass to WarpX (e.g. -clightgamma_fbeta_f*(k_x/k_y)B_0sin(k_xx)sinh(k_yy)cos(k_ugamma_f(z+beta_f*t))). Instead, simply pass the lab-frame expressions. WarpX will automatically transform these fields under the hood. (See these lines and these lines) I suspect that this is one of the main reason why the WarpX and Osiris results differ.
  • In order to get the results back in the lab-frame, you mentioned that you used a script similar to FBPIC. However, this should not be needed: you can directly use the BackTransformed diagnostic in WarpX:
Screenshot 2024-05-31 at 6 07 17 AM - `zinject_plane` is indeed automatically transformed to the boosted frame. So you only need to pass the (constant) value in the lab frame.

Please let us know if anything is unclear. Also, feel free to post an updated version of your script that takes into account the above points, if you would like us to take another look.

@rl3418
Copy link
Author

rl3418 commented Jun 1, 2024

Thanks for the clarification. I was doing the transformation manually just to diagnose the problems. The BackTransformation diagnostics was not working properly, so I tried to do the transformation myself. I need to run more simulations to figure out what is the underlying problem.

I found a typo in my script. The preliminary simulation showed some agreement with the osiris results. This was performed without the injection plane, since it is not possibility to have the zinject_plane change with time. I will run more simulations with the zinject_plane using the WarpX transformation then.

@rl3418
Copy link
Author

rl3418 commented Jun 4, 2024

I performed 3d simulations of an electron beam travelling through an undulator in the boosted frame. The warpx simulation and the osiris simulation showed similar behaviour. The beam evolution in the zpz phase space seems to match, but warpx results showed splitting which seems numerical. z is the beam propagation and the boost direction.

The plots here show the phase space distribution in the boosted frame just before the beam fully enters the undulator. The red vertical line marks the boundary of the undulator field in the boosted frame. pz shows sinusoidal modulation as expected due to the z dependence of the undulator field. However, warpx results showed splitting which seems numerical.

warpx

warpx

osiris
osiris

comparision

overlayed

@rl3418
Copy link
Author

rl3418 commented Jun 4, 2024

0 40ps
This is the z pz plot at a later time in the boosted frame

@rl3418
Copy link
Author

rl3418 commented Jun 4, 2024

One could argue that this is due to microbunching. But it forms very rapidly and this is not observed in osiris.

warpx
possible_bunching

osiris
osiris boost

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component: diagnostics all types of outputs
Projects
None yet
Development

No branches or pull requests

3 participants