1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | foam-extend: Open Source CFD
4 \\ / O peration | Version: 3.2
5 \\ / A nd | Web: http://www.foam-extend.org
6 \\/ M anipulation | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
9 This file is part of foam-extend.
11 foam-extend is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation, either version 3 of the License, or (at your
14 option) any later version.
16 foam-extend is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
25 Tetrahedral Finite Element matrix member functions and operators
27 \*---------------------------------------------------------------------------*/
29 #include "PstreamReduceOps.H"
31 #include "tetFemMatrix.H"
32 #include "tetPointFields.H"
34 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
39 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
42 const label tetFemMatrix<Type>::fixFillIn = 4;
45 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
48 tetFemMatrix<Type>::tetFemMatrix
50 GeometricField<Type, tetPolyPatchField, tetPointMesh>& psi,
51 const dimensionSet& ds
54 lduMatrix(psi.mesh()),
57 source_(psi.size(), pTraits<Type>::zero),
58 boundaryConditionsSet_(false),
59 fixedEqns_(psi.mesh().lduAddr().size()/fixFillIn),
64 Info<< "tetFemMatrix<Type>(GeometricField<Type, tetPolyPatchField, "
65 << "tetPointMesh>&, const dimensionSet&) : "
66 << "constructing tetFemMatrix<Type> for field " << psi_.name()
73 tetFemMatrix<Type>::tetFemMatrix(const tetFemMatrix<Type>& tetFem)
78 dimensions_(tetFem.dimensions_),
79 source_(tetFem.source_),
80 boundaryConditionsSet_(false),
81 fixedEqns_(psi_.mesh().lduAddr().size()/fixFillIn),
86 Info<< "tetFemMatrix<Type>::tetFemMatrix(const tetFemMatrix<Type>&) : "
87 << "copying tetFemMatrix<Type> for field " << psi_.name()
94 tetFemMatrix<Type>::tetFemMatrix
96 GeometricField<Type, tetPolyPatchField, tetPointMesh>& psi,
100 lduMatrix(psi.mesh()),
104 boundaryConditionsSet_(false),
105 fixedEqns_(psi.mesh().lduAddr().size()/fixFillIn),
110 Info<< "tetFemMatrix<Type>(GeometricField<Type, tetPolyPatchField, "
111 << "tetPointMesh>&, Istream&) : "
112 << "constructing tetFemMatrix<Type> for field " << psi_.name()
119 tetFemMatrix<Type>::~tetFemMatrix()
123 Info<< "tetFemMatrix<Type>::~tetFemMatrix<Type>() : "
124 << "destroying tetFemMatrix<Type> for field " << psi_.name()
130 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
132 // Does the matrix need a reference level for solution
133 // template<class Type>
134 // bool tetFemMatrix<Type>::needReference()
136 // // Search all boundary conditions, if any are
137 // // fixed-value or mixed (Robin) do not set reference level for solution.
139 // static bool searched = false;
140 // static bool needRef = true;
144 // const BoundaryField<Type>& patchFields = psi_.boundaryField();
146 // forAll(patchFields, patchi)
148 // if (patchFields[patchi].fixesValue())
154 // reduce(needRef, andOp<bool>());
163 // Set constrained equation
165 void tetFemMatrix<Type>::addConstraint
171 constraint<Type> cp(vertex, value);
173 if (!fixedEqns_.found(vertex))
175 fixedEqns_.insert(vertex, cp);
179 fixedEqns_[vertex].combine(cp);
185 void tetFemMatrix<Type>::relax(const scalar alpha)
192 Field<Type>& S = source();
193 scalarField& D = diag();
195 // Store the current unrelaxed diagonal for use in updating the source
198 // Calculate the sum-mag off-diagonal from the interior faces
199 scalarField sumOff(D.size(), 0.0);
200 sumMagOffDiag(sumOff);
202 // Some treatment of coupled boundaries may be added here
205 // Ensure the matrix is diagonally dominant...
211 S += (D - D0)*psi_.internalField();
216 void tetFemMatrix<Type>::relax()
220 if (psi_.mesh().solutionDict().relax(psi_.name()))
222 alpha = psi_.mesh().solutionDict().relaxationFactor(psi_.name());
232 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
235 void tetFemMatrix<Type>::operator=(const tetFemMatrix<Type>& tetFem)
241 "tetFemMatrix<Type>::operator=(const tetFemMatrix<Type>&)"
242 ) << "attempted assignment to self"
243 << abort(FatalError);
246 if (&psi_ != &(tetFem.psi_))
250 "tetFemMatrix<Type>::operator=(const tetFemMatrix<Type>&)"
251 ) << "different fields"
252 << abort(FatalError);
255 lduMatrix::operator=(tetFem);
256 source_ = tetFem.source_;
257 boundaryConditionsSet_ = false;
263 void tetFemMatrix<Type>::operator=(const tmp<tetFemMatrix<Type> >& ttetFem)
265 operator=(ttetFem());
271 void tetFemMatrix<Type>::negate()
279 void tetFemMatrix<Type>::operator+=(const tetFemMatrix<Type>& tetFem)
281 checkMethod(*this, tetFem, "+=");
283 dimensions_ += tetFem.dimensions_;
284 lduMatrix::operator+=(tetFem);
285 source_ += tetFem.source_;
290 void tetFemMatrix<Type>::operator+=(const tmp<tetFemMatrix<Type> >& ttetFem)
292 operator+=(ttetFem());
298 void tetFemMatrix<Type>::operator+=
300 const GeometricField<Type, elementPatchField, elementMesh>& su
303 checkMethod(*this, su, "+=");
304 source() -= distributeSource(su.internalField());
309 void tetFemMatrix<Type>::operator+=
311 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
320 void tetFemMatrix<Type>::operator-=(const tetFemMatrix<Type>& tetFem)
322 checkMethod(*this, tetFem, "+=");
324 dimensions_ -= tetFem.dimensions_;
325 lduMatrix::operator-=(tetFem);
326 source_ -= tetFem.source_;
331 void tetFemMatrix<Type>::operator-=(const tmp<tetFemMatrix<Type> >& ttetFem)
333 operator-=(ttetFem());
339 void tetFemMatrix<Type>::operator-=
341 const GeometricField<Type, elementPatchField, elementMesh>& su
344 checkMethod(*this, su, "-=");
345 source() += distributeSource(su.internalField());
350 void tetFemMatrix<Type>::operator-=
352 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
361 void tetFemMatrix<Type>::operator+=
363 const dimensioned<Type>& su
366 checkMethod(*this, su, "+=");
367 source() -= distributeSource(Field<Type>(psi_.mesh().nCells(), su.value()));
372 void tetFemMatrix<Type>::operator-=
374 const dimensioned<Type>& su
377 checkMethod(*this, su, "-=");
378 source() += distributeSource(Field<Type>(psi_.mesh().nCells(), su.value()));
383 void tetFemMatrix<Type>::operator*=
385 const dimensioned<scalar>& ds
388 dimensions_ *= ds.dimensions();
389 lduMatrix::operator*=(ds.value());
390 source_ *= ds.value();
394 // * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
399 const tetFemMatrix<Type>& tetFem1,
400 const tetFemMatrix<Type>& tetFem2,
404 if (&tetFem1.psi() != &tetFem2.psi())
408 "checkMethod(const tetFemMatrix<Type>&, "
409 "const tetFemMatrix<Type>&) : "
410 ) << "incompatible fields for operation "
412 << "[" << tetFem1.psi().name() << "] "
414 << " [" << tetFem1.psi().name() << "]"
415 << abort(FatalError);
418 if (dimensionSet::debug && tetFem1.dimensions() != tetFem2.dimensions())
422 "checkMethod(const tetFemMatrix<Type>&, "
423 "const tetFemMatrix<Type>&) : "
424 ) << "incompatible dimensions for operation "
426 << "[" << tetFem1.psi().name() << tetFem1.dimensions()/dimVolume
429 << " [" << tetFem1.psi().name() << tetFem2.dimensions()/dimVolume
431 << abort(FatalError);
439 const tetFemMatrix<Type>& tetFem,
440 const GeometricField<Type, elementPatchField, elementMesh>& vf,
447 && tetFem.dimensions() != vf.dimensions()
452 "checkMethod(const tetFemMatrix<Type>&, "
453 "const GeometricField<Type, elementPatchField, "
455 ) << "incompatible dimensions for operation "
457 << "[" << tetFem.psi().name() << tetFem.dimensions()/dimVolume
460 << " [" << tetFem.psi().name() << vf.dimensions() << " ]"
461 << abort(FatalError);
469 const tetFemMatrix<Type>& tetFem,
470 const dimensioned<Type>& dt,
477 && tetFem.dimensions() != dt.dimensions()
482 "checkMethod(const tetFemMatrix<Type>&, "
483 "const dimensioned<Type>&) : "
484 ) << "incompatible dimensions for operation "
486 << "[" << tetFem.psi().name() << tetFem.dimensions()/dimVolume
489 << " [" << dt.name() << dt.dimensions() << " ]"
490 << abort(FatalError);
496 lduSolverPerformance solve
498 tetFemMatrix<Type>& tetFem,
499 Istream& solverControls
502 return tetFem.solve(solverControls);
506 lduSolverPerformance solve
508 const tmp<tetFemMatrix<Type> >& ttetFem,
509 Istream& solverControls
512 lduSolverPerformance solverPerf =
513 const_cast<tetFemMatrix<Type>&>(ttetFem()).solve(solverControls);
522 lduSolverPerformance solve(tetFemMatrix<Type>& tetFem)
524 return tetFem.solve();
529 lduSolverPerformance solve(const tmp<tetFemMatrix<Type> >& ttetFem)
531 lduSolverPerformance solverPerf =
532 const_cast<tetFemMatrix<Type>&>(ttetFem()).solve();
539 // * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
542 tmp<tetFemMatrix<Type> > operator+
544 const tetFemMatrix<Type>& A,
545 const tetFemMatrix<Type>& B
548 checkMethod(A, B, "+");
549 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
556 tmp<tetFemMatrix<Type> > operator+
558 const tmp<tetFemMatrix<Type> >& tA,
559 const tetFemMatrix<Type>& B
562 checkMethod(tA(), B, "+");
563 tmp<tetFemMatrix<Type> > tC(tA.ptr());
570 tmp<tetFemMatrix<Type> > operator+
572 const tetFemMatrix<Type>& A,
573 const tmp<tetFemMatrix<Type> >& tB
576 checkMethod(A, tB(), "+");
577 tmp<tetFemMatrix<Type> > tC(tB.ptr());
584 tmp<tetFemMatrix<Type> > operator+
586 const tmp<tetFemMatrix<Type> >& tA,
587 const tmp<tetFemMatrix<Type> >& tB
590 checkMethod(tA(), tB(), "+");
591 tmp<tetFemMatrix<Type> > tC(tA.ptr());
599 tmp<tetFemMatrix<Type> > operator-
601 const tetFemMatrix<Type>& A
604 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
611 tmp<tetFemMatrix<Type> > operator-
613 const tmp<tetFemMatrix<Type> >& tA
616 tmp<tetFemMatrix<Type> > tC(tA.ptr());
623 tmp<tetFemMatrix<Type> > operator-
625 const tetFemMatrix<Type>& A,
626 const tetFemMatrix<Type>& B
629 checkMethod(A, B, "-");
630 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
637 tmp<tetFemMatrix<Type> > operator-
639 const tmp<tetFemMatrix<Type> >& tA,
640 const tetFemMatrix<Type>& B
643 checkMethod(tA(), B, "-");
644 tmp<tetFemMatrix<Type> > tC(tA.ptr());
651 tmp<tetFemMatrix<Type> > operator-
653 const tetFemMatrix<Type>& A,
654 const tmp<tetFemMatrix<Type> >& tB
657 checkMethod(A, tB(), "-");
658 tmp<tetFemMatrix<Type> > tC(tB.ptr());
666 tmp<tetFemMatrix<Type> > operator-
668 const tmp<tetFemMatrix<Type> >& tA,
669 const tmp<tetFemMatrix<Type> >& tB
672 checkMethod(tA(), tB(), "-");
673 tmp<tetFemMatrix<Type> > tC(tA.ptr());
681 tmp<tetFemMatrix<Type> > operator==
683 const tetFemMatrix<Type>& A,
684 const tetFemMatrix<Type>& B
687 checkMethod(A, B, "==");
693 tmp<tetFemMatrix<Type> > operator==
695 const tmp<tetFemMatrix<Type> >& tA,
696 const tetFemMatrix<Type>& B
699 checkMethod(tA(), B, "==");
705 tmp<tetFemMatrix<Type> > operator==
707 const tetFemMatrix<Type>& A,
708 const tmp<tetFemMatrix<Type> >& tB
711 checkMethod(A, tB(), "==");
717 tmp<tetFemMatrix<Type> > operator==
719 const tmp<tetFemMatrix<Type> >& tA,
720 const tmp<tetFemMatrix<Type> >& tB
723 checkMethod(tA(), tB(), "==");
729 tmp<tetFemMatrix<Type> > operator+
731 const tetFemMatrix<Type>& A,
732 const GeometricField<Type, elementPatchField, elementMesh>& su
735 checkMethod(A, su, "+");
736 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
742 tmp<tetFemMatrix<Type> > operator+
744 const tmp<tetFemMatrix<Type> >& tA,
745 const GeometricField<Type, elementPatchField, elementMesh>& su
748 checkMethod(tA(), su, "+");
749 tmp<tetFemMatrix<Type> > tC(tA.ptr());
755 tmp<tetFemMatrix<Type> > operator+
757 const tetFemMatrix<Type>& A,
758 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
761 checkMethod(A, tsu(), "+");
762 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
770 tmp<tetFemMatrix<Type> > operator+
772 const tmp<tetFemMatrix<Type> >& tA,
773 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
776 checkMethod(tA(), tsu(), "+");
777 tmp<tetFemMatrix<Type> > tC(tA.ptr());
784 tmp<tetFemMatrix<Type> > operator+
786 const GeometricField<Type, elementPatchField, elementMesh>& su,
787 const tetFemMatrix<Type>& A
790 checkMethod(A, su, "+");
791 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
797 tmp<tetFemMatrix<Type> > operator+
799 const GeometricField<Type, elementPatchField, elementMesh>& su,
800 const tmp<tetFemMatrix<Type> >& tA
803 checkMethod(tA(), su, "+");
804 tmp<tetFemMatrix<Type> > tC(tA.ptr());
810 tmp<tetFemMatrix<Type> > operator+
812 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
813 const tetFemMatrix<Type>& A
816 checkMethod(A, tsu(), "+");
817 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
824 tmp<tetFemMatrix<Type> > operator+
826 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
827 const tmp<tetFemMatrix<Type> >& tA
830 checkMethod(tA(), tsu(), "+");
831 tmp<tetFemMatrix<Type> > tC(tA.ptr());
839 tmp<tetFemMatrix<Type> > operator-
841 const tetFemMatrix<Type>& A,
842 const GeometricField<Type, elementPatchField, elementMesh>& su
845 checkMethod(A, su, "-");
846 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
852 tmp<tetFemMatrix<Type> > operator-
854 const tmp<tetFemMatrix<Type> >& tA,
855 const GeometricField<Type, elementPatchField, elementMesh>& su
858 checkMethod(tA(), su, "-");
859 tmp<tetFemMatrix<Type> > tC(tA.ptr());
865 tmp<tetFemMatrix<Type> > operator-
867 const tetFemMatrix<Type>& A,
868 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
871 checkMethod(A, tsu(), "-");
872 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
879 tmp<tetFemMatrix<Type> > operator-
881 const tmp<tetFemMatrix<Type> >& tA,
882 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
885 checkMethod(tA(), tsu(), "-");
886 tmp<tetFemMatrix<Type> > tC(tA.ptr());
894 tmp<tetFemMatrix<Type> > operator-
896 const GeometricField<Type, elementPatchField, elementMesh>& su,
897 const tetFemMatrix<Type>& A
900 checkMethod(A, su, "-");
901 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
909 tmp<tetFemMatrix<Type> > operator-
911 const GeometricField<Type, elementPatchField, elementMesh>& su,
912 const tmp<tetFemMatrix<Type> >& tA
915 checkMethod(tA(), su, "-");
916 tmp<tetFemMatrix<Type> > tC(tA.ptr());
923 tmp<tetFemMatrix<Type> > operator-
925 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
926 const tetFemMatrix<Type>& A
929 checkMethod(A, tsu(), "-");
930 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
939 tmp<tetFemMatrix<Type> > operator-
941 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
942 const tmp<tetFemMatrix<Type> >& tA
945 checkMethod(tA(), tsu(), "-");
946 tmp<tetFemMatrix<Type> > tC(tA.ptr());
955 tmp<tetFemMatrix<Type> > operator+
957 const tetFemMatrix<Type>& A,
958 const dimensioned<Type>& su
961 checkMethod(A, su, "+");
962 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
969 tmp<tetFemMatrix<Type> > operator+
971 const tmp<tetFemMatrix<Type> >& tA,
972 const dimensioned<Type>& su
975 checkMethod(tA(), su, "+");
976 tmp<tetFemMatrix<Type> > tC(tA.ptr());
983 tmp<tetFemMatrix<Type> > operator+
985 const dimensioned<Type>& su,
986 const tetFemMatrix<Type>& A
989 checkMethod(A, su, "+");
990 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
997 tmp<tetFemMatrix<Type> > operator+
999 const dimensioned<Type>& su,
1000 const tmp<tetFemMatrix<Type> >& tA
1003 checkMethod(tA(), su, "+");
1004 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1010 template<class Type>
1011 tmp<tetFemMatrix<Type> > operator-
1013 const tetFemMatrix<Type>& A,
1014 const dimensioned<Type>& su
1017 checkMethod(A, su, "-");
1018 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1024 template<class Type>
1025 tmp<tetFemMatrix<Type> > operator-
1027 const tmp<tetFemMatrix<Type> >& tA,
1028 const dimensioned<Type>& su
1031 checkMethod(tA(), su, "-");
1032 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1038 template<class Type>
1039 tmp<tetFemMatrix<Type> > operator-
1041 const dimensioned<Type>& su,
1042 const tetFemMatrix<Type>& A
1045 checkMethod(A, su, "-");
1046 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1053 template<class Type>
1054 tmp<tetFemMatrix<Type> > operator-
1056 const dimensioned<Type>& su,
1057 const tmp<tetFemMatrix<Type> >& tA
1060 checkMethod(tA(), su, "-");
1061 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1068 template<class Type>
1069 tmp<tetFemMatrix<Type> > operator==
1071 const tetFemMatrix<Type>& A,
1072 const GeometricField<Type, elementPatchField, elementMesh>& su
1075 checkMethod(A, su, "==");
1076 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1081 template<class Type>
1082 tmp<tetFemMatrix<Type> > operator==
1084 const tmp<tetFemMatrix<Type> >& tA,
1085 const GeometricField<Type, elementPatchField, elementMesh>& su
1088 checkMethod(tA(), su, "==");
1089 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1094 template<class Type>
1095 tmp<tetFemMatrix<Type> > operator==
1097 const tetFemMatrix<Type>& A,
1098 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
1101 checkMethod(A, tsu(), "==");
1102 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1108 template<class Type>
1109 tmp<tetFemMatrix<Type> > operator==
1111 const tmp<tetFemMatrix<Type> >& tA,
1112 const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
1115 checkMethod(tA(), tsu(), "==");
1116 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1123 template<class Type>
1124 tmp<tetFemMatrix<Type> > operator==
1126 const tetFemMatrix<Type>& A,
1127 const dimensioned<Type>& su
1130 checkMethod(A, su, "==");
1131 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1137 template<class Type>
1138 tmp<tetFemMatrix<Type> > operator==
1140 const tmp<tetFemMatrix<Type> >& tA,
1141 const dimensioned<Type>& su
1144 checkMethod(tA(), su, "==");
1145 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1151 template<class Type>
1152 tmp<tetFemMatrix<Type> > operator*
1154 const dimensioned<scalar>& ds,
1155 const tetFemMatrix<Type>& A
1158 tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1164 template<class Type>
1165 tmp<tetFemMatrix<Type> > operator*
1167 const dimensioned<scalar>& ds,
1168 const tmp<tetFemMatrix<Type> >& tA
1171 tmp<tetFemMatrix<Type> > tC(tA.ptr());
1177 // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
1179 template<class Type>
1180 Ostream& operator<<(Ostream& os, const tetFemMatrix<Type>& tetFem)
1182 os << static_cast<const lduMatrix&>(tetFem) << nl
1183 << tetFem.dimensions_ << nl
1184 << tetFem.source_ << endl;
1186 os.check("Ostream& operator<<(Ostream&, tetFemMatrix<Type>&");
1192 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1194 } // End namespace Foam
1196 // ************************************************************************* //