Foam::sixDoFRigidBodyMotionSolver::sixDoFRigidBodyMotionSolver ( const polyMesh& mesh, const dictionary& dict ) : displacementMotionSolver(mesh, dict, typeName), motion_ ( coeffDict(), IOobject ( "sixDoFRigidBodyMotionState", mesh.time().timeName(), "uniform", mesh ).typeHeaderOk<IOdictionary>(true) ? IOdictionary ( IOobject ( "sixDoFRigidBodyMotionState", mesh.time().timeName(), "uniform", mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false ) ) : coeffDict() ), patches_(wordReList(coeffDict().lookup("patches"))), patchSet_(mesh.boundaryMesh().patchSet(patches_)), di_(readScalar(coeffDict().lookup("innerDistance"))), do_(readScalar(coeffDict().lookup("outerDistance"))), test_(coeffDict().lookupOrDefault<Switch>("test", false)), rhoInf_(1.0), rhoName_(coeffDict().lookupOrDefault<word>("rho", "rho")), scale_ ( IOobject ( "motionScale", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), pointMesh::New(mesh), dimensionedScalar(dimless, 0) ), curTimeIndex_(-1) { if (rhoName_ == "rhoInf") { rhoInf_ = readScalar(coeffDict().lookup("rhoInf")); } // Calculate scaling factor everywhere // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ { const pointMesh& pMesh = pointMesh::New(mesh); pointPatchDist pDist(pMesh, patchSet_, points0()); // Scaling: 1 up to di then linear down to 0 at do away from patches scale_.primitiveFieldRef() = min ( max ( (do_ - pDist.primitiveField())/(do_ - di_), scalar(0) ), scalar(1) ); // Convert the scale function to a cosine scale_.primitiveFieldRef() = min ( max ( 0.5 - 0.5 *cos(scale_.primitiveField() *Foam::constant::mathematical::pi), scalar(0) ), scalar(1) ); pointConstraints::New(pMesh).constrain(scale_); scale_.write(); } }
Foam::multiSolidBodyMotionFvMesh::multiSolidBodyMotionFvMesh(const IOobject& io) : dynamicFvMesh(io), dynamicMeshCoeffs_ ( IOdictionary ( IOobject ( "dynamicMeshDict", io.time().constant(), *this, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE, false ) ).subDict(typeName + "Coeffs") ), undisplacedPoints_ ( IOobject ( "points", io.time().constant(), meshSubDir, *this, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ) { if (undisplacedPoints_.size() != nPoints()) { FatalIOErrorInFunction ( dynamicMeshCoeffs_ ) << "Read " << undisplacedPoints_.size() << " undisplaced points from " << undisplacedPoints_.objectPath() << " but the current mesh has " << nPoints() << exit(FatalIOError); } zoneIDs_.setSize(dynamicMeshCoeffs_.size()); SBMFs_.setSize(dynamicMeshCoeffs_.size()); pointIDs_.setSize(dynamicMeshCoeffs_.size()); label zoneI = 0; forAllConstIter(dictionary, dynamicMeshCoeffs_, iter) { if (iter().isDict()) { zoneIDs_[zoneI] = cellZones().findZoneID(iter().keyword()); if (zoneIDs_[zoneI] == -1) { FatalIOErrorInFunction ( dynamicMeshCoeffs_ ) << "Cannot find cellZone named " << iter().keyword() << ". Valid zones are " << cellZones().names() << exit(FatalIOError); } const dictionary& subDict = iter().dict(); SBMFs_.set ( zoneI, solidBodyMotionFunction::New(subDict, io.time()) ); // Collect points of cell zone. const cellZone& cz = cellZones()[zoneIDs_[zoneI]]; boolList movePts(nPoints(), false); forAll(cz, i) { label celli = cz[i]; const cell& c = cells()[celli]; forAll(c, j) { const face& f = faces()[c[j]]; forAll(f, k) { label pointi = f[k]; movePts[pointi] = true; } } }
Foam::solidBodyMotionFvMesh::solidBodyMotionFvMesh(const IOobject& io) : dynamicFvMesh(io), dynamicMeshCoeffs_ ( IOdictionary ( IOobject ( "dynamicMeshDict", io.time().constant(), *this, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE, false ) ).subDict(typeName + "Coeffs") ), SBMFPtr_(solidBodyMotionFunction::New(dynamicMeshCoeffs_, io.time())), undisplacedPoints_ ( IOobject ( "points", io.time().constant(), meshSubDir, *this, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ), zoneID_(-1), pointIDs_() { if (undisplacedPoints_.size() != nPoints()) { FatalIOErrorIn ( "solidBodyMotionFvMesh::solidBodyMotionFvMesh(const IOobject&)", dynamicMeshCoeffs_ ) << "Read " << undisplacedPoints_.size() << " undisplaced points from " << undisplacedPoints_.objectPath() << " but the current mesh has " << nPoints() << exit(FatalIOError); } word cellZoneName = dynamicMeshCoeffs_.lookupOrDefault<word>("cellZone", "none"); if (cellZoneName != "none") { Info<< "Applying solid body motion to cellZone " << cellZoneName << endl; zoneID_ = cellZones().findZoneID(cellZoneName); if (zoneID_ == -1) { FatalErrorIn ( "solidBodyMotionFvMesh::solidBodyMotionFvMesh(const IOobject&)" ) << "Unable to find cellZone " << cellZoneName << ". Valid celLZones are:" << cellZones().names() << exit(FatalError); } const cellZone& cz = cellZones()[zoneID_]; // collect point IDs of points in cell zone boolList movePts(nPoints(), false); forAll(cz, i) { label cellI = cz[i]; const cell& c = cells()[cellI]; forAll(c, j) { const face& f = faces()[c[j]]; forAll(f, k) { label pointI = f[k]; movePts[pointI] = true; } }