fixed writing out entries in advective bc
[OpenFOAM-1.6-ext.git] / src / tetDecompositionFiniteElement / tetFemMatrix / tetFemMatrix.C
blob30519fcab045ef97c7e20a8280c4dd8fa33cd430
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright held by original author
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM 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 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 Description
26     Tetrahedral Finite Element matrix member functions and operators
28 \*---------------------------------------------------------------------------*/
30 #include "PstreamReduceOps.H"
32 #include "tetFemMatrix.H"
33 #include "tetPointFields.H"
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 namespace Foam
40 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
42 template<class Type>
43 const label tetFemMatrix<Type>::fixFillIn = 4;
46 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
48 template<class Type>
49 tetFemMatrix<Type>::tetFemMatrix
51     GeometricField<Type, tetPolyPatchField, tetPointMesh>& psi,
52     const dimensionSet& ds
55     lduMatrix(psi.mesh()),
56     psi_(psi),
57     dimensions_(ds),
58     source_(psi.size(), pTraits<Type>::zero),
59     boundaryConditionsSet_(false),
60     fixedEqns_(psi.mesh().lduAddr().size()/fixFillIn),
61     solvingComponent(0)
63     if (debug)
64     {
65         Info<< "tetFemMatrix<Type>(GeometricField<Type, tetPolyPatchField, "
66             << "tetPointMesh>&, const dimensionSet&) : "
67             << "constructing tetFemMatrix<Type> for field " << psi_.name()
68             << endl;
69     }
73 template<class Type>
74 tetFemMatrix<Type>::tetFemMatrix(const tetFemMatrix<Type>& tetFem)
76     refCount(),
77     lduMatrix(tetFem),
78     psi_(tetFem.psi_),
79     dimensions_(tetFem.dimensions_),
80     source_(tetFem.source_),
81     boundaryConditionsSet_(false),
82     fixedEqns_(psi_.mesh().lduAddr().size()/fixFillIn),
83     solvingComponent(0)
85     if (debug)
86     {
87         Info<< "tetFemMatrix<Type>::tetFemMatrix(const tetFemMatrix<Type>&) : "
88             << "copying tetFemMatrix<Type> for field " << psi_.name()
89             << endl;
90     }
94 template<class Type>
95 tetFemMatrix<Type>::tetFemMatrix
97     GeometricField<Type, tetPolyPatchField, tetPointMesh>& psi,
98     Istream& is
101     lduMatrix(psi.mesh()),
102     psi_(psi),
103     dimensions_(is),
104     source_(is),
105     boundaryConditionsSet_(false),
106     fixedEqns_(psi.mesh().lduAddr().size()/fixFillIn),
107     solvingComponent(0)
109     if (debug)
110     {
111         Info<< "tetFemMatrix<Type>(GeometricField<Type, tetPolyPatchField, "
112             << "tetPointMesh>&, Istream&) : "
113             << "constructing tetFemMatrix<Type> for field " << psi_.name()
114             << endl;
115     }
119 template<class Type>
120 tetFemMatrix<Type>::~tetFemMatrix()
122     if (debug)
123     {
124         Info<< "tetFemMatrix<Type>::~tetFemMatrix<Type>() : "
125             << "destroying tetFemMatrix<Type> for field " << psi_.name()
126             << endl;
127     }
131 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
133 // Does the matrix need a reference level for solution
134 // template<class Type>
135 // bool tetFemMatrix<Type>::needReference()
136 // {
137 //     // Search all boundary conditions, if any are
138 //     // fixed-value or mixed (Robin) do not set reference level for solution.
140 //     static bool searched = false;
141 //     static bool needRef = true;
143 //     if (!searched)
144 //     {
145 //         const BoundaryField<Type>& patchFields = psi_.boundaryField();
147 //         forAll(patchFields, patchi)
148 //         {
149 //             if (patchFields[patchi].fixesValue())
150 //             {
151 //                 needRef = false;
152 //             }
153 //         }
155 //         reduce(needRef, andOp<bool>());
157 //         searched = true;
158 //     }
160 //     return needRef;
161 // }
164 // Set reference level for solution
165 template<class Type>
166 void tetFemMatrix<Type>::addConstraint
168     const label vertex,
169     const Type& value
172     constraint<Type> cp(vertex, value);
174     if (!fixedEqns_.found(vertex))
175     {
176         fixedEqns_.insert(vertex, cp);
177     }
178     else
179     {
180         WarningIn
181         (
182             "void tetFemMatrix<Type>::addConstraint(const label vertex, "
183             "const Type& value)"
184         )   << "Adding constraint on an already constrained point."
185             << "  Point: " << vertex
186             << endl;
188         fixedEqns_[vertex].combine(cp);
189     }
193 template<class Type>
194 void tetFemMatrix<Type>::relax(const scalar alpha)
196     if (alpha <= 0)
197     {
198         return;
199     }
201     Field<Type>& S = source();
202     scalarField& D = diag();
204     // Store the current unrelaxed diagonal for use in updating the source
205     scalarField D0(D);
207     // Calculate the sum-mag off-diagonal from the interior faces
208     scalarField sumOff(D.size(), 0.0);
209     sumMagOffDiag(sumOff);
211     // Some treatment of coupled boundaries may be added here
212     // HJ, 3/Sep/2007
214     // Ensure the matrix is diagonally dominant...
215     max(D, D, sumOff);
217     // ... then relax
218     D /= alpha;
220     S += (D - D0)*psi_.internalField();
224 template<class Type>
225 void tetFemMatrix<Type>::relax()
227     scalar alpha = 0;
229     if (psi_.mesh().relax(psi_.name()))
230     {
231         alpha = psi_.mesh().relaxationFactor(psi_.name());
232     }
234     if (alpha > 0)
235     {
236         relax(alpha);
237     }
241 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
243 template<class Type>
244 void tetFemMatrix<Type>::operator=(const tetFemMatrix<Type>& tetFem)
246     if (this == &tetFem)
247     {
248         FatalErrorIn
249         (
250             "tetFemMatrix<Type>::operator=(const tetFemMatrix<Type>&)"
251         )   << "attempted assignment to self"
252             << abort(FatalError);
253     }
255     if (&psi_ != &(tetFem.psi_))
256     {
257         FatalErrorIn
258         (
259             "tetFemMatrix<Type>::operator=(const tetFemMatrix<Type>&)"
260         )   << "different fields"
261             << abort(FatalError);
262     }
264     lduMatrix::operator=(tetFem);
265     source_ = tetFem.source_;
266     boundaryConditionsSet_ = false;
267     fixedEqns_.clear();
271 template<class Type>
272 void tetFemMatrix<Type>::operator=(const tmp<tetFemMatrix<Type> >& ttetFem)
274     operator=(ttetFem());
275     ttetFem.clear();
279 template<class Type>
280 void tetFemMatrix<Type>::negate()
282     lduMatrix::negate();
283     source_.negate();
287 template<class Type>
288 void tetFemMatrix<Type>::operator+=(const tetFemMatrix<Type>& tetFem)
290     checkMethod(*this, tetFem, "+=");
292     dimensions_ += tetFem.dimensions_;
293     lduMatrix::operator+=(tetFem);
294     source_ += tetFem.source_;
298 template<class Type>
299 void tetFemMatrix<Type>::operator+=(const tmp<tetFemMatrix<Type> >& ttetFem)
301     operator+=(ttetFem());
302     ttetFem.clear();
306 template<class Type>
307 void tetFemMatrix<Type>::operator+=
309     const GeometricField<Type, elementPatchField, elementMesh>& su
312     checkMethod(*this, su, "+=");
313     source() -= distributeField(su.internalField());
317 template<class Type>
318 void tetFemMatrix<Type>::operator+=
320     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
323     operator+=(tsu());
324     tsu.clear();
328 template<class Type>
329 void tetFemMatrix<Type>::operator-=(const tetFemMatrix<Type>& tetFem)
331     checkMethod(*this, tetFem, "+=");
333     dimensions_ -= tetFem.dimensions_;
334     lduMatrix::operator-=(tetFem);
335     source_ -= tetFem.source_;
339 template<class Type>
340 void tetFemMatrix<Type>::operator-=(const tmp<tetFemMatrix<Type> >& ttetFem)
342     operator-=(ttetFem());
343     ttetFem.clear();
347 template<class Type>
348 void tetFemMatrix<Type>::operator-=
350     const GeometricField<Type, elementPatchField, elementMesh>& su
353     checkMethod(*this, su, "-=");
354     source() += distributeField(su.internalField());
358 template<class Type>
359 void tetFemMatrix<Type>::operator-=
361     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
364     operator-=(tsu());
365     tsu.clear();
369 template<class Type>
370 void tetFemMatrix<Type>::operator+=
372     const dimensioned<Type>& su
375     checkMethod(*this, su, "+=");
376     source() -= distributeField(Field<Type>(psi.mesh().nCells(), su.value()));
380 template<class Type>
381 void tetFemMatrix<Type>::operator-=
383     const dimensioned<Type>& su
386     checkMethod(*this, su, "-=");
387     source() += distributeField(Field<Type>(psi.mesh().nCells(), su.value()));
391 template<class Type>
392 void tetFemMatrix<Type>::operator*=
394     const dimensioned<scalar>& ds
397     dimensions_ *= ds.dimensions();
398     lduMatrix::operator*=(ds.value());
399     source_ *= ds.value();
403 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
405 template<class Type>
406 void checkMethod
408     const tetFemMatrix<Type>& tetFem1,
409     const tetFemMatrix<Type>& tetFem2,
410     const char* op
413     if (&tetFem1.psi() != &tetFem2.psi())
414     {
415         FatalErrorIn
416         (
417             "checkMethod(const tetFemMatrix<Type>&, "
418             "const tetFemMatrix<Type>&) : "
419         )   << "incompatible fields for operation "
420             << endl << "    "
421             << "[" << tetFem1.psi().name() << "] "
422             << op
423             << " [" << tetFem1.psi().name() << "]"
424             << abort(FatalError);
425     }
427     if (dimensionSet::debug && tetFem1.dimensions() != tetFem2.dimensions())
428     {
429         FatalErrorIn
430         (
431             "checkMethod(const tetFemMatrix<Type>&, "
432             "const tetFemMatrix<Type>&) : "
433         )   << "incompatible dimensions for operation "
434             << endl << "    "
435             << "[" << tetFem1.psi().name() << tetFem1.dimensions()/dimVolume
436             << " ] "
437             << op
438             << " [" << tetFem1.psi().name() << tetFem2.dimensions()/dimVolume
439             << " ]"
440             << abort(FatalError);
441     }
445 template<class Type>
446 void checkMethod
448     const tetFemMatrix<Type>& tetFem,
449     const GeometricField<Type, elementPatchField, elementMesh>& vf,
450     const char* op
453     if
454     (
455         dimensionSet::debug
456      && tetFem.dimensions()/dimVolume != vf.dimensions()
457     )
458     {
459         FatalErrorIn
460         (
461             "checkMethod(const tetFemMatrix<Type>&, "
462             "const GeometricField<Type, elementPatchField, "
463             "elementMesh>&) : "
464         )   << "incompatible dimensions for operation "
465             << endl << "    "
466             << "[" << tetFem.psi().name() << tetFem.dimensions()/dimVolume
467             << " ] "
468             << op
469             << " [" << tetFem.psi().name() << vf.dimensions() << " ]"
470             << abort(FatalError);
471     }
475 template<class Type>
476 void checkMethod
478     const tetFemMatrix<Type>& tetFem,
479     const dimensioned<Type>& dt,
480     const char* op
483     if
484     (
485         dimensionSet::debug
486      && tetFem.dimensions()/dimVolume != dt.dimensions()
487     )
488     {
489         FatalErrorIn
490         (
491             "checkMethod(const tetFemMatrix<Type>&, "
492             "const dimensioned<Type>&) : "
493         )   << "incompatible dimensions for operation "
494             << endl << "    "
495             << "[" << tetFem.psi().name() << tetFem.dimensions()/dimVolume
496             << " ] "
497             << op
498             << " [" << dt.name() << dt.dimensions() << " ]"
499             << abort(FatalError);
500     }
504 template<class Type>
505 lduSolverPerformance solve
507     tetFemMatrix<Type>& tetFem,
508     Istream& solverControls
511     return tetFem.solve(solverControls);
514 template<class Type>
515 lduSolverPerformance solve
517     const tmp<tetFemMatrix<Type> >& ttetFem,
518     Istream& solverControls
521     lduSolverPerformance solverPerf = 
522         const_cast<tetFemMatrix<Type>&>(ttetFem()).solve(solverControls);
524     ttetFem.clear();
526     return solverPerf;
530 template<class Type>
531 lduSolverPerformance solve(tetFemMatrix<Type>& tetFem)
533     return tetFem.solve();
537 template<class Type>
538 lduSolverPerformance solve(const tmp<tetFemMatrix<Type> >& ttetFem)
540     lduSolverPerformance solverPerf =
541         const_cast<tetFemMatrix<Type>&>(ttetFem()).solve();
543     ttetFem.clear();
544     return solverPerf;
548 // * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
550 template<class Type>
551 tmp<tetFemMatrix<Type> > operator+
553     const tetFemMatrix<Type>& A,
554     const tetFemMatrix<Type>& B
557     checkMethod(A, B, "+");
558     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
559     tC() += B;
560     return tC;
564 template<class Type>
565 tmp<tetFemMatrix<Type> > operator+
567     const tmp<tetFemMatrix<Type> >& tA,
568     const tetFemMatrix<Type>& B
571     checkMethod(tA(), B, "+");
572     tmp<tetFemMatrix<Type> > tC(tA.ptr());
573     tC() += B;
574     return tC;
578 template<class Type>
579 tmp<tetFemMatrix<Type> > operator+
581     const tetFemMatrix<Type>& A,
582     const tmp<tetFemMatrix<Type> >& tB
585     checkMethod(A, tB(), "+");
586     tmp<tetFemMatrix<Type> > tC(tB.ptr());
587     tC() += A;
588     return tC;
592 template<class Type>
593 tmp<tetFemMatrix<Type> > operator+
595     const tmp<tetFemMatrix<Type> >& tA,
596     const tmp<tetFemMatrix<Type> >& tB
599     checkMethod(tA(), tB(), "+");
600     tmp<tetFemMatrix<Type> > tC(tA.ptr());
601     tC() += tB();
602     tB.clear();
603     return tC;
607 template<class Type>
608 tmp<tetFemMatrix<Type> > operator-
610     const tetFemMatrix<Type>& A
613     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
614     tC().negate();
615     return tC;
619 template<class Type>
620 tmp<tetFemMatrix<Type> > operator-
622     const tmp<tetFemMatrix<Type> >& tA
625     tmp<tetFemMatrix<Type> > tC(tA.ptr());
626     tC().negate();
627     return tC;
631 template<class Type>
632 tmp<tetFemMatrix<Type> > operator-
634     const tetFemMatrix<Type>& A,
635     const tetFemMatrix<Type>& B
638     checkMethod(A, B, "-");
639     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
640     tC() -= B;
641     return tC;
645 template<class Type>
646 tmp<tetFemMatrix<Type> > operator-
648     const tmp<tetFemMatrix<Type> >& tA,
649     const tetFemMatrix<Type>& B
652     checkMethod(tA(), B, "-");
653     tmp<tetFemMatrix<Type> > tC(tA.ptr());
654     tC() -= B;
655     return tC;
659 template<class Type>
660 tmp<tetFemMatrix<Type> > operator-
662     const tetFemMatrix<Type>& A,
663     const tmp<tetFemMatrix<Type> >& tB
666     checkMethod(A, tB(), "-");
667     tmp<tetFemMatrix<Type> > tC(tB.ptr());
668     tC() -= A;
669     tC().negate();
670     return tC;
674 template<class Type>
675 tmp<tetFemMatrix<Type> > operator-
677     const tmp<tetFemMatrix<Type> >& tA,
678     const tmp<tetFemMatrix<Type> >& tB
681     checkMethod(tA(), tB(), "-");
682     tmp<tetFemMatrix<Type> > tC(tA.ptr());
683     tC() -= tB();
684     tB.clear();
685     return tC;
689 template<class Type>
690 tmp<tetFemMatrix<Type> > operator==
692     const tetFemMatrix<Type>& A,
693     const tetFemMatrix<Type>& B
696     checkMethod(A, B, "==");
697     return (A - B);
701 template<class Type>
702 tmp<tetFemMatrix<Type> > operator==
704     const tmp<tetFemMatrix<Type> >& tA,
705     const tetFemMatrix<Type>& B
708     checkMethod(tA(), B, "==");
709     return (tA - B);
713 template<class Type>
714 tmp<tetFemMatrix<Type> > operator==
716     const tetFemMatrix<Type>& A,
717     const tmp<tetFemMatrix<Type> >& tB
720     checkMethod(A, tB(), "==");
721     return (A - tB);
725 template<class Type>
726 tmp<tetFemMatrix<Type> > operator==
728     const tmp<tetFemMatrix<Type> >& tA,
729     const tmp<tetFemMatrix<Type> >& tB
732     checkMethod(tA(), tB(), "==");
733     return (tA - tB);
737 template<class Type>
738 tmp<tetFemMatrix<Type> > operator+
740     const tetFemMatrix<Type>& A,
741     const GeometricField<Type, elementPatchField, elementMesh>& su
744     checkMethod(A, su, "+");
745     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
746     tC() -= su;
747     return tC;
750 template<class Type>
751 tmp<tetFemMatrix<Type> > operator+
753     const tmp<tetFemMatrix<Type> >& tA,
754     const GeometricField<Type, elementPatchField, elementMesh>& su
757     checkMethod(tA(), su, "+");
758     tmp<tetFemMatrix<Type> > tC(tA.ptr());
759     tC() -= su;
760     return tC;
763 template<class Type>
764 tmp<tetFemMatrix<Type> > operator+
766     const tetFemMatrix<Type>& A,
767     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
770     checkMethod(A, tsu(), "+");
771     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
772     tC() -= tsu();
773     tsu.clear();
774     return tC;
778 template<class Type>
779 tmp<tetFemMatrix<Type> > operator+
781     const tmp<tetFemMatrix<Type> >& tA,
782     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
785     checkMethod(tA(), tsu(), "+");
786     tmp<tetFemMatrix<Type> > tC(tA.ptr());
787     tC() -= tsu();
788     tsu.clear();
789     return tC;
792 template<class Type>
793 tmp<tetFemMatrix<Type> > operator+
795     const GeometricField<Type, elementPatchField, elementMesh>& su,
796     const tetFemMatrix<Type>& A
799     checkMethod(A, su, "+");
800     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
801     tC() -= su;
802     return tC;
805 template<class Type>
806 tmp<tetFemMatrix<Type> > operator+
808     const GeometricField<Type, elementPatchField, elementMesh>& su,
809     const tmp<tetFemMatrix<Type> >& tA
812     checkMethod(tA(), su, "+");
813     tmp<tetFemMatrix<Type> > tC(tA.ptr());
814     tC() -= su;
815     return tC;
818 template<class Type>
819 tmp<tetFemMatrix<Type> > operator+
821     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
822     const tetFemMatrix<Type>& A
825     checkMethod(A, tsu(), "+");
826     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
827     tC() -= tsu();
828     tsu.clear();
829     return tC;
832 template<class Type>
833 tmp<tetFemMatrix<Type> > operator+
835     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
836     const tmp<tetFemMatrix<Type> >& tA
839     checkMethod(tA(), tsu(), "+");
840     tmp<tetFemMatrix<Type> > tC(tA.ptr());
841     tC() -= tsu();
842     tsu.clear();
843     return tC;
847 template<class Type>
848 tmp<tetFemMatrix<Type> > operator-
850     const tetFemMatrix<Type>& A,
851     const GeometricField<Type, elementPatchField, elementMesh>& su
854     checkMethod(A, su, "-");
855     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
856     tC() += su;
857     return tC;
860 template<class Type>
861 tmp<tetFemMatrix<Type> > operator-
863     const tmp<tetFemMatrix<Type> >& tA,
864     const GeometricField<Type, elementPatchField, elementMesh>& su
867     checkMethod(tA(), su, "-");
868     tmp<tetFemMatrix<Type> > tC(tA.ptr());
869     tC() += su;
870     return tC;
873 template<class Type>
874 tmp<tetFemMatrix<Type> > operator-
876     const tetFemMatrix<Type>& A,
877     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
880     checkMethod(A, tsu(), "-");
881     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
882     tC() += tsu();
883     tsu.clear();
884     return tC;
887 template<class Type>
888 tmp<tetFemMatrix<Type> > operator-
890     const tmp<tetFemMatrix<Type> >& tA,
891     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
894     checkMethod(tA(), tsu(), "-");
895     tmp<tetFemMatrix<Type> > tC(tA.ptr());
896     tC() += tsu();
897     tsu.clear();
898     return tC;
902 template<class Type>
903 tmp<tetFemMatrix<Type> > operator-
905     const GeometricField<Type, elementPatchField, elementMesh>& su,
906     const tetFemMatrix<Type>& A
909     checkMethod(A, su, "-");
910     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
911     tC().negate();
912     tC() -= su;
913     return tC;
917 template<class Type>
918 tmp<tetFemMatrix<Type> > operator-
920     const GeometricField<Type, elementPatchField, elementMesh>& su,
921     const tmp<tetFemMatrix<Type> >& tA
924     checkMethod(tA(), su, "-");
925     tmp<tetFemMatrix<Type> > tC(tA.ptr());
926     tC().negate();
927     tC() -= su;
928     return tC;
931 template<class Type>
932 tmp<tetFemMatrix<Type> > operator-
934     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
935     const tetFemMatrix<Type>& A
938     checkMethod(A, tsu(), "-");
939     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
940     tC().negate();
941     tC() -= tsu();
942     tsu.clear();
943     return tC;
947 template<class Type>
948 tmp<tetFemMatrix<Type> > operator-
950     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu,
951     const tmp<tetFemMatrix<Type> >& tA
954     checkMethod(tA(), tsu(), "-");
955     tmp<tetFemMatrix<Type> > tC(tA.ptr());
956     tC().negate();
957     tC() -= tsu();
958     tsu.clear();
959     return tC;
963 template<class Type>
964 tmp<tetFemMatrix<Type> > operator+
966     const tetFemMatrix<Type>& A,
967     const dimensioned<Type>& su
970     checkMethod(A, su, "+");
971     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
972     tC() -= su;
973     return tC;
977 template<class Type>
978 tmp<tetFemMatrix<Type> > operator+
980     const tmp<tetFemMatrix<Type> >& tA,
981     const dimensioned<Type>& su
984     checkMethod(tA(), su, "+");
985     tmp<tetFemMatrix<Type> > tC(tA.ptr());
986     tC() -= su;
987     return tC;
991 template<class Type>
992 tmp<tetFemMatrix<Type> > operator+
994     const dimensioned<Type>& su,
995     const tetFemMatrix<Type>& A
998     checkMethod(A, su, "+");
999     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1000     tC() -= su;
1001     return tC;
1005 template<class Type>
1006 tmp<tetFemMatrix<Type> > operator+
1008     const dimensioned<Type>& su,
1009     const tmp<tetFemMatrix<Type> >& tA
1012     checkMethod(tA(), su, "+");
1013     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1014     tC() -= su;
1015     return tC;
1019 template<class Type>
1020 tmp<tetFemMatrix<Type> > operator-
1022     const tetFemMatrix<Type>& A,
1023     const dimensioned<Type>& su
1026     checkMethod(A, su, "-");
1027     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1028     tC() += su;
1029     return tC;
1033 template<class Type>
1034 tmp<tetFemMatrix<Type> > operator-
1036     const tmp<tetFemMatrix<Type> >& tA,
1037     const dimensioned<Type>& su
1040     checkMethod(tA(), su, "-");
1041     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1042     tC() += su;
1043     return tC;
1047 template<class Type>
1048 tmp<tetFemMatrix<Type> > operator-
1050     const dimensioned<Type>& su,
1051     const tetFemMatrix<Type>& A
1054     checkMethod(A, su, "-");
1055     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1056     tC().negate();
1057     tC() -= su;
1058     return tC;
1062 template<class Type>
1063 tmp<tetFemMatrix<Type> > operator-
1065     const dimensioned<Type>& su,
1066     const tmp<tetFemMatrix<Type> >& tA
1069     checkMethod(tA(), su, "-");
1070     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1071     tC().negate();
1072     tC() -= su;
1073     return tC;
1077 template<class Type>
1078 tmp<tetFemMatrix<Type> > operator==
1080     const tetFemMatrix<Type>& A,
1081     const GeometricField<Type, elementPatchField, elementMesh>& su
1084     checkMethod(A, su, "==");
1085     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1086     tC() += su;
1087     return tC;
1090 template<class Type>
1091 tmp<tetFemMatrix<Type> > operator==
1093     const tmp<tetFemMatrix<Type> >& tA,
1094     const GeometricField<Type, elementPatchField, elementMesh>& su
1097     checkMethod(tA(), su, "==");
1098     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1099     tC() += su;
1100     return tC;
1103 template<class Type>
1104 tmp<tetFemMatrix<Type> > operator==
1106     const tetFemMatrix<Type>& A,
1107     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
1110     checkMethod(A, tsu(), "==");
1111     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1112     tC() += tsu();
1113     tsu.clear();
1114     return tC;
1117 template<class Type>
1118 tmp<tetFemMatrix<Type> > operator==
1120     const tmp<tetFemMatrix<Type> >& tA,
1121     const tmp<GeometricField<Type, elementPatchField, elementMesh> >& tsu
1124     checkMethod(tA(), tsu(), "==");
1125     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1126     tC() += tsu();
1127     tsu.clear();
1128     return tC;
1132 template<class Type>
1133 tmp<tetFemMatrix<Type> > operator==
1135     const tetFemMatrix<Type>& A,
1136     const dimensioned<Type>& su
1139     checkMethod(A, su, "==");
1140     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1141     tC() += su;
1142     return tC;
1146 template<class Type>
1147 tmp<tetFemMatrix<Type> > operator==
1149     const tmp<tetFemMatrix<Type> >& tA,
1150     const dimensioned<Type>& su
1153     checkMethod(tA(), su, "==");
1154     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1155     tC() += su.value();
1156     return tC;
1160 template<class Type>
1161 tmp<tetFemMatrix<Type> > operator*
1163     const dimensioned<scalar>& ds,
1164     const tetFemMatrix<Type>& A
1167     tmp<tetFemMatrix<Type> > tC(new tetFemMatrix<Type>(A));
1168     tC() *= ds;
1169     return tC;
1173 template<class Type>
1174 tmp<tetFemMatrix<Type> > operator*
1176     const dimensioned<scalar>& ds,
1177     const tmp<tetFemMatrix<Type> >& tA
1180     tmp<tetFemMatrix<Type> > tC(tA.ptr());
1181     tC() *= ds;
1182     return tC;
1186 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
1188 template<class Type>
1189 Ostream& operator<<(Ostream& os, const tetFemMatrix<Type>& tetFem)
1191     os  << static_cast<const lduMatrix&>(tetFem) << nl
1192         << tetFem.dimensions_ << nl
1193         << tetFem.source_ << endl;
1195     os.check("Ostream& operator<<(Ostream&, tetFemMatrix<Type>&");
1197     return os;
1201 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1203 } // End namespace Foam
1205 // ************************************************************************* //