ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/mpiBASS.c
Revision: 998
Committed: Thu Jan 29 23:01:17 2004 UTC (20 years, 5 months ago) by gezelter
Content type: text/plain
File size: 9655 byte(s)
Log Message:
member list fixes for rigid bodies

File Contents

# Content
1 #ifdef IS_MPI
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5
6 #define __mpiBASSEVENT
7 #include "mpiBASS.h"
8 #include "simError.h"
9
10
11 void mpiCatchEvent(void);
12
13
14
15
16 void mpiEventInit(void)
17 {
18 int blockCounts[5] = {1,3,1,120,80};
19 MPI_Aint dspls[5];
20 MPI_Datatype types[5];
21 mBEvent protoEvent;
22
23 int i;
24
25 MPI_Address(&protoEvent.type, &dspls[0]);
26 MPI_Address(&protoEvent.d1, &dspls[1]);
27 MPI_Address(&protoEvent.i1, &dspls[2]);
28 MPI_Address(&protoEvent.cArray, &dspls[3]);
29 MPI_Address(&protoEvent.lhs , &dspls[4]);
30
31
32 types[0] = MPI_INT;
33 types[1] = MPI_DOUBLE;
34 types[2] = MPI_INT;
35 types[3] = MPI_CHAR;
36 types[4] = MPI_CHAR;
37
38
39 for (i =4; i >= 0; i--) dspls[i] -= dspls[0];
40
41 MPI_Type_struct(5,blockCounts,dspls,types,&mpiBASSEventType);
42 MPI_Type_commit(&mpiBASSEventType);
43 }
44
45
46 void throwMPIEvent(event* the_event)
47 {
48 mBEvent mpiEventContainer;
49 int mpiStatus;
50
51
52 if (the_event == NULL) mpiStatus = MPI_INTERFACE_DONE;
53 else mpiStatus = MPI_INTERFACE_CONTINUE;
54
55 MPI_Bcast(&mpiStatus,1,MPI_INT,0,MPI_COMM_WORLD);
56
57 if (!mpiStatus){
58 switch (the_event->event_type){
59 case MOLECULE:
60 mpiEventContainer.type = mpiMOLECULE;
61 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
62 break;
63
64 case RIGIDBODY:
65 mpiEventContainer.type = mpiRIGIDBODY;
66 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
67 break;
68
69 case ATOM:
70 mpiEventContainer.type = mpiATOM;
71 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
72 break;
73
74 case BOND:
75 mpiEventContainer.type = mpiBOND;
76 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
77 break;
78
79 case BEND:
80 mpiEventContainer.type = mpiBEND;
81 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
82 break;
83
84 case TORSION:
85 mpiEventContainer.type = mpiTORSION;
86 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
87 break;
88
89 case ZCONSTRAINT:
90 mpiEventContainer.type = mpiZCONSTRAINT;
91 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
92 break;
93
94 case COMPONENT:
95 mpiEventContainer.type = mpiCOMPONENT;
96 mpiEventContainer.i1 = the_event->evt.blk_index; // pack block index into first int
97 break;
98
99 case POSITION:
100 mpiEventContainer.type = mpiPOSITION;
101 mpiEventContainer.d1 = the_event->evt.pos.x; // pack pos coord into d
102 mpiEventContainer.d2 = the_event->evt.pos.y;
103 mpiEventContainer.d3 = the_event->evt.pos.z;
104 break;
105
106 case ORIENTATION:
107 mpiEventContainer.type = mpiORIENTATION;
108 mpiEventContainer.d1 = the_event->evt.ornt.phi; // pack orientation coord into d
109 mpiEventContainer.d2 = the_event->evt.ornt.theta;
110 mpiEventContainer.d3 = the_event->evt.ornt.psi;
111 break;
112
113 case CONSTRAINT:
114 mpiEventContainer.type = mpiCONSTRAINT;
115 mpiEventContainer.d1 = the_event->evt.cnstr; // pack constraint coord into d
116 break;
117
118 case MEMBERS:
119 mpiEventContainer.type = mpiMEMBERS;
120 mpiEventContainer.i1 = the_event->evt.mbrs.nMembers ; // pack member ints into i
121 break;
122
123 case ASSIGNMENT:
124
125 strcpy(mpiEventContainer.lhs,the_event->evt.asmt.lhs);
126
127 #ifdef MPIBASS_VERBOSE
128
129 fprintf(stderr,
130 "mpiDiag at node %d: evt Assignment: \"%s\" = ?\n"
131 " mpi Assignment: \"%s\" = ?\n",
132 worldRank,
133 the_event->evt.asmt.lhs,
134 mpiEventContainer.lhs);
135 #endif
136
137 switch (the_event->evt.asmt.asmt_type){
138 case STRING:
139 mpiEventContainer.type = mpiASSIGNMENT_s;
140 strcpy(mpiEventContainer.cArray,the_event->evt.asmt.rhs.sval);
141 break;
142
143 case INT:
144 mpiEventContainer.type = mpiASSIGNMENT_i;
145 mpiEventContainer.i1 = the_event->evt.asmt.rhs.ival;
146 break;
147
148 case DOUBLE:
149 mpiEventContainer.type = mpiASSIGNMENT_d;
150 mpiEventContainer.d1 = the_event->evt.asmt.rhs.dval;
151 break;
152 }
153 break;
154
155 case BLOCK_END:
156 mpiEventContainer.type = mpiBLOCK_END;
157 break;
158 }
159
160
161 MPI_Bcast(&mpiEventContainer,1,mpiBASSEventType,0,MPI_COMM_WORLD);
162
163 if (the_event->event_type == MEMBERS) {
164
165 // For member lists, we need a separate broadcast to spew out the
166 // membership array:
167 MPI_Bcast(the_event->evt.mbrs.memberList, the_event->evt.mbrs.nMembers,
168 MPI_INT, 0, MPI_COMM_WORLD);
169
170 }
171
172 sprintf( checkPointMsg,
173 "BASS Event broadcast successful" );
174
175 MPIcheckPoint();
176 }
177 }
178
179
180 // Everybody but node 0 runs this
181 void mpiEventLoop(void)
182 {
183 int mpiContinue;
184
185 #ifdef MPIBASS_VERBOSE
186 fprintf(stderr,
187 "event key List at node %d:\n"
188 " MOLECULE %d\n"
189 " ATOM %d\n"
190 " BOND %d\n"
191 " BEND %d\n"
192 " TORSION %d\n"
193 " COMPONENT %d\n"
194 " POSITION %d\n"
195 " ASSIGNMENT %d\n"
196 " MEMBERS %d\n"
197 " CONSTRAINT %d\n"
198 " ORIENTATION %d\n"
199 " ZCONSTRAINT %d\n"
200 " RIGIDBODY %d\n"
201 " BLOCK_END %d\n"
202 "\n",
203 worldRank,
204 MOLECULE, ATOM, BOND, BEND, TORSION, COMPONENT,
205 POSITION, ASSIGNMENT, MEMBERS, CONSTRAINT, ORIENTATION,
206 ZCONSTRAINT, RIGIDBODY, BLOCK_END );
207 #endif
208
209 MPI_Bcast(&mpiContinue,1,MPI_INT,0,MPI_COMM_WORLD);
210
211 while(!mpiContinue){
212
213 mpiCatchEvent();
214
215 MPI_Bcast(&mpiContinue,1,MPI_INT,0,MPI_COMM_WORLD);
216 }
217
218 if (mpiContinue == MPI_INTERFACE_ABORT){
219 MPI_Finalize();
220 exit (0);
221 }
222 }
223
224 void mpiCatchEvent(void)
225 {
226 event the_event;
227 mBEvent mpiEventContainer;
228
229
230 MPI_Bcast(&mpiEventContainer,1,mpiBASSEventType,0,MPI_COMM_WORLD);
231
232 switch (mpiEventContainer.type){
233 case mpiMOLECULE:
234 the_event.event_type = MOLECULE;
235 the_event.evt.blk_index = mpiEventContainer.i1;
236 break;
237
238 case mpiRIGIDBODY:
239 the_event.event_type = RIGIDBODY;
240 the_event.evt.blk_index = mpiEventContainer.i1;
241 break;
242
243 case mpiATOM:
244 the_event.event_type = ATOM;
245 the_event.evt.blk_index = mpiEventContainer.i1;
246 break;
247
248 case mpiBOND:
249 the_event.event_type = BOND;
250 the_event.evt.blk_index = mpiEventContainer.i1;
251 break;
252
253 case mpiBEND:
254 the_event.event_type = BEND;
255 the_event.evt.blk_index = mpiEventContainer.i1;
256 break;
257
258 case mpiTORSION:
259 the_event.event_type = TORSION;
260 the_event.evt.blk_index = mpiEventContainer.i1;
261 break;
262
263 case mpiZCONSTRAINT:
264 the_event.event_type = ZCONSTRAINT;
265 the_event.evt.blk_index = mpiEventContainer.i1;
266 break;
267
268 case mpiCOMPONENT:
269 the_event.event_type = COMPONENT;
270 the_event.evt.blk_index = mpiEventContainer.i1;
271 break;
272
273
274 case mpiPOSITION:
275 the_event.event_type = POSITION;
276 the_event.evt.pos.x = mpiEventContainer.d1;
277 the_event.evt.pos.y = mpiEventContainer.d2;
278 the_event.evt.pos.z = mpiEventContainer.d3;
279 break;
280
281 case mpiORIENTATION:
282 the_event.event_type = ORIENTATION;
283 the_event.evt.ornt.phi = mpiEventContainer.d1;
284 the_event.evt.ornt.theta = mpiEventContainer.d2;
285 the_event.evt.ornt.psi = mpiEventContainer.d3;
286 break;
287
288 case mpiCONSTRAINT:
289 the_event.event_type = CONSTRAINT;
290 the_event.evt.cnstr = mpiEventContainer.d1;
291 break;
292
293 case mpiMEMBERS:
294 the_event.event_type = MEMBERS;
295 the_event.evt.mbrs.nMembers = mpiEventContainer.i1;
296
297 the_event.evt.mbrs.memberList = (int *) calloc(the_event.evt.mbrs.nMembers,
298 sizeof(int));
299
300 // Grab the member list since we have a number of members:
301 MPI_Bcast(the_event.evt.mbrs.memberList, the_event.evt.mbrs.nMembers,
302 MPI_INT, 0, MPI_COMM_WORLD);
303
304 break;
305
306 case mpiASSIGNMENT_s:
307 the_event.event_type = ASSIGNMENT;
308 the_event.evt.asmt.asmt_type = STRING;
309 strcpy(the_event.evt.asmt.lhs,mpiEventContainer.lhs);
310 strcpy(the_event.evt.asmt.rhs.sval,mpiEventContainer.cArray);
311
312 #ifdef MPIBASS_VERBOSE
313
314 fprintf(stderr, "mpiDiag at node %d: Assignment: %s = %s\n", worldRank,
315 the_event.evt.asmt.lhs,
316 the_event.evt.asmt.rhs.sval );
317 #endif
318
319 break;
320
321 case mpiASSIGNMENT_i:
322 the_event.event_type = ASSIGNMENT;
323 the_event.evt.asmt.asmt_type = INT;
324 strcpy(the_event.evt.asmt.lhs,mpiEventContainer.lhs);
325 the_event.evt.asmt.rhs.ival = mpiEventContainer.i1;
326
327 #ifdef MPIBASS_VERBOSE
328
329 fprintf(stderr, "mpiDiag at node %d: Assignment: %s = %d\n", worldRank,
330 the_event.evt.asmt.lhs,
331 the_event.evt.asmt.rhs.ival );
332 #endif
333
334 break;
335
336 case mpiASSIGNMENT_d:
337 the_event.event_type = ASSIGNMENT;
338 the_event.evt.asmt.asmt_type = DOUBLE;
339 strcpy(the_event.evt.asmt.lhs,mpiEventContainer.lhs);
340 the_event.evt.asmt.rhs.dval = mpiEventContainer.d1;
341
342 #ifdef MPIBASS_VERBOSE
343
344 fprintf(stderr, "mpiDiag at node %d: Assignment: %s = %lf\n", worldRank,
345 the_event.evt.asmt.lhs,
346 the_event.evt.asmt.rhs.dval );
347 #endif
348
349 break;
350
351 case mpiBLOCK_END:
352 the_event.event_type = BLOCK_END;
353 break;
354 }
355
356 #ifdef MPIBASS_VERBOSE
357
358 fprintf(stderr, "mpiDiag at node %d: event type is %d\n", worldRank,
359 the_event.event_type);
360 #endif
361
362 if (!event_handler(&the_event)){
363
364 sprintf(painCave.errMsg,
365 "MPI event handling error at node %d => %s\n",
366 worldRank,
367 the_event.err_msg);
368 painCave.isFatal = 1;
369 simError();
370 }
371 MPIcheckPoint();
372 }
373
374
375 void mpiInterfaceExit(void){
376 int mpiStatus = MPI_INTERFACE_ABORT;
377
378 MPI_Bcast(&mpiStatus,1,MPI_INT,0,MPI_COMM_WORLD);
379 MPI_Finalize();
380 exit (0);
381
382 }
383 #endif