#include "K15IncompressibleNavierStokesRotatingVelocityField.h"

#include "K15IncompressibleNavierStokesRotatingVelocityField_Device.cuh"
#include "Parameter/Parameter.h"
#include "cuda_helper/CudaGrid.h"

std::shared_ptr<K15IncompressibleNavierStokesRotatingVelocityField> K15IncompressibleNavierStokesRotatingVelocityField::getNewInstance(std::shared_ptr<Parameter> para, int level)
{
	return std::shared_ptr<K15IncompressibleNavierStokesRotatingVelocityField>(new K15IncompressibleNavierStokesRotatingVelocityField(para, level));
}

void K15IncompressibleNavierStokesRotatingVelocityField::run()
{
    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes);

    K15IncompressibleNavierStokesRotatingVelocityField_Device <<< grid.grid, grid.threads >>>(
        para->getParD(level)->omega,
        para->getParD(level)->deltaPhi,
        para->getAngularVelocity(),
        para->getParD(level)->typeOfGridNode,
        para->getParD(level)->neighborX,
        para->getParD(level)->neighborY,
        para->getParD(level)->neighborZ,
        para->getParD(level)->coordinateX,
        para->getParD(level)->coordinateY,
        para->getParD(level)->coordinateZ,
        para->getParD(level)->distributions.f[0],
        para->getParD(level)->numberOfNodes,
        para->getParD(level)->isEvenTimestep);
    getLastCudaError("K15IncompressibleNavierStokesRotatingVelocityField_Device execution failed");
}

K15IncompressibleNavierStokesRotatingVelocityField::K15IncompressibleNavierStokesRotatingVelocityField(std::shared_ptr<Parameter> para, int level)
{
	this->para = para;
	this->level = level;

	myPreProcessorTypes.push_back(InitSP27);

	
}

K15IncompressibleNavierStokesRotatingVelocityField::K15IncompressibleNavierStokesRotatingVelocityField()
{
}