@@ -4139,7 +4139,146 @@ namespace GEO {
41394139 }
41404140
41414141 };
4142-
4142+
4143+ /* ***********************************************************************/
4144+
4145+ /* *
4146+ * \brief Mesh IO Handler for OpenVolumeMesh file format.
4147+ * \details Saves a polyhedral mesh stored in a surfacic mesh that
4148+ * has all cell boundaries and a vertex_id vertex attribute and cell_id
4149+ * facet attribute. Note: the implementation is pretty inefficient (uses
4150+ * tables).
4151+ */
4152+ class FluentIOHandler : public MeshIOHandler {
4153+ private:
4154+ enum {
4155+ XF_COMMENT = 0 ,
4156+ XF_HEADER = 1 ,
4157+ XF_DIMENSION = 2 ,
4158+ XF_NODE = 10 ,
4159+ XF_CELL = 12
4160+ };
4161+ public:
4162+ /* *
4163+ * \copydoc MeshIOHandler::load()
4164+ */
4165+ virtual bool load (
4166+ const std::string& filename, Mesh& M,
4167+ const MeshIOFlags& ioflags
4168+ ) {
4169+ geo_argused (filename);
4170+ geo_argused (M);
4171+ geo_argused (ioflags);
4172+ Logger::err (" I/O" )
4173+ << " load() not implemented yet for Fluent file format"
4174+ << std::endl;
4175+ return false ;
4176+ }
4177+
4178+ /* *
4179+ * \copydoc MeshIOHandler::save()
4180+ */
4181+ virtual bool save (
4182+ const Mesh& M, const std::string& filename,
4183+ const MeshIOFlags& ioflags = MeshIOFlags()
4184+ ) {
4185+ geo_argused (ioflags);
4186+ std::ofstream out (filename.c_str ());
4187+ if (!out) {
4188+ Logger::err (" I/O" )
4189+ << " save(): could not create file: " << filename
4190+ << std::endl;
4191+ return false ;
4192+ }
4193+
4194+ /* ************************************************************/
4195+
4196+ out << " ("
4197+ << XF_HEADER
4198+ << " \" Geogram/Vorpaline"
4199+ << " ver:" << Environment::instance ()->get_value (" version" )
4200+ << " rel:" << Environment::instance ()->get_value (" release_date" )
4201+ << " SVN:" << Environment::instance ()->get_value (" SVN revision" )
4202+ << " \" )"
4203+ << std::endl;
4204+
4205+ std::vector<std::string> args;
4206+ CmdLine::get_args (args);
4207+ for (index_t i=0 ; i<index_t (args.size ()); ++i) {
4208+ out << " ("
4209+ << XF_COMMENT
4210+ << " \" CmdLine:"
4211+ << args[i]
4212+ << " \" )"
4213+ << std::endl;
4214+ }
4215+
4216+ index_t dim = M.vertices .dimension ();
4217+ if (dim > 3 ) {
4218+ dim = 3 ;
4219+ }
4220+
4221+ out << " ("
4222+ << XF_DIMENSION
4223+ << " "
4224+ << dim
4225+ << " )"
4226+ << std::endl;
4227+
4228+ /* ************************************************************/
4229+
4230+ // Declare the total number of nodes
4231+ out << " ("
4232+ << XF_NODE
4233+ << " ("
4234+ << 0 << " " // zone-id
4235+ << 1 << " " // first index
4236+
4237+ << std::hex
4238+ << M.vertices .nb () // last index in hexa (?!?)
4239+ << std::dec << " "
4240+
4241+ << 0 << " " // type
4242+ << " ))"
4243+ << std::endl;
4244+
4245+ // Now declare a zone with nodes.
4246+ out << " ("
4247+ << XF_NODE
4248+ << " ("
4249+ << 1 << " " // zone-id
4250+ << 1 << " " // first index
4251+
4252+ << std::hex
4253+ << M.vertices .nb () // last index in hexa (?!?)
4254+ << std::dec << " "
4255+
4256+ << 1 << " " // type
4257+ << dim << " " // ND
4258+ << " )("
4259+ << std::endl;
4260+
4261+ for (index_t v=0 ; v<M.vertices .nb (); ++v) {
4262+ double point[3 ];
4263+ get_mesh_point (M, v, point, dim);
4264+ for (index_t i=0 ; i<dim; ++i) {
4265+ out << point[i] << " " ;
4266+ }
4267+ out << std::endl;
4268+ }
4269+
4270+ out << " ))" << std::endl;
4271+
4272+ /* ************************************************************/
4273+
4274+
4275+
4276+ /* ************************************************************/
4277+
4278+ return true ;
4279+ }
4280+ private:
4281+ };
41434282
41444283}
41454284
@@ -4329,6 +4468,7 @@ namespace GEO {
43294468 geo_register_MeshIOHandler_creator (PDBIOHandler, " pdb" );
43304469 geo_register_MeshIOHandler_creator (PDBIOHandler, " pdb1" );
43314470 geo_register_MeshIOHandler_creator (OVMIOHandler, " ovm" );
4471+ geo_register_MeshIOHandler_creator (FluentIOHandler, " msh" );
43324472 }
43334473
43344474
0 commit comments