git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@14829 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
@ -10,26 +10,22 @@
|
||||
colvar::cvc::cvc()
|
||||
: sup_coeff(1.0),
|
||||
sup_np(1),
|
||||
b_enabled(true),
|
||||
b_periodic(false),
|
||||
b_inverse_gradients(false),
|
||||
b_Jacobian_derivative(false),
|
||||
b_debug_gradients(false)
|
||||
b_try_scalable(true)
|
||||
{}
|
||||
|
||||
|
||||
colvar::cvc::cvc(std::string const &conf)
|
||||
: sup_coeff(1.0),
|
||||
sup_np(1),
|
||||
b_enabled(true),
|
||||
b_periodic(false),
|
||||
b_inverse_gradients(false),
|
||||
b_Jacobian_derivative(false),
|
||||
b_debug_gradients(false)
|
||||
b_try_scalable(true)
|
||||
{
|
||||
if (cvm::debug())
|
||||
cvm::log("Initializing cvc base object.\n");
|
||||
|
||||
init_cvc_requires();
|
||||
|
||||
get_keyval(conf, "name", this->name, std::string(""), parse_silent);
|
||||
|
||||
get_keyval(conf, "componentCoeff", sup_coeff, 1.0);
|
||||
@ -38,38 +34,109 @@ colvar::cvc::cvc(std::string const &conf)
|
||||
get_keyval(conf, "period", period, 0.0);
|
||||
get_keyval(conf, "wrapAround", wrap_center, 0.0);
|
||||
|
||||
get_keyval(conf, "debugGradients", b_debug_gradients, false, parse_silent);
|
||||
{
|
||||
bool b_debug_gradient;
|
||||
get_keyval(conf, "debugGradients", b_debug_gradient, false, parse_silent);
|
||||
if (b_debug_gradient) enable(f_cvc_debug_gradient);
|
||||
}
|
||||
|
||||
// Attempt scalable calculations when in parallel? (By default yes, if available)
|
||||
get_keyval(conf, "scalable", b_try_scalable, true);
|
||||
|
||||
if (cvm::debug())
|
||||
cvm::log("Done initializing cvc base object.\n");
|
||||
}
|
||||
|
||||
|
||||
void colvar::cvc::parse_group(std::string const &conf,
|
||||
char const *group_key,
|
||||
cvm::atom_group &group,
|
||||
bool optional)
|
||||
cvm::atom_group *colvar::cvc::parse_group(std::string const &conf,
|
||||
char const *group_key,
|
||||
bool optional)
|
||||
{
|
||||
cvm::atom_group *group = NULL;
|
||||
|
||||
if (key_lookup(conf, group_key)) {
|
||||
// TODO turn on scalable flag for group objects in cvc init function
|
||||
group.key = group_key;
|
||||
if (group.parse(conf) != COLVARS_OK) {
|
||||
group = new cvm::atom_group;
|
||||
group->key = group_key;
|
||||
|
||||
if (b_try_scalable) {
|
||||
if (is_available(f_cvc_scalable_com) && is_available(f_cvc_com_based)) {
|
||||
enable(f_cvc_scalable_com);
|
||||
enable(f_cvc_scalable);
|
||||
group->enable(f_ag_scalable_com);
|
||||
group->enable(f_ag_scalable);
|
||||
}
|
||||
|
||||
// TODO check for other types of parallelism here
|
||||
|
||||
if (is_enabled(f_cvc_scalable)) {
|
||||
cvm::log("Will enable scalable calculation for group \""+group->key+"\".\n");
|
||||
} else {
|
||||
cvm::log("Scalable calculation is not available for group \""+group->key+"\" with the current configuration.\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (group->parse(conf) == COLVARS_OK) {
|
||||
atom_groups.push_back(group);
|
||||
} else {
|
||||
cvm::error("Error parsing definition for atom group \""+
|
||||
std::string(group_key)+"\".\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (! optional) {
|
||||
cvm::error("Error: definition for atom group \""+
|
||||
std::string(group_key)+"\" not found.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
return group;
|
||||
}
|
||||
|
||||
|
||||
int colvar::cvc::setup()
|
||||
{
|
||||
size_t i;
|
||||
description = "cvc " + name;
|
||||
|
||||
for (i = 0; i < atom_groups.size(); i++) {
|
||||
add_child((cvm::deps *) atom_groups[i]);
|
||||
}
|
||||
|
||||
if (b_try_scalable && is_available(f_cvc_scalable)) {
|
||||
enable(f_cvc_scalable);
|
||||
}
|
||||
|
||||
return COLVARS_OK;
|
||||
}
|
||||
|
||||
|
||||
colvar::cvc::~cvc()
|
||||
{}
|
||||
{
|
||||
remove_all_children();
|
||||
for (size_t i = 0; i < atom_groups.size(); i++) {
|
||||
if (atom_groups[i] != NULL) delete atom_groups[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void colvar::cvc::read_data()
|
||||
{
|
||||
size_t ig;
|
||||
for (ig = 0; ig < atom_groups.size(); ig++) {
|
||||
cvm::atom_group &atoms = *(atom_groups[ig]);
|
||||
atoms.reset_atoms_data();
|
||||
atoms.read_positions();
|
||||
atoms.calc_required_properties();
|
||||
// each atom group will take care of its own ref_pos_group, if defined
|
||||
}
|
||||
|
||||
//// Don't try to get atom velocities, as no back-end currently implements it
|
||||
// if (tasks[task_output_velocity] && !tasks[task_fdiff_velocity]) {
|
||||
// for (i = 0; i < cvcs.size(); i++) {
|
||||
// for (ig = 0; ig < cvcs[i]->atom_groups.size(); ig++) {
|
||||
// cvcs[i]->atom_groups[ig]->read_velocities();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
void colvar::cvc::calc_force_invgrads()
|
||||
@ -86,15 +153,15 @@ void colvar::cvc::calc_Jacobian_derivative()
|
||||
}
|
||||
|
||||
|
||||
void colvar::cvc::debug_gradients(cvm::atom_group &group)
|
||||
void colvar::cvc::debug_gradients(cvm::atom_group *group)
|
||||
{
|
||||
// this function should work for any scalar variable:
|
||||
// the only difference will be the name of the atom group (here, "group")
|
||||
|
||||
if (group.b_dummy) return;
|
||||
if (group->b_dummy) return;
|
||||
|
||||
cvm::rotation const rot_0 = group.rot;
|
||||
cvm::rotation const rot_inv = group.rot.inverse();
|
||||
cvm::rotation const rot_0 = group->rot;
|
||||
cvm::rotation const rot_inv = group->rot.inverse();
|
||||
|
||||
cvm::real x_0 = x.real_value;
|
||||
if ((x.type() == colvarvalue::type_vector) && (x.size() == 1)) x_0 = x[0];
|
||||
@ -103,45 +170,45 @@ void colvar::cvc::debug_gradients(cvm::atom_group &group)
|
||||
|
||||
// it only makes sense to debug the fit gradients
|
||||
// when the fitting group is the same as this group
|
||||
if (group.b_rotate || group.b_center)
|
||||
if (group.b_fit_gradients && (group.ref_pos_group == NULL)) {
|
||||
group.calc_fit_gradients();
|
||||
if (group.b_rotate) {
|
||||
if (group->b_rotate || group->b_center)
|
||||
if (group->b_fit_gradients && (group->ref_pos_group == NULL)) {
|
||||
group->calc_fit_gradients();
|
||||
if (group->b_rotate) {
|
||||
// fit_gradients are in the original frame, we should print them in the rotated frame
|
||||
for (size_t j = 0; j < group.fit_gradients.size(); j++) {
|
||||
group.fit_gradients[j] = rot_0.rotate(group.fit_gradients[j]);
|
||||
for (size_t j = 0; j < group->fit_gradients.size(); j++) {
|
||||
group->fit_gradients[j] = rot_0.rotate(group->fit_gradients[j]);
|
||||
}
|
||||
}
|
||||
cvm::log("fit_gradients = "+cvm::to_str(group.fit_gradients)+"\n");
|
||||
if (group.b_rotate) {
|
||||
for (size_t j = 0; j < group.fit_gradients.size(); j++) {
|
||||
group.fit_gradients[j] = rot_inv.rotate(group.fit_gradients[j]);
|
||||
cvm::log("fit_gradients = "+cvm::to_str(group->fit_gradients)+"\n");
|
||||
if (group->b_rotate) {
|
||||
for (size_t j = 0; j < group->fit_gradients.size(); j++) {
|
||||
group->fit_gradients[j] = rot_inv.rotate(group->fit_gradients[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t ia = 0; ia < group.size(); ia++) {
|
||||
for (size_t ia = 0; ia < group->size(); ia++) {
|
||||
|
||||
// tests are best conducted in the unrotated (simulation) frame
|
||||
cvm::rvector const atom_grad = group.b_rotate ?
|
||||
rot_inv.rotate(group[ia].grad) :
|
||||
group[ia].grad;
|
||||
cvm::rvector const atom_grad = group->b_rotate ?
|
||||
rot_inv.rotate((*group)[ia].grad) :
|
||||
(*group)[ia].grad;
|
||||
|
||||
for (size_t id = 0; id < 3; id++) {
|
||||
// (re)read original positions
|
||||
group.read_positions();
|
||||
group->read_positions();
|
||||
// change one coordinate
|
||||
group[ia].pos[id] += cvm::debug_gradients_step_size;
|
||||
group.calc_required_properties();
|
||||
(*group)[ia].pos[id] += cvm::debug_gradients_step_size;
|
||||
group->calc_required_properties();
|
||||
calc_value();
|
||||
cvm::real x_1 = x.real_value;
|
||||
if ((x.type() == colvarvalue::type_vector) && (x.size() == 1)) x_1 = x[0];
|
||||
cvm::log("Atom "+cvm::to_str(ia)+", component "+cvm::to_str(id)+":\n");
|
||||
cvm::log("dx(actual) = "+cvm::to_str(x_1 - x_0,
|
||||
21, 14)+"\n");
|
||||
//cvm::real const dx_pred = (group.fit_gradients.size() && (group.ref_pos_group == NULL)) ?
|
||||
cvm::real const dx_pred = (group.fit_gradients.size()) ?
|
||||
(cvm::debug_gradients_step_size * (atom_grad[id] + group.fit_gradients[ia][id])) :
|
||||
//cvm::real const dx_pred = (group->fit_gradients.size() && (group->ref_pos_group == NULL)) ?
|
||||
cvm::real const dx_pred = (group->fit_gradients.size()) ?
|
||||
(cvm::debug_gradients_step_size * (atom_grad[id] + group->fit_gradients[ia][id])) :
|
||||
(cvm::debug_gradients_step_size * atom_grad[id]);
|
||||
cvm::log("dx(interp) = "+cvm::to_str(dx_pred,
|
||||
21, 14)+"\n");
|
||||
@ -154,27 +221,27 @@ void colvar::cvc::debug_gradients(cvm::atom_group &group)
|
||||
/*
|
||||
* The code below is WIP
|
||||
*/
|
||||
// if (group.ref_pos_group != NULL) {
|
||||
// cvm::atom_group &ref = *group.ref_pos_group;
|
||||
// group.calc_fit_gradients();
|
||||
// if (group->ref_pos_group != NULL) {
|
||||
// cvm::atom_group &ref = *group->ref_pos_group;
|
||||
// group->calc_fit_gradients();
|
||||
//
|
||||
// for (size_t ia = 0; ia < ref.size(); ia++) {
|
||||
//
|
||||
// for (size_t id = 0; id < 3; id++) {
|
||||
// // (re)read original positions
|
||||
// group.read_positions();
|
||||
// group->read_positions();
|
||||
// ref.read_positions();
|
||||
// // change one coordinate
|
||||
// ref[ia].pos[id] += cvm::debug_gradients_step_size;
|
||||
// group.update();
|
||||
// group->update();
|
||||
// calc_value();
|
||||
// cvm::real const x_1 = x.real_value;
|
||||
// cvm::log("refPosGroup atom "+cvm::to_str(ia)+", component "+cvm::to_str (id)+":\n");
|
||||
// cvm::log("dx(actual) = "+cvm::to_str (x_1 - x_0,
|
||||
// 21, 14)+"\n");
|
||||
// //cvm::real const dx_pred = (group.fit_gradients.size() && (group.ref_pos_group == NULL)) ?
|
||||
// // cvm::real const dx_pred = (group.fit_gradients.size()) ?
|
||||
// // (cvm::debug_gradients_step_size * (atom_grad[id] + group.fit_gradients[ia][id])) :
|
||||
// //cvm::real const dx_pred = (group->fit_gradients.size() && (group->ref_pos_group == NULL)) ?
|
||||
// // cvm::real const dx_pred = (group->fit_gradients.size()) ?
|
||||
// // (cvm::debug_gradients_step_size * (atom_grad[id] + group->fit_gradients[ia][id])) :
|
||||
// // (cvm::debug_gradients_step_size * atom_grad[id]);
|
||||
// cvm::real const dx_pred = cvm::debug_gradients_step_size * ref.fit_gradients[ia][id];
|
||||
// cvm::log("dx(interp) = "+cvm::to_str (dx_pred,
|
||||
@ -190,3 +257,8 @@ void colvar::cvc::debug_gradients(cvm::atom_group &group)
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Static members
|
||||
|
||||
std::vector<cvm::deps::feature *> colvar::cvc::cvc_features;
|
||||
|
||||
Reference in New Issue
Block a user