ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/DumpWriter.cpp
Revision: 469
Committed: Mon Apr 7 20:06:31 2003 UTC (21 years, 3 months ago) by mmeineke
File size: 14284 byte(s)
Log Message:
bug fixes

File Contents

# Content
1 #include <cstring>
2 #include <iostream>
3 #include <fstream>
4
5 #ifdef IS_MPI
6 #include <mpi.h>
7 #include "mpiSimulation.hpp"
8 #define TAKE_THIS_TAG_CHAR 1
9 #define TAKE_THIS_TAG_INT 2
10
11 namespace dWrite{
12 void nodeZeroError( void );
13 void anonymousNodeDie( void );
14 }
15
16 using namespace dWrite;
17 #endif //is_mpi
18
19 #include "ReadWrite.hpp"
20 #include "simError.h"
21
22 DumpWriter::DumpWriter( SimInfo* the_entry_plug ){
23
24 entry_plug = the_entry_plug;
25
26 std::cerr << "Look at me I'm a freebird!\n";
27
28 #ifdef IS_MPI
29 if(worldRank == 0 ){
30 #endif // is_mpi
31
32
33
34 strcpy( outName, entry_plug->sampleName );
35
36 outFile.open(outName, ios::out | ios::trunc );
37
38 if( !outFile ){
39
40 sprintf( painCave.errMsg,
41 "Could not open \"%s\" for dump output.\n",
42 outName);
43 painCave.isFatal = 1;
44 simError();
45 }
46
47 std::cerr << "me TOO!\n";
48
49 //outFile.setf( ios::scientific );
50
51 #ifdef IS_MPI
52 }
53
54 sprintf( checkPointMsg,
55 "Sucessfully opened output file for dumping.\n");
56 MPIcheckPoint();
57 #endif // is_mpi
58 }
59
60 DumpWriter::~DumpWriter( ){
61
62 #ifdef IS_MPI
63 if(worldRank == 0 ){
64 #endif // is_mpi
65
66 outFile.close();
67
68 #ifdef IS_MPI
69 }
70 #endif // is_mpi
71 }
72
73 void DumpWriter::writeDump( double currentTime ){
74
75 const int BUFFERSIZE = 2000;
76 char tempBuffer[BUFFERSIZE];
77 char writeLine[BUFFERSIZE];
78
79 int i, j, which_node, done, which_atom, local_index;
80 double q[4];
81 DirectionalAtom* dAtom;
82 int nAtoms = entry_plug->n_atoms;
83 Atom** atoms = entry_plug->atoms;
84
85
86 #ifndef IS_MPI
87
88 outFile << nAtoms << "\n";
89
90 outFile << currentTime << "\t"
91 << entry_plug->box_x << "\t"
92 << entry_plug->box_y << "\t"
93 << entry_plug->box_z << "\n";
94
95 for( i=0; i<nAtoms; i++ ){
96
97
98 sprintf( tempBuffer,
99 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
100 atoms[i]->getType(),
101 atoms[i]->getX(),
102 atoms[i]->getY(),
103 atoms[i]->getZ(),
104 atoms[i]->get_vx(),
105 atoms[i]->get_vy(),
106 atoms[i]->get_vz());
107 strcpy( writeLine, tempBuffer );
108
109 if( atoms[i]->isDirectional() ){
110
111 dAtom = (DirectionalAtom *)atoms[i];
112 dAtom->getQ( q );
113
114 sprintf( tempBuffer,
115 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
116 q[0],
117 q[1],
118 q[2],
119 q[3],
120 dAtom->getJx(),
121 dAtom->getJy(),
122 dAtom->getJz());
123 strcat( writeLine, tempBuffer );
124 }
125 else
126 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
127
128 outFile << writeLine;
129 }
130 outFile.flush();
131
132 #else // is_mpi
133
134 // first thing first, suspend fatalities.
135 painCave.isEventLoop = 1;
136
137 int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
138 int haveError;
139
140 MPI_Status istatus;
141 int *AtomToProcMap = mpiSim->getAtomToProcMap();
142
143 // write out header and node 0's coordinates
144
145 if( worldRank == 0 ){
146 outFile << mpiSim->getTotAtoms() << "\n";
147
148 outFile << currentTime << "\t"
149 << entry_plug->box_x << "\t"
150 << entry_plug->box_y << "\t"
151 << entry_plug->box_z << "\n";
152 outFile.flush();
153 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
154 // Get the Node number which has this atom;
155
156 which_node = AtomToProcMap[i];
157
158 if (which_node == 0 ) {
159
160 haveError = 0;
161 which_atom = i;
162 local_index=-1;
163 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
164 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
165 }
166 if (local_index != -1) {
167 //format the line
168 sprintf( tempBuffer,
169 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
170 atoms[local_index]->getType(),
171 atoms[local_index]->getX(),
172 atoms[local_index]->getY(),
173 atoms[local_index]->getZ(),
174 atoms[local_index]->get_vx(),
175 atoms[local_index]->get_vy(),
176 atoms[local_index]->get_vz()); // check here.
177 strcpy( writeLine, tempBuffer );
178
179 if( atoms[local_index]->isDirectional() ){
180
181 dAtom = (DirectionalAtom *)atoms[local_index];
182 dAtom->getQ( q );
183
184 sprintf( tempBuffer,
185 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
186 q[0],
187 q[1],
188 q[2],
189 q[3],
190 dAtom->getJx(),
191 dAtom->getJy(),
192 dAtom->getJz());
193 strcat( writeLine, tempBuffer );
194
195 }
196 else
197 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
198 }
199 else {
200 sprintf(painCave.errMsg,
201 "Atom %d not found on processor %d\n",
202 i, worldRank );
203 haveError= 1;
204 simError();
205 }
206
207 if(haveError) nodeZeroError();
208
209 }
210 else {
211 myStatus = 1;
212 MPI_Send(&myStatus, 1, MPI_INT, which_node,
213 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
214 MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
215 MPI_COMM_WORLD);
216 MPI_Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
217 TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
218 MPI_Recv(&myStatus, 1, MPI_INT, which_node,
219 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
220
221 if(!myStatus) nodeZeroError();
222
223 }
224
225 outFile << writeLine;
226 outFile.flush();
227 }
228
229 // kill everyone off:
230 myStatus = -1;
231 for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
232 MPI_Send(&myStatus, 1, MPI_INT, j,
233 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
234 }
235
236 } else {
237
238 done = 0;
239 while (!done) {
240
241 MPI_Recv(&myStatus, 1, MPI_INT, 0,
242 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
243
244 if(!myStatus) anonymousNodeDie();
245
246 if(myStatus < 0) break;
247
248 MPI_Recv(&which_atom, 1, MPI_INT, 0,
249 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
250
251 myStatus = 1;
252 local_index=-1;
253 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
254 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
255 }
256 if (local_index != -1) {
257 //format the line
258 sprintf( tempBuffer,
259 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
260 atoms[local_index]->getType(),
261 atoms[local_index]->getX(),
262 atoms[local_index]->getY(),
263 atoms[local_index]->getZ(),
264 atoms[local_index]->get_vx(),
265 atoms[local_index]->get_vy(),
266 atoms[local_index]->get_vz()); // check here.
267 strcpy( writeLine, tempBuffer );
268
269 if( atoms[local_index]->isDirectional() ){
270
271 dAtom = (DirectionalAtom *)atoms[local_index];
272 dAtom->getQ( q );
273
274 sprintf( tempBuffer,
275 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
276 q[0],
277 q[1],
278 q[2],
279 q[3],
280 dAtom->getJx(),
281 dAtom->getJy(),
282 dAtom->getJz());
283 strcat( writeLine, tempBuffer );
284 }
285 else{
286 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
287 }
288 }
289 else {
290 sprintf(painCave.errMsg,
291 "Atom %d not found on processor %d\n",
292 which_atom, worldRank );
293 myStatus = 0;
294 simError();
295
296 strcpy( writeLine, "Hello, I'm an error.\n");
297 }
298
299 MPI_Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
300 TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
301 MPI_Send( &myStatus, 1, MPI_INT, 0,
302 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
303 }
304 }
305 outFile.flush();
306 sprintf( checkPointMsg,
307 "Sucessfully took a dump.\n");
308 MPIcheckPoint();
309
310 // last thing last, enable fatalities.
311 painCave.isEventLoop = 0;
312
313 #endif // is_mpi
314 }
315
316 void DumpWriter::writeFinal(){
317
318 char finalName[500];
319 ofstream finalOut;
320
321 const int BUFFERSIZE = 2000;
322 char tempBuffer[BUFFERSIZE];
323 char writeLine[BUFFERSIZE];
324
325 double q[4];
326 DirectionalAtom* dAtom;
327 int nAtoms = entry_plug->n_atoms;
328 Atom** atoms = entry_plug->atoms;
329 int i, j, which_node, done, game_over, which_atom, local_index;
330
331
332 #ifdef IS_MPI
333 if(worldRank == 0 ){
334 #endif // is_mpi
335
336 strcpy( finalName, entry_plug->finalName );
337
338 finalOut.open( finalName, ios::out | ios::trunc );
339 if( !finalOut ){
340 sprintf( painCave.errMsg,
341 "Could not open \"%s\" for final dump output.\n",
342 finalName );
343 painCave.isFatal = 1;
344 simError();
345 }
346
347 // finalOut.setf( ios::scientific );
348
349 #ifdef IS_MPI
350 }
351
352 sprintf(checkPointMsg,"Opened file for final configuration\n");
353 MPIcheckPoint();
354
355 #endif //is_mpi
356
357
358 #ifndef IS_MPI
359
360 finalOut << nAtoms << "\n";
361
362 finalOut << entry_plug->box_x << "\t"
363 << entry_plug->box_y << "\t"
364 << entry_plug->box_z << "\n";
365
366 for( i=0; i<nAtoms; i++ ){
367
368 sprintf( tempBuffer,
369 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
370 atoms[i]->getType(),
371 atoms[i]->getX(),
372 atoms[i]->getY(),
373 atoms[i]->getZ(),
374 atoms[i]->get_vx(),
375 atoms[i]->get_vy(),
376 atoms[i]->get_vz());
377 strcpy( writeLine, tempBuffer );
378
379 if( atoms[i]->isDirectional() ){
380
381 dAtom = (DirectionalAtom *)atoms[i];
382 dAtom->getQ( q );
383
384 sprintf( tempBuffer,
385 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
386 q[0],
387 q[1],
388 q[2],
389 q[3],
390 dAtom->getJx(),
391 dAtom->getJy(),
392 dAtom->getJz());
393 strcat( writeLine, tempBuffer );
394 }
395 else
396 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
397
398 finalOut << writeLine;
399 }
400 finalOut.flush();
401 finalOut.close();
402
403 #else // is_mpi
404
405 // first thing first, suspend fatalities.
406 painCave.isEventLoop = 1;
407
408 int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
409 int haveError;
410
411 MPI_Status istatus;
412 int *AtomToProcMap = mpiSim->getAtomToProcMap();
413
414 // write out header and node 0's coordinates
415
416 haveError = 0;
417 if( worldRank == 0 ){
418 finalOut << mpiSim->getTotAtoms() << "\n";
419
420 finalOut << entry_plug->box_x << "\t"
421 << entry_plug->box_y << "\t"
422 << entry_plug->box_z << "\n";
423
424 for (i = 0 ; i < mpiSim->getTotAtoms(); i++ ) {
425 // Get the Node number which has this molecule:
426
427 which_node = AtomToProcMap[i];
428
429 if (which_node == mpiSim->getMyNode()) {
430
431 which_atom = i;
432 local_index=-1;
433 for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) {
434 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
435 }
436 if (local_index != -1) {
437 sprintf( tempBuffer,
438 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
439 atoms[local_index]->getType(),
440 atoms[local_index]->getX(),
441 atoms[local_index]->getY(),
442 atoms[local_index]->getZ(),
443 atoms[local_index]->get_vx(),
444 atoms[local_index]->get_vy(),
445 atoms[local_index]->get_vz());
446 strcpy( writeLine, tempBuffer );
447
448 if( atoms[local_index]->isDirectional() ){
449
450 dAtom = (DirectionalAtom *)atoms[local_index];
451 dAtom->getQ( q );
452
453 sprintf( tempBuffer,
454 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
455 q[0],
456 q[1],
457 q[2],
458 q[3],
459 dAtom->getJx(),
460 dAtom->getJy(),
461 dAtom->getJz());
462 strcat( writeLine, tempBuffer );
463 }
464 else
465 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
466 }
467 else {
468 sprintf(painCave.errMsg,
469 "Atom %d not found on processor %d\n",
470 i, worldRank );
471 haveError= 1;
472 simError();
473 }
474
475 if(haveError) nodeZeroError();
476
477 }
478 else {
479
480 myStatus = 1;
481 MPI_Send(&myStatus, 1, MPI_INT, which_node,
482 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
483 MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
484 MPI_COMM_WORLD);
485 MPI_Recv(writeLine, BUFFERSIZE, MPI_CHAR, which_node,
486 TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
487 MPI_Recv(&myStatus, 1, MPI_INT, which_node,
488 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
489
490 if(!myStatus) nodeZeroError();
491 }
492
493 finalOut << writeLine;
494 }
495
496 // kill everyone off:
497 myStatus = -1;
498 for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
499 MPI_Send(&myStatus, 1, MPI_INT, j,
500 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
501 }
502
503 } else {
504
505 done = 0;
506 while (!done) {
507
508 MPI_Recv(&myStatus, 1, MPI_INT, 0,
509 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
510
511 if(!myStatus) anonymousNodeDie();
512
513 if(myStatus < 0) break;
514
515 MPI_Recv(&which_atom, 1, MPI_INT, 0,
516 TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
517
518 myStatus = 1;
519 local_index=-1;
520 for (j=0; j < mpiSim->getMyNlocal(); j++) {
521 if (atoms[j]->getGlobalIndex() == which_atom) local_index = j;
522 }
523 if (local_index != -1) {
524
525 //format the line
526 sprintf( tempBuffer,
527 "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t",
528 atoms[local_index]->getType(),
529 atoms[local_index]->getX(),
530 atoms[local_index]->getY(),
531 atoms[local_index]->getZ(),
532 atoms[local_index]->get_vx(),
533 atoms[local_index]->get_vy(),
534 atoms[local_index]->get_vz()); // check here.
535 strcpy( writeLine, tempBuffer );
536
537 if( atoms[local_index]->isDirectional() ){
538
539 dAtom = (DirectionalAtom *)atoms[local_index];
540 dAtom->getQ( q );
541
542 sprintf( tempBuffer,
543 "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",
544 q[0],
545 q[1],
546 q[2],
547 q[3],
548 dAtom->getJx(),
549 dAtom->getJy(),
550 dAtom->getJz());
551 strcat( writeLine, tempBuffer );
552 }
553 else{
554 strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" );
555 }
556 }
557 else {
558 sprintf(painCave.errMsg,
559 "Atom %d not found on processor %d\n",
560 which_atom, worldRank );
561 myStatus = 0;
562 simError();
563
564 strcpy( writeLine, "Hello, I'm an error.\n");
565 }
566
567 MPI_Send(writeLine, BUFFERSIZE, MPI_CHAR, 0,
568 TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
569 MPI_Send( &myStatus, 1, MPI_INT, 0,
570 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
571 }
572 }
573 finalOut.flush();
574 sprintf( checkPointMsg,
575 "Sucessfully took a dump.\n");
576 MPIcheckPoint();
577
578 if( worldRank == 0 ) finalOut.close();
579 #endif // is_mpi
580 }
581
582
583
584 #ifdef IS_MPI
585
586 // a couple of functions to let us escape the write loop
587
588 void dWrite::nodeZeroError( void ){
589 int j, myStatus;
590
591 myStatus = 0;
592 for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
593 MPI_Send( &myStatus, 1, MPI_INT, j,
594 TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
595 }
596
597
598 MPI_Finalize();
599 exit (0);
600
601 }
602
603 void dWrite::anonymousNodeDie( void ){
604
605 MPI_Finalize();
606 exit (0);
607 }
608
609 #endif //is_mpi