Compare commits
12 Commits
feature-am
...
rpmbuild-2
| Author | SHA1 | Date | |
|---|---|---|---|
| 39362aec25 | |||
| fb365b6622 | |||
| 530a5192ca | |||
| 2ef96e9e43 | |||
| 51a34f5abc | |||
| b2532e7769 | |||
| 790de0f98e | |||
| 4510067e63 | |||
| 8cf757daf0 | |||
| 6581c5792a | |||
| 0ef7589979 | |||
| e651d63566 |
@ -1,2 +1,2 @@
|
||||
api=2312
|
||||
patch=240220
|
||||
patch=240625
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2023 OpenCFD Ltd.
|
||||
Copyright (C) 2023-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -310,13 +310,7 @@ void Foam::GAMGSolver::gatherMatrices
|
||||
|
||||
const auto& boundaryMap = agglomeration_.boundaryMap(destLevel);
|
||||
|
||||
// Use PstreamBuffers
|
||||
PstreamBuffers pBufs
|
||||
(
|
||||
UPstream::commsTypes::nonBlocking,
|
||||
UPstream::msgType(),
|
||||
comm
|
||||
);
|
||||
PstreamBuffers pBufs(comm);
|
||||
|
||||
// Send to master
|
||||
if (!UPstream::master(comm))
|
||||
@ -332,35 +326,49 @@ void Foam::GAMGSolver::gatherMatrices
|
||||
|
||||
const label proci = UPstream::myProcNo(comm);
|
||||
|
||||
labelList validInterface(interfaces.size(), -1);
|
||||
// All interfaceBouCoeffs need to be sent across
|
||||
bitSet validCoeffs(interfaces.size());
|
||||
forAll(interfaceBouCoeffs, intI)
|
||||
{
|
||||
if (interfaceBouCoeffs.set(intI))
|
||||
{
|
||||
validCoeffs.set(intI);
|
||||
}
|
||||
}
|
||||
|
||||
// Only preserved interfaces need to be sent across
|
||||
bitSet validInterface(interfaces.size());
|
||||
forAll(interfaces, intI)
|
||||
{
|
||||
const label allIntI = boundaryMap[proci][intI];
|
||||
if (interfaces.set(intI) && allIntI != -1)
|
||||
{
|
||||
validInterface[intI] = intI;
|
||||
validInterface.set(intI);
|
||||
}
|
||||
}
|
||||
|
||||
UOPstream toMaster(UPstream::masterNo(), pBufs);
|
||||
|
||||
toMaster<< mat << token::SPACE << validInterface;
|
||||
toMaster
|
||||
<< mat
|
||||
<< token::SPACE << validCoeffs
|
||||
<< token::SPACE << validInterface;
|
||||
|
||||
forAll(validInterface, intI)
|
||||
for (const label intI : validCoeffs)
|
||||
{
|
||||
if (validInterface[intI] != -1)
|
||||
{
|
||||
const auto& interface = refCast<const GAMGInterfaceField>
|
||||
(
|
||||
interfaces[intI]
|
||||
);
|
||||
toMaster
|
||||
<< interfaceBouCoeffs[intI]
|
||||
<< interfaceIntCoeffs[intI];
|
||||
}
|
||||
for (const label intI : validInterface)
|
||||
{
|
||||
const auto& interface = refCast<const GAMGInterfaceField>
|
||||
(
|
||||
interfaces[intI]
|
||||
);
|
||||
|
||||
toMaster
|
||||
<< interfaceBouCoeffs[intI]
|
||||
<< interfaceIntCoeffs[intI]
|
||||
<< interface.type();
|
||||
interface.write(toMaster);
|
||||
}
|
||||
toMaster << interface.type();
|
||||
interface.write(toMaster);
|
||||
}
|
||||
}
|
||||
|
||||
@ -376,10 +384,10 @@ void Foam::GAMGSolver::gatherMatrices
|
||||
lduInterfacePtrsList destInterfaces = destMesh.interfaces();
|
||||
|
||||
// Master.
|
||||
otherMats.setSize(nProcs-1);
|
||||
otherBouCoeffs.setSize(nProcs-1);
|
||||
otherIntCoeffs.setSize(nProcs-1);
|
||||
otherInterfaces.setSize(nProcs-1);
|
||||
otherMats.resize(nProcs-1);
|
||||
otherBouCoeffs.resize(nProcs-1);
|
||||
otherIntCoeffs.resize(nProcs-1);
|
||||
otherInterfaces.resize(nProcs-1);
|
||||
|
||||
for (const int proci : UPstream::subProcs(comm))
|
||||
{
|
||||
@ -389,60 +397,41 @@ void Foam::GAMGSolver::gatherMatrices
|
||||
|
||||
otherMats.set(otherI, new lduMatrix(destMesh, fromProc));
|
||||
|
||||
// Receive number of/valid interfaces
|
||||
// >= 0 : remote interface index
|
||||
// -1 : invalid interface
|
||||
const labelList validInterface(fromProc);
|
||||
// Receive bit-sets of valid interfaceCoeffs/interfaces
|
||||
const bitSet validCoeffs(fromProc);
|
||||
const bitSet validInterface(fromProc);
|
||||
|
||||
otherBouCoeffs.set
|
||||
(
|
||||
otherI,
|
||||
new FieldField<Field, scalar>(validInterface.size())
|
||||
);
|
||||
otherIntCoeffs.set
|
||||
(
|
||||
otherI,
|
||||
new FieldField<Field, scalar>(validInterface.size())
|
||||
);
|
||||
otherInterfaces.set
|
||||
(
|
||||
otherI,
|
||||
new PtrList<lduInterfaceField>(validInterface.size())
|
||||
);
|
||||
otherBouCoeffs.emplace_set(otherI, validCoeffs.size());
|
||||
otherIntCoeffs.emplace_set(otherI, validCoeffs.size());
|
||||
otherInterfaces.emplace_set(otherI, validInterface.size());
|
||||
|
||||
forAll(validInterface, intI)
|
||||
// Receive individual interface contributions
|
||||
for (const label intI : validCoeffs)
|
||||
{
|
||||
if (validInterface[intI] != -1)
|
||||
{
|
||||
otherBouCoeffs[otherI].set
|
||||
(
|
||||
intI,
|
||||
new scalarField(fromProc)
|
||||
);
|
||||
otherIntCoeffs[otherI].set
|
||||
(
|
||||
intI,
|
||||
new scalarField(fromProc)
|
||||
);
|
||||
otherBouCoeffs[otherI].emplace_set(intI, fromProc);
|
||||
otherIntCoeffs[otherI].emplace_set(intI, fromProc);
|
||||
}
|
||||
|
||||
const word coupleType(fromProc);
|
||||
// Receive individual interface contributions
|
||||
for (const label intI : validInterface)
|
||||
{
|
||||
const word coupleType(fromProc);
|
||||
|
||||
const label allIntI = boundaryMap[proci][intI];
|
||||
const label allIntI = boundaryMap[proci][intI];
|
||||
|
||||
otherInterfaces[otherI].set
|
||||
otherInterfaces[otherI].set
|
||||
(
|
||||
intI,
|
||||
GAMGInterfaceField::New
|
||||
(
|
||||
intI,
|
||||
GAMGInterfaceField::New
|
||||
coupleType,
|
||||
refCast<const GAMGInterface>
|
||||
(
|
||||
coupleType,
|
||||
refCast<const GAMGInterface>
|
||||
(
|
||||
destInterfaces[allIntI]
|
||||
),
|
||||
fromProc
|
||||
).release()
|
||||
);
|
||||
}
|
||||
destInterfaces[allIntI]
|
||||
),
|
||||
fromProc
|
||||
).release()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2017-2023 OpenCFD Ltd.
|
||||
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -136,7 +136,8 @@ std::string Foam::fileFormats::NASCore::nextNasField
|
||||
(
|
||||
const std::string& str,
|
||||
std::string::size_type& pos,
|
||||
std::string::size_type len
|
||||
const std::string::size_type width,
|
||||
const bool free_format
|
||||
)
|
||||
{
|
||||
const auto beg = pos;
|
||||
@ -144,15 +145,23 @@ std::string Foam::fileFormats::NASCore::nextNasField
|
||||
|
||||
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
|
||||
{
|
||||
len = (end - beg); // Efffective width
|
||||
pos = end + 1; // Continue after comma
|
||||
// Free format - continue after comma
|
||||
pos = end + 1;
|
||||
return str.substr(beg, (end - beg));
|
||||
}
|
||||
|
||||
return str.substr(beg, len);
|
||||
}
|
||||
|
||||
|
||||
@ -249,8 +258,8 @@ void Foam::fileFormats::NASCore::writeCoord
|
||||
// 2 ID : point ID - requires starting index of 1
|
||||
// 3 CP : coordinate system ID (blank)
|
||||
// 4 X1 : point x coordinate
|
||||
// 5 X2 : point x coordinate
|
||||
// 6 X3 : point x coordinate
|
||||
// 5 X2 : point y coordinate
|
||||
// 6 X3 : point z coordinate
|
||||
// 7 CD : coordinate system for displacements (blank)
|
||||
// 8 PS : single point constraints (blank)
|
||||
// 9 SEID : super-element ID
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2017-2023 OpenCFD Ltd.
|
||||
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -47,7 +47,6 @@ SourceFiles
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
namespace fileFormats
|
||||
{
|
||||
|
||||
@ -79,18 +78,18 @@ public:
|
||||
//- Output load format
|
||||
enum loadFormat
|
||||
{
|
||||
PLOAD2,
|
||||
PLOAD4
|
||||
PLOAD2, //!< Face load (eg, pressure)
|
||||
PLOAD4 //!< Vertex load
|
||||
};
|
||||
|
||||
//- Selection names for the NASTRAN file field formats
|
||||
//- Selection names for the NASTRAN load formats
|
||||
static const Enum<loadFormat> loadFormatNames;
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Default construct
|
||||
NASCore() = default;
|
||||
NASCore() noexcept = default;
|
||||
|
||||
|
||||
// Public Static Member Functions
|
||||
@ -98,18 +97,20 @@ public:
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
static scalar readNasScalar(const std::string& str);
|
||||
|
||||
//- A string::substr() to handle fixed-format and free-format NASTRAN.
|
||||
// Returns the substr to the next comma (if found) or the given length
|
||||
//
|
||||
// \param str The string to extract from
|
||||
// \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.
|
||||
//- A std::string::substr() variant to handle fixed-format and
|
||||
//- free-format NASTRAN.
|
||||
// Returns the substr until the next comma (if found)
|
||||
// or the given fixed width
|
||||
static std::string nextNasField
|
||||
(
|
||||
//! The string to extract from
|
||||
const std::string& str,
|
||||
//! [in,out] The parse position within \p str
|
||||
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 |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2023 OpenCFD Ltd.
|
||||
Copyright (C) 2016-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -61,6 +61,36 @@ static bool startsWithSolid(const char header[STLHeaderSize])
|
||||
}
|
||||
|
||||
|
||||
// Check if file size appears to be reasonable for an STL binary file.
|
||||
// Compare file size with that expected from number of tris
|
||||
// If this is not sensible, it may be an ASCII file
|
||||
//
|
||||
// sizeof(STLtriangle) = 50 bytes [int16 + 4 * (3 float)]
|
||||
|
||||
inline static bool checkBinaryFileSize
|
||||
(
|
||||
const int64_t nTris,
|
||||
const Foam::fileName& file
|
||||
)
|
||||
{
|
||||
// When checking the content size, account for the header size (80),
|
||||
// but ignore the nTris information (int32_t) to give some rounding
|
||||
|
||||
const int64_t contentSize =
|
||||
(
|
||||
int64_t(Foam::fileSize(file))
|
||||
- int64_t(STLHeaderSize)
|
||||
);
|
||||
|
||||
return
|
||||
(
|
||||
(contentSize >= 0)
|
||||
&& (nTris >= contentSize/50)
|
||||
&& (nTris <= contentSize/25)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::fileFormats::STLCore::isBinaryName
|
||||
@ -117,31 +147,31 @@ int Foam::fileFormats::STLCore::detectBinaryHeader
|
||||
|
||||
|
||||
// Read the number of triangles in the STL file
|
||||
// (note: read as signed so we can check whether >2^31)
|
||||
// (note: read as signed int so we can check whether >2^31).
|
||||
//
|
||||
// With nTris == 2^31, file size is 107.37 GB !
|
||||
//
|
||||
// However, the limit is more likely caused by the number of points
|
||||
// that can be stored (label-size=32) when flattened for merging.
|
||||
// So more like 715.8M triangles (~35.8 GB)
|
||||
|
||||
int32_t nTris;
|
||||
is.read(reinterpret_cast<char*>(&nTris), sizeof(int32_t));
|
||||
|
||||
// Check that stream is OK and number of triangles is positive,
|
||||
// if not this may be an ASCII file
|
||||
bool ok = (is && nTris >= 0);
|
||||
|
||||
bool bad = (!is || nTris < 0);
|
||||
|
||||
if (!bad && unCompressed)
|
||||
if (ok && unCompressed)
|
||||
{
|
||||
// Compare file size with that expected from number of tris
|
||||
// If this is not sensible, it may be an ASCII file
|
||||
|
||||
const off_t dataFileSize = Foam::fileSize(filename);
|
||||
|
||||
bad =
|
||||
(
|
||||
nTris < int(dataFileSize - STLHeaderSize)/50
|
||||
|| nTris > int(dataFileSize - STLHeaderSize)/25
|
||||
);
|
||||
ok = checkBinaryFileSize(nTris, filename);
|
||||
}
|
||||
|
||||
//if (ok)
|
||||
//{
|
||||
// InfoErr<< "stlb : " << nTris << " triangles" << nl;
|
||||
//}
|
||||
|
||||
// Return number of triangles if it appears to be BINARY and good.
|
||||
return (bad ? 0 : nTris);
|
||||
return (ok ? nTris : 0);
|
||||
}
|
||||
|
||||
|
||||
@ -189,31 +219,27 @@ Foam::fileFormats::STLCore::readBinaryHeader
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// Read the number of triangles in the STl file
|
||||
// (note: read as int so we can check whether >2^31)
|
||||
|
||||
// Read the number of triangles in the STL file
|
||||
// (note: read as signed int so we can check whether >2^31).
|
||||
//
|
||||
// With nTris == 2^31, file size is 107.37 GB !
|
||||
//
|
||||
// However, the limit is more likely caused by the number of points
|
||||
// that can be stored (label-size=32) when flattened for merging.
|
||||
// So more like 715.8M triangles (~35.8 GB)
|
||||
|
||||
int32_t nTris;
|
||||
is.read(reinterpret_cast<char*>(&nTris), sizeof(int32_t));
|
||||
|
||||
// Check that stream is OK and number of triangles is positive,
|
||||
// if not this maybe an ASCII file
|
||||
bool ok = (is && nTris >= 0);
|
||||
|
||||
bool bad = (!is || nTris < 0);
|
||||
|
||||
if (!bad && unCompressed)
|
||||
if (ok && unCompressed)
|
||||
{
|
||||
// Compare file size with that expected from number of tris
|
||||
// If this is not sensible, it may be an ASCII file
|
||||
|
||||
const off_t dataFileSize = Foam::fileSize(filename);
|
||||
|
||||
bad =
|
||||
(
|
||||
nTris < int(dataFileSize - STLHeaderSize)/50
|
||||
|| nTris > int(dataFileSize - STLHeaderSize)/25
|
||||
);
|
||||
ok = checkBinaryFileSize(nTris, filename);
|
||||
}
|
||||
|
||||
if (bad)
|
||||
if (!ok)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "problem reading number of triangles, perhaps file is not binary"
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2013-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2019-2023 OpenCFD Ltd.
|
||||
Copyright (C) 2019-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -444,7 +444,14 @@ void Foam::cyclicACMIFvPatchField<Type>::initEvaluate
|
||||
<< " starting send&receive"
|
||||
<< endl;
|
||||
|
||||
if (!this->ready())
|
||||
// Bypass polyPatch to get nbrId.
|
||||
// - use cyclicACMIFvPatch::neighbPatch() virtual instead
|
||||
const cyclicACMIFvPatch& neighbPatch = cyclicACMIPatch_.neighbPatch();
|
||||
const labelUList& nbrFaceCells = neighbPatch.faceCells();
|
||||
const Field<Type> pnf(this->primitiveField(), nbrFaceCells);
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
@ -453,11 +460,8 @@ void Foam::cyclicACMIFvPatchField<Type>::initEvaluate
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// By-pass polyPatch to get nbrId. Instead use cyclicACMIFvPatch virtual
|
||||
// neighbPatch()
|
||||
const cyclicACMIFvPatch& neighbPatch = cyclicACMIPatch_.neighbPatch();
|
||||
const labelUList& nbrFaceCells = neighbPatch.faceCells();
|
||||
const Field<Type> pnf(this->primitiveField(), nbrFaceCells);
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
cyclicACMIPatch_.initInterpolate
|
||||
(
|
||||
@ -515,6 +519,10 @@ void Foam::cyclicACMIFvPatchField<Type>::evaluate
|
||||
).ptr()
|
||||
);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
|
||||
|
||||
auto& patchNeighbourField = patchNeighbourFieldPtr_.ref();
|
||||
|
||||
if (doTransform())
|
||||
@ -559,7 +567,16 @@ void Foam::cyclicACMIFvPatchField<Type>::initInterfaceMatrixUpdate
|
||||
<< " starting send&receive"
|
||||
<< endl;
|
||||
|
||||
if (!this->ready())
|
||||
const labelUList& nbrFaceCells =
|
||||
lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID());
|
||||
|
||||
solveScalarField pnf(psiInternal, nbrFaceCells);
|
||||
|
||||
// Transform according to the transformation tensors
|
||||
transformCoupleField(pnf, cmpt);
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
@ -568,13 +585,8 @@ void Foam::cyclicACMIFvPatchField<Type>::initInterfaceMatrixUpdate
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
const labelUList& nbrFaceCells =
|
||||
lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID());
|
||||
|
||||
solveScalarField pnf(psiInternal, nbrFaceCells);
|
||||
|
||||
// Transform according to the transformation tensors
|
||||
transformCoupleField(pnf, cmpt);
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
cyclicACMIPatch_.initInterpolate
|
||||
(
|
||||
@ -635,6 +647,9 @@ void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
|
||||
recvRequests_,
|
||||
scalarRecvBufs_
|
||||
);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -676,7 +691,16 @@ void Foam::cyclicACMIFvPatchField<Type>::initInterfaceMatrixUpdate
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
if (!this->ready())
|
||||
const labelUList& nbrFaceCells =
|
||||
lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID());
|
||||
|
||||
Field<Type> pnf(psiInternal, nbrFaceCells);
|
||||
|
||||
// Transform according to the transformation tensors
|
||||
transformCoupleField(pnf);
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
@ -685,13 +709,8 @@ void Foam::cyclicACMIFvPatchField<Type>::initInterfaceMatrixUpdate
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
const labelUList& nbrFaceCells =
|
||||
lduAddr.patchAddr(cyclicACMIPatch_.neighbPatchID());
|
||||
|
||||
Field<Type> pnf(psiInternal, nbrFaceCells);
|
||||
|
||||
// Transform according to the transformation tensors
|
||||
transformCoupleField(pnf);
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
cyclicACMIPatch_.initInterpolate
|
||||
(
|
||||
@ -741,6 +760,9 @@ void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
|
||||
recvRequests_,
|
||||
recvBufs_
|
||||
);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2019-2023 OpenCFD Ltd.
|
||||
Copyright (C) 2019-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -446,14 +446,27 @@ void Foam::cyclicAMIFvPatchField<Type>::initEvaluate
|
||||
|
||||
// Start sending
|
||||
|
||||
// By-pass polyPatch to get nbrId. Instead use cyclicAMIFvPatch virtual
|
||||
// neighbPatch()
|
||||
// Bypass polyPatch to get nbrId.
|
||||
// - use cyclicACMIFvPatch::neighbPatch() virtual instead
|
||||
const cyclicAMIFvPatch& neighbPatch = cyclicAMIPatch_.neighbPatch();
|
||||
const labelUList& nbrFaceCells = neighbPatch.faceCells();
|
||||
const Field<Type> pnf(this->primitiveField(), nbrFaceCells);
|
||||
|
||||
const cyclicAMIPolyPatch& cpp = cyclicAMIPatch_.cyclicAMIPatch();
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
<< cyclicAMIPatch_.name()
|
||||
<< " field " << this->internalField().name()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
cpp.initInterpolate
|
||||
(
|
||||
pnf,
|
||||
@ -516,6 +529,10 @@ void Foam::cyclicAMIFvPatchField<Type>::evaluate
|
||||
defaultValues
|
||||
).ptr()
|
||||
);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
|
||||
auto& patchNeighbourField = patchNeighbourFieldPtr_.ref();
|
||||
|
||||
if (doTransform())
|
||||
@ -563,6 +580,19 @@ void Foam::cyclicAMIFvPatchField<Type>::initInterfaceMatrixUpdate
|
||||
|
||||
const cyclicAMIPolyPatch& cpp = cyclicAMIPatch_.cyclicAMIPatch();
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
<< cyclicAMIPatch_.name()
|
||||
<< " field " << this->internalField().name()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
cpp.initInterpolate
|
||||
(
|
||||
pnf,
|
||||
@ -624,6 +654,9 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
|
||||
scalarRecvBufs_,
|
||||
defaultValues
|
||||
);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -682,6 +715,19 @@ void Foam::cyclicAMIFvPatchField<Type>::initInterfaceMatrixUpdate
|
||||
|
||||
const cyclicAMIPolyPatch& cpp = cyclicAMIPatch_.cyclicAMIPatch();
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
<< cyclicAMIPatch_.name()
|
||||
<< " field " << this->internalField().name()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
cpp.initInterpolate
|
||||
(
|
||||
pnf,
|
||||
@ -742,6 +788,9 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
|
||||
recvBufs_,
|
||||
defaultValues
|
||||
);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -43,7 +43,7 @@ Type Foam::functionObjects::extractEulerianParticles::faceValue
|
||||
{
|
||||
label patchi = patchIDs_[localFacei];
|
||||
label pFacei = patchFaceIDs_[localFacei];
|
||||
if (patchi != 0)
|
||||
if (patchi != -1)
|
||||
{
|
||||
return field.boundaryField()[patchi][pFacei];
|
||||
}
|
||||
|
||||
@ -302,7 +302,7 @@ void Foam::ThermoSurfaceFilm<CloudType>::cacheFilmFields
|
||||
TFilmPatch_ = film.Tf().primitiveField();
|
||||
|
||||
// Direct copy (one-to-one mapping)
|
||||
TFilmPatch_ = film.Cp().primitiveField();
|
||||
CpFilmPatch_ = film.Cp().primitiveField();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2013 OpenFOAM Foundation
|
||||
Copyright (C) 2019,2023 OpenCFD Ltd.
|
||||
Copyright (C) 2019-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -217,6 +217,18 @@ void Foam::cyclicACMIGAMGInterfaceField::initInterfaceMatrixUpdate
|
||||
: AMI.srcMap()
|
||||
);
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
<< cyclicACMIInterface_.index()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
// Insert send/receive requests (non-blocking). See e.g.
|
||||
// cyclicAMIPolyPatchTemplates.C
|
||||
const label oldWarnComm = UPstream::commWarn(AMI.comm());
|
||||
@ -276,6 +288,9 @@ void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix
|
||||
solveScalarField work;
|
||||
map.receive(recvRequests_, scalarRecvBufs_, work);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
|
||||
solveScalarField pnf(faceCells.size(), Zero);
|
||||
AMI.weightedSum
|
||||
(
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||
Copyright (C) 2019,2023 OpenCFD Ltd.
|
||||
Copyright (C) 2019-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -218,6 +218,18 @@ void Foam::cyclicAMIGAMGInterfaceField::initInterfaceMatrixUpdate
|
||||
: AMI.srcMap()
|
||||
);
|
||||
|
||||
// Assert that all receives are known to have finished
|
||||
if (!recvRequests_.empty())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Outstanding recv request(s) on patch "
|
||||
<< cyclicAMIInterface_.index()
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// Assume that sends are also OK
|
||||
sendRequests_.clear();
|
||||
|
||||
// Insert send/receive requests (non-blocking). See e.g.
|
||||
// cyclicAMIPolyPatchTemplates.C
|
||||
const label oldWarnComm = UPstream::commWarn(AMI.comm());
|
||||
@ -290,6 +302,9 @@ void Foam::cyclicAMIGAMGInterfaceField::updateInterfaceMatrix
|
||||
solveScalarField work;
|
||||
map.receive(recvRequests_, scalarRecvBufs_, work);
|
||||
|
||||
// Receive requests all handled by last function call
|
||||
recvRequests_.clear();
|
||||
|
||||
solveScalarField pnf(faceCells.size(), Zero);
|
||||
AMI.weightedSum
|
||||
(
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2021-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2021-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -70,7 +70,7 @@ static tmp<vectorField> getBoundedColours
|
||||
const scalar boundMax
|
||||
)
|
||||
{
|
||||
const label boundDelta = (boundMax - boundMin + ROOTVSMALL);
|
||||
const scalar boundDelta = (boundMax - boundMin + ROOTVSMALL);
|
||||
|
||||
auto tresult = tmp<vectorField>::New(field.size());
|
||||
auto& result = tresult.ref();
|
||||
@ -167,7 +167,7 @@ Foam::scalarMinMax Foam::coordSetWriters::gltfWriter::getFieldLimits
|
||||
{
|
||||
const dictionary fieldDict = fieldInfoDict_.subOrEmptyDict(fieldName);
|
||||
|
||||
scalarMinMax limits;
|
||||
scalarMinMax limits(-GREAT, GREAT);
|
||||
|
||||
fieldDict.readIfPresent("min", limits.min());
|
||||
fieldDict.readIfPresent("max", limits.max());
|
||||
@ -191,7 +191,7 @@ Foam::coordSetWriters::gltfWriter::getAlphaField
|
||||
{
|
||||
// Not specified
|
||||
}
|
||||
else if (!eptr->stream().peek().isString())
|
||||
else if (!eptr->stream().peek().isWord())
|
||||
{
|
||||
// Value specified
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2021-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2021-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -45,24 +45,27 @@ Description
|
||||
\verbatim
|
||||
formatOptions
|
||||
{
|
||||
// Apply colours flag (yes | no ) [optional]
|
||||
colours yes;
|
||||
|
||||
// List of options per field
|
||||
fieldInfo
|
||||
gltf
|
||||
{
|
||||
p
|
||||
// Apply colours flag (yes | no ) [optional]
|
||||
colour yes;
|
||||
|
||||
// List of options per field
|
||||
fieldInfo
|
||||
{
|
||||
// Colour map [optional]
|
||||
colourMap <colourMap>;
|
||||
p
|
||||
{
|
||||
// Colour map [optional]
|
||||
colourMap <colourMap>;
|
||||
|
||||
// Colour map minimum and maximum limits [optional]
|
||||
// Uses field min and max if not specified
|
||||
min 0;
|
||||
max 1;
|
||||
// Colour map minimum and maximum limits [optional]
|
||||
// Uses field min and max if not specified
|
||||
min 0;
|
||||
max 1;
|
||||
|
||||
// Alpha channel [optional] (<scalar>)
|
||||
alpha 0.5;
|
||||
// Alpha channel [optional] (<scalar>)
|
||||
alpha 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -73,35 +76,38 @@ Description
|
||||
\verbatim
|
||||
formatOptions
|
||||
{
|
||||
// Apply colours flag (yes | no) [optional]
|
||||
colours yes;
|
||||
|
||||
// Animate tracks (yes | no) [optional]
|
||||
animate yes;
|
||||
|
||||
// Animation properties [optional]
|
||||
animationInfo
|
||||
gltf
|
||||
{
|
||||
// Colour map [optional]
|
||||
colourMap <colourMap>;
|
||||
// Apply colours flag (yes | no) [optional]
|
||||
colour yes;
|
||||
|
||||
// Colour [optional] (<vector> | uniform | field)
|
||||
colour (1 0 0); // RGB in range [0-1]
|
||||
// Animate tracks (yes | no) [optional]
|
||||
animate yes;
|
||||
|
||||
//colour uniform;
|
||||
//colourValue (1 0 0); // RGB in range [0-1]
|
||||
// Animation properties [optional]
|
||||
animationInfo
|
||||
{
|
||||
// Colour map [optional]
|
||||
colourMap <colourMap>;
|
||||
|
||||
//colour field;
|
||||
//colourField d;
|
||||
// Colour [optional] (<vector> | uniform | field)
|
||||
colour (1 0 0); // RGB in range [0-1]
|
||||
|
||||
// Colour map minimum and maximum limits [optional]
|
||||
// Note: for colour = field option
|
||||
// Uses field min and max if not specified
|
||||
min 0;
|
||||
max 1;
|
||||
//colour uniform;
|
||||
//colourValue (1 0 0); // RGB in range [0-1]
|
||||
|
||||
// Alpha channel [optional] (<scalar>)
|
||||
alpha 0.5;
|
||||
//colour field;
|
||||
//colourField d;
|
||||
|
||||
// Colour map minimum and maximum limits [optional]
|
||||
// Note: for colour = field option
|
||||
// Uses field min and max if not specified
|
||||
min 0;
|
||||
max 1;
|
||||
|
||||
// Alpha channel [optional] (<scalar>)
|
||||
alpha 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2017 OpenCFD Ltd.
|
||||
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -62,13 +62,17 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
|
||||
while (is.good())
|
||||
{
|
||||
string::size_type linei = 0; // parsing position within current line
|
||||
string 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
|
||||
@ -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)
|
||||
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
||||
|
||||
if (cmd == "CBEAM" || cmd == "CROD")
|
||||
{
|
||||
// discard elementId (8-16)
|
||||
(void) nextNasField(line, linei, 8); // 8-16
|
||||
// discard groupId (16-24)
|
||||
(void) nextNasField(line, linei, 8); // 16-24
|
||||
// Fixed format:
|
||||
// 8-16 : element id
|
||||
// 16-24 : group id
|
||||
// 24-32 : vertex
|
||||
// 32-40 : vertex
|
||||
|
||||
label a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
label b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
||||
// discard elementId
|
||||
(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")
|
||||
{
|
||||
// Fixed format:
|
||||
// 8-16 : element id
|
||||
// 16-24 : vertex
|
||||
// 24-32 : vertex
|
||||
// 32-40 : vertex
|
||||
|
||||
// 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 b = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
label a = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||
label b = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||
|
||||
dynEdges.append(edge(a,b));
|
||||
dynEdges.emplace_back(a,b);
|
||||
}
|
||||
else if (cmd == "GRID")
|
||||
{
|
||||
label index = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
(void) nextNasField(line, linei, 8); // 16-24
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 8)); // 24-32
|
||||
scalar y = readNasScalar(nextNasField(line, linei, 8)); // 32-40
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 8)); // 40-48
|
||||
// Fixed (short) format:
|
||||
// 8-16 : point id
|
||||
// 16-24 : coordinate system (unsupported)
|
||||
// 24-32 : point x coordinate
|
||||
// 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);
|
||||
dynPoints.append(point(x, y, z));
|
||||
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.push_back(index);
|
||||
dynPoints.emplace_back(x, y, z);
|
||||
}
|
||||
else if (cmd == "GRID*")
|
||||
{
|
||||
@ -138,6 +170,8 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||
// * 2.14897901E+02
|
||||
|
||||
// Cannot be long format and free format at the same time!
|
||||
|
||||
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
||||
(void) nextNasField(line, linei, 16); // 24-40
|
||||
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
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 16)); // 8-16
|
||||
|
||||
pointId.append(index);
|
||||
dynPoints.append(point(x, y, z));
|
||||
pointId.push_back(index);
|
||||
dynPoints.emplace_back(x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -420,19 +420,21 @@ void Foam::incompressibleAdjointSolver::accumulateBCSensitivityIntegrand
|
||||
fvPatchVectorField& Uab = UaBoundary[patchI];
|
||||
if (isA<adjointVectorBoundaryCondition>(Uab))
|
||||
{
|
||||
const fvPatch& patch = mesh_.boundary()[patchI];
|
||||
tmp<vectorField> tnf = patch.nf();
|
||||
const scalarField& magSf = patch.magSf();
|
||||
tmp<tensorField> dxdbMult =
|
||||
refCast<adjointVectorBoundaryCondition>(Uab).dxdbMult();
|
||||
if (dxdbMult)
|
||||
{
|
||||
const fvPatch& patch = mesh_.boundary()[patchI];
|
||||
tmp<vectorField> tnf = patch.nf();
|
||||
const scalarField& magSf = patch.magSf();
|
||||
|
||||
tmp<vectorField> DvDbMult =
|
||||
nuEffBoundary[patchI]*(Uab.snGrad() + (gradUabf[patchI] & tnf))
|
||||
// - (nf*pa.boundaryField()[patchI])
|
||||
+ adjointTurbulence().adjointMomentumBCSource()[patchI];
|
||||
bcDxDbMult()[patchI] +=
|
||||
(
|
||||
DvDbMult
|
||||
& refCast<adjointVectorBoundaryCondition>(Uab).dxdbMult()
|
||||
)*magSf*dt;
|
||||
tmp<vectorField> DvDbMult =
|
||||
nuEffBoundary[patchI]
|
||||
*(Uab.snGrad() + (gradUabf[patchI] & tnf))
|
||||
// - (nf*pa.boundaryField()[patchI])
|
||||
+ adjointTurbulence().adjointMomentumBCSource()[patchI];
|
||||
bcDxDbMult()[patchI] += (DvDbMult & dxdbMult())*magSf*dt;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2020 OpenCFD Ltd.
|
||||
Copyright (C) 2016-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -39,7 +39,11 @@ Foam::sampledMeshedSurface::sampleOnFaces
|
||||
{
|
||||
const Type deflt
|
||||
(
|
||||
defaultValues_.getOrDefault<Type>(sampler.psi().name(), Zero)
|
||||
defaultValues_.getOrDefault<Type>
|
||||
(
|
||||
sampler.psi().name(),
|
||||
Foam::zero{}
|
||||
)
|
||||
);
|
||||
|
||||
const labelList& elements = sampleElements_;
|
||||
@ -71,13 +75,16 @@ Foam::sampledMeshedSurface::sampleOnFaces
|
||||
|
||||
const polyBoundaryMesh& pbm = mesh().boundaryMesh();
|
||||
|
||||
Field<Type> bVals(mesh().nBoundaryFaces(), Zero);
|
||||
Field<Type> bVals(mesh().nBoundaryFaces(), deflt);
|
||||
|
||||
const auto& bField = sampler.psi().boundaryField();
|
||||
|
||||
forAll(bField, patchi)
|
||||
{
|
||||
SubList<Type>(bVals, pbm[patchi].range()) = bField[patchi];
|
||||
// Note: restrict transcribing to actual size of the patch field
|
||||
// - handles "empty" patch type etc.
|
||||
const auto& pfld = bField[patchi];
|
||||
SubList<Type>(bVals, pfld.size(), pbm[patchi].offset()) = pfld;
|
||||
}
|
||||
|
||||
// Sample within the flat boundary field
|
||||
@ -109,7 +116,11 @@ Foam::sampledMeshedSurface::sampleOnPoints
|
||||
{
|
||||
const Type deflt
|
||||
(
|
||||
defaultValues_.getOrDefault<Type>(interpolator.psi().name(), Zero)
|
||||
defaultValues_.getOrDefault<Type>
|
||||
(
|
||||
interpolator.psi().name(),
|
||||
Foam::zero{}
|
||||
)
|
||||
);
|
||||
|
||||
const labelList& elements = sampleElements_;
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
Copyright (C) 2017-2023 OpenCFD Ltd.
|
||||
Copyright (C) 2017-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -183,8 +183,6 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
|
||||
while (is.good())
|
||||
{
|
||||
// Parsing position within current line
|
||||
std::string::size_type linei = 0;
|
||||
is.getLine(line);
|
||||
|
||||
if (NASCore::debug > 1) Info<< "Process: " << line << nl;
|
||||
@ -319,16 +317,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)
|
||||
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
||||
|
||||
if (cmd == "CTRIA3")
|
||||
{
|
||||
label elemId = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 16-24
|
||||
const auto a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
const auto b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
||||
const auto c = readLabel(nextNasField(line, linei, 8)); // 40-48
|
||||
// Fixed format:
|
||||
// 8-16 : element id
|
||||
// 16-24 : group id
|
||||
// 24-32 : vertex
|
||||
// 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
|
||||
const auto iterZone = zoneLookup.cfind(groupId);
|
||||
@ -357,12 +369,20 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
else if (cmd == "CQUAD4")
|
||||
{
|
||||
label elemId = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 16-24
|
||||
const auto a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
const auto b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
||||
const auto c = readLabel(nextNasField(line, linei, 8)); // 40-48
|
||||
const auto d = readLabel(nextNasField(line, linei, 8)); // 48-56
|
||||
// Fixed format:
|
||||
// 8-16 : element id
|
||||
// 16-24 : group id
|
||||
// 24-32 : vertex
|
||||
// 32-40 : vertex
|
||||
// 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
|
||||
const auto iterZone = zoneLookup.cfind(groupId);
|
||||
@ -406,11 +426,21 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
else if (cmd == "GRID")
|
||||
{
|
||||
label index = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
(void) nextNasField(line, linei, 8); // 16-24
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 8)); // 24-32
|
||||
scalar y = readNasScalar(nextNasField(line, linei, 8)); // 32-40
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 8)); // 40-48
|
||||
// Fixed (short) format:
|
||||
// 8-16 : point id
|
||||
// 16-24 : coordinate system (not supported)
|
||||
// 24-32 : point x coordinate
|
||||
// 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.push_back(index);
|
||||
dynPoints.emplace_back(x, y, z);
|
||||
@ -423,6 +453,8 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||
// * 2.14897901E+02
|
||||
|
||||
// Cannot be long format and free format at the same time!
|
||||
|
||||
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
||||
(void) nextNasField(line, linei, 16); // 24-40
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
||||
@ -452,7 +484,10 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
// have the 'weird' format where the immediately preceeding
|
||||
// comment contains the information.
|
||||
|
||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
// Fixed format:
|
||||
// 8-16 : pshell id
|
||||
|
||||
label groupId = readLabel(nextNasField(line, linei, 8, freeFormat));
|
||||
|
||||
if (lastComment.size() > 1 && !nameLookup.contains(groupId))
|
||||
{
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2015-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -307,16 +307,10 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry
|
||||
Foam::surfaceWriters::nastranWriter::nastranWriter()
|
||||
:
|
||||
surfaceWriter(),
|
||||
writeFormat_(fieldFormat::SHORT),
|
||||
fieldMap_(),
|
||||
writeFormat_(fieldFormat::FREE),
|
||||
commonGeometry_(false),
|
||||
separator_()
|
||||
{
|
||||
// if (writeFormat_ == fieldFormat::FREE)
|
||||
// {
|
||||
// separator_ = ",";
|
||||
// }
|
||||
}
|
||||
separator_(",") // FREE format
|
||||
{}
|
||||
|
||||
|
||||
Foam::surfaceWriters::nastranWriter::nastranWriter
|
||||
@ -331,12 +325,10 @@ Foam::surfaceWriters::nastranWriter::nastranWriter
|
||||
(
|
||||
"format",
|
||||
options,
|
||||
fieldFormat::LONG
|
||||
fieldFormat::FREE
|
||||
)
|
||||
),
|
||||
fieldMap_(),
|
||||
commonGeometry_(options.getOrDefault("commonGeometry", false)),
|
||||
separator_()
|
||||
commonGeometry_(options.getOrDefault("commonGeometry", false))
|
||||
{
|
||||
if (writeFormat_ == fieldFormat::FREE)
|
||||
{
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2015-2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -33,13 +33,13 @@ Description
|
||||
The formatOptions for nastran:
|
||||
\table
|
||||
Property | Description | Reqd | Default
|
||||
fields | Field pairs for PLOAD2/PLOAD4 | yes |
|
||||
format | Nastran format (short/long/free) | no | long
|
||||
format | Nastran format (short/long/free) | no | free
|
||||
scale | Output geometry scaling | no | 1
|
||||
transform | Output coordinate transform | no |
|
||||
fieldLevel | Subtract field level before scaling | no | empty dict
|
||||
fieldScale | Output field scaling | no | empty dict
|
||||
commonGeometry | use separate geometry files | no | false
|
||||
fields | Field pairs for PLOAD2/PLOAD4 | yes |
|
||||
\endtable
|
||||
|
||||
For example,
|
||||
@ -48,13 +48,6 @@ Description
|
||||
{
|
||||
nastran
|
||||
{
|
||||
// OpenFOAM field name to NASTRAN load types
|
||||
fields
|
||||
(
|
||||
(pMean PLOAD2)
|
||||
(p PLOAD4)
|
||||
);
|
||||
|
||||
format free; // format type
|
||||
|
||||
scale 1000; // [m] -> [mm]
|
||||
@ -62,6 +55,13 @@ Description
|
||||
{
|
||||
"p.*" 0.01; // [Pa] -> [mbar]
|
||||
}
|
||||
|
||||
// OpenFOAM field name to NASTRAN load types
|
||||
fields
|
||||
(
|
||||
(pMean PLOAD2)
|
||||
(p PLOAD4)
|
||||
);
|
||||
}
|
||||
}
|
||||
\endverbatim
|
||||
@ -93,7 +93,6 @@ Description
|
||||
|
||||
Note
|
||||
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
|
||||
nastranSurfaceWriter.C
|
||||
@ -221,10 +220,10 @@ public:
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Default construct. Default SHORT format
|
||||
//- Default construct. Default FREE format
|
||||
nastranWriter();
|
||||
|
||||
//- Construct with some output options. Default LONG format
|
||||
//- Construct with some output options. Default FREE format
|
||||
explicit nastranWriter(const dictionary& options);
|
||||
|
||||
//- Construct from components
|
||||
|
||||
Reference in New Issue
Block a user