// * * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * * // void Foam::CantPopeBray::update() { Info<<"Updating Sigma Source terms"<<endl; volVectorField M(fvc::grad(b_)); volScalarField mgb_ = mag(M); dimensionedScalar dSigma = 1.0e-3* (b_* (scalar(1.0) - b_) * mgb_)().weightedAverage(rho_.mesh().V()) /((b_ * (scalar(1.0) - b_))().weightedAverage(rho_.mesh().V()) + SMALL) + dimensionedScalar("dSig", Sigma_.dimensions(), SMALL); M /= (max(Sigma_, mgb_) + dSigma); volScalarField magM = mag(M); // M /= Sigma_ + dimensionedScalar("tol", dimless/dimLength, 1e-2); // M /= (magM + dimensionedScalar("tol", dimless/dimLength, SMALL)); volScalarField orientationFactor = scalar(1.0) - (M & M); orientationFactor.max(0.0); orientationFactor.min(1.0); Info<< "min(alpha) = " << min(orientationFactor).value() << endl; volTensorField A_ = I * (1.0 - orientationFactor / 3.0) - (M * M); volTensorField gradU(fvc::grad(U_)); volScalarField R_ = b_ * turbulence_.epsilon() / (Sigma_ * Su_ * turbulence_.k() + dimensionedScalar("tol", sqr(dimVelocity)/dimTime, SMALL)); volScalarField nu = (thermo_.muu() / thermo_.rhou() * b_ + thermo_.mub() / thermo_.rhob() * (1.0 - b_)); volScalarField P1 = rho_ * alphaSigma_ * orientationFactor * sqrt(turbulence_.epsilon() / nu); volScalarField P2 = rho_ * (A_ && gradU); ProdRateForSigma_ = P1 + P2; DestrRateForSigma_ = rho_ * betaSigma_ * orientationFactor / 3.0 * (2.0 + exp(-aCoeff_*R_)) * Su_ * Sigma_ / (b_ + SMALL); }
void FilterAeroForces::v_Update( const Array<OneD, const MultiRegions::ExpListSharedPtr> &pFields, const NekDouble &time) { // Only output every m_outputFrequency. if ((m_index++) % m_outputFrequency) { return; } int n, cnt, elmtid, nq, offset, nt, boundary; nt = pFields[0]->GetNpoints(); int dim = pFields.num_elements()-1; StdRegions::StdExpansionSharedPtr elmt; Array<OneD, int> BoundarytoElmtID; Array<OneD, int> BoundarytoTraceID; Array<OneD, MultiRegions::ExpListSharedPtr> BndExp; Array<OneD, const NekDouble> P(nt); Array<OneD, const NekDouble> U(nt); Array<OneD, const NekDouble> V(nt); Array<OneD, const NekDouble> W(nt); Array<OneD, Array<OneD, NekDouble> > gradU(dim); Array<OneD, Array<OneD, NekDouble> > gradV(dim); Array<OneD, Array<OneD, NekDouble> > gradW(dim); Array<OneD, Array<OneD, NekDouble> > fgradU(dim); Array<OneD, Array<OneD, NekDouble> > fgradV(dim); Array<OneD, Array<OneD, NekDouble> > fgradW(dim); Array<OneD, NekDouble> values; LibUtilities::CommSharedPtr vComm = pFields[0]->GetComm(); NekDouble Fx,Fy,Fz,Fxp,Fxv,Fyp,Fyv,Fzp,Fzv; Fxp = 0.0; // x-component of the force due to pressure difference Fxv = 0.0; // x-component of the force due to viscous stress Fx = 0.0; // x-component of the force (total) Fx = Fxp + Fxv (Drag) Fyp = 0.0; // y-component of the force due to pressure difference Fyv = 0.0; // y-component of the force due to viscous stress Fy = 0.0; // y-component of the force (total) Fy = Fyp + Fyv (Lift) Fzp = 0.0; // z-component of the force due to pressure difference Fzv = 0.0; // z-component of the force due to viscous stress Fz = 0.0; // z-component of the force (total) Fz = Fzp + Fzv (Side) NekDouble rho = (m_session->DefinesParameter("rho")) ? (m_session->GetParameter("rho")) : 1; NekDouble mu = rho*m_session->GetParameter("Kinvis"); for(int i = 0; i < pFields.num_elements(); ++i) { pFields[i]->SetWaveSpace(false); pFields[i]->BwdTrans(pFields[i]->GetCoeffs(), pFields[i]->UpdatePhys()); pFields[i]->SetPhysState(true); } // Homogeneous 1D case Compute forces on all WALL boundaries // This only has to be done on the zero (mean) Fourier mode. if(m_isHomogeneous1D) { if(vComm->GetColumnComm()->GetRank() == 0) { pFields[0]->GetPlane(0)->GetBoundaryToElmtMap( BoundarytoElmtID,BoundarytoTraceID); BndExp = pFields[0]->GetPlane(0)->GetBndCondExpansions(); StdRegions::StdExpansion1DSharedPtr bc; // loop over the types of boundary conditions for(cnt = n = 0; n < BndExp.num_elements(); ++n) { if(m_boundaryRegionIsInList[n] == 1) { for(int i = 0; i < BndExp[n]->GetExpSize(); ++i, cnt++) { // find element of this expansion. elmtid = BoundarytoElmtID[cnt]; elmt = pFields[0]->GetPlane(0)->GetExp(elmtid); nq = elmt->GetTotPoints(); offset = pFields[0]->GetPlane(0)->GetPhys_Offset(elmtid); // Initialise local arrays for the velocity // gradients size of total number of quadrature // points for each element (hence local). for(int j = 0; j < dim; ++j) { gradU[j] = Array<OneD, NekDouble>(nq,0.0); gradV[j] = Array<OneD, NekDouble>(nq,0.0); gradW[j] = Array<OneD, NekDouble>(nq,0.0); } // identify boundary of element boundary = BoundarytoTraceID[cnt]; // Extract fields U = pFields[0]->GetPlane(0)->GetPhys() + offset; V = pFields[1]->GetPlane(0)->GetPhys() + offset; P = pFields[3]->GetPlane(0)->GetPhys() + offset; // compute the gradients elmt->PhysDeriv(U,gradU[0],gradU[1]); elmt->PhysDeriv(V,gradV[0],gradV[1]); // Get face 1D expansion from element expansion bc = boost::dynamic_pointer_cast<LocalRegions ::Expansion1D> (BndExp[n]->GetExp(i)); // number of points on the boundary int nbc = bc->GetTotPoints(); // several vectors for computing the forces Array<OneD, NekDouble> Pb(nbc,0.0); for(int j = 0; j < dim; ++j) { fgradU[j] = Array<OneD, NekDouble>(nbc,0.0); fgradV[j] = Array<OneD, NekDouble>(nbc,0.0); } Array<OneD, NekDouble> drag_t(nbc,0.0); Array<OneD, NekDouble> lift_t(nbc,0.0); Array<OneD, NekDouble> drag_p(nbc,0.0); Array<OneD, NekDouble> lift_p(nbc,0.0); Array<OneD, NekDouble> temp(nbc,0.0); Array<OneD, NekDouble> temp2(nbc,0.0); // identify boundary of element . boundary = BoundarytoTraceID[cnt]; // extraction of the pressure and wss on the // boundary of the element elmt->GetEdgePhysVals(boundary,bc,P,Pb); for(int j = 0; j < dim; ++j) { elmt->GetEdgePhysVals(boundary,bc,gradU[j], fgradU[j]); elmt->GetEdgePhysVals(boundary,bc,gradV[j], fgradV[j]); } //normals of the element const Array<OneD, Array<OneD, NekDouble> > &normals = elmt->GetEdgeNormal(boundary); // // Compute viscous tractive forces on wall from // // t_i = - T_ij * n_j (minus sign for force // exerted BY fluid ON wall), // // where // // T_ij = viscous stress tensor (here in Cartesian // coords) // dU_i dU_j // = RHO * KINVIS * ( ---- + ---- ) . // dx_j dx_i //a) DRAG TERMS //-rho*kinvis*(2*du/dx*nx+(du/dy+dv/dx)*ny Vmath::Vadd(nbc,fgradU[1],1,fgradV[0],1,drag_t,1); Vmath::Vmul(nbc,drag_t,1,normals[1],1,drag_t,1); Vmath::Smul(nbc,2.0,fgradU[0],1,fgradU[0],1); Vmath::Vmul(nbc,fgradU[0],1,normals[0],1,temp2,1); Vmath::Smul(nbc,0.5,fgradU[0],1,fgradU[0],1); Vmath::Vadd(nbc,temp2,1,drag_t,1,drag_t,1); Vmath::Smul(nbc,-mu,drag_t,1,drag_t,1); //zero temporary storage vector Vmath::Zero(nbc,temp,0); Vmath::Zero(nbc,temp2,0); //b) LIFT TERMS //-rho*kinvis*(2*dv/dy*nx+(du/dy+dv/dx)*nx Vmath::Vadd(nbc,fgradU[1],1,fgradV[0],1,lift_t,1); Vmath::Vmul(nbc,lift_t,1,normals[0],1,lift_t,1); Vmath::Smul(nbc,2.0,fgradV[1],1,fgradV[1],1); Vmath::Vmul(nbc,fgradV[1],1,normals[1],1,temp2,1); Vmath::Smul(nbc,-0.5,fgradV[1],1,fgradV[1],1); Vmath::Vadd(nbc,temp2,1,lift_t,1,lift_t,1); Vmath::Smul(nbc,-mu,lift_t,1,lift_t,1); // Compute normal tractive forces on all WALL // boundaries Vmath::Vvtvp(nbc,Pb,1,normals[0],1, drag_p,1,drag_p, 1); Vmath::Vvtvp(nbc,Pb,1,normals[1],1, lift_p,1,lift_p,1); //integration over the boundary Fxv += bc->Integral(drag_t); Fyv += bc->Integral(lift_t); Fxp += bc->Integral(drag_p); Fyp += bc->Integral(lift_p); } } else { cnt += BndExp[n]->GetExpSize(); } } } for(int i = 0; i < pFields.num_elements(); ++i) { pFields[i]->SetWaveSpace(true); pFields[i]->BwdTrans(pFields[i]->GetCoeffs(), pFields[i]->UpdatePhys()); pFields[i]->SetPhysState(false); } } //3D WALL case else if(dim==3 && !m_isHomogeneous1D) { pFields[0]->GetBoundaryToElmtMap(BoundarytoElmtID, BoundarytoTraceID); BndExp = pFields[0]->GetBndCondExpansions(); LocalRegions::Expansion2DSharedPtr bc; // loop over the types of boundary conditions for(cnt = n = 0; n < BndExp.num_elements(); ++n) { if(m_boundaryRegionIsInList[n] == 1) { for(int i = 0; i < BndExp[n]->GetExpSize(); ++i, cnt++) { // find element of this expansion. elmtid = BoundarytoElmtID[cnt]; elmt = pFields[0]->GetExp(elmtid); nq = elmt->GetTotPoints(); offset = pFields[0]->GetPhys_Offset(elmtid); // Initialise local arrays for the velocity // gradients size of total number of quadrature // points for each element (hence local). for(int j = 0; j < dim; ++j) { gradU[j] = Array<OneD, NekDouble>(nq,0.0); gradV[j] = Array<OneD, NekDouble>(nq,0.0); gradW[j] = Array<OneD, NekDouble>(nq,0.0); } //identify boundary of element boundary = BoundarytoTraceID[cnt]; //Extract fields U = pFields[0]->GetPhys() + offset; V = pFields[1]->GetPhys() + offset; W = pFields[2]->GetPhys() + offset; P = pFields[3]->GetPhys() + offset; //compute the gradients elmt->PhysDeriv(U,gradU[0],gradU[1],gradU[2]); elmt->PhysDeriv(V,gradV[0],gradV[1],gradV[2]); elmt->PhysDeriv(W,gradW[0],gradW[1],gradW[2]); // Get face 2D expansion from element expansion bc = boost::dynamic_pointer_cast<LocalRegions ::Expansion2D> (BndExp[n]->GetExp(i)); //number of points on the boundary int nbc = bc->GetTotPoints(); //several vectors for computing the forces Array<OneD, NekDouble> Pb(nbc,0.0); for(int j = 0; j < dim; ++j) { fgradU[j] = Array<OneD, NekDouble>(nbc,0.0); fgradV[j] = Array<OneD, NekDouble>(nbc,0.0); fgradW[j] = Array<OneD, NekDouble>(nbc,0.0); } Array<OneD, NekDouble> drag_t(nbc,0.0); Array<OneD, NekDouble> lift_t(nbc,0.0); Array<OneD, NekDouble> side_t(nbc,0.0); Array<OneD, NekDouble> drag_p(nbc,0.0); Array<OneD, NekDouble> lift_p(nbc,0.0); Array<OneD, NekDouble> side_p(nbc,0.0); Array<OneD, NekDouble> temp(nbc,0.0); Array<OneD, NekDouble> temp2(nbc,0.0); // identify boundary of element . boundary = BoundarytoTraceID[cnt]; // extraction of the pressure and wss on the // boundary of the element elmt->GetFacePhysVals(boundary,bc,P,Pb); for(int j = 0; j < dim; ++j) { elmt->GetFacePhysVals(boundary,bc,gradU[j], fgradU[j]); elmt->GetFacePhysVals(boundary,bc,gradV[j], fgradV[j]); elmt->GetFacePhysVals(boundary,bc,gradW[j], fgradW[j]); } // normals of the element const Array<OneD, Array<OneD, NekDouble> > &normals = elmt->GetFaceNormal(boundary); // // Compute viscous tractive forces on wall from // // t_i = - T_ij * n_j (minus sign for force // exerted BY fluid ON wall), // // where // // T_ij = viscous stress tensor (here in Cartesian // coords) // dU_i dU_j // = RHO * KINVIS * ( ---- + ---- ) . // dx_j dx_i //a) DRAG TERMS //-rho*kinvis* // (2*du/dx*nx+(du/dy+dv/dx)*ny+(du/dz+dw/dx)*nz) Vmath::Vadd(nbc,fgradU[2],1,fgradW[0],1,temp,1); Vmath::Neg(nbc,temp,1); Vmath::Vmul(nbc,temp,1,normals[2],1,temp,1); Vmath::Vadd(nbc,fgradU[1],1,fgradV[0],1,drag_t,1); Vmath::Neg(nbc,drag_t,1); Vmath::Vmul(nbc,drag_t,1,normals[1],1,drag_t,1); Vmath::Smul(nbc,-2.0,fgradU[0],1,fgradU[0],1); Vmath::Vmul(nbc,fgradU[0],1,normals[0],1,temp2,1); Vmath::Smul(nbc,-0.5,fgradU[0],1,fgradU[0],1); Vmath::Vadd(nbc,temp,1,temp2,1,temp,1); Vmath::Vadd(nbc,temp,1,drag_t,1,drag_t,1); Vmath::Smul(nbc,mu,drag_t,1,drag_t,1); //zero temporary storage vector Vmath::Zero(nbc,temp,0); Vmath::Zero(nbc,temp2,0); //b) LIFT TERMS //-rho*kinvis* // (2*dv/dy*nx+(du/dy+dv/dx)*nx+(dv/dz+dw/dy)*nz) Vmath::Vadd(nbc,fgradV[2],1,fgradW[1],1,temp,1); Vmath::Neg(nbc,temp,1); Vmath::Vmul(nbc,temp,1,normals[2],1,temp,1); Vmath::Vadd(nbc,fgradU[1],1,fgradV[0],1,lift_t,1); Vmath::Neg(nbc,lift_t,1); Vmath::Vmul(nbc,lift_t,1,normals[0],1,lift_t,1); Vmath::Smul(nbc,-2.0,fgradV[1],1,fgradV[1],1); Vmath::Vmul(nbc,fgradV[1],1,normals[1],1,temp2,1); Vmath::Smul(nbc,-0.5,fgradV[1],1,fgradV[1],1); Vmath::Vadd(nbc,temp,1,temp2,1,temp,1); Vmath::Vadd(nbc,temp,1,lift_t,1,lift_t,1); Vmath::Smul(nbc,mu,lift_t,1,lift_t,1); //zero temporary storage vector Vmath::Zero(nbc,temp,0); Vmath::Zero(nbc,temp2,0); //b) SIDE TERMS //-rho*kinvis* // (2*dv/dy*nx+(du/dy+dv/dx)*nx+(dv/dz+dw/dy)*nz) Vmath::Vadd(nbc,fgradV[2],1,fgradW[1],1,temp,1); Vmath::Neg(nbc,temp,1); Vmath::Vmul(nbc,temp,1,normals[1],1,temp,1); Vmath::Vadd(nbc,fgradU[2],1,fgradW[0],1,side_t,1); Vmath::Neg(nbc,side_t,1); Vmath::Vmul(nbc,side_t,1,normals[0],1,side_t,1); Vmath::Smul(nbc,-2.0,fgradW[2],1,fgradW[2],1); Vmath::Vmul(nbc,fgradW[2],1,normals[2],1,temp2,1); Vmath::Smul(nbc,-0.5,fgradW[2],1,fgradW[2],1); Vmath::Vadd(nbc,temp,1,temp2,1,temp,1); Vmath::Vadd(nbc,temp,1,side_t,1,side_t,1); Vmath::Smul(nbc,mu,side_t,1,side_t,1); // Compute normal tractive forces on all WALL // boundaries Vmath::Vvtvp(nbc,Pb,1,normals[0],1, drag_p,1,drag_p,1); Vmath::Vvtvp(nbc,Pb,1,normals[1],1, lift_p,1,lift_p,1); Vmath::Vvtvp(nbc,Pb,1,normals[2],1, side_p,1,side_p,1); //integration over the boundary Fxv += bc->Expansion::Integral(drag_t); Fyv += bc->Expansion::Integral(lift_t); Fzv += bc->Expansion::Integral(side_t); Fxp += bc->Expansion::Integral(drag_p); Fyp += bc->Expansion::Integral(lift_p); Fzp += bc->Expansion::Integral(side_p); } } else { cnt += BndExp[n]->GetExpSize(); } } } //2D WALL Condition else { pFields[0]->GetBoundaryToElmtMap(BoundarytoElmtID, BoundarytoTraceID); BndExp = pFields[0]->GetBndCondExpansions(); StdRegions::StdExpansion1DSharedPtr bc; // loop over the types of boundary conditions for(cnt = n = 0; n < BndExp.num_elements(); ++n) { if(m_boundaryRegionIsInList[n] == 1) { for(int i = 0; i < BndExp[n]->GetExpSize(); ++i, cnt++) { elmtid = BoundarytoElmtID[cnt]; elmt = pFields[0]->GetExp(elmtid); nq = elmt->GetTotPoints(); offset = pFields[0]->GetPhys_Offset(elmtid); for(int j = 0; j < dim; ++j) { gradU[j] = Array<OneD, NekDouble>(nq,0.0); gradV[j] = Array<OneD, NekDouble>(nq,0.0); } boundary = BoundarytoTraceID[cnt]; U = pFields[0]->GetPhys() + offset; V = pFields[1]->GetPhys() + offset; P = pFields[2]->GetPhys() + offset; elmt->PhysDeriv(U,gradU[0],gradU[1]); elmt->PhysDeriv(V,gradV[0],gradV[1]); bc = boost::dynamic_pointer_cast<LocalRegions ::Expansion1D> (BndExp[n]->GetExp(i)); int nbc = bc->GetTotPoints(); Array<OneD, NekDouble> Pb(nbc,0.0); Array<OneD, NekDouble> drag_t(nbc,0.0); Array<OneD, NekDouble> lift_t(nbc,0.0); Array<OneD, NekDouble> drag_p(nbc,0.0); Array<OneD, NekDouble> lift_p(nbc,0.0); Array<OneD, NekDouble> temp(nbc,0.0); boundary = BoundarytoTraceID[cnt]; elmt->GetEdgePhysVals(boundary,bc,P,Pb); for(int j = 0; j < dim; ++j) { fgradU[j] = Array<OneD, NekDouble>(nbc,0.0); fgradV[j] = Array<OneD, NekDouble>(nbc,0.0); } for(int j = 0; j < dim; ++j) { elmt->GetEdgePhysVals(boundary,bc,gradU[j], fgradU[j]); elmt->GetEdgePhysVals(boundary,bc,gradV[j], fgradV[j]); } const Array<OneD, Array<OneD, NekDouble> > &normals = elmt->GetEdgeNormal(boundary); Vmath::Vadd(nbc,fgradU[1],1,fgradV[0],1,drag_t,1); Vmath::Neg(nbc,drag_t,1); Vmath::Vmul(nbc,drag_t,1,normals[1],1,drag_t,1); Vmath::Smul(nbc,-2.0,fgradU[0],1,fgradU[0],1); Vmath::Vmul(nbc,fgradU[0],1,normals[0],1,temp,1); Vmath::Vadd(nbc,temp,1,drag_t,1,drag_t,1); Vmath::Smul(nbc,mu,drag_t,1,drag_t,1); Vmath::Vadd(nbc,fgradU[1],1,fgradV[0],1,lift_t,1); Vmath::Neg(nbc,lift_t,1); Vmath::Vmul(nbc,lift_t,1,normals[0],1,lift_t,1); Vmath::Smul(nbc,-2.0,fgradV[1],1,fgradV[1],1); Vmath::Vmul(nbc,fgradV[1],1,normals[1],1,temp,1); Vmath::Vadd(nbc,temp,1,lift_t,1,lift_t,1); Vmath::Smul(nbc,mu,lift_t,1,lift_t,1); Vmath::Vvtvp(nbc,Pb,1,normals[0],1, drag_p,1,drag_p,1); Vmath::Vvtvp(nbc,Pb,1,normals[1],1, lift_p,1,lift_p,1); Fxp += bc->Integral(drag_p); Fyp += bc->Integral(lift_p); Fxv += bc->Integral(drag_t); Fyp += bc->Integral(lift_t); } } else { cnt += BndExp[n]->GetExpSize(); } } } vComm->AllReduce(Fxp, LibUtilities::ReduceSum); vComm->AllReduce(Fxv, LibUtilities::ReduceSum); Fx = Fxp + Fxv; vComm->AllReduce(Fyp, LibUtilities::ReduceSum); vComm->AllReduce(Fyv, LibUtilities::ReduceSum); Fy = Fyp + Fyv; vComm->AllReduce(Fzp, LibUtilities::ReduceSum); vComm->AllReduce(Fzv, LibUtilities::ReduceSum); Fz = Fzp + Fzv; if (vComm->GetRank() == 0) { m_outputStream.width(8); m_outputStream << setprecision(6) << time; m_outputStream.width(25); m_outputStream << setprecision(8) << Fxp; m_outputStream.width(25); m_outputStream << setprecision(8) << Fxv; m_outputStream.width(25); m_outputStream << setprecision(8) << Fx; m_outputStream.width(25); m_outputStream << setprecision(8) << Fyp; m_outputStream.width(25); m_outputStream << setprecision(8) << Fyv; m_outputStream.width(25); m_outputStream << setprecision(8) << Fy; m_outputStream.width(25); m_outputStream << setprecision(8) << Fzp; m_outputStream.width(25); m_outputStream << setprecision(8) << Fzv; m_outputStream.width(25); m_outputStream << setprecision(8) << Fz; m_outputStream << endl; } }
// * * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * * // void Foam::coherentFlameModel2b::update() { Info<<"Updating Sigma Source terms"<<endl; volVectorField M(fvc::grad(b_)); volScalarField mgb_ = mag(M); dimensionedScalar dSigma = 1.0e-3* (b_* (scalar(1.0) - b_) * mgb_)().weightedAverage(rho_.mesh().V()) /((b_ * (scalar(1.0) - b_))().weightedAverage(rho_.mesh().V()) + SMALL) + dimensionedScalar("dSig", Sigma_.dimensions(), SMALL); M /= (max(Sigma_, mgb_) + dSigma); // volScalarField magM = mag(M); // M /= Sigma_ + dimensionedScalar("tol", dimless/dimLength, SMALL); // M /= (magM + dimensionedScalar("tol", dimless/dimLength, SMALL)); volScalarField orientationFactor = scalar(1.0) - (M & M); orientationFactor.max(0.0); orientationFactor.min(1.0); volTensorField A_ = I * (1.0 - orientationFactor / 3.0) - (M * M); volTensorField gradU(fvc::grad(U_)); volScalarField up(sqrt((2.0/3.0)*turbulence_.k())); //Efficiency function from the ITNFS model volScalarField GammaK("GammaK", rho_/rho_); scalar T1 = min(thermo_.Tu()).value(); scalar T2 = max(thermo_.Tb()).value(); volScalarField deltaL(2.0 * thermo_.alpha() / thermo_.rhou() / Su_ * pow(T2/T1, 0.7)); volScalarField lt(Clt_ * pow(up, 3) / (turbulence_.epsilon() + dimensionedScalar("tol", pow(dimVelocity,2)/dimTime, SMALL))); volScalarField lRatio(lt / deltaL); volScalarField uRatio(up / Su_); volScalarField s = max ( log10 (lRatio), scalar(-0.4+SMALL) ); if(fittedGammaK_){ GammaK = 0.75 * exp(-1.2 / pow(uRatio, 0.3)) * pow(lRatio, 2.0/3.0); } else { volScalarField sigma1 = 2.0 / 3.0 * (1.0 - 0.5 * exp(-pow(uRatio, 1.0/3.0))); volScalarField r = -exp(-(s+0.4)) / (s+0.4) + (1.0 - exp(-(s+0.4))) * (sigma1 * s - 0.11); GammaK = pow(10.0, r); } if(quenchingCoeff_ != 0.0){ volScalarField g = (0.7 + 1.0 / s) * exp(-s) + (1.0 - exp(-s)) * (1.0 + 0.36 * s); volScalarField x = (log10 (uRatio) - g) / s / 0.04; volScalarField Pq = 0.5 * (1.0 + tanh (sign(x) * x * x)); GammaK -= quenchingCoeff_ * 1.5 * lRatio / uRatio * log (1.0 / (1.0 - Pq)); } volScalarField P1 = rho_ * alphaSigma_ * GammaK * turbulence_.epsilon() / (turbulence_.k() + dimensionedScalar("tol", pow(dimVelocity,2), SMALL)); volScalarField P2 = rho_ * (A_ && gradU); ProdRateForSigma_ = P1 + P2; DestrRateForSigma_ = rho_ * betaSigma_ * (Su_ + CSigma_ * sqrt(3.0/2.0) * up) * Sigma_/(b_ * (1.0 - b_) + SMALL); }
} // Collect patches involved in contact boolList contactPatches(Upatches.size(), false); forAll (contacts, contactI) { contactPatches[contacts[contactI].masterPatch().index()] = true; contactPatches[contacts[contactI].slavePatch().index()] = true; } // Calculate the traction for all involved patches // Collect fields const volTensorField::GeometricBoundaryField& gradUpatches = gradU().boundaryField(); const surfaceVectorField::GeometricBoundaryField& Apatches = mesh().Sf().boundaryField(); const surfaceScalarField::GeometricBoundaryField& magApatches = mesh().magSf().boundaryField(); // Lookup mu and lambda form object registry const volScalarField& mu = mesh().objectRegistry::lookupObject<volScalarField>("mu"); const volScalarField::GeometricBoundaryField& muPatches = mu.boundaryField(); const volScalarField& lambda = mesh().objectRegistry::lookupObject<volScalarField>("lambda");
double evqualitygrad(double *X, double* theta,const int *ik,const int *jk,int angle_num,int angle_index,int dim,int ndata) { /* build V,U,A */ double* matret=new double[dim*dim]; double* U1=new double[dim*dim]; double* U2=new double[dim*dim]; double* A=new double[ndata*dim]; double* matrot=new double[ndata*dim]; double *max_values = new double[ndata]; int *max_index = new int[ndata]; double dJ=0, tmp1, tmp2; double* p_A; double *p_Y; /* find max of each row */ MatrixInitZeros(matret,dim,dim); MatrixInitZeros(U1,dim,dim); MatrixInitZeros(U2,dim,dim); MatrixInitZeros(A,ndata,dim); MatrixInitZeros(matrot,ndata,dim); MatrixInitZeros(max_values,ndata,1); MatrixInitZeros(max_index,ndata,1); int i,j, ind = 0; //getchar(); gradU(theta,angle_index,ik,jk,dim,matret); /**/ //getchar(); build_Uab(theta,0,angle_index-1,ik,jk,dim,U1); /**/ /**/ build_Uab(theta,angle_index+1,angle_num-1,ik,jk,dim,U2); buildA(X,U1,matret,U2,A,ndata,dim); /* rotate vecs according to current angles */ rotate_givens(X,theta,ik,jk,angle_num,ndata,dim,matrot); p_Y=matrot; MaxRowColumnAbsValue(p_Y,max_values,max_index,ndata,dim,1); /* compute gradient */ ind = 0; dJ=0; for( i=0; i<ndata; i++ ) { /* loop over all rows */ p_A=(double*)(A+i*dim); p_Y=(double*)(matrot+i*dim); for( j=0; j<dim; j++ ) { /* loop over all columns */ tmp1 = p_A[j] * p_Y[j] / (max_values[i]*max_values[i]); tmp2 = p_A[max_index[i]]*(p_Y[j]*p_Y[j])/(max_values[i]*max_values[i]*max_values[i]); dJ += tmp1-tmp2; } } dJ = 2*dJ/ndata/dim; delete []max_values; delete []max_index; delete []matrot; delete []matret; delete []U2; delete []U1; delete []A; return dJ; };