Skip to content

Commit 7eb2270

Browse files
authored
Merge pull request #2 from Nicola-Fonzi/publish_develop
Modifications are requested by reviewer
2 parents 052e306 + 6b9bd51 commit 7eb2270

8 files changed

Lines changed: 181 additions & 233 deletions

File tree

Common/include/CConfig.hpp

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ class CConfig {
195195
nMarker_NearFieldBound, /*!< \brief Number of near field boundary markers. */
196196
nMarker_ActDiskInlet, /*!< \brief Number of actuator disk inlet markers. */
197197
nMarker_ActDiskOutlet, /*!< \brief Number of actuator disk outlet markers. */
198-
nMarker_Match_Deform_Mesh, /*!< \brief Number of markers marching the deformation */
198+
nMarker_Deform_Mesh_Sym_Plane, /*!< \brief Number of markers with symmetric deformation */
199199
nMarker_Deform_Mesh, /*!< \brief Number of deformable markers at the boundary. */
200200
nMarker_Fluid_Load, /*!< \brief Number of markers in which the flow load is computed/employed. */
201201
nMarker_Fluid_InterfaceBound, /*!< \brief Number of fluid interface markers. */
@@ -240,7 +240,7 @@ class CConfig {
240240
*Marker_TurboBoundOut, /*!< \brief Turbomachinery performance boundary donor markers. */
241241
*Marker_NearFieldBound, /*!< \brief Near Field boundaries markers. */
242242
*Marker_Deform_Mesh, /*!< \brief Deformable markers at the boundary. */
243-
*Marker_Match_Deform_Mesh, /*!< \brief Marker free to deform following Marker_Deform_Mesh. */
243+
*Marker_Deform_Mesh_Sym_Plane, /*!< \brief Marker with symmetric deformation. */
244244
*Marker_Fluid_Load, /*!< \brief Markers in which the flow load is computed/employed. */
245245
*Marker_Fluid_InterfaceBound, /*!< \brief Fluid interface markers. */
246246
*Marker_CHTInterface, /*!< \brief Conjugate heat transfer interface markers. */
@@ -697,7 +697,7 @@ class CConfig {
697697
*Marker_All_DV, /*!< \brief Global index for design variable markers using the grid information. */
698698
*Marker_All_Moving, /*!< \brief Global index for moving surfaces using the grid information. */
699699
*Marker_All_Deform_Mesh, /*!< \brief Global index for deformable markers at the boundary. */
700-
*Marker_All_Match_Deform_Mesh, /*!< \brief Global index for markers matching deformations. */
700+
*Marker_All_Deform_Mesh_Sym_Plane, /*!< \brief Global index for markers with symmetric deformations. */
701701
*Marker_All_Fluid_Load, /*!< \brief Global index for markers in which the flow load is computed/employed. */
702702
*Marker_All_PyCustom, /*!< \brief Global index for Python customizable surfaces using the grid information. */
703703
*Marker_All_Designing, /*!< \brief Global index for moving using the grid information. */
@@ -712,7 +712,7 @@ class CConfig {
712712
*Marker_CfgFile_MixingPlaneInterface, /*!< \brief Global index for MixingPlane interface using the config information. */
713713
*Marker_CfgFile_Moving, /*!< \brief Global index for moving surfaces using the config information. */
714714
*Marker_CfgFile_Deform_Mesh, /*!< \brief Global index for deformable markers at the boundary. */
715-
*Marker_CfgFile_Match_Deform_Mesh, /*!< \brief Global index for markers matching deformations. */
715+
*Marker_CfgFile_Deform_Mesh_Sym_Plane, /*!< \brief Global index for markers with symmetric deformations. */
716716
*Marker_CfgFile_Fluid_Load, /*!< \brief Global index for markers in which the flow load is computed/employed. */
717717
*Marker_CfgFile_PyCustom, /*!< \brief Global index for Python customizable surfaces using the config information. */
718718
*Marker_CfgFile_DV, /*!< \brief Global index for design variable markers using the config information. */
@@ -2856,12 +2856,6 @@ class CConfig {
28562856
*/
28572857
unsigned short GetnMarker_Deform_Mesh(void) const { return nMarker_Deform_Mesh; }
28582858

2859-
/*!
2860-
* \brief Get the total number of markers matching the deformation at the boundary.
2861-
* \return Total number of deformable markers at the boundary.
2862-
*/
2863-
unsigned short GetnMarker_Match_Deform_Mesh(void) const { return nMarker_Match_Deform_Mesh; }
2864-
28652859
/*!
28662860
* \brief Get the total number of markers in which the flow load is computed/employed.
28672861
* \return Total number of markers in which the flow load is computed/employed.
@@ -3379,9 +3373,9 @@ class CConfig {
33793373
/*!
33803374
* \brief Set if a marker <i>val_marker</i> allows deformation at the boundary.
33813375
* \param[in] val_marker - Index of the marker in which we are interested.
3382-
* \param[in] val_interface - 0 or 1 depending if the the marker is or not a MATCH_DEFORM_MESH marker.
3376+
* \param[in] val_interface - 0 or 1 depending if the the marker is or not a DEFORM_MESH_SYM_PLANE marker.
33833377
*/
3384-
void SetMarker_All_Match_Deform_Mesh(unsigned short val_marker, unsigned short val_deform) { Marker_All_Match_Deform_Mesh[val_marker] = val_deform; }
3378+
void SetMarker_All_Deform_Mesh_Sym_Plane(unsigned short val_marker, unsigned short val_deform) { Marker_All_Deform_Mesh_Sym_Plane[val_marker] = val_deform; }
33853379

33863380
/*!
33873381
* \brief Set if a in marker <i>val_marker</i> the flow load will be computed/employed.
@@ -3521,11 +3515,11 @@ class CConfig {
35213515
unsigned short GetMarker_All_Deform_Mesh(unsigned short val_marker) const { return Marker_All_Deform_Mesh[val_marker]; }
35223516

35233517
/*!
3524-
* \brief Get whether marker <i>val_marker</i> is a MATCH_DEFORM_MESH marker
3525-
* \param[in] val_marker - 0 or 1 depending if the the marker belongs to the MATCH_DEFORM_MESH subset.
3526-
* \return 0 or 1 depending if the marker belongs to the MATCH_DEFORM_MESH subset.
3518+
* \brief Get whether marker <i>val_marker</i> is a DEFORM_MESH_SYM_PLANE marker
3519+
* \param[in] val_marker - 0 or 1 depending if the the marker belongs to the DEFORM_MESH_SYM_PLANE subset.
3520+
* \return 0 or 1 depending if the marker belongs to the DEFORM_MESH_SYM_PLANE subset.
35273521
*/
3528-
unsigned short GetMarker_All_Match_Deform_Mesh(unsigned short val_marker) const { return Marker_All_Match_Deform_Mesh[val_marker]; }
3522+
unsigned short GetMarker_All_Deform_Mesh_Sym_Plane(unsigned short val_marker) const { return Marker_All_Deform_Mesh_Sym_Plane[val_marker]; }
35293523

35303524
/*!
35313525
* \brief Get whether marker <i>val_marker</i> is a Fluid_Load marker
@@ -6145,10 +6139,10 @@ class CConfig {
61456139
unsigned short GetMarker_CfgFile_Deform_Mesh(string val_marker) const;
61466140

61476141
/*!
6148-
* \brief Get the MATCH_DEFORM_MESH information from the config definition for the marker <i>val_marker</i>.
6149-
* \return MATCH_DEFORM_MESH information of the boundary in the config information for the marker <i>val_marker</i>.
6142+
* \brief Get the DEFORM_MESH_SYM_PLANE information from the config definition for the marker <i>val_marker</i>.
6143+
* \return DEFORM_MESH_SYM_PLANE information of the boundary in the config information for the marker <i>val_marker</i>.
61506144
*/
6151-
unsigned short GetMarker_CfgFile_Match_Deform_Mesh(string val_marker) const;
6145+
unsigned short GetMarker_CfgFile_Deform_Mesh_Sym_Plane(string val_marker) const;
61526146

61536147
/*!
61546148
* \brief Get the Fluid_Load information from the config definition for the marker <i>val_marker</i>.
@@ -6477,10 +6471,10 @@ class CConfig {
64776471
unsigned short GetMarker_Deform_Mesh(string val_marker) const;
64786472

64796473
/*!
6480-
* \brief Get the internal index for a MATCH_DEFORM_MESH boundary <i>val_marker</i>.
6481-
* \return Internal index for a MATCH_DEFORM_MESH boundary <i>val_marker</i>.
6474+
* \brief Get the internal index for a DEFORM_MESH_SYM_PLANE boundary <i>val_marker</i>.
6475+
* \return Internal index for a DEFORM_MESH_SYM_PLANE boundary <i>val_marker</i>.
64826476
*/
6483-
unsigned short GetMarker_Match_Deform_Mesh(string val_marker) const;
6477+
unsigned short GetMarker_Deform_Mesh_Sym_Plane(string val_marker) const;
64846478

64856479
/*!
64866480
* \brief Get the internal index for a Fluid_Load boundary <i>val_marker</i>.
@@ -6505,12 +6499,12 @@ class CConfig {
65056499
string GetMarker_Deform_Mesh_TagBound(unsigned short val_marker) const { return Marker_Deform_Mesh[val_marker]; }
65066500

65076501
/*!
6508-
* \brief Get the name of the MATCH_DEFORM_MESH boundary defined in the geometry file.
6502+
* \brief Get the name of the DEFORM_MESH_SYM_PLANE boundary defined in the geometry file.
65096503
* \param[in] val_marker - Value of the marker in which we are interested.
65106504
* \return Name that is in the geometry file for the surface that
65116505
* has the marker <i>val_marker</i>.
65126506
*/
6513-
string GetMarker_Match_Deform_Mesh_TagBound(unsigned short val_marker) const { return Marker_Match_Deform_Mesh[val_marker]; }
6507+
string GetMarker_Deform_Mesh_Sym_Plane_TagBound(unsigned short val_marker) const { return Marker_Deform_Mesh_Sym_Plane[val_marker]; }
65146508

65156509
/*!
65166510
* \brief Get the name of the Fluid_Load boundary defined in the geometry file.

Common/src/CConfig.cpp

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,7 @@ void CConfig::SetPointersNull(void) {
790790
Marker_CfgFile_MixingPlaneInterface = nullptr; Marker_All_MixingPlaneInterface = nullptr;
791791
Marker_CfgFile_ZoneInterface = nullptr;
792792
Marker_CfgFile_Deform_Mesh = nullptr; Marker_All_Deform_Mesh = nullptr;
793-
Marker_CfgFile_Match_Deform_Mesh = nullptr; Marker_All_Match_Deform_Mesh = nullptr;
793+
Marker_CfgFile_Deform_Mesh_Sym_Plane = nullptr; Marker_All_Deform_Mesh_Sym_Plane = nullptr;
794794
Marker_CfgFile_Fluid_Load = nullptr; Marker_All_Fluid_Load = nullptr;
795795

796796
Marker_CfgFile_Turbomachinery = nullptr; Marker_All_Turbomachinery = nullptr;
@@ -815,7 +815,7 @@ void CConfig::SetPointersNull(void) {
815815
Marker_Euler = nullptr; Marker_FarField = nullptr; Marker_Custom = nullptr;
816816
Marker_SymWall = nullptr; Marker_PerBound = nullptr;
817817
Marker_PerDonor = nullptr; Marker_NearFieldBound = nullptr;
818-
Marker_Deform_Mesh = nullptr; Marker_Match_Deform_Mesh= nullptr; Marker_Fluid_Load = nullptr;
818+
Marker_Deform_Mesh = nullptr; Marker_Deform_Mesh_Sym_Plane= nullptr; Marker_Fluid_Load = nullptr;
819819
Marker_Inlet = nullptr; Marker_Outlet = nullptr;
820820
Marker_Supersonic_Inlet = nullptr; Marker_Supersonic_Outlet= nullptr;
821821
Marker_Isothermal = nullptr; Marker_HeatFlux = nullptr; Marker_EngineInflow = nullptr;
@@ -1368,8 +1368,8 @@ void CConfig::SetConfig_Options() {
13681368
addStringListOption("MARKER_FLUID_INTERFACE", nMarker_Fluid_InterfaceBound, Marker_Fluid_InterfaceBound);
13691369
/*!\brief MARKER_DEFORM_MESH\n DESCRIPTION: Deformable marker(s) at the interface \ingroup Config*/
13701370
addStringListOption("MARKER_DEFORM_MESH", nMarker_Deform_Mesh, Marker_Deform_Mesh);
1371-
/*!\brief MARKER_MATCH_DEFORM_MESH\n DESCRIPTION: Deformable marker(s) that will follow the interface deformation \ingroup Config*/
1372-
addStringListOption("MARKER_MATCH_DEFORM_MESH", nMarker_Match_Deform_Mesh, Marker_Match_Deform_Mesh);
1371+
/*!\brief MARKER_DEFORM_MESH_SYM_PLANE\n DESCRIPTION: Symmetry plane for mesh deformation only \ingroup Config*/
1372+
addStringListOption("MARKER_DEFORM_MESH_SYM_PLANE", nMarker_Deform_Mesh_Sym_Plane, Marker_Deform_Mesh_Sym_Plane);
13731373
/*!\brief MARKER_FLUID_LOAD\n DESCRIPTION: Marker(s) in which the flow load is computed/applied \ingroup Config*/
13741374
addStringListOption("MARKER_FLUID_LOAD", nMarker_Fluid_Load, Marker_Fluid_Load);
13751375
/*!\brief MARKER_FSI_INTERFACE \n DESCRIPTION: ZONE interface boundary marker(s) \ingroup Config*/
@@ -4905,7 +4905,7 @@ void CConfig::SetMarkers(unsigned short val_software) {
49054905
iMarker_Monitoring, iMarker_Designing, iMarker_GeoEval, iMarker_Plotting, iMarker_Analyze,
49064906
iMarker_DV, iMarker_Moving, iMarker_PyCustom, iMarker_Supersonic_Inlet, iMarker_Supersonic_Outlet,
49074907
iMarker_Clamped, iMarker_ZoneInterface, iMarker_CHTInterface, iMarker_Load_Dir, iMarker_Disp_Dir, iMarker_Load_Sine,
4908-
iMarker_Fluid_Load, iMarker_Deform_Mesh, iMarker_Match_Deform_Mesh,
4908+
iMarker_Fluid_Load, iMarker_Deform_Mesh, iMarker_Deform_Mesh_Sym_Plane,
49094909
iMarker_ActDiskInlet, iMarker_ActDiskOutlet,
49104910
iMarker_Turbomachinery, iMarker_MixingPlaneInterface;
49114911

@@ -4950,7 +4950,7 @@ void CConfig::SetMarkers(unsigned short val_software) {
49504950
Marker_All_DV = new unsigned short[nMarker_All] (); // Store whether the boundary should be affected by design variables.
49514951
Marker_All_Moving = new unsigned short[nMarker_All] (); // Store whether the boundary should be in motion.
49524952
Marker_All_Deform_Mesh = new unsigned short[nMarker_All] (); // Store whether the boundary is deformable.
4953-
Marker_All_Match_Deform_Mesh = new unsigned short[nMarker_All] (); //Store wheter the boundary will follow the deformation
4953+
Marker_All_Deform_Mesh_Sym_Plane = new unsigned short[nMarker_All] (); //Store wheter the boundary will follow the deformation
49544954
Marker_All_Fluid_Load = new unsigned short[nMarker_All] (); // Store whether the boundary computes/applies fluid loads.
49554955
Marker_All_PyCustom = new unsigned short[nMarker_All] (); // Store whether the boundary is Python customizable.
49564956
Marker_All_PerBound = new short[nMarker_All] (); // Store whether the boundary belongs to a periodic boundary.
@@ -4975,7 +4975,7 @@ void CConfig::SetMarkers(unsigned short val_software) {
49754975
Marker_CfgFile_DV = new unsigned short[nMarker_CfgFile] ();
49764976
Marker_CfgFile_Moving = new unsigned short[nMarker_CfgFile] ();
49774977
Marker_CfgFile_Deform_Mesh = new unsigned short[nMarker_CfgFile] ();
4978-
Marker_CfgFile_Match_Deform_Mesh = new unsigned short[nMarker_CfgFile] ();
4978+
Marker_CfgFile_Deform_Mesh_Sym_Plane= new unsigned short[nMarker_CfgFile] ();
49794979
Marker_CfgFile_Fluid_Load = new unsigned short[nMarker_CfgFile] ();
49804980
Marker_CfgFile_PerBound = new unsigned short[nMarker_CfgFile] ();
49814981
Marker_CfgFile_Turbomachinery = new unsigned short[nMarker_CfgFile] ();
@@ -5370,10 +5370,10 @@ void CConfig::SetMarkers(unsigned short val_software) {
53705370
}
53715371

53725372
for (iMarker_CfgFile = 0; iMarker_CfgFile < nMarker_CfgFile; iMarker_CfgFile++) {
5373-
Marker_CfgFile_Match_Deform_Mesh[iMarker_CfgFile] = NO;
5374-
for (iMarker_Match_Deform_Mesh = 0; iMarker_Match_Deform_Mesh < nMarker_Match_Deform_Mesh; iMarker_Match_Deform_Mesh++)
5375-
if (Marker_CfgFile_TagBound[iMarker_CfgFile] == Marker_Match_Deform_Mesh[iMarker_Match_Deform_Mesh])
5376-
Marker_CfgFile_Match_Deform_Mesh[iMarker_CfgFile] = YES;
5373+
Marker_CfgFile_Deform_Mesh_Sym_Plane[iMarker_CfgFile] = NO;
5374+
for (iMarker_Deform_Mesh_Sym_Plane = 0; iMarker_Deform_Mesh_Sym_Plane < nMarker_Deform_Mesh_Sym_Plane; iMarker_Deform_Mesh_Sym_Plane++)
5375+
if (Marker_CfgFile_TagBound[iMarker_CfgFile] == Marker_Deform_Mesh_Sym_Plane[iMarker_Deform_Mesh_Sym_Plane])
5376+
Marker_CfgFile_Deform_Mesh_Sym_Plane[iMarker_CfgFile] = YES;
53775377
}
53785378

53795379
for (iMarker_CfgFile = 0; iMarker_CfgFile < nMarker_CfgFile; iMarker_CfgFile++) {
@@ -5397,7 +5397,7 @@ void CConfig::SetOutput(unsigned short val_software, unsigned short val_izone) {
53975397
unsigned short iMarker_Euler, iMarker_Custom, iMarker_FarField,
53985398
iMarker_SymWall, iMarker_PerBound, iMarker_NearFieldBound,
53995399
iMarker_Fluid_InterfaceBound, iMarker_Inlet, iMarker_Riemann,
5400-
iMarker_Deform_Mesh, iMarker_Match_Deform_Mesh, iMarker_Fluid_Load,
5400+
iMarker_Deform_Mesh, iMarker_Deform_Mesh_Sym_Plane, iMarker_Fluid_Load,
54015401
iMarker_Giles, iMarker_Outlet, iMarker_Isothermal, iMarker_HeatFlux,
54025402
iMarker_EngineInflow, iMarker_EngineExhaust, iMarker_Displacement, iMarker_Damper,
54035403
iMarker_Load, iMarker_FlowLoad, iMarker_Internal, iMarker_Monitoring,
@@ -6673,11 +6673,11 @@ void CConfig::SetOutput(unsigned short val_software, unsigned short val_izone) {
66736673
BoundaryTable.PrintFooter();
66746674
}
66756675

6676-
if (nMarker_Match_Deform_Mesh != 0) {
6677-
BoundaryTable << "Matching deformable mesh boundary";
6678-
for (iMarker_Match_Deform_Mesh = 0; iMarker_Match_Deform_Mesh < nMarker_Match_Deform_Mesh; iMarker_Match_Deform_Mesh++) {
6679-
BoundaryTable << Marker_Match_Deform_Mesh[iMarker_Match_Deform_Mesh];
6680-
if (iMarker_Match_Deform_Mesh < nMarker_Match_Deform_Mesh-1) BoundaryTable << " ";
6676+
if (nMarker_Deform_Mesh_Sym_Plane != 0) {
6677+
BoundaryTable << "Symmetric deformable mesh boundary";
6678+
for (iMarker_Deform_Mesh_Sym_Plane = 0; iMarker_Deform_Mesh_Sym_Plane < nMarker_Deform_Mesh_Sym_Plane; iMarker_Deform_Mesh_Sym_Plane++) {
6679+
BoundaryTable << Marker_Deform_Mesh_Sym_Plane[iMarker_Deform_Mesh_Sym_Plane];
6680+
if (iMarker_Deform_Mesh_Sym_Plane < nMarker_Deform_Mesh_Sym_Plane-1) BoundaryTable << " ";
66816681
}
66826682
BoundaryTable.PrintFooter();
66836683
}
@@ -7178,11 +7178,11 @@ unsigned short CConfig::GetMarker_CfgFile_Deform_Mesh(string val_marker) const {
71787178
return Marker_CfgFile_Deform_Mesh[iMarker_CfgFile];
71797179
}
71807180

7181-
unsigned short CConfig::GetMarker_CfgFile_Match_Deform_Mesh(string val_marker) const {
7181+
unsigned short CConfig::GetMarker_CfgFile_Deform_Mesh_Sym_Plane(string val_marker) const {
71827182
unsigned short iMarker_CfgFile;
71837183
for (iMarker_CfgFile = 0; iMarker_CfgFile < nMarker_CfgFile; iMarker_CfgFile++)
71847184
if (Marker_CfgFile_TagBound[iMarker_CfgFile] == val_marker) break;
7185-
return Marker_CfgFile_Match_Deform_Mesh[iMarker_CfgFile];
7185+
return Marker_CfgFile_Deform_Mesh_Sym_Plane[iMarker_CfgFile];
71867186
}
71877187

71887188
unsigned short CConfig::GetMarker_CfgFile_Fluid_Load(string val_marker) const {
@@ -7358,8 +7358,8 @@ CConfig::~CConfig(void) {
73587358
delete[] Marker_CfgFile_Deform_Mesh;
73597359
delete[] Marker_All_Deform_Mesh;
73607360

7361-
delete[] Marker_CfgFile_Match_Deform_Mesh;
7362-
delete[] Marker_All_Match_Deform_Mesh;
7361+
delete[] Marker_CfgFile_Deform_Mesh_Sym_Plane;
7362+
delete[] Marker_All_Deform_Mesh_Sym_Plane;
73637363

73647364
delete[] Marker_CfgFile_Fluid_Load;
73657365
delete[] Marker_All_Fluid_Load;
@@ -7617,7 +7617,7 @@ CConfig::~CConfig(void) {
76177617
delete[] Marker_PerDonor;
76187618
delete[] Marker_NearFieldBound;
76197619
delete[] Marker_Deform_Mesh;
7620-
delete[] Marker_Match_Deform_Mesh;
7620+
delete[] Marker_Deform_Mesh_Sym_Plane;
76217621
delete[] Marker_Fluid_Load;
76227622
delete[] Marker_Fluid_InterfaceBound;
76237623
delete[] Marker_Inlet;
@@ -8322,14 +8322,14 @@ unsigned short CConfig::GetMarker_Deform_Mesh(string val_marker) const {
83228322
return iMarker_Deform_Mesh;
83238323
}
83248324

8325-
unsigned short CConfig::GetMarker_Match_Deform_Mesh(string val_marker) const {
8326-
unsigned short iMarker_Match_Deform_Mesh;
8325+
unsigned short CConfig::GetMarker_Deform_Mesh_Sym_Plane(string val_marker) const {
8326+
unsigned short iMarker_Deform_Mesh_Sym_Plane;
83278327

83288328
/*--- Find the marker for this interface boundary. ---*/
8329-
for (iMarker_Match_Deform_Mesh = 0; iMarker_Match_Deform_Mesh < nMarker_Match_Deform_Mesh; iMarker_Match_Deform_Mesh++)
8330-
if (Marker_Match_Deform_Mesh[iMarker_Match_Deform_Mesh] == val_marker) break;
8329+
for (iMarker_Deform_Mesh_Sym_Plane = 0; iMarker_Deform_Mesh_Sym_Plane < nMarker_Deform_Mesh_Sym_Plane; iMarker_Deform_Mesh_Sym_Plane++)
8330+
if (Marker_Deform_Mesh_Sym_Plane[iMarker_Deform_Mesh_Sym_Plane] == val_marker) break;
83318331

8332-
return iMarker_Match_Deform_Mesh;
8332+
return iMarker_Deform_Mesh_Sym_Plane;
83338333
}
83348334

83358335
unsigned short CConfig::GetMarker_Fluid_Load(string val_marker) const {

0 commit comments

Comments
 (0)