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 
00027 
00028 
00029 #include <OpenFOAM/lduMatrix.H>
00030 
00031 
00032 
00033 void Foam::lduMatrix::sumDiag()
00034 {
00035     const scalarField& Lower = const_cast<const lduMatrix&>(*this).lower();
00036     const scalarField& Upper = const_cast<const lduMatrix&>(*this).upper();
00037     scalarField& Diag = diag();
00038 
00039     const unallocLabelList& l = lduAddr().lowerAddr();
00040     const unallocLabelList& u = lduAddr().upperAddr();
00041 
00042     for (register label face=0; face<l.size(); face++)
00043     {
00044         Diag[l[face]] += Lower[face];
00045         Diag[u[face]] += Upper[face];
00046     }
00047 }
00048 
00049 
00050 void Foam::lduMatrix::negSumDiag()
00051 {
00052     const scalarField& Lower = const_cast<const lduMatrix&>(*this).lower();
00053     const scalarField& Upper = const_cast<const lduMatrix&>(*this).upper();
00054     scalarField& Diag = diag();
00055 
00056     const unallocLabelList& l = lduAddr().lowerAddr();
00057     const unallocLabelList& u = lduAddr().upperAddr();
00058 
00059     for (register label face=0; face<l.size(); face++)
00060     {
00061         Diag[l[face]] -= Lower[face];
00062         Diag[u[face]] -= Upper[face];
00063     }
00064 }
00065 
00066 
00067 void Foam::lduMatrix::sumMagOffDiag
00068 (
00069     scalarField& sumOff
00070 ) const
00071 {
00072     const scalarField& Lower = const_cast<const lduMatrix&>(*this).lower();
00073     const scalarField& Upper = const_cast<const lduMatrix&>(*this).upper();
00074 
00075     const unallocLabelList& l = lduAddr().lowerAddr();
00076     const unallocLabelList& u = lduAddr().upperAddr();
00077 
00078     for (register label face = 0; face < l.size(); face++)
00079     {
00080         sumOff[u[face]] += mag(Lower[face]);
00081         sumOff[l[face]] += mag(Upper[face]);
00082     }
00083 }
00084 
00085 
00086 
00087 
00088 void Foam::lduMatrix::operator=(const lduMatrix& A)
00089 {
00090     if (this == &A)
00091     {
00092         FatalError
00093             << "lduMatrix::operator=(const lduMatrix&) : "
00094             << "attempted assignment to self"
00095             << abort(FatalError);
00096     }
00097 
00098     if (A.lowerPtr_)
00099     {
00100         lower() = A.lower();
00101     }
00102     else if (lowerPtr_)
00103     {
00104         delete lowerPtr_;
00105         lowerPtr_ = NULL;
00106     }
00107 
00108     if (A.upperPtr_)
00109     {
00110         upper() = A.upper();
00111     }
00112     else if (upperPtr_)
00113     {
00114         delete upperPtr_;
00115         upperPtr_ = NULL;
00116     }
00117 
00118     if (A.diagPtr_)
00119     {
00120         diag() = A.diag();
00121     }
00122 }
00123 
00124 
00125 void Foam::lduMatrix::negate()
00126 {
00127     if (lowerPtr_)
00128     {
00129         lowerPtr_->negate();
00130     }
00131 
00132     if (upperPtr_)
00133     {
00134         upperPtr_->negate();
00135     }
00136 
00137     if (diagPtr_)
00138     {
00139         diagPtr_->negate();
00140     }
00141 }
00142 
00143 
00144 void Foam::lduMatrix::operator+=(const lduMatrix& A)
00145 {
00146     if (A.diagPtr_)
00147     {
00148         diag() += A.diag();
00149     }
00150 
00151     if (symmetric() && A.symmetric())
00152     {
00153         upper() += A.upper();
00154     }
00155     else if (symmetric() && A.asymmetric())
00156     {
00157         if (upperPtr_)
00158         {
00159             lower();
00160         }
00161         else
00162         {
00163             upper();
00164         }
00165 
00166         upper() += A.upper();
00167         lower() += A.lower();
00168     }
00169     else if (asymmetric() && A.symmetric())
00170     {
00171         if (A.upperPtr_)
00172         {
00173             lower() += A.upper();
00174             upper() += A.upper();
00175         }
00176         else
00177         {
00178             lower() += A.lower();
00179             upper() += A.lower();
00180         }
00181 
00182     }
00183     else if (asymmetric() && A.asymmetric())
00184     {
00185         lower() += A.lower();
00186         upper() += A.upper();
00187     }
00188     else if (diagonal())
00189     {
00190         if (A.upperPtr_)
00191         {
00192             upper() = A.upper();
00193         }
00194 
00195         if (A.lowerPtr_)
00196         {
00197             lower() = A.lower();
00198         }
00199     }
00200     else if (A.diagonal())
00201     {
00202     }
00203     else
00204     {
00205         FatalErrorIn("lduMatrix::operator+=(const lduMatrix& A)")
00206             << "Unknown matrix type combination"
00207             << abort(FatalError);
00208     }
00209 }
00210 
00211 
00212 void Foam::lduMatrix::operator-=(const lduMatrix& A)
00213 {
00214     if (A.diagPtr_)
00215     {
00216         diag() -= A.diag();
00217     }
00218 
00219     if (symmetric() && A.symmetric())
00220     {
00221         upper() -= A.upper();
00222     }
00223     else if (symmetric() && A.asymmetric())
00224     {
00225         if (upperPtr_)
00226         {
00227             lower();
00228         }
00229         else
00230         {
00231             upper();
00232         }
00233 
00234         upper() -= A.upper();
00235         lower() -= A.lower();
00236     }
00237     else if (asymmetric() && A.symmetric())
00238     {
00239         if (A.upperPtr_)
00240         {
00241             lower() -= A.upper();
00242             upper() -= A.upper();
00243         }
00244         else
00245         {
00246             lower() -= A.lower();
00247             upper() -= A.lower();
00248         }
00249 
00250     }
00251     else if (asymmetric() && A.asymmetric())
00252     {
00253         lower() -= A.lower();
00254         upper() -= A.upper();
00255     }
00256     else if (diagonal())
00257     {
00258         if (A.upperPtr_)
00259         {
00260             upper() = -A.upper();
00261         }
00262 
00263         if (A.lowerPtr_)
00264         {
00265             lower() = -A.lower();
00266         }
00267     }
00268     else if (A.diagonal())
00269     {
00270     }
00271     else
00272     {
00273         FatalErrorIn("lduMatrix::operator-=(const lduMatrix& A)")
00274             << "Unknown matrix type combination"
00275             << abort(FatalError);
00276     }
00277 }
00278 
00279 
00280 void Foam::lduMatrix::operator*=(const scalarField& sf)
00281 {
00282     if (diagPtr_)
00283     {
00284         *diagPtr_ *= sf;
00285     }
00286 
00287     if (upperPtr_)
00288     {
00289         scalarField& upper = *upperPtr_;
00290 
00291         const unallocLabelList& l = lduAddr().lowerAddr();
00292 
00293         for (register label face=0; face<upper.size(); face++)
00294         {
00295             upper[face] *= sf[l[face]];
00296         }
00297     }
00298 
00299     if (lowerPtr_)
00300     {
00301         scalarField& lower = *lowerPtr_;
00302 
00303         const unallocLabelList& u = lduAddr().upperAddr();
00304 
00305         for (register label face=0; face<lower.size(); face++)
00306         {
00307             lower[face] *= sf[u[face]];
00308         }
00309     }
00310 }
00311 
00312 
00313 void Foam::lduMatrix::operator*=(scalar s)
00314 {
00315     if (diagPtr_)
00316     {
00317         *diagPtr_ *= s;
00318     }
00319 
00320     if (upperPtr_)
00321     {
00322         *upperPtr_ *= s;
00323     }
00324 
00325     if (lowerPtr_)
00326     {
00327         *lowerPtr_ *= s;
00328     }
00329 }
00330 
00331 
00332 Foam::tmp<Foam::scalarField > Foam::lduMatrix::H1() const
00333 {
00334     tmp<scalarField > tH1
00335     (
00336         new scalarField(lduAddr().size(), 0.0)
00337     );
00338 
00339     if (lowerPtr_ || upperPtr_)
00340     {
00341         scalarField& H1_ = tH1();
00342 
00343         scalar* __restrict__ H1Ptr = H1_.begin();
00344 
00345         const label* __restrict__ uPtr = lduAddr().upperAddr().begin();
00346         const label* __restrict__ lPtr = lduAddr().lowerAddr().begin();
00347 
00348         const scalar* __restrict__ lowerPtr = lower().begin();
00349         const scalar* __restrict__ upperPtr = upper().begin();
00350 
00351         register const label nFaces = upper().size();
00352 
00353         for (register label face=0; face<nFaces; face++)
00354         {
00355             H1Ptr[uPtr[face]] -= lowerPtr[face];
00356             H1Ptr[lPtr[face]] -= upperPtr[face];
00357         }
00358     }
00359 
00360     return tH1;
00361 }
00362 
00363 
00364