Skip to content

Commit e40bf4e

Browse files
committed
Compute jxb_gradp (and related quantities) even if VMEC did not converge.
1 parent 6e5e281 commit e40bf4e

3 files changed

Lines changed: 12 additions & 3 deletions

File tree

src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,8 @@ vmecpp::OutputQuantities vmecpp::ComputeOutputQuantities(
12511251
models_from_threads, radial_profiles);
12521252

12531253
if (vmec_status == VmecStatus::NORMAL_TERMINATION ||
1254-
vmec_status == VmecStatus::SUCCESSFUL_TERMINATION) {
1254+
vmec_status == VmecStatus::SUCCESSFUL_TERMINATION ||
1255+
indata.return_outputs_even_if_not_converged) {
12551256
MeshBledingBSubZeta(
12561257
s, fc,
12571258
/*m_vmec_internal_results=*/output_quantities.vmec_internal_results);
@@ -1314,6 +1315,7 @@ vmecpp::OutputQuantities vmecpp::ComputeOutputQuantities(
13141315
output_quantities.jxbout = ComputeJxBOutputFileContents(
13151316
s, fc, output_quantities.vmec_internal_results,
13161317
output_quantities.bsubs_full, output_quantities.covariant_b_derivatives,
1318+
indata.return_outputs_even_if_not_converged,
13171319
vmec_status);
13181320

13191321
if (checkpoint == VmecCheckpoint::JXBOUT) {
@@ -2360,6 +2362,7 @@ vmecpp::JxBOutFileContents vmecpp::ComputeJxBOutputFileContents(
23602362
const VmecInternalResults& vmec_internal_results,
23612363
const BSubSFull& bsubs_full,
23622364
const CovariantBDerivatives& covariant_b_derivatives,
2365+
const bool return_outputs_even_if_not_converged,
23632366
VmecStatus vmec_status) {
23642367
JxBOutFileContents jxbout;
23652368

@@ -2598,7 +2601,7 @@ vmecpp::JxBOutFileContents vmecpp::ComputeJxBOutputFileContents(
25982601
jxbout.jperp2[jF] = dnorm1 * tjnorm * average_jperp2;
25992602

26002603
// Some quantities are only computed if VMEC++ actually converged.
2601-
if (vmec_status == VmecStatus::SUCCESSFUL_TERMINATION) {
2604+
if (vmec_status == VmecStatus::SUCCESSFUL_TERMINATION || return_outputs_even_if_not_converged) {
26022605
// normalized toroidal magnetic flux
26032606
jxbout.phin[jF] = vmec_internal_results.phiF[jF] /
26042607
vmec_internal_results.phiF[fc.ns - 1];
@@ -2635,7 +2638,7 @@ vmecpp::JxBOutFileContents vmecpp::ComputeJxBOutputFileContents(
26352638
} // jF
26362639

26372640
// Some quantities are only computed if VMEC++ actually converged.
2638-
if (vmec_status == VmecStatus::SUCCESSFUL_TERMINATION) {
2641+
if (vmec_status == VmecStatus::SUCCESSFUL_TERMINATION || return_outputs_even_if_not_converged) {
26392642
// The loop in jxbforce.f90:594 goes over js=2,ns1,
26402643
// which means that the last half-grid point is not touched.
26412644
for (int jH = 0; jH < vmec_internal_results.num_half - 1; ++jH) {

src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,7 @@ JxBOutFileContents ComputeJxBOutputFileContents(
13311331
const VmecInternalResults& vmec_internal_results,
13321332
const BSubSFull& bsubs_full,
13331333
const CovariantBDerivatives& covariant_b_derivatives,
1334+
const bool return_outputs_even_if_not_converged,
13341335
VmecStatus vmec_status);
13351336

13361337
MercierStabilityIntermediateQuantities ComputeIntermediateMercierQuantities(

tests/test_init.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ def test_get_outputs_if_non_converged_if_wanted():
5555
assert vmec_output.wout is not None
5656
assert vmec_output.wout.niter == 2
5757

58+
# actually check that some arrays,
59+
# which were previously only filled if VMEC converged,
60+
# also get populated now
61+
assert not np.all(out.jxbout.jxb_gradp == 0.0)
62+
5863

5964
# We trust the C++ tests to cover the hot restart functionality properly,
6065
# here we just want to test that the Python API for it works.

0 commit comments

Comments
 (0)