Пример #1
0
/* 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;

}
Пример #2
0
/* 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);

}
Пример #3
0
/* 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);

}
Пример #4
0
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;
}