00001 #include "tracefacefluxwithgravity.h"
00002
00003
00004 TraceFaceFluxWithGravity::TraceFaceFluxWithGravity(unsigned numFaces,Function1D &fMobW,Function1D &fMobGrav,VecDouble &cK,double gc)
00005 :m_fMobW(fMobW),m_fMobGrav(fMobGrav),m_cK(cK),m_Vel(numFaces,3)
00006 {
00007 m_gc = gc;
00008 m_maxK = cK.linfty_norm();
00009 }
00010
00011
00021 double TraceFaceFluxWithGravity::fluxAtFace(OrthoMesh::Face_It &faceIt,int face,int cell1,int cell2,double &u1,double &u2)
00022 {
00023 assert( (unsigned) face < m_Vel.m());
00024 assert( (unsigned) cell1 < m_cK.size());
00025 assert( (unsigned) cell2 < m_cK.size());
00026 assert(m_cK.size() == getSw().size());
00027 VecDouble &cVSw = getSw();
00028 double S1 = cVSw(cell1);
00029 double S2 = cVSw(cell2);
00030
00031 double dMobW1 = 1-m_fMobW(S1);
00032 double dMobW2 = 1-m_fMobW(S2);
00033 double *vel = &m_Vel(face,0);
00034 double flux = (dMobW1+dMobW2)/2.0*faceIt->normal_multiply(vel);
00035
00036
00037 if (faceIt->getNormalNonZeroComponent() == Z && !faceIt->at_boundary() )
00038 {
00039 VecDouble &cK = getPermeability();
00040 double K1 = cK(cell1);
00041 double K2 = cK(cell2);
00042 flux += (m_fMobGrav(S1) + m_fMobGrav(S2)) * K1*K2/(K1+K2) * m_gc;
00043 }
00044 return (u1+u2)/(S1+S2)*flux/(S;
00045 }
00046
00047
00048
00049 void TraceFaceFluxWithGravity::maxGlobalCharVelocity(double vel[3])
00050 {
00051 VecDouble minVel(3);
00052 VecDouble maxVel(3);
00053
00054 NumericMethods::getMinMaxValueByColumn(m_Vel,minVel,maxVel);
00055 vel[X]= NumericMethods::maxMod(minVel(X),maxVel(X))*m_fMobW.getMaxNormGrad(0,1);
00056 vel[Y]= NumericMethods::maxMod(minVel(Y),maxVel(Y))*m_fMobW.getMaxNormGrad(0,1);
00057 vel[Z]= NumericMethods::maxMod(minVel(Z),maxVel(Z))*m_fMobW.getMaxNormGrad(0,1) + m_maxK*fabs(m_fMobGrav.getMaxNormGrad(0,1)*m_gc);
00058 }
00059
00060
00061
00062 double TraceFaceFluxWithGravity::maxLocalCharVelocity(OrthoMesh::Face_It &faceIt,int face,int cell1,int cell2,double &u1,double &u2)
00063 {
00064 assert(u1<=u2);
00065 double *vel = &(m_Vel(face,0));
00066
00067 if (faceIt->getNormalNonZeroComponent() != Z)
00068 return faceIt->normal_multiply(vel)*m_fMobW.getMaxNormGrad(u1,u2);
00069 else
00070 {
00071 double term1 = faceIt->normal_multiply(vel)*m_fMobW.getMaxNormGrad(u1,u2);
00072
00073
00074 double K = fmax(getPermeability()(cell1), getPermeability()(cell2));
00075
00076
00077
00078 double dMax,dMin;
00079 m_fMobGrav.getMinMaxGradValues(u1,u2,dMin,dMax);
00080
00081 double result1 = term1 + K*dMin*m_gc;
00082 double result2 = term1 + K*dMax*m_gc;
00083
00084 if (fabs(result1) < fabs(result2))
00085 return result2;
00086 else
00087 return result1;
00088 }
00089 }
00090
00091
00092 void TraceFaceFluxWithGravity::setVelocity(DynamicBase &dynMod)
00093 {
00094 dynMod.getVelocitiesAtFaces(m_Vel);
00095 }