@@ -346,6 +346,14 @@ class Elm_6f : public PhysicsModel {
346346 BoutReal hyperviscos; // Hyper-viscosity (radial)
347347 Field3D hyper_mu_x; // Hyper-viscosity coefficient
348348
349+ // / Perpendicular diffusion coefficients.
350+ // / These were not part of the original model but were added for numerical
351+ // / stabilization purposes of turbulence simulations.
352+ bool perpendicular_diffusion; // Include perpendicular diffusion?
353+ Field3D diff_perp_Ni, diff_perp_Ti, diff_perp_Te;
354+ Field3D diff_perp_U, diff_perp_Vipar;
355+
356+
349357 // / position filter
350358 bool pos_filter, pos_filter2, keep_zonalPF;
351359 BoutReal filter_position_ni, filter_position_ti, filter_position_te;
@@ -1559,6 +1567,19 @@ class Elm_6f : public PhysicsModel {
15591567 neoclassic_e = options[" neoclassic_e" ].doc (" switch for electron neoclassical transport" ).withDefault (false );
15601568 epsilon = options[" epsilon" ].withDefault (0.2 ); // the value of reverse aspect ratio
15611569
1570+ perpendicular_diffusion = options[" perpendicular_diffusion" ].doc (" include perpendicular diffusion?" ).withDefault (false );
1571+ diff_perp_Ni = options[" diff_perp_Ni" ]
1572+ .doc (" 2nd order perpendicular diffusion for Ni in [m^2/s]" ).withDefault (0.0 );
1573+ diff_perp_Ti = options[" diff_perp_Ti" ]
1574+ .doc (" 2nd order perpendicular diffusion for Ti in [m^2/s]" ).withDefault (0.0 );
1575+ diff_perp_Te = options[" diff_perp_Te" ]
1576+ .doc (" 2nd order perpendicular diffusion for Te in [m^2/s]" ).withDefault (0.0 );
1577+ diff_perp_U = options[" diff_perp_U" ]
1578+ .doc (" 2nd order perpendicular diffusion for U in [m^2/s]" ).withDefault (0.0 );
1579+ diff_perp_Vipar = options[" diff_perp_Vipar" ]
1580+ .doc (" 2nd order perpendicular diffusion for Vipar in [m^2/s]" ).withDefault (0.0 );
1581+
1582+
15621583 // output terms
15631584 output_Teterms = options[" output_Teterms" ].withDefault (false );
15641585 output_Titerms = options[" output_Titerms" ].withDefault (false );
@@ -1912,6 +1933,20 @@ class Elm_6f : public PhysicsModel {
19121933 dump.add (hyperdiff_perp_u4, " hyperdiff_perp_u4" , 0 );
19131934 }
19141935
1936+ if (perpendicular_diffusion > 0.0 ) {
1937+ output.write (" Including perpendicular diffusion. \n " );
1938+ // STORM var: SAVE_ONCE(mu_n0, mu_vort0, nu_parallel0, kappa0_perp, diff_perp_U, diff_perp_V);
1939+
1940+ diff_perp_Ni /= Lbar * Va;
1941+ diff_perp_Ti /= Lbar * Va;
1942+ diff_perp_Te /= Lbar * Va;
1943+ diff_perp_U /= Lbar * Va;
1944+ diff_perp_Vipar /= Lbar * Va;
1945+
1946+ SAVE_ONCE (diff_perp_Ni, diff_perp_Ti, diff_perp_Te, diff_perp_U, diff_perp_Vipar);
1947+ }
1948+
1949+
19151950 if (sink_vp > 0.0 ) {
19161951 output.write (" sink_vp(rate): {:e}\n " , sink_vp);
19171952 dump.add (sink_vp, " sink_vp" , 1 );
@@ -4458,6 +4493,7 @@ class Elm_6f : public PhysicsModel {
44584493 // ddt(Psi) += hyperresist * Delp2(Jpar / B0);
44594494 ddt (Apar) += hyperresist * Delp2 (Jpar);
44604495 }
4496+
44614497 }
44624498 } else { // emass
44634499
@@ -4765,6 +4801,11 @@ class Elm_6f : public PhysicsModel {
47654801 }
47664802 }
47674803
4804+ if (perpendicular_diffusion > 0.0 ) {
4805+ ddt (U) += diff_perp_U * Delp2 (U);
4806+ // ddt(U) += Grad_perp(diff_perp_U) * Grad_perp(U);
4807+ }
4808+
47684809 // left edge sink terms
47694810 if (sink_Ul > 0.0 ) {
47704811 ddt (U) -= sink_Ul * sink_tanhxl (P0, U, su_widthl, su_lengthl); // core sink
@@ -4890,6 +4931,12 @@ class Elm_6f : public PhysicsModel {
48904931 tmpN2.applyBoundary ();
48914932 ddt (Ni) -= hyperdiff_perp_n4 * Delp2 (tmpN2);
48924933 }
4934+
4935+ if (perpendicular_diffusion > 0.0 ) {
4936+ ddt (Ni) += diff_perp_Ni * Delp2 (Ni);
4937+ // ddt(Ni) += Grad_perp(diff_perp_Ni) * Grad_perp(Ni);
4938+ }
4939+
48934940 }
48944941
48954942
@@ -5085,6 +5132,12 @@ class Elm_6f : public PhysicsModel {
50855132 tmpTi2.applyBoundary ();
50865133 ddt (Ti) -= hyperdiff_perp_ti4 * Delp2 (tmpTi2);
50875134 }
5135+
5136+ if (perpendicular_diffusion > 0.0 ) {
5137+ ddt (Ti) += diff_perp_Ti * Delp2 (Ti);
5138+ // ddt(Ti) += Grad_perp(diff_perp_Ti) * Grad_perp(Ti);
5139+ }
5140+
50885141 }
50895142
50905143 // ////////////////////////////////////////////////////////////////
@@ -5301,6 +5354,11 @@ class Elm_6f : public PhysicsModel {
53015354 ddt (Te) -= hyperdiff_perp_te4 * Delp2 (tmpTe2);
53025355 }
53035356
5357+ if (perpendicular_diffusion > 0.0 ) {
5358+ ddt (Te) += diff_perp_Te * Delp2 (Te);
5359+ // ddt(Te) += Grad_perp(diff_perp_Te) * Grad_perp(Te);
5360+ }
5361+
53045362 // right edge sink terms
53055363 if (sink_Ter > 0.0 ) {
53065364 ddt (Te) -= sink_Ter * sink_tanhxr (Te0, Te, ste_widthr, ste_lengthr); // sol sink
@@ -5419,6 +5477,11 @@ class Elm_6f : public PhysicsModel {
54195477 ddt (Vipar) -= hyperdiff_perp_v4 * Delp2 (tmpVp2);
54205478 }
54215479
5480+ if (perpendicular_diffusion > 0.0 ) {
5481+ ddt (Vipar) += diff_perp_Vipar * Delp2 (Vipar);
5482+ // ddt(Vipar) += Grad_perp(diff_perp_Vipar) * Grad_perp(Vipar);
5483+ }
5484+
54225485 if (sink_vp > 0.0 ) {
54235486 if (include_vpar0){
54245487 ddt (Vipar) -= sink_vp * sink_tanhxl (Vipar0, Vipar, sp_width, sp_length); // sink
0 commit comments