void energy_calc(double *result) { if (!check_obs_calc_initialized()) return; init_energies(&energy); on_observable_calc(); switch (cell_structure.type) { case CELL_STRUCTURE_LAYERED: layered_calculate_energies(); break; case CELL_STRUCTURE_DOMDEC: if(dd.use_vList) { if (rebuild_verletlist) build_verlet_lists(); calculate_verlet_energies(); } else calculate_link_cell_energies(); break; case CELL_STRUCTURE_NSQUARE: nsq_calculate_energies(); } /* rescale kinetic energy */ energy.data.e[0] /= (2.0*time_step*time_step); calc_long_range_energies(); /* gather data */ MPI_Reduce(energy.data.e, result, energy.data.n, MPI_DOUBLE, MPI_SUM, 0, comm_cart); }
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; } }
void energy_calc(double *result) { if (!interactions_sanity_checks()) return; init_energies(&energy); #ifdef CUDA clear_energy_on_GPU(); #endif espressoSystemInterface.update(); // Compute the energies from the energyActors for (ActorList::iterator actor= energyActors.begin(); actor != energyActors.end(); ++actor) (*actor)->computeEnergy(espressoSystemInterface); on_observable_calc(); switch (cell_structure.type) { case CELL_STRUCTURE_LAYERED: layered_calculate_energies(); break; case CELL_STRUCTURE_DOMDEC: if(dd.use_vList) { if (rebuild_verletlist) build_verlet_lists(); calculate_verlet_energies(); } else calculate_link_cell_energies(); break; case CELL_STRUCTURE_NSQUARE: nsq_calculate_energies(); } /* rescale kinetic energy */ energy.data.e[0] /= (2.0*time_step*time_step); calc_long_range_energies(); #ifdef CUDA copy_energy_from_GPU(); #endif /* gather data */ MPI_Reduce(energy.data.e, result, energy.data.n, MPI_DOUBLE, MPI_SUM, 0, comm_cart); if (n_external_potentials > 0) { double* energies = (double*) malloc(n_external_potentials*sizeof(double)); for (int i=0; i<n_external_potentials; i++) { energies[i]=external_potentials[i].energy; } double* energies_sum = (double*) malloc(n_external_potentials*sizeof(double)); MPI_Reduce(energies, energies_sum, n_external_potentials, MPI_DOUBLE, MPI_SUM, 0, comm_cart); for (int i=0; i<n_external_potentials; i++) { external_potentials[i].energy=energies_sum[i]; } free(energies); free(energies_sum); } }
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); }