1 // File : FrontTrack.cxx
2 // Created : Tue Apr 25 17:20:28 2017
3 // Author : Edward AGAPOV (eap)
5 #include "FrontTrack.hxx"
6 #include "FrontTrack_NodeGroups.hxx"
7 #include "FrontTrack_Utils.hxx"
10 #include <MEDCouplingMemArray.hxx>
11 #include <MEDFileMesh.hxx>
13 #include <XAO_Xao.hxx>
14 #include <XAO_BrepGeometry.hxx>
18 #include <OSD_Parallel.hxx>
21 * \brief Relocate nodes to lie on geometry
22 * \param [in] theInputMedFile - a MED file holding a mesh including nodes that will be
23 * moved onto the geometry
24 * \param [in] theOutputMedFile - a MED file to create, that will hold a modified mesh
25 * \param [in] theNodeFiles - an array of names of files describing groups of nodes that
26 * will be moved onto the geometry
27 * \param [in] theXaoFileName - a path to a file in XAO format holding the geometry and
28 * the geometrical groups.
29 * \param [in] theIsParallel - if \c true, all processors are used to treat boundary shapes
32 void FrontTrack::track( const std::string& theInputMedFile,
33 const std::string& theOutputMedFile,
34 const std::vector< std::string > & theNodeFiles,
35 const std::string& theXaoFileName,
40 if ( theNodeFiles.empty() )
44 std::cout << "Input MED file:" << theInputMedFile << std::endl;
46 if ( !FT_Utils::fileExists( theInputMedFile ))
47 throw std::invalid_argument( "Input MED file does not exist: " + theInputMedFile );
50 std::cout << "Output MED file:" << theOutputMedFile << std::endl;
52 if ( !FT_Utils::canWrite( theOutputMedFile ))
53 throw std::invalid_argument( "Can't create the output MED file: " + theOutputMedFile );
55 for ( size_t i = 0; i < theNodeFiles.size(); ++i )
58 std::cout << "Input node file:" << theNodeFiles[i] << std::endl;
60 if ( !FT_Utils::fileExists( theNodeFiles[i] ))
61 throw std::invalid_argument( "Input node file does not exist: " + theNodeFiles[i] );
65 std::cout << "XAO file:" << theXaoFileName << std::endl;
67 if ( !FT_Utils::fileExists( theXaoFileName ))
68 throw std::invalid_argument( "Input XAO file does not exist: " + theXaoFileName );
74 std::cout << "Lecture du maillage" << std::endl;
76 MEDCoupling::MCAuto< MEDCoupling::MEDFileUMesh >
77 mfMesh( MEDCoupling::MEDFileUMesh::New( theInputMedFile ));
78 if ( mfMesh.isNull() )
79 throw std::invalid_argument( "Failed to read the input MED file: " + theInputMedFile );
81 MEDCoupling::DataArrayDouble * nodeCoords = mfMesh->getCoords();
82 if ( !nodeCoords || nodeCoords->empty() )
83 throw std::invalid_argument( "No nodes in the input mesh" );
89 std::cout << "Lecture de la geometrie" << std::endl;
92 if ( !xao.importXAO( theXaoFileName ) || !xao.getGeometry() )
93 throw std::invalid_argument( "Failed to read the XAO input file: " + theXaoFileName );
96 std::cout << "Conversion en BREP" << std::endl;
98 XAO::BrepGeometry* xaoGeom = dynamic_cast<XAO::BrepGeometry*>( xao.getGeometry() );
99 if ( !xaoGeom || xaoGeom->getTopoDS_Shape().IsNull() )
100 throw std::invalid_argument( "Failed to get a BREP shape from the XAO input file" );
103 // read groups of nodes and associate them with boundary shapes using names (no projection so far)
106 std::cout << "Lecture des groupes" << std::endl;
108 FT_NodeGroups nodeGroups;
109 nodeGroups.read( theNodeFiles, &xao, nodeCoords );
111 std::cout << "Nombre de groupes : " << nodeGroups.nbOfGroups() << std::endl;
114 // project nodes to the boundary shapes and change their coordinates
117 std::cout << "Projection des noeuds, theIsParallel=" << theIsParallel << std::endl;
119 OSD_Parallel::For( 0, nodeGroups.nbOfGroups(), nodeGroups, !theIsParallel );
121 // save the modified mesh
124 std::cout << "Ecriture du maillage" << std::endl;
127 mfMesh->write( theOutputMedFile, /*mode=*/erase );
129 if ( !nodeGroups.isOK() )
130 throw std::runtime_error("Unable to project some nodes");