package ppmrmn;

public class Nmr extends Jacobi {

  private double omegaQ, omegaRF;
  private double spin = (n - 1)/2.0; //Attention

  public Nmr(double omeQ, double omeRF) { //omeQ and omeRF in kHz unit
    omegaQ =  omeQ*(2*Math.PI);   // omegaQ in rad/s unit
    omegaRF = omeRF*(2*Math.PI);  // omegaRF in rad/s unit
  }

  public RealMat dataIn() {
    RealMat matH = new RealMat(); //matH : matrix of an x-pulse and
                                  //the first-ordre quadrupole Hamiltonians
    for (int i = 0; i < n; i++)
      matH.re[i][i] = omegaQ*(3*(spin - i)*(spin - i) - spin*(spin + 1))/3;
    for (int i = 0; i < n - 1; i++) {
      matH.re[i][i+1] = -omegaRF*Math.sqrt(spin*(spin + 1)
                        - (spin - i)*(spin - i - 1))/2;
      matH.re[i+1][i] = matH.re[i][i+1];
    }
    return matH;
  } // End of dataIn()

  public RealMat matriceQuadrupole(){
    RealMat matH = new RealMat(); //matH : first-ordre quadrupole Hamiltonian
    for (int i = 0; i < n; i++)
      matH.re[i][i] = omegaQ*(3*(spin - i)*(spin - i) - spin*(spin + 1))/3;
    return matH;
  }

  public RealMat matriceIz() {
    RealMat matIz = new RealMat();
    for (int i = 0; i < n; i++)  matIz.re[i][i] = spin - i;
    return matIz;
  }

  public ComplexMat matriceHamilton(RealMat matH, double t) {
    double c = 0;
    ComplexMat matHH = new ComplexMat();
    for (int i = 0; i < n; i++) {
      c = matH.re[i][i]*t;
      matHH.re[i][i] = Math.cos(c);
      matHH.im[i][i] = Math.sin(c);
    }
    return matHH;
  }

  public double getOmegaQ() {
    return omegaQ;
  }

  public void setOmegaQ(double x) {
    this.omegaQ = x;
  }

  public double getOmegaRF() {
    return omegaRF;
  }

  public double getSpin() {
    return spin;
  }

} //End of class Nmr