int ljcos2_set_params(int part_type_a, int part_type_b, double eps, double sig, double offset, double w) { IA_parameters *data, *data_sym; make_particle_type_exist(part_type_a); make_particle_type_exist(part_type_b); data = get_ia_param(part_type_a, part_type_b); data_sym = get_ia_param(part_type_b, part_type_a); if (!data || !data_sym) { return TCL_ERROR; } /* lj-cos2 should be symmetrically */ data->LJCOS2_eps = data_sym->LJCOS2_eps = eps; data->LJCOS2_sig = data_sym->LJCOS2_sig = sig; data->LJCOS2_offset = data_sym->LJCOS2_offset = offset; data->LJCOS2_w = data_sym->LJCOS2_w = w; /* calculate dependent parameters */ data->LJCOS2_rchange = data_sym->LJCOS2_rchange = pow(2,1/6.)*sig; data->LJCOS2_cut = data_sym->LJCOS2_cut = w + data_sym->LJCOS2_rchange; /* broadcast interaction parameters */ mpi_bcast_ia_params(part_type_a, part_type_b); mpi_bcast_ia_params(part_type_b, part_type_a); if (lj_force_cap != -1.0) mpi_lj_cap_forces(lj_force_cap); return TCL_OK; }
int ljangle_set_params(int part_type_a, int part_type_b, double eps, double sig, double cut, int b1p, int b1n, int b2p, int b2n, double cap_radius, double z0, double dz, double kappa, double epsprime) { IA_parameters *data, *data_sym; make_particle_type_exist(part_type_a); make_particle_type_exist(part_type_b); data = get_ia_param(part_type_a, part_type_b); data_sym = get_ia_param(part_type_b, part_type_a); if (!data || !data_sym) { return TCL_ERROR; } /* LJ_ANGLE should be symmetrically */ data->LJANGLE_eps = data_sym->LJANGLE_eps = eps; data->LJANGLE_sig = data_sym->LJANGLE_sig = sig; data->LJANGLE_cut = data_sym->LJANGLE_cut = cut; data->LJANGLE_bonded1pos = data_sym->LJANGLE_bonded1pos = b1p; data->LJANGLE_bonded1neg = data_sym->LJANGLE_bonded1neg = b1n; data->LJANGLE_bonded2pos = data_sym->LJANGLE_bonded2pos = b2p; data->LJANGLE_bonded2neg = data_sym->LJANGLE_bonded2neg = b2n; data->LJANGLE_bonded1type = data_sym->LJANGLE_bonded1type = part_type_a; if (cap_radius > 0) { data->LJANGLE_capradius = cap_radius; data_sym->LJANGLE_capradius = cap_radius; } if (dz > 0.) { data->LJANGLE_z0 = data_sym->LJANGLE_z0 = z0; data->LJANGLE_dz = data_sym->LJANGLE_dz = dz; data->LJANGLE_kappa = data_sym->LJANGLE_kappa = kappa; data->LJANGLE_epsprime = data_sym->LJANGLE_epsprime = epsprime; } /* broadcast interaction parameters */ mpi_bcast_ia_params(part_type_a, part_type_b); mpi_bcast_ia_params(part_type_b, part_type_a); if (ljangle_force_cap != -1.0) mpi_ljangle_cap_forces(ljangle_force_cap); return TCL_OK; }
inline void calc_non_bonded_pair_force(Particle *p1, Particle *p2, double d[3], double dist, double dist2, double force[3]){ IA_parameters *ia_params = get_ia_param(p1->p.type,p2->p.type); calc_non_bonded_pair_force(p1, p2, ia_params, d, dist, dist2, force); }
int tclprint_to_result_ljgenIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->LJGEN_eps, buffer); Tcl_AppendResult(interp, "lj-gen ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_sig, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_shift, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_offset, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); snprintf (buffer, sizeof (buffer), "%d ", data->LJGEN_a1); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); snprintf (buffer, sizeof (buffer), "%d ", data->LJGEN_a2); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_b1, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_b2, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_capradius, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); #ifdef LJGEN_SOFTCORE Tcl_PrintDouble(interp, data->LJGEN_lambda, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJGEN_softrad, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); #endif return TCL_OK; }
int tclprint_to_result_gbIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->GB_eps, buffer); Tcl_AppendResult(interp, "gay-berne ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_sig, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_k1, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_k2, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_mu, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_nu, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_chi1, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->GB_chi2, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
int tclprint_to_result_buckIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->BUCK_A, buffer); Tcl_AppendResult(interp, "buckingham ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_B, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_C, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_D, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_discont, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_shift, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_capradius, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_F1, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BUCK_F2, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
inline int subt_lj_pair_energy(Particle *p1, Particle *p2, Bonded_ia_parameters *iaparams, double dx[3], double *_energy) { double energy=0.0; IA_parameters *ia_params; double r_off, frac2, frac6; double dist2 = sqrlen(dx); double dist = sqrt(dist2); if(dist >= iaparams->p.subt_lj.r) return 1; ia_params = get_ia_param(p1->p.type,p2->p.type); if(dist < ia_params->LJ_cut+ia_params->LJ_offset) { r_off = dist - ia_params->LJ_offset; if(r_off > ia_params->LJ_capradius) { /* normal case: resulting force/energy smaller than capping. */ frac2 = SQR(ia_params->LJ_sig/r_off); frac6 = frac2*frac2*frac2; energy = 4.0*ia_params->LJ_eps*(SQR(frac6)-frac6+ia_params->LJ_shift); } else if(dist > 0.0) { /* capped part of lj potential. */ frac2 = SQR(ia_params->LJ_sig/ia_params->LJ_capradius); frac6 = frac2*frac2*frac2; energy = 4.0*ia_params->LJ_eps*(SQR(frac6)-frac6+ia_params->LJ_shift); } } *_energy = -energy; return 0; }
/** calculate buck_capradius from force_cap */ void calc_buck_cap_radii() { /* do not compute cap radii if force capping is individual */ if( force_cap != -1.0 ) { int i,j,cnt=0; IA_parameters *params = NULL; double force=0.0, frac2, frac6, frac8; double r0,r1 = 0.0,diff,exp_term,C_R,D_R; for(i=0; i<n_particle_types; i++) { for(j=0; j<n_particle_types; j++) { params = get_ia_param(i,j); if(force_cap>0.0 ) { force = -params->BUCK_F2; if (force_cap<force) { /* Solving numerically using Newton Raphson Technique */ force = 0.0; cnt = 0; r1 = (params->BUCK_cut+params->BUCK_discont)/2.0; //First guess value r0 = 0.0 ; while(fabs(r1 - r0)>1.0e-10) { r0 = r1; exp_term = params->BUCK_A*params->BUCK_B*exp(-params->BUCK_B*r0); frac2 = SQR(r0); frac6 = frac2*frac2*frac2; frac8 = frac6*frac2; C_R = 6.0*params->BUCK_C/frac8; D_R = 4.0*params->BUCK_D/frac6; diff = (exp_term - C_R*r0 - D_R*r0 - force_cap)/(-params->BUCK_B*exp_term + 7.0*C_R + 5.0*D_R); r1 = r0 - diff; if(r1>params->BUCK_discont) r1=0.5*(params->BUCK_discont+r0); cnt++; if(cnt>500) { fprintf(stderr,"%d: [email protected]: Failed to converge while determining Buckingham cap radius!!",this_node); fprintf(stderr,"%d: tolerance = %f",this_node, diff); errexit(); } } frac2 = SQR(r1); frac6 = frac2*frac2*frac2; force = params->BUCK_A*params->BUCK_B*exp(-params->BUCK_B*r1) - 6.0*params->BUCK_C/(r1*frac6) - 4.0*params->BUCK_D*r1/(frac6); params->BUCK_capradius = r1; } else params->BUCK_capradius = params->BUCK_discont; } else params->BUCK_capradius = 0.0; FORCE_TRACE(fprintf(stderr,"%d: Ptypes %d-%d have cap_radius %f and cap_force %f (iterations: %d)\n", this_node,i,j,r1,force,cnt)); } } BUCK_TRACE(fprintf(stderr,"%d: BUCK: Buckingham force cap imposed %f, Calculated force %f and Cap radius %f after %d iterations\n",this_node,force_cap,force,params->BUCK_capradius,cnt); );
void calc_non_bonded_pair_force_from_partcfg_simple(Particle *p1, Particle *p2, double d[3], double dist, double dist2, double force[3]){ IA_parameters *ia_params = get_ia_param(p1->p.type,p2->p.type); double torque1[3],torque2[3]; calc_non_bonded_pair_force_from_partcfg(p1, p2, ia_params, d, dist, dist2, force, torque1, torque2); }
int tclprint_to_result_interrfIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); sprintf(buffer,"%i",data->rf_on); Tcl_AppendResult(interp, "inter_rf ", buffer, " ",(char *) NULL); return TCL_OK; }
int tclprint_to_result_comfixedIA(Tcl_Interp *interp, int i, int j) { char buffer[ES_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); sprintf(buffer,"%d",data->COMFIXED_flag); Tcl_AppendResult(interp, "comfixed ", buffer, " ", (char *) NULL); return TCL_OK; }
int tclcommand_inter_print_non_bonded(Tcl_Interp * interp, int part_type_a, int part_type_b) { IA_parameters *data, *data_sym; Tcl_ResetResult(interp); make_particle_type_exist(part_type_a); make_particle_type_exist(part_type_b); data = get_ia_param(part_type_a, part_type_b); data_sym = get_ia_param(part_type_b, part_type_a); if (!data || !data_sym) { Tcl_AppendResult(interp, "particle types must be nonnegative", (char *) NULL); return TCL_ERROR; } return tclprint_to_result_NonbondedIA(interp, part_type_a, part_type_b); }
int tclprint_to_result_hatIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->HAT_Fmax, buffer); Tcl_AppendResult(interp, "hat ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->HAT_r, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
void inter_dpd_switch_off(void){ int type_a,type_b; IA_parameters *data; for (type_a=0;type_a<n_particle_types;type_a++){ for (type_b=0;type_b<n_particle_types;type_b++){ data=get_ia_param(type_a,type_b); data->dpd_gamma = data->dpd_r_cut = data->dpd_wf = data->dpd_pref1 = data->dpd_pref2 = data->dpd_tgamma = data->dpd_tr_cut = data->dpd_twf = data->dpd_pref3 = data->dpd_pref4 = 0.0; } } }
int tclprint_to_result_cos2IA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->COS2_eps, buffer); Tcl_AppendResult(interp, "cos2 ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->COS2_offset, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->COS2_w, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
int tclprint_to_result_GaussianIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->Gaussian_eps, buffer); Tcl_AppendResult(interp, "gaussian ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->Gaussian_sig, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->Gaussian_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
/** Computes the negative of the LENNARD-JONES pair forces and adds this force to the particle forces (see \ref tclcommand_inter). @param p1 Pointer to first particle. @param p2 Pointer to second/middle particle. @param iaparams Parameters of interaction @param dx change in position @param force force on particles @return true if bond is broken */ inline int calc_subt_lj_pair_force(Particle *p1, Particle *p2, Bonded_ia_parameters *iaparams, double dx[3], double force[3]) { int i; double fac_lj=0.0; IA_parameters *ia_params; double r_off, frac2, frac6; double dist2 = sqrlen(dx); double dist = sqrt(dist2); if(dist >= iaparams->p.subt_lj.r) return 1; ia_params = get_ia_param(p1->p.type,p2->p.type); if(dist < ia_params->LJ_cut+ia_params->LJ_offset) { r_off = dist - ia_params->LJ_offset; if(r_off > ia_params->LJ_capradius) { /* normal case: resulting force/energy smaller than capping. */ frac2 = SQR(ia_params->LJ_sig/r_off); frac6 = frac2*frac2*frac2; fac_lj = 48.0 * ia_params->LJ_eps * frac6*(frac6 - 0.5) / (r_off * dist); } else if(dist > 0.0) { /* capped part of lj potential. */ frac2 = SQR(ia_params->LJ_sig/ia_params->LJ_capradius); frac6 = frac2*frac2*frac2; fac_lj = 48.0 * ia_params->LJ_eps * frac6*(frac6 - 0.5) / (ia_params->LJ_capradius * dist); // #ifdef CONFIGTEMP // extern double configtemp[2]; // int numfac = 0; // if (p1->p.configtemp) numfac+=1; // if (p2->p.configtemp) numfac+=1; // configtemp[0] -= numfac*SQR(48.0 * ia_params->LJ_eps * frac6*(frac6 - 0.5) / r_off); // configtemp[1] -= numfac*24.0 * ia_params->LJ_eps * frac6*(-22.0*frac6+5.0) / (SQR(r_off)); // #endif } } for(i=0;i<3;i++) force[i] = -fac_lj*dx[i]; ONEPART_TRACE(if(p1->p.identity==check_id) fprintf(stderr,"%d: OPT: SUBT_LJ f = (%.3e,%.3e,%.3e) with part id=%d at dist %f fac_lj %.3e\n",this_node,p1->f.f[0],p1->f.f[1],p1->f.f[2],p2->p.identity,sqrt(dist2),fac_lj)); ONEPART_TRACE(if(p2->p.identity==check_id) fprintf(stderr,"%d: OPT: SUBT_LJ f = (%.3e,%.3e,%.3e) with part id=%d at dist %f fac_lj %.3e\n",this_node,p2->f.f[0],p2->f.f[1],p2->f.f[2],p1->p.identity,sqrt(dist2),fac_lj)); return 0; }
void inter_dpd_update_params(double pref_scale) { int type_a,type_b; IA_parameters *data; for (type_a=0;type_a<n_particle_types;type_a++){ for (type_b=0;type_b<n_particle_types;type_b++){ data=get_ia_param(type_a,type_b); if ( (data->dpd_r_cut != 0) || (data->dpd_tr_cut != 0) ) { data->dpd_pref2*=pref_scale; data->dpd_pref4*=pref_scale; } } } }
int tclprint_to_result_softIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->soft_a, buffer); Tcl_AppendResult(interp, "soft-sphere ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->soft_n, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->soft_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->soft_offset, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
int tclprint_to_result_comforceIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); sprintf(buffer,"%d",data->COMFORCE_flag); Tcl_AppendResult(interp, "comforce ", buffer, " ", (char *) NULL); sprintf(buffer,"%d",data->COMFORCE_dir); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->COMFORCE_force, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->COMFORCE_fratio, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
void calc_comfixed() { Particle *p; int i, np, c; Cell *cell; IA_parameters *ia_params; int t0; int j; double fsum0[3], type_mass; for (t0=0; t0<n_particle_types; t0++) { ia_params = get_ia_param(t0,t0); if(ia_params->COMFIXED_flag == 1) { type_mass=0.0; for(j = 0; j < 3; j++) { fsum0[j]= 0.; } for (c = 0; c < local_cells.n; c++) { cell = local_cells.cell[c]; p = cell->part; np = cell->n; for(i = 0; i < np; i++) { if(p[i].p.type==t0) { type_mass += PMASS(p[i]); for(j = 0; j < 3; j++) { fsum0[j] += p[i].f.f[j]; } } } } for (c = 0; c < local_cells.n; c++) { cell = local_cells.cell[c]; p = cell->part; np = cell->n; for(i = 0; i < np; i++) { if(p[i].p.type==t0) { for(j = 0; j < 3; j++) { p[i].f.f[j] -= fsum0[j]/type_mass*PMASS(p[i]); } } } } } } }
void inter_dpd_init(){ extern double temperature; int type_a,type_b; IA_parameters *data; for (type_a=0;type_a<n_particle_types;type_a++){ for (type_b=0;type_b<n_particle_types;type_b++){ data=get_ia_param(type_a,type_b); if ( (data->dpd_r_cut != 0) || (data->dpd_tr_cut != 0) ) { data->dpd_pref1=data->dpd_gamma/time_step; data->dpd_pref2=sqrt(24.0*temperature*data->dpd_gamma/time_step); data->dpd_pref3=data->dpd_tgamma/time_step; data->dpd_pref4=sqrt(24.0*temperature*data->dpd_tgamma/time_step); } } } }
int tclprint_to_result_morseIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->MORSE_eps, buffer); Tcl_AppendResult(interp, "morse ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->MORSE_alpha, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->MORSE_rmin, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->MORSE_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->MORSE_capradius, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
/** calculate ljcos2_capradius from force_cap */ void calc_ljcos2_cap_radii() { /* do not compute cap radii if force capping is "individual" */ if( force_cap != -1.0){ int i,j,cnt=0; IA_parameters *params; double force=0.0, rad=0.0, step, frac2, frac6; for(i=0; i<n_particle_types; i++) { for(j=0; j<n_particle_types; j++) { params = get_ia_param(i,j); if(force_cap > 0.0 && params->LJCOS2_eps > 0.0) { /* I think we have to solve this numerically... and very crude as well */ cnt=0; rad = params->LJCOS2_sig; step = -0.1 * params->LJCOS2_sig; force=0.0; while(step != 0) { frac2 = SQR(params->LJCOS2_sig/rad); frac6 = frac2*frac2*frac2; if (rad < params->LJCOS2_rchange) { force = 48.0 * params->LJCOS2_eps * frac6*(frac6 - 0.5)/rad; } else { force = 0; } if((step < 0 && force_cap < force) || (step > 0 && force_cap > force)) { step = - (step/2.0); } if(fabs(force-force_cap) < 1.0e-6) step=0; rad += step; cnt++; } params->LJCOS2_capradius = rad; } else { params->LJCOS2_capradius = 0.0; } FORCE_TRACE(fprintf(stderr,"%d: Ptypes %d-%d have cap_radius %f and cap_force %f (iterations: %d)\n", this_node,i,j,rad,force,cnt)); } } } }
/** calculate lj_capradius from force_cap */ void calc_ljgen_cap_radii() { /* do not compute cap radii if force capping is "individual" */ if( force_cap != -1.0){ int i,j,cnt=0; IA_parameters *params; double force=0.0, rad=0.0, step, frac; for(i=0; i<n_particle_types; i++) { for(j=0; j<n_particle_types; j++) { params = get_ia_param(i,j); if(force_cap > 0.0 && params->LJGEN_eps > 0.0) { /* I think we have to solve this numerically... and very crude as well */ cnt=0; rad = params->LJGEN_sig; step = -0.1 * params->LJGEN_sig; force=0.0; while(step != 0) { frac = params->LJGEN_sig/rad; force = params->LJGEN_eps #ifdef LJGEN_SOFTCORE * params->LJGEN_lambda #endif * (params->LJGEN_b1 * params->LJGEN_a1 * pow(frac, params->LJGEN_a1) - params->LJGEN_b2 * params->LJGEN_a2 * pow(frac, params->LJGEN_a2))/rad; if((step < 0 && force_cap < force) || (step > 0 && force_cap > force)) { step = - (step/2.0); } if(fabs(force-force_cap) < 1.0e-6) step=0; rad += step; cnt++; } params->LJGEN_capradius = rad; } else { params->LJGEN_capradius = 0.0; } FORCE_TRACE(fprintf(stderr,"%d: Ptypes %d-%d have cap_radius %f and cap_force %f (iterations: %d)\n", this_node,i,j,rad,force,cnt)); } } } }
void calc_morse_cap_radii() { /* do not compute cap radii if force capping is "individual" */ if( force_cap != -1.0){ int i,j,cnt=0; IA_parameters *params; double force=0.0, rad=0.0, step, add1, add2; for(i=0; i<n_particle_types; i++) { for(j=0; j<n_particle_types; j++) { params = get_ia_param(i,j); if(force_cap > 0.0 && params->MORSE_eps > 0.0) { /* I think we have to solve this numerically... and very crude as well */ cnt=0; rad = params->MORSE_rmin - 0.69314719 / params->MORSE_alpha; step = -0.1 * rad; force=0.0; while(step != 0) { add1 = exp(-2.0 * params->MORSE_alpha * (rad - params->MORSE_rmin)); add2 = exp( -params->MORSE_alpha * (rad - params->MORSE_rmin)); force = -params->MORSE_eps * 2.0 * params->MORSE_alpha * (add2 - add1) / rad; if((step < 0 && force_cap < force) || (step > 0 && force_cap > force)) { step = - (step/2.0); } if(fabs(force-force_cap) < 1.0e-6) step=0; rad += step; cnt++; } params->MORSE_capradius = rad; } else { params->MORSE_capradius = 0.0; } FORCE_TRACE(fprintf(stderr,"%d: Ptypes %d-%d have cap_radius %f and cap_force %f (iterations: %d)\n", this_node,i,j,rad,force,cnt)); } } } }
int tclprint_to_result_SmStIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE+TCL_INTEGER_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_AppendResult(interp, "smooth-step ", (char *) NULL); Tcl_PrintDouble(interp, data->SmSt_d, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); sprintf(buffer, "%d", data->SmSt_n); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->SmSt_eps, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->SmSt_k0, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->SmSt_sig, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->SmSt_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
int tclprint_to_result_BMHTFIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE+TCL_INTEGER_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_AppendResult(interp, "bmhtf-nacl ", (char *) NULL); Tcl_PrintDouble(interp, data->BMHTF_A, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BMHTF_B, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BMHTF_C, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BMHTF_D, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BMHTF_sig, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->BMHTF_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
int tclprint_to_result_ljcosIA(Tcl_Interp *interp, int i, int j) { char buffer[TCL_DOUBLE_SPACE]; IA_parameters *data = get_ia_param(i, j); Tcl_PrintDouble(interp, data->LJCOS_eps, buffer); Tcl_AppendResult(interp, "lj-cos ", buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJCOS_sig, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJCOS_cut, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJCOS_offset, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJCOS_alfa, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJCOS_beta, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); Tcl_PrintDouble(interp, data->LJCOS_rmin, buffer); Tcl_AppendResult(interp, buffer, " ", (char *) NULL); return TCL_OK; }
/* This routine does not take the optional 2nd environment into account. */ void calc_ljangle_cap_radii() { if( force_cap != -1.0){ int i,j,cnt=0; IA_parameters *params; double force=0.0, rad=0.0, step, frac2, frac10; for(i=0; i<n_particle_types; i++) { for(j=0; j<n_particle_types; j++) { params = get_ia_param(i,j); if(force_cap > 0.0 && params->LJANGLE_eps > 0.0) { /* I think we have to solve this numerically... and very crude as well */ cnt=0; rad = params->LJANGLE_sig; step = -0.1 * params->LJANGLE_sig; force=0.0; while(step != 0) { frac2 = SQR(params->LJANGLE_sig/rad); frac10 = frac2*frac2*frac2*frac2*frac2; force = 60.0 * params->LJANGLE_eps * frac10*(frac2 - 1.0) / rad; if((step < 0 && force_cap < force) || (step > 0 && force_cap > force)) { step = - (step/2.0); } if(fabs(force-force_cap) < 1.0e-6) step=0; rad += step; cnt++; } params->LJANGLE_capradius = rad; } else { params->LJANGLE_capradius = 0.0; } FORCE_TRACE(fprintf(stderr,"%d: LJANGLE Ptypes %d-%d have cap_radius %f and cap_force %f (iterations: %d)\n", this_node,i,j,rad,force,cnt)); } } } }