00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef COLVARSCRIPT_COMMANDS_H
00011 #define COLVARSCRIPT_COMMANDS_H
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef CVSCRIPT_COMM_FNAME
00044 #define CVSCRIPT_COMM_FNAME(COMM) cvscript_ ## COMM
00045 #endif
00046
00047
00048 #ifndef CVSCRIPT
00049
00050 #ifdef __cplusplus
00051 #define CVSCRIPT_COMM_PROTO(COMM) \
00052 extern "C" int CVSCRIPT_COMM_FNAME(COMM)(void *, \
00053 int, unsigned char *const *);
00054 #else
00055 #define CVSCRIPT_COMM_PROTO(COMM) \
00056 int CVSCRIPT_COMM_FNAME(COMM)(void *, int, unsigned char *const *);
00057 #endif
00058
00059 #define CVSCRIPT(COMM,HELP,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) \
00060 CVSCRIPT_COMM_PROTO(COMM)
00061
00062
00063
00064 extern "C" {
00065
00067 int cvscript_n_commands();
00068
00070 char const ** cvscript_command_names();
00071
00074 char const *cvscript_command_help(char const *cmd);
00075
00078 char const *cvscript_command_rethelp(char const *cmd);
00079
00085 char const *cvscript_command_arghelp(char const *cmd, int i);
00086
00089 char const *cvscript_command_full_help(char const *cmd);
00090
00093 int cvscript_command_n_args_min(char const *cmd);
00094
00097 int cvscript_command_n_args_max(char const *cmd);
00098
00099 }
00100
00101 #endif
00102
00103
00104 CVSCRIPT(cv_addenergy,
00105 "Add an energy to the MD engine (no effect in VMD)",
00106 1, 1,
00107 "E : float - Amount of energy to add",
00108 char const *Earg =
00109 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00110 cvm::main()->total_bias_energy += strtod(Earg, NULL);
00111 return cvm::get_error();
00112 )
00113
00114 CVSCRIPT(cv_bias,
00115 "Prefix for bias-specific commands",
00116 0, 0,
00117 "",
00118
00119 return COLVARS_OK;
00120 )
00121
00122 CVSCRIPT(cv_colvar,
00123 "Prefix for colvar-specific commands",
00124 0, 0,
00125 "",
00126
00127 return COLVARS_OK;
00128 )
00129
00130 CVSCRIPT(cv_config,
00131 "Read configuration from the given string",
00132 1, 1,
00133 "conf : string - Configuration string",
00134 char const *conf_str =
00135 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00136 std::string const conf(conf_str);
00137 script->proxy()->add_config("config", conf);
00138 if (script->proxy()->engine_ready()) {
00139
00140 if ((script->proxy()->parse_module_config() |
00141 script->proxy()->setup()) == COLVARS_OK) {
00142 return COLVARS_OK;
00143 } else {
00144 script->add_error_msg("Error parsing configuration string");
00145 return COLVARSCRIPT_ERROR;
00146 }
00147 }
00148
00149 return COLVARS_OK;
00150 )
00151
00152 CVSCRIPT(cv_configfile,
00153 "Read configuration from a file",
00154 1, 1,
00155 "conf_file : string - Path to configuration file",
00156 char const *conf_file_name =
00157 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00158 script->proxy()->add_config("configfile", std::string(conf_file_name));
00159 if (script->proxy()->engine_ready()) {
00160
00161 if ((script->proxy()->parse_module_config() |
00162 script->proxy()->setup()) == COLVARS_OK) {
00163 return COLVARS_OK;
00164 } else {
00165 script->add_error_msg("Error parsing configuration file");
00166 return COLVARSCRIPT_ERROR;
00167 }
00168 }
00169
00170 return COLVARS_OK;
00171 )
00172
00173 CVSCRIPT(cv_delete,
00174 "Delete this Colvars module instance (VMD only)",
00175 0, 0,
00176 "",
00177 return script->proxy()->request_deletion();
00178 )
00179
00180 CVSCRIPT(cv_featurereport,
00181 "Return a summary of Colvars features used so far and their citations\n"
00182 "report : string - Feature report and citations",
00183 0, 0,
00184 "",
00185 return script->set_result_str(script->module()->feature_report());
00186 )
00187
00188 CVSCRIPT(cv_frame,
00189 "Get or set current frame number (VMD only)\n"
00190 "frame : integer - Frame number",
00191 0, 1,
00192 "frame : integer - Frame number",
00193 char const *arg =
00194 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00195 if (arg == NULL) {
00196 long int f = -1;
00197 if (script->proxy()->get_frame(f) == COLVARS_OK) {
00198 script->set_result_long_int(f);
00199 return COLVARS_OK;
00200 } else {
00201 script->add_error_msg("Frame number is not available");
00202 return COLVARSCRIPT_ERROR;
00203 }
00204 } else {
00205 int const f = strtol(const_cast<char *>(arg), NULL, 10);
00206 int error_code = script->proxy()->set_frame(f);
00207 if (error_code == COLVARS_NO_SUCH_FRAME) {
00208 script->add_error_msg("Invalid frame number: \""+std::string(arg)+
00209 "\"\n");
00210 }
00211 return error_code;
00212 }
00213 return COLVARS_OK;
00214 )
00215
00216 CVSCRIPT(cv_getatomappliedforces,
00217 "Get the list of forces applied by Colvars to atoms\n"
00218 "forces : array of arrays of floats - Atomic forces",
00219 0, 0,
00220 "",
00221 script->set_result_rvector_vec(*(script->proxy()->get_atom_applied_forces()));
00222 return COLVARS_OK;
00223 )
00224
00225 CVSCRIPT(cv_getatomappliedforcesmax,
00226 "Get the maximum norm of forces applied by Colvars to atoms\n"
00227 "force : float - Maximum atomic force",
00228 0, 0,
00229 "",
00230 script->set_result_real(script->proxy()->max_atoms_applied_force());
00231 return COLVARS_OK;
00232 )
00233
00234 CVSCRIPT(cv_getatomappliedforcesmaxid,
00235 "Get the atom ID with the largest applied force\n"
00236 "id : int - ID of the atom with the maximum atomic force",
00237 0, 0,
00238 "",
00239 script->set_result_int(script->proxy()->max_atoms_applied_force_id());
00240 return COLVARS_OK;
00241 )
00242
00243 CVSCRIPT(cv_getatomappliedforcesrms,
00244 "Get the root-mean-square norm of forces applied by Colvars to atoms\n"
00245 "force : float - RMS atomic force",
00246 0, 0,
00247 "",
00248 script->set_result_real(script->proxy()->rms_atoms_applied_force());
00249 return COLVARS_OK;
00250 )
00251
00252 CVSCRIPT(cv_resetatomappliedforces,
00253 "Reset forces applied by Colvars to atoms",
00254 0, 0,
00255 "",
00256 size_t i;
00257 std::vector<cvm::rvector> *f = script->proxy()->modify_atom_applied_forces();
00258 for (i = 0; i < f->size(); i++) {
00259 (*f)[i].reset();
00260 }
00261 return COLVARS_OK;
00262 )
00263
00264 CVSCRIPT(cv_getatomids,
00265 "Get the list of indices of atoms used in Colvars\n"
00266 "indices : array of ints - Atom indices",
00267 0, 0,
00268 "",
00269 script->set_result_int_vec(*(script->proxy()->get_atom_ids()));
00270 return COLVARS_OK;
00271 )
00272
00273 CVSCRIPT(cv_getatomcharges,
00274 "Get the list of charges of atoms used in Colvars\n"
00275 "charges : array of floats - Atomic charges",
00276 0, 0,
00277 "",
00278 script->set_result_real_vec(*(script->proxy()->get_atom_charges()));
00279 return COLVARS_OK;
00280 )
00281
00282 CVSCRIPT(cv_getatommasses,
00283 "Get the list of masses of atoms used in Colvars\n"
00284 "masses : array of floats - Atomic masses",
00285 0, 0,
00286 "",
00287 script->set_result_real_vec(*(script->proxy()->get_atom_masses()));
00288 return COLVARS_OK;
00289 )
00290
00291 CVSCRIPT(cv_getatompositions,
00292 "Get the list of cached positions of atoms used in Colvars\n"
00293 "positions : array of arrays of floats - Atomic positions",
00294 0, 0,
00295 "",
00296 script->set_result_rvector_vec(*(script->proxy()->get_atom_positions()));
00297 return COLVARS_OK;
00298 )
00299
00300 CVSCRIPT(cv_getatomtotalforces,
00301 "Get the list of cached total forces of atoms used in Colvars\n"
00302 "forces : array of arrays of floats - Atomic total foces",
00303 0, 0,
00304 "",
00305 script->set_result_rvector_vec(*(script->proxy()->get_atom_total_forces()));
00306 return COLVARS_OK;
00307 )
00308
00309 CVSCRIPT(cv_getconfig,
00310 "Get the module's configuration string read so far\n"
00311 "conf : string - Current configuration string",
00312 0, 0,
00313 "",
00314 script->set_result_str(cvm::main()->get_config());
00315 return COLVARS_OK;
00316 )
00317
00318 CVSCRIPT(cv_getenergy,
00319 "Get the current Colvars energy\n"
00320 "E : float - Amount of energy (internal units)",
00321 0, 0,
00322 "",
00323 script->set_result_real(cvm::main()->total_bias_energy);
00324 return COLVARS_OK;
00325 )
00326
00327 CVSCRIPT(cv_getnumactiveatomgroups,
00328 "Get the number of atom groups that currently have positive ref counts\n"
00329 "count : integer - Total number of atom groups",
00330 0, 0,
00331 "",
00332 script->set_result_int(static_cast<int>(script->proxy()->get_num_active_atom_groups()));
00333 return COLVARS_OK;
00334 )
00335
00336 CVSCRIPT(cv_getnumactiveatoms,
00337 "Get the number of atoms that currently have positive ref counts\n"
00338 "count : integer - Total number of atoms",
00339 0, 0,
00340 "",
00341 script->set_result_int(static_cast<int>(script->proxy()->get_num_active_atoms()));
00342 return COLVARS_OK;
00343 )
00344
00345 CVSCRIPT(cv_getnumatoms,
00346 "Get the number of requested atoms, including those not in use now\n"
00347 "count : integer - Total number of atoms",
00348 0, 0,
00349 "",
00350 script->set_result_int(static_cast<int>(script->proxy()->get_atom_ids()->size()));
00351 return COLVARS_OK;
00352 )
00353
00354 CVSCRIPT(cv_getstepabsolute,
00355 "Get the current step number of the simulation (including restarts)\n"
00356 "step : int - Absolute step number",
00357 0, 0,
00358 "",
00359 script->set_result_int(cvm::step_absolute());
00360 return COLVARS_OK;
00361 )
00362
00363 CVSCRIPT(cv_getsteprelative,
00364 "Get the current step number from the start of this job\n"
00365 "step : int - Relative step number",
00366 0, 0,
00367 "",
00368 script->set_result_int(cvm::step_relative());
00369 return COLVARS_OK;
00370 )
00371
00372 CVSCRIPT(cv_help,
00373 "Get the help string of the Colvars scripting interface\n"
00374 "help : string - Help string",
00375 0, 1,
00376 "command : string - Get the help string of this specific command",
00377 unsigned char *const cmdobj =
00378 script->get_module_cmd_arg(0, objc, objv);
00379 if (cmdobj) {
00380 std::string const cmdstr(script->obj_to_str(cmdobj));
00381 if (cmdstr.size()) {
00382 if (cmdstr == std::string("colvar")) {
00383 script->set_result_str(script->get_cmdline_help_summary(colvarscript::use_colvar));
00384 } else if (cmdstr == std::string("bias")) {
00385 script->set_result_str(script->get_cmdline_help_summary(colvarscript::use_bias));
00386 } else {
00387 script->set_result_str(script->get_command_cmdline_help(colvarscript::use_module,
00388 cmdstr));
00389 }
00390 return cvm::get_error();
00391 } else {
00392 return COLVARSCRIPT_ERROR;
00393 }
00394 } else {
00395 script->set_result_str(script->get_cmdline_help_summary(colvarscript::use_module));
00396 return COLVARS_OK;
00397 }
00398 )
00399
00400 CVSCRIPT(cv_languageversion,
00401 "Get the C++ language version number\n"
00402 "version : string - C++ language version",
00403 0, 0,
00404 "",
00405 script->set_result_int(__cplusplus);
00406 return COLVARS_OK;
00407 )
00408
00409 CVSCRIPT(cv_list,
00410 "Return a list of all variables or biases\n"
00411 "list : sequence of strings - List of elements",
00412 0, 1,
00413 "param : string - \"colvars\" or \"biases\"; default is \"colvars\"",
00414 std::string res;
00415 unsigned char *const kwarg = script->get_module_cmd_arg(0, objc, objv);
00416 std::string const kwstr = kwarg ? script->obj_to_str(kwarg) :
00417 std::string("colvars");
00418 if (kwstr == "colvars") {
00419 for (std::vector<colvar *>::iterator cvi = script->module()->variables()->begin();
00420 cvi != script->module()->variables()->end();
00421 ++cvi) {
00422 res += (cvi == script->module()->variables()->begin() ? "" : " ") + (*cvi)->name;
00423 }
00424 script->set_result_str(res);
00425 return COLVARS_OK;
00426 } else if (kwstr == "biases") {
00427 for (std::vector<colvarbias *>::iterator bi = script->module()->biases.begin();
00428 bi != script->module()->biases.end();
00429 ++bi) {
00430 res += (bi == script->module()->biases.begin() ? "" : " ") + (*bi)->name;
00431 }
00432 script->set_result_str(res);
00433 return COLVARS_OK;
00434 } else {
00435 script->add_error_msg("Wrong arguments to command \"list\"\n");
00436 return COLVARSCRIPT_ERROR;
00437 }
00438 )
00439
00440 CVSCRIPT(cv_listcommands,
00441 "Get the list of script functions, prefixed with \"cv_\", \"colvar_\" or \"bias_\"\n"
00442 "list : sequence of strings - List of commands",
00443 0, 0,
00444 "",
00445 int const n_commands = cvscript_n_commands();
00446 char const **command_names = cvscript_command_names();
00447 std::string result;
00448 for (int i = 0; i < n_commands; i++) {
00449 if (i > 0) result.append(1, ' ');
00450 result.append(std::string(command_names[i]));
00451 }
00452 script->set_result_str(result);
00453 return COLVARS_OK;
00454 )
00455
00456 CVSCRIPT(cv_listindexfiles,
00457 "Get a list of the index files loaded in this session",
00458 0, 0,
00459 "",
00460 int const n_files = script->module()->index_file_names.size();
00461 std::string result;
00462 for (int i = 0; i < n_files; i++) {
00463 if (i > 0) result.append(1, ' ');
00464 result.append(script->module()->index_file_names[i]);
00465 }
00466 script->set_result_str(result);
00467 return COLVARS_OK;
00468 )
00469
00470 CVSCRIPT(cv_load,
00471 "Load data from a state file into all matching colvars and biases",
00472 1, 1,
00473 "prefix : string - Path to existing state file or input prefix",
00474 char const *arg =
00475 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00476 script->proxy()->input_prefix() = cvm::state_file_prefix(arg);
00477 if (script->module()->setup_input() == COLVARS_OK) {
00478 return COLVARS_OK;
00479 } else {
00480 script->add_error_msg("Error loading state file");
00481 return COLVARSCRIPT_ERROR;
00482 }
00483 )
00484
00485 CVSCRIPT(cv_loadfromstring,
00486 "Load state data from a string into all matching colvars and biases",
00487 1, 1,
00488 "buffer : string - String buffer containing the state information",
00489 char const *arg =
00490 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00491 script->proxy()->input_buffer() = arg;
00492 if (script->module()->setup_input() == COLVARS_OK) {
00493 return COLVARS_OK;
00494 } else {
00495 script->add_error_msg("Error loading state string");
00496 return COLVARSCRIPT_ERROR;
00497 }
00498 )
00499
00500 CVSCRIPT(cv_molid,
00501 "Get or set the molecule ID on which Colvars is defined (VMD only)\n"
00502 "molid : integer - Current molecule ID",
00503 0, 1,
00504 "molid : integer - New molecule ID; -1 means undefined",
00505 char const *arg =
00506 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00507 if (arg == NULL) {
00508 int molid = -1;
00509 script->proxy()->get_molid(molid);
00510 script->set_result_int(molid);
00511 return COLVARS_OK;
00512 } else {
00513 script->add_error_msg("Error: To change the molecule ID in VMD, use cv delete first.");
00514 return COLVARS_NOT_IMPLEMENTED;
00515 }
00516 )
00517
00518 CVSCRIPT(cv_printframe,
00519 "Return the values that would be written to colvars.traj\n"
00520 "values : string - The values\n",
00521 0, 0,
00522 "",
00523 std::ostringstream os;
00524 script->module()->write_traj(os);
00525 script->set_result_str(os.str());
00526 return COLVARS_OK;
00527 )
00528
00529 CVSCRIPT(cv_printframelabels,
00530 "Return the labels that would be written to colvars.traj\n"
00531 "Labels : string - The labels",
00532 0, 0,
00533 "",
00534 std::ostringstream os;
00535 script->module()->write_traj_label(os);
00536 script->set_result_str(os.str());
00537 return COLVARS_OK;
00538 )
00539
00540 CVSCRIPT(cv_reset,
00541 "Delete all internal configuration",
00542 0, 0,
00543 "",
00544 return script->module()->reset();
00545 )
00546
00547 CVSCRIPT(cv_resetindexgroups,
00548 "Clear the index groups loaded so far, allowing to replace them",
00549 0, 0,
00550 "",
00551 cvm::main()->index_group_names.clear();
00552 cvm::main()->index_groups.clear();
00553 return COLVARS_OK;
00554 )
00555
00556 CVSCRIPT(cv_save,
00557 "Change the prefix of all output files and save them",
00558 1, 1,
00559 "prefix : string - Output prefix with trailing \".colvars.state\" gets removed)",
00560 std::string const prefix =
00561 cvm::state_file_prefix(script->obj_to_str(script->get_module_cmd_arg(0, objc, objv)));
00562 script->proxy()->output_prefix() = prefix;
00563 int error_code = COLVARS_OK;
00564 error_code |= script->module()->setup_output();
00565 error_code |= script->module()->write_restart_file(prefix+
00566 ".colvars.state");
00567 error_code |= script->module()->write_output_files();
00568 return error_code;
00569 )
00570
00571 CVSCRIPT(cv_savetostring,
00572 "Write the Colvars state to a string and return it\n"
00573 "state : string - The saved state",
00574 0, 0,
00575 "",
00576 return script->module()->write_restart_string(script->modify_str_result());
00577 )
00578
00579 CVSCRIPT(cv_targettemperature,
00580 "Get/set target temperature, overriding what the MD engine provides\n"
00581 "T : float - Current target temperature in K",
00582 0, 1,
00583 "T : float - New target temperature in K",
00584 char const *Targ =
00585 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00586 if (Targ == NULL) {
00587 return script->set_result_real(script->proxy()->target_temperature());
00588 } else {
00589 return script->proxy()->set_target_temperature(strtod(Targ, NULL));
00590 }
00591 )
00592
00593 CVSCRIPT(cv_units,
00594 "Get or set the current Colvars unit system\n"
00595 "units : string - The current unit system",
00596 0, 1,
00597 "units : string - The new unit system",
00598 char const *argstr =
00599 script->obj_to_str(script->get_module_cmd_arg(0, objc, objv));
00600 if (argstr) {
00601 return cvm::proxy->set_unit_system(argstr, false);
00602 } else {
00603 script->set_result_str(cvm::proxy->units);
00604 return COLVARS_OK;
00605 }
00606 )
00607
00608 CVSCRIPT(cv_update,
00609 "Recalculate colvars and biases",
00610 0, 0,
00611 "",
00612 int error_code = script->proxy()->update_input();
00613 if (error_code) {
00614 script->add_error_msg("Error updating the Colvars module (input)");
00615 return error_code;
00616 }
00617 error_code |= script->module()->calc();
00618 if (error_code) {
00619 script->add_error_msg("Error updating the Colvars module (calc)");
00620 return error_code;
00621 }
00622 error_code |= script->proxy()->update_output();
00623 if (error_code) {
00624 script->add_error_msg("Error updating the Colvars module (output)");
00625 }
00626 return error_code;
00627 )
00628
00629 CVSCRIPT(cv_version,
00630 "Get the Colvars Module version string\n"
00631 "version : string - Colvars version",
00632 0, 0,
00633 "",
00634 script->set_result_str(COLVARS_VERSION);
00635 return COLVARS_OK;
00636 )
00637
00638
00639
00640 #ifndef COLVARSCRIPT_COMMANDS_GLOBAL
00641 #include "colvarscript_commands_colvar.h"
00642 #include "colvarscript_commands_bias.h"
00643 #endif
00644
00645 #endif // #ifndef COLVARSCRIPT_COMMANDS_H