fixed writing out entries in advective bc
[OpenFOAM-1.6-ext.git] / src / tetDecompositionFiniteElement / tetFemMatrix / tetFemScalarMatrix.C
blob67c3fb81b8e35afd0452ee8dd152683b2c895e42
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      Tet Finite Element scalar matrix member functions and operators
28 \*---------------------------------------------------------------------------*/
30 #include "tetFemScalarMatrix.H"
31 #include "tetPointFields.H"
32 #include "tetPolyPatchFields.H"
34 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 namespace Foam
39 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
41 template<>
42 lduSolverPerformance tetFemMatrix<scalar>::solve
44     const dictionary& solverControls
47     if (debug)
48     {
49         Info<< "tetFemMatrix<scalar>::solve(const dictionary&) : "
50             << "solving tetFemMatrix<scalar>"
51             << endl;
52     }
54     // Add boundary source for gradient-type conditions
55     addBoundarySourceDiag();
57     // Store the boundary coefficients for insertion of boundary conditions
58     storeBoundaryCoeffs();
60     // Set component boundary conditions
61     scalarField sourceCpy = source_;
63     // Store the boundary coefficients for insertion of boundary conditions
64     setComponentBoundaryConditions(0, psi_, sourceCpy);
66     // Add the coupling coefficients
67     addCouplingCoeffs();
68     addCouplingSource(sourceCpy);
70     // prepare for coupled interface update
71     FieldField<Field, scalar> coupledBouCoeffs(psi_.boundaryField().size());
72     FieldField<Field, scalar> coupledIntCoeffs(psi_.boundaryField().size());
74     forAll(psi_.boundaryField(), patchI)
75     {
76         const tetPolyPatchScalarField& ptf = psi_.boundaryField()[patchI];
78         coupledBouCoeffs.set
79         (
80             patchI,
81             new scalarField(ptf.cutBouCoeffs(*this))
82         );
84         coupledIntCoeffs.set
85         (
86             patchI,
87             new scalarField(ptf.cutIntCoeffs(*this))
88         );
89     }
91     eliminateCouplingCoeffs();
93     lduSolverPerformance solverPerf
94     (
95         "tetFemMatrix<scalar>::solve",
96         psi_.name()
97     );
99     // Make a copy of interfaces: no longer a reference
100     // HJ, 20/Nov/2007
101     lduInterfaceFieldPtrsList interfaces = psi_.boundaryField().interfaces();
103     solverPerf = lduSolver::New
104     (
105         psi_.name(),
106         *this,
107         coupledBouCoeffs,
108         coupledIntCoeffs,
109         interfaces,
110         solverControls
111     )->solve(psi_.internalField(), sourceCpy);
113     solverPerf.print();
115     reconstructMatrix();
117     if (debug)
118     {
119         Info<< "tetFemMatrix<scalar>::solve(const scalar, const scalar) : "
120             << "correcting boundary conditions"
121             << endl;
122     }
124     psi_.correctBoundaryConditions();
126     return solverPerf;
130 // Return the matrix residual
131 template<>
132 tmp<scalarField> tetFemMatrix<scalar>::residual()
134     // Store the boundary coefficients for insertion of boundary conditions
135     storeBoundaryCoeffs();
137     // Set component boundary conditions
138     scalarField sourceCpy = source_;
140     setComponentBoundaryConditions(0, psi_, sourceCpy);
142     // Add the coupling coefficients
143     addCouplingCoeffs();
144     addCouplingSource(sourceCpy);
146     // Prepare for coupled interface update
147     FieldField<Field, scalar> coupledBouCoeffs(psi_.boundaryField().size());
149     forAll(psi_.boundaryField(), patchI)
150     {
151         const tetPolyPatchScalarField& ptf = psi_.boundaryField()[patchI];
152         coupledBouCoeffs.set
153         (
154             patchI,
155             new scalarField(ptf.cutBouCoeffs(*this))
156         );
157     }
159     eliminateCouplingCoeffs();
161     // Make a copy of interfaces: no longer a reference
162     // HJ, 20/Nov/2007
163     lduInterfaceFieldPtrsList interfaces = psi_.boundaryField().interfaces();
165     tmp<scalarField> tres
166     (
167         lduMatrix::residual
168         (
169             psi_.internalField(),
170             sourceCpy,
171             coupledBouCoeffs,
172             interfaces,
173             0
174         )
175     );
177     reconstructMatrix();
179     return tres;
183 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
185 } // End namespace Foam
187 // ************************************************************************* //