PSCF v1.3
UnitCell.h
1#ifndef PRDC_UNIT_CELL_H
2#define PRDC_UNIT_CELL_H
3
4/*
5* PSCF - Polymer Self-Consistent Field
6*
7* Copyright 2015 - 2025, 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 <util/format/Dbl.h>
13
14#include <iostream>
15#include <iomanip>
16
17namespace Pscf {
18namespace Prdc {
19
20 using namespace Util;
21
54 template <int D>
55 class UnitCell : public UnitCellBase<D>
56 {};
57
58 // Function template declarations
59
71 template <int D>
72 std::istream& operator >> (std::istream& in, UnitCell<D>& cell);
73
82 template <int D>
83 std::ostream& operator << (std::ostream& out, UnitCell<D> const& cell);
84
93 template <class Archive, int D>
94 void
95 serialize(Archive& ar, UnitCell<D>& cell, const unsigned int version);
96
97 // 1D Unit Cell
98
104 template <>
105 class UnitCell<1> : public UnitCellBase<1>
106 {
107 public:
108
112 enum LatticeSystem {Lamellar, Null};
113
117 UnitCell();
118
128 UnitCell<1>& operator = (const UnitCell<1>& other);
129
141 void set(UnitCell<1>::LatticeSystem lattice);
142
153 void set(UnitCell<1>::LatticeSystem lattice,
155
162 { return lattice_; }
163
167 double volume() const;
168
170
171 private:
172
173 // Lattice type (lamellar or Null)
174 LatticeSystem lattice_;
175
176 // Set number of parameters required to describe current lattice type
177 void setNParameter();
178
179 // Set all internal data after setting parameter values
180 void setBasis();
181
182 // Private and unimplemented to prevent copy construction.
183 UnitCell(UnitCell<1> const &);
184
185 // friends:
186
187 template <int D>
188 friend std::istream& operator >> (std::istream&, UnitCell<D>& );
189
190 template <int D>
191 friend std::ostream& operator << (std::ostream&, UnitCell<D> const&);
192
193 template <class Archive, int D>
194 friend void serialize(Archive& , UnitCell<D>& , const unsigned int);
195
196 template <int D>
197 friend void readUnitCellHeader(std::istream&, UnitCell<D>& );
198
199 template <int D>
200 friend void writeUnitCellHeader(std::ostream&, UnitCell<D> const&);
201
202 };
203
212 std::istream& operator >> (std::istream& in,
214
223 std::ostream& operator << (std::ostream& out,
225
233 template <class Archive>
234 inline
235 void serialize(Archive& ar, UnitCell<1>::LatticeSystem& lattice,
236 const unsigned int version)
237 { serializeEnum(ar, lattice, version); }
238
239
240 // 2D Unit Cell
241
247 template <>
248 class UnitCell<2> : public UnitCellBase<2>
249 {
250 public:
251
255 enum LatticeSystem {Square, Rectangular, Rhombic, Hexagonal,
256 Oblique, Null};
257
261 UnitCell();
262
272 UnitCell<2>& operator = (const UnitCell<2>& other);
273
285 void set(UnitCell<2>::LatticeSystem lattice);
286
298 void set(UnitCell<2>::LatticeSystem lattice,
300
307 { return lattice_; }
308
312 double volume() const;
313
314 private:
315
316 // Lattice system (square, rectangular, etc.)
317 LatticeSystem lattice_;
318
319 // Set number of parameters required to describe current lattice type
320 void setNParameter();
321
322 // Set all internal data after setting parameter values
323 void setBasis();
324
325 // Private and unimplemented to prevent copy construction.
326 UnitCell(UnitCell<2> const &);
327
328 // friends:
329
330 template <int D>
331 friend std::istream& operator >> (std::istream&, UnitCell<D>& );
332
333 template <int D>
334 friend std::ostream& operator << (std::ostream&, UnitCell<D> const&);
335
336 template <class Archive, int D>
337 friend void serialize(Archive& , UnitCell<D>& , const unsigned int );
338
339 template <int D>
340 friend void readUnitCellHeader(std::istream&, UnitCell<D>& );
341
342 template <int D>
343 friend void writeUnitCellHeader(std::ostream&, UnitCell<D> const&);
344
345 };
346
355 std::istream& operator >> (std::istream& in,
357
365 std::ostream& operator << (std::ostream& out,
367
375 template <class Archive>
376 inline
377 void serialize(Archive& ar, UnitCell<2>::LatticeSystem& lattice,
378 const unsigned int version)
379 { serializeEnum(ar, lattice, version); }
380
381
382 // 3D crystal unit cell
383
389 template <>
390 class UnitCell<3> : public UnitCellBase<3>
391 {
392 public:
393
400 enum LatticeSystem {Cubic, Tetragonal, Orthorhombic, Monoclinic,
401 Triclinic, Rhombohedral, Hexagonal, Null};
402
406 UnitCell();
407
417 UnitCell<3>& operator = (const UnitCell<3>& other);
418
430 void set(UnitCell<3>::LatticeSystem lattice);
431
443 void set(UnitCell<3>::LatticeSystem lattice,
445
452 { return lattice_; }
453
457 double volume() const;
458
459 private:
460
461 LatticeSystem lattice_;
462
463 // Set number of parameters required to describe current lattice type
464 void setNParameter();
465
466 // Set all internal data after setting parameter values
467 void setBasis();
468
469 // Private and unimplemented to prevent copy construction.
470 UnitCell(UnitCell<3> const &);
471
472 // friends:
473
474 template <int D>
475 friend std::istream& operator >> (std::istream&, UnitCell<D>& );
476
477 template <int D>
478 friend std::ostream& operator << (std::ostream&, UnitCell<D> const&);
479
480 template <class Archive, int D>
481 friend void serialize(Archive& , UnitCell<D>& , const unsigned int);
482
483 template <int D>
484 friend void readUnitCellHeader(std::istream&, UnitCell<D>& );
485
486 template <int D>
487 friend void writeUnitCellHeader(std::ostream&, UnitCell<D> const&);
488
489 };
490
499 std::istream& operator >> (std::istream& in,
501
510 std::ostream& operator << (std::ostream& out,
512
513 // General Function Templates
514
515 /*
516 * Serialize to/from an archive.
517 */
518 template <class Archive, int D>
519 void serialize(Archive& ar, UnitCell<D>& cell,
520 const unsigned int version)
521 {
522 serializeEnum(ar, cell.lattice_, version);
523 ar & cell.nParameter_;
524 for (int i = 0; i < cell.nParameter_; ++i) {
525 ar & cell.parameters_[i];
526 }
527 }
528
536 template <class Archive>
537 inline
538 void serialize(Archive& ar, UnitCell<3>::LatticeSystem& lattice,
539 const unsigned int version)
540 { serializeEnum(ar, lattice, version); }
541
542
543 // UnitCell stream IO operator template definitions
544
545 template <int D>
546 std::istream& operator >> (std::istream& in,
547 UnitCell<D>& cell)
548 {
550 in >> lattice;
551 cell.set(lattice);
552 for (int i = 0; i < cell.nParameter_; ++i) {
553 in >> cell.parameters_[i];
554 }
555 cell.setLattice();
556 return in;
557 }
558
559 template <int D>
560 std::ostream& operator << (std::ostream& out,
561 UnitCell<D> const & cell)
562 {
563 out << cell.lattice_;
564 for (int i = 0; i < cell.nParameter_; ++i) {
565 out << Dbl(cell.parameters_[i], 18, 10);
566 }
567 return out;
568 }
569
570 #ifndef PRDC_UNIT_CELL_TPP
571 // Suppress implicit instantiation
572
573 extern template class UnitCell<1>;
574 extern template class UnitCell<2>;
575 extern template class UnitCell<3>;
576
577 extern std::ostream& operator << (std::ostream& out,
579 extern std::ostream& operator << (std::ostream& out,
581 extern std::ostream& operator << (std::ostream& out,
583
584 extern std::istream& operator >> (std::istream& in,
585 UnitCell<1>::LatticeSystem const& lattice);
586 extern std::istream& operator >> (std::istream& in,
587 UnitCell<2>::LatticeSystem const& lattice);
588 extern std::istream& operator >> (std::istream& in,
589 UnitCell<3>::LatticeSystem const& lattice);
590 #endif
591
592}
593}
594#endif
Base class template for a crystallographic unit cell.
bool isInitialized() const
Has this unit cell been initialized?
FSArray< double, 6 > parameters() const
Get the parameters of this unit cell.
FArray< double, 6 > parameters_
Parameters used to describe the unit cell.
void setLattice()
Compute all protected data, given latticeSystem and parameters.
int nParameter_
Number of parameters required to specify unit cell.
friend void serialize(Archive &, UnitCell< D > &, const unsigned int)
Serialize to/from an archive.
Definition UnitCell.h:519
LatticeSystem lattice() const
Return lattice system enumeration value.
Definition UnitCell.h:161
LatticeSystem
Enumeration of 1D lattice system types.
Definition UnitCell.h:112
LatticeSystem
Enumeration of 2D lattice system types.
Definition UnitCell.h:255
LatticeSystem lattice() const
Return lattice system enumeration value.
Definition UnitCell.h:306
LatticeSystem
Enumeration of the 7 possible 3D Bravais lattice systems.
Definition UnitCell.h:400
LatticeSystem lattice() const
Return lattice system enumeration value.
Definition UnitCell.h:451
Base template for UnitCell<D> classes, D=1, 2 or 3.
Definition UnitCell.h:56
Wrapper for a double precision number, for formatted ostream output.
Definition Dbl.h:40
A fixed capacity (static) contiguous array with a variable logical size.
Definition FSArray.h:38
void readUnitCellHeader(std::istream &in, UnitCell< D > &cell)
Read UnitCell<D> from a field file header (fortran PSCF format).
void writeUnitCellHeader(std::ostream &out, UnitCell< D > const &cell)
Write UnitCell<D> to a field file header (fortran PSCF format).
void serializeEnum(Archive &ar, T &data, const unsigned int version=0)
Serialize an enumeration value.
Definition serialize.h:59
Periodic fields and crystallography.
Definition CField.cpp:11
PSCF package top-level namespace.
Definition param_pc.dox: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