| 47 | 
  | 
 * @version 1.0 | 
| 48 | 
  | 
 */ | 
| 49 | 
  | 
 | 
| 50 | 
+ | 
#include <iostream> | 
| 51 | 
+ | 
#include <sstream> | 
| 52 | 
+ | 
#include <string> | 
| 53 | 
+ | 
 | 
| 54 | 
  | 
#include "brains/MoleculeCreator.hpp" | 
| 55 | 
  | 
#include "brains/SimCreator.hpp" | 
| 56 | 
  | 
#include "brains/SimSnapshotManager.hpp" | 
| 57 | 
  | 
#include "io/DumpReader.hpp" | 
| 54 | 
– | 
#include "io/parse_me.h" | 
| 58 | 
  | 
#include "UseTheForce/ForceFieldFactory.hpp" | 
| 59 | 
  | 
#include "utils/simError.h" | 
| 60 | 
  | 
#include "utils/StringUtils.hpp" | 
| 61 | 
  | 
#include "math/SeqRandNumGen.hpp" | 
| 62 | 
+ | 
#include "mdParser/MDLexer.hpp" | 
| 63 | 
+ | 
#include "mdParser/MDParser.hpp" | 
| 64 | 
+ | 
#include "mdParser/MDTreeParser.hpp" | 
| 65 | 
+ | 
#include "mdParser/SimplePreprocessor.hpp" | 
| 66 | 
+ | 
#include "antlr/ANTLRException.hpp" | 
| 67 | 
+ | 
#include "antlr/TokenStreamRecognitionException.hpp" | 
| 68 | 
+ | 
#include "antlr/TokenStreamIOException.hpp" | 
| 69 | 
+ | 
#include "antlr/TokenStreamException.hpp" | 
| 70 | 
+ | 
#include "antlr/RecognitionException.hpp" | 
| 71 | 
+ | 
#include "antlr/CharStreamException.hpp" | 
| 72 | 
+ | 
 | 
| 73 | 
+ | 
#include "antlr/MismatchedCharException.hpp" | 
| 74 | 
+ | 
#include "antlr/MismatchedTokenException.hpp" | 
| 75 | 
+ | 
#include "antlr/NoViableAltForCharException.hpp" | 
| 76 | 
+ | 
#include "antlr/NoViableAltException.hpp" | 
| 77 | 
+ | 
 | 
| 78 | 
  | 
#ifdef IS_MPI | 
| 60 | 
– | 
#include "io/mpiBASS.h" | 
| 79 | 
  | 
#include "math/ParallelRandNumGen.hpp" | 
| 80 | 
  | 
#endif | 
| 81 | 
  | 
 | 
| 82 | 
  | 
