1 // Project MULTIPR, IOLS WP1.2.1 - EDF/CS
2 // Partitioning/decimation module for the SALOME v3.2 platform
7 * \brief C++ implementation of the CORBA interface of the MULTIPR module.
9 * \author Olivier LE ROUX - CS, Virtual Reality Dpt
15 //*****************************************************************************
17 //*****************************************************************************
19 #ifndef __MULTIPR_IMPLEMENTATION_CORBA__
20 #define __MULTIPR_IMPLEMENTATION_CORBA__
22 #include <SALOMEconfig.h>
23 #include CORBA_SERVER_HEADER(MULTIPR)
24 #include "SALOME_Component_i.hxx"
25 #include "Utils_CorbaException.hxx"
27 #include "MULTIPR_Obj.hxx"
30 //*****************************************************************************
31 // Class MULTIPR_Obj_i
32 // C++ implementation of the MULTIPR_Obj CORBA interface
33 // This class is a wrapper to encapsulate MULTIPR_Obj
34 //*****************************************************************************
37 public POA_MULTIPR_ORB::MULTIPR_Obj
44 * Associate a MED file (sequential or distributed) with this object.
45 * \param pMEDFilename MED file to be associated with this object.
47 MULTIPR_Obj_i(const char* pMEDFilename)
48 throw (SALOME::SALOME_Exception);
53 virtual ~MULTIPR_Obj_i();
55 //---------------------------------------------------------------------
56 // Basic accessors/mutators
57 //--------------------------------------------------------------------
60 * Returns true iff this obj represents a valid sequential MED file.
61 * \return true iff this obj represents a valid sequential MED file.
63 CORBA::Boolean isValidSequentialMEDFile()
64 throw (SALOME::SALOME_Exception);
67 * Returns true iff this obj represents a valid distributed MED file.
68 * \return true iff this obj represents a valid distributed MED file.
70 CORBA::Boolean isValidDistributedMEDFile()
71 throw (SALOME::SALOME_Exception);
74 * Returns the name of the associated MED file.
75 * \return the name of the associated MED file.
78 throw (SALOME::SALOME_Exception);
81 * Defines the mesh to be processed.
82 * \param pMeshName name of the mesh to be partitionned.
84 void setMesh(const char* pMeshName)
85 throw (SALOME::SALOME_Exception);
88 * Sets boxing parameters for decimation (100 by default).
89 * \param pBoxing number of cells along each axis of the grid (= acceleration structure) ; should be in [1..200].
91 void setBoxing(CORBA::Long pBoxing)
92 throw (SALOME::SALOME_Exception);
95 * Returns the list of meshes contained in the sequential MED file.
96 * Assumes this object encapsulates a sequential MED file.
97 * \return the list of meshes contained in the sequential MED file.
99 MULTIPR_ORB::string_array* getMeshes()
100 throw (SALOME::SALOME_Exception);
103 * Returns the list of fields contained in the sequential MED file.
104 * Assumes this object encapsulates a sequential MED file.
105 * \return the list of fields contained in the sequential MED file.
107 MULTIPR_ORB::string_array* getFields()
108 throw (SALOME::SALOME_Exception);
111 * Returns the number of timestamps for a given field.
112 * Assumes this object encapsulates a sequential MED file.
113 * \param pFieldName name of any field.
114 * \return the number of timestamps for a given field; 0 if field not found.
116 CORBA::Long getTimeStamps(const char* pFieldName)
117 throw (SALOME::SALOME_Exception);
120 * Returns the name of all partitions.
121 * Assumes this object encapsulates a distributed MED file.
122 * \return the name of all partitions.
124 MULTIPR_ORB::string_array* getParts()
125 throw (SALOME::SALOME_Exception);
128 * Returns all information abour a part.
129 * Assumes this object encapsulates a distributed MED file.
130 * \param pPartName name of the part.
131 * \return information about a part.
133 char* getPartInfo(const char* pPartName)
134 throw (SALOME::SALOME_Exception);
136 //---------------------------------------------------------------------
138 //---------------------------------------------------------------------
141 * Creates a distributed MED file (v2.3) by extracting all the groups from the current mesh of the current MED sequential MED file.
143 * - the file is in MED format and can be read using MED file v2.3.
144 * - the file is sequential (not a distributed MED).
145 * - the file only contains TETRA10 elements (dimension of space and mesh is 3).
146 * - the file have no profil.
147 * \return the name of each part.
149 MULTIPR_ORB::string_array* partitionneDomaine()
150 throw (SALOME::SALOME_Exception);
153 * Creates a distributed MED file (V2.3) by splitting a group of a MED file previously created by partitionneDomaine.
155 * - the file is a distributed MED file, previously created by partitionneDomaine()
156 * (=> each part only contain 1 mesh, TETRA10 elements only)
158 * \param pPartName name of the part to be splitted.
159 * \param pNbParts number of parts; must be > 1.
160 * \param pPartitionner use value 0=MULTIPR_METIS for Metis or 1=MULTIPR_SCOTCH for Scotch.
161 * \return the name of each part.
163 MULTIPR_ORB::string_array* partitionneGrain(
164 const char* pPartName,
165 CORBA::Long pNbParts,
166 CORBA::Long pPartitionner)
167 throw (SALOME::SALOME_Exception);
170 * Creates 3 resolutions of the given part of a distributed MED file (V2.3).
172 * - the file is a distributed MED file, previously created by partitionneDomaine() or partitionneGrain()
173 * (=> each part only contain 1 mesh, TETRA10 elements only)
174 * \param pPartName name of the part to be decimated.
175 * \param pFieldName name of the field used for decimation.
176 * \param pFieldIt iteration (time step) of the field.
177 * \param pFilterName name of the filter to be used.
178 * \param pTmed threshold used for medium resolution.
179 * \param pTlow threshold used for low resolution; tmed must be less than tlow
180 * \param pTadius radius used to determine the neighbourhood.
181 * \return the name of each part.
183 MULTIPR_ORB::string_array* decimePartition(
184 const char* pPartName,
185 const char* pFieldName,
186 CORBA::Long pFieldIt,
187 const char* pFilterName,
190 CORBA::Double pRadius)
191 throw (SALOME::SALOME_Exception);
194 * Returns useful information to configure decimation parameters.
195 * Depends on part, field and filter: generic operation.
196 * \param pPartName name of the part.
197 * \param pFieldName name of the field used for decimation.
198 * \param pFieldIt iteration (time step) of the field.
199 * \param pFilterName name of the filter to be used.
200 * \param pFilterParams params to be used with the filter (depends on filter; this string will be parsed).
202 char* evalDecimationParams(
203 const char* pPartName,
204 const char* pFieldName,
205 CORBA::Long pFieldIt,
206 const char* pFilterName,
207 const char* pFilterParams)
208 throw (SALOME::SALOME_Exception);
211 * Removes all the parts starting with "pPrefixPartName" from the distributed MED file.
212 * Example: if pPrefixPartName="PART_4" => remove "PART_4" and all sub-parts "PART_4_*", but not "PART41".
213 * Assume this object encapsulates a distributed MED file.
214 * \param pPrefixPartName name of the part.
216 void removeParts(const char* pPrefixPartName)
217 throw (SALOME::SALOME_Exception);
219 //---------------------------------------------------------------------
221 //---------------------------------------------------------------------
224 * Saves the associated MED file if necessary.
225 * \param pPath path where to save the file.
227 void save(const char* pPath)
228 throw (SALOME::SALOME_Exception);
233 * The associated MULTIPR object.
238 * Boxing paremeter: number of cells along each axis.
239 * E.g. if mBoxing=10 then total number of cells = 10*10*10 = 1000.
240 * By default, mBoxing=100.
247 //*****************************************************************************
248 // Class MULTIPR_Gen_i
249 // C++ implementation of the MULTIPR_Gen CORBA interface
250 //*****************************************************************************
252 class MULTIPR_Gen_i :
253 public POA_MULTIPR_ORB::MULTIPR_Gen,
254 public Engines_Component_i
261 PortableServer::POA_ptr poa,
262 PortableServer::ObjectId* contId,
263 const char* instanceName,
264 const char* interfaceName);
266 virtual ~MULTIPR_Gen_i();
269 throw (SALOME::SALOME_Exception);
271 void partitionneDomaine(
272 const char* medFilename,
273 const char* meshName)
274 throw (SALOME::SALOME_Exception);
276 void partitionneGrain(
277 const char* medFilename,
278 const char* partName,
280 CORBA::Long partitionner)
281 throw (SALOME::SALOME_Exception);
283 void decimePartition(
284 const char* medFilename,
285 const char* partName,
286 const char* fieldName,
288 const char* filterName,
291 CORBA::Double radius,
293 throw (SALOME::SALOME_Exception);
295 MULTIPR_ORB::MULTIPR_Obj_ptr getObject(const char* medFilename)
296 throw (SALOME::SALOME_Exception);
300 extern "C" PortableServer::ObjectId* MULTIPREngine_factory(
302 PortableServer::POA_ptr poa,
303 PortableServer::ObjectId * contId,
304 const char* instanceName,
305 const char* interfaceName);
307 #endif // __MULTIPR_IMPLEMENTATION_CORBA__