Lemina
A molecular dynamics package for network, granular material and point particles with a range of interaction potential.
 
Loading...
Searching...
No Matches
ComputePairForce.c
Go to the documentation of this file.
1/*
2 * This file is part of Lamina.
3 *
4 * Lamina is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * Lamina is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Lamina. If not, see <https://www.gnu.org/licenses/>.
16
17 Copyright (C) 2025 Harish Charan, University of Durham, UK
18
19 */
20
21#include "ComputePairForce.h"
22
23#include<stdio.h>
24#include<math.h>
25#include"global.h"
26
27void ComputePairForce(int normFlag){
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}
159
160
161
void ComputePairForce(int normFlag)
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