Exemplo n.º 1
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
// 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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
/// 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;
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
/// 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;
}
Exemplo n.º 10
0
/*****************************************************************************
 *   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;
}
Exemplo n.º 11
0
/** 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;
}
Exemplo n.º 12
0
/** 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;
}
Exemplo n.º 13
0
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;
}
Exemplo n.º 14
0
/** 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;
}
Exemplo n.º 15
0
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;

}
Exemplo n.º 16
0
/** 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;
}
Exemplo n.º 17
0
/// 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;
}
Exemplo n.º 18
0
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;
}
Exemplo n.º 19
0
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;
}
Exemplo n.º 20
0
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;
}
Exemplo n.º 21
0
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;
}
Exemplo n.º 22
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;
}
Exemplo n.º 23
0
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;
  
}