@@ -267,6 +267,125 @@ TEST(TestVmecINDATA, CheckParsingSolovevAnalytical) {
267267 }
268268} // CheckParsingSolovevAnalytical
269269
270+
271+ TEST (TestVmecINDATA, CheckParsingSolovevFreeBdy) {
272+ absl::StatusOr<std::string> indata_json =
273+ ReadFile (" vmecpp_large_cpp_tests/test_data/solovev_free_bdy.json" );
274+ ASSERT_TRUE (indata_json.ok ()) << indata_json.status ().message ();
275+
276+ const absl::StatusOr<VmecINDATA> vmec_indata =
277+ VmecINDATA::FromJson (*indata_json);
278+ ASSERT_TRUE (vmec_indata.ok ());
279+
280+ // numerical resolution, symmetry assumption
281+ EXPECT_EQ (vmec_indata->lasym , false );
282+ EXPECT_EQ (vmec_indata->nfp , 1 );
283+ EXPECT_EQ (vmec_indata->mpol , 6 );
284+ EXPECT_EQ (vmec_indata->ntor , 0 );
285+ EXPECT_EQ (vmec_indata->ntheta , 0 );
286+ EXPECT_EQ (vmec_indata->nzeta , 0 );
287+
288+ // multi-grid steps
289+ EXPECT_THAT (vmec_indata->ns_array , ElementsAre (5 , 11 , 55 ));
290+ EXPECT_THAT (vmec_indata->ftol_array , ElementsAre (1.0e-12 , 1.0e-12 , 1.0e-12 ));
291+ EXPECT_THAT (vmec_indata->niter_array , ElementsAre (1000 , 2000 , 2000 ));
292+
293+ // global physics parameters
294+ EXPECT_EQ (vmec_indata->phiedge , 1.0 );
295+ EXPECT_EQ (vmec_indata->ncurr , 0 );
296+
297+ // mass / pressure profile
298+ EXPECT_EQ (vmec_indata->pmass_type , " power_series" );
299+ EXPECT_THAT (vmec_indata->am , ElementsAre (0.125 , -0.125 ));
300+ EXPECT_EQ (vmec_indata->am_aux_s .size (), 0 );
301+ EXPECT_EQ (vmec_indata->am_aux_f .size (), 0 );
302+ EXPECT_EQ (vmec_indata->pres_scale , 1.0 );
303+ EXPECT_EQ (vmec_indata->gamma , 0.0 );
304+ EXPECT_EQ (vmec_indata->spres_ped , 1.0 );
305+
306+ // (initial guess for) iota profile
307+ EXPECT_EQ (vmec_indata->piota_type , " power_series" );
308+ EXPECT_THAT (vmec_indata->ai , ElementsAre (1.0 ));
309+ EXPECT_EQ (vmec_indata->ai_aux_s .size (), 0 );
310+ EXPECT_EQ (vmec_indata->ai_aux_f .size (), 0 );
311+
312+ // enclosed toroidal current profile
313+ EXPECT_EQ (vmec_indata->pcurr_type , " power_series" );
314+ EXPECT_EQ (vmec_indata->ac .size (), 0 );
315+ EXPECT_EQ (vmec_indata->ac_aux_s .size (), 0 );
316+ EXPECT_EQ (vmec_indata->ac_aux_f .size (), 0 );
317+ EXPECT_EQ (vmec_indata->curtor , 0.0 );
318+ EXPECT_EQ (vmec_indata->bloat , 1.0 );
319+
320+ // free-boundary parameters
321+ EXPECT_EQ (vmec_indata->lfreeb , true );
322+ EXPECT_EQ (vmec_indata->mgrid_file , " vmecpp_large_cpp_tests/mgrid_solovev.nc" );
323+ EXPECT_THAT (vmec_indata->extcur , ElementsAre (3884526.409876309 ,
324+ -293557.7123737952 ,
325+ -17348.51853677043 ,
326+ 60021.3701697316 ,
327+ 60025.40940490887 ,
328+ -17349.93103183817 ,
329+ -293553.153630851 ,
330+ -356063.9108717275 ,
331+ -65884.34719283084 ,
332+ -11543.87774712987 ,
333+ -11535.46510755219 ,
334+ -65883.00858364606 ,
335+ -356058.9388468855 ));
336+ EXPECT_EQ (vmec_indata->nvacskip , 6 );
337+
338+ // tweaking parameters
339+ EXPECT_EQ (vmec_indata->nstep , 250 );
340+ EXPECT_THAT (vmec_indata->aphi , ElementsAre (1.0 ));
341+ EXPECT_EQ (vmec_indata->delt , 0.9 );
342+ EXPECT_EQ (vmec_indata->tcon0 , 1.0 );
343+ EXPECT_EQ (vmec_indata->lforbal , false );
344+
345+ // initial guess for magnetic axis
346+ absl::StatusOr<std::string> axis_coefficients_csv =
347+ ReadFile (" vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_free_bdy.csv" );
348+ ASSERT_TRUE (axis_coefficients_csv.ok ());
349+
350+ absl::StatusOr<CurveRZFourier> axis_coefficients =
351+ CurveRZFourierFromCsv (*axis_coefficients_csv);
352+ ASSERT_TRUE (axis_coefficients.ok ());
353+ EXPECT_THAT (vmec_indata->raxis_c ,
354+ ElementsAreArray (*CoefficientsRCos (*axis_coefficients)));
355+ EXPECT_THAT (vmec_indata->zaxis_s ,
356+ ElementsAreArray (*CoefficientsZSin (*axis_coefficients)));
357+ if (vmec_indata->lasym ) {
358+ EXPECT_THAT (*vmec_indata->raxis_s ,
359+ ElementsAreArray (*CoefficientsRSin (*axis_coefficients)));
360+ EXPECT_THAT (*vmec_indata->zaxis_c ,
361+ ElementsAreArray (*CoefficientsZCos (*axis_coefficients)));
362+ } else {
363+ EXPECT_FALSE (vmec_indata->raxis_s .has_value ());
364+ EXPECT_FALSE (vmec_indata->zaxis_c .has_value ());
365+ }
366+
367+ // (initial guess for) boundary shape
368+ absl::StatusOr<std::string> boundary_coefficients_csv =
369+ ReadFile (" vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_free_bdy.csv" );
370+ ASSERT_TRUE (boundary_coefficients_csv.ok ());
371+ absl::StatusOr<SurfaceRZFourier> boundary_coefficients =
372+ SurfaceRZFourierFromCsv (*boundary_coefficients_csv);
373+ ASSERT_TRUE (boundary_coefficients.ok ());
374+ EXPECT_THAT (vmec_indata->rbc .transpose ().reshaped (),
375+ ElementsAreArray (*CoefficientsRCos (*boundary_coefficients)));
376+ EXPECT_THAT (vmec_indata->zbs .transpose ().reshaped (),
377+ ElementsAreArray (*CoefficientsZSin (*boundary_coefficients)));
378+ if (vmec_indata->lasym ) {
379+ EXPECT_THAT (vmec_indata->rbs ->transpose ().reshaped (),
380+ ElementsAreArray (*CoefficientsRSin (*boundary_coefficients)));
381+ EXPECT_THAT (vmec_indata->zbc ->transpose ().reshaped (),
382+ ElementsAreArray (*CoefficientsZCos (*boundary_coefficients)));
383+ } else {
384+ EXPECT_FALSE (vmec_indata->rbs .has_value ());
385+ EXPECT_FALSE (vmec_indata->zbc .has_value ());
386+ }
387+ } // CheckParsingSolovevFreeBdy
388+
270389TEST (TestVmecINDATA, CheckParsingSolovevNoAxis) {
271390 absl::StatusOr<std::string> indata_json =
272391 ReadFile (" vmecpp/test_data/solovev_no_axis.json" );
0 commit comments