Skip to content

Commit

Permalink
added Boussinessq
Browse files Browse the repository at this point in the history
  • Loading branch information
Nadish Saini committed Aug 30, 2024
1 parent 74469ff commit fb0dd08
Show file tree
Hide file tree
Showing 7 changed files with 346 additions and 35 deletions.
3 changes: 2 additions & 1 deletion cmake/nekrs.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ set(NRS_SRC
src/core/linAlg/matrixRightSolve.cpp
src/plugins/tavg.cpp
src/nrs/plugins/velRecycling.cpp
src//nrs/plugins/RANSktau.cpp
src/nrs/plugins/RANSktau.cpp
src/nrs/plugins/RANSktauBuo.cpp
src/nrs/plugins/lowMach.cpp
src/nrs/plugins/lpm.cpp
src/pointInterpolation/findpts/findpts.cpp
Expand Down
79 changes: 45 additions & 34 deletions src/nrs/plugins/RANSktau.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ static nrs_t *nrs;
int kFieldIndex;
static std::string model = "KTAU";

dfloat rho;
dfloat mueLam;
static dfloat rho;
static dfloat mueLam;

static occa::memory o_mut;

Expand Down Expand Up @@ -44,8 +44,10 @@ static occa::kernel SijMag2OiOjSkKernel;
static std::vector<int> wbID;
static occa::memory o_wbID;

static bool buildKernelCalled = false;
static occa::properties ktauInfo;

static bool setupCalled = false;
static bool buildKernelCalled = false;
static bool movingMesh = false;
static bool cheapWd = false;

Expand Down Expand Up @@ -87,17 +89,22 @@ static dfloat coeff[] = {
0.41 // vkappa
};

occa::memory implicitK(double time, int scalarIdx)
} // namespace


occa::memory RANSktau::implicitK(double time, int scalarIdx)
{
if (scalarIdx == kFieldIndex) return o_implicitKtau.slice(0 * nrs->fieldOffset, nrs->fieldOffset);
if (scalarIdx == kFieldIndex + 1) return o_implicitKtau.slice(1 * nrs->fieldOffset, nrs->fieldOffset);
return o_NULL;
}

} // namespace
occa::properties RANSktau::RANSInfo(){return ktauInfo;}

void RANSktau::buildKernel(occa::properties _kernelInfo)
{
if(buildKernelCalled == 1) return;

occa::properties kernelInfo;
if (!kernelInfo.get<std::string>("defines/p_sigma_k").size()) {
kernelInfo["defines/p_sigma_k"] = coeff[0];
Expand Down Expand Up @@ -200,6 +207,8 @@ void RANSktau::buildKernel(occa::properties _kernelInfo)
std::cout << kernelInfo << std::endl;
}

ktauInfo = kernelInfo;

kernelInfo += _kernelInfo;

auto buildKernel = [&kernelInfo](const std::string &fileName, const std::string &kernelName) {
Expand Down Expand Up @@ -236,7 +245,7 @@ void RANSktau::updateProperties()
MPI_COMM_SELF,
EXIT_FAILURE,
"%s\n",
"called prior to tavg::setup()!");
"called prior to RANSktau::setup()!");

mesh_t *mesh = nrs->meshV;
cds_t *cds = nrs->cds;
Expand Down Expand Up @@ -267,7 +276,7 @@ void RANSktau::updateProperties()
o_xt,
o_xtq);

if(movingMesh && cheapWd) o_ywd = mesh->minDistance(wbID.size(), o_wbID, "cheap_dist");
if(movingMesh && cheapWd) o_ywd = mesh->minDistance(wbID.size(), o_wbID, "cheap_dist");

mueKernel(mesh->Nelements * mesh->Np,
nrs->fieldOffset,
Expand Down Expand Up @@ -296,7 +305,7 @@ void RANSktau::updateSourceTerms()
MPI_COMM_SELF,
EXIT_FAILURE,
"%s\n",
"called prior to tavg::setup()!");
"called prior to RANSktau::setup()!");

mesh_t *mesh = nrs->meshV;
cds_t *cds = nrs->cds;
Expand Down Expand Up @@ -354,7 +363,7 @@ void RANSktau::setup(dfloat mueIn, dfloat rhoIn, int ifld)
cds_t *cds = nrs->cds;
mesh_t *mesh = nrs->meshV;

movingMesh = platform->options.compareArgs("MOVING MESH", "TRUE");
movingMesh = platform->options.compareArgs("MOVING MESH", "TRUE");

nekrsCheck(cds->NSfields < kFieldIndex+1, platform->comm.mpiComm, EXIT_FAILURE,
"%s\n", "number of scalar fields too low!");
Expand All @@ -365,7 +374,7 @@ void RANSktau::setup(dfloat mueIn, dfloat rhoIn, int ifld)
o_mut = platform->device.malloc<dfloat>(cds->fieldOffset[kFieldIndex]);

