@@ -170,6 +170,7 @@ YAMLHydroData ReadHydroYAML(const std::string& hydro_file_path) {
170170 bool in_conv_taper = false ;
171171 bool in_conv_diag = false ;
172172 bool in_body = false ;
173+ bool in_moordyn = false ;
173174 HydroBody current_body;
174175 int line_number = 0 ;
175176
@@ -294,6 +295,22 @@ YAMLHydroData ReadHydroYAML(const std::string& hydro_file_path) {
294295 in_bodies = false ;
295296 in_waves = false ;
296297 in_body = false ;
298+ in_moordyn = false ;
299+ in_conv_smoothing = in_conv_taper = in_conv_diag = false ;
300+ continue ;
301+ }
302+
303+ if (indent == 2 && trimmed == " moordyn:" ) {
304+ if (in_body && !current_body.name .empty ()) {
305+ data.bodies .push_back (current_body);
306+ }
307+ in_moordyn = true ;
308+ in_bodies = false ;
309+ in_waves = false ;
310+ in_radiation = false ;
311+ in_radiation_state_space = false ;
312+ in_convolution = false ;
313+ in_body = false ;
297314 in_conv_smoothing = in_conv_taper = in_conv_diag = false ;
298315 continue ;
299316 }
@@ -577,6 +594,35 @@ YAMLHydroData ReadHydroYAML(const std::string& hydro_file_path) {
577594 } else if (!in_period_block && key_lower == " seed" ) {
578595 try { data.waves .seed = std::stoi (value); } catch (...) { data.waves .seed = -1 ; }
579596 }
597+ } else if (in_moordyn) {
598+ std::string key_lower = key;
599+ std::transform (key_lower.begin (), key_lower.end (), key_lower.begin (), ::tolower);
600+ if (key_lower == " enabled" ) {
601+ std::string val_lower = value;
602+ std::transform (val_lower.begin (), val_lower.end (), val_lower.begin (), ::tolower);
603+ data.moordyn_enabled = (val_lower == " true" || val_lower == " 1" || val_lower == " yes" );
604+ } else if (key_lower == " input_file" ) {
605+ data.moordyn_input_file = value;
606+ } else if (key_lower == " bodies" ) {
607+ // Parse [body1, body2] list
608+ std::string list_str = value;
609+ // Strip brackets
610+ size_t lb = list_str.find (' [' );
611+ size_t rb = list_str.find (' ]' );
612+ if (lb != std::string::npos && rb != std::string::npos && rb > lb) {
613+ list_str = list_str.substr (lb + 1 , rb - lb - 1 );
614+ }
615+ // Split by commas
616+ std::istringstream iss (list_str);
617+ std::string token;
618+ while (std::getline (iss, token, ' ,' )) {
619+ token.erase (0 , token.find_first_not_of (" \t " ));
620+ token.erase (token.find_last_not_of (" \t " ) + 1 );
621+ if (!token.empty ()) {
622+ data.moordyn_body_names .push_back (token);
623+ }
624+ }
625+ }
580626 }
581627 }
582628 }
0 commit comments