@@ -42,6 +42,8 @@ namespace PulsarParm
42
42
AMREX_GPU_DEVICE_MANAGED int enforceCorotatingE;
43
43
AMREX_GPU_DEVICE_MANAGED int enforceDipoleB;
44
44
AMREX_GPU_DEVICE_MANAGED int singleParticleTest;
45
+ AMREX_GPU_DEVICE_MANAGED amrex::Real Bdamping_scale = 10 ;
46
+ AMREX_GPU_DEVICE_MANAGED int DampBDipoleInRing = 0 ;
45
47
46
48
void ReadParameters () {
47
49
amrex::ParmParse pp (" pulsar" );
@@ -126,6 +128,8 @@ namespace PulsarParm
126
128
pp.query (" enforceDipoleB" , enforceDipoleB);
127
129
singleParticleTest = 0 ;
128
130
pp.query (" singleParticleTest" , singleParticleTest);
131
+ pp.query (" DampBDipoleInRing" , DampBDipoleInRing);
132
+ if (DampBDipoleInRing == 1 ) pp.query (" Bdamping_scale" , Bdamping_scale);
129
133
}
130
134
131
135
/* * To initialize the grid with dipole magnetic field everywhere and corotating vacuum
@@ -375,6 +379,26 @@ namespace PulsarParm
375
379
ConvertSphericalToCartesianXComponent ( Fr, Ftheta, Fphi,
376
380
r, theta, phi, Bx_arr (i,j,k));
377
381
}
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
+ }
378
402
},
379
403
[=] AMREX_GPU_DEVICE (int i, int j, int k) {
380
404
amrex::Real x, y, z;
@@ -390,6 +414,20 @@ namespace PulsarParm
390
414
Fr, Ftheta, Fphi);
391
415
ConvertSphericalToCartesianYComponent ( Fr, Ftheta, Fphi,
392
416
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
+ }
393
431
}
394
432
},
395
433
[=] AMREX_GPU_DEVICE (int i, int j, int k) {
@@ -406,6 +444,20 @@ namespace PulsarParm
406
444
Fr, Ftheta, Fphi);
407
445
ConvertSphericalToCartesianZComponent ( Fr, Ftheta, Fphi,
408
446
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
+ }
409
461
}
410
462
}
411
463
);
0 commit comments