o_implicitKtau = platform->device.malloc<dfloat>(2 * nrs->fieldOffset);
cds->userImplicitLinearTerm = implicitK;
cds->userImplicitLinearTerm = RANSktau::implicitK;

if(model == "KTAU") o_OiOjSk = platform->device.malloc<dfloat>(nrs->fieldOffset);
o_SijMag2 = platform->device.malloc<dfloat>(nrs->fieldOffset);
Expand All @@ -376,12 +385,12 @@ void RANSktau::setup(dfloat mueIn, dfloat rhoIn, int ifld)
if(model == "SST+DES"){
o_dgrd = platform->device.malloc<dfloat>(mesh->Nelements);
o_OijMag2 = platform->device.malloc<dfloat>(nrs->fieldOffset);
desLenScaleKernel(mesh->Nelements,
nrs->fieldOffset,
mesh->o_x,
mesh->o_y,
mesh->o_z,
o_dgrd);
desLenScaleKernel(mesh->Nelements,
nrs->fieldOffset,
mesh->o_x,
mesh->o_y,
mesh->o_z,
o_dgrd);
}

setupCalled = true;
Expand All @@ -398,32 +407,34 @@ void RANSktau::setup(dfloat mueIn, dfloat rhoIn, int ifld, std::string &modelIn)
upperCase(model);

nrs_t *_nrs = dynamic_cast<nrs_t *>(platform->solver);
auto mesh = _nrs->meshV;

if(model != "KTAU") {
for (auto &[key, bcID] : bcMap::map()) {
const auto field = key.first;
if (field == "velocity") {
if (bcID == bcMap::bcTypeW) {
wbID.push_back(key.second + 1);
}
}
}
o_wbID = platform->device.malloc<int>(wbID.size(), wbID.data());
o_ywd = mesh->minDistance(wbID.size(), o_wbID, "cheap_dist");

cheapWd = true;
auto mesh = _nrs->meshV;

if(model != "KTAU") {
for (auto &[key, bcID] : bcMap::map()) {
const auto field = key.first;
if (field == "velocity") {
if (bcID == bcMap::bcTypeW) {
wbID.push_back(key.second + 1);
}

}
}
o_wbID = platform->device.malloc<int>(wbID.size(), wbID.data());
o_ywd = mesh->minDistance(wbID.size(), o_wbID, "cheap_dist");

cheapWd = true;
}

RANSktau::setup(mueIn, rhoIn, ifld);
}

void RANSktau::setup(dfloat mueIn, dfloat rhoIn, int ifld, std::string &modelIn, occa::memory &o_ywdIn)
{
model = modelIn;

upperCase(model);
upperCase(model);

o_ywd = o_ywdIn;
RANSktau::setup(mueIn, rhoIn, ifld);
}

bool RANSktau::setup(){return setupCalled;}
3 changes: 3 additions & 0 deletions src/nrs/plugins/RANSktau.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ void setup(dfloat mue, dfloat rho, int startIndex, std::string &model);
void setup(dfloat mue, dfloat rho, int startIndex, std::string &model, occa::memory &o_ywd);
void updateProperties();
const deviceMemory<dfloat> o_mue_t();
occa::memory implicitK(double time, int scalarIdx);
bool setup();
occa::properties RANSInfo();
}

#endif
205 changes: 205 additions & 0 deletions src/nrs/plugins/RANSktauBuo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
#include "nrs.hpp"
#include "platform.hpp"
#include "nekInterfaceAdapter.hpp"
#include "RANSktau.hpp"
#include "linAlg.hpp"
#include "RANSktauBuo.hpp"

namespace{
static nrs_t* nrs;

int kFieldIndex;

static dfloat rho;
static dfloat mueLam;
static dfloat conductivity;
static dfloat Ri;

static occa::memory o_gvec;
static occa::memory o_T;
static occa::memory o_k;
static occa::memory o_tau;
static occa::memory o_implicitBuo;

static occa::kernel diffKernel;
static occa::kernel computeKernel;
static occa::kernel forceKernel;

static bool setupCalled = 0;
static bool buildKernelCalled = 0;

static dfloat coeff[] = {
1./0.85, // inverse turbulent Prandtl number
0.3 // Cs_buo
};

occa::memory implicitBuo(double time, int scalarIdx)
{
mesh_t* mesh = nrs->meshV;
auto o_implicitKtau = RANSktau::implicitK(time, scalarIdx);

if (scalarIdx == kFieldIndex){
auto o_term = o_implicitBuo.slice(0 * nrs->fieldOffset, nrs->fieldOffset);
platform->linAlg->axpby(mesh->Nlocal, 1.0, o_implicitKtau, 1.0, o_term);
return o_term;
}
if (scalarIdx == kFieldIndex + 1){
auto o_term = o_implicitBuo.slice(1 * nrs->fieldOffset, nrs->fieldOffset);
platform->linAlg->axpby(mesh->Nlocal, 1.0, o_implicitKtau, 1.0, o_term);
return o_term;
}
return o_NULL;
}

} //namespace

