예제 #1
0
void KEStencil::apply(FlowField& flowField, int i, int j) {
  // calculate new value from old value and rhs
  flowField.getTke(i, j) += _parameters.timestep.dt * flowField.getRHSTke(i, j);
  flowField.getTke(i, j) *= flowField.getTke(i, j) < 0.0 ? 0.0 : 1.0;

  flowField.getEpsilon(i, j) +=
      _parameters.timestep.dt * flowField.getRHSEpsilon(i, j);
  flowField.getEpsilon(i, j) *= flowField.getEpsilon(i, j) < 0.0 ? 0.0 : 1.0;
}
예제 #2
0
void RHSStencil::apply(FlowField& flowField, int i, int j, int k) {
  //  loadLocalNu3D(_parameters, flowField, _localNu, i, j, k);
  loadLocalVelocity3D(flowField, _localVelocity, i, j, k);
  loadLocalMeshsize3D(_parameters, _localMeshsize, i, j, k);

  // load TKE
  loadLocal3D([&flowField](FLOAT* local, int ii, int jj, int kk) mutable {
    *(local + 0) = flowField.getTke(ii, jj, kk);
  }, _localTKE, i, j, k);

  // load epsilon
  loadLocal3D([&flowField](FLOAT* local, int ii, int jj, int kk) mutable {
    *(local + 0) = flowField.getEpsilon(ii, jj, kk);
  }, _localEpsilon, i, j, k);

  // load Fmu*Nut
  loadLocal3D([&flowField](FLOAT* local, int ii, int jj, int kk) mutable {
    *(local + 0) = flowField.getFmu(ii, jj, kk) * flowField.getNu(ii, jj, kk);
    //    *(local+0) = 0;
  }, _localFmuNut, i, j, k);

  const FLOAT sijsij = computeSijSij3D(_localVelocity, _localMeshsize);
  const FLOAT f1 = flowField.getF1(i, j, k);
  const FLOAT f2 = flowField.getF2(i, j, k);
  const FLOAT f3 = flowField.getF3(i, j, k);
  const FLOAT D = flowField.getD(i, j, k);
  const FLOAT E = flowField.getE(i, j, k);
  const FLOAT nut = flowField.getNu(i, j, k);

  flowField.getsijsij(i, j, k) = sijsij;

  // load nu + nut/sigmaK
  loadLocal3D([&flowField, this](FLOAT* local, int ii, int jj, int kk) mutable {
    *(local + 0) = this->_parameters.flow.visc +
                   flowField.getNu(ii, jj, kk) / this->_parameters.kEpsilon.sigmaK;
  }, _localNu, i, j, k);

  flowField.getRHSTke(i, j, k) =
      computeRHStke(_parameters, _localVelocity, _localMeshsize, _localNu,
                    _localTKE, _localEpsilon, nut, sijsij, f3, D);

  // load nu + nut/sigmaE
  loadLocal3D([&flowField, this](FLOAT* local, int ii, int jj, int kk) mutable {
    *(local + 0) = this->_parameters.flow.visc +
                   flowField.getNu(ii, jj, kk) / this->_parameters.kEpsilon.sigmaE;
  }, _localNu, i, j, k);

  flowField.getRHSEpsilon(i, j, k) =
      computeRHSepsilon(_parameters, _localVelocity, _localMeshsize, _localNu,
                        _localTKE, _localEpsilon, nut, sijsij, f1, f2, E);
}
예제 #3
0
void KEStencilF::apply(FlowField& flowField, int i, int j, int k) {
  // turbulent kinetic energy
  wip.tke = flowField.getTke(i, j, k);
  wip.tkes = (wip.tke > 0) - (wip.tke < 0);
  wip.tke = fabs(wip.tke);

  // dissipation rate
  wip.epsilon = flowField.getEpsilon(i, j, k);
  wip.epsilons = (wip.epsilon > 0) - (wip.epsilon < 0);
  wip.epsilon = fabs(wip.epsilon);

  // closest wall distance
  wip.delta = flowField.getH(i, j, k);

  // turbulent Reynolds numbers
  wip.Rt = wip.tke * wip.tke * wip.Re / max(wip.epsilon, err);
  wip.Rd = sqrt(wip.tke) * wip.delta * wip.Re;

  // dimensionless wall distance
  FLOAT uTau = pow(cmu, 0.25) * sqrt(wip.tke);
  wip.yplus = uTau * wip.delta * wip.Re;

  // calculate factors
  calc();

  // limitation for diffusion and reaction terms
//   FLOAT gamma = flowField.getEpsilon(i,j,k)/max(1e-8, flowField.getTke(i,j,k));
//   wop.f2 *= (wop.f2*gamma> 0.0) ? 1.0 : 0.0;
//   wop.f3  = (       gamma> 0.0) ? 1.0 : 0.0; 

  // write factors
  flowField.getFmu(i, j, k) = wop.fmu;
  flowField.getF1(i, j, k) = wop.f1;
  flowField.getF2(i, j, k) = wop.f2;
  flowField.getF3(i, j, k) = wop.f3;
  flowField.getD(i, j, k) = wop.D;
  flowField.getE(i, j, k) = wop.E;
}