Skip to content

Commit dcf0423

Browse files
committed
Compute jxb_gradp (and related quantities) even if VMEC did not converge.
1 parent 1585d87 commit dcf0423

2 files changed

Lines changed: 10 additions & 3 deletions

File tree

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,9 +1250,11 @@ vmecpp::OutputQuantities vmecpp::ComputeOutputQuantities(
12501250
output_quantities.vmec_internal_results = GatherDataFromThreads(
12511251
sign_of_jacobian, s, fc, constants, radial_partitioning, decomposed_x,
12521252
models_from_threads, radial_profiles);
1253+
output_quantities.vmec_internal_results.return_outputs_even_if_not_converged = indata.return_outputs_even_if_not_converged;
12531254

12541255
if (vmec_status == VmecStatus::NORMAL_TERMINATION ||
1255-
vmec_status == VmecStatus::SUCCESSFUL_TERMINATION) {
1256+
vmec_status == VmecStatus::SUCCESSFUL_TERMINATION ||
1257+
output_quantities.vmec_internal_results.return_outputs_even_if_not_converged) {
12561258
MeshBledingBSubZeta(
12571259
s, fc,
12581260
/*m_vmec_internal_results=*/output_quantities.vmec_internal_results);
@@ -2599,7 +2601,7 @@ vmecpp::JxBOutFileContents vmecpp::ComputeJxBOutputFileContents(
25992601
jxbout.jperp2[jF] = dnorm1 * tjnorm * average_jperp2;
26002602

26012603
// Some quantities are only computed if VMEC++ actually converged.
2602-
if (vmec_status == VmecStatus::SUCCESSFUL_TERMINATION) {
2604+
if (vmec_status == VmecStatus::SUCCESSFUL_TERMINATION || vmec_internal_results.return_outputs_even_if_not_converged) {
26032605
// normalized toroidal magnetic flux
26042606
jxbout.phin[jF] = vmec_internal_results.phiF[jF] /
26052607
vmec_internal_results.phiF[fc.ns - 1];
@@ -2636,7 +2638,7 @@ vmecpp::JxBOutFileContents vmecpp::ComputeJxBOutputFileContents(
26362638
} // jF
26372639

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

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ namespace vmecpp {
2525
// This is the data from inside VMEC, gathered from all threads,
2626
// that form the basis of computing the output quantities.
2727
struct VmecInternalResults {
28+
// copy of corresponding VmecINDATA variable
29+
// if true, compute full outputs even if VMEC did not converge
30+
// defaults to false
31+
bool return_outputs_even_if_not_converged;
32+
2833
int sign_of_jacobian;
2934

3035
// total number of full-grid points

0 commit comments

Comments
 (0)