@@ -45,9 +45,9 @@ void Naive::init(std::string_view equilibriumName) {
45
45
46
46
// aPar, uekPar, ne
47
47
g.for_each_kxky ([&](Dim kx, Dim ky) {
48
- moments_K (kx, ky, N_E) = nonlinear::phiInv (phi_K (kx, ky), kPerp2 (kx, ky));
48
+ moments_K (kx, ky, N_E) = nonlinear::phiInv (phi_K (kx, ky), g. kPerp2 (kx, ky));
49
49
moments_K (kx, ky, A_PAR) = aParEq_K (kx, ky);
50
- ueKPar_K (kx, ky) = -kPerp2 (kx, ky) * moments_K (kx, ky, A_PAR);
50
+ ueKPar_K (kx, ky) = -g. kPerp2 (kx, ky) * moments_K (kx, ky, A_PAR);
51
51
});
52
52
br.derivatives (phi_K, dPhi);
53
53
br.derivatives (ueKPar_K, dUEKPar);
@@ -121,7 +121,7 @@ void Naive::run(Dim N, Dim saveInterval) {
121
121
dt / 2.0 * (1 + exp_nu (kx, ky, hyper.nu_2 , dt)) * GM_Nonlinear_K (kx, ky, N_E);
122
122
123
123
GM_Nonlinear_K (kx, ky, A_PAR) =
124
- nonlinear::A (bracketAParPhiG2Ne_K (kx, ky), bracketUEParPhi_K (kx, ky), kPerp2 (kx, ky));
124
+ nonlinear::A (bracketAParPhiG2Ne_K (kx, ky), bracketUEParPhi_K (kx, ky), g. kPerp2 (kx, ky));
125
125
GM_K_Star (kx, ky, A_PAR) =
126
126
exp_eta (kx, ky, hyper.eta2 , dt) * moments_K (kx, ky, A_PAR) +
127
127
dt / 2.0 * (1 + exp_eta (kx, ky, hyper.eta2 , dt)) * GM_Nonlinear_K (kx, ky, A_PAR) +
@@ -138,7 +138,7 @@ void Naive::run(Dim N, Dim saveInterval) {
138
138
auto bracketPhiGLast_K = br.halfBracket (dPhi, Grid::sliceXY (dGM, LAST));
139
139
auto bracketAParGLast_K = br.halfBracket (Grid::sliceXY (dGM, A_PAR), Grid::sliceXY (dGM, LAST));
140
140
g.for_each_kxky ([&](Dim kx, Dim ky) {
141
- bracketAParGLast_K (kx, ky) *= nonlinear::GLastBracketFactor (g.M , kPerp2 (kx, ky), hyper);
141
+ bracketAParGLast_K (kx, ky) *= nonlinear::GLastBracketFactor (g.M , g. kPerp2 (kx, ky), hyper);
142
142
bracketAParGLast_K (kx, ky) += rhoS / de * std::sqrt (LAST) * moments_K (kx, ky, LAST - 1 );
143
143
// TODO Viriato adds this after the derivative
144
144
});
@@ -192,8 +192,8 @@ void Naive::run(Dim N, Dim saveInterval) {
192
192
g.for_each_kxky ([&](Dim kx, Dim ky) {
193
193
// set to 0 for (kx, ky)=(0,0)
194
194
phi_K_New (kx, ky) =
195
- ((kx | ky) == 0 ) ? 0 : nonlinear::phi (GM_K_Star (kx, ky, N_E), kPerp2 (kx, ky));
196
- ueKPar_K_New (kx, ky) = -kPerp2 (kx, ky) * GM_K_Star (kx, ky, A_PAR);
195
+ ((kx | ky) == 0 ) ? 0 : nonlinear::phi (GM_K_Star (kx, ky, N_E), g. kPerp2 (kx, ky));
196
+ ueKPar_K_New (kx, ky) = -g. kPerp2 (kx, ky) * GM_K_Star (kx, ky, A_PAR);
197
197
});
198
198
199
199
auto dPhi_Loop = g.dBufXY (), dUEKPar_Loop = g.dBufXY ();
@@ -213,7 +213,7 @@ void Naive::run(Dim N, Dim saveInterval) {
213
213
auto guessAPar_K = g.cBufXY (), semiImplicitOperator = g.cBufXY ();
214
214
g.for_each_kxky ([&](Dim kx, Dim ky) {
215
215
guessAPar_K (kx, ky) = moments_K (kx, ky, A_PAR);
216
- semiImplicitOperator (kx, ky) = nonlinear::semiImplicitOp (dt, bPerpMax, aa0, kPerp2 (kx, ky));
216
+ semiImplicitOperator (kx, ky) = nonlinear::semiImplicitOp (dt, bPerpMax, aa0, g. kPerp2 (kx, ky));
217
217
});
218
218
semiImplicitOperator (0 , 0 ) = 0 ;
219
219
@@ -249,7 +249,7 @@ void Naive::run(Dim N, Dim saveInterval) {
249
249
Real sumAParRelError = 0 ;
250
250
g.for_each_kxky ([&](Dim kx, Dim ky) {
251
251
GM_Nonlinear_K_Loop (kx, ky, A_PAR) = nonlinear::A (
252
- bracketAParPhiG2Ne_K_Loop (kx, ky), bracketUEParPhi_K_Loop (kx, ky), kPerp2 (kx, ky));
252
+ bracketAParPhiG2Ne_K_Loop (kx, ky), bracketUEParPhi_K_Loop (kx, ky), g. kPerp2 (kx, ky));
253
253
// TODO(OPT) reuse star
254
254
momentsNew_K (kx, ky, A_PAR) =
255
255
1.0 / (1.0 + semiImplicitOperator (kx, ky) / 4.0 ) *
@@ -258,7 +258,7 @@ void Naive::run(Dim N, Dim saveInterval) {
258
258
dt / 2.0 * GM_Nonlinear_K_Loop (kx, ky, A_PAR) +
259
259
(1.0 - exp_eta (kx, ky, hyper.eta2 , dt)) * aParEq_K (kx, ky) +
260
260
semiImplicitOperator (kx, ky) / 4.0 * guessAPar_K (kx, ky));
261
- ueKPar_K_New (kx, ky) = -kPerp2 (kx, ky) * momentsNew_K (kx, ky, A_PAR);
261
+ ueKPar_K_New (kx, ky) = -g. kPerp2 (kx, ky) * momentsNew_K (kx, ky, A_PAR);
262
262
263
263
sumAParRelError += std::norm (momentsNew_K (kx, ky, A_PAR) - moments_K (kx, ky, A_PAR));
264
264
});
@@ -291,7 +291,7 @@ void Naive::run(Dim N, Dim saveInterval) {
291
291
dt / 2.0 * GM_Nonlinear_K_Loop (kx, ky, N_E);
292
292
293
293
phi_K_New (kx, ky) =
294
- (kx | ky) == 0 ? 0 : nonlinear::phi (momentsNew_K (kx, ky, N_E), kPerp2 (kx, ky));
294
+ (kx | ky) == 0 ? 0 : nonlinear::phi (momentsNew_K (kx, ky, N_E), g. kPerp2 (kx, ky));
295
295
});
296
296
297
297
br.derivatives (phi_K_New, dPhi_Loop);
@@ -347,7 +347,7 @@ void Naive::run(Dim N, Dim saveInterval) {
347
347
br.halfBracket (Grid::sliceXY (dGM_Loop, A_PAR), Grid::sliceXY (dGM_Loop, LAST));
348
348
g.for_each_kxky ([&](Dim kx, Dim ky) {
349
349
bracketAParGLast_K_Loop (kx, ky) *=
350
- nonlinear::GLastBracketFactor (g.M , kPerp2 (kx, ky), hyper);
350
+ nonlinear::GLastBracketFactor (g.M , g. kPerp2 (kx, ky), hyper);
351
351
bracketAParGLast_K_Loop (kx, ky) +=
352
352
rhoS / de * std::sqrt (LAST) * momentsNew_K (kx, ky, LAST - 1 );
353
353
// Note: Viriato adds this after derivative, but can be distributed
@@ -479,16 +479,70 @@ Naive::Buf::R_XY Naive::getMoment(Dim m) const {
479
479
return out;
480
480
}
481
481
482
+ Real Naive::getTimestep (DxDy<View::R_XY> dPhi, DxDy<View::R_XY> dNE, DxDy<View::R_XY> dAPar) {
483
+ // compute flows
484
+ DxDy<View::R_XY> ve, b;
485
+ Real vyMax{0 }, vxMax{0 }, bxMax{0 }, byMax{0 };
486
+ bPerpMax = 0 ;
487
+
488
+ // Note that this is minus in Viriato, but we don't care because we're taking the absolute value
489
+ // anyway.
490
+ ve.DX = dPhi.DY ;
491
+ ve.DY = dPhi.DX ;
492
+ b.DX = dAPar.DY ;
493
+ b.DY = dAPar.DX ;
494
+
495
+ g.for_each_xy ([&](Dim x, Dim y) {
496
+ bxMax = std::max (bxMax, std::abs (b.DX (x, y)));
497
+ byMax = std::max (byMax, std::abs (b.DY (x, y)));
498
+ bPerpMax = std::max (bPerpMax, std::sqrt (b.DX (x, y) * b.DX (x, y) + b.DY (x, y) * b.DY (x, y)));
499
+ vxMax = std::max (vxMax, std::abs (ve.DX (x, y)));
500
+ vyMax = std::max (vyMax, std::abs (ve.DY (x, y)));
501
+ if (rhoI >= smallRhoI) {
502
+ vxMax = std::max (vxMax, rhoS * rhoS * std::abs (dNE.DX (x, y)));
503
+ vyMax = std::max (vyMax, rhoS * rhoS * std::abs (dNE.DY (x, y)));
504
+ }
505
+ });
506
+
507
+ Real kperpDum2 = std::pow (g.ky_ (g.KY / 2 ), 2 ) + std::pow (Real (g.KX ), 2 );
508
+ Real omegaKaw;
509
+ if (rhoI < smallRhoI) {
510
+ omegaKaw = std::sqrt (1.0 + kperpDum2 * (3.0 / 4.0 * rhoI * rhoI + rhoS * rhoS)) *
511
+ g.ky_ (g.KY / 2 ) * bPerpMax / (1.0 + kperpDum2 * de * de);
512
+ } else {
513
+ omegaKaw =
514
+ std::sqrt (kperpDum2 *
515
+ (rhoS * rhoS - rhoI * rhoI / (Gamma0 (0.5 * kperpDum2 * rhoI * rhoI) - 1.0 ))) *
516
+ g.ky_ (g.KY / 2 + 1 ) * bPerpMax / std::sqrt (1.0 + kperpDum2 * de * de);
517
+ }
518
+
519
+ Real dx = lx / Real (g.X ), dy = ly / Real (g.Y );
520
+
521
+ Real CFLFlow;
522
+ if (g.M > 2 ) {
523
+ CFLFlow = std::min ({dx / vxMax, dy / vyMax, 2.0 / omegaKaw,
524
+ std::min (dx / bxMax, dy / byMax) / (rhoS / de) / std::sqrt (LAST)});
525
+ } else {
526
+ CFLFlow = std::min ({dx / vxMax, dy / vyMax, 2.0 / omegaKaw, dx / bxMax, dy / byMax});
527
+ }
528
+
529
+ spdlog::debug (" vxmax: {}, vymax: {}, bxmax: {}, bymax: {}" , vxMax, vyMax, bxMax, byMax);
530
+ spdlog::debug (" bperp_max: {}, omegakaw: {}, CFLFlow: {}" , bPerpMax, omegaKaw, CFLFlow);
531
+ spdlog::debug (" Calculated timestep: {}" , CFLFrac * CFLFlow);
532
+
533
+ return CFLFrac * CFLFlow;
534
+ }
535
+
482
536
Naive::Energies Naive::calculateEnergies () const {
483
537
Energies e{};
484
538
g.for_each_kxky ([&](Dim kx, Dim ky) {
485
539
Real const factor = kx == 0 ? 0.5 : 1.0 ;
486
- e.magnetic += factor * kPerp2 (kx, ky) * std::norm (moments_K (kx, ky, A_PAR));
540
+ e.magnetic += factor * g. kPerp2 (kx, ky) * std::norm (moments_K (kx, ky, A_PAR));
487
541
if (rhoI < smallRhoI) {
488
- e.kinetic += factor * kPerp2 (kx, ky) * std::norm (phi_K (kx, ky));
542
+ e.kinetic += factor * g. kPerp2 (kx, ky) * std::norm (phi_K (kx, ky));
489
543
} else {
490
- e.kinetic -= factor * 1.0 / (rhoI * rhoI) * ( Gamma0 ( kPerp2 (kx, ky) * rhoI * rhoI / 2.0 ) - 1 ) *
491
- std::norm (phi_K (kx, ky));
544
+ e.kinetic -= factor * 1.0 / (rhoI * rhoI) *
545
+ ( Gamma0 (g. kPerp2 (kx, ky) * rhoI * rhoI / 2.0 ) - 1 ) * std::norm (phi_K (kx, ky));
492
546
}
493
547
});
494
548
0 commit comments