namespace oopse { | 
| 83 | 
  | 
   | 
| 84 | 
< | 
  void SimCreator::parseFile(const std::string mdFileName,  MakeStamps* stamps,  | 
| 85 | 
< | 
                             Globals* simParams){ | 
| 84 | 
> | 
Globals* SimCreator::parseFile(const std::string mdFileName){ | 
| 85 | 
> | 
        Globals* simParams = NULL; | 
| 86 | 
> | 
        try { | 
| 87 | 
> | 
 | 
| 88 | 
> | 
            // Create a preprocessor that preprocesses md file into an ostringstream | 
| 89 | 
> | 
            std::stringstream ppStream; | 
| 90 | 
> | 
#ifdef IS_MPI             | 
| 91 | 
> | 
            int streamSize; | 
| 92 | 
> | 
            const int masterNode = 0; | 
| 93 | 
> | 
            int commStatus; | 
| 94 | 
> | 
            if (worldRank == masterNode) { | 
| 95 | 
> | 
#endif  | 
| 96 | 
> | 
                 | 
| 97 | 
> | 
                SimplePreprocessor preprocessor; | 
| 98 | 
> | 
                preprocessor.preprocess(mdFileName, ppStream); | 
| 99 | 
> | 
                 | 
| 100 | 
> | 
#ifdef IS_MPI             | 
| 101 | 
> | 
                //brocasting the stream size | 
| 102 | 
> | 
                streamSize = ppStream.str().size() +1; | 
| 103 | 
> | 
                commStatus = MPI_Bcast(&streamSize, 1, MPI_LONG, masterNode, MPI_COMM_WORLD);                    | 
| 104 | 
> | 
 | 
| 105 | 
> | 
                commStatus = MPI_Bcast(ppStream.str().c_str(), streamSize, MPI_CHAR, masterNode, MPI_COMM_WORLD);  | 
| 106 | 
> | 
             | 
| 107 | 
> | 
                 | 
| 108 | 
> | 
            } else { | 
| 109 | 
> | 
                //get stream size | 
| 110 | 
> | 
                commStatus = MPI_Bcast(&streamSize, 1, MPI_LONG, masterNode, MPI_COMM_WORLD);    | 
| 111 | 
> | 
                 | 
| 112 | 
> | 
                  char* buf = new char[streamSize]; | 
| 113 | 
> | 
                  assert(buf); | 
| 114 | 
> | 
                 | 
| 115 | 
> | 
                  //receive file content | 
| 116 | 
> | 
                  commStatus = MPI_Bcast(buf, streamSize, MPI_CHAR, masterNode, MPI_COMM_WORLD);  | 
| 117 | 
> | 
                 | 
| 118 | 
> | 
                  ppStream.str(buf); | 
| 119 | 
> | 
                  delete buf; | 
| 120 | 
> | 
 | 
| 121 | 
> | 
            } | 
| 122 | 
> | 
#endif             | 
| 123 | 
> | 
            // Create a scanner that reads from the input stream | 
| 124 | 
> | 
            MDLexer lexer(ppStream); | 
| 125 | 
> | 
            lexer.setFilename(mdFileName); | 
| 126 | 
> | 
            lexer.initDeferredLineCount(); | 
| 127 | 
  | 
     | 
| 128 | 
< | 
#ifdef IS_MPI | 
| 128 | 
> | 
            // Create a parser that reads from the scanner | 
| 129 | 
> | 
            MDParser parser(lexer); | 
| 130 | 
> | 
            parser.setFilename(mdFileName); | 
| 131 | 
> | 
 | 
| 132 | 
> | 
            // Create an observer that synchorizes file name change | 
| 133 | 
> | 
            FilenameObserver observer; | 
| 134 | 
> | 
            observer.setLexer(&lexer); | 
| 135 | 
> | 
            observer.setParser(&parser); | 
| 136 | 
> | 
            lexer.setObserver(&observer); | 
| 137 | 
  | 
     | 
| 138 | 
< | 
    if (worldRank == 0) { | 
| 139 | 
< | 
#endif // is_mpi | 
| 138 | 
> | 
            antlr::ASTFactory factory; | 
| 139 | 
> | 
            parser.initializeASTFactory(factory); | 
| 140 | 
> | 
            parser.setASTFactory(&factory); | 
| 141 | 
> | 
            parser.mdfile(); | 
| 142 | 
> | 
 | 
| 143 | 
> | 
            // Create a tree parser that reads information into Globals | 
| 144 | 
> | 
            MDTreeParser treeParser; | 
| 145 | 
> | 
            treeParser.initializeASTFactory(factory); | 
| 146 | 
> | 
            treeParser.setASTFactory(&factory); | 
| 147 | 
> | 
             simParams = treeParser.walkTree(parser.getAST()); | 
| 148 | 
> | 
 | 
| 149 | 
> | 
        } | 
| 150 | 
  | 
       | 
| 151 | 
< | 
      set_interface_stamps(stamps, simParams); | 
| 152 | 
< | 
       | 
| 153 | 
< | 
#ifdef IS_MPI | 
| 154 | 
< | 
       | 
| 155 | 
< | 
      mpiEventInit(); | 
| 156 | 
< | 
       | 
| 157 | 
< | 
#endif | 
| 158 | 
< | 
       | 
| 159 | 
< | 
      yacc_BASS(mdFileName.c_str()); | 
| 160 | 
< | 
       | 
| 161 | 
< | 
#ifdef IS_MPI | 
| 162 | 
< | 
       | 
| 163 | 
< | 
      throwMPIEvent(NULL); | 
| 164 | 
< | 
    } else { | 
| 165 | 
< | 
      set_interface_stamps(stamps, simParams); | 
| 166 | 
< | 
      mpiEventInit(); | 
| 167 | 
< | 
      MPIcheckPoint(); | 
| 168 | 
< | 
      mpiEventLoop(); | 
| 169 | 
< | 
    } | 
| 170 | 
< | 
     | 
| 171 | 
< | 
#endif | 
| 172 | 
< | 
     | 
| 151 | 
> | 
      catch(antlr::MismatchedCharException& e) { | 
| 152 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << " " <<  e.getFilename() << ":" << e.getLine() << " " << e.getColumn() << endl; | 
| 153 | 
> | 
      } | 
| 154 | 
> | 
      catch(antlr::MismatchedTokenException &e) { | 
| 155 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << " " <<  e.getFilename() << ":" << e.getLine() << " " << e.getColumn() << endl; | 
| 156 | 
> | 
      } | 
| 157 | 
> | 
      catch(antlr::NoViableAltForCharException &e) { | 
| 158 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << " " <<  e.getFilename() << ":" << e.getLine() << " " << e.getColumn() << endl; | 
| 159 | 
> | 
      } | 
| 160 | 
> | 
      catch(antlr::NoViableAltException &e) { | 
| 161 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << " " <<  e.getFilename() << ":" << e.getLine() << " " << e.getColumn() << endl; | 
| 162 | 
> | 
      } | 
| 163 | 
> | 
        catch(antlr::TokenStreamRecognitionException& e) { | 
| 164 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << " " <<  e.getFilename() << ":" << e.getLine() << " " << e.getColumn() << endl; | 
| 165 | 
> | 
        } | 
| 166 | 
> | 
        catch(antlr::TokenStreamIOException& e) { | 
| 167 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << endl; | 
| 168 | 
> | 
        } | 
| 169 | 
> | 
        catch(antlr::TokenStreamException& e) { | 
| 170 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << endl; | 
| 171 | 
> | 
        }         | 
| 172 | 
> | 
       catch (antlr::RecognitionException& e) { | 
| 173 | 
> | 
          cerr<< "parser exception: " << e.getMessage() << " " <<  e.getFilename() << ":" << e.getLine() << " " << e.getColumn() << endl; | 
| 174 | 
> | 
       } | 
| 175 | 
> | 
       catch (antlr::CharStreamException& e) { | 
| 176 | 
> | 
            cerr << "parser exception: " << e.getMessage() << endl; | 
| 177 | 
> | 
       } | 
| 178 | 
> | 
        catch (exception& e) { | 
| 179 | 
> | 
            cerr << "parser exception: " << e.what() << endl; | 
| 180 | 
> | 
        } | 
| 181 | 
> | 
 | 
| 182 | 
> | 
        return simParams; | 
| 183 | 
  | 
  } | 
| 184 | 
  | 
   | 
| 185 | 
  | 
  SimInfo*  SimCreator::createSim(const std::string & mdFileName,  | 
| 186 | 
  | 
                                  bool loadInitCoords) { | 
| 187 | 
< | 
     | 
| 101 | 
< | 
    MakeStamps * stamps = new MakeStamps(); | 
| 102 | 
< | 
     | 
| 103 | 
< | 
    Globals * simParams = new Globals(); | 
| 104 | 
< | 
     | 
| 187 | 
> | 
 | 
| 188 | 
  | 
    //parse meta-data file | 
| 189 | 
< | 
    parseFile(mdFileName, stamps, simParams); | 
| 189 | 
> | 
    Globals* simParams = parseFile(mdFileName); | 
| 190 | 
  | 
     | 
| 191 | 
  | 
    //create the force field | 
| 192 | 
  | 
    ForceField * ff = ForceFieldFactory::getInstance() | 
| 222 | 
  | 
        forcefieldFileName.append(variant); | 
| 223 | 
  | 
      } | 
| 224 | 
  | 
    }  | 
| 142 | 
– | 
     | 
| 143 | 
– | 
    ff->parse(forcefieldFileName); | 
| 225 | 
  | 
     | 
| 226 | 
< | 
    //extract the molecule stamps | 
| 227 | 
< | 
    std::vector < std::pair<MoleculeStamp *, int> > moleculeStampPairs; | 
| 147 | 
< | 
    compList(stamps, simParams, moleculeStampPairs); | 
| 148 | 
< | 
     | 
| 226 | 
> | 
    ff->parse(forcefieldFileName); | 
| 227 | 
> | 
    ff->setFortranForceOptions(); | 
| 228 | 
  | 
    //create SimInfo | 
| 229 | 
< | 
    SimInfo * info = new SimInfo(stamps, moleculeStampPairs, ff, simParams); | 
| 229 | 
> | 
    SimInfo * info = new SimInfo(ff, simParams); | 
| 230 | 
  | 
      | 
| 231 | 
  | 
    //gather parameters (SimCreator only retrieves part of the parameters) | 
| 232 | 
  | 
    gatherParameters(info, mdFileName); | 
| 472 | 
  | 
       | 
| 473 | 
  | 
    } //end for(int i=0)    | 
