#include #include #include "hip/hip_runtime.h" #define NBLOCKS 1024 #define NTHREADS 256 __global__ void dvc_ScaLBL_D3Q7_Membrane_AssignLinkCoef(int *membrane, int *Map, double *Distance, double *Psi, double *coef, double Threshold, double MassFractionIn, double MassFractionOut, double ThresholdMassFractionIn, double ThresholdMassFractionOut, int memLinks, int Nx, int Ny, int Nz, int Np){ int link,iq,ip,nq,np,nqm,npm; double aq, ap, membranePotential; /* Interior Links */ int S = memLinks/NBLOCKS/NTHREADS + 1; for (int s=0; s Threshold){ aq = ThresholdMassFractionIn; ap = ThresholdMassFractionOut; } /* Save the mass transfer coefficients */ coef[2*link] = aq; coef[2*link+1] = ap; } } } __global__ void dvc_ScaLBL_D3Q7_Membrane_AssignLinkCoef_halo( const int Cqx, const int Cqy, int const Cqz, int *Map, double *Distance, double *Psi, double Threshold, double MassFractionIn, double MassFractionOut, double ThresholdMassFractionIn, double ThresholdMassFractionOut, int *d3q7_recvlist, int *d3q7_linkList, double *coef, int start, int nlinks, int count, const int N, const int Nx, const int Ny, const int Nz) { //.................................................................................... // Unack distribution from the recv buffer // Distribution q matche Cqx, Cqy, Cqz // swap rule means that the distributions in recvbuf are OPPOSITE of q // dist may be even or odd distributions stored by stream layout //.................................................................................... int n, idx, link, nqm, npm, i, j, k; double distanceLocal, distanceNonlocal; double psiLocal, psiNonlocal, membranePotential; double ap,aq; // coefficient /* second enforce custom rule for membrane links */ int S = (count-nlinks)/NBLOCKS/NTHREADS + 1; for (int s=0; s 0.0){ if (membranePotential < Threshold*(-1.0)){ ap = MassFractionIn; aq = MassFractionOut; } else { ap = ThresholdMassFractionIn; aq = ThresholdMassFractionOut; } } else if (membranePotential > Threshold){ aq = ThresholdMassFractionIn; ap = ThresholdMassFractionOut; } // update link based on mass transfer coefficients coef[2*(link-nlinks)] = aq; coef[2*(link-nlinks)+1] = ap; } } } __global__ void dvc_ScaLBL_D3Q7_Membrane_Unpack(int q, int *d3q7_recvlist, int *d3q7_linkList, int start, int nlinks, int count, double *recvbuf, double *dist, int N, double *coef) { //.................................................................................... // Unack distribution from the recv buffer // Distribution q matche Cqx, Cqy, Cqz // swap rule means that the distributions in recvbuf are OPPOSITE of q // dist may be even or odd distributions stored by stream layout //.................................................................................... int n, idx, link; double fq,fp,fqq,ap,aq; // coefficient /* second enforce custom rule for membrane links */ int S = count/NBLOCKS/NTHREADS + 1; for (int s=0; s 10Np => odd part of dist) f1 = dist[nr1]; // reading the f1 data into register fq // q=2 nr2 = neighborList[n+Np]; // neighbor 1 ( < 10Np => even part of dist) f2 = dist[nr2]; // reading the f2 data into register fq // q=3 nr3 = neighborList[n+2*Np]; // neighbor 4 f3 = dist[nr3]; // q=4 nr4 = neighborList[n+3*Np]; // neighbor 3 f4 = dist[nr4]; // q=5 nr5 = neighborList[n+4*Np]; f5 = dist[nr5]; // q=6 nr6 = neighborList[n+5*Np]; f6 = dist[nr6]; // compute diffusive flux flux_diffusive_x = (1.0-0.5*rlx)*((f1-f2)-ux*Ci); flux_diffusive_y = (1.0-0.5*rlx)*((f3-f4)-uy*Ci); flux_diffusive_z = (1.0-0.5*rlx)*((f5-f6)-uz*Ci); FluxDiffusive[n+0*Np] = flux_diffusive_x; FluxDiffusive[n+1*Np] = flux_diffusive_y; FluxDiffusive[n+2*Np] = flux_diffusive_z; FluxAdvective[n+0*Np] = ux*Ci; FluxAdvective[n+1*Np] = uy*Ci; FluxAdvective[n+2*Np] = uz*Ci; FluxElectrical[n+0*Np] = uEPx*Ci; FluxElectrical[n+1*Np] = uEPy*Ci; FluxElectrical[n+2*Np] = uEPz*Ci; // q=0 dist[n] = f0*(1.0-rlx)+rlx*0.25*Ci; //dist[n] = f0*(1.0-rlx)+rlx*0.25*Ci*(1.0 - 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); // q = 1 dist[nr2] = f1*(1.0-rlx) + rlx*0.125*Ci*(1.0+4.0*(ux+uEPx)); //dist[nr2] = f1*(1.0-rlx) + rlx*0.125*Ci*(1.0+4.0*(ux+uEPx)+8.0*(ux+uEPx)*(ux+uEPx)- 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); // q=2 dist[nr1] = f2*(1.0-rlx) + rlx*0.125*Ci*(1.0-4.0*(ux+uEPx)); //dist[nr1] = f2*(1.0-rlx) + rlx*0.125*Ci*(1.0-4.0*(ux+uEPx)+8.0*(ux+uEPx)*(ux+uEPx)- 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); // q = 3 dist[nr4] = f3*(1.0-rlx) + rlx*0.125*Ci*(1.0+4.0*(uy+uEPy)); //dist[nr4] = f3*(1.0-rlx) + rlx*0.125*Ci*(1.0+4.0*(uy+uEPy)+8.0*(uy+uEPy)*(uy+uEPy)- 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); // q = 4 dist[nr3] = f4*(1.0-rlx) + rlx*0.125*Ci*(1.0-4.0*(uy+uEPy)); //dist[nr3] = f4*(1.0-rlx) + rlx*0.125*Ci*(1.0-4.0*(uy+uEPy)+8.0*(uy+uEPy)*(uy+uEPy)- 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); // q = 5 dist[nr6] = f5*(1.0-rlx) + rlx*0.125*Ci*(1.0+4.0*(uz+uEPz)); //dist[nr6] = f5*(1.0-rlx) + rlx*0.125*Ci*(1.0+4.0*(uz+uEPz)+8.0*(uz+uEPz)*(uz+uEPz)- 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); // q = 6 dist[nr5] = f6*(1.0-rlx) + rlx*0.125*Ci*(1.0-4.0*(uz+uEPz)); //dist[nr5] = f6*(1.0-rlx) + rlx*0.125*Ci*(1.0-4.0*(uz+uEPz)+8.0*(uz+uEPz)*(uz+uEPz)- 2.0*((ux+uEPx)*(ux+uEPx) + (uy+uEPy)*(uy+uEPy) + (uz+uEPz)*(uz+uEPz))); } } } __global__ void dvc_ScaLBL_D3Q7_AAeven_Ion(double *dist, double *Den, double *FluxDiffusive, double *FluxAdvective, double *FluxElectrical, double *Velocity, double *ElectricField, double Di, int zi, double rlx, double Vt, int start, int finish, int Np){ int n; double Ci; double ux,uy,uz; double uEPx,uEPy,uEPz;//electrochemical induced velocity double Ex,Ey,Ez;//electrical field double flux_diffusive_x,flux_diffusive_y,flux_diffusive_z; double f0,f1,f2,f3,f4,f5,f6; int S = Np/NBLOCKS/NTHREADS + 1; for (int s=0; s0) + CD_tmp; } } } extern "C" void ScaLBL_D3Q7_AAodd_IonConcentration(int *neighborList, double *dist, double *Den, int start, int finish, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_AAodd_IonConcentration<<>>(neighborList,dist,Den,start,finish,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_AAodd_IonConcentration: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_AAeven_IonConcentration(double *dist, double *Den, int start, int finish, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_AAeven_IonConcentration<<>>(dist,Den,start,finish,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_AAeven_IonConcentration: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_AAodd_Ion(int *neighborList, double *dist, double *Den, double *FluxDiffusive, double *FluxAdvective, double *FluxElectrical, double *Velocity, double *ElectricField, double Di, int zi, double rlx, double Vt, int start, int finish, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_AAodd_Ion<<>>(neighborList,dist,Den,FluxDiffusive,FluxAdvective,FluxElectrical,Velocity,ElectricField,Di,zi,rlx,Vt,start,finish,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_AAodd_Ion: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_AAeven_Ion(double *dist, double *Den, double *FluxDiffusive, double *FluxAdvective, double *FluxElectrical, double *Velocity, double *ElectricField, double Di, int zi, double rlx, double Vt, int start, int finish, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_AAeven_Ion<<>>(dist,Den,FluxDiffusive,FluxAdvective,FluxElectrical,Velocity,ElectricField,Di,zi,rlx,Vt,start,finish,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_AAeven_Ion: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_Ion_Init(double *dist, double *Den, double DenInit, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_Ion_Init<<>>(dist,Den,DenInit,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_Ion_Init: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_Ion_Init_FromFile(double *dist, double *Den, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_Ion_Init_FromFile<<>>(dist,Den,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_Ion_Init_FromFile: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_Ion_ChargeDensity(double *Den, double *ChargeDensity, int IonValence, int ion_component, int start, int finish, int Np){ //cudaProfilerStart(); dvc_ScaLBL_D3Q7_Ion_ChargeDensity<<>>(Den,ChargeDensity,IonValence,ion_component,start,finish,Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("hip error in ScaLBL_D3Q7_Ion_ChargeDensity: %s \n",hipGetErrorString(err)); } //cudaProfilerStop(); } extern "C" void ScaLBL_D3Q7_Membrane_AssignLinkCoef(int *membrane, int *Map, double *Distance, double *Psi, double *coef, double Threshold, double MassFractionIn, double MassFractionOut, double ThresholdMassFractionIn, double ThresholdMassFractionOut, int memLinks, int Nx, int Ny, int Nz, int Np){ dvc_ScaLBL_D3Q7_Membrane_AssignLinkCoef<<>>(membrane, Map, Distance, Psi, coef, Threshold, MassFractionIn, MassFractionOut, ThresholdMassFractionIn, ThresholdMassFractionOut, memLinks, Nx, Ny, Nz, Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("CUDA error in dvc_ScaLBL_D3Q7_Membrane_AssignLinkCoef: %s \n",hipGetErrorString(err)); } } extern "C" void ScaLBL_D3Q7_Membrane_AssignLinkCoef_halo( const int Cqx, const int Cqy, int const Cqz, int *Map, double *Distance, double *Psi, double Threshold, double MassFractionIn, double MassFractionOut, double ThresholdMassFractionIn, double ThresholdMassFractionOut, int *d3q7_recvlist, int *d3q7_linkList, double *coef, int start, int nlinks, int count, const int N, const int Nx, const int Ny, const int Nz) { dvc_ScaLBL_D3Q7_Membrane_AssignLinkCoef_halo<<>>( Cqx, Cqy, Cqz, Map, Distance, Psi, Threshold, MassFractionIn, MassFractionOut, ThresholdMassFractionIn, ThresholdMassFractionOut, d3q7_recvlist, d3q7_linkList, coef, start, nlinks, count, N, Nx, Ny, Nz); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("CUDA error in dvc_ScaLBL_D3Q7_Membrane_AssignLinkCoef_halo: %s \n",hipGetErrorString(err)); } } extern "C" void ScaLBL_D3Q7_Membrane_Unpack(int q, int *d3q7_recvlist, int *d3q7_linkList, int start, int nlinks, int count, double *recvbuf, double *dist, int N, double *coef) { dvc_ScaLBL_D3Q7_Membrane_Unpack<<>>(q, d3q7_recvlist, d3q7_linkList, start, nlinks, count, recvbuf, dist, N, coef) ; hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("CUDA error in dvc_ScaLBL_D3Q7_Membrane_Unpack: %s \n",hipGetErrorString(err)); } } extern "C" void ScaLBL_D3Q7_Membrane_IonTransport(int *membrane, double *coef, double *dist, double *Den, int memLinks, int Np){ dvc_ScaLBL_D3Q7_Membrane_IonTransport<<>>(membrane, coef, dist, Den, memLinks, Np); hipError_t err = hipGetLastError(); if (hipSuccess != err){ printf("CUDA error in dvc_ScaLBL_D3Q7_Membrane_IonTransport: %s \n",hipGetErrorString(err)); } }