self.qpbMeshFile.clicked.connect(self.OnQpbMeshFileClicked)
self.qpbMeshFile.setToolTip("Select input DEM file")
self.qpbClose.clicked.connect(self.OnQpbCloseClicked)
- self.qcbDistributed.stateChanged[int].connect(self.OnqcbDistributedClicked)
- self.qlbXParts.setVisible(False)
- self.qlbYParts.setVisible(False)
- self.qlbZParts.setVisible(False)
- self.qsbXParts.setVisible(False)
- self.qsbYParts.setVisible(False)
- self.qsbZParts.setVisible(False)
+ self.qrbDist.clicked.connect(self.OnqrbDistClicked)
+ self.qrbPar.clicked.connect(self.OnqrbParClicked)
+ self.qrbSeq.clicked.connect(self.OnqrbSeqClicked)
self.SALOME_TMP_DIR = None
try:
self.qleTmpDir.setText(os.path.join('/tmp',getpass.getuser(),'top-ii-vol'))
zPoints = self.qsbZPoints.value()
depth = self.qsbDepth.value()
nProcs = self.qsbNBprocs.value()
- if not self.qcbDistributed.isChecked():
+ if not self.qrbDist.isChecked():
if nProcs == 1:
shellCmd = "topIIvol_Mesher"
else:
pathlib.Path(self.SALOME_TMP_DIR).mkdir(parents=True, exist_ok=True)
self.outputMesh= os.path.join(self.SALOME_TMP_DIR, inputMesh.split('/').pop().replace('.xyz','.mesh'))
shellCmd+= " --out " + self.outputMesh
+ os.chdir(self.SALOME_TMP_DIR)
print("INFO: ", shellCmd)
myMonitorView=TopIIVolMeshMonitor(self, shellCmd)
- def OnqcbDistributedClicked(self):
- state = self.qcbDistributed.isChecked()
- self.qlbXParts.setVisible(state)
- self.qlbYParts.setVisible(state)
- self.qlbZParts.setVisible(state)
- self.qsbXParts.setVisible(state)
- self.qsbYParts.setVisible(state)
- self.qsbZParts.setVisible(state)
+ def OnqrbDistClicked(self):
+ state = self.qrbDist.isChecked()
+ self.qgbDist.setEnabled(state)
+ self.qsbNBprocs.setEnabled(state)
+ self.qlbNBprocs.setEnabled(state)
+ def OnqrbParClicked(self):
+ state = self.qrbPar.isChecked()
+ self.qgbDist.setEnabled(not state)
+ self.qsbNBprocs.setEnabled(state)
+ self.qlbNBprocs.setEnabled(state)
+
+ def OnqrbSeqClicked(self):
+ state = self.qrbSeq.isChecked()
+ if state:
+ self.qsbNBprocs.setValue(1)
+ self.qgbDist.setEnabled(not state)
+ self.qsbNBprocs.setEnabled(not state)
+ self.qlbNBprocs.setEnabled(not state)
+
def OnQpbCloseClicked(self):
self.close()
<rect>
<x>0</x>
<y>0</y>
- <width>663</width>
- <height>298</height>
+ <width>758</width>
+ <height>400</height>
</rect>
</property>
<property name="windowTitle">
- <string>Tetra Mesh from cloud of xyz points mesh generator</string>
+ <string>Tetrahedral mesh generator for DEM point-clouds</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<property name="title">
<string>Options</string>
</property>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0">
- <widget class="QSpinBox" name="qsbXPoints">
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="qlXpoints">
- <property name="text">
- <string>Number of points in X direction</string>
- </property>
+ <layout class="QGridLayout" name="gridLayout_6">
+ <item row="0" column="0" rowspan="2" colspan="2">
+ <widget class="QGroupBox" name="qgbNBpoints">
+ <property name="title">
+ <string>Number of points</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="0" column="0">
+ <widget class="QSpinBox" name="qsbXPoints">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="qlXpoints">
+ <property name="text">
+ <string>X direction</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QSpinBox" name="qsbYPoints">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="qlYpoints">
+ <property name="text">
+ <string>Y direction</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QSpinBox" name="qsbZPoints">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="qlZpoints">
+ <property name="text">
+ <string>Z direction</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
<item row="0" column="2">
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>40</width>
+ <width>0</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
- <item row="0" column="3">
- <widget class="QCheckBox" name="qcbDistributed">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="0" column="4">
- <widget class="QLabel" name="qlDistributed">
- <property name="text">
- <string>Distributed</string>
- </property>
+ <item row="0" column="3" rowspan="2" colspan="3">
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Meshing</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="qrbSeq">
+ <property name="text">
+ <string>Sequential</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="qrbPar">
+ <property name="text">
+ <string>Parallel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="qrbDist">
+ <property name="text">
+ <string>Parallel distributed</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
- <item row="0" column="5">
- <spacer name="horizontalSpacer_2">
+ <item row="0" column="6">
+ <spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>40</width>
+ <width>0</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
- <item row="0" column="6">
+ <item row="0" column="7">
<widget class="QSpinBox" name="qsbNBprocs">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="minimum">
<number>0</number>
</property>
</property>
</widget>
</item>
- <item row="0" column="7">
- <widget class="QLabel" name="qlbNbProcs">
- <property name="text">
- <string>Number of processors</string>
- </property>
- </widget>
- </item>
<item row="0" column="8">
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <widget class="QLabel" name="qlbNBprocs">
+ <property name="enabled">
+ <bool>false</bool>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>45</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="0">
- <widget class="QSpinBox" name="qsbYPoints">
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="qlYpoints">
<property name="text">
- <string>Number of points in Y direction</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QCheckBox" name="qcbDisplayMesh">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="1" column="4">
- <widget class="QLabel" name="qlDisplayMesh">
- <property name="text">
- <string>Display mesh</string>
- </property>
- </widget>
- </item>
- <item row="1" column="6">
- <widget class="QSpinBox" name="qsbXParts">
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>1</number>
+ <string>Number of processors</string>
</property>
</widget>
</item>
- <item row="1" column="7" colspan="2">
- <widget class="QLabel" name="qlbXParts">
- <property name="text">
- <string>Number of partitions in X direction</string>
- </property>
+ <item row="1" column="7" rowspan="3" colspan="2">
+ <widget class="QGroupBox" name="qgbDist">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Number of partitions</string>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="1" column="0" colspan="2">
+ <widget class="QSpinBox" name="qsbYParts">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2">
+ <widget class="QLabel" name="qlbYParts">
+ <property name="text">
+ <string>Y direction</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" colspan="2">
+ <widget class="QLabel" name="qlbXParts">
+ <property name="text">
+ <string>X direction</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="qlbZParts">
+ <property name="text">
+ <string>Z direction</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QSpinBox" name="qsbZParts">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QSpinBox" name="qsbXParts">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
<item row="2" column="0">
- <widget class="QSpinBox" name="qsbZPoints">
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>10</number>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="qlZpoints">
- <property name="text">
- <string>Number of points in Z direction</string>
- </property>
- </widget>
- </item>
- <item row="2" column="6">
- <widget class="QSpinBox" name="qsbYParts">
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>1</number>
- </property>
- </widget>
- </item>
- <item row="2" column="7" colspan="2">
- <widget class="QLabel" name="qlbYParts">
- <property name="text">
- <string>Number of partitions in Y direction</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
<widget class="QSpinBox" name="qsbDepth">
<property name="minimum">
<number>-999999999</number>
</property>
</widget>
</item>
- <item row="3" column="1">
+ <item row="2" column="1">
<widget class="QLabel" name="qlDepth">
<property name="text">
<string>Depth in Z direction</string>
</property>
</widget>
</item>
- <item row="3" column="6">
- <widget class="QSpinBox" name="qsbZParts">
- <property name="minimum">
- <number>0</number>
+ <item row="2" column="3">
+ <widget class="QCheckBox" name="qcbDisplayMesh">
+ <property name="text">
+ <string/>
</property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>1</number>
+ <property name="checked">
+ <bool>true</bool>
</property>
</widget>
</item>
- <item row="3" column="7" colspan="2">
- <widget class="QLabel" name="qlbZParts">
+ <item row="2" column="4">
+ <widget class="QLabel" name="qlDisplayMesh">
<property name="text">
- <string>Number of partitions in Z direction</string>
+ <string>Display mesh</string>
</property>
</widget>
</item>
- <item row="4" column="0">
+ <item row="2" column="5">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="0">
<widget class="QLabel" name="qlTmpDir">
<property name="text">
<string>Workspace</string>
</property>
</widget>
</item>
- <item row="5" column="0" colspan="9">
+ <item row="4" column="0" colspan="9">
<widget class="QLineEdit" name="qleTmpDir">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<tabstop>qsbYPoints</tabstop>
<tabstop>qsbZPoints</tabstop>
<tabstop>qsbDepth</tabstop>
- <tabstop>qcbDistributed</tabstop>
<tabstop>qsbNBprocs</tabstop>
<tabstop>qsbXParts</tabstop>
<tabstop>qsbYParts</tabstop>
<tabstop>qsbZParts</tabstop>
- <tabstop>qcbDisplayMesh</tabstop>
<tabstop>qleTmpDir</tabstop>
<tabstop>qpbCompute</tabstop>
<tabstop>qpbClose</tabstop>
Introduction
============
-**topIIvol** meshing tool provides sequential/parallel tools for creating volumetric tetrahedral meshes from a given topology (point-cloud `*.xyz`).
+**topIIvol** meshing tool provides sequential and parallel tools for creating volumetric tetrahedral meshes from a given terrain topology via digital elevation model (DEM point-cloud `*.xyz`). Via this plugin one could produce distributed meshes suitable for domain-decomposition based solvers or simply non distributed meshes (single mesh) suitable for a sequential/parallel solver.
Running topIIvol Plug-in
========================
**topIIVolMesh** Options
========================
+Users have option of performing meshing via:
+
+- *Sequential* mode: mesh computation in sequential and outputs a single mesh.
+- *Parallel* mode: mesh computation in parallel and outputs a single mesh.
+- *Parallel distributed* mode: mesh computation in parallel and outputs partitioned meshes.
Sequential mode
---------------
-If the number of processors is set to 1, **topIIvol_Mesher** sequential tool is called for creating volumetric tetrahedral meshes from a given topology. The volumetric mesh can be displayed in SALOME by ticking the "Display mesh" check-box.
+By default sequential meshing mode is activated. **topIIvol_Mesher** sequential tool is called for creating volumetric tetrahedral mesh for the given DEM point-cloud. The volumetric mesh can be displayed in SALOME by ticking the "Display mesh" check-box.
The list of input parameters are:
-- DEM input file: input point cloud file;
+- DEM input file: input point cloud file in .xyz format;
- Number of X points present in the input point cloud;
- Number of Y points present in the input point cloud;
-- Number of Z points intended in the z direction;
+- Number of Z points intended in the Z direction;
- Depth of the mesh needed;
- temporary directory for calculation.
Parallel mode
---------------
-If the number of processors is greater than one, **topIIvol_ParMesher** parallel computing tool is called for creating volumetric tetrahedral meshes from a given topology. The volumetric mesh can be displayed in SALOME by ticking the "Display mesh" check-box.
+For larger meshes the parallel meshing mode can be activated via the check-box **Parallel**. Additionally, this requires the user to provide the number of processors to be used for parallel meshing. Then, **topIIvol_ParMesher** parallel computing tool is called for creating volumetric tetrahedral mesh for the given DEM point-cloud. The volumetric mesh can be displayed in SALOME by ticking the "Display mesh" check-box.
The list of input parameters are:
-- DEM input file: input point cloud file;
+- DEM input file: input point cloud file in .xyz format;
- Number of X points present in the input point cloud;
- Number of Y points present in the input point cloud;
-- Number of Z points intended in the z direction;
+- Number of Z points intended in the Z direction;
- Depth of the mesh needed;
- Number of MPI ranks
- temporary directory for calculation.
-Distributed mode
+Parallel distributed mode
-----------------
-If the check-box **Distributed** is ticked, **topIIvol_DistMesher** computing tool is called for creating embarassingly parallel distributed meshes from a given topology.
+For larger meshes suitable for distributed-memory solvers (domain-decomposition) the distributed parallel meshing mode can be activated via the check-box **Parallel distributed**. This requires the user to provide the number of processors to be used for parallel meshing and how to partition the mesh in each direction (X, Y, Z). Then, **topIIvol_DistMesher** computing tool is called for creating embarassingly parallel distributed meshes for the given DEM point-cloud. These volumetric mesh partitions can be displayed in SALOME by ticking the "Display mesh" check-box.
The list of input parameters are:
-- DEM input file: input point cloud file;
+- DEM input file: input point cloud file in .xyz format;
- Number of X points present in the input point cloud;
- Number of Y points present in the input point cloud;
-- Number of Z points intended in the z direction;
+- Number of Z points intended in the Z direction;
+- Depth of the mesh needed;
- Number of partitions in X direction;
- Number of partitions in Y direction;
- Number of partitions in Z direction;
-- Depth of the mesh needed;
- Number of MPI ranks
- temporary directory for calculation.