ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/utils/bilayerSys.cpp
Revision: 506
Committed: Fri Apr 25 16:02:26 2003 UTC (22 years ago) by mmeineke
File size: 5724 byte(s)
Log Message:
i quick fix to th distance in the random bilayer builder

File Contents

# Content
1 #include <iostream>
2
3 #include <cstdlib>
4 #include <cstring>
5 #include <cmath>
6
7 #include "simError.h"
8 #include "SimInfo.hpp"
9 #include "ReadWrite.hpp"
10
11 #include "MoLocator.hpp"
12 #include "sysBuild.hpp"
13 #include "bilayerSys.hpp"
14
15
16 int buildRandomBilayer( void );
17
18 void getRandomRot( double rot[3][3] );
19
20 int buildBilayer( int isRandom ){
21
22 if( isRandom ){
23 return buildRandomBilayer();
24 }
25 else{
26 sprintf( painCave.errMsg,
27 "Cannot currently create a non-random bilayer.\n" );
28 painCave.isFatal = 1;
29 simError();
30 return 0;
31 }
32 }
33
34
35
36 int buildRandomBilayer( void ){
37
38 int i,j,k;
39 int nAtoms, atomIndex, molIndex, molID;
40 int* molSeq;
41 int* molMap;
42 int* molStart;
43 int* cardDeck;
44 int deckSize;
45 int rSite, rCard;
46 double cell;
47 int nCells, nSites, siteIndex;
48 double rot[3][3];
49 double pos[3];
50
51 Atom** atoms;
52 SimInfo* simnfo;
53 DumpWriter* writer;
54 MoLocator** locate;
55
56 // initialize functions and variables
57
58 srand48( RAND_SEED );
59 molSeq = NULL;
60 molStart = NULL;
61 molMap = NULL;
62 cardDeck = NULL;
63 atoms = NULL;
64 locate = NULL;
65 simnfo = NULL;
66 writer = NULL;
67
68 // calculate the number of cells in the fcc box
69
70 nCells = 0;
71 nSites = 0;
72 while( nSites < bsInfo.totNmol ){
73 nCells++;
74 nSites = 4.0 * pow( (double)nCells, 3.0 );
75 }
76
77
78 // create the molMap and cardDeck arrays
79
80 molMap = new int[nSites];
81 cardDeck = new int[nSites];
82
83 for(i=0; i<nSites; i++){
84 molMap[i] = -1;
85 cardDeck[i] = i;
86 }
87
88 // randomly place the molecules on the sites
89
90 deckSize = nSites;
91 for(i=0; i<bsInfo.totNmol; i++){
92 rCard = (int)( deckSize * drand48() );
93 rSite = cardDeck[rCard];
94 molMap[rSite] = i;
95
96 // book keep the card deck;
97
98 deckSize--;
99 cardDeck[rCard] = cardDeck[deckSize];
100 }
101
102
103 // create the MoLocator and Atom arrays
104
105 nAtoms = 0;
106 molIndex = 0;
107 locate = new MoLocator*[bsInfo.nComponents];
108 molSeq = new int[bsInfo.totNmol];
109 molStart = new int[bsInfo.totNmol];
110 for(i=0; i<bsInfo.nComponents; i++){
111 locate[i] = new MoLocator( bsInfo.compStamps[i] );
112 for(j=0; j<bsInfo.componentsNmol[i]; j++){
113 molSeq[molIndex] = i;
114 molStart[molIndex] = nAtoms;
115 molIndex++;
116 nAtoms += bsInfo.compStamps[i]->getNAtoms();
117 }
118 }
119
120 Atom::createArrays( nAtoms );
121 atoms = new Atom*[nAtoms];
122
123
124 // place the molecules at each FCC site
125
126 cell = 5.0;
127 for(i=0; i<bsInfo.nComponents; i++){
128 if(cell < locate[i]->getMaxLength() ) cell = locate[i]->getMaxLength();
129 }
130 cell *= 1.2; // add a little buffer
131
132 cell *= M_SQRT2;
133
134 siteIndex = 0;
135 for(i=0; i<nCells; i++){
136 for(j=0; j<nCells; j++){
137 for(k=0; k<nCells; k++){
138
139 if( molMap[siteIndex] >= 0 ){
140 pos[0] = i * cell;
141 pos[1] = j * cell;
142 pos[2] = k * cell;
143
144 getRandomRot( rot );
145 molID = molSeq[molMap[siteIndex]];
146 atomIndex = molStart[ molMap[siteIndex] ];
147 locate[molID]->placeMol( pos, rot, atoms, atomIndex );
148 }
149 siteIndex++;
150
151 if( molMap[siteIndex] >= 0 ){
152 pos[0] = i * cell + (0.5 * cell);
153 pos[1] = j * cell;
154 pos[2] = k * cell + (0.5 * cell);
155
156 getRandomRot( rot );
157 molID = molSeq[molMap[siteIndex]];
158 atomIndex = molStart[ molMap[siteIndex] ];
159 locate[molID]->placeMol( pos, rot, atoms, atomIndex );
160 }
161 siteIndex++;
162
163 if( molMap[siteIndex] >= 0 ){
164 pos[0] = i * cell + (0.5 * cell);
165 pos[1] = j * cell + (0.5 * cell);
166 pos[2] = k * cell;
167
168 getRandomRot( rot );
169 molID = molSeq[molMap[siteIndex]];
170 atomIndex = molStart[ molMap[siteIndex] ];
171 locate[molID]->placeMol( pos, rot, atoms, atomIndex );
172 }
173 siteIndex++;
174
175 if( molMap[siteIndex] >= 0 ){
176 pos[0] = i * cell;
177 pos[1] = j * cell + (0.5 * cell);
178 pos[2] = k * cell + (0.5 * cell);
179
180 getRandomRot( rot );
181 molID = molSeq[molMap[siteIndex]];
182 atomIndex = molStart[ molMap[siteIndex] ];
183 locate[molID]->placeMol( pos, rot, atoms, atomIndex );
184 }
185 siteIndex++;
186 }
187 }
188 }
189
190 // set up the SimInfo object
191
192 bsInfo.boxX = nCells * cell;
193 bsInfo.boxY = nCells * cell;
194 bsInfo.boxZ = nCells * cell;
195
196 simnfo = new SimInfo();
197 simnfo->n_atoms = nAtoms;
198 simnfo->box_x = bsInfo.boxX;
199 simnfo->box_y = bsInfo.boxY;
200 simnfo->box_z = bsInfo.boxZ;
201
202 sprintf( simnfo->sampleName, "%s.dump", bsInfo.outPrefix );
203 sprintf( simnfo->finalName, "%s.init", bsInfo.outPrefix );
204
205 simnfo->atoms = atoms;
206
207 // set up the writer and write out
208
209 writer = new DumpWriter( simnfo );
210 writer->writeFinal();
211
212 // clean up the memory
213
214 if( molMap != NULL ) delete[] molMap;
215 if( cardDeck != NULL ) delete[] cardDeck;
216 if( locate != NULL ){
217 for(i=0; i<bsInfo.nComponents; i++){
218 delete locate[i];
219 }
220 delete[] locate;
221 }
222 if( atoms != NULL ){
223 for(i=0; i<nAtoms; i++){
224 delete atoms[i];
225 }
226 Atom::destroyArrays();
227 delete[] atoms;
228 }
229 if( molSeq != NULL ) delete[] molSeq;
230 if( simnfo != NULL ) delete simnfo;
231 if( writer != NULL ) delete writer;
232
233 return 1;
234 }
235
236
237 void getRandomRot( double rot[3][3] ){
238
239 double theta, phi, psi;
240 double cosTheta;
241
242 // select random phi, psi, and cosTheta
243
244 phi = 2.0 * M_PI * drand48();
245 psi = 2.0 * M_PI * drand48();
246 cosTheta = (2.0 * drand48()) - 1.0; // sample cos -1 to 1
247
248 theta = acos( cosTheta );
249
250 rot[0][0] = (cos(phi) * cos(psi)) - (sin(phi) * cos(theta) * sin(psi));
251 rot[0][1] = (sin(phi) * cos(psi)) + (cos(phi) * cos(theta) * sin(psi));
252 rot[0][2] = sin(theta) * sin(psi);
253
254 rot[1][0] = -(cos(phi) * sin(psi)) - (sin(phi) * cos(theta) * cos(psi));
255 rot[1][1] = -(sin(phi) * sin(psi)) + (cos(phi) * cos(theta) * cos(psi));
256 rot[1][2] = sin(theta) * cos(psi);
257
258 rot[2][0] = sin(phi) * sin(theta);
259 rot[2][1] = -cos(phi) * sin(theta);
260 rot[2][2] = cos(theta);
261 }
262