PSCF v1.1
UnitCell.h
1#ifndef PSCF_UNIT_CELL_H
2#define PSCF_UNIT_CELL_H
3
4/*
5* PSCF - Polymer Self-Consistent Field Theory
6*
7* Copyright 2016 - 2022, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include "UnitCellBase.h"
12#include <iostream>
13#include <iomanip>
14
15namespace Pscf
16{
17
18 using namespace Util;
19
42 template <int D>
43 class UnitCell : public UnitCellBase<D>
44 {};
45
46 // Function declations (friends of explicit instantiations)
47
56 template <int D>
57 std::istream& operator >> (std::istream& in, UnitCell<D>& cell);
58
67 template <int D>
68 std::ostream& operator << (std::ostream& out, UnitCell<D> const& cell);
69
78 template <class Archive, int D>
79 void
80 serialize(Archive& ar, UnitCell<D>& cell, const unsigned int version);
81
96 template <int D>
97 void readUnitCellHeader(std::istream& in, UnitCell<D>& cell);
98
106 template <int D>
107 void writeUnitCellHeader(std::ostream& out, UnitCell<D> const& cell);
108
109 /*
110 * Read common part of field header (fortran PSCF format).
111 *
112 * \param ver1 major file format version number (output)
113 * \param ver2 major file format version number (output)
114 * \param cell UnitCell<D> object (output)
115 * \param groupName string identifier for space group (output)
116 * \param nMonomer number of monomers (output)
117 * \ingroup Pscf_Crystal_Module
118 */
119 template <int D>
120 void readFieldHeader(std::istream& in, int& ver1, int& ver2,
121 UnitCell<D>& cell, std::string& groupName,
122 int& nMonomer);
123
124 /*
125 * Write common part of field header (fortran PSCF format).
126 *
127 * \param ver1 major file format version number (input)
128 * \param ver2 major file format version number (input)
129 * \param cell UnitCell<D> object (input)
130 * \param groupName string identifier for space group (input)
131 * \param nMonomer number of monomers (input)
132 * \ingroup Pscf_Crystal_Module
133 */
134 template <int D>
135 void writeFieldHeader(std::ostream &out, int ver1, int ver2,
136 UnitCell<D> const & cell,
137 std::string const & groupName,
138 int nMonomer);
139
140 // 1D Unit Cell
141
147 template <>
148 class UnitCell<1> : public UnitCellBase<1>
149 {
150 public:
151
155 enum LatticeSystem {Lamellar, Null};
156
160 UnitCell();
161
167 UnitCell<1>& operator = (const UnitCell<1>& other);
168
176 void set(UnitCell<1>::LatticeSystem lattice);
177
184 void set(UnitCell<1>::LatticeSystem lattice,
186
193 { return lattice_; }
194
196
197 private:
198
199 // Lattice type (lamellar or Null)
200 LatticeSystem lattice_;
201
202 // Set number of parameters required to describe current lattice type
203 void setNParameter();
204
205 // Set all internal data after setting parameter values
206 void setBasis();
207
208 // Private and unimplemented to prevent copy construction.
209 UnitCell(UnitCell<1> const &);
210
211 // friends:
212
213 template <int D>
214 friend std::istream& operator >> (std::istream&, UnitCell<D>& );
215
216 template <int D>
217 friend std::ostream& operator << (std::ostream&, UnitCell<D> const&);
218
219 template <class Archive, int D>
220 friend void serialize(Archive& , UnitCell<D>& , const unsigned int);
221
222 template <int D>
223 friend void readUnitCellHeader(std::istream&, UnitCell<D>& );
224
225 template <int D>
226 friend void writeUnitCellHeader(std::ostream&, UnitCell<D> const&);
227
228 };
229
238 std::istream& operator >> (std::istream& in,
239 UnitCell<1>::LatticeSystem& lattice);
240
249 std::ostream& operator << (std::ostream& out,
250 UnitCell<1>::LatticeSystem lattice);
251
259 template <class Archive>
260 inline
261 void serialize(Archive& ar, UnitCell<1>::LatticeSystem& lattice,
262 const unsigned int version)
263 { serializeEnum(ar, lattice, version); }
264
265
266 // 2D Unit Cell
267
273 template <>
274 class UnitCell<2> : public UnitCellBase<2>
275 {
276 public:
277
281 enum LatticeSystem {Square, Rectangular, Rhombic, Hexagonal,
282 Oblique, Null};
283
287 UnitCell();
288
294 UnitCell<2>& operator = (const UnitCell<2>& other);
295
303 void set(UnitCell<2>::LatticeSystem lattice);
304
311 void set(UnitCell<2>::LatticeSystem lattice,
313
320 { return lattice_; }
321
322 private:
323
324 // Lattice system (square, rectangular, etc.)
325 LatticeSystem lattice_;
326
327 // Set number of parameters required to describe current lattice type
328 void setNParameter();
329
330 // Set all internal data after setting parameter values
331 void setBasis();
332
333 // Private and unimplemented to prevent copy construction.
334 UnitCell(UnitCell<2> const &);
335
336 // friends:
337
338 template <int D>
339 friend std::istream& operator >> (std::istream&, UnitCell<D>& );
340
341 template <int D>
342 friend std::ostream& operator << (std::ostream&, UnitCell<D> const&);
343
344 template <class Archive, int D>
345 friend void serialize(Archive& , UnitCell<D>& , const unsigned int );
346
347 template <int D>
348 friend void readUnitCellHeader(std::istream&, UnitCell<D>& );
349
350 template <int D>
351 friend void writeUnitCellHeader(std::ostream&, UnitCell<D> const&);
352
353 };
354
363 std::istream& operator >> (std::istream& in,
364 UnitCell<2>::LatticeSystem& lattice);
365
373 std::ostream& operator << (std::ostream& out,
374 UnitCell<2>::LatticeSystem lattice);
375
383 template <class Archive>
384 inline
385 void serialize(Archive& ar, UnitCell<2>::LatticeSystem& lattice,
386 const unsigned int version)
387 { serializeEnum(ar, lattice, version); }
388
389
390 // 3D crystal unit cell
391
397 template <>
398 class UnitCell<3> : public UnitCellBase<3>
399 {
400 public:
401
408 enum LatticeSystem {Cubic, Tetragonal, Orthorhombic, Monoclinic,
409 Triclinic, Rhombohedral, Hexagonal, Null};
410
414 UnitCell();
415
421 UnitCell<3>& operator = (const UnitCell<3>& other);
422
430 void set(UnitCell<3>::LatticeSystem lattice);
431
438 void set(UnitCell<3>::LatticeSystem lattice,
440
447 { return lattice_; }
448
449 private:
450
451 LatticeSystem lattice_;
452
453 // Set number of parameters required to describe current lattice type
454 void setNParameter();
455
456 // Set all internal data after setting parameter values
457 void setBasis();
458
459 // Private and unimplemented to prevent copy construction.
460 UnitCell(UnitCell<3> const &);
461
462 // friends:
463
464 template <int D>
465 friend std::istream& operator >> (std::istream&, UnitCell<D>& );
466
467 template <int D>
468 friend std::ostream& operator << (std::ostream&, UnitCell<D> const&);
469
470 template <class Archive, int D>
471 friend void serialize(Archive& , UnitCell<D>& , const unsigned int);
472
473 template <int D>
474 friend void readUnitCellHeader(std::istream&, UnitCell<D>& );
475
476 template <int D>
477 friend void writeUnitCellHeader(std::ostream&, UnitCell<D> const&);
478
479 };
480
489 std::istream& operator >> (std::istream& in,
490 UnitCell<3>::LatticeSystem& lattice);
491
500 std::ostream& operator << (std::ostream& out,
501 UnitCell<3>::LatticeSystem lattice);
502
510 template <class Archive>
511 inline
512 void serialize(Archive& ar, UnitCell<3>::LatticeSystem& lattice,
513 const unsigned int version)
514 { serializeEnum(ar, lattice, version); }
515
516}
517
518#include "UnitCell.tpp"
519#endif
Base class template for a crystallographic unit cell.
Definition: UnitCellBase.h:30
bool isInitialized() const
Has this unit cell been initialized?
Definition: UnitCellBase.h:141
FSArray< double, 6 > parameters() const
Get the parameters of this unit cell.
Definition: UnitCellBase.h:251
LatticeSystem lattice() const
Return lattice system enumeration value.
Definition: UnitCell.h:192
LatticeSystem
Enumeration of 1D lattice system types.
Definition: UnitCell.h:155
LatticeSystem lattice() const
Return lattice system enumeration value.
Definition: UnitCell.h:319
LatticeSystem
Enumeration of 2D lattice system types.
Definition: UnitCell.h:281
LatticeSystem lattice() const
Return lattice system enumeration value.
Definition: UnitCell.h:446
LatticeSystem
Enumeration of the 7 possible 3D Bravais lattice systems.
Definition: UnitCell.h:408
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition: UnitCell.h:44
A fixed capacity (static) contiguous array with a variable logical size.
Definition: FSArray.h:38
void writeUnitCellHeader(std::ostream &out, UnitCell< D > const &cell)
Write UnitCell<D> to a field file header (fortran PSCF format).
Definition: UnitCell.tpp:91
void readUnitCellHeader(std::istream &in, UnitCell< D > &cell)
Read UnitCell<D> from a field file header (fortran PSCF format).
Definition: UnitCell.tpp:61
void serializeEnum(Archive &ar, T &data, const unsigned int version=0)
Serialize an enumeration value.
Definition: serialize.h:42
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.
Definition: accumulators.mod:1
std::istream & operator>>(std::istream &in, Pair< Data > &pair)
Input a Pair from an istream.
Definition: Pair.h:44
std::ostream & operator<<(std::ostream &out, const Pair< Data > &pair)
Output a Pair to an ostream, without line breaks.
Definition: Pair.h:57