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 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); } }