Example #1
0
ReturnType SnapshotCommand::execute ()
{
#ifdef ENABLE_MPI
  int myRank, mySize;
  MPI_Comm_size (MPI_COMM_WORLD, &mySize);
  MPI_Comm_rank (MPI_COMM_WORLD, &myRank);

#else
  logger->debug() << "----------------->Not Parallel snapshot " << std::endl;
  //return EXECUTED;
#endif


  Domain* dom = sim -> getDomain ();
  int numberOfComponents = dom -> getComponents().size();
  SteereoStream daStream;
  SteereoStream outStream;
  int counter = 0;
#ifdef ENABLE_MPI
  int* molNumbers = NULL;
  int* dataSizes = NULL;
  int* displ = NULL;
  int baseDispl = 0;
#endif
  int factor = 3 +  sendForces + sendVelocity + sendV2;
  //int offset = sendV2Max;
  // at the moment the simulation area extents need 6 floats
  int offset = 7;

  ParticleContainer* m_molecules = sim -> getMolecules ();
#ifdef ENABLE_MPI
  int anzahl_mol = sim -> getDomain () -> getglobalNumMolecules ();
#endif
  int local_mol = m_molecules->getNumberOfParticles();
#ifdef ENABLE_MPI
  if (myRank == 0)
  {
    outStream.allocateMemory (factor * anzahl_mol * sizeof(float) + offset * sizeof(float));
  }

  // The stream will only be used for sending. And we will send maximally 3*sizeof(float) * local_mol at once
  daStream.allocateMemory (3 * local_mol * sizeof(float));

#else
  daStream.allocateMemory(factor * local_mol * sizeof(float) + offset * sizeof(float));
#endif

  //send the extents of the domain
  daStream << (float) 0.0 << (float) 0.0 << (float) 0.0;
  daStream << (float) dom->getGlobalLength(0) << (float) dom->getGlobalLength(1) << (float) dom->getGlobalLength(2);
  daStream << (int) numberOfComponents;

#ifdef ENABLE_MPI
  if (myRank == 0)
  {
    molNumbers = new int [mySize];
    dataSizes = new int [mySize];
  }
  MPI_Gather (&local_mol, 1, MPI_INT, molNumbers, 1, MPI_INT, 0, MPI_COMM_WORLD );

  if (myRank == 0)
  {
    displ = new int[mySize];
    displ[0] = 0;
    dataSizes[0] = molNumbers[0] * 3 * sizeof(float);
    for (int i = 1; i < mySize; i++)
    {
      displ[i] = displ[i-1] + dataSizes[i-1];
      dataSizes[i] = molNumbers[i] * 3 * sizeof(float);
      std::cout << "MolNumber ["<< i-1 << "]: " << molNumbers[i-1] << std::endl;
    }
    std::cout << "MolNumber ["<< mySize-1 << "]: " << molNumbers[mySize-1] << std::endl;

  }
#endif

  Molecule* pos = NULL;
  double crit = 0.0;
  for (pos = m_molecules->begin (); pos != m_molecules->end (); pos = m_molecules->next ()) {
    //crit = pos->r(0) * pos->r(0) + pos->r(1) * pos->r(1) + pos->r(2) * pos->r(2);
    daStream << (float) pos->r(0);
    daStream << (float) pos->r(1);
    daStream << (float) pos->r(2);
    counter++;
  }

#ifdef ENABLE_MPI
  MPI_Gatherv (daStream.getStream(), local_mol * 3 * sizeof(float), MPI_CHAR, outStream.getStream (), dataSizes, displ, MPI_CHAR, 0, MPI_COMM_WORLD);

  daStream.resetActPos();
  daStream.resetReadPos();
#endif
  float tempF = 0.0;
  if (sendForces)
  {
    for (pos = m_molecules->begin (); pos != m_molecules->end (); pos = m_molecules->next ())
    {
      tempF = pos->F(0) * pos->F(0) + pos->F(1) * pos->F(1) + pos->F(2) * pos->F(2);
      tempF = sqrt(tempF);
      /*daStream << (float) pos->F(0);
      daStream << (float) pos->F(1);
      daStream << (float) pos->F(2);*/
      daStream << tempF;
    }
#ifdef ENABLE_MPI
    if (myRank == 0)
    {
      baseDispl = displ[mySize-1] + dataSizes[mySize-1];
      displ[0] = baseDispl;
      dataSizes[0] = molNumbers[0] * sizeof(float);
      for (int i = 1; i < mySize; i++)
      {
        displ[i] = displ[i-1] + dataSizes[i-1];
        dataSizes[i] = molNumbers[i] * sizeof(float);
      }
    }
    MPI_Gatherv (daStream.getStream(), local_mol * sizeof(float), MPI_CHAR, outStream.getStream (), dataSizes, displ, MPI_CHAR, 0, MPI_COMM_WORLD);
    daStream.resetActPos();
    daStream.resetReadPos();
#endif
  }
  if (sendVelocity)
  {
    float vel = 0;
    for (pos = m_molecules->begin (); pos != m_molecules->end (); pos = m_molecules->next ())
    {
      vel = sqrt (pos->v2());
      /*daStream << (float) pos->v(0);
      daStream << (float) pos->v(1);
      daStream << (float) pos->v(2);*/
      daStream << vel;
    }
#ifdef ENABLE_MPI
    if (myRank == 0)
    {
      baseDispl = displ[mySize-1] + dataSizes[mySize-1];
      displ[0] = baseDispl;
      dataSizes[0] = molNumbers[0] * sizeof(float);
      for (int i = 1; i < mySize; i++)
      {
        displ[i] = displ[i-1] + dataSizes[i-1];
        dataSizes[i] = molNumbers[i] * sizeof(float);
      }
    }
    MPI_Gatherv (daStream.getStream(), local_mol * sizeof(float), MPI_CHAR, outStream.getStream(), dataSizes, displ, MPI_CHAR, 0, MPI_COMM_WORLD);
    daStream.resetActPos();
    daStream.resetReadPos();
#endif
  }
  float v2max = 0;
  if (sendV2)
  {
    float v2 = 0;
    for (pos = m_molecules->begin (); pos != m_molecules->end (); pos = m_molecules->next ())
    {
      v2 = pos->v2();
      v2max = v2 > v2max ? v2 : v2max;
      daStream << v2;

    }
#ifdef ENABLE_MPI
    if (myRank == 0)
    {
      baseDispl = displ[mySize-1] + dataSizes[mySize-1];
      displ[0] = baseDispl;
      std::cout << "0: " << displ[0] << std::endl;
      dataSizes[0] = molNumbers[0] * sizeof(float);
      std::cout << "datasize[0]: " << dataSizes[0] << std::endl;
      for (int i = 1; i < mySize; i++)
      {
        displ[i] = displ[i-1] + dataSizes[i-1];
        dataSizes[i] = molNumbers[i] * sizeof(float);
        std::cout << "i: " << displ[i] << std::endl;
      }
    }
    MPI_Gatherv (daStream.getStream(), local_mol * sizeof(float), MPI_CHAR, outStream.getStream(), dataSizes, displ, MPI_CHAR, 0, MPI_COMM_WORLD);
#endif
    /*if (sendV2Max)
    {
      daStream << v2max;
    }*/
  }
#ifdef ENABLE_MPI
  if (myRank == 0)
  {
 //   std::cout << "snapshotCommand: assembled the data to be sent in a stream: " << outStream.getStreamSize() <<  " "<< counter <<std::endl;
    this->getCommunicator()->sendStream (this->getConnection()->getDataConnection(), outStream);
   // std::cout << "snapshotCommand: sent the stream" << std::endl;
  }
#else
 // std::cout << "snapshotCommand: assembled the data to be sent in a stream: " << daStream.getStreamSize() <<  " "<< counter <<std::endl;
  this->getCommunicator()->sendStream (this->getConnection()->getDataConnection(), daStream);
 // std::cout << "snapshotCommand: sent the stream" << std::endl;
#endif

  if (stepInterval > 0)
  {
    return REPETITION_REQUESTED;
  }
  else
  {
    return EXECUTED;
  }


}
Example #2
0
      void
      ForceBoundary::applyBoundary()
      {

        std::list<Molecule *> mol;
        std::list<Molecule *>::iterator mi;
        Molecule *m;
        double distanceVector[3];
        //double cornerA[3];
        //double cornerB[3];
        double f[3];
        f[0] = 0;

        /*	cornerA[X] = bBoxMin[X];
         cornerA[Y] = bBoxMin[Y];
         cornerA[Z] = bBoxMin[Z];

         cornerB[X] = bBoxMin[X]+_borderSize[X];
         cornerB[Y] = bBoxMax[Y];
         cornerB[Z] = bBoxMax[Z];


         _moleculeContainer->getRegion(cornerA, cornerB,mol);*/
        getLower(X, mol);
        for (mi = mol.begin(); mi != mol.end(); mi++)
          {
            m = (*mi);
            f[X] = calcFm(m->r(X) - bBoxMin[X]) * fmplus;
            f[Y] = 0;
            f[Z] = 0;
            /*	double r =m->r(X)-bBoxMin[X];
             if(r<0.5) {
             std::cout << m->F(0) << " "<<m->F(1) << " "<<m->F(2) << " X"<< std::endl;

             }*/

            m->Fadd(f);
            /*	if(r<0.5) {
             std::cout << r << " " <<m->F(0) << " "<<m->F(1) << " "<<m->F(2) << " X2"<< std::endl;

             }*/
            if (_RBinFB)
              {
                Molecule dummy(*m);
                dummy.move(X, -2 * m->r(X));
                double dd = dummy.dist2(*m, distanceVector);
                if (dd < 2.0)
                  {
                    std::cout << m->F(0) << " " << m->F(1) << " " << m->F(2)
                        << " X" << std::endl;
                    _particlePairsHandler->processPair(*m, dummy,
                        distanceVector, MOLECULE_HALOMOLECULE, dd, (dd
                            < _LJCutoffRadiusSquare));
                    m->calcFM();
                    std::cout << dd << " " << m->F(0) << " " << m->F(1) << " "
                        << m->F(2) << " X2" << std::endl;
                  }

              }

          }

        mol.clear();
        /*cornerA[X] = bBoxMax[X]-_borderSize[X];
         cornerB[X] = bBoxMax[X];

         _moleculeContainer->getRegion(cornerA, cornerB,mol);*/
        getUpper(X, mol);
        for (mi = mol.begin(); mi != mol.end(); mi++)
          {
            m = (*mi);
            f[X] = -calcFm(bBoxMax[X] - m->r(X)) * fmplus;
            if (_streamOutDir == X)
              f[X] *= _fStreamDamping;
            if (!_fStream || _streamOutDir != X)
              m->Fadd(f);
            if (_RBinFB && _streamOutDir != X)
              {
                Molecule dummy(*m);
                dummy.move(X, 2 * (m->r(X) - _domain->getGlobalLength(X)));
                double dd = dummy.dist2(*m, distanceVector);
                _particlePairsHandler->processPair(*m, dummy, distanceVector,
                    MOLECULE_HALOMOLECULE, dd, (dd < _LJCutoffRadiusSquare));
                //std::cout << dummy.F(0) << " "<<dummy.F(1) << " "<<dummy.F(2) << " -X"<< std::endl;

              }
          }

        mol.clear();
        /*	cornerA[X] = bBoxMin[X];
         cornerB[X] = bBoxMax[X];
         cornerB[Y] = bBoxMin[Y]+_borderSize[Y];

         _moleculeContainer->getRegion(cornerA, cornerB,mol);*/
        getLower(Y, mol);
        for (mi = mol.begin(); mi != mol.end(); mi++)
          {
            m = (*mi);
            f[X] = 0;
            f[Y] = calcFm(m->r(Y) - bBoxMin[Y]) * fmplus;
            m->Fadd(f);
            if (_RBinFB)
              {
                Molecule dummy(*m);
                dummy.move(Y, -2 * m->r(Y));
                double dd = dummy.dist2(*m, distanceVector);
                _particlePairsHandler->processPair(*m, dummy, distanceVector,
                    MOLECULE_HALOMOLECULE, dd, (dd < _LJCutoffRadiusSquare));
              }
          }

        mol.clear();
        /*	cornerA[Y] = bBoxMax[Y]-_borderSize[Y];
         cornerB[Y] = bBoxMax[Y];

         _moleculeContainer->getRegion(cornerA, cornerB,mol);*/
        getUpper(Y, mol);
        for (mi = mol.begin(); mi != mol.end(); mi++)
          {
            m = (*mi);
            f[Y] = -calcFm(bBoxMax[Y] - m->r(Y)) * fmplus;
            if (_streamOutDir == Y)
              f[Y] *= _fStreamDamping;
            if (!_fStream || _streamOutDir != Y)
              m->Fadd(f);
            if (_RBinFB && _streamOutDir != Y)
              {
                Molecule dummy(*m);
                dummy.move(Y, 2 * (m->r(Y) - _domain->getGlobalLength(Y)));
                double dd = dummy.dist2(*m, distanceVector);
                _particlePairsHandler->processPair(*m, dummy, distanceVector,
                    MOLECULE_HALOMOLECULE, dd, (dd < _LJCutoffRadiusSquare));
                //	 std::cout << dummy.F(0) << " "<<dummy.F(1) << " "<<dummy.F(2) << " -Y"<< std::endl;

              }
          }
        if (_dim == 3)
          {
            mol.clear();
            /*cornerA[Y] = bBoxMin[Y];
             cornerB[Y] = bBoxMax[Y];
             cornerB[Z] = bBoxMin[Z]+_borderSize[Z];

             _moleculeContainer->getRegion(cornerA, cornerB,mol);*/
            getLower(Z, mol);

            for (mi = mol.begin(); mi != mol.end(); mi++)
              {
                m = (*mi);
                f[Y] = 0;
                f[Z] = calcFm(m->r(Z) - bBoxMin[Z]) * fmplus;
                m->Fadd(f);
                if (_RBinFB)
                  {
                    Molecule dummy(*m);
                    dummy.move(Z, -2 * m->r(Z));
                    double dd = dummy.dist2(*m, distanceVector);
                    _particlePairsHandler->processPair(*m, dummy,
                        distanceVector, MOLECULE_HALOMOLECULE, dd, (dd
                            < _LJCutoffRadiusSquare));
                    // std::cout << dummy.F(0) << " "<<dummy.F(1) << " "<<dummy.F(2) << " "<< std::endl;
                  }
              }

            mol.clear();
            /*cornerA[Z] = bBoxMax[Z]-_borderSize[Z];
             cornerB[Z] = bBoxMax[Z];

             _moleculeContainer->getRegion(cornerA, cornerB,mol);*/
            getUpper(Z, mol);
            for (mi = mol.begin(); mi != mol.end(); mi++)
              {
                m = (*mi);
                f[Z] = -calcFm(bBoxMax[Z] - m->r(Z)) * fmplus;
                if (_streamOutDir == Z)
                  f[Z] *= _fStreamDamping;
                if (!_fStream || _streamOutDir != Z)
                  m->Fadd(f);
                if (_RBinFB && _streamOutDir != Z)
                  {
                    Molecule dummy(*m);
                    dummy.move(Z, 2 * (m->r(Z) - _domain->getGlobalLength(Z)));
                    double dd = dummy.dist2(*m, distanceVector);
                    _particlePairsHandler->processPair(*m, dummy,
                        distanceVector, MOLECULE_HALOMOLECULE, dd, (dd
                            < _LJCutoffRadiusSquare));

                  }
              }
          }

      }