Compare commits
5 Commits
master
...
maintenanc
Author | SHA1 | Date | |
---|---|---|---|
|
ecff1d2339 | ||
|
0bb5c6e0b3 | ||
|
e17d8c92d7 | ||
|
b147078b30 | ||
|
ecd61f0e68 |
@ -1,2 +1,2 @@
|
|||||||
api=2306
|
api=2306
|
||||||
patch=0
|
patch=240625
|
||||||
|
@ -176,10 +176,11 @@ makeBoundary
|
|||||||
new SlicedPatchField<Type>
|
new SlicedPatchField<Type>
|
||||||
(
|
(
|
||||||
p,
|
p,
|
||||||
DimensionedField<Type, GeoMesh>::null(),
|
DimensionedField<Type, GeoMesh>::null()
|
||||||
bField[patchi]
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
bf[patchi].UList<Type>::shallowCopy(bField[patchi]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -538,6 +538,10 @@ inline Foam::Tensor<Cmpt> Foam::Tensor<Cmpt>::inv2D
|
|||||||
|
|
||||||
|
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Foam::Tensor<Cmpt>
|
inline Foam::Tensor<Cmpt>
|
||||||
Foam::Tensor<Cmpt>::inner(const Tensor<Cmpt>& t2) const
|
Foam::Tensor<Cmpt>::inner(const Tensor<Cmpt>& t2) const
|
||||||
{
|
{
|
||||||
@ -561,6 +565,10 @@ Foam::Tensor<Cmpt>::inner(const Tensor<Cmpt>& t2) const
|
|||||||
|
|
||||||
|
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Foam::Tensor<Cmpt>
|
inline Foam::Tensor<Cmpt>
|
||||||
Foam::Tensor<Cmpt>::schur(const Tensor<Cmpt>& t2) const
|
Foam::Tensor<Cmpt>::schur(const Tensor<Cmpt>& t2) const
|
||||||
{
|
{
|
||||||
@ -1103,6 +1111,10 @@ operator&(const Tensor<Cmpt>& t1, const Tensor<Cmpt>& t2)
|
|||||||
|
|
||||||
//- Inner-product of a SphericalTensor and a Tensor
|
//- Inner-product of a SphericalTensor and a Tensor
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Tensor<Cmpt>
|
inline Tensor<Cmpt>
|
||||||
operator&(const SphericalTensor<Cmpt>& st1, const Tensor<Cmpt>& t2)
|
operator&(const SphericalTensor<Cmpt>& st1, const Tensor<Cmpt>& t2)
|
||||||
{
|
{
|
||||||
@ -1117,6 +1129,10 @@ operator&(const SphericalTensor<Cmpt>& st1, const Tensor<Cmpt>& t2)
|
|||||||
|
|
||||||
//- Inner-product of a Tensor and a SphericalTensor
|
//- Inner-product of a Tensor and a SphericalTensor
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Tensor<Cmpt>
|
inline Tensor<Cmpt>
|
||||||
operator&(const Tensor<Cmpt>& t1, const SphericalTensor<Cmpt>& st2)
|
operator&(const Tensor<Cmpt>& t1, const SphericalTensor<Cmpt>& st2)
|
||||||
{
|
{
|
||||||
@ -1131,6 +1147,10 @@ operator&(const Tensor<Cmpt>& t1, const SphericalTensor<Cmpt>& st2)
|
|||||||
|
|
||||||
//- Inner-product of a SymmTensor and a Tensor
|
//- Inner-product of a SymmTensor and a Tensor
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Tensor<Cmpt>
|
inline Tensor<Cmpt>
|
||||||
operator&(const SymmTensor<Cmpt>& st1, const Tensor<Cmpt>& t2)
|
operator&(const SymmTensor<Cmpt>& st1, const Tensor<Cmpt>& t2)
|
||||||
{
|
{
|
||||||
@ -1153,6 +1173,10 @@ operator&(const SymmTensor<Cmpt>& st1, const Tensor<Cmpt>& t2)
|
|||||||
|
|
||||||
//- Inner-product of a Tensor and a SymmTensor
|
//- Inner-product of a Tensor and a SymmTensor
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Tensor<Cmpt>
|
inline Tensor<Cmpt>
|
||||||
operator&(const Tensor<Cmpt>& t1, const SymmTensor<Cmpt>& st2)
|
operator&(const Tensor<Cmpt>& t1, const SymmTensor<Cmpt>& st2)
|
||||||
{
|
{
|
||||||
@ -1193,6 +1217,10 @@ operator&(const Tensor<Cmpt>& t, const Vector<Cmpt>& v)
|
|||||||
|
|
||||||
//- Inner-product of a Vector and a Tensor
|
//- Inner-product of a Vector and a Tensor
|
||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
|
// Workaround for gcc (11+) that fails to handle tensor dot vector
|
||||||
|
__attribute__((optimize("no-tree-vectorize")))
|
||||||
|
#endif
|
||||||
inline Vector<Cmpt>
|
inline Vector<Cmpt>
|
||||||
operator&(const Vector<Cmpt>& v, const Tensor<Cmpt>& t)
|
operator&(const Vector<Cmpt>& v, const Tensor<Cmpt>& t)
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -122,7 +122,8 @@ std::string Foam::fileFormats::NASCore::nextNasField
|
|||||||
(
|
(
|
||||||
const std::string& str,
|
const std::string& str,
|
||||||
std::string::size_type& pos,
|
std::string::size_type& pos,
|
||||||
std::string::size_type len
|
const std::string::size_type width,
|
||||||
|
const bool free_format
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const auto beg = pos;
|
const auto beg = pos;
|
||||||
@ -130,15 +131,23 @@ std::string Foam::fileFormats::NASCore::nextNasField
|
|||||||
|
|
||||||
if (end == std::string::npos)
|
if (end == std::string::npos)
|
||||||
{
|
{
|
||||||
pos = beg + len; // Continue after field width
|
if (free_format)
|
||||||
|
{
|
||||||
|
// Nothing left
|
||||||
|
pos = str.size();
|
||||||
|
return str.substr(beg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fixed format - continue after field width
|
||||||
|
pos = beg + width;
|
||||||
|
return str.substr(beg, width);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
len = (end - beg); // Efffective width
|
// Free format - continue after comma
|
||||||
pos = end + 1; // Continue after comma
|
pos = end + 1;
|
||||||
|
return str.substr(beg, (end - beg));
|
||||||
}
|
}
|
||||||
|
|
||||||
return str.substr(beg, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -235,8 +244,8 @@ void Foam::fileFormats::NASCore::writeCoord
|
|||||||
// 2 ID : point ID - requires starting index of 1
|
// 2 ID : point ID - requires starting index of 1
|
||||||
// 3 CP : coordinate system ID (blank)
|
// 3 CP : coordinate system ID (blank)
|
||||||
// 4 X1 : point x coordinate
|
// 4 X1 : point x coordinate
|
||||||
// 5 X2 : point x coordinate
|
// 5 X2 : point y coordinate
|
||||||
// 6 X3 : point x coordinate
|
// 6 X3 : point z coordinate
|
||||||
// 7 CD : coordinate system for displacements (blank)
|
// 7 CD : coordinate system for displacements (blank)
|
||||||
// 8 PS : single point constraints (blank)
|
// 8 PS : single point constraints (blank)
|
||||||
// 9 SEID : super-element ID
|
// 9 SEID : super-element ID
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -47,7 +47,6 @@ SourceFiles
|
|||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
namespace fileFormats
|
namespace fileFormats
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -73,18 +72,18 @@ public:
|
|||||||
//- Output load format
|
//- Output load format
|
||||||
enum loadFormat
|
enum loadFormat
|
||||||
{
|
{
|
||||||
PLOAD2,
|
PLOAD2, //!< Face load (eg, pressure)
|
||||||
PLOAD4
|
PLOAD4 //!< Vertex load
|
||||||
};
|
};
|
||||||
|
|
||||||
//- Selection names for the NASTRAN file field formats
|
//- Selection names for the NASTRAN load formats
|
||||||
static const Enum<loadFormat> loadFormatNames;
|
static const Enum<loadFormat> loadFormatNames;
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Default construct
|
//- Default construct
|
||||||
NASCore() = default;
|
NASCore() noexcept = default;
|
||||||
|
|
||||||
|
|
||||||
// Public Static Member Functions
|
// Public Static Member Functions
|
||||||
@ -92,18 +91,20 @@ public:
|
|||||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||||
static scalar readNasScalar(const std::string& str);
|
static scalar readNasScalar(const std::string& str);
|
||||||
|
|
||||||
//- A string::substr() to handle fixed-format and free-format NASTRAN.
|
//- A std::string::substr() variant to handle fixed-format and
|
||||||
// Returns the substr to the next comma (if found) or the given length
|
//- free-format NASTRAN.
|
||||||
//
|
// Returns the substr until the next comma (if found)
|
||||||
// \param str The string to extract from
|
// or the given fixed width
|
||||||
// \param pos On input, the position of the first character of the
|
|
||||||
// substring. On output, advances to the next position to use.
|
|
||||||
// \param len The fixed-format length to use if a comma is not found.
|
|
||||||
static std::string nextNasField
|
static std::string nextNasField
|
||||||
(
|
(
|
||||||
|
//! The string to extract from
|
||||||
const std::string& str,
|
const std::string& str,
|
||||||
|
//! [in,out] The parse position within \p str
|
||||||
std::string::size_type& pos,
|
std::string::size_type& pos,
|
||||||
std::string::size_type len
|
//! The fixed-format width to use (if comma is not found)
|
||||||
|
const std::string::size_type width,
|
||||||
|
//! The input is known to be free-format
|
||||||
|
const bool free_format = false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
Copyright (C) 2017 OpenCFD Ltd.
|
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -62,13 +62,17 @@ bool Foam::fileFormats::NASedgeFormat::read
|
|||||||
|
|
||||||
while (is.good())
|
while (is.good())
|
||||||
{
|
{
|
||||||
string::size_type linei = 0; // parsing position within current line
|
|
||||||
string line;
|
string line;
|
||||||
is.getLine(line);
|
is.getLine(line);
|
||||||
|
|
||||||
if (line.empty() || line[0] == '$')
|
if (line.empty())
|
||||||
{
|
{
|
||||||
continue; // Skip empty or comment
|
continue; // Ignore empty
|
||||||
|
}
|
||||||
|
else if (line[0] == '$')
|
||||||
|
{
|
||||||
|
// Ignore comment
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if character 72 is continuation
|
// Check if character 72 is continuation
|
||||||
@ -94,41 +98,69 @@ bool Foam::fileFormats::NASedgeFormat::read
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Parsing position within current line
|
||||||
|
std::string::size_type linei = 0;
|
||||||
|
|
||||||
|
// Is free format if line contains a comma
|
||||||
|
const bool freeFormat = line.contains(',');
|
||||||
|
|
||||||
// First word (column 0-8)
|
// First word (column 0-8)
|
||||||
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
||||||
|
|
||||||
if (cmd == "CBEAM" || cmd == "CROD")
|
if (cmd == "CBEAM" || cmd == "CROD")
|
||||||
{
|
{
|
||||||
// discard elementId (8-16)
|
// Fixed format:
|
||||||
(void) nextNasField(line, linei, 8); // 8-16
|
// 8-16 : element id
|
||||||
// discard groupId (16-24)
|
// 16-24 : group id
|
||||||
(void) nextNasField(line, linei, 8); // 16-24
|
// 24-32 : vertex
|
||||||
|
// 32-40 : vertex
|
||||||
|
|
||||||
label a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
// discard elementId
|
||||||
label b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
(void) nextNasField(line, linei, 8, freeFormat);
|
||||||
|
// discard groupId
|
||||||
|
(void) nextNasField(line, linei, 8, freeFormat);
|
||||||
|
|
||||||
dynEdges.append(edge(a,b));
|
label a = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
label b = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
|
||||||
|
dynEdges.emplace_back(a,b);
|
||||||
}
|
}
|
||||||
else if (cmd == "PLOTEL")
|
else if (cmd == "PLOTEL")
|
||||||
{
|
{
|
||||||
|
// Fixed format:
|
||||||
|
// 8-16 : element id
|
||||||
|
// 16-24 : vertex
|
||||||
|
// 24-32 : vertex
|
||||||
|
// 32-40 : vertex
|
||||||
|
|
||||||
// discard elementId (8-16)
|
// discard elementId (8-16)
|
||||||
(void) nextNasField(line, linei, 8); // 8-16
|
(void) nextNasField(line, linei, 8, freeFormat);
|
||||||
|
|
||||||
label a = readLabel(nextNasField(line, linei, 8)); // 16-24
|
label a = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
label b = readLabel(nextNasField(line, linei, 8)); // 24-32
|
label b = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
|
||||||
dynEdges.append(edge(a,b));
|
dynEdges.emplace_back(a,b);
|
||||||
}
|
}
|
||||||
else if (cmd == "GRID")
|
else if (cmd == "GRID")
|
||||||
{
|
{
|
||||||
label index = readLabel(nextNasField(line, linei, 8)); // 8-16
|
// Fixed (short) format:
|
||||||
(void) nextNasField(line, linei, 8); // 16-24
|
// 8-16 : point id
|
||||||
scalar x = readNasScalar(nextNasField(line, linei, 8)); // 24-32
|
// 16-24 : coordinate system (unsupported)
|
||||||
scalar y = readNasScalar(nextNasField(line, linei, 8)); // 32-40
|
// 24-32 : point x coordinate
|
||||||
scalar z = readNasScalar(nextNasField(line, linei, 8)); // 40-48
|
// 32-40 : point y coordinate
|
||||||
|
// 40-48 : point z coordinate
|
||||||
|
// 48-56 : displacement coordinate system (optional, unsupported)
|
||||||
|
// 56-64 : single point constraints (optional, unsupported)
|
||||||
|
// 64-70 : super-element id (optional, unsupported)
|
||||||
|
|
||||||
pointId.append(index);
|
label index = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
dynPoints.append(point(x, y, z));
|
(void) nextNasField(line, linei, 8, freeFormat);
|
||||||
|
scalar x = readNasScalar(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
scalar y = readNasScalar(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
scalar z = readNasScalar(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
|
||||||
|
pointId.push_back(index);
|
||||||
|
dynPoints.emplace_back(x, y, z);
|
||||||
}
|
}
|
||||||
else if (cmd == "GRID*")
|
else if (cmd == "GRID*")
|
||||||
{
|
{
|
||||||
@ -138,6 +170,8 @@ bool Foam::fileFormats::NASedgeFormat::read
|
|||||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||||
// * 2.14897901E+02
|
// * 2.14897901E+02
|
||||||
|
|
||||||
|
// Cannot be long format and free format at the same time!
|
||||||
|
|
||||||
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
||||||
(void) nextNasField(line, linei, 16); // 24-40
|
(void) nextNasField(line, linei, 16); // 24-40
|
||||||
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
||||||
@ -157,8 +191,8 @@ bool Foam::fileFormats::NASedgeFormat::read
|
|||||||
(void) nextNasField(line, linei, 8); // 0-8
|
(void) nextNasField(line, linei, 8); // 0-8
|
||||||
scalar z = readNasScalar(nextNasField(line, linei, 16)); // 8-16
|
scalar z = readNasScalar(nextNasField(line, linei, 16)); // 8-16
|
||||||
|
|
||||||
pointId.append(index);
|
pointId.push_back(index);
|
||||||
dynPoints.append(point(x, y, z));
|
dynPoints.emplace_back(x, y, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -149,7 +149,6 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
|||||||
string line;
|
string line;
|
||||||
while (is.good())
|
while (is.good())
|
||||||
{
|
{
|
||||||
string::size_type linei = 0; // Parsing position within current line
|
|
||||||
is.getLine(line);
|
is.getLine(line);
|
||||||
|
|
||||||
// ANSA extension
|
// ANSA extension
|
||||||
@ -223,16 +222,30 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Parsing position within current line
|
||||||
|
std::string::size_type linei = 0;
|
||||||
|
|
||||||
|
// Is free format if line contains a comma
|
||||||
|
const bool freeFormat = line.contains(',');
|
||||||
|
|
||||||
// First word (column 0-8)
|
// First word (column 0-8)
|
||||||
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
||||||
|
|
||||||
if (cmd == "CTRIA3")
|
if (cmd == "CTRIA3")
|
||||||
{
|
{
|
||||||
label elemId = readLabel(nextNasField(line, linei, 8)); // 8-16
|
// Fixed format:
|
||||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 16-24
|
// 8-16 : element id
|
||||||
const auto a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
// 16-24 : group id
|
||||||
const auto b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
// 24-32 : vertex
|
||||||
const auto c = readLabel(nextNasField(line, linei, 8)); // 40-48
|
// 32-40 : vertex
|
||||||
|
// 40-48 : vertex
|
||||||
|
|
||||||
|
label elemId = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
label groupId = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto a = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto b = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto c = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
|
||||||
// Convert groupId into zoneId
|
// Convert groupId into zoneId
|
||||||
const auto iterZone = zoneLookup.cfind(groupId);
|
const auto iterZone = zoneLookup.cfind(groupId);
|
||||||
@ -261,12 +274,20 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
|||||||
}
|
}
|
||||||
else if (cmd == "CQUAD4")
|
else if (cmd == "CQUAD4")
|
||||||
{
|
{
|
||||||
label elemId = readLabel(nextNasField(line, linei, 8)); // 8-16
|
// Fixed format:
|
||||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 16-24
|
// 8-16 : element id
|
||||||
const auto a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
// 16-24 : group id
|
||||||
const auto b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
// 24-32 : vertex
|
||||||
const auto c = readLabel(nextNasField(line, linei, 8)); // 40-48
|
// 32-40 : vertex
|
||||||
const auto d = readLabel(nextNasField(line, linei, 8)); // 48-56
|
// 40-48 : vertex
|
||||||
|
// 48-56 : vertex
|
||||||
|
|
||||||
|
label elemId = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
label groupId = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto a = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto b = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto c = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
const auto d = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
|
||||||
// Convert groupId into zoneId
|
// Convert groupId into zoneId
|
||||||
const auto iterZone = zoneLookup.cfind(groupId);
|
const auto iterZone = zoneLookup.cfind(groupId);
|
||||||
@ -310,11 +331,21 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
|||||||
}
|
}
|
||||||
else if (cmd == "GRID")
|
else if (cmd == "GRID")
|
||||||
{
|
{
|
||||||
label index = readLabel(nextNasField(line, linei, 8)); // 8-16
|
// Fixed (short) format:
|
||||||
(void) nextNasField(line, linei, 8); // 16-24
|
// 8-16 : point id
|
||||||
scalar x = readNasScalar(nextNasField(line, linei, 8)); // 24-32
|
// 16-24 : coordinate system (not supported)
|
||||||
scalar y = readNasScalar(nextNasField(line, linei, 8)); // 32-40
|
// 24-32 : point x coordinate
|
||||||
scalar z = readNasScalar(nextNasField(line, linei, 8)); // 40-48
|
// 32-40 : point y coordinate
|
||||||
|
// 40-48 : point z coordinate
|
||||||
|
// 48-56 : displacement coordinate system (optional, unsupported)
|
||||||
|
// 56-64 : single point constraints (optional, unsupported)
|
||||||
|
// 64-70 : super-element id (optional, unsupported)
|
||||||
|
|
||||||
|
label index = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
(void) nextNasField(line, linei, 8, freeFormat);
|
||||||
|
scalar x = readNasScalar(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
scalar y = readNasScalar(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
scalar z = readNasScalar(nextNasField(line, linei, 8, freeFormat));
|
||||||
|
|
||||||
pointId.append(index);
|
pointId.append(index);
|
||||||
dynPoints.append(point(x, y, z));
|
dynPoints.append(point(x, y, z));
|
||||||
@ -327,6 +358,8 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
|||||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||||
// * 2.14897901E+02
|
// * 2.14897901E+02
|
||||||
|
|
||||||
|
// Cannot be long format and free format at the same time!
|
||||||
|
|
||||||
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
||||||
(void) nextNasField(line, linei, 16); // 24-40
|
(void) nextNasField(line, linei, 16); // 24-40
|
||||||
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2016 OpenFOAM Foundation
|
Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
Copyright (C) 2015-2024 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -307,16 +307,10 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
|
|||||||
Foam::surfaceWriters::nastranWriter::nastranWriter()
|
Foam::surfaceWriters::nastranWriter::nastranWriter()
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(),
|
||||||
writeFormat_(fieldFormat::SHORT),
|
writeFormat_(fieldFormat::FREE),
|
||||||
fieldMap_(),
|
|
||||||
commonGeometry_(false),
|
commonGeometry_(false),
|
||||||
separator_()
|
separator_(",") // FREE format
|
||||||
{
|
{}
|
||||||
// if (writeFormat_ == fieldFormat::FREE)
|
|
||||||
// {
|
|
||||||
// separator_ = ",";
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::surfaceWriters::nastranWriter::nastranWriter
|
Foam::surfaceWriters::nastranWriter::nastranWriter
|
||||||
@ -331,12 +325,10 @@ Foam::surfaceWriters::nastranWriter::nastranWriter
|
|||||||
(
|
(
|
||||||
"format",
|
"format",
|
||||||
options,
|
options,
|
||||||
fieldFormat::LONG
|
fieldFormat::FREE
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
fieldMap_(),
|
commonGeometry_(options.getOrDefault("commonGeometry", false))
|
||||||
commonGeometry_(options.getOrDefault("commonGeometry", false)),
|
|
||||||
separator_()
|
|
||||||
{
|
{
|
||||||
if (writeFormat_ == fieldFormat::FREE)
|
if (writeFormat_ == fieldFormat::FREE)
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2016 OpenFOAM Foundation
|
Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
Copyright (C) 2015-2024 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -33,13 +33,13 @@ Description
|
|||||||
The formatOptions for nastran:
|
The formatOptions for nastran:
|
||||||
\table
|
\table
|
||||||
Property | Description | Reqd | Default
|
Property | Description | Reqd | Default
|
||||||
fields | Field pairs for PLOAD2/PLOAD4 | yes |
|
format | Nastran format (short/long/free) | no | free
|
||||||
format | Nastran format (short/long/free) | no | long
|
|
||||||
scale | Output geometry scaling | no | 1
|
scale | Output geometry scaling | no | 1
|
||||||
transform | Output coordinate transform | no |
|
transform | Output coordinate transform | no |
|
||||||
fieldLevel | Subtract field level before scaling | no | empty dict
|
fieldLevel | Subtract field level before scaling | no | empty dict
|
||||||
fieldScale | Output field scaling | no | empty dict
|
fieldScale | Output field scaling | no | empty dict
|
||||||
commonGeometry | use separate geometry files | no | false
|
commonGeometry | use separate geometry files | no | false
|
||||||
|
fields | Field pairs for PLOAD2/PLOAD4 | yes |
|
||||||
\endtable
|
\endtable
|
||||||
|
|
||||||
For example,
|
For example,
|
||||||
@ -48,13 +48,6 @@ Description
|
|||||||
{
|
{
|
||||||
nastran
|
nastran
|
||||||
{
|
{
|
||||||
// OpenFOAM field name to NASTRAN load types
|
|
||||||
fields
|
|
||||||
(
|
|
||||||
(pMean PLOAD2)
|
|
||||||
(p PLOAD4)
|
|
||||||
);
|
|
||||||
|
|
||||||
format free; // format type
|
format free; // format type
|
||||||
|
|
||||||
scale 1000; // [m] -> [mm]
|
scale 1000; // [m] -> [mm]
|
||||||
@ -62,6 +55,13 @@ Description
|
|||||||
{
|
{
|
||||||
"p.*" 0.01; // [Pa] -> [mbar]
|
"p.*" 0.01; // [Pa] -> [mbar]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenFOAM field name to NASTRAN load types
|
||||||
|
fields
|
||||||
|
(
|
||||||
|
(pMean PLOAD2)
|
||||||
|
(p PLOAD4)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
\endverbatim
|
\endverbatim
|
||||||
@ -93,7 +93,6 @@ Description
|
|||||||
|
|
||||||
Note
|
Note
|
||||||
Output variable scaling does not apply to integer types such as Ids.
|
Output variable scaling does not apply to integer types such as Ids.
|
||||||
Field pairs default to PLOAD2 for scalars and PLOAD4 for vectors etc.
|
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
nastranSurfaceWriter.C
|
nastranSurfaceWriter.C
|
||||||
@ -221,10 +220,10 @@ public:
|
|||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Default construct. Default SHORT format
|
//- Default construct. Default FREE format
|
||||||
nastranWriter();
|
nastranWriter();
|
||||||
|
|
||||||
//- Construct with some output options. Default LONG format
|
//- Construct with some output options. Default FREE format
|
||||||
explicit nastranWriter(const dictionary& options);
|
explicit nastranWriter(const dictionary& options);
|
||||||
|
|
||||||
//- Construct from components
|
//- Construct from components
|
||||||
|
Loading…
Reference in New Issue
Block a user