int angledist_set_params(int bond_type, double bend, double phimin, double distmin, double phimax, double distmax) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.angledist.bend = bend; bonded_ia_params[bond_type].p.angledist.phimin = phimin; bonded_ia_params[bond_type].p.angledist.distmin = distmin; bonded_ia_params[bond_type].p.angledist.phimax = phimax; bonded_ia_params[bond_type].p.angledist.distmax = distmax; #ifdef BOND_ANGLEDIST_COSINE #error angledist not implemented for BOND_ANGLEDIST_COSINE #endif #ifdef BOND_ANGLEDIST_COSSQUARE #error angledist not implemented for BOND_ANGLEDIST_COSSQUARE #endif bonded_ia_params[bond_type].type = BONDED_IA_ANGLEDIST; bonded_ia_params[bond_type].num = 2; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int IBM_VolumeConservation_SetParams(const int bond_type, const int softID, const double kappaV) { // Create bond make_bond_type_exist(bond_type); // General bond parameters bonded_ia_params[bond_type].type = BONDED_IA_IBM_VOLUME_CONSERVATION; bonded_ia_params[bond_type].num = 1; // This means that Espresso requires one bond partner. Here we simply ignore it, but Espresso cannot handle 0. // Specific stuff if ( softID > MaxNumIBM) { printf("Error: softID (%d) is larger than MaxNumIBM (%d)\n", softID, MaxNumIBM); return ES_ERROR; } if ( softID < 0) { printf("Error: softID (%d) must be non-negative\n", softID); return ES_ERROR; } bonded_ia_params[bond_type].p.ibmVolConsParameters.softID = softID; bonded_ia_params[bond_type].p.ibmVolConsParameters.kappaV = kappaV; bonded_ia_params[bond_type].p.ibmVolConsParameters.volRef = 0; // NOTE: We cannot compute the reference volume here because not all interactions are setup // and thus we do not know which triangles belong to this softID // Calculate it later in the init function //Communicate this to whoever is interested mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int hydrogen_bond_set_params(int bond_type, DoubleList *params) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.hydrogen_bond.r0 = params->e[0]; bonded_ia_params[bond_type].p.hydrogen_bond.alpha = params->e[1]; bonded_ia_params[bond_type].p.hydrogen_bond.E0 = params->e[2]; bonded_ia_params[bond_type].p.hydrogen_bond.kd = params->e[3]; bonded_ia_params[bond_type].p.hydrogen_bond.sigma1 = params->e[4]; bonded_ia_params[bond_type].p.hydrogen_bond.sigma2 = params->e[5]; bonded_ia_params[bond_type].p.hydrogen_bond.psi10 = params->e[6]; bonded_ia_params[bond_type].p.hydrogen_bond.psi20 = params->e[7]; bonded_ia_params[bond_type].p.hydrogen_bond.E0sb = params->e[8]; bonded_ia_params[bond_type].p.hydrogen_bond.r0sb = params->e[9]; bonded_ia_params[bond_type].p.hydrogen_bond.alphasb = params->e[10]; bonded_ia_params[bond_type].p.hydrogen_bond.f2 = params->e[11]; bonded_ia_params[bond_type].p.hydrogen_bond.f3 = params->e[12]; bonded_ia_params[bond_type].type = BONDED_IA_CG_DNA_BASEPAIR; bonded_ia_params[bond_type].num = 3; mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
// set out_direction parameters int out_direction_set_params(int bond_type) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].type = BONDED_IA_OIF_OUT_DIRECTION; bonded_ia_params[bond_type].num = 3; mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int virtual_set_params(int bond_type) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].type = BONDED_IA_VIRTUAL_BOND; bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int bonded_coulomb_set_params(int bond_type, double prefactor) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.bonded_coulomb.prefactor = prefactor; bonded_ia_params[bond_type].type = BONDED_IA_BONDED_COULOMB; bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/// set dihedral parameters int dihedral_set_params(int bond_type, int mult, double bend, double phase) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].type = BONDED_IA_DIHEDRAL; bonded_ia_params[bond_type].num = 3; bonded_ia_params[bond_type].p.dihedral.mult = mult; bonded_ia_params[bond_type].p.dihedral.bend = bend; bonded_ia_params[bond_type].p.dihedral.phase = phase; mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int subt_lj_set_params(int bond_type, double k, double r) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.subt_lj.k = k; bonded_ia_params[bond_type].p.subt_lj.r = r; bonded_ia_params[bond_type].type = BONDED_IA_SUBT_LJ; bonded_ia_params[bond_type].p.subt_lj.r2 = SQR(bonded_ia_params[bond_type].p.subt_lj.r); bonded_ia_params[bond_type].num = 1; mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/// set the parameters for the stretching_force potential int stretching_force_set_params(int bond_type, double r0, double ks) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.stretching_force.ks = ks; bonded_ia_params[bond_type].p.stretching_force.r0 = r0; bonded_ia_params[bond_type].type = BONDED_IA_STRETCHING_FORCE; bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/***************************************************************************** * setting parameters *****************************************************************************/ int rigid_bond_set_params(int bond_type, double d, double p_tol, double v_tol) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.rigid_bond.d2 = d*d; bonded_ia_params[bond_type].p.rigid_bond.p_tol = 2.0*p_tol; bonded_ia_params[bond_type].p.rigid_bond.v_tol = v_tol*time_step; bonded_ia_params[bond_type].type = BONDED_IA_RIGID_BOND; bonded_ia_params[bond_type].num = 1; n_rigidbonds += 1; mpi_bcast_ia_params(bond_type, -1); mpi_bcast_parameter(FIELD_RIGIDBONDS); return ES_OK; }
/** set parameters for the angle potential. \todo The type of the angle potential is chosen via config.hpp and cannot be changed at runtime. */ int angle_harmonic_set_params(int bond_type, double bend, double phi0) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.angle_harmonic.bend = bend; bonded_ia_params[bond_type].p.angle_harmonic.phi0 = phi0; bonded_ia_params[bond_type].type = BONDED_IA_ANGLE_HARMONIC; bonded_ia_params[bond_type].num = 2; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/** set parameters for the AREA_FORCE_GLOBAL potential. */ int area_force_global_set_params(int bond_type, double A0_g, double ka_g) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.area_force_global.ka_g = ka_g; bonded_ia_params[bond_type].p.area_force_global.A0_g = A0_g; bonded_ia_params[bond_type].type = BONDED_IA_AREA_FORCE_GLOBAL; bonded_ia_params[bond_type].num = 2; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int harmonic_set_params(int bond_type, double k, double r,double r_cut) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.harmonic.k = k; bonded_ia_params[bond_type].p.harmonic.r = r; bonded_ia_params[bond_type].p.harmonic.r_cut = r_cut; bonded_ia_params[bond_type].type = BONDED_IA_HARMONIC; bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/** set parameters for the angle potential. \todo The type of the angle potential is chosen via config.hpp and cannot be changed at runtime. */ int angle_cossquare_set_params(int bond_type, double bend, double phi0) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.angle_cossquare.bend = bend; bonded_ia_params[bond_type].p.angle_cossquare.phi0 = phi0; bonded_ia_params[bond_type].p.angle_cossquare.cos_phi0 = cos(phi0); bonded_ia_params[bond_type].type = BONDED_IA_ANGLE_COSSQUARE; bonded_ia_params[bond_type].num = 2; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int umbrella_set_params(int bond_type, double k, int dir, double r) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.umbrella.k = k; bonded_ia_params[bond_type].p.umbrella.dir = dir; bonded_ia_params[bond_type].p.umbrella.r = r; bonded_ia_params[bond_type].type = BONDED_IA_UMBRELLA; bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/** set parameters for the OIF_GLOBAL_FORCES potential. */ int oif_global_forces_set_params(int bond_type, double A0_g, double ka_g, double V0, double kv) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.oif_global_forces.ka_g = ka_g; bonded_ia_params[bond_type].p.oif_global_forces.A0_g = A0_g; bonded_ia_params[bond_type].p.oif_global_forces.V0 = V0; bonded_ia_params[bond_type].p.oif_global_forces.kv = kv; bonded_ia_params[bond_type].type = BONDED_IA_OIF_GLOBAL_FORCES; bonded_ia_params[bond_type].num = 2; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
/// set the parameters for the fene potential int fene_set_params(int bond_type, double k, double drmax, double r0) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.fene.k = k; bonded_ia_params[bond_type].p.fene.drmax = drmax; bonded_ia_params[bond_type].p.fene.r0 = r0; bonded_ia_params[bond_type].p.fene.drmax2 = SQR(bonded_ia_params[bond_type].p.fene.drmax); bonded_ia_params[bond_type].p.fene.drmax2i = 1.0/bonded_ia_params[bond_type].p.fene.drmax2; bonded_ia_params[bond_type].type = BONDED_IA_FENE; bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int drude_set_params(int bond_type, double temp_core, double gamma_core, double temp_drude, double gamma_drude, double k, double mass_drude, double r_cut) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.drude.temp_core = temp_core; bonded_ia_params[bond_type].p.drude.gamma_core = gamma_core; bonded_ia_params[bond_type].p.drude.temp_drude = temp_drude; bonded_ia_params[bond_type].p.drude.gamma_drude = gamma_drude; bonded_ia_params[bond_type].p.drude.k = k; bonded_ia_params[bond_type].p.drude.mass_drude = mass_drude; bonded_ia_params[bond_type].p.drude.r_cut = r_cut; bonded_ia_params[bond_type].type = BONDED_IA_DRUDE; bonded_ia_params[bond_type].num = 1; mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int oif_local_forces_set_params(int bond_type, double r0, double ks, double kslin, double phi0, double kb, double A01, double A02, double kal) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.oif_local_forces.phi0 = phi0; bonded_ia_params[bond_type].p.oif_local_forces.kb = kb; bonded_ia_params[bond_type].p.oif_local_forces.r0 = r0; bonded_ia_params[bond_type].p.oif_local_forces.ks = ks; bonded_ia_params[bond_type].p.oif_local_forces.kslin = kslin; bonded_ia_params[bond_type].p.oif_local_forces.A01 = A01; bonded_ia_params[bond_type].p.oif_local_forces.A02 = A02; bonded_ia_params[bond_type].p.oif_local_forces.kal = kal; bonded_ia_params[bond_type].type = BONDED_IA_OIF_LOCAL_FORCES; bonded_ia_params[bond_type].num = 3; mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int endangledist_set_params(int bond_type, double bend, double phi0 ,double distmin, double distmax) { if(bond_type < 0) return ES_ERROR; make_bond_type_exist(bond_type); bonded_ia_params[bond_type].p.endangledist.bend = bend; bonded_ia_params[bond_type].p.endangledist.phi0 = phi0; bonded_ia_params[bond_type].p.endangledist.distmin = distmin; bonded_ia_params[bond_type].p.endangledist.distmax = distmax; bonded_ia_params[bond_type].type = BONDED_IA_ENDANGLEDIST; /* Normally LENGTH=1 ANGLE=2 DIHEDRAL=3 * Here angle only requires one particle (other reference is wall constraint) */ bonded_ia_params[bond_type].num = 1; /* broadcast interaction parameters */ mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int overlapped_bonded_set_params(int bond_type, int overlap_type, char * filename) { int i, scan_success = 0, size; FILE* fp; if(bond_type < 0) return 1; make_bond_type_exist(bond_type); /* set types */ bonded_ia_params[bond_type].type = BONDED_IA_OVERLAPPED; bonded_ia_params[bond_type].p.overlap.type = overlap_type; /* set number of interaction partners */ if(overlap_type == OVERLAP_BOND_LENGTH) bonded_ia_params[bond_type].num = 1; if(overlap_type == OVERLAP_BOND_ANGLE) bonded_ia_params[bond_type].num = 2; if(overlap_type == OVERLAP_BOND_DIHEDRAL) bonded_ia_params[bond_type].num = 3; /* set max bondlength of between two beads, in Unit Angstrom */ bonded_ia_params[bond_type].p.overlap.maxval = 6.0; /* copy filename */ size = strlen(filename); bonded_ia_params[bond_type].p.overlap.filename = (char*)malloc((size+1)*sizeof(char)); strcpy(bonded_ia_params[bond_type].p.overlap.filename,filename); fp = fopen( filename , "r"); if ( !fp ) return 2; /* Read in size of overlapps from file */ scan_success = fscanf( fp , "%d ", &size); if ( scan_success < 1 ) { fclose(fp); return 3; } bonded_ia_params[bond_type].p.overlap.noverlaps = size; /* allocate overlapped funciton parameter arrays */ bonded_ia_params[bond_type].p.overlap.para_a = (double*)malloc(size*sizeof(double)); bonded_ia_params[bond_type].p.overlap.para_b = (double*)malloc(size*sizeof(double)); bonded_ia_params[bond_type].p.overlap.para_c = (double*)malloc(size*sizeof(double)); /* Read in the overlapped funciton parameter data */ for (i=0; i<size; i++) { scan_success = fscanf(fp, "%lg ", &bonded_ia_params[bond_type].p.overlap.para_a[i]); if ( scan_success < 1 ) { fclose(fp); return 3; } scan_success = fscanf( fp, "%lg ", &bonded_ia_params[bond_type].p.overlap.para_b[i]); if ( scan_success < 1 ) { fclose(fp); return 3; } scan_success = fscanf( fp, "%lg ", &bonded_ia_params[bond_type].p.overlap.para_c[i]); if ( scan_success < 1 ) { fclose(fp); return 3; } } fclose(fp); mpi_bcast_ia_params(bond_type, -1); return 0; }
int tabulated_bonded_set_params(int bond_type, int tab_type, char * filename) { int i, token = 0, size; double dummr; FILE* fp; if(bond_type < 0) return 1; make_bond_type_exist(bond_type); fp = fopen( filename , "r"); if ( !fp ) return 3; /*Look for a line starting with # */ while ( token != EOF) { token = fgetc(fp); if ( token == '#' ) { break; } // magic number for # symbol } if ( token == EOF ) { fclose(fp); return 4; } /* set types */ bonded_ia_params[bond_type].type = BONDED_IA_TABULATED; bonded_ia_params[bond_type].p.tab.type = tab_type; /* set number of interaction partners */ if(tab_type == TAB_BOND_LENGTH) bonded_ia_params[bond_type].num = 1; if(tab_type == TAB_BOND_ANGLE) bonded_ia_params[bond_type].num = 2; if(tab_type == TAB_BOND_DIHEDRAL) bonded_ia_params[bond_type].num = 3; /* copy filename */ size = strlen(filename); bonded_ia_params[bond_type].p.tab.filename = (char*)malloc((size+1)*sizeof(char)); strcpy(bonded_ia_params[bond_type].p.tab.filename,filename); /* read basic parameters from file */ if (fscanf( fp , "%d %lf %lf", &size, &bonded_ia_params[bond_type].p.tab.minval, &bonded_ia_params[bond_type].p.tab.maxval) != 3) return 5; bonded_ia_params[bond_type].p.tab.npoints = size; /* Check interval for angle and dihedral potentials. With adding ROUND_ERROR_PREC to the upper boundary we make sure, that during the calculation we do not leave the defined table! */ if(tab_type == TAB_BOND_ANGLE ) { if( bonded_ia_params[bond_type].p.tab.minval != 0.0 || abs(bonded_ia_params[bond_type].p.tab.maxval-PI) > 1e-5 ) { fclose(fp); return 6; } bonded_ia_params[bond_type].p.tab.maxval = PI+ROUND_ERROR_PREC; } /* check interval for angle and dihedral potentials */ if(tab_type == TAB_BOND_DIHEDRAL ) { if( bonded_ia_params[bond_type].p.tab.minval != 0.0 || abs(bonded_ia_params[bond_type].p.tab.maxval-(2*PI)) > 1e-5 ) { fclose(fp); return 6; } bonded_ia_params[bond_type].p.tab.maxval = (2*PI)+ROUND_ERROR_PREC; } /* calculate dependent parameters */ bonded_ia_params[bond_type].p.tab.invstepsize = (double)(size-1)/(bonded_ia_params[bond_type].p.tab.maxval-bonded_ia_params[bond_type].p.tab.minval); /* allocate force and energy tables */ bonded_ia_params[bond_type].p.tab.f = (double*)malloc(size*sizeof(double)); bonded_ia_params[bond_type].p.tab.e = (double*)malloc(size*sizeof(double)); /* Read in the new force and energy table data */ for (i =0 ; i < size ; i++) { if (fscanf(fp,"%lf %lf %lf", &dummr, &bonded_ia_params[bond_type].p.tab.f[i], &bonded_ia_params[bond_type].p.tab.e[i]) != 3) return 5; } fclose(fp); mpi_bcast_ia_params(bond_type, -1); return ES_OK; }
int IBM_Tribend_SetParams(const int bond_type, const int ind1, const int ind2, const int ind3, const int ind4, const tBendingMethod method, const double kb, const bool flat) { // Create bond make_bond_type_exist(bond_type); // General parameters bonded_ia_params[bond_type].type = BONDED_IA_IBM_TRIBEND; // Specific parameters bonded_ia_params[bond_type].p.ibm_tribend.method = method; // Distinguish bending methods if ( method == TriangleNormals ) { double theta0; if ( !flat ) { // Compute theta0 Particle p1, p2, p3, p4; get_particle_data(ind1, &p1); get_particle_data(ind2, &p2); get_particle_data(ind3, &p3); get_particle_data(ind4, &p4); //Get vectors of triangles double dx1[3], dx2[3], dx3[3]; get_mi_vector(dx1, p1.r.p, p3.r.p); get_mi_vector(dx2, p2.r.p, p3.r.p); get_mi_vector(dx3, p4.r.p, p3.r.p); //Get normals on triangle; pointing outwards by definition of indices sequence double n1l[3], n2l[3]; vector_product(dx1, dx2, n1l); vector_product(dx1, dx3, n2l); // Wolfgang here had a minus. It seems to work, so leave it in n2l[0] = -1*n2l[0]; n2l[1] = -1*n2l[1]; n2l[2] = -1*n2l[2]; double n1[3], n2[3]; unit_vector(n1l,n1); unit_vector(n2l,n2); //calculate theta by taking the acos of the scalar n1*n2 double sc = scalar(n1,n2); if ( sc > 1.0) sc = 1.0; theta0 = acos(sc); double tmp[3]; vector_product(n1,n2,tmp); const double desc = scalar(dx1,tmp); if ( desc < 0) theta0 = 2.0*PI-theta0; } else theta0 = 0; // Flat // Krüger always has three partners bonded_ia_params[bond_type].num = 3; bonded_ia_params[bond_type].p.ibm_tribend.theta0 = theta0; // NOTE: This is the bare bending modulus used by the program. // If triangle pairs appear only once, the total bending force should get a factor 2 // For the numerical model, a factor sqrt(3) should be added, see Gompper&Kroll J. Phys. 1996 and Krüger thesis // This is an approximation, it holds strictly only for a sphere bonded_ia_params[bond_type].p.ibm_tribend.kb = kb; } // Gompper if ( method == NodeNeighbors ) { // Interpret ind2 as number of partners // Note: the actual partners are not set here, but must be set using the part command on the tcl level if ( ind1 != 5 && ind1 != 6) { printf("Gompper bending with %d partners seems strange. Are you sure?\n", ind2); return ES_ERROR; } bonded_ia_params[bond_type].num = ind1; // Only flat eq possible, but actually this is ignored in the computation anyway bonded_ia_params[bond_type].p.ibm_tribend.theta0 = 0; bonded_ia_params[bond_type].p.ibm_tribend.kb = kb; } // Broadcast and return mpi_bcast_ia_params(bond_type, -1); return ES_OK; }