-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKernels.cc
74 lines (52 loc) · 2.11 KB
/
Kernels.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "Kernels.h"
double Laplacian(double *c, double dx, double dy, double dz, int x, int y, int z, int MX, int MY, int MZ, int nn)
{
int xp, xn, yp, yn, zp, zn;
int MXP = nn+MX+nn;
int MYP = nn+MY+nn;
xp = x+1;
xn = x-1;
yp = y+1;
yn = y-1;
zp = z+1;
zn = z-1;
double cxx = (c[xp+y*MXP+z*MXP*MYP] + c[xn+y*MXP+z*MXP*MYP] - 2.0*c[x+y*MXP+z*MXP*MYP]) / (dx*dx);
double cyy = (c[x+yp*MXP+z*MXP*MYP] + c[x+yn*MXP+z*MXP*MYP] - 2.0*c[x+y*MXP+z*MXP*MYP]) / (dy*dy);
double czz = (c[x+y*MXP+zp*MXP*MYP] + c[x+y*MXP+zn*MXP*MYP] - 2.0*c[x+y*MXP+z*MXP*MYP]) / (dz*dz);
double result = cxx + cyy + czz;
return result;
}
void chemicalPotential(double *c, double *mu, double dx, double dy, double dz, double kappa, double e_AA, double e_BB, double e_AB, int MX, int MY, int MZ, int nn)
{
int MXP = nn+MX+nn;
int MYP = nn+MY+nn;
int MZP = nn+MZ+nn;
for (unsigned int idz = 0; idz < MZ; idz++) {
int IDz = idz + nn;
for (unsigned int idy = 0; idy < MY; idy++) {
int IDy = idy + nn;
for (unsigned int idx = 0; idx < MX; idx++) {
int IDx = idx + nn;
int IDflattened = IDx+IDy*MXP+IDz*MXP*MYP;
mu[IDflattened] = ( 9.0 / 2.0 )*( ( c[IDflattened] + 1.0 ) * e_AA + ( c[IDflattened] - 1 ) * e_BB - 2.0 * c[IDflattened] * e_AB ) + 3.0 * c[IDflattened] + c[IDflattened] * c[IDflattened] * c[IDflattened] - kappa * Laplacian(c,dx,dy,dz,IDx,IDy,IDz,MX,MY,MZ,nn);
}
}
}
}
void cahnHilliard(double *cnew, double *mu, double D, double dt, double dx, double dy, double dz, int MX, int MY, int MZ, int nn)
{
int MXP = nn+MX+nn;
int MYP = nn+MY+nn;
int MZP = nn+MZ+nn;
for (unsigned int idz = 0; idz < MZ; idz++) {
int IDz = idz + nn;
for (unsigned int idy = 0; idy < MY; idy++) {
int IDy = idy + nn;
for (unsigned int idx = 0; idx < MX; idx++) {
int IDx = idx + nn;
int IDflattened = IDx+IDy*MXP+IDz*MXP*MYP;
cnew[IDflattened] = cnew[IDflattened] + dt * D * Laplacian(mu,dx,dy,dz,IDx,IDy,IDz,MX,MY,MZ,nn);
}
}
}
}