56 int x0_,
int x1_,
int y0_,
int y1_,
int z0_,
int z1_ )
62 if (partners.size() > 1) {
66 int newX0, newX1, newY0, newY1, newZ0, newZ1;
68 x0_, x1_, y0_, y1_, z0, z1,
69 newX0, newX1, newY0, newY1, newZ0, newZ1 ) ) {
72 auto& rhoField = blockLattice.template getField<RHO_CACHE>();
74 for (
int iX=newX0-1; iX<=newX1+1; ++iX)
75 for (
int iY=newY0-1; iY<=newY1+1; ++iY)
76 for (
int iZ=newZ0-1; iZ<=newZ1+1; ++iZ) {
77 rhoField[0][blockLattice.
getCellId(iX, iY, iZ)] = blockLattice.
get(iX,iY,iZ).computeRho();
79 for (
int iX=newX0-1; iX<=newX1+1; ++iX)
80 for (
int iY=newY0-1; iY<=newY1+1; ++iY)
81 for (
int iZ=newZ0-1; iZ<=newZ1+1; ++iZ) {
82 rhoField[1][blockLattice.
getCellId(iX, iY, iZ)] = partnerLattice1->
get(iX,iY,iZ).computeRho();
84 if (partners.size() > 1) {
85 for (
int iX=newX0-1; iX<=newX1+1; ++iX)
86 for (
int iY=newY0-1; iY<=newY1+1; ++iY)
87 for (
int iZ=newZ0-1; iZ<=newZ1+1; ++iZ) {
88 rhoField[2][blockLattice.
getCellId(iX, iY, iZ)] = partnerLattice2->
get(iX,iY,iZ).computeRho();
93 for (
int iX=newX0; iX<=newX1; ++iX) {
94 for (
int iY=newY0; iY<=newY1; ++iY) {
95 for (
int iZ=newZ0; iZ<=newZ1; ++iZ) {
96 T densitySum = rhoField[0][blockLattice.
getCellId(iX, iY, iZ)]
97 + rhoField[1][blockLattice.
getCellId(iX, iY, iZ)];
98 T densityDifference = rhoField[0][blockLattice.
getCellId(iX, iY, iZ)]
99 - rhoField[1][blockLattice.
getCellId(iX, iY, iZ)];
100 if (partners.size() > 1) {
101 densitySum -= rhoField[2][blockLattice.
getCellId(iX, iY, iZ)];
102 densityDifference -= rhoField[2][blockLattice.
getCellId(iX, iY, iZ)];
104 T term1 = 0.125 * kappa1 * (densitySum)
105 * (densitySum-1.) * (densitySum-2.);
106 T term2 = 0.125 * kappa2 * (densityDifference)
107 * (densityDifference-1.) * (densityDifference-2.);
109 if (partners.size() > 1) {
110 T rho3 = rhoField[2][blockLattice.
getCellId(iX, iY, iZ)];
111 term3 = kappa3 * rho3 * (rho3 - 1.) * (2.*rho3 - 1.);
114 T laplaceRho1 = 1.0 / 6.0 * (
115 rhoField[0][blockLattice.
getCellId(iX, iY-1, iZ-1)]
116 + rhoField[0][blockLattice.
getCellId(iX-1, iY, iZ-1)]
117 + 2. * rhoField[0][blockLattice.
getCellId(iX, iY, iZ-1)]
118 + rhoField[0][blockLattice.
getCellId(iX+1, iY, iZ-1)]
119 + rhoField[0][blockLattice.
getCellId(iX, iY+1, iZ-1)]
120 + rhoField[0][blockLattice.
getCellId(iX-1, iY-1, iZ)]
121 + 2. * rhoField[0][blockLattice.
getCellId(iX, iY-1, iZ)]
122 + rhoField[0][blockLattice.
getCellId(iX+1, iY-1, iZ)]
123 + 2. * rhoField[0][blockLattice.
getCellId(iX-1, iY, iZ)]
124 -24. * rhoField[0][blockLattice.
getCellId(iX, iY, iZ)]
125 + 2. * rhoField[0][blockLattice.
getCellId(iX+1, iY, iZ)]
126 + rhoField[0][blockLattice.
getCellId(iX-1, iY+1, iZ)]
127 + 2. * rhoField[0][blockLattice.
getCellId(iX, iY+1, iZ)]
128 + rhoField[0][blockLattice.
getCellId(iX+1, iY+1, iZ)]
129 + rhoField[0][blockLattice.
getCellId(iX, iY-1, iZ+1)]
130 + rhoField[0][blockLattice.
getCellId(iX-1, iY, iZ+1)]
131 + 2. * rhoField[0][blockLattice.
getCellId(iX, iY, iZ+1)]
132 + rhoField[0][blockLattice.
getCellId(iX+1, iY, iZ+1)]
133 + rhoField[0][blockLattice.
getCellId(iX, iY+1, iZ+1)]
136 T laplaceRho2 = 1.0 / 6.0 * (
137 rhoField[1][blockLattice.
getCellId(iX, iY-1, iZ-1)]
138 + rhoField[1][blockLattice.
getCellId(iX-1, iY, iZ-1)]
139 + 2. * rhoField[1][blockLattice.
getCellId(iX, iY, iZ-1)]
140 + rhoField[1][blockLattice.
getCellId(iX+1, iY, iZ-1)]
141 + rhoField[1][blockLattice.
getCellId(iX, iY+1, iZ-1)]
142 + rhoField[1][blockLattice.
getCellId(iX-1, iY-1, iZ)]
143 + 2. * rhoField[1][blockLattice.
getCellId(iX, iY-1, iZ)]
144 + rhoField[1][blockLattice.
getCellId(iX+1, iY-1, iZ)]
145 + 2. * rhoField[1][blockLattice.
getCellId(iX-1, iY, iZ)]
146 -24. * rhoField[1][blockLattice.
getCellId(iX, iY, iZ)]
147 + 2. * rhoField[1][blockLattice.
getCellId(iX+1, iY, iZ)]
148 + rhoField[1][blockLattice.
getCellId(iX-1, iY+1, iZ)]
149 + 2. * rhoField[1][blockLattice.
getCellId(iX, iY+1, iZ)]
150 + rhoField[1][blockLattice.
getCellId(iX+1, iY+1, iZ)]
151 + rhoField[1][blockLattice.
getCellId(iX, iY-1, iZ+1)]
152 + rhoField[1][blockLattice.
getCellId(iX-1, iY, iZ+1)]
153 + 2. * rhoField[1][blockLattice.
getCellId(iX, iY, iZ+1)]
154 + rhoField[1][blockLattice.
getCellId(iX+1, iY, iZ+1)]
155 + rhoField[1][blockLattice.
getCellId(iX, iY+1, iZ+1)]
159 if (partners.size() > 1) {
160 laplaceRho3 = 1.0 / 6.0 * (
161 rhoField[2][blockLattice.
getCellId(iX, iY-1, iZ-1)]
162 + rhoField[2][blockLattice.
getCellId(iX-1, iY, iZ-1)]
163 + 2. * rhoField[2][blockLattice.
getCellId(iX, iY, iZ-1)]
164 + rhoField[2][blockLattice.
getCellId(iX+1, iY, iZ-1)]
165 + rhoField[2][blockLattice.
getCellId(iX, iY+1, iZ-1)]
166 + rhoField[2][blockLattice.
getCellId(iX-1, iY-1, iZ)]
167 + 2. * rhoField[2][blockLattice.
getCellId(iX, iY-1, iZ)]
168 + rhoField[2][blockLattice.
getCellId(iX+1, iY-1, iZ)]
169 + 2. * rhoField[2][blockLattice.
getCellId(iX-1, iY, iZ)]
170 -24. * rhoField[2][blockLattice.
getCellId(iX, iY, iZ)]
171 + 2. * rhoField[2][blockLattice.
getCellId(iX+1, iY, iZ)]
172 + rhoField[2][blockLattice.
getCellId(iX-1, iY+1, iZ)]
173 + 2. * rhoField[2][blockLattice.
getCellId(iX, iY+1, iZ)]
174 + rhoField[2][blockLattice.
getCellId(iX+1, iY+1, iZ)]
175 + rhoField[2][blockLattice.
getCellId(iX, iY-1, iZ+1)]
176 + rhoField[2][blockLattice.
getCellId(iX-1, iY, iZ+1)]
177 + 2. * rhoField[2][blockLattice.
getCellId(iX, iY, iZ+1)]
178 + rhoField[2][blockLattice.
getCellId(iX+1, iY, iZ+1)]
179 + rhoField[2][blockLattice.
getCellId(iX, iY+1, iZ+1)]
184 blockLattice.
get(iX,iY,iZ).template setField<descriptors::CHEM_POTENTIAL>(
186 + 0.25*alpha*alpha*( (kappa2 - kappa1) * laplaceRho2
187 +(kappa2 + kappa1) * (laplaceRho3 - laplaceRho1) )
189 partnerLattice1->
get(iX, iY, iZ).template setField<descriptors::CHEM_POTENTIAL>(
191 + 0.25*alpha*alpha*( (kappa2 - kappa1) * (laplaceRho1 - laplaceRho3)
192 -(kappa2 + kappa1) * laplaceRho2 )
194 if (partners.size() > 1) {
195 partnerLattice2->
get(iX, iY, iZ).template setField<descriptors::CHEM_POTENTIAL>(
196 - term1 - term2 + term3
197 + 0.25*alpha*alpha*( (kappa2 + kappa1) * laplaceRho1
198 -(kappa2 - kappa1) * laplaceRho2
199 -(kappa2 + kappa1 + 4.*kappa3) * laplaceRho3 )
237 int x0_,
int x1_,
int y0_,
int y1_,
int z0_,
int z1_ )
243 if (partners.size() > 1) {
247 int newX0, newX1, newY0, newY1, newZ0, newZ1;
249 x0_, x1_, y0_, y1_, z0_, z1_,
250 newX0, newX1, newY0, newY1, newZ0, newZ1 ) ) {
252 for (
int iX=newX0; iX<=newX1; ++iX) {
253 for (
int iY=newY0; iY<=newY1; ++iY) {
254 for (
int iZ=newZ0; iZ<=newZ1; ++iZ) {
255 T phi = blockLattice.
get(iX,iY,iZ).computeRho();
256 T rho = partnerLattice1->
get(iX,iY,iZ).computeRho();
258 T gradMuPhiX = 1./12. * ( -blockLattice.
get(iX-1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
259 - blockLattice.
get(iX-1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
260 - blockLattice.
get(iX-1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
261 - 2.* blockLattice.
get(iX-1,iY,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
262 - blockLattice.
get(iX-1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
263 + blockLattice.
get(iX+1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
264 + 2.* blockLattice.
get(iX+1,iY,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
265 + blockLattice.
get(iX+1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
266 + blockLattice.
get(iX+1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
267 + blockLattice.
get(iX+1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>() );
268 T gradMuPhiY = 1./12. * ( -blockLattice.
get(iX-1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
269 - blockLattice.
get(iX+1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
270 - blockLattice.
get(iX,iY-1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
271 - 2.* blockLattice.
get(iX,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
272 - blockLattice.
get(iX,iY-1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
273 + blockLattice.
get(iX,iY+1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
274 + 2.* blockLattice.
get(iX,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
275 + blockLattice.
get(iX,iY+1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
276 + blockLattice.
get(iX-1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
277 + blockLattice.
get(iX+1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>() );
278 T gradMuPhiZ = 1./12. * ( -blockLattice.
get(iX,iY-1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
279 - blockLattice.
get(iX,iY+1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
280 - blockLattice.
get(iX-1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
281 - 2.* blockLattice.
get(iX,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
282 - blockLattice.
get(iX+1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
283 + blockLattice.
get(iX-1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
284 + 2.* blockLattice.
get(iX,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
285 + blockLattice.
get(iX+1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
286 + blockLattice.
get(iX,iY-1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
287 + blockLattice.
get(iX,iY+1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>() );
289 T gradMuRhoX = 1./12. * ( -partnerLattice1->
get(iX-1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
290 - partnerLattice1->
get(iX-1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
291 - partnerLattice1->
get(iX-1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
292 - 2.* partnerLattice1->
get(iX-1,iY,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
293 - partnerLattice1->
get(iX-1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
294 + partnerLattice1->
get(iX+1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
295 + 2.* partnerLattice1->
get(iX+1,iY,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
296 + partnerLattice1->
get(iX+1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
297 + partnerLattice1->
get(iX+1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
298 + partnerLattice1->
get(iX+1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>() );
299 T gradMuRhoY = 1./12. * ( -partnerLattice1->
get(iX-1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
300 - partnerLattice1->
get(iX+1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
301 - partnerLattice1->
get(iX,iY-1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
302 - 2.* partnerLattice1->
get(iX,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
303 - partnerLattice1->
get(iX,iY-1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
304 + partnerLattice1->
get(iX,iY+1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
305 + 2.* partnerLattice1->
get(iX,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
306 + partnerLattice1->
get(iX,iY+1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
307 + partnerLattice1->
get(iX-1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
308 + partnerLattice1->
get(iX+1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>() );
309 T gradMuRhoZ = 1./12. * ( -partnerLattice1->
get(iX,iY-1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
310 - partnerLattice1->
get(iX,iY+1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
311 - partnerLattice1->
get(iX-1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
312 - 2.* partnerLattice1->
get(iX,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
313 - partnerLattice1->
get(iX+1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
314 + partnerLattice1->
get(iX-1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
315 + 2.* partnerLattice1->
get(iX,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
316 + partnerLattice1->
get(iX+1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
317 + partnerLattice1->
get(iX,iY-1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
318 + partnerLattice1->
get(iX,iY+1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>() );
324 if (partners.size() > 1) {
325 psi = partnerLattice2->
get(iX,iY,iZ).computeRho();
326 gradMuPsiX = 1./12. * ( -partnerLattice2->
get(iX-1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
327 - partnerLattice2->
get(iX-1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
328 - partnerLattice2->
get(iX-1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
329 - 2.* partnerLattice2->
get(iX-1,iY,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
330 - partnerLattice2->
get(iX-1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
331 + partnerLattice2->
get(iX+1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
332 + 2.* partnerLattice2->
get(iX+1,iY,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
333 + partnerLattice2->
get(iX+1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
334 + partnerLattice2->
get(iX+1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
335 + partnerLattice2->
get(iX+1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>() );
336 gradMuPsiY = 1./12. * ( -partnerLattice2->
get(iX-1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
337 - partnerLattice2->
get(iX+1,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
338 - partnerLattice2->
get(iX,iY-1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
339 - 2.* partnerLattice2->
get(iX,iY-1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
340 - partnerLattice2->
get(iX,iY-1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
341 + partnerLattice2->
get(iX,iY+1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
342 + 2.* partnerLattice2->
get(iX,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
343 + partnerLattice2->
get(iX,iY+1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
344 + partnerLattice2->
get(iX-1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>()
345 + partnerLattice2->
get(iX+1,iY+1,iZ ).template getField<descriptors::CHEM_POTENTIAL>() );
346 gradMuPsiZ = 1./12. * ( -partnerLattice2->
get(iX,iY-1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
347 - partnerLattice2->
get(iX,iY+1,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
348 - partnerLattice2->
get(iX-1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
349 - 2.* partnerLattice2->
get(iX,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
350 - partnerLattice2->
get(iX+1,iY,iZ-1).template getField<descriptors::CHEM_POTENTIAL>()
351 + partnerLattice2->
get(iX-1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
352 + 2.* partnerLattice2->
get(iX,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
353 + partnerLattice2->
get(iX+1,iY,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
354 + partnerLattice2->
get(iX,iY-1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>()
355 + partnerLattice2->
get(iX,iY+1,iZ+1).template getField<descriptors::CHEM_POTENTIAL>() );
358 T forceX = -rho*gradMuRhoX - phi*gradMuPhiX - psi*gradMuPsiX;
359 T forceY = -rho*gradMuRhoY - phi*gradMuPhiY - psi*gradMuPsiY;
360 T forceZ = -rho*gradMuRhoZ - phi*gradMuPhiZ - psi*gradMuPsiZ;
361 partnerLattice1->
get(iX,iY,iZ).template setField<descriptors::FORCE>({forceX, forceY, forceZ});
363 partnerLattice1->
get(iX,iY,iZ).computeU(u);
364 blockLattice.
get(iX,iY,iZ).template setField<descriptors::FORCE>(u);
365 if (partners.size() > 1) {
366 partnerLattice2->
get(iX,iY,iZ).template setField<descriptors::FORCE>(u);