Foam::vector Foam::eigenValues(const symmTensor& t) { scalar i = 0; scalar ii = 0; scalar iii = 0; if ( ( mag(t.xy()) + mag(t.xz()) + mag(t.xy()) + mag(t.yz()) + mag(t.xz()) + mag(t.yz()) ) < SMALL ) { // diagonal matrix i = t.xx(); ii = t.yy(); iii = t.zz(); } else { scalar a = -t.xx() - t.yy() - t.zz(); scalar b = t.xx()*t.yy() + t.xx()*t.zz() + t.yy()*t.zz() - t.xy()*t.xy() - t.xz()*t.xz() - t.yz()*t.yz(); scalar c = - t.xx()*t.yy()*t.zz() - t.xy()*t.yz()*t.xz() - t.xz()*t.xy()*t.yz() + t.xz()*t.yy()*t.xz() + t.xy()*t.xy()*t.zz() + t.xx()*t.yz()*t.yz(); // If there is a zero root if (mag(c) < ROOTVSMALL) { scalar disc = sqr(a) - 4*b; if (disc >= -SMALL) { scalar q = -0.5*sqrt(max(0.0, disc)); i = 0; ii = -0.5*a + q; iii = -0.5*a - q; } else { FatalErrorIn("eigenValues(const tensor&)") << "zero and complex eigenvalues in tensor: " << t << abort(FatalError); } } else { scalar Q = (a*a - 3*b)/9; scalar R = (2*a*a*a - 9*a*b + 27*c)/54; scalar R2 = sqr(R); scalar Q3 = pow3(Q); // Three different real roots if (R2 < Q3) { scalar sqrtQ = sqrt(Q); scalar theta = acos(R/(Q*sqrtQ)); scalar m2SqrtQ = -2*sqrtQ; scalar aBy3 = a/3; i = m2SqrtQ*cos(theta/3) - aBy3; ii = m2SqrtQ*cos((theta + twoPi)/3) - aBy3; iii = m2SqrtQ*cos((theta - twoPi)/3) - aBy3; } else { scalar A = cbrt(R + sqrt(R2 - Q3)); // Three equal real roots if (A < SMALL) { scalar root = -a/3; return vector(root, root, root); } else { // Complex roots WarningIn("eigenValues(const symmTensor&)") << "complex eigenvalues detected for symmTensor: " << t << endl; return vector::zero; } } } } // Sort the eigenvalues into ascending order if (i > ii) { Swap(i, ii); } if (ii > iii) { Swap(ii, iii); } if (i > ii) { Swap(i, ii); } return vector(i, ii, iii); }
// Info << "Sp = " << Sp << endl; // Info << "S = " << S << endl; //} //if ((loc[facei].x() < 1501 && loc[facei].x() > 1499) && // (loc[facei].y() < 1501 && loc[facei].y() > 1499)) //{ // Pout << "loc = " << loc[facei] << endl; // Pout << "UParallel " << UParallel[facei] << endl; // Pout << "UParallelP " << UParallelP[facei] << endl; // Pout << "xP, yP, zP " << xP << tab << yP << tab << zP << endl; // Pout << "RwP " << RwP << endl; // Pout << "Rw " << Rw[facei] << endl; //} } symmTensor RwMean = gSum(Rw * area) / areaTotal; scalar RwMeanMag = Foam::sqrt(Foam::sqr(RwMean.xz()) + Foam::sqr(RwMean.yz())); scalar RwMagMean = gSum(RwMag * area) / areaTotal; Info << "RwMagMean = " << RwMagMean << tab << "RwMeanMag = " << RwMeanMag << tab << "sqrt(RwMagMean) = " << Foam::sqrt(RwMagMean) << tab << "sqrt(RwMeanMag) = " << Foam::sqrt(RwMeanMag) << tab << "uStarMean = " << uStarMean << endl; } vector SchumannGrotzbachFvPatchField::transformVectorCartToLocal ( vector v, vector xP, vector yP,