Skip to content

Commit 0485e8e

Browse files
DampBdipole between inner and outer rings
1 parent d8312f2 commit 0485e8e

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

Examples/Physics_applications/pulsar/inputs.corotating.3d.PM

+2
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,5 @@ pulsar.enforceCorotatingE = 1 # default 1
143143
pulsar.enforceDipoleB = 1 # default 1
144144
pulsar.singleParticleTest = 0 # default 0, if 1, then a particle pair will be introduced.
145145
# Single particle position/momentum will need to be specified
146+
pulsar.DampBDipoleInRing = 1
147+
pulsar.Bdamping_scale = 10000

Source/Particles/PulsarParameters.H

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ namespace PulsarParm
4747
extern AMREX_GPU_DEVICE_MANAGED int enforceCorotatingE;
4848
extern AMREX_GPU_DEVICE_MANAGED int enforceDipoleB;
4949
extern AMREX_GPU_DEVICE_MANAGED int singleParticleTest;
50+
extern AMREX_GPU_DEVICE_MANAGED amrex::Real Bdamping_scale;
51+
extern AMREX_GPU_DEVICE_MANAGED int DampBDipoleInRing;
5052

5153
void ReadParameters();
5254
void InitializeExternalPulsarFieldsOnGrid (amrex::MultiFab *mfx,

Source/Particles/PulsarParameters.cpp

+52
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ namespace PulsarParm
4242
AMREX_GPU_DEVICE_MANAGED int enforceCorotatingE;
4343
AMREX_GPU_DEVICE_MANAGED int enforceDipoleB;
4444
AMREX_GPU_DEVICE_MANAGED int singleParticleTest;
45+
AMREX_GPU_DEVICE_MANAGED amrex::Real Bdamping_scale = 10;
46+
AMREX_GPU_DEVICE_MANAGED int DampBDipoleInRing = 0;
4547

4648
void ReadParameters() {
4749
amrex::ParmParse pp("pulsar");
@@ -126,6 +128,8 @@ namespace PulsarParm
126128
pp.query("enforceDipoleB", enforceDipoleB);
127129
singleParticleTest = 0;
128130
pp.query("singleParticleTest", singleParticleTest);
131+
pp.query("DampBDipoleInRing", DampBDipoleInRing);
132+
if (DampBDipoleInRing == 1) pp.query("Bdamping_scale", Bdamping_scale);
129133
}
130134

131135
/** To initialize the grid with dipole magnetic field everywhere and corotating vacuum
@@ -375,6 +379,26 @@ namespace PulsarParm
375379
ConvertSphericalToCartesianXComponent( Fr, Ftheta, Fphi,
376380
r, theta, phi, Bx_arr(i,j,k));
377381
}
382+
else if ( r > enforceDipoleB_maxradius && r <= corotatingE_maxradius) {
383+
if (DampBDipoleInRing == 1) {
384+
// from inner ring to outer ring
385+
ExternalBFieldSpherical(r, theta, phi, cur_time,
386+
Fr, Ftheta, Fphi);
387+
amrex::Real Bx_dipole;
388+
ConvertSphericalToCartesianXComponent( Fr, Ftheta, Fphi,
389+
r, theta, phi, Bx_dipole);
390+
// Damping Function : Fd = tanh(dampingscale * (1-r/Rinner))
391+
// where Rinner = enforceDipoleB_maxradius
392+
// is the range where Bdipole is imposed
393+
// Fd(Rinner) ~ 1
394+
// Fd(R_domainboundary) ~ 0
395+
amrex::Real Fd = 1._rt
396+
+ std::tanh( Bdamping_scale
397+
* (1._rt - r/enforceDipoleB_maxradius)
398+
);
399+
Bx_arr(i,j,k) += Fd * Bx_dipole;
400+
}
401+
}
378402
},
379403
[=] AMREX_GPU_DEVICE (int i, int j, int k) {
380404
amrex::Real x, y, z;
@@ -390,6 +414,20 @@ namespace PulsarParm
390414
Fr, Ftheta, Fphi);
391415
ConvertSphericalToCartesianYComponent( Fr, Ftheta, Fphi,
392416
r, theta, phi, By_arr(i,j,k));
417+
} else if ( r > enforceDipoleB_maxradius && r <= corotatingE_maxradius) {
418+
if (DampBDipoleInRing == 1) {
419+
// from inner ring to outer ring
420+
ExternalBFieldSpherical(r, theta, phi, cur_time,
421+
Fr, Ftheta, Fphi);
422+
amrex::Real By_dipole;
423+
ConvertSphericalToCartesianYComponent( Fr, Ftheta, Fphi,
424+
r, theta, phi, By_dipole);
425+
amrex::Real Fd = 1._rt
426+
+ std::tanh( Bdamping_scale
427+
* (1._rt - r/enforceDipoleB_maxradius)
428+
);
429+
By_arr(i,j,k) += Fd * By_dipole;
430+
}
393431
}
394432
},
395433
[=] AMREX_GPU_DEVICE (int i, int j, int k) {
@@ -406,6 +444,20 @@ namespace PulsarParm
406444
Fr, Ftheta, Fphi);
407445
ConvertSphericalToCartesianZComponent( Fr, Ftheta, Fphi,
408446
r, theta, phi, Bz_arr(i,j,k));
447+
} else if ( r > enforceDipoleB_maxradius && r <= corotatingE_maxradius) {
448+
if (DampBDipoleInRing == 1) {
449+
// from inner ring to outer ring
450+
ExternalBFieldSpherical(r, theta, phi, cur_time,
451+
Fr, Ftheta, Fphi);
452+
amrex::Real Bz_dipole;
453+
ConvertSphericalToCartesianZComponent( Fr, Ftheta, Fphi,
454+
r, theta, phi, Bz_dipole);
455+
amrex::Real Fd = 1._rt
456+
+ std::tanh( Bdamping_scale
457+
* (1._rt - r/enforceDipoleB_maxradius)
458+
);
459+
Bz_arr(i,j,k) += Fd * Bz_dipole;
460+
}
409461
}
410462
}
411463
);

0 commit comments

Comments
 (0)