Lemina
A molecular dynamics package for network, granular material and point particles with a range of interaction potential.
 
Loading...
Searching...
No Matches
ComputeForcesCells.c File Reference
#include <stdio.h>
#include <math.h>
#include "global.h"
+ Include dependency graph for ComputeForcesCells.c:

Go to the source code of this file.

Functions

void ComputeForcesCells ()
 

Function Documentation

◆ ComputeForcesCells()

void ComputeForcesCells ( )

Definition at line 25 of file ComputeForcesCells.c.

25 {
26 double dr[NDIM+1], invWid[NDIM+1], shift[NDIM+1], f, fcVal, rr, ri, r, uVal;
27 int c, I, J, m1, m1X, m1Y, m2, m2X, m2Y, n, offset;
28 int iofX[] = {0, 0, 1, 1, 0, -1, -1, -1, 0, 1},
29 iofY[] = {0, 0, 0, 1 ,1, 1, 0, -1, -1, -1};
30
31 invWid[1] = cells[1]/region[1];
32 invWid[2] = cells[2]/region[2];
33
34 for(n = nAtom+1; n <= nAtom+cells[1]*cells[2] ; n++)
35 cellList[n] = 0;
36
37 for(n = 1 ; n <= nAtom ; n ++){
38 c = ((int)((ry[n] + regionH[2])*invWid[2]))*cells[1] + (int)((rx[n]+regionH[1])*invWid[1]) + nAtom+ 1;
39 cellList[n] = cellList[c];
40 cellList[c] = n;
41 }
42
43 for(n = 1 ; n <= nAtom ; n ++){
44 ax[n] = 0.;
45 ay[n] = 0.;
46 }
47
48 uSum = 0.0 ;
49 virSum = 0.0;
50 rfAtom = 0.0;
51 RadiusIJ = 0.0;
52
53 gamman = 1.0;
54 double vr[NDIM+1], fd, fdVal, rrinv;
55 rrinv = 0.0;
56 fd = 0.0;
57 fdVal = 0.0;
58
59 int start = 1 + rank*(cells[2]/size);
60 int end = (rank+1)*(cells[2]/size);
61
62 for(m1Y = start ; m1Y <= end ; m1Y ++){
63 for(m1X = 1 ; m1X <= cells[1] ; m1X ++){
64 m1 = (m1Y-1) * cells[1] + m1X + nAtom;
65 for(offset = 1 ; offset <= 9 ; offset ++){
66 m2X = m1X + iofX[offset]; shift[1] = 0.;
67 if(m2X > cells[1]){
68 m2X = 1; shift[1] = region[1];
69 }else if(m2X == 0){
70 m2X = cells[1]; shift[1] = -region[1];
71 }
72 m2Y = m1Y + iofY[offset]; shift[2] = 0.;
73 if(m2Y > cells[2]){
74 m2Y = 1; shift[2] = region[2];
75 }else if(m2Y == 0){
76 m2Y = cells[2]; shift[2] = -region[2];
77 }
78 m2 = (m2Y-1)*cells[1] + m2X + nAtom;
79 I = cellList[m1];
80 while(I > 0){
81 J = cellList[m2];
82 while(J > 0){
83 if(m1 == m2 && J != I && (atomRadius[I] > 0. && atomRadius[J] > 0.)){
84 dr[1] = rx[I] - rx[J] - shift[1];
85 dr[2] = ry[I] - ry[J] - shift[2];
86 rr = Sqr(dr[1]) + Sqr(dr[2]);
89 if(rr < SqrRadiusIJ){
90 r = sqrt(rr);
91 ri = 1.0/r;
92 rrinv = 1.0/rr;
93 vr[1] = vx[I] - vx[J];
94 vr[2] = vy[I] - vy[J];
96 uVal = Sqr(1.0 - r * RadiusIJInv);
97 fcVal = 2.0 * RadiusIJInv * (1.0 - r * RadiusIJInv) *ri;
98 fdVal = -gamman * (vr[1]*dr[1] + vr[2]*dr[2]) * rrinv; //disc-disc drag
99
100 f = fcVal * dr[1];
101 fd = fdVal * dr[1];
102 ax[I] += (f + fd);
103 discDragx[I] += fd; //disc-disc drag
104
105 f = fcVal * dr[2];
106 fd = fdVal * dr[2];
107 ay[I] += (f + fd);
108 discDragy[I] += fd; //disc-disc drag
109
110 uSum += 0.5 * uVal;
111 virSum += 0.5 * fcVal * rr;
112 rfAtom += 0.5 * dr[1] * fcVal * dr[2];
113 }
114 }else if(m1 != m2 && (atomRadius[I] > 0. && atomRadius[J] > 0.)){
115 dr[1] = rx[I] - rx[J] - shift[1];
116 dr[2] = ry[I] - ry[J] - shift[2];
117 rr = Sqr(dr[1]) + Sqr(dr[2]);
120 if(rr < SqrRadiusIJ){
121 r = sqrt(rr);
122 ri = 1.0/r;
123 rrinv = 1.0/r;
124 vr[1] = vx[I] - vx[J];
125 vr[2] = vy[I] - vy[J];
126 RadiusIJInv = 1.0/RadiusIJ;
127 uVal = Sqr(1.0 - r * RadiusIJInv);
128 fcVal = 2.0 * RadiusIJInv * (1.0 - r * RadiusIJInv) *ri;
129 fdVal = -gamman * (vr[1]*dr[1] + vr[2]*dr[2]) * rrinv; //disc-disc drag
130
131 f = fcVal * dr[1];
132 fd = fdVal * dr[1];
133 ax[I] += (f + fd);
134 discDragx[I] += fd; //disc-disc drag
135
136 f = fcVal * dr[2];
137 fd = fdVal * dr[2];
138 ay[I] += (f + fd);
139 discDragy[I] += fd; //disc-disc drag
140
141 uSum += 0.5 * uVal;
142 virSum += 0.5 * fcVal * rr;
143 rfAtom += 0.5 * dr[1] * fcVal * dr[2];
144 }
145 }
146 J = cellList[J];
147 }
148 I = cellList[I];
149 }
150 }
151 }
152 }
153}
int nAtom
Definition global.h:24
double * discDragy
Definition global.h:42
int cells[2+1]
Definition global.h:83
#define NDIM
Definition global.h:13
double rfAtom
int size
Definition global.h:84
double region[2+1]
double RadiusIJInv
Definition global.h:27
double gamman
int * cellList
double * ay
Definition global.h:17
double SqrRadiusIJ
Definition global.h:27
double RadiusIJ
double * vx
Definition global.h:17
int rank
double * rx
double * ax
Definition global.h:17
#define Sqr(x)
Definition global.h:14
double uSum
Definition global.h:21
double * atomRadius
double virSum
Definition global.h:21
double * discDragx
double * vy
Definition global.h:17
double regionH[2+1]
Definition global.h:20
double * ry
Definition global.h:17

References atomRadius, ax, ay, cellList, cells, discDragx, discDragy, gamman, nAtom, NDIM, RadiusIJ, RadiusIJInv, rank, region, regionH, rfAtom, rx, ry, size, Sqr, SqrRadiusIJ, uSum, virSum, vx, and vy.