55
66#include < hydroc/simulation_exporter.h>
77#include < hydroc/h5_writer.h>
8+ #include < hydroc/wave_types.h>
89#include < hydroc/version.h>
910#include < hydroc/logging.h>
1011
@@ -81,6 +82,8 @@ struct SimulationExporter::Impl {
8182 H5Writer::Group g_results_model_tsdas;
8283 H5Writer::Group g_results_model_rsdas;
8384 H5Writer::Group g_results_model_joints;
85+ // irregular waves datasets (inputs)
86+ H5Writer::Group g_inputs_waves_irregular;
8487 // meta subtree
8588 H5Writer::Group g_meta;
8689
@@ -184,6 +187,7 @@ struct SimulationExporter::Impl {
184187 g_inputs_sim_time = writer.RequireGroup (" /inputs/simulation/time" );
185188 g_inputs_sim_env = writer.RequireGroup (" /inputs/simulation/environment" );
186189 g_inputs_sim_waves = writer.RequireGroup (" /inputs/simulation/waves" );
190+ g_inputs_waves_irregular = writer.RequireGroup (" /inputs/simulation/waves/irregular" );
187191 // results
188192 g_results = writer.RequireGroup (" /results" );
189193 g_results_model = writer.RequireGroup (" /results/model" );
@@ -347,6 +351,7 @@ void SimulationExporter::WriteSimulationInfo(chrono::ChSystem* system,
347351 g_waves.WriteAttribute (" Hs" , impl_->options .scenario_Hs );
348352 g_waves.WriteAttribute (" Tp" , impl_->options .scenario_Tp );
349353 if (impl_->options .scenario_seed >= 0 ) g_waves.WriteAttribute (" seed" , static_cast <double >(impl_->options .scenario_seed ));
354+ // Group already reserved in ctor; datasets will be written later if available
350355 }
351356}
352357
@@ -357,6 +362,36 @@ void SimulationExporter::WriteInitialConditions(chrono::ChSystem* ,
357362 double ) {
358363 // Deprecated in schema v0.3: handled in WriteSimulationInfo under inputs/simulation/*
359364}
365+ void SimulationExporter::WriteIrregularInputs (const std::vector<double >& frequencies_hz,
366+ const std::vector<double >& spectral_densities,
367+ const std::vector<double >& free_surface_time,
368+ const std::vector<double >& free_surface_eta) {
369+ auto g = impl_->g_inputs_waves_irregular ;
370+ // Write datasets if provided (skip empty vectors)
371+ if (!frequencies_hz.empty ()) {
372+ std::array<hsize_t ,1 > d1 = {static_cast <hsize_t >(frequencies_hz.size ())};
373+ g.WriteDataset (" frequencies_hz" , frequencies_hz, d1);
374+ g.WriteAttribute (" frequencies_hz.units" , std::string (" Hz" ));
375+ }
376+ if (!spectral_densities.empty ()) {
377+ std::array<hsize_t ,1 > d1 = {static_cast <hsize_t >(spectral_densities.size ())};
378+ g.WriteDataset (" spectral_densities" , spectral_densities, d1);
379+ g.WriteAttribute (" spectral_densities.units" , std::string (" m^2/Hz" ));
380+ g.WriteAttribute (" spectral_densities.convention" , std::string (" JONSWAP (if gamma>1), else PM" ));
381+ }
382+ if (!free_surface_time.empty ()) {
383+ std::array<hsize_t ,1 > d1 = {static_cast <hsize_t >(free_surface_time.size ())};
384+ g.WriteDataset (" free_surface_time" , free_surface_time, d1);
385+ g.WriteAttribute (" free_surface_time.units" , std::string (" s" ));
386+ }
387+ if (!free_surface_eta.empty ()) {
388+ std::array<hsize_t ,1 > d1 = {static_cast <hsize_t >(free_surface_eta.size ())};
389+ g.WriteDataset (" free_surface_eta" , free_surface_eta, d1);
390+ g.WriteAttribute (" free_surface_eta.units" , std::string (" m" ));
391+ g.WriteAttribute (" free_surface_eta.location" , std::string (" x=0,y=0,z=0 (assumed)" ));
392+ }
393+ }
394+
360395
361396void SimulationExporter::WriteModel (chrono::ChSystem* system) {
362397 if (system == nullptr ) {
0 commit comments