| 474 | 
  | 
  } | 
| 396 | 
– | 
   | 
| 397 | 
– | 
  void SimCreator::compList(MakeStamps *stamps, Globals* simParams, | 
| 398 | 
– | 
                            std::vector < std::pair<MoleculeStamp *, int> > &moleculeStampPairs) { | 
| 399 | 
– | 
    int i; | 
| 400 | 
– | 
    char * id; | 
| 401 | 
– | 
    MoleculeStamp * currentStamp; | 
| 402 | 
– | 
    Component** the_components = simParams->getComponents(); | 
| 403 | 
– | 
    int n_components = simParams->getNComponents(); | 
| 475 | 
  | 
     | 
| 405 | 
– | 
    if (!simParams->haveNMol()) { | 
| 406 | 
– | 
      // we don't have the total number of molecules, so we assume it is | 
| 407 | 
– | 
      // given in each component | 
| 408 | 
– | 
       | 
| 409 | 
– | 
      for(i = 0; i < n_components; i++) { | 
| 410 | 
– | 
        if (!the_components[i]->haveNMol()) { | 
| 411 | 
– | 
          // we have a problem | 
| 412 | 
– | 
          sprintf(painCave.errMsg, | 
| 413 | 
– | 
                  "SimCreator Error. No global NMol or component NMol given.\n" | 
| 414 | 
– | 
                  "\tCannot calculate the number of atoms.\n"); | 
| 415 | 
– | 
           | 
| 416 | 
– | 
          painCave.isFatal = 1; | 
| 417 | 
– | 
          simError(); | 
| 418 | 
– | 
        } | 
| 419 | 
– | 
         | 
| 420 | 
– | 
        id = the_components[i]->getType(); | 
| 421 | 
– | 
 | 
| 422 | 
– | 
        currentStamp = stamps->getMolStamp(id); | 
| 423 | 
– | 
        if (currentStamp == NULL) { | 
| 424 | 
– | 
          sprintf(painCave.errMsg, | 
| 425 | 
– | 
                  "SimCreator error: Component \"%s\" was not found in the " | 
| 426 | 
– | 
                  "list of declared molecules\n", id); | 
| 427 | 
– | 
           | 
| 428 | 
– | 
          painCave.isFatal = 1; | 
| 429 | 
– | 
          simError(); | 
| 430 | 
– | 
        } | 
| 431 | 
– | 
         | 
| 432 | 
– | 
        moleculeStampPairs.push_back( | 
| 433 | 
– | 
                                     std::make_pair(currentStamp, the_components[i]->getNMol())); | 
| 434 | 
– | 
      } //end for (i = 0; i < n_components; i++) | 
| 435 | 
– | 
    } else { | 
| 436 | 
– | 
      sprintf(painCave.errMsg, "SimSetup error.\n" | 
| 437 | 
– | 
              "\tSorry, the ability to specify total" | 
| 438 | 
– | 
              " nMols and then give molfractions in the components\n" | 
| 439 | 
– | 
              "\tis not currently supported." | 
| 440 | 
– | 
              " Please give nMol in the components.\n"); | 
| 441 | 
– | 
       | 
| 442 | 
– | 
      painCave.isFatal = 1; | 
| 443 | 
– | 
      simError(); | 
| 444 | 
– | 
    } | 
| 445 | 
– | 
     | 
| 446 | 
– | 
#ifdef IS_MPI | 
| 447 | 
– | 
     | 
| 448 | 
– | 
    strcpy(checkPointMsg, "Component stamps successfully extracted\n"); | 
| 449 | 
– | 
    MPIcheckPoint(); | 
| 450 | 
– | 
     | 
| 451 | 
– | 
#endif // is_mpi | 
| 452 | 
– | 
     | 
| 453 | 
– | 
  } | 
| 454 | 
– | 
   | 
| 476 | 
  | 
  void SimCreator::setGlobalIndex(SimInfo *info) { | 
| 477 | 
  | 
    SimInfo::MoleculeIterator mi; | 
| 478 | 
  | 
    Molecule::AtomIterator ai; |