/* calculate the energy for the surface scan - same as function energy() but without observables */ double surface_energy(system_t *system, int energy_type) { double rd_energy, coulombic_energy, polar_energy, vdw_energy; /* zero the initial values */ rd_energy = 0; coulombic_energy = 0; polar_energy = 0; vdw_energy = 0; /* get the pairwise terms necessary for the energy calculation */ pairs(system); // energy_type = ENERGY_TOTAL // all other params are 0 switch(energy_type) { case ENERGY_TOTAL: if(!(system->sg || system->rd_only)) coulombic_energy = coulombic_nopbc(system->molecules); if(system->polarization) polar_energy = polar(system); if(system->polarvdw) vdw_energy = vdw(system); if(system->sg) rd_energy = sg_nopbc(system->molecules); else if(system->cdvdw_exp_repulsion) rd_energy = exp_repulsion(system); else if(system->dreiding) rd_energy = dreiding_nopbc(system->molecules); else if(system->lj_buffered_14_7) rd_energy = lj_buffered_14_7_nopbc(system); else if(system->disp_expansion) rd_energy = disp_expansion_nopbc(system); else rd_energy = lj_nopbc(system); break; case ENERGY_ES: if(!(system->sg || system->rd_only)) coulombic_energy = coulombic_nopbc(system->molecules); break; case ENERGY_RD: if(system->sg) { rd_energy = sg_nopbc(system->molecules); } else if(system->dreiding) { rd_energy = dreiding_nopbc(system->molecules); } else if(system->lj_buffered_14_7) { rd_energy = lj_buffered_14_7_nopbc(system); } else if(system->disp_expansion) { rd_energy = disp_expansion_nopbc(system); } else { rd_energy = lj_nopbc(system); } break; case ENERGY_POLAR: if(system->polarization) polar_energy = polar(system); break; case ENERGY_VDW: if(system->polarvdw) vdw_energy = vdw(system); break; } /* return the total potential energy */ return rd_energy + coulombic_energy + polar_energy + vdw_energy; }
/* routines, widom insertion, etc. */ double energy_no_observables(system_t *system) { double potential_energy, rd_energy, coulombic_energy, polar_energy, vdw_energy, three_body_energy; /* zero the initial values */ potential_energy = 0; rd_energy = 0; coulombic_energy = 0; polar_energy = 0; vdw_energy = 0; three_body_energy = 0; /* get the pairwise terms necessary for the energy calculation */ pairs(system); flag_all_pairs(system); /* get the electrostatic potential */ if(!(system->sg || system->rd_only)) { if(system->spectre) { coulombic_energy = coulombic_nopbc(system->molecules); } else if(system->gwp) { coulombic_energy = coulombic_nopbc_gwp(system); } else { coulombic_energy = coulombic(system); } /* get the polarization potential */ if(system->polarization) { #ifdef CUDA if(system->cuda) polar_energy = (double)polar_cuda(system); else polar_energy = polar(system); #else polar_energy = polar(system); #endif /* CUDA */ } /* get the repulsion/dispersion potential */ if(system->sg) rd_energy = sg(system); else if(system->dreiding) rd_energy = dreiding(system); else if(system->lj_buffered_14_7) rd_energy = lj_buffered_14_7(system); else if(system->disp_expansion) rd_energy = disp_expansion(system); else if(system->rd_anharmonic) rd_energy = anharmonic(system); else if(system->cdvdw_exp_repulsion) rd_energy = exp_repulsion(system); else if(!system->gwp) rd_energy = lj(system); if(system->polarvdw) { #ifdef CUDA if (system->cuda) { error("error: cuda polarvdw not yet implemented!\n"); die(-1); } else vdw_energy = vdw(system); #else vdw_energy = vdw(system); #endif } } if (system->axilrod_teller) three_body_energy = axilrod_teller(system); /* sum the total potential energy */ potential_energy = rd_energy + coulombic_energy + polar_energy + vdw_energy + three_body_energy; return(potential_energy); }
/* returns the total potential energy for the system and updates our observables */ double energy(system_t *system) { // molecule_t *molecule_ptr; (unused variable) double potential_energy, rd_energy, coulombic_energy, polar_energy, vdw_energy, three_body_energy; double kinetic_energy; // struct timeval old_time, new_time; (unused variable) // char linebuf[MAXLINE]; (unused variable) #ifdef POLARTIMING static double timing = 0; static int count = 0; #endif /* zero the initial values */ kinetic_energy = 0; potential_energy = 0; rd_energy = 0; coulombic_energy = 0; polar_energy = 0; vdw_energy = 0; three_body_energy = 0; system->natoms = countNatoms(system); /* get the pairwise terms necessary for the energy calculation */ pairs(system); /* only on the first simulation step, make sure that all recalculate flags are set */ /* if we made a volume change (or just reverted from one) set recalculate flags OR if replaying a trajectory */ // we set last_volume at the end of this function if ( system->last_volume != system->pbc->volume || system->ensemble==ENSEMBLE_REPLAY || system->observables->energy == 0.0 ) flag_all_pairs(system); /* get the electrostatic potential */ if(!(system->sg || system->rd_only)) { if(system->spectre) coulombic_energy = coulombic_nopbc(system->molecules); else if(system->gwp) { coulombic_energy = coulombic_nopbc_gwp(system); kinetic_energy = coulombic_kinetic_gwp(system); system->observables->kinetic_energy = kinetic_energy; } else coulombic_energy = coulombic(system); system->observables->coulombic_energy = coulombic_energy; /* get the polarization potential */ if(system->polarization) { #ifdef POLARTIMING /* get timing of polarization energy function for cuda comparison */ gettimeofday(&old_time, NULL); #endif #ifdef CUDA if(system->cuda) polar_energy = (double)polar_cuda(system); else polar_energy = polar(system); #else polar_energy = polar(system); #endif /* CUDA */ #ifdef POLARTIMING gettimeofday(&new_time, NULL); timing = timing * (double)count/((double)count+1.0) + (double)((new_time.tv_sec-old_time.tv_sec)*1e6+(new_time.tv_usec-old_time.tv_usec)) * 1.0/((double)count +1.0); count++; if ( system->corrtime ) { if ( count % system->corrtime == 0 ) sprintf(linebuf, "OUTPUT: Polarization energy function took %lf us\n", timing); output(linebuf); } else { sprintf(linebuf, "OUTPUT: Polarization energy function took %lf us\n", timing); output(linebuf); } #endif system->observables->polarization_energy = polar_energy; } if (system->polarvdw) { #ifdef CUDA if (system->cuda) { error("error: cuda polarvdw not yet implemented!\n"); die(-1); } else vdw_energy = vdw(system); #else vdw_energy = vdw(system); #endif system->observables->vdw_energy = vdw_energy; } } /* get the repulsion/dispersion potential */ if(system->rd_anharmonic) rd_energy = anharmonic(system); else if(system->sg) rd_energy = sg(system); else if(system->dreiding) rd_energy = dreiding(system); else if(system->lj_buffered_14_7) rd_energy = lj_buffered_14_7(system); else if(system->disp_expansion) rd_energy = disp_expansion(system); else if(system->cdvdw_exp_repulsion) rd_energy = exp_repulsion(system); else if(!system->gwp) rd_energy = lj(system); system->observables->rd_energy = rd_energy; if (system->axilrod_teller) { three_body_energy = axilrod_teller(system); system->observables->three_body_energy = three_body_energy; } /* sum the total potential energy */ potential_energy = rd_energy + coulombic_energy + polar_energy + vdw_energy + three_body_energy; /* not truly potential, but stick it there for convenience of MC */ /** * POSSIBLE BUG: kinetic_energy was uninitialized, and previously only given a value inside the conditional: * * if(!(system->sg || system->rd_only)) {} * * If this conditional fails, but (system->gwp) is true (idk if this is possible), an un-initialized value would have been * added to potential_energy. Now, 0 is being added, but am not sure if this is the desired behavior. -bt **/ if(system->gwp) potential_energy += kinetic_energy; system->observables->energy = potential_energy; countN(system); system->observables->spin_ratio /= system->observables->N; /* for NVE */ if(system->ensemble == ENSEMBLE_NVE) { system->observables->kinetic_energy = system->total_energy - potential_energy; system->observables->temperature = (2.0/3.0)*system->observables->kinetic_energy/system->observables->N; } /* need this for the isosteric heat */ system->observables->NU = system->observables->N*system->observables->energy; /* set last known volume*/ system->last_volume = system->pbc->volume; if(system->cavity_autoreject_absolute) potential_energy += cavity_absolute_check( system ); return(potential_energy); }
float vdw_conf_hv(int i_res, int i_conf, int j_res, int j_conf, PROT prot) { float e = 0.0; int iatom, jatom; ATOM *connect123[MAX_CONNECTED2], *connect14[MAX_CONNECTED3]; ATOM *iatom_p, *jatom_p; int connect123_res[MAX_CONNECTED2], connect14_res[MAX_CONNECTED3]; int iconnect, jconnect, kconnect, n_connect123, n_connect14, cal_vdw; if (!prot.res[i_res].conf[i_conf].n_atom) return e; if (!prot.res[j_res].conf[j_conf].n_atom) return e; if (!prot.res[i_res].cal_vdw) { if ( !param_get("CAL_VDW",prot.res[i_res].resName, "", &cal_vdw) ) { prot.res[i_res].cal_vdw = cal_vdw; } else prot.res[i_res].cal_vdw = 1; } if (!prot.res[j_res].cal_vdw) { if ( !param_get("CAL_VDW",prot.res[j_res].resName, "", &cal_vdw) ) { prot.res[j_res].cal_vdw = cal_vdw; } else prot.res[j_res].cal_vdw = 1; } if (!prot.res[i_res].cal_vdw || !prot.res[j_res].cal_vdw) return e; for (iatom=0; iatom<prot.res[i_res].conf[i_conf].n_atom; iatom++) { iatom_p = &prot.res[i_res].conf[i_conf].atom[iatom]; if (!iatom_p->on) continue; if (iatom_p->name[1] == 'H') continue; n_connect123 = 0; n_connect14 = 0; memset(connect123, 0,MAX_CONNECTED2*sizeof(ATOM *)); memset(connect123_res,0,MAX_CONNECTED2*sizeof(int)); memset(connect14, 0,MAX_CONNECTED3*sizeof(ATOM *)); memset(connect14_res,0,MAX_CONNECTED3*sizeof(int)); for (iconnect = 0; iconnect < MAX_CONNECTED; iconnect++) { if (!iatom_p->on) break; if (!iatom_p->connect12[iconnect]) break; n_connect123++; connect123[n_connect123-1] = iatom_p->connect12[iconnect]; connect123_res[n_connect123-1] = iatom_p->connect12_res[iconnect]; for (jconnect = 0; jconnect < MAX_CONNECTED; jconnect++) { if (!iatom_p->connect12[iconnect]->on) break; if (!iatom_p->connect12[iconnect]->connect12[jconnect]) break; n_connect123++; connect123[n_connect123-1] = iatom_p->connect12[iconnect]->connect12[jconnect]; connect123_res[n_connect123-1] = iatom_p->connect12[iconnect]->connect12_res[jconnect]; for (kconnect = 0; kconnect < MAX_CONNECTED; kconnect++) { if (!iatom_p->connect12[iconnect]->connect12[jconnect]->on) break; if (!iatom_p->connect12[iconnect]->connect12[jconnect]->connect12[kconnect]) break; n_connect14++; connect14[n_connect14-1] = iatom_p->connect12[iconnect]->connect12[jconnect]->connect12[kconnect]; connect14_res[n_connect14-1] = iatom_p->connect12[iconnect]->connect12[jconnect]->connect12_res[kconnect]; } } } for (jatom=0; jatom<prot.res[j_res].conf[j_conf].n_atom; jatom++) { jatom_p = &prot.res[j_res].conf[j_conf].atom[jatom]; if (!jatom_p->on) continue; if (jatom_p->name[1] == 'H') continue; if (iatom_p == jatom_p) continue; for (iconnect = 0; iconnect < n_connect123; iconnect++) { if (j_res == connect123_res[iconnect] && !strcmp(jatom_p->name,connect123[iconnect]->name)) break; } if (iconnect < n_connect123) continue; for (iconnect = 0; iconnect < n_connect14; iconnect++) { if (j_res == connect14_res[iconnect] && !strcmp(jatom_p->name,connect14[iconnect]->name)) break; } if (iconnect < n_connect14) { e += vdw(*iatom_p, *jatom_p) * env.factor_14lj; continue; } e += vdw(*iatom_p, *jatom_p); } } if (i_res == j_res && i_conf == j_conf) return 0.5*e; else return e; }