diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C index caad93731ceaeae68f0e87139d9864cb2ea006df..2b6b17da92d3e4fe0fc885200ee59b12029a5ec4 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalPoints.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -90,6 +90,11 @@ Foam::labelPairList Foam::globalPoints::addSendTransform const labelPairList& info ) const { + scalar tol = refCast<const coupledPolyPatch> + ( + mesh_.boundaryMesh()[patchI] + ).matchTolerance(); + labelPairList sendInfo(info.size()); forAll(info, i) @@ -111,7 +116,8 @@ Foam::labelPairList Foam::globalPoints::addSendTransform ( globalIndexAndTransform::transformIndex(info[i]), patchI, - true // patchI is sending side + true, // patchI is sending side + tol // tolerance for comparison ) ); } diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H index 408b1f2d32d6373c94b5135f0730b504fd6ad78f..7cb4bab495609f9e0ce649d8bb996f21a944af3f 100644 --- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H +++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -195,7 +195,8 @@ public: ( const label transformIndex, const label patchI, - const bool isSendingSide = true + const bool isSendingSide = true, + const scalar tol = SMALL ) const; //- Combine two transformIndices diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H index bb72f8d43dc4bc8a0dc5b5f9ef44b0e0156d7977..9227e6a990baf0c6b87c81a892382a2b52b52d0d 100644 --- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H +++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -190,7 +190,8 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex ( const label transformIndex, const label patchI, - const bool isSendingSide + const bool isSendingSide, + const scalar tol ) const { const Pair<label>& transSign = patchTransformSign_[patchI]; @@ -228,21 +229,49 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex } else if (sign == permutation[matchTransI]) { - FatalErrorIn - ( - "Foam::label " - "Foam::globalIndexAndTransform::addToTransformIndex\n" - "(\n" - "const label,\n" - "const label,\n" - "const bool\n" - ") const\n" - ) << "More than one patch accessing the same transform " - << "but not of the same sign." << endl - << "patch:" << mesh_.boundaryMesh()[patchI].name() - << " transform:" << matchTransI << " sign:" << sign - << " current transforms:" << permutation - << exit(FatalError); + // This is usually illegal. The only exception is for points + // on the axis of a 180 degree cyclic wedge when the + // transformation is going to be (-1 0 0 0 -1 0 0 0 +1) + // (or a different permutation but always two times -1 and + // once +1) + bool antiCyclic = false; + + const vectorTensorTransform& vt = transforms_[matchTransI]; + if (mag(vt.t()) < SMALL && vt.hasR()) + { + const tensor& R = vt.R(); + scalar sumDiag = tr(R); + scalar sumMagDiag = mag(R.xx())+mag(R.yy())+mag(R.zz()); + + if (mag(sumMagDiag-3) < tol && mag(sumDiag+1) < tol) + { + antiCyclic = true; + } + } + + if (antiCyclic) + { + // 180 degree rotational. Reset transformation. + permutation[matchTransI] = 0; + } + else + { + FatalErrorIn + ( + "Foam::label " + "Foam::globalIndexAndTransform::addToTransformIndex\n" + "(\n" + "const label,\n" + "const label,\n" + "const bool\n" + ") const\n" + ) << "More than one patch accessing the same transform " + << "but not of the same sign." << endl + << "patch:" << mesh_.boundaryMesh()[patchI].name() + << " transform:" << matchTransI << " sign:" << sign + << " current transforms:" << permutation + << exit(FatalError); + } } else { diff --git a/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriterTemplates.C b/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriterTemplates.C index fc0a283d754e9a2b48899669d9f418f26a31f772..fe1e6a998aea64831e68d502dfebace5ad05c4d4 100644 --- a/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriterTemplates.C +++ b/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriterTemplates.C @@ -201,6 +201,7 @@ void Foam::nastranSurfaceWriter::writeTemplate { v += values[f[fptI]]; } + v /= f.size(); writeFaceValue(nasFieldName, v, ++n, os); } diff --git a/src/thermophysicalModels/radiationModels/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C b/src/thermophysicalModels/radiationModels/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C index 7237f30307fc3baa38d0c9fba66521e9a4a084c1..e15fea1f66b691fb9c46a7de7e894e7ef73e2b68 100644 --- a/src/thermophysicalModels/radiationModels/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C +++ b/src/thermophysicalModels/radiationModels/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C @@ -197,7 +197,14 @@ updateCoeffs() const vector& myRayId = dom.IRay(rayId).d(); - const scalarField& Ir = dom.Qin().boundaryField()[patchI]; + // Use updated Ir while iterating over rays + // avoids to used lagged Qin + scalarField Ir = dom.IRay(0).Qin().boundaryField()[patchI]; + + for (label rayI=1; rayI < dom.nRay(); rayI++) + { + Ir += dom.IRay(rayI).Qin().boundaryField()[patchI]; + } forAll(Iw, faceI) { diff --git a/src/thermophysicalModels/radiationModels/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C b/src/thermophysicalModels/radiationModels/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C index e6e7b4b225915b3254a3c5ee4c6bcf40ef7fdab2..0bce57efeb26dc3b7a6ec4eca577372e26af2fd1 100644 --- a/src/thermophysicalModels/radiationModels/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C +++ b/src/thermophysicalModels/radiationModels/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -187,7 +187,9 @@ updateCoeffs() radiativeIntensityRay& ray = const_cast<radiativeIntensityRay&>(dom.IRay(rayId)); - ray.Qr().boundaryField()[patchI] += Iw*(n & ray.dAve()); + const scalarField nAve(n & ray.dAve()); + + ray.Qr().boundaryField()[patchI] += Iw*nAve; const scalarField Eb ( @@ -196,23 +198,20 @@ updateCoeffs() scalarField temissivity = emissivity(); - forAll(Iw, faceI) - { - scalar Ir = 0.0; - for (label rayI=0; rayI < dom.nRay(); rayI++) - { - const vector& d = dom.IRay(rayI).d(); + scalarField& Qem = ray.Qem().boundaryField()[patchI]; + scalarField& Qin = ray.Qin().boundaryField()[patchI]; - const scalarField& IFace = - dom.IRay(rayI).ILambda(lambdaId).boundaryField()[patchI]; + // Use updated Ir while iterating over rays + // avoids to used lagged Qin + scalarField Ir = dom.IRay(0).Qin().boundaryField()[patchI]; - if ((-n[faceI] & d) < 0.0) // qin into the wall - { - const vector& dAve = dom.IRay(rayI).dAve(); - Ir = Ir + IFace[faceI]*mag(n[faceI] & dAve); - } - } + for (label rayI=1; rayI < dom.nRay(); rayI++) + { + Ir += dom.IRay(rayI).Qin().boundaryField()[patchI]; + } + forAll(Iw, faceI) + { const vector& d = dom.IRay(rayId).d(); if ((-n[faceI] & d) > 0.0) @@ -222,9 +221,12 @@ updateCoeffs() valueFraction()[faceI] = 1.0; refValue()[faceI] = ( - Ir*(1.0 - temissivity[faceI]) + Ir[faceI]*(1.0 - temissivity[faceI]) + temissivity[faceI]*Eb[faceI] )/pi; + + // Emmited heat flux from this ray direction + Qem[faceI] = refValue()[faceI]*nAve[faceI]; } else { @@ -232,6 +234,9 @@ updateCoeffs() valueFraction()[faceI] = 0.0; refGrad()[faceI] = 0.0; refValue()[faceI] = 0.0; //not used + + // Incident heat flux on this ray direction + Qin[faceI] = Iw[faceI]*nAve[faceI]; } }