FoamFile {version 2.0;format ascii;class dictionary;object controlDict;}
application rhoPimpleFoam;startFrom latestTime;startTime 0;stopAt endTime;endTime .8;deltaT 1e-5;adjustTimeStep yes;maxCo .5;maxDeltaT 1e-4;writeControl adjustableRunTime;writeInterval .1;purgeWrite 0;writeFormat binary;writePrecision 12;runTimeModifiable true;functions {

 speedSquared {type magSqr;libs ("libfieldFunctionObjects.so");field U;result speedSquared;writeControl timeStep;writeInterval 500;log false;}
 inletMass {type surfaceFieldValue;libs ("libfieldFunctionObjects.so");writeFields false;regionType patch;name inlet;operation sum;fields (phi);writeControl timeStep;writeInterval 1;log false;}
 outletMass {type surfaceFieldValue;libs ("libfieldFunctionObjects.so");writeFields false;regionType patch;name outlet;operation sum;fields (phi);writeControl timeStep;writeInterval 1;log false;}
 inletState {type surfaceFieldValue;libs ("libfieldFunctionObjects.so");writeFields false;regionType patch;name inlet;operation weightedAverage;weightField phi;fields (T h p U speedSquared);writeControl timeStep;writeInterval 1;log false;}
 outletState {type surfaceFieldValue;libs ("libfieldFunctionObjects.so");writeFields false;regionType patch;name outlet;operation weightedAverage;weightField phi;fields (T h p U speedSquared);writeControl timeStep;writeInterval 1;log false;}
 wallHeatFlux {type wallHeatFlux;libs ("libfieldFunctionObjects.so");patches (coreWalls);writeControl timeStep;writeInterval 500;executeControl timeStep;executeInterval 1;log false;}
 coreHeat {type surfaceFieldValue;libs ("libfieldFunctionObjects.so");writeFields false;regionType patch;name coreWalls;operation areaIntegrate;fields (wallHeatFlux);writeControl timeStep;writeInterval 1;log false;}


 heatBalance {
  type coded; libs ("libutilityFunctionObjects.so"); name heatBalance;
  executeControl timeStep; executeInterval 1; writeControl timeStep; writeInterval 1;
  codeInclude #{
   #include "fvCFD.H"
   #include "fluidThermo.H"
  #};
  codeOptions #{ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude -I$(LIB_SRC)/transportModels/compressible/lnInclude #};
  codeLibs #{ -lfluidThermophysicalModels -lspecie #};
  codeExecute #{
   const auto& mesh = this->mesh();
   if (mesh.time().timeIndex()%20==0) {
   const auto& he = mesh.lookupObject<volScalarField>("h");
   const auto& U = mesh.lookupObject<volVectorField>("U");
   const auto& phi = mesh.lookupObject<surfaceScalarField>("phi");
   const auto& thermo = mesh.lookupObject<fluidThermo>(fluidThermo::dictName);
   const auto& alpha = thermo.alpha();
   scalar adv = 0, heat = 0;
   forAll(mesh.boundary(), patchi) {
    if (mesh.boundary()[patchi].coupled()) continue;
    const auto& hf=he.boundaryField()[patchi];
    const auto& uf=U.boundaryField()[patchi];
    scalar q=gSum(alpha.boundaryField()[patchi]*hf.snGrad()*mesh.magSf().boundaryField()[patchi]);
    scalar e=gSum(phi.boundaryField()[patchi]*(hf+.5*magSqr(uf)));
    adv+=e;heat+=q;
    Info<<"HEAT_PATCH "<<mesh.time().value()<<" "<<mesh.boundary()[patchi].name()<<" "<<q<<" "<<e<<nl;
   }
   Info<<"HEAT_TOTAL "<<mesh.time().value()<<" "<<heat<<" "<<adv<<" "<<adv-heat<<nl;
   const auto& rho = mesh.lookupObject<volScalarField>("rho");
   const auto& pressure = mesh.lookupObject<volScalarField>("p");
   scalar stored = gSum(mesh.V()*(rho.primitiveField()*(he.primitiveField()+.5*magSqr(U.primitiveField()))-pressure.primitiveField()));
   scalar mass = gSum(mesh.V()*rho.primitiveField());
   Info<<"FLUID_STORE "<<mesh.time().value()<<" "<<mass<<" "<<stored<<nl;
   }
  #};
 }
fieldAverage {type fieldAverage;libs ("libfieldFunctionObjects.so");timeStart .1;writeControl adjustableRunTime;writeInterval .1;fields (U {mean on;prime2Mean on;base time;} T {mean on;prime2Mean on;base time;} p {mean on;prime2Mean on;base time;});}
}
