void calcYPlus ( const TurbulenceModel& turbulenceModel, const fvMesh& mesh, const volVectorField& U, volScalarField& yPlus ) { volScalarField::GeometricBoundaryField d = nearWallDist(mesh).y(); const volScalarField::GeometricBoundaryField nutBf = turbulenceModel->nut()().boundaryField(); const volScalarField::GeometricBoundaryField nuEffBf = turbulenceModel->nuEff()().boundaryField(); const volScalarField::GeometricBoundaryField nuBf = turbulenceModel->nu()().boundaryField(); const fvPatchList& patches = mesh.boundary(); forAll(patches, patchi) { const fvPatch& patch = patches[patchi]; if (isA<nutWallFunctionFvPatchScalarField>(nutBf[patchi])) { const nutWallFunctionFvPatchScalarField& nutPf = dynamic_cast<const nutWallFunctionFvPatchScalarField&> ( nutBf[patchi] ); yPlus.boundaryField()[patchi] = nutPf.yPlus(); const scalarField& Yp = yPlus.boundaryField()[patchi]; Info<< "Patch " << patchi << " named " << nutPf.patch().name() << ", wall-function " << nutPf.type() << ", y+ : min: " << gMin(Yp) << " max: " << gMax(Yp) << " average: " << gAverage(Yp) << nl << endl; } else if (isA<wallFvPatch>(patch)) { yPlus.boundaryField()[patchi] = d[patchi] *sqrt ( nuEffBf[patchi] *mag(U.boundaryField()[patchi].snGrad()) )/nuBf[patchi]; const scalarField& Yp = yPlus.boundaryField()[patchi]; Info<< "Patch " << patchi << " named " << patch.name() << " y+ : min: " << gMin(Yp) << " max: " << gMax(Yp) << " average: " << gAverage(Yp) << nl << endl; } } }
void Foam::componentDisplacementMotionSolver::updateMesh(const mapPolyMesh& mpm) { // pointMesh already updates pointFields. motionSolver::updateMesh(mpm); // Map points0_. Bit special since we somehow have to come up with // a sensible points0 position for introduced points. // Find out scaling between points0 and current points // Get the new points either from the map or the mesh const scalarField points ( mpm.hasMotionPoints() ? mpm.preMotionPoints().component(cmpt_) : mesh().points().component(cmpt_) ); // Get extents of points0 and points and determine scale const scalar scale = (gMax(points0_)-gMin(points0_)) /(gMax(points)-gMin(points)); scalarField newPoints0(mpm.pointMap().size()); forAll(newPoints0, pointI) { label oldPointI = mpm.pointMap()[pointI]; if (oldPointI >= 0) { label masterPointI = mpm.reversePointMap()[oldPointI]; if (masterPointI == pointI) { newPoints0[pointI] = points0_[oldPointI]; } else { // New point. Assume motion is scaling. newPoints0[pointI] = points0_[oldPointI] + scale*(points[pointI]-points[masterPointI]); } } else { FatalErrorIn ( "displacementLaplacianFvMotionSolver::updateMesh" "(const mapPolyMesh& mpm)" ) << "Cannot work out coordinates of introduced vertices." << " New vertex " << pointI << " at coordinate " << points[pointI] << exit(FatalError); } }
void Foam::solidWallHeatFluxTemperatureFvPatchScalarField::updateCoeffs() { if (updated()) { return; } gradient() = q_/K(); fixedGradientFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(K()*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " :" << " heatFlux:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } }
void Foam::bound(volScalarField& vsf, const dimensionedScalar& vsf0) { scalar minVsf = min(vsf).value(); if (minVsf < vsf0.value()) { Info<< "bounding " << vsf.name() << ", min: " << gMin(vsf.internalField()) << " max: " << gMax(vsf.internalField()) << " average: " << gAverage(vsf.internalField()) << endl; vsf.internalField() = max ( max ( vsf.internalField(), fvc::average(max(vsf, vsf0))().internalField() // Bug fix: was assuming bound on zero. HJ, 25/Nov/2008 *pos(vsf0.value() - vsf.internalField()) ), vsf0.value() ); vsf.correctBoundaryConditions(); vsf.boundaryField() = max(vsf.boundaryField(), vsf0.value()); } }
int main(int argc, char *argv[]) { #include "postProcess.H" #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" #include "createControl.H" label inlet = mesh.boundaryMesh().findPatchID("Inlet"); label outlet = mesh.boundaryMesh().findPatchID("Outlet"); #include "createFields.H" #include "createFvOptions.H" #include "initContinuityErrs.H" turbulence->validate(); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting Iteration loop\n" << endl; while (simple.loop()) { Info<< "Iteration Number = " << runTime.timeName() << nl << endl; // Pressure-velocity SIMPLE corrector { #include "UEqn.H" #include "EEqn.H" #include "pEqn.H" } turbulence->correct(); runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << endl; Info<< "Inflow : " << -1.0* gSum( phi.boundaryField()[inlet] ) <<" [kg/s]" << endl; Info<< "Outflow : " << gSum( phi.boundaryField()[outlet] ) <<" [kg/s]" << endl; Info<< "EnergyInflow : " << -1.0* gSum( phi.boundaryField()[inlet] * ( thermo.he().boundaryField()[inlet] + 0.5*magSqr(U.boundaryField()[inlet]) ) ) <<" [W]" << endl; Info<< "EnergyOutflow : " << gSum( phi.boundaryField()[outlet] * ( thermo.he().boundaryField()[outlet] + 0.5*magSqr(U.boundaryField()[outlet]) ) ) <<" [W]" << endl; Info<< "EnergyBalance : " << gSum( phi.boundaryField()[outlet] * ( thermo.he().boundaryField()[outlet] + 0.5*magSqr(U.boundaryField()[outlet]) ) ) +1.0* gSum( phi.boundaryField()[inlet] * ( thermo.he().boundaryField()[inlet] + 0.5*magSqr(U.boundaryField()[inlet]) ) ) <<" [W]" << endl; Info<< "rho max/avg/min : " << gMax(thermo.rho()) << " " << gAverage(thermo.rho()) << " " << gMin(thermo.rho()) << endl; Info<< "T max/avg/min : " << gMax(thermo.T()) << " " << gAverage(thermo.T()) << " " << gMin(thermo.T()) << endl; Info<< "P max/avg/min : " << gMax(thermo.p()) << " " << gAverage(thermo.p()) << " " << gMin(thermo.p()) << endl; Info<< "Prg max/avg/min : " << gMax(p_rgh) << " " << gAverage(p_rgh) << " " << gMin(p_rgh) << endl; Info<< "U max/avg/min : " << gMax(U).component(2) << " " << gAverage(U).component(2) << " " << gMin(U).component(2) << endl; Info<< "Prg max-min : " << gMax(p_rgh) - gMin(p_rgh) << endl; Info<< " " << endl; } Info<< "End\n" << endl; return 0; }
forAllConstIter(labelHashSet, patchSet_, iter) { label patchi = iter.key(); const polyPatch& pp = mesh.boundaryMesh()[patchi]; vectorField& ssp = shearStress.boundaryFieldRef()[patchi]; const vectorField& Sfp = mesh.Sf().boundaryField()[patchi]; const scalarField& magSfp = mesh.magSf().boundaryField()[patchi]; const symmTensorField& Reffp = Reff.boundaryField()[patchi]; ssp = (-Sfp/magSfp) & Reffp; vector minSsp = gMin(ssp); vector maxSsp = gMax(ssp); if (Pstream::master()) { file() << mesh.time().value() << token::TAB << pp.name() << token::TAB << minSsp << token::TAB << maxSsp << endl; } if (log_) Info<< " min/max(" << pp.name() << ") = " << minSsp << ", " << maxSsp << endl; }
void Foam::boundMinMax ( volScalarField& vsf, const dimensionedScalar& vsf0, const dimensionedScalar& vsf1 ) { scalar minVsf = min(vsf).value(); scalar maxVsf = max(vsf).value(); if (minVsf < vsf0.value() || maxVsf > vsf1.value()) { Info<< "bounding " << vsf.name() << ", min: " << gMin(vsf.internalField()) << " max: " << gMax(vsf.internalField()) << " average: " << gAverage(vsf.internalField()) << endl; } if (minVsf < vsf0.value()) { vsf.internalField() = max ( max ( vsf.internalField(), fvc::average(max(vsf, vsf0))().internalField() *pos(vsf0.value() - vsf.internalField()) ), vsf0.value() ); vsf.correctBoundaryConditions(); vsf.boundaryField() = max(vsf.boundaryField(), vsf0.value()); } if (maxVsf > vsf1.value()) { vsf.internalField() = min ( min ( vsf.internalField(), fvc::average(min(vsf, vsf1))().internalField() *neg(vsf1.value() - vsf.internalField()) // This is needed when all values are above max // HJ, 18/Apr/2009 + pos(vsf1.value() - vsf.internalField())*vsf1.value() ), vsf1.value() ); vsf.correctBoundaryConditions(); vsf.boundaryField() = min(vsf.boundaryField(), vsf1.value()); } }
void Foam::yPlusRAS::calcIncompressibleYPlus ( const fvMesh& mesh, volScalarField& yPlus ) { typedef incompressible::nutWallFunctionFvPatchScalarField wallFunctionPatchField; const incompressible::RASModel& model = mesh.lookupObject<incompressible::RASModel>("RASProperties"); const volScalarField nut(model.nut()); const volScalarField::GeometricBoundaryField& nutPatches = nut.boundaryField(); bool foundPatch = false; forAll(nutPatches, patchI) { if (isA<wallFunctionPatchField>(nutPatches[patchI])) { foundPatch = true; const wallFunctionPatchField& nutPw = dynamic_cast<const wallFunctionPatchField&>(nutPatches[patchI]); yPlus.boundaryField()[patchI] = nutPw.yPlus(); const scalarField& Yp = yPlus.boundaryField()[patchI]; scalar minYp = gMin(Yp); scalar maxYp = gMax(Yp); scalar avgYp = gAverage(Yp); if (log_) { Info<< " patch " << nutPw.patch().name() << " y+ : min = " << minYp << ", max = " << maxYp << ", average = " << avgYp << nl; } if (Pstream::master()) { file() << obr_.time().value() << token::TAB << nutPw.patch().name() << token::TAB << minYp << token::TAB << maxYp << token::TAB << avgYp << endl; } } } if (log_ && !foundPatch) { Info<< " no " << wallFunctionPatchField::typeName << " patches" << endl; } }
void calcIncompressibleYPlus ( const fvMesh& mesh, const Time& runTime, const volVectorField& U, volScalarField& yPlus ) { typedef incompressible::RASModels::nutWallFunctionFvPatchScalarField wallFunctionPatchField; #include "createPhi.H" singlePhaseTransportModel laminarTransport(U, phi); autoPtr<incompressible::RASModel> RASModel ( incompressible::RASModel::New(U, phi, laminarTransport) ); const volScalarField::GeometricBoundaryField nutPatches = RASModel->nut()().boundaryField(); bool foundNutPatch = false; forAll(nutPatches, patchi) { if (isA<wallFunctionPatchField>(nutPatches[patchi])) { foundNutPatch = true; const wallFunctionPatchField& nutPw = dynamic_cast<const wallFunctionPatchField&> (nutPatches[patchi]); yPlus.boundaryField()[patchi] = nutPw.yPlus(); const scalarField& Yp = yPlus.boundaryField()[patchi]; Info<< "Patch " << patchi << " named " << nutPw.patch().name() << " y+ : min: " << gMin(Yp) << " max: " << gMax(Yp) << " average: " << gAverage(Yp) << nl << endl; } } if (!foundNutPatch) { Info<< " no " << wallFunctionPatchField::typeName << " patches" << endl; } }
void kinematicSingleLayer::info() { Info<< "\nSurface film: " << type() << endl; const scalarField& deltaInternal = delta_; const vectorField& Uinternal = U_; scalar addedMassTotal = 0.0; outputProperties().readIfPresent("addedMassTotal", addedMassTotal); addedMassTotal += returnReduce(addedMassTotal_, sumOp<scalar>()); Info<< indent << "added mass = " << addedMassTotal << nl << indent << "current mass = " << gSum((deltaRho_*magSf())()) << nl << indent << "min/max(mag(U)) = " << gMin(mag(Uinternal)) << ", " << gMax(mag(Uinternal)) << nl << indent << "min/max(delta) = " << gMin(deltaInternal) << ", " << gMax(deltaInternal) << nl << indent << "coverage = " << gSum(alpha_.primitiveField()*magSf())/gSum(magSf()) << nl; injection_.info(Info); transfer_.info(Info); }
/*! ************************************************************************ * \brief * Generate raster scan slice group map type MapUnit map (type 4) * ************************************************************************ */ Void FMO::GenerateType4MapUnitMap() { unsigned mapUnitsInSliceGroup0 = gMin((pps_.slice_group_change_rate_minus1 + 1) * img_.slice_group_change_cycle, PicSizeInMapUnits_); unsigned sizeOfUpperLeftGroup = pps_.slice_group_change_direction_flag ? ( PicSizeInMapUnits_ - mapUnitsInSliceGroup0 ) : mapUnitsInSliceGroup0; unsigned i; for( i = 0; i < PicSizeInMapUnits_; i++ ) if( i < sizeOfUpperLeftGroup ) MapUnitToSliceGroupMap_[ i ] = pps_.slice_group_change_direction_flag; else MapUnitToSliceGroupMap_[ i ] = 1 - pps_.slice_group_change_direction_flag; }
bool Foam::functionObjects::yPlus::write(const bool postProcess) { const volScalarField& yPlus = obr_.lookupObject<volScalarField>(type()); Log << type() << " " << name() << " write:" << nl << " writing field " << yPlus.name() << endl; yPlus.write(); writeFiles::write(); const volScalarField::Boundary& yPlusBf = yPlus.boundaryField(); const fvMesh& mesh = refCast<const fvMesh>(obr_); const fvPatchList& patches = mesh.boundary(); forAll(patches, patchi) { const fvPatch& patch = patches[patchi]; if (isA<wallFvPatch>(patch)) { const scalarField& yPlusp = yPlusBf[patchi]; const scalar minYplus = gMin(yPlusp); const scalar maxYplus = gMax(yPlusp); const scalar avgYplus = gAverage(yPlusp); if (Pstream::master()) { Log << " patch " << patch.name() << " y+ : min = " << minYplus << ", max = " << maxYplus << ", average = " << avgYplus << nl; writeTime(file()); file() << token::TAB << patch.name() << token::TAB << minYplus << token::TAB << maxYplus << token::TAB << avgYplus << endl; } } } return true; }
/*! ************************************************************************ * \brief * Generate wipe slice group map type MapUnit map (type 5) * ************************************************************************ */ Void FMO::GenerateType5MapUnitMap () { unsigned mapUnitsInSliceGroup0 = gMin((pps_.slice_group_change_rate_minus1 + 1) * img_.slice_group_change_cycle, PicSizeInMapUnits_); unsigned sizeOfUpperLeftGroup = pps_.slice_group_change_direction_flag ? ( PicSizeInMapUnits_ - mapUnitsInSliceGroup0 ) : mapUnitsInSliceGroup0; unsigned i,j, k = 0; for( j = 0; j < img_.PicWidthInMbs; j++ ) for( i = 0; i < img_.PicHeightInMapUnits; i++ ) if( k++ < sizeOfUpperLeftGroup ) MapUnitToSliceGroupMap_[ i * img_.PicWidthInMbs + j ] = 1 - pps_.slice_group_change_direction_flag; else MapUnitToSliceGroupMap_[ i * img_.PicWidthInMbs + j ] = pps_.slice_group_change_direction_flag; }
bool Foam::functionObjects::yPlus::write() { Log << type() << " " << name() << " write:" << nl; writeLocalObjects::write(); logFiles::write(); const volScalarField& yPlus = mesh_.lookupObject<volScalarField>(type()); const volScalarField::Boundary& yPlusBf = yPlus.boundaryField(); const fvPatchList& patches = mesh_.boundary(); forAll(patches, patchi) { const fvPatch& patch = patches[patchi]; if (isA<wallFvPatch>(patch)) { const scalarField& yPlusp = yPlusBf[patchi]; const scalar minYplus = gMin(yPlusp); const scalar maxYplus = gMax(yPlusp); const scalar avgYplus = gAverage(yPlusp); if (Pstream::master()) { Log << " patch " << patch.name() << " y+ : min = " << minYplus << ", max = " << maxYplus << ", average = " << avgYplus << nl; writeTime(file()); file() << token::TAB << patch.name() << token::TAB << minYplus << token::TAB << maxYplus << token::TAB << avgYplus << endl; } } } Log << endl; return true; }
void writeData( CommonValueExpressionDriver &driver, const wordList &accumulations ) { bool isPoint=driver.result().isPoint(); Field<T> result(driver.getResult<T>(isPoint)); forAll(accumulations,i) { const word &aName=accumulations[i]; const NumericAccumulationNamedEnum::value accu= NumericAccumulationNamedEnum::names[aName]; T val=pTraits<T>::zero; switch(accu) { case NumericAccumulationNamedEnum::numMin: val=gMin(result); break; case NumericAccumulationNamedEnum::numMax: val=gMax(result); break; case NumericAccumulationNamedEnum::numSum: val=gSum(result); break; case NumericAccumulationNamedEnum::numAverage: val=gAverage(result); break; // case NumericAccumulationNamedEnum::numSumMag: // val=gSumMag(result); // break; case NumericAccumulationNamedEnum::numWeightedAverage: val=driver.calcWeightedAverage(result); break; default: WarningIn("funkyDoCalc") << "Unimplemented accumultation type " << NumericAccumulationNamedEnum::names[accu] << ". Currently only 'min', 'max', 'sum', 'weightedAverage' and 'average' are supported" << endl; } Info << " " << aName << "=" << val; } }
void swakExpressionFunctionObject::writeData(CommonValueExpressionDriver &driver) { Field<T> result=driver.getResult<T>(); Field<T> results(accumulations_.size()); forAll(accumulations_,i) { const word &aName=accumulations_[i]; T val=pTraits<T>::zero; if(aName=="min") { val=gMin(result); } else if(aName=="max") { val=gMax(result); } else if(aName=="sum") { val=gSum(result); } else if(aName=="average") { val=gAverage(result); } else { WarningIn("swakExpressionFunctionObject::writeData") << "Unknown accumultation type " << aName << ". Currently only 'min', 'max', 'sum' and 'average' are supported" << endl; } results[i]=val; if(verbose()) { Info << " " << aName << "=" << val; } } if (Pstream::master()) { unsigned int w = IOstream::defaultPrecision() + 7; OFstream& o=*filePtrs_[name()]; o << setw(w) << time().value(); forAll(results,i) { o << setw(w) << results[i]; } o << nl; }
void Foam::mappedFieldFvPatchField<Type>::updateCoeffs() { if (this->updated()) { return; } this->operator==(this->mappedField()); if (debug) { Info<< "operating on field:" << this->dimensionedInternalField().name() << " patch:" << this->patch().name() << " avg:" << gAverage(*this) << " min:" << gMin(*this) << " max:" << gMax(*this) << endl; } fixedValueFvPatchField<Type>::updateCoeffs(); }
void Foam::radiation::greyDiffusiveViewFactorFixedValueFvPatchScalarField:: updateCoeffs() { //Do nothing if (debug) { scalar Q = gSum((*this)*patch().magSf()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " <- " << " heat[W]:" << Q << " wall radiative heat flux " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } }
void printIntegrate ( const fvMesh& mesh, const IOobject& fieldHeader, bool& done ) { if (!done && fieldHeader.headerClassName() == FieldType::typeName) { Info<< " Reading " << fieldHeader.headerClassName() << " " << fieldHeader.name() << " "; FieldType field(fieldHeader, mesh); Info<< field.dimensions() << endl; Info<< " min : " << gMin(field) << nl << " max : " << gMax(field) << nl; done = true; } }
void Foam::calcTypes::mag::writeMagField ( const IOobject& header, const fvMesh& mesh, bool& processed ) { typedef GeometricField<Type, fvPatchField, volMesh> fieldType; if (header.headerClassName() == fieldType::typeName) { Info<< " Reading " << header.name() << endl; fieldType field(header, mesh); Info<< " Calculating mag" << header.name() << endl; volScalarField magField ( IOobject ( "mag" + header.name(), mesh.time().timeName(), mesh, IOobject::NO_READ ), Foam::mag(field) ); Info << "mag(" << header.name() << "): max: " << gMax(magField.internalField()) << " min: " << gMin(magField.internalField()) << endl; magField.write(); processed = true; } }
void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::updateCoeffs() { if (updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; // Get the coupling information from the mappedPatchBase const mappedPatchBase& mpp = refCast<const mappedPatchBase>(patch().patch()); const polyMesh& nbrMesh = mpp.sampleMesh(); const label samplePatchi = mpp.samplePolyPatch().index(); const fvPatch& nbrPatch = refCast<const fvMesh>(nbrMesh).boundary()[samplePatchi]; // Calculate the temperature by harmonic averaging // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ const turbulentTemperatureCoupledBaffleMixedFvPatchScalarField& nbrField = refCast < const turbulentTemperatureCoupledBaffleMixedFvPatchScalarField > ( nbrPatch.lookupPatchField<volScalarField, scalar> ( TnbrName_ ) ); // Swap to obtain full local values of neighbour internal field tmp<scalarField> nbrIntFld(new scalarField(nbrField.size(), 0.0)); tmp<scalarField> nbrKDelta(new scalarField(nbrField.size(), 0.0)); if (contactRes_ == 0.0) { nbrIntFld.ref() = nbrField.patchInternalField(); nbrKDelta.ref() = nbrField.kappa(nbrField)*nbrPatch.deltaCoeffs(); } else { nbrIntFld.ref() = nbrField; nbrKDelta.ref() = contactRes_; } mpp.distribute(nbrIntFld.ref()); mpp.distribute(nbrKDelta.ref()); tmp<scalarField> myKDelta = kappa(*this)*patch().deltaCoeffs(); // Both sides agree on // - temperature : (myKDelta*fld + nbrKDelta*nbrFld)/(myKDelta+nbrKDelta) // - gradient : (temperature-fld)*delta // We've got a degree of freedom in how to implement this in a mixed bc. // (what gradient, what fixedValue and mixing coefficient) // Two reasonable choices: // 1. specify above temperature on one side (preferentially the high side) // and above gradient on the other. So this will switch between pure // fixedvalue and pure fixedgradient // 2. specify gradient and temperature such that the equations are the // same on both sides. This leads to the choice of // - refGradient = zero gradient // - refValue = neighbour value // - mixFraction = nbrKDelta / (nbrKDelta + myKDelta()) this->refValue() = nbrIntFld(); this->refGrad() = 0.0; this->valueFraction() = nbrKDelta()/(nbrKDelta() + myKDelta()); mixedFvPatchScalarField::updateCoeffs(); if (debug) { scalar Q = gSum(kappa(*this)*patch().magSf()*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->internalField().name() << " <- " << nbrMesh.name() << ':' << nbrPatch.name() << ':' << this->internalField().name() << " :" << " heat transfer rate:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } // Restore tag UPstream::msgType() = oldTag; }
// Call scotch with options from dictionary. Foam::label Foam::scotchDecomp::decompose ( const List<int>& adjncy, const List<int>& xadj, const scalarField& cWeights, List<int>& finalDecomp ) { // Dump graph if (decompositionDict_.found("scotchCoeffs")) { const dictionary& scotchCoeffs = decompositionDict_.subDict("scotchCoeffs"); if (scotchCoeffs.found("writeGraph")) { Switch writeGraph(scotchCoeffs.lookup("writeGraph")); if (writeGraph) { OFstream str(mesh_.time().path() / mesh_.name() + ".grf"); Info<< "Dumping Scotch graph file to " << str.name() << endl << "Use this in combination with gpart." << endl; label version = 0; str << version << nl; // Numer of vertices str << xadj.size()-1 << ' ' << adjncy.size() << nl; // Numbering starts from 0 label baseval = 0; // Has weights? label hasEdgeWeights = 0; label hasVertexWeights = 0; label numericflag = 10*hasEdgeWeights+hasVertexWeights; str << baseval << ' ' << numericflag << nl; for (label cellI = 0; cellI < xadj.size()-1; cellI++) { label start = xadj[cellI]; label end = xadj[cellI+1]; str << end-start; for (label i = start; i < end; i++) { str << ' ' << adjncy[i]; } str << nl; } } } } // Strategy // ~~~~~~~~ // Default. SCOTCH_Strat stradat; check(SCOTCH_stratInit(&stradat), "SCOTCH_stratInit"); if (decompositionDict_.found("scotchCoeffs")) { const dictionary& scotchCoeffs = decompositionDict_.subDict("scotchCoeffs"); string strategy; if (scotchCoeffs.readIfPresent("strategy", strategy)) { if (debug) { Info<< "scotchDecomp : Using strategy " << strategy << endl; } SCOTCH_stratGraphMap(&stradat, strategy.c_str()); //fprintf(stdout, "S\tStrat="); //SCOTCH_stratSave(&stradat, stdout); //fprintf(stdout, "\n"); } } // Graph // ~~~~~ List<int> velotab; // Check for externally provided cellweights and if so initialise weights scalar minWeights = gMin(cWeights); if (cWeights.size() > 0) { if (minWeights <= 0) { WarningIn ( "scotchDecomp::decompose" "(const pointField&, const scalarField&)" ) << "Illegal minimum weight " << minWeights << endl; } if (cWeights.size() != xadj.size()-1) { FatalErrorIn ( "scotchDecomp::decompose" "(const pointField&, const scalarField&)" ) << "Number of cell weights " << cWeights.size() << " does not equal number of cells " << xadj.size()-1 << exit(FatalError); } // Convert to integers. velotab.setSize(cWeights.size()); forAll(velotab, i) { velotab[i] = int(cWeights[i]/minWeights); } } SCOTCH_Graph grafdat; check(SCOTCH_graphInit(&grafdat), "SCOTCH_graphInit"); check ( SCOTCH_graphBuild ( &grafdat, 0, // baseval, c-style numbering xadj.size()-1, // vertnbr, nCells xadj.begin(), // verttab, start index per cell into adjncy &xadj[1], // vendtab, end index ,, velotab.begin(), // velotab, vertex weights NULL, // vlbltab adjncy.size(), // edgenbr, number of arcs adjncy.begin(), // edgetab NULL // edlotab, edge weights ), "SCOTCH_graphBuild" ); check(SCOTCH_graphCheck(&grafdat), "SCOTCH_graphCheck"); // Architecture // ~~~~~~~~~~~~ // (fully connected network topology since using switch) SCOTCH_Arch archdat; check(SCOTCH_archInit(&archdat), "SCOTCH_archInit"); List<label> processorWeights; if (decompositionDict_.found("scotchCoeffs")) { const dictionary& scotchCoeffs = decompositionDict_.subDict("scotchCoeffs"); scotchCoeffs.readIfPresent("processorWeights", processorWeights); } if (processorWeights.size()) { if (debug) { Info<< "scotchDecomp : Using procesor weights " << processorWeights << endl; } check ( SCOTCH_archCmpltw(&archdat, nProcessors_, processorWeights.begin()), "SCOTCH_archCmpltw" ); } else { check ( SCOTCH_archCmplt(&archdat, nProcessors_), "SCOTCH_archCmplt" ); } //SCOTCH_Mapping mapdat; //SCOTCH_graphMapInit(&grafdat, &mapdat, &archdat, NULL); //SCOTCH_graphMapCompute(&grafdat, &mapdat, &stradat); /* Perform mapping */ //SCOTCH_graphMapExit(&grafdat, &mapdat); // Hack:switch off fpu error trapping # ifdef LINUX_GNUC int oldExcepts = fedisableexcept ( FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW ); # endif finalDecomp.setSize(xadj.size()-1); finalDecomp = 0; check ( SCOTCH_graphMap ( &grafdat, &archdat, &stradat, // const SCOTCH_Strat * finalDecomp.begin() // parttab ), "SCOTCH_graphMap" ); # ifdef LINUX_GNUC feenableexcept(oldExcepts); # endif //finalDecomp.setSize(xadj.size()-1); //check //( // SCOTCH_graphPart // ( // &grafdat, // nProcessors_, // partnbr // &stradat, // const SCOTCH_Strat * // finalDecomp.begin() // parttab // ), // "SCOTCH_graphPart" //); // Release storage for graph SCOTCH_graphExit(&grafdat); // Release storage for strategy SCOTCH_stratExit(&stradat); // Release storage for network topology SCOTCH_archExit(&archdat); return 0; }
// Call scotch with options from dictionary. Foam::label Foam::ptscotchDecomp::decompose ( const fileName& meshPath, const label adjncySize, const label adjncy[], const label xadjSize, const label xadj[], const scalarField& cWeights, List<label>& finalDecomp ) const { if (debug) { Pout<< "ptscotchDecomp : entering with xadj:" << xadjSize << endl; } // Dump graph if (decompositionDict_.found("scotchCoeffs")) { const dictionary& scotchCoeffs = decompositionDict_.subDict("scotchCoeffs"); if (scotchCoeffs.lookupOrDefault("writeGraph", false)) { OFstream str ( meshPath + "_" + Foam::name(Pstream::myProcNo()) + ".dgr" ); Pout<< "Dumping Scotch graph file to " << str.name() << endl << "Use this in combination with dgpart." << endl; globalIndex globalCells(xadjSize-1); // Distributed graph file (.grf) label version = 2; str << version << nl; // Number of files (procglbnbr) str << Pstream::nProcs(); // My file number (procloc) str << ' ' << Pstream::myProcNo() << nl; // Total number of vertices (vertglbnbr) str << globalCells.size(); // Total number of connections (edgeglbnbr) str << ' ' << returnReduce(xadj[xadjSize-1], sumOp<label>()) << nl; // Local number of vertices (vertlocnbr) str << xadjSize-1; // Local number of connections (edgelocnbr) str << ' ' << xadj[xadjSize-1] << nl; // Numbering starts from 0 label baseval = 0; // 100*hasVertlabels+10*hasEdgeWeights+1*hasVertWeighs str << baseval << ' ' << "000" << nl; for (label celli = 0; celli < xadjSize-1; celli++) { label start = xadj[celli]; label end = xadj[celli+1]; str << end-start; for (label i = start; i < end; i++) { str << ' ' << adjncy[i]; } str << nl; } } } // Strategy // ~~~~~~~~ // Default. SCOTCH_Strat stradat; check(SCOTCH_stratInit(&stradat), "SCOTCH_stratInit"); if (decompositionDict_.found("scotchCoeffs")) { const dictionary& scotchCoeffs = decompositionDict_.subDict("scotchCoeffs"); string strategy; if (scotchCoeffs.readIfPresent("strategy", strategy)) { if (debug) { Info<< "ptscotchDecomp : Using strategy " << strategy << endl; } SCOTCH_stratDgraphMap(&stradat, strategy.c_str()); //fprintf(stdout, "S\tStrat="); //SCOTCH_stratSave(&stradat, stdout); //fprintf(stdout, "\n"); } } // Graph // ~~~~~ List<label> velotab; // Check for externally provided cellweights and if so initialise weights scalar minWeights = gMin(cWeights); scalar maxWeights = gMax(cWeights); if (maxWeights > minWeights) { if (minWeights <= 0) { WarningInFunction << "Illegal minimum weight " << minWeights << endl; } if (cWeights.size() != xadjSize-1) { FatalErrorInFunction << "Number of cell weights " << cWeights.size() << " does not equal number of cells " << xadjSize-1 << exit(FatalError); } } scalar velotabSum = gSum(cWeights)/minWeights; scalar rangeScale(1.0); if (Pstream::master()) { if (velotabSum > scalar(labelMax - 1)) { // 0.9 factor of safety to avoid floating point round-off in // rangeScale tipping the subsequent sum over the integer limit. rangeScale = 0.9*scalar(labelMax - 1)/velotabSum; WarningInFunction << "Sum of weights has overflowed integer: " << velotabSum << ", compressing weight scale by a factor of " << rangeScale << endl; } } Pstream::scatter(rangeScale); if (maxWeights > minWeights) { if (cWeights.size()) { // Convert to integers. velotab.setSize(cWeights.size()); forAll(velotab, i) { velotab[i] = int((cWeights[i]/minWeights - 1)*rangeScale) + 1; } }
Foam::capillarityModels::pcVanGenuchten::pcVanGenuchten ( const word& name, const dictionary& transportProperties, const volScalarField& Sb ) : capillarityModel(name, transportProperties,Sb), pcVanGenuchtenCoeffs_(transportProperties.subDict(typeName + "Coeffs")), Smin_ ( IOobject ( Sb_.name()+"min", Sb_.time().timeName(), Sb_.db(), IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), Sb.mesh(), transportProperties.lookupOrDefault(Sb_.name()+"min",dimensionedScalar(Sb_.name()+"min",dimless,0)) ), Smax_ ( IOobject ( Sb_.name()+"max", Sb_.time().timeName(), Sb_.db(), IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), Sb.mesh(), transportProperties.lookupOrDefault(Sb_.name()+"max",dimensionedScalar(Sb_.name()+"max",dimless,0)) ), m_ ( IOobject ( "m", Sb_.time().timeName(), Sb_.db(), IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), Sb.mesh(), dimensionedScalar("m",dimless,pcVanGenuchtenCoeffs_.lookupOrDefault<scalar>("m",0)) ), n_(1/(1-m_)), alpha_ // necessary for Richards solver ( IOobject ( "alpha", Sb_.time().timeName(), Sb_.db(), IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), Sb.mesh(), dimensionedScalar("alpha",dimless,pcVanGenuchtenCoeffs_.lookupOrDefault<scalar>("alpha",0)) ), pc0_ ( IOobject ( "pc0", Sb_.time().timeName(), Sb_.db(), IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ), Sb.mesh(), pcVanGenuchtenCoeffs_.lookupOrDefault("pc0",dimensionedScalar("pc0",dimensionSet(1,-1,-2,0,0),0.)) ), Se_((Sb_- Smin_)/(Smax_-Smin_)) { if (gMin(m_) == 0) FatalErrorIn("Foam::capillarityModels::pcVanGenuchten::pcVanGenuchten") << "m = 0 in pcVanGenuchten" << abort(FatalError); Info << "Van Genuchten parameters for capillary pressure model" << nl << "{" << endl; Info << " m "; if (m_.headerOk()) { Info << "read file" << endl;} else {Info << average(m_).value() << endl;} Info << " pc0 "; if (pc0_.headerOk()) { Info << "read file" << endl;} else {Info << average(pc0_).value() << endl;} Info << " alpha "; if (alpha_.headerOk()) { Info << "read file" << endl;} else {Info << average(alpha_).value() << endl;} Info << " Smin "; if (Smin_.headerOk()) { Info << "read file" << endl;} else {Info << average(Smin_).value() << endl;} Info << " Smax "; if (Smax_.headerOk()) { Info << "read file" << endl;} else {Info << average(Smax_).value() << endl;} Info << "} \n" << endl; }
void Foam::sampledIsoSurface::getIsoFields() const { const fvMesh& fvm = static_cast<const fvMesh&>(mesh()); // Get volField // ~~~~~~~~~~~~ if (fvm.foundObject<volScalarField>(isoField_)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() : lookup volField " << isoField_ << endl; } storedVolFieldPtr_.clear(); volFieldPtr_ = &fvm.lookupObject<volScalarField>(isoField_); } else { // Bit of a hack. Read field and store. if (debug) { Info<< "sampledIsoSurface::getIsoField() : checking " << isoField_ << " for same time " << fvm.time().timeName() << endl; } if ( storedVolFieldPtr_.empty() || (fvm.time().timeName() != storedVolFieldPtr_().instance()) ) { if (debug) { Info<< "sampledIsoSurface::getIsoField() : reading volField " << isoField_ << " from time " << fvm.time().timeName() << endl; } storedVolFieldPtr_.reset ( new volScalarField ( IOobject ( isoField_, fvm.time().timeName(), fvm, IOobject::MUST_READ, IOobject::NO_WRITE, false ), fvm ) ); volFieldPtr_ = storedVolFieldPtr_.operator->(); } } // Get pointField // ~~~~~~~~~~~~~~ if (!subMeshPtr_.valid()) { word pointFldName = "volPointInterpolate(" + isoField_ + ')'; if (fvm.foundObject<pointScalarField>(pointFldName)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() : lookup pointField " << pointFldName << endl; } pointFieldPtr_ = &fvm.lookupObject<pointScalarField>(pointFldName); } else { // Not in registry. Interpolate. if (debug) { Info<< "sampledIsoSurface::getIsoField() : checking pointField " << pointFldName << " for same time " << fvm.time().timeName() << endl; } if ( storedPointFieldPtr_.empty() || (fvm.time().timeName() != storedPointFieldPtr_().instance()) ) { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " interpolating volField " << volFieldPtr_->name() << " to get pointField " << pointFldName << endl; } storedPointFieldPtr_.reset ( volPointInterpolation::New(fvm) .interpolate(*volFieldPtr_).ptr() ); storedPointFieldPtr_->checkOut(); pointFieldPtr_ = storedPointFieldPtr_.operator->(); } } // If averaging redo the volField. Can only be done now since needs the // point field. if (average_) { storedVolFieldPtr_.reset(average(fvm, *pointFieldPtr_).ptr()); volFieldPtr_ = storedVolFieldPtr_.operator->(); } if (debug) { Info<< "sampledIsoSurface::getIsoField() : volField " << volFieldPtr_->name() << " min:" << min(*volFieldPtr_).value() << " max:" << max(*volFieldPtr_).value() << endl; Info<< "sampledIsoSurface::getIsoField() : pointField " << pointFieldPtr_->name() << " min:" << gMin(pointFieldPtr_->internalField()) << " max:" << gMax(pointFieldPtr_->internalField()) << endl; } } else { // Get subMesh variants const fvMesh& subFvm = subMeshPtr_().subMesh(); // Either lookup on the submesh or subset the whole-mesh volField if (subFvm.foundObject<volScalarField>(isoField_)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " submesh lookup volField " << isoField_ << endl; } storedVolSubFieldPtr_.clear(); volSubFieldPtr_ = &subFvm.lookupObject<volScalarField>(isoField_); } else { if (debug) { Info<< "sampledIsoSurface::getIsoField() : subsetting volField " << isoField_ << endl; } storedVolSubFieldPtr_.reset ( subMeshPtr_().interpolate ( *volFieldPtr_ ).ptr() ); storedVolSubFieldPtr_->checkOut(); volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); } // Pointfield on submesh word pointFldName = "volPointInterpolate(" + volSubFieldPtr_->name() + ')'; if (subFvm.foundObject<pointScalarField>(pointFldName)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " submesh lookup pointField " << pointFldName << endl; } storedPointSubFieldPtr_.clear(); pointSubFieldPtr_ = &subFvm.lookupObject<pointScalarField> ( pointFldName ); } else { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " interpolating submesh volField " << volSubFieldPtr_->name() << " to get submesh pointField " << pointFldName << endl; } storedPointSubFieldPtr_.reset ( volPointInterpolation::New ( subFvm ).interpolate(*volSubFieldPtr_).ptr() ); storedPointSubFieldPtr_->checkOut(); pointSubFieldPtr_ = storedPointSubFieldPtr_.operator->(); } // If averaging redo the volField. Can only be done now since needs the // point field. if (average_) { storedVolSubFieldPtr_.reset ( average(subFvm, *pointSubFieldPtr_).ptr() ); volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); } if (debug) { Info<< "sampledIsoSurface::getIsoField() : volSubField " << volSubFieldPtr_->name() << " min:" << min(*volSubFieldPtr_).value() << " max:" << max(*volSubFieldPtr_).value() << endl; Info<< "sampledIsoSurface::getIsoField() : pointSubField " << pointSubFieldPtr_->name() << " min:" << gMin(pointSubFieldPtr_->internalField()) << " max:" << gMax(pointSubFieldPtr_->internalField()) << endl; } } }
void Foam::MULES::implicitSolve ( const RhoType& rho, volScalarField& psi, const surfaceScalarField& phi, surfaceScalarField& phiPsi, const SpType& Sp, const SuType& Su, const scalar psiMax, const scalar psiMin ) { const fvMesh& mesh = psi.mesh(); const dictionary& MULEScontrols = mesh.solverDict(psi.name()); label maxIter ( readLabel(MULEScontrols.lookup("maxIter")) ); label nLimiterIter ( readLabel(MULEScontrols.lookup("nLimiterIter")) ); scalar maxUnboundedness ( readScalar(MULEScontrols.lookup("maxUnboundedness")) ); scalar CoCoeff ( readScalar(MULEScontrols.lookup("CoCoeff")) ); scalarField allCoLambda(mesh.nFaces()); { tmp<surfaceScalarField> Cof = mesh.time().deltaT()*mesh.surfaceInterpolation::deltaCoeffs() *mag(phi)/mesh.magSf(); slicedSurfaceScalarField CoLambda ( IOobject ( "CoLambda", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), mesh, dimless, allCoLambda, false // Use slices for the couples ); CoLambda == 1.0/max(CoCoeff*Cof, scalar(1)); } scalarField allLambda(allCoLambda); //scalarField allLambda(mesh.nFaces(), 1.0); slicedSurfaceScalarField lambda ( IOobject ( "lambda", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), mesh, dimless, allLambda, false // Use slices for the couples ); linear<scalar> CDs(mesh); upwind<scalar> UDs(mesh, phi); //fv::uncorrectedSnGrad<scalar> snGrads(mesh); fvScalarMatrix psiConvectionDiffusion ( fvm::ddt(rho, psi) + fv::gaussConvectionScheme<scalar>(mesh, phi, UDs).fvmDiv(phi, psi) //- fv::gaussLaplacianScheme<scalar, scalar>(mesh, CDs, snGrads) //.fvmLaplacian(Dpsif, psi) - fvm::Sp(Sp, psi) - Su ); surfaceScalarField phiBD(psiConvectionDiffusion.flux()); surfaceScalarField& phiCorr = phiPsi; phiCorr -= phiBD; for (label i=0; i<maxIter; i++) { if (i != 0 && i < 4) { allLambda = allCoLambda; } limiter ( allLambda, rho, psi, phiBD, phiCorr, Sp, Su, psiMax, psiMin, nLimiterIter ); solve ( psiConvectionDiffusion + fvc::div(lambda*phiCorr), MULEScontrols ); scalar maxPsiM1 = gMax(psi.internalField()) - 1.0; scalar minPsi = gMin(psi.internalField()); scalar unboundedness = max(max(maxPsiM1, 0.0), -min(minPsi, 0.0)); if (unboundedness < maxUnboundedness) { break; } else { Info<< "MULES: max(" << psi.name() << " - 1) = " << maxPsiM1 << " min(" << psi.name() << ") = " << minPsi << endl; phiBD = psiConvectionDiffusion.flux(); /* word gammaScheme("div(phi,gamma)"); word gammarScheme("div(phirb,gamma)"); const surfaceScalarField& phir = mesh.lookupObject<surfaceScalarField>("phir"); phiCorr = fvc::flux ( phi, psi, gammaScheme ) + fvc::flux ( -fvc::flux(-phir, scalar(1) - psi, gammarScheme), psi, gammarScheme ) - phiBD; */ } } phiPsi = psiConvectionDiffusion.flux() + lambda*phiCorr; }
ErrVal ReadYuvFile::xReadPlane( UChar *pucDest, UInt uiBufHeight, UInt uiBufWidth, UInt uiBufStride, UInt uiPicHeight, UInt uiPicWidth, UInt uiStartLine, UInt uiEndLine ) { UInt uiClearSize = uiBufWidth - uiPicWidth; ROT( 0 > (Int)uiClearSize ); ROT( uiBufHeight < uiPicHeight ); // clear skiped buffer above reading section and skip in file if( 0 != uiStartLine ) { UInt uiLines = uiStartLine; ::memset( pucDest, 0, uiBufWidth * uiLines ); pucDest += uiBufStride * uiLines; RNOKRS(m_cFile.seek( uiPicWidth * uiLines, SEEK_CUR), Err::m_nEndOfFile); } UInt uiEnd = gMin (uiPicHeight, uiEndLine); for( UInt yR = uiStartLine; yR < uiEnd; yR++ ) { UInt uiBytesRead; RNOKS( m_cFile.read( pucDest, uiPicWidth, uiBytesRead ) ); ::memset( &pucDest[uiPicWidth], 0, uiClearSize ); pucDest += uiBufStride; } // clear skiped buffer below reading section and skip in file if( uiEnd != uiPicHeight ) { UInt uiLines = uiPicHeight - uiEnd; ::memset( pucDest, 0, uiBufWidth * uiLines ); pucDest += uiBufStride * uiLines; RNOKRS(m_cFile.seek( uiPicWidth * uiLines, SEEK_CUR), Err::m_nEndOfFile); } // clear remaining buffer if( uiPicHeight != uiBufHeight ) { if( uiEnd != uiPicHeight ) { UInt uiLines = uiBufHeight - uiPicHeight; ::memset( pucDest, 0, uiBufWidth * uiLines); } else { switch( m_eFillMode ) { case FILL_CLEAR: { UInt uiLines = uiBufHeight - uiPicHeight; ::memset( pucDest, 0, uiBufWidth * uiLines); } break; case FILL_FRAME: { for( UInt y = uiPicHeight; y < uiBufHeight; y++ ) { memcpy( pucDest, pucDest - uiBufStride, uiBufStride ); pucDest += uiBufStride; } } break; case FILL_FIELD: { ROT( (uiBufHeight - uiPicHeight) & 1 ); for( UInt y = uiPicHeight; y < uiBufHeight; y+=2 ) { memcpy( pucDest, pucDest - 2*uiBufStride, 2*uiBufStride ); pucDest += 2*uiBufStride; } } break; default: AF() break; } } } return Err::m_nOK; }
void Foam::timeVaryingMappedFixedValuePointPatchField<Type>::updateCoeffs() { if (this->updated()) { return; } checkTable(); // Interpolate between the sampled data Type wantedAverage; if (endSampleTime_ == -1) { // only start value if (debug) { Pout<< "updateCoeffs : Sampled, non-interpolated values" << " from start time:" << sampleTimes_[startSampleTime_].name() << nl; } this->operator==(startSampledValues_); wantedAverage = startAverage_; } else { scalar start = sampleTimes_[startSampleTime_].value(); scalar end = sampleTimes_[endSampleTime_].value(); scalar s = (this->db().time().value()-start)/(end-start); if (debug) { Pout<< "updateCoeffs : Sampled, interpolated values" << " between start time:" << sampleTimes_[startSampleTime_].name() << " and end time:" << sampleTimes_[endSampleTime_].name() << " with weight:" << s << endl; } this->operator==((1-s)*startSampledValues_ + s*endSampledValues_); wantedAverage = (1-s)*startAverage_ + s*endAverage_; } // Enforce average. Either by scaling (if scaling factor > 0.5) or by // offsetting. if (setAverage_) { const Field<Type>& fld = *this; Type averagePsi = gAverage(fld); if (debug) { Pout<< "updateCoeffs :" << " actual average:" << averagePsi << " wanted average:" << wantedAverage << endl; } if (mag(averagePsi) < VSMALL) { // Field too small to scale. Offset instead. const Type offset = wantedAverage - averagePsi; if (debug) { Pout<< "updateCoeffs :" << " offsetting with:" << offset << endl; } this->operator==(fld+offset); } else { const scalar scale = mag(wantedAverage)/mag(averagePsi); if (debug) { Pout<< "updateCoeffs :" << " scaling with:" << scale << endl; } this->operator==(scale*fld); } } // apply offset to mapped values if (offset_.valid()) { const scalar t = this->db().time().timeOutputValue(); this->operator==(*this + offset_->value(t)); } if (debug) { Pout<< "updateCoeffs : set fixedValue to min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } fixedValuePointPatchField<Type>::updateCoeffs(); }
void thermalBaffle1DFvPatchScalarField<solidType>::updateCoeffs() { if (updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; const mapDistribute& mapDist = this->mappedPatchBase::map(); const label patchi = patch().index(); const label nbrPatchi = samplePolyPatch().index(); if (baffleActivated_) { const fvPatch& nbrPatch = patch().boundaryMesh()[nbrPatchi]; const compressible::turbulenceModel& turbModel = db().template lookupObject<compressible::turbulenceModel> ( "turbulenceModel" ); // local properties const scalarField kappaw(turbModel.kappaEff(patchi)); const fvPatchScalarField& Tp = patch().template lookupPatchField<volScalarField, scalar>(TName_); scalarField Qr(Tp.size(), 0.0); if (QrName_ != "none") { Qr = patch().template lookupPatchField<volScalarField, scalar> (QrName_); Qr = QrRelaxation_*Qr + (1.0 - QrRelaxation_)*QrPrevious_; QrPrevious_ = Qr; } tmp<scalarField> Ti = patchInternalField(); scalarField myKDelta(patch().deltaCoeffs()*kappaw); // nrb properties scalarField nbrTp = turbModel.thermo().T().boundaryField()[nbrPatchi]; mapDist.distribute(nbrTp); // solid properties scalarField kappas(patch().size(), 0.0); forAll(kappas, i) { kappas[i] = solid().kappa(0.0, (Tp[i] + nbrTp[i])/2.0); } const scalarField KDeltaSolid(kappas/baffleThickness()); const scalarField alpha(KDeltaSolid - Qr/Tp); valueFraction() = alpha/(alpha + myKDelta); refValue() = (KDeltaSolid*nbrTp + Qs()/2.0)/alpha; if (debug) { scalar Q = gAverage(kappaw*snGrad()); Info<< patch().boundaryMesh().mesh().name() << ':' << patch().name() << ':' << this->dimensionedInternalField().name() << " <- " << nbrPatch.name() << ':' << this->dimensionedInternalField().name() << " :" << " heat[W]:" << Q << " walltemperature " << " min:" << gMin(*this) << " max:" << gMax(*this) << " avg:" << gAverage(*this) << endl; } }
/*! ************************************************************************ * \brief * Generate box-out slice group map type MapUnit map (type 3) * ************************************************************************ */ Void FMO::GenerateType3MapUnitMap() { unsigned i, k; int leftBound, topBound, rightBound, bottomBound; int x, y, xDir, yDir; int mapUnitVacant; unsigned mapUnitsInSliceGroup0 = gMin((pps_.slice_group_change_rate_minus1 + 1) * img_.slice_group_change_cycle, PicSizeInMapUnits_); for( i = 0; i < PicSizeInMapUnits_; i++ ) MapUnitToSliceGroupMap_[ i ] = 2; x = ( img_.PicWidthInMbs - pps_.slice_group_change_direction_flag ) / 2; y = ( img_.PicHeightInMapUnits - pps_.slice_group_change_direction_flag ) / 2; leftBound = x; topBound = y; rightBound = x; bottomBound = y; xDir = pps_.slice_group_change_direction_flag - 1; yDir = pps_.slice_group_change_direction_flag; for( k = 0; k < PicSizeInMapUnits_; k += mapUnitVacant ) { mapUnitVacant = ( MapUnitToSliceGroupMap_[ y * img_.PicWidthInMbs + x ] == 2 ); if( mapUnitVacant ) MapUnitToSliceGroupMap_[ y * img_.PicWidthInMbs + x ] = ( k >= mapUnitsInSliceGroup0 ); if( xDir == -1 && x == leftBound ) { leftBound = gMax( leftBound - 1, 0 ); x = leftBound; xDir = 0; yDir = 2 * pps_.slice_group_change_direction_flag - 1; } else if( xDir == 1 && x == rightBound ) { rightBound = gMin( rightBound + 1, (int)img_.PicWidthInMbs - 1 ); x = rightBound; xDir = 0; yDir = 1 - 2 * pps_.slice_group_change_direction_flag; } else if( yDir == -1 && y == topBound ) { topBound = gMax( topBound - 1, 0 ); y = topBound; xDir = 1 - 2 * pps_.slice_group_change_direction_flag; yDir = 0; } else if( yDir == 1 && y == bottomBound ) { bottomBound = gMin( bottomBound + 1, (int)img_.PicHeightInMapUnits - 1 ); y = bottomBound; xDir = 2 * pps_.slice_group_change_direction_flag - 1; yDir = 0; } else { x = x + xDir; y = y + yDir; } } }