diff --git a/Sources/Model/Model.hpp b/Sources/Model/Model.hpp index 8bbec718cadc3fe8f6c5ecd71893dae821f8c393..5357ec49998d25c1ff3709408650a14420be4bf8 100644 --- a/Sources/Model/Model.hpp +++ b/Sources/Model/Model.hpp @@ -96,12 +96,15 @@ namespace MoReFEM * \param[in] mpi Object in charge of mpi. * \copydoc doxygen_hide_input_parameter_data_arg * \param[in] a_create_domain_list_for_coords Whether the model will compute the list of domains a coord is in or not. - * + * \param[in] additional_subdir If some additional subdirectories are required, add here the subdirectories to + * be created. For instance, if additional_subdir is { "foo", "bar" }, output directory will be set to + * #output directory read from input file#/foo/bar. */ template<class InputParameterDataT> explicit Model(const Wrappers::Mpi& mpi, const InputParameterDataT& input_parameter_data, - create_domain_list_for_coords a_create_domain_list_for_coords = create_domain_list_for_coords::no); + create_domain_list_for_coords a_create_domain_list_for_coords = create_domain_list_for_coords::no, + std::vector<std::string>&& additional_subdir = {}); //! Destructor. @@ -276,7 +279,12 @@ namespace MoReFEM //! Transient parameters. TimeManager::unique_ptr time_manager_ = nullptr; - //! Output directory. + /*! + * \brief Output directory. + * + * In most cases it is the path read in the input parameter file, but in some models some supplementary data + * might have been added. + */ std::string output_directory_; //! Files will be written every \a display_value_ time iteration. Choose 1 to write all of them. diff --git a/Sources/Model/Model.hxx b/Sources/Model/Model.hxx index ca695b6e76eb7d63be9e900492e33fb79443f1ff..f468f085a77eb65476da84e2b0309d54dbd227b2 100644 --- a/Sources/Model/Model.hxx +++ b/Sources/Model/Model.hxx @@ -19,9 +19,11 @@ namespace MoReFEM template<class DerivedT, DoConsiderProcessorWiseLocal2Global DoConsiderProcessorWiseLocal2GlobalT> template<class InputParameterDataT> - Model<DerivedT, DoConsiderProcessorWiseLocal2GlobalT>::Model(const Wrappers::Mpi& a_mpi, - const InputParameterDataT& input_parameter_data, - create_domain_list_for_coords a_create_domain_list_for_coords) + Model<DerivedT, DoConsiderProcessorWiseLocal2GlobalT> + ::Model(const Wrappers::Mpi& a_mpi, + const InputParameterDataT& input_parameter_data, + create_domain_list_for_coords a_create_domain_list_for_coords, + std::vector<std::string>&& additional_subdir) : Crtp::CrtpMpi<Model<DerivedT, DoConsiderProcessorWiseLocal2GlobalT>>(a_mpi) { if (a_create_domain_list_for_coords == create_domain_list_for_coords::yes) @@ -54,7 +56,21 @@ namespace MoReFEM const auto& mpi = this->GetMpi(); - output_directory_ = IPL::Extract<Result::OutputDirectory>::Folder(input_parameter_data); + { + output_directory_ = IPL::Extract<Result::OutputDirectory>::Folder(input_parameter_data); + + if (!additional_subdir.empty()) + { + for (const auto& subdir : additional_subdir) + { + output_directory_ += '/'; + output_directory_ += subdir; + } + + if (!FilesystemNS::Folder::DoExist(output_directory_)) + FilesystemNS::Folder::Create(output_directory_, __FILE__, __LINE__); + } + } if (mpi.IsRootProcessor()) { diff --git a/ThirdPartyXCodeProjects/Seldon.xcodeproj/xcuserdata/sebastien.xcuserdatad/xcschemes/xcschememanagement.plist b/ThirdPartyXCodeProjects/Seldon.xcodeproj/xcuserdata/sebastien.xcuserdatad/xcschemes/xcschememanagement.plist index 4a8d8dd4a219bf3b1d683ed91717311c9ccf5de4..a862f6a3a0374831378566f43746b894610f32c0 100644 --- a/ThirdPartyXCodeProjects/Seldon.xcodeproj/xcuserdata/sebastien.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ThirdPartyXCodeProjects/Seldon.xcodeproj/xcuserdata/sebastien.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,7 +9,7 @@ <key>isShown</key> <false/> <key>orderHint</key> - <integer>0</integer> + <integer>10</integer> </dict> </dict> <key>SuppressBuildableAutocreation</key>