5#ifndef OILAB_GBMESOSTATEENSEMBLEIMPLEMENTATION_H
6#define OILAB_GBMESOSTATEENSEMBLEIMPLEMENTATION_H
16 const double& bhalfMax):
20 ensembleCslVectors.end()),
22 ensembleCslVectors(ensembleCslVectors),
23 bicrystalConfig(getBicrystalConfig((const
GbShifts<dim>&) *this,
26 std::cout <<
"--------------------GBMesoStateEnsemble class construction ---------------------------" << std::endl;
27 std::cout <<
"Forming mesostate ensemble with material parameters: ";
30 std::cout << std::endl;
32 std::cout <<
"Ensemble CSL vectors:" << std::endl;
34 std::cout << latticeVector.cartesian().transpose() << std::endl;
35 std::cout << std::endl;
45 auto allLatticeVectors= gbs.
gb.bc.box(ensembleCslVectors,1,1,
"bc.txt");
46 std::vector<LatticeVector<dim>> output;
49 for (
const auto& latticeVector : allLatticeVectors) {
50 if (&latticeVector.lattice == &gbs.
gb.bc.A || &latticeVector.lattice == &gbs.
gb.bc.B)
51 output.push_back(latticeVector);
63 assert(bShiftPairs.size() == constraints.size());
65 std::deque<std::tuple<LatticeVector<dim>,
VectorDimD,
int>> bsPairs;
66 for(
int i=0; i<bShiftPairs.size(); ++i) {
67 if (constraints(i) == 1 || constraints(i) == 2) {
68 const auto& b= bShiftPairs[i].first;
69 auto shift= bShiftPairs[i].second;
70 bsPairs.push_back(std::make_tuple(b,shift,constraints(i)));
80 std::deque<Constraints> constraintsEnsemble(enumerateConstraints( (
const GbShifts<dim>&) *
this));
81 std::cout <<
"Number of mesostates in the ensemble = " << constraintsEnsemble.size() << std::endl;
82 std::cout << std::endl;
83 std::cout <<
"------------------------------" << std::endl;
84 std::map<Constraints,GbMesoState<dim>> mesoStates;
87 for(
const Constraints& constraints : constraintsEnsemble)
90 if (constraints(0) != 1)
continue;
92 mesoStates.emplace(constraints,constructMesoState(constraints));
94 std::cout <<
"Constructing mesostate " << count <<
" of " << constraintsEnsemble.size() << std::endl;
95 std::cout <<
"Mesostate signature: " << constraints.transpose() << std::endl;
96 if (!filename.empty())
98 mesoStates.at(constraints).box(filename + std::to_string(count));
100 catch(std::runtime_error& e)
102 std::cout << e.what() << std::endl;
112 std::deque<std::tuple<LatticeVector<dim>,
VectorDimD,
int>> bsPairs(bsPairsFromConstraints(this->bShiftPairs,constraints));
114 GbMesoState<dim> mesostate(this->gb, this->axis, bsPairs, ensembleCslVectors, bicrystalConfig);
117 catch(std::runtime_error& e)
242 std::deque<Constraints> constraintsEnsemble;
248 std::vector<int> cslIndices;
252 cslIndices.push_back(i);
255 for (
auto& tuple : tuples) {
260 for(
const auto& index : cslIndices) {
261 if (tuple(index) == 0)
277 constraintsEnsemble.push_back(tuple);
280 return constraintsEnsemble;
286 const bool& randomize)
const
289 Constraints newConstraints(this->bShiftPairs.size());
290 bool msConstructionSuccess =
false;
291 while (!msConstructionSuccess) {
293 newConstraints = currentConstraints;
296 for (
auto &elem: newConstraints)
297 elem = random<int>(0, 2);
299 int randomSpot = random<int>(0, this->bShiftPairs.size() - 1);
300 newConstraints(randomSpot) = random<int>(0, 2);
304 bsPairsFromConstraints(this->bShiftPairs, newConstraints),
307 msConstructionSuccess =
true;
309 catch (std::runtime_error &e) {
313 return newConstraints;
320 Constraints initialConstraints(this->bShiftPairs.size());
321 initialConstraints.setZero();
322 return initialConstraints;
std::map< Constraints, GbMesoState< dim > > collectMesoStates(const std::string &filename="") const
Constructs an ensemble of mesostates.
std::vector< LatticeVector< dim > > BicrystalLatticeVectors
Constraints sampleNewState(const Constraints ¤tConstraints, const bool &randomize=false) const
static std::deque< Constraints > enumerateConstraints(const GbShifts< dim > &gbs)
typename LatticeCore< dim >::VectorDimD VectorDimD
static BicrystalLatticeVectors getBicrystalConfig(const GbShifts< dim > &gbs, std::vector< LatticeVector< dim > > &ensembleCslVectors)
Constructs bicrystalConfig and ensembleCslVectors.
std::vector< LatticeVector< dim > > ensembleCslVectors
GbMesoStateEnsemble(const Gb< dim > &gb, const ReciprocalLatticeVector< dim > &axis, std::vector< LatticeVector< dim > > &ensembleCslVectors, const double &bhalfMax)
static std::deque< std::tuple< LatticeVector< dim >, VectorDimD, int > > bsPairsFromConstraints(const std::vector< std::pair< LatticeVector< dim >, VectorDimD > > &bShiftPairs, const Constraints &constraints)
Constraints initializeState() const
GbMesoState< dim > constructMesoState(const Constraints &constraints) const
Evove mesostates using a Monte Carlo algorithm.
std::vector< std::pair< LatticeVector< dim >, VectorDimD > > bShiftPairs
static void generate_tuples(int n, int k, std::vector< XTuplet > &results, XTuplet ¤t_tuple, int index)