MDStressLab++
BoxConfiguration.cpp
Go to the documentation of this file.
1 /*
2  * BoxConfiguration.cpp
3  *
4  * Created on: Nov 4, 2019
5  * Author: Nikhil
6  */
7 
8 #include <fstream>
9 #include "BoxConfiguration.h"
10 #include "Configuration.h"
11 #include "typedef.h"
12 #include "neighbor_list.h"
13 #include "helper.hpp"
14 
15 
16 BoxConfiguration::BoxConfiguration(int numberOfParticles, int referenceAndFinal):
17  Configuration(numberOfParticles,referenceAndFinal)
18 {
19  MY_HEADING("Initializing a box configuration");
20  if (referenceAndFinal)
21  std::cout << "Creating a configuration of " << numberOfParticles << " particles" <<
22  " along with reference coordinates in a box of size zero" << std::endl;
23  else
24  std::cout << "Creating a configuration of " << numberOfParticles << " particles" <<
25  " in a box of size zero" << std::endl;
26  // Default to zero box sizes and no pbc
27  box.setZero();
28  reference_box.setZero();
29  pbc.setZero();
30 }
31 
32 
33 void BoxConfiguration::read(std::string configFileName, int referenceAndFinal)
34 {
35  // Read in the atomistic system
36  std::cout << "Reading the box configuration from file " << configFileName << std::endl;
37  std::ifstream file(configFileName);
38  if(!file)
39  {
40  // Print an error and exit
41  std::cerr << "ERROR: " << configFileName << " could not be opened for reading!" << std::endl;
42  exit(1);
43  }
44 
45  int numberOfParticlesInFile;
46  file >> numberOfParticlesInFile;
47  if (numberOfParticles != numberOfParticlesInFile)
48  MY_ERROR("Error: Number of particles in file does not equal to that of BoxConfiguration");
49 
50  for(int i=0;i<DIM*DIM;++i)
51  if(!(file >> reference_box(i))) MY_ERROR("ERROR: Reference box size.");
52  for(int i=0;i<DIM*DIM;++i)
53  if(!(file >> box(i))) MY_ERROR("ERROR: Box size.");
54  for(int i=0;i<DIM;++i)
55  if(!(file >> pbc(i))) MY_ERROR("ERROR: PBC.");
56 
57 
58  std::string speciesTemp;
59  for(int i=0;i<numberOfParticles;++i)
60  {
61  if(!(file >> speciesTemp)) MY_ERROR("ERROR: Species code of particle " + std::to_string(i));
62  species.push_back(speciesTemp);
63  for(int j=0;j<DIM;++j)
64  if(!(file >> coordinates[Current](i,j))) MY_ERROR("ERROR: Coordinate of particle " + std::to_string(i));
65  for(int j=0;j<DIM;++j)
66  if(!(file >> velocities(i,j))) MY_ERROR("ERROR: Velocity of particle " + std::to_string(i));
67  if (referenceAndFinal == true)
68  {
69  for(int j=0;j<DIM;++j)
70  if(!(file >> coordinates[Reference](i,j)))
71  MY_ERROR("ERROR: Reference coordinate of particle " + std::to_string(i) + "\n");
72  }
73  else
74  {
75  file.ignore(32767, '\n');
76  }
77  }
78  std::cout << std::endl;
79  std::cout << "Box size = " << std::endl;
80  std::cout << box << std::endl;
81  std::cout << std::endl;
82  std::cout << "Reference box size = " << std::endl;
83  std::cout << reference_box << std::endl;
84  std::cout << std::endl;
85  std::cout << "Periodic boundary conditions = " << pbc << std::endl;
86 
87 
88 }
89 
91 {
92  // Build padding atoms
93  int numberOfPaddings{0};
94  std::vector<double> reference_coordinatesOfPaddings,coordinatesOfPaddings;
95  std::vector<std::string> speciesOfPaddings;
96  std::vector<int> masterOfPaddings;
97  int referenceAndFinal= (coordinates.at(Reference).rows()>0);
98 
100  padding,
101  reference_box.data(),
102  box.data(),
103  pbc.data(),
104  coordinates.at(Reference).data(),
105  coordinates.at(Current).data(),
106  species,
107  numberOfPaddings,
108  reference_coordinatesOfPaddings,
109  coordinatesOfPaddings,
110  speciesOfPaddings,
111  masterOfPaddings,
112  referenceAndFinal);
113 
114  int total= numberOfParticles + numberOfPaddings;
115 
116  Configuration* config_ptr(new Configuration{total,referenceAndFinal});
117 
118  // copy the coordinates, particleContributing and species
119  // of contributing atoms from BoxConfiguration to Configuration
120  if (referenceAndFinal) (config_ptr->coordinates.at(Reference)).topRows(numberOfParticles)= coordinates.at(Reference);
121  (config_ptr->coordinates.at(Current)).topRows(numberOfParticles)= coordinates.at(Current);
122  for (auto it= species.begin();it!= species.end();it++)
123  config_ptr->species.push_back(*it);
124 
125  if (numberOfPaddings)
126  {
127  if (referenceAndFinal) config_ptr->coordinates.at(Reference).bottomRows(numberOfPaddings)=
128  *new Eigen::Map<MatrixXd> (reference_coordinatesOfPaddings.data(),numberOfPaddings,DIM);
129  config_ptr->coordinates.at(Current).bottomRows(numberOfPaddings)=
130  *new Eigen::Map<MatrixXd> (coordinatesOfPaddings.data(),numberOfPaddings,DIM);
131  for (auto it= speciesOfPaddings.begin();it!= speciesOfPaddings.end();it++)
132  config_ptr->species.push_back(*it);
133  }
134 
135  return config_ptr;
136 }
138  // TODO Auto-generated destructor stub
139 }
140 
#define MY_HEADING(heading)
Definition: typedef.h:36
std::map< ConfigType, MatrixXd > coordinates
Definition: Configuration.h:24
Configuration * getConfiguration(double) const
BoxConfiguration(int, int)
void read(std::string, int)
MatrixXd velocities
Definition: Configuration.h:25
#define MY_ERROR(message)
Definition: typedef.h:17
std::vector< std::string > species
Definition: Configuration.h:23
int nbl_create_paddings(int const numberOfParticles, double const cutoff, double const *reference_cell, double const *cell, int const *PBC, double const *reference_coordinates, double const *coordinates, const std::vector< std::string > &speciesCode, int &numberOfPaddings, std::vector< double > &reference_coordinatesOfPaddings, std::vector< double > &coordinatesOfPaddings, std::vector< std::string > &speciesCodeOfPaddings, std::vector< int > &masterOfPaddings, int referenceAndFinal)
const int DIM
Definition: typedef.h:51