void RANSbuo::buildKernel(occa::properties _kernelInfo)
{
RANSktau::buildKernel(_kernelInfo);

occa::properties kernelInfo;

if (!kernelInfo.get<std::string>("defines/p_iPrt").size())
kernelInfo["defines/p_iPrt"] = coeff[0];
if (!kernelInfo.get<std::string>("defines/p_Cs").size())
kernelInfo["defines/p_Cs"] = coeff[1];

const int verbose = platform->options.compareArgs("VERBOSE", "TRUE") ? 1 : 0;

if(platform->comm.mpiRank == 0 && verbose) {
std::cout << "\nRANSktau Buoyancy settings\n";
std::cout << kernelInfo << std::endl;
}

kernelInfo += _kernelInfo + RANSktau::RANSInfo();

auto buildKernel = [&kernelInfo](const std::string &kernelName) {
const auto path = getenv("NEKRS_KERNEL_DIR") + std::string("/nrs/plugins/");
const auto fileName = path + "RANSktauBuo.okl";
const auto reqName = "RANSBuo::";
if (platform->options.compareArgs("REGISTER ONLY", "TRUE")) {
platform->kernelRequests.add(reqName, fileName, kernelInfo);
return occa::kernel();
}
else{
buildKernelCalled = 1;
return platform->kernelRequests.load(reqName, kernelName);
}
};

diffKernel = buildKernel("ktauBuoDiff");
computeKernel = buildKernel("ktauBuoCompute");
forceKernel = buildKernel("ktauBuoForce");
}

void RANSbuo::updateForce(occa::memory o_FU)
{
mesh_t *mesh = nrs->meshV;
cds_t *cds = nrs->cds;

forceKernel(mesh->Nlocal,
nrs->fieldOffset,
Ri,
o_gvec,
o_T,
o_FU);
}

void RANSbuo::updateProperties()
{
nekrsCheck(!setupCalled || !buildKernelCalled,
MPI_COMM_SELF,
EXIT_FAILURE,
"%s\n",
"called prior to RANSBuo::setup()!");

mesh_t *mesh = nrs->meshV;
cds_t *cds = nrs->cds;

auto o_temp_mue = cds->o_diff;

//SGDH
auto o_mut = RANSktau::o_mue_t();
diffKernel(mesh->Nlocal, conductivity, o_mut, o_temp_mue);
}

void RANSbuo::updateSourceTerms()
{
nekrsCheck(!setupCalled || !buildKernelCalled,
MPI_COMM_SELF,
EXIT_FAILURE,
"%s\n",
"called prior to RANSBuo::setup()!");

mesh_t *mesh = nrs->meshV;
cds_t *cds = nrs->cds;

occa::memory o_FS = cds->o_NLT + cds->fieldOffsetScan[kFieldIndex];
occa::memory o_Tgrad = platform->o_memPool.reserve<dfloat>(nrs->fieldOffset);

nrs->gradientVolumeKernel(mesh->Nelements,
mesh->o_vgeo,
mesh->o_D,
nrs->fieldOffset,
o_T,
o_Tgrad);

oogs::startFinish(o_Tgrad,
nrs->NVfields,
nrs->fieldOffset,
ogsDfloat,
ogsAdd,
nrs->gsh);

platform->linAlg->axmyVector(mesh->Nlocal,
nrs->fieldOffset,
0,
1.0,
mesh->o_invLMM,
o_Tgrad);


computeKernel(mesh->Nelements,
nrs->fieldOffset,
rho,
Ri,
o_gvec,
o_k,
o_tau,
o_Tgrad,
o_implicitBuo,
o_FS);
}

void RANSbuo::setup(dfloat mueIn, dfloat rhoIn, int ifld, dfloat RiIn, dfloat *gIn)
{
nekrsCheck(!RANSktau::setup(),
MPI_COMM_SELF,
EXIT_FAILURE,
"%s\n",
"called prior to RANSktau::setup()!");

if(setupCalled)
return;

nrs = dynamic_cast<nrs_t *>(platform->solver);
mueLam = mueIn;
rho = rhoIn;
kFieldIndex = ifld;
Ri = RiIn;
o_gvec = platform->device.malloc<dfloat>(3, gIn);

cds_t *cds = nrs->cds;
mesh_t *mesh = nrs->meshV;

o_T = cds->o_S + cds->fieldOffsetScan[0];
o_k = cds->o_S + cds->fieldOffsetScan[kFieldIndex];
o_tau = cds->o_S + cds->fieldOffsetScan[kFieldIndex + 1];

o_implicitBuo = platform->device.malloc<dfloat>(2 * nrs->fieldOffset);
cds->userImplicitLinearTerm = implicitBuo;

platform->options.getArgs("SCALAR00 DIFFUSIVITY",conductivity);

setupCalled = 1;
}
Loading

0 comments on commit fb0dd08

Please sign in to comment.