+ MPI_File_open(MPI_COMM_WORLD, inFileName, MPI_MODE_RDONLY, MPI_INFO_NULL, &inMPI); //comm, filename, mode, info, filepointer
+
+ if (pid == 0) {
+ positions = m->setFilePosFasta(fastaFileName, numSeqs); //fills MPIPos, returns numSeqs
+
+ //send file positions to all processes
+ for(int i = 1; i < processors; i++) {
+ MPI_Send(&numSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD);
+ MPI_Send(&positions[0], (numSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD);
+ }
+ }else{
+ MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
+ positions.resize(numSeqs+1);
+ MPI_Recv(&positions[0], (numSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status);
+ }
+
+ //read file
+ for(int i=0;i<numSeqs;i++){
+
+ if (m->control_pressed) { templateSequences.clear(); break; }
+
+ //read next sequence
+ int length = positions[i+1] - positions[i];
+ char* buf4 = new char[length];
+
+ MPI_File_read_at(inMPI, positions[i], buf4, length, MPI_CHAR, &status);
+
+ string tempBuf = buf4;
+ if (tempBuf.length() > length) { tempBuf = tempBuf.substr(0, length); }
+ delete buf4;
+
+ istringstream iss (tempBuf,istringstream::in);
+
+ Sequence temp(iss);
+ if (temp.getName() != "") {
+ templateSequences.push_back(temp);
+
+ if (rdb->save) { rdb->referenceSeqs.push_back(temp); }
+
+ //save longest base
+ if (temp.getUnaligned().length() >= longest) { longest = temp.getUnaligned().length()+1; }
+ }
+ }
+
+ MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case
+
+ MPI_File_close(&inMPI);
+
+ #else
+ ifstream fastaFile;
+ m->openInputFile(fastaFileName, fastaFile);
+
+ while (!fastaFile.eof()) {
+ Sequence temp(fastaFile); m->gobble(fastaFile);
+
+ if (m->control_pressed) { templateSequences.clear(); break; }
+
+ if (temp.getName() != "") {
+ templateSequences.push_back(temp);
+
+ if (rdb->save) { rdb->referenceSeqs.push_back(temp); }
+
+ //save longest base
+ if (temp.getUnaligned().length() >= longest) { longest = (temp.getUnaligned().length()+1); }
+ }
+ }
+ fastaFile.close();
+ #endif
+
+ numSeqs = templateSequences.size();
+ //all of this is elsewhere already!
+
+ m->mothurOut("DONE.");
+ m->mothurOutEndLine(); cout.flush();
+ m->mothurOut("It took " + toString(time(NULL) - start) + " to read " + toString(templateSequences.size()) + " sequences."); m->mothurOutEndLine();
+
+ }