#include "compute_temp_uef.h"
#include <cstring>
#include "fix_nh_uef.h"
#include "modify.h"
#include "fix.h"
#include "error.h"
using namespace LAMMPS_NS;
ComputeTempUef::ComputeTempUef(LAMMPS *lmp, int narg, char **arg) :
ComputeTemp(lmp, narg, arg)
{
rot_flag=true;
}
void ComputeTempUef::init()
{
ComputeTemp::init();
int i=0;
for (i=0; i<modify->nfix; i++) {
if (strcmp(modify->fix[i]->style,"nvt/uef")==0)
break;
if (strcmp(modify->fix[i]->style,"npt/uef")==0)
break;
}
if (i==modify->nfix)
error->all(FLERR,"Can't use compute temp/uef without defining a fix nvt/npt/uef");
ifix_uef=i;
}
void ComputeTempUef::compute_vector()
{
ComputeTemp::compute_vector();
if (rot_flag) {
double rot[3][3];
( (FixNHUef*) modify->fix[ifix_uef])->get_rot(rot);
virial_rot(vector,rot);
}
}
void ComputeTempUef::yes_rot()
{
rot_flag =true;
}
void ComputeTempUef::no_rot()
{
rot_flag =false;
}
void ComputeTempUef::virial_rot(double *x, const double r[3][3])
{
double t[3][3];
for (int k = 0; k<3; ++k) {
t[0][k] = x[0]*r[0][k] + x[3]*r[1][k] + x[4]*r[2][k];
t[1][k] = x[3]*r[0][k] + x[1]*r[1][k] + x[5]*r[2][k];
t[2][k] = x[4]*r[0][k] + x[5]*r[1][k] + x[2]*r[2][k];
}
x[0] = r[0][0]*t[0][0] + r[1][0]*t[1][0] + r[2][0]*t[2][0];
x[3] = r[0][0]*t[0][1] + r[1][0]*t[1][1] + r[2][0]*t[2][1];
x[4] = r[0][0]*t[0][2] + r[1][0]*t[1][2] + r[2][0]*t[2][2];
x[1] = r[0][1]*t[0][1] + r[1][1]*t[1][1] + r[2][1]*t[2][1];
x[5] = r[0][1]*t[0][2] + r[1][1]*t[1][2] + r[2][1]*t[2][2];
x[2] = r[0][2]*t[0][2] + r[1][2]*t[1][2] + r[2][2]*t[2][2];
}