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); } }
void pressure_calc(double *result, double *result_t, double *result_nb, double *result_t_nb, int v_comp) { int n, i; double volume = box_l[0]*box_l[1]*box_l[2]; if (!interactions_sanity_checks()) return; init_virials(&virials); init_p_tensor(&p_tensor); init_virials_non_bonded(&virials_non_bonded); init_p_tensor_non_bonded(&p_tensor_non_bonded); on_observable_calc(); switch (cell_structure.type) { case CELL_STRUCTURE_LAYERED: layered_calculate_virials(v_comp); break; case CELL_STRUCTURE_DOMDEC: if(dd.use_vList) { if (rebuild_verletlist) build_verlet_lists(); calculate_verlet_virials(v_comp); } else calculate_link_cell_virials(v_comp); break; case CELL_STRUCTURE_NSQUARE: nsq_calculate_virials(v_comp); } /* rescale kinetic energy (=ideal contribution) */ #ifdef ROTATION_PER_PARTICLE fprintf(stderr, "Switching rotation per particle (#define ROTATION_PER_PARTICLE) and pressure calculation are incompatible.\n"); #endif virials.data.e[0] /= (3.0*volume*time_step*time_step); calc_long_range_virials(); #ifdef VIRTUAL_SITES_RELATIVE vs_relative_pressure_and_stress_tensor(virials.vs_relative,p_tensor.vs_relative); #endif for (n = 1; n < virials.data.n; n++) virials.data.e[n] /= 3.0*volume; for(i=0; i<9; i++) p_tensor.data.e[i] /= (volume*time_step*time_step); for(i=9; i<p_tensor.data.n; i++) p_tensor.data.e[i] /= volume; /* Intra- and Inter- part of nonbonded interaction */ for (n = 0; n < virials_non_bonded.data_nb.n; n++) virials_non_bonded.data_nb.e[n] /= 3.0*volume; for(i=0; i<p_tensor_non_bonded.data_nb.n; i++) p_tensor_non_bonded.data_nb.e[i] /= volume; /* gather data */ MPI_Reduce(virials.data.e, result, virials.data.n, MPI_DOUBLE, MPI_SUM, 0, comm_cart); MPI_Reduce(p_tensor.data.e, result_t, p_tensor.data.n, MPI_DOUBLE, MPI_SUM, 0, comm_cart); MPI_Reduce(virials_non_bonded.data_nb.e, result_nb, virials_non_bonded.data_nb.n, MPI_DOUBLE, MPI_SUM, 0, comm_cart); MPI_Reduce(p_tensor_non_bonded.data_nb.e, result_t_nb, p_tensor_non_bonded.data_nb.n, MPI_DOUBLE, MPI_SUM, 0, comm_cart); }
void on_integration_start() { EVENT_TRACE(fprintf(stderr, "%d: on_integration_start\n", this_node)); INTEG_TRACE(fprintf(stderr,"%d: on_integration_start: reinit_thermo = %d, resort_particles=%d\n", this_node,reinit_thermo,resort_particles)); /********************************************/ /* sanity checks */ /********************************************/ integrator_sanity_checks(); #ifdef NPT integrator_npt_sanity_checks(); #endif interactions_sanity_checks(); #ifdef CATALYTIC_REACTIONS reactions_sanity_checks(); #endif #ifdef LB if(lattice_switch & LATTICE_LB) { lb_sanity_checks(); } #endif #ifdef LB_GPU if(lattice_switch & LATTICE_LB_GPU) { lb_GPU_sanity_checks(); } #endif /********************************************/ /* end sanity checks */ /********************************************/ #ifdef LB_GPU if(this_node == 0){ if (lb_reinit_particles_gpu) { lb_realloc_particles_gpu(); lb_reinit_particles_gpu = 0; } } #endif #ifdef CUDA if (reinit_particle_comm_gpu){ gpu_change_number_of_part_to_comm(); reinit_particle_comm_gpu = 0; } MPI_Bcast(gpu_get_global_particle_vars_pointer_host(), sizeof(CUDA_global_part_vars), MPI_BYTE, 0, comm_cart); #endif #ifdef METADYNAMICS meta_init(); #endif /* Prepare the thermostat */ if (reinit_thermo) { thermo_init(); reinit_thermo = 0; recalc_forces = 1; } /* Ensemble preparation: NVT or NPT */ integrate_ensemble_init(); /* Update particle and observable information for routines in statistics.cpp */ invalidate_obs(); freePartCfg(); on_observable_calc(); }