Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <OpenFOAM/FDICPreconditioner.H>
00027
00028
00029
00030 namespace Foam
00031 {
00032 defineTypeNameAndDebug(FDICPreconditioner, 0);
00033
00034 lduMatrix::preconditioner::
00035 addsymMatrixConstructorToTable<FDICPreconditioner>
00036 addFDICPreconditionerSymMatrixConstructorToTable_;
00037 }
00038
00039
00040
00041
00042 Foam::FDICPreconditioner::FDICPreconditioner
00043 (
00044 const lduMatrix::solver& sol,
00045 const dictionary&
00046 )
00047 :
00048 lduMatrix::preconditioner(sol),
00049 rD_(sol.matrix().diag()),
00050 rDuUpper_(sol.matrix().upper().size()),
00051 rDlUpper_(sol.matrix().upper().size())
00052 {
00053 scalar* __restrict__ rDPtr = rD_.begin();
00054 scalar* __restrict__ rDuUpperPtr = rDuUpper_.begin();
00055 scalar* __restrict__ rDlUpperPtr = rDlUpper_.begin();
00056
00057 const label* const __restrict__ uPtr =
00058 solver_.matrix().lduAddr().upperAddr().begin();
00059 const label* const __restrict__ lPtr =
00060 solver_.matrix().lduAddr().lowerAddr().begin();
00061 const scalar* const __restrict__ upperPtr = solver_.matrix().upper().begin();
00062
00063 register label nCells = rD_.size();
00064 register label nFaces = solver_.matrix().upper().size();
00065
00066 for (register label face=0; face<nFaces; face++)
00067 {
00068 rDPtr[uPtr[face]] -= sqr(upperPtr[face])/rDPtr[lPtr[face]];
00069 }
00070
00071
00072 for (register label cell=0; cell<nCells; cell++)
00073 {
00074 rDPtr[cell] = 1.0/rDPtr[cell];
00075 }
00076
00077 for (register label face=0; face<nFaces; face++)
00078 {
00079 rDuUpperPtr[face] = rDPtr[uPtr[face]]*upperPtr[face];
00080 rDlUpperPtr[face] = rDPtr[lPtr[face]]*upperPtr[face];
00081 }
00082 }
00083
00084
00085
00086
00087 void Foam::FDICPreconditioner::precondition
00088 (
00089 scalarField& wA,
00090 const scalarField& rA,
00091 const direction
00092 ) const
00093 {
00094 scalar* __restrict__ wAPtr = wA.begin();
00095 const scalar* __restrict__ rAPtr = rA.begin();
00096 const scalar* __restrict__ rDPtr = rD_.begin();
00097
00098 const label* const __restrict__ uPtr =
00099 solver_.matrix().lduAddr().upperAddr().begin();
00100 const label* const __restrict__ lPtr =
00101 solver_.matrix().lduAddr().lowerAddr().begin();
00102
00103 const scalar* const __restrict__ rDuUpperPtr = rDuUpper_.begin();
00104 const scalar* const __restrict__ rDlUpperPtr = rDlUpper_.begin();
00105
00106 register label nCells = wA.size();
00107 register label nFaces = solver_.matrix().upper().size();
00108 register label nFacesM1 = nFaces - 1;
00109
00110 for (register label cell=0; cell<nCells; cell++)
00111 {
00112 wAPtr[cell] = rDPtr[cell]*rAPtr[cell];
00113 }
00114
00115 for (register label face=0; face<nFaces; face++)
00116 {
00117 wAPtr[uPtr[face]] -= rDuUpperPtr[face]*wAPtr[lPtr[face]];
00118 }
00119
00120 for (register label face=nFacesM1; face>=0; face--)
00121 {
00122 wAPtr[lPtr[face]] -= rDlUpperPtr[face]*wAPtr[uPtr[face]];
00123 }
00124 }
00125
00126
00127