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

Go to the source code of this file.

Functions

void ComputePairForce (int normFlag)
 

Function Documentation

◆ ComputePairForce()

void ComputePairForce ( int normFlag)

Definition at line 27 of file ComputePairForce.c.

27 {
28double dr[NDIM+1], fcVal, rr, ri, r, uVal;
29int n, i,j;
30uVal = 0.0; uSumPair = 0.0 ;
31virSumPair = 0.0; virSumPairxx = 0.0; virSumPairyy = 0.0; virSumPairxy = 0.0;
32
33for(n = 1 ; n <= nAtom ; n ++){
34 fx[n] = 0.0;
35 fy[n] = 0.0;
36 discDragx[n] = 0.0;
37 discDragy[n] = 0.0;
38}
39for(n = 1; n <= nPairTotal; n ++){
40 PairID[n] = 0;
41 Pairatom1[n] = 0;
42 Pairatom2[n] = 0;
43 PairXij[n] = 0.0;
44 PairYij[n] = 0.0;
45}
46
47double vr[NDIM+1], fdVal, rri;
48nPairActive = 0;
49double meff;
50meff = 0.0;
51int atomIDi, atomIDj;
52double atomiMass, atomjMass;
53
54//int processThisPair = 1;
55
56for(i=1;i<=nAtomInterface;i++){
57 for(j=i+1;j<=nAtomInterface;j++){
58 atomIDi = atomIDInterface[i];
59 atomIDj = atomIDInterface[j];
60
61 if (isBonded[atomIDi][atomIDj] == 0) { //To have pair interaction between nonbonded atoms only
62 rr = 0.0; rri = 0.0; fcVal = 0.0; fdVal = 0.0; strech = 0.0;
63 RadiusIJ = 0.0;
64
65 dr[1] = rx[atomIDi] - rx[atomIDj];
66 if(dr[1] >= regionH[1])
67 dr[1] -= region[1];
68 else if(dr[1] < -regionH[1])
69 dr[1] += region[1];
70
71 dr[2] = ry[atomIDi] - ry[atomIDj];
72 if(dr[2] >= regionH[2]){
73 dr[1] -= shearDisplacement;
74 if(dr[1] < -regionH[1]) dr[1] += region[1];
75 dr[2] -= region[2];
76 }else if(dr[2] < -regionH[2]){
77 dr[1] += shearDisplacement;
78 if(dr[1] >= regionH[1]) dr[1] -= region[1];
79 dr[2] += region[2];
80 }
81
82 rr = Sqr(dr[1]) + Sqr(dr[2]);
83 RadiusIJ = atomRadius[atomIDi] + atomRadius[atomIDj];
85 if(rr < SqrRadiusIJ){
86 r = sqrt(rr);
87 ri = 1.0/r;
88 rri = 1.0/rr;
90 strech = (RadiusIJ - r);
91 uVal = 0.5 * Kn * Sqr(strech);
92
93 //NormFlag
94 if(normFlag == 1){
96 uVal = 0.5 * Kn * RadiusIJ * Sqr(strech);
97 }
98
99 fcVal = Kn * strech * ri;
100 vr[1] = vx[atomIDi] - vx[atomIDj];
101 vr[2] = vy[atomIDi] - vy[atomIDj];
102
103 nPairActive++;
105 Pairatom1[nPairActive] = atomIDi;
106 Pairatom2[nPairActive] = atomIDj;
107 PairXij[nPairActive] = dr[1];
108 PairYij[nPairActive] = dr[2];
109
110 //DampFlag = 1
111 if(DampFlag == 1){
112 atomiMass = atomMass[atomIDi];
113 atomjMass = atomMass[atomIDj];
114 meff = (atomiMass * atomjMass)/(atomiMass + atomjMass);
115 fdVal = -gamman * meff * (vr[1]*dr[1] + vr[2]*dr[2]) * rri; //disc-disc drag
116
117 discDragx[atomIDi] = fdVal * dr[1]; //disc-disc drag
118 discDragy[atomIDi] = fdVal * dr[2]; //disc-disc drag
119 discDragx[atomIDj] = -fdVal * dr[1]; //disc-disc drag
120 discDragy[atomIDj] = -fdVal * dr[2]; //disc-disc drag
121
122 discDragx[nPairActive] = discDragx[atomIDi];
123 discDragy[nPairActive] = discDragy[atomIDi];
124
125
126 fx[atomIDi] += (fcVal + fdVal) * dr[1];
127 fy[atomIDi] += (fcVal + fdVal) * dr[2];
128 fx[atomIDj] += -(fcVal + fdVal) * dr[1];
129 fy[atomIDj] += -(fcVal + fdVal) * dr[2];
130 }
131
132 //DampFlag = 2
133 else if(DampFlag == 2){
134 discDragx[atomIDi] = -gamman * vr[1]; //disc-disc drag
135 discDragy[atomIDi] = -gamman * vr[2]; //disc-disc drag
136 discDragx[atomIDj] = -(-gamman * vr[1]); //disc-disc drag
137 discDragy[atomIDj] = -(-gamman * vr[2]); //disc-disc drag
138
139 discDragx[nPairActive] = discDragx[atomIDi];
140 discDragy[nPairActive] = discDragy[atomIDi];
141
142 fx[atomIDi] += (fcVal * dr[1] - gamman * vr[1]);
143 fy[atomIDi] += (fcVal * dr[2] - gamman * vr[2]);
144 fx[atomIDj] += -(fcVal * dr[1] - gamman * vr[1]);
145 fy[atomIDj] += -(fcVal * dr[2] - gamman * vr[2]);
146 }
147
148 //In the following, for stress/virial term (fcVal + fdVal) is used since the total pair force = Hookean Interaction + relative velocity drag
149 uSumPair += 0.5 * uVal;
150 virSumPair += (fcVal + fdVal) * rr;
151 virSumPairxx += (fcVal + fdVal) * dr[1] * dr[1];
152 virSumPairyy += (fcVal + fdVal) * dr[2] * dr[2];
153 virSumPairxy += (fcVal + fdVal) * dr[1] * dr[2];
154 }
155 }
156 }
157 }
158}
int nAtom
Definition global.h:24
double * discDragy
Definition global.h:42
double * atomMass
double virSumPairyy
Definition global.h:88
double virSumPair
Definition global.h:88
int nPairTotal
#define NDIM
Definition global.h:13
double Kn
double region[2+1]
double RadiusIJInv
Definition global.h:27
double virSumPairxx
Definition global.h:88
int nPairActive
Definition global.h:62
double gamman
int ** isBonded
double SqrRadiusIJ
Definition global.h:27
double RadiusIJ
double * vx
Definition global.h:17
int nAtomInterface
int * atomIDInterface
double * rx
double * fy
Definition global.h:17
#define Sqr(x)
Definition global.h:14
double shearDisplacement
int DampFlag
double uSumPair
int * PairID
double * PairXij
double strech
double * atomRadius
int * Pairatom2
Definition global.h:63
double * PairYij
Definition global.h:64
double * discDragx
double * vy
Definition global.h:17
double regionH[2+1]
Definition global.h:20
double virSumPairxy
Definition global.h:88
double * fx
Definition global.h:17
int * Pairatom1
Definition global.h:63
double * ry
Definition global.h:17

References atomIDInterface, atomMass, atomRadius, DampFlag, discDragx, discDragy, fx, fy, gamman, isBonded, Kn, nAtom, nAtomInterface, NDIM, nPairActive, nPairTotal, Pairatom1, Pairatom2, PairID, PairXij, PairYij, RadiusIJ, RadiusIJInv, region, regionH, rx, ry, shearDisplacement, Sqr, SqrRadiusIJ, strech, uSumPair, virSumPair, virSumPairxx, virSumPairxy, virSumPairyy, vx, and vy.

Referenced by main().

+ Here is the caller graph for this function: