| 744 | |
| 745 | |
| 746 | void Foam::functionObjects::forces::calcForcesMoment() |
| 747 | { |
| 748 | initialise(); |
| 749 | |
| 750 | force_[0] = Zero; |
| 751 | force_[1] = Zero; |
| 752 | force_[2] = Zero; |
| 753 | |
| 754 | moment_[0] = Zero; |
| 755 | moment_[1] = Zero; |
| 756 | moment_[2] = Zero; |
| 757 | |
| 758 | if (directForceDensity_) |
| 759 | { |
| 760 | const volVectorField& fD = obr_.lookupObject<volVectorField>(fDName_); |
| 761 | |
| 762 | const surfaceVectorField::Boundary& Sfb = |
| 763 | mesh_.Sf().boundaryField(); |
| 764 | |
| 765 | forAllConstIter(labelHashSet, patchSet_, iter) |
| 766 | { |
| 767 | label patchi = iter.key(); |
| 768 | |
| 769 | vectorField Md |
| 770 | ( |
| 771 | mesh_.C().boundaryField()[patchi] - coordSys_.origin() |
| 772 | ); |
| 773 | |
| 774 | scalarField sA(mag(Sfb[patchi])); |
| 775 | |
| 776 | // Normal force = surfaceUnitNormal*(surfaceNormal & forceDensity) |
| 777 | vectorField fN |
| 778 | ( |
| 779 | Sfb[patchi]/sA |
| 780 | *( |
| 781 | Sfb[patchi] & fD.boundaryField()[patchi] |
| 782 | ) |
| 783 | ); |
| 784 | |
| 785 | // Tangential force (total force minus normal fN) |
| 786 | vectorField fT(sA*fD.boundaryField()[patchi] - fN); |
| 787 | |
| 788 | //- Porous force |
| 789 | vectorField fP(Md.size(), Zero); |
| 790 | |
| 791 | applyBins(Md, fN, fT, fP, mesh_.C().boundaryField()[patchi]); |
| 792 | } |
| 793 | } |
| 794 | else |
| 795 | { |
| 796 | const volScalarField& p = obr_.lookupObject<volScalarField>(pName_); |
| 797 | |
| 798 | const surfaceVectorField::Boundary& Sfb = |
| 799 | mesh_.Sf().boundaryField(); |
| 800 | |
| 801 | tmp<volSymmTensorField> tdevRhoReff = devRhoReff(); |
| 802 | const volSymmTensorField::Boundary& devRhoReffb |
| 803 | = tdevRhoReff().boundaryField(); |
no test coverage detected