void hamiltonian_calc(int ekin_update_flag) { /* if ekin_update_flag = 0, we calculate all energies with \ref master_energy_calc(). if ekin_update_flag = 1, we only updated momenta, so there we only need to recalculate kinetic energy with \ref calc_kinetic(). */ int i; double result = 0.0; double ekt, ekr; INTEG_TRACE(fprintf(stderr,"%d: hamiltonian_calc:\n",this_node)); //initialize energy struct if (total_energy.init_status == 0) { init_energies(&total_energy); //if we are initializing energy we have to calculate all energies anyway ekin_update_flag = 0; } //calculate energies if (ekin_update_flag == 0) master_energy_calc(); else calc_kinetic(&ekt, &ekr); //sum up energies on master node, and update ghmcdata struct if (this_node==0) { ghmcdata.hmlt_old = ghmcdata.hmlt_new; for (i = ekin_update_flag; i < total_energy.data.n; i++) { result += total_energy.data.e[i]; } if (ekin_update_flag == 1) result += ekt+ekr; ghmcdata.hmlt_new=result; } }
int tclcommand_analyze_parse_and_print_energy(Tcl_Interp *interp, int argc, char **argv) { /* 'analyze energy [{ fene <type_num> | harmonic <type_num> | subt_lj_harm <type_num> | subt_lj_fene <type_num> | subt_lj <type_num> | lj <type1> <type2> | ljcos <type1> <type2> | ljcos2 <type1> <type2> | gb <type1> <type2> | coulomb | kinetic | total }]' */ char buffer[TCL_DOUBLE_SPACE + TCL_INTEGER_SPACE + 2]; int i, j; double value; value = 0.0; if (n_part == 0) { Tcl_AppendResult(interp, "(no particles)", (char *)NULL); return (TCL_OK); } if (total_energy.init_status == 0) { init_energies(&total_energy); master_energy_calc(); } if (argc == 0) tclcommand_analyze_print_all(interp); else { if (ARG0_IS_S("kinetic")) value = total_energy.data.e[0]; else if (ARG0_IS_S("bonded") || ARG0_IS_S("fene") || ARG0_IS_S("subt_lj_harm") || ARG0_IS_S("subt_lj_fene") || ARG0_IS_S("subt_lj") || ARG0_IS_S("harmonic") || ARG0_IS_S("umbrella") || ARG0_IS_S("endangledist")) { if(argc<2 || ! ARG1_IS_I(i)) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "wrong # or type of arguments for: analyze energy bonded <type_num>", (char *)NULL); return (TCL_ERROR); } if(i < 0 || i >= n_bonded_ia) { Tcl_AppendResult(interp, "bond type does not exist", (char *)NULL); return (TCL_ERROR); } value = *obsstat_bonded(&total_energy, i); } else if (ARG0_IS_S("nonbonded") || ARG0_IS_S("lj") || ARG0_IS_S("buckingham") || ARG0_IS_S("lj-cos") || ARG0_IS_S("lj-cos2") || ARG0_IS_S("cos2") || ARG0_IS_S("gb") || ARG0_IS_S("tabulated")) { if(argc<3 || ! ARG_IS_I(1, i) || ! ARG_IS_I(2, j)) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "wrong # or type of arguments for: analyze energy nonbonded <type1> <type2>", (char *)NULL); return (TCL_ERROR); } if(i < 0 || i >= n_particle_types || j < 0 || j >= n_particle_types) { Tcl_AppendResult(interp, "particle type does not exist", (char *)NULL); return (TCL_ERROR); } value = *obsstat_nonbonded(&total_energy, i, j); } else if( ARG0_IS_S("coulomb")) { #ifdef ELECTROSTATICS value = 0; for (i = 0; i < total_energy.n_coulomb; i++) value += total_energy.coulomb[i]; #else Tcl_AppendResult(interp, "ELECTROSTATICS not compiled (see myconfig.hpp)\n", (char *)NULL); #endif } else if( ARG0_IS_S("magnetic")) { #ifdef DIPOLES value = 0; for (i = 0; i < total_energy.n_dipolar; i++) value += total_energy.dipolar[i]; #else Tcl_AppendResult(interp, "DIPOLES not compiled (see myconfig.hpp)\n", (char *)NULL); #endif } else if (ARG0_IS_S("total")) { value = total_energy.data.e[0]; for (i = 1; i < total_energy.data.n; i++) value += total_energy.data.e[i]; for (i = 0; i < n_external_potentials; i++) { value += external_potentials[i].energy; } } else { Tcl_AppendResult(interp, "unknown feature of: analyze energy", (char *)NULL); return (TCL_ERROR); } Tcl_PrintDouble(interp, value, buffer); Tcl_AppendResult(interp, buffer, (char *)NULL); } return (TCL_OK); }