// Exercise 6
//
// Write a unit cell class. Provide a constructor to store the
// cell parameters, and be able to read them back

#include <iostream>

class Unitcell {
public:
  // Constructors
  // Full constructor
  Unitcell(double a, double b, double c,
	   double alpha, double beta, double gamma) {
    a1 = a; b1 = b; c1 = c;
    alpha1 = alpha; beta1 = beta; gamma1 = gamma;
  }
  // Partial - assume that cell angles are all 90 degrees
  Unitcell(double a, double b, double c) {
    a1 = a; b1 = b; c1 = c;
    alpha1 = 90.0; beta1 = 90.0; gamma1 = 90.0;
  }
  // Accessors for each element
  // Cell lengths (Angstroms)
  double a() { return a1; }
  double b() { return b1; }
  double c() { return c1; }
  // Cell angles (Degrees)
  double alpha() { return alpha1; }
  double beta()  { return beta1; }
  double gamma() { return gamma1; }
  // Cell angles (Radians)
  double alpha_rad() { return alpha()*pi()/180.0; }
  double beta_rad()  { return beta()*pi()/180.0; }
  double gamma_rad() { return gamma()*pi()/180.0; }
private:
  // Cell lengths
  double a1,b1,c1;
  // Cell angles
  double alpha1,beta1,gamma1;
  // Value of pi
  double pi() { return 3.142; }
};

// Function to display contents of a Unitcell object
int displaycell(Unitcell c) {
  std::cout << "Unit cell parameters:\n";
  std::cout << "\ta\t= " << c.a() << "\n";
  std::cout << "\tb\t= " << c.b() << "\n";
  std::cout << "\tc\t= " << c.c() << "\n";
  std::cout << "\talpha\t= " << c.alpha() << "\n";
  std::cout << "\tbeta\t= " << c.beta() << "\n";
  std::cout << "\tgamma\t= " << c.gamma() << "\n";
  return 1;
}

// Function to display cell angles in degrees and radians
int displayangles(Unitcell c) {
  std::cout << "Unit cell angles:\n";
  std::cout << "\talpha\t= " << c.alpha() << "\t" << c.alpha_rad() << "\n";
  std::cout << "\tbeta\t= " << c.beta() << "\t" << c.beta_rad() << "\n";
  std::cout << "\tgamma\t= " << c.gamma() << "\t" << c.gamma_rad() << "\n";
  return 1;
}

// Test program
int main(int argc, char** argv) {
  // Set up a full unit cell
  Unitcell c1(10.0,20.0,30.0,120.0,90.0,90.0);
  displaycell(c1);
  // Set up a cell with default angles 90 degrees
  Unitcell c2(93.0,76.0,37.0);
  displaycell(c2);
  // Display cell angles
  displayangles(c1);
}
