示例#1
0
int tclcommand_analyze_set_parse_chain_topology(Tcl_Interp *interp, int argc, char **argv)
{
  /* parses a chain topology (e.g. in 'analyze ( rg | <rg> ) [chain start n chains chain length]' , or
     in 'analyze set chains <chain_start> <n_chains> <chain_length>') */
  int m, i, pc;
  
  if (argc < 3) {
    Tcl_AppendResult(interp, "chain structure info consists of <start> <n> <length>", (char *)NULL);    
    return TCL_ERROR;
  }

  if (! (ARG0_IS_I(chain_start) && ARG1_IS_I(chain_n_chains) && ARG_IS_I(2, chain_length)))
    return TCL_ERROR;

  realloc_topology(chain_n_chains);
  pc = 0;
  for (m = 0; m < n_molecules; m++) {
    topology[m].type = 0;
    realloc_intlist(&topology[m].part, topology[m].part.n = chain_length);
    for (i = 0; i < chain_length; i++)
      topology[m].part.e[i] = pc++;
  }
 
  return TCL_OK;
}
示例#2
0
int tclcommand_analyze_parse_cwvac(Tcl_Interp *interp, int argc, char **argv)
{
  /* 'analyze { cwvac } <maxtau> <interval> [<chain_start> <n_chains> <chain_length>]' */
  /***********************************************************************************************************/
  char buffer[4*TCL_DOUBLE_SPACE+7];
  int i, maxtau, interval;
  double *avac, *evac;
  if (argc < 2) {
    Tcl_AppendResult(interp, "Wrong # of args! Usage: analyze gkmobility <maxtau> <interval> [<chain_start> <n_chains> <chain_length>]",
		     (char *)NULL);
    return (TCL_ERROR);
  } else {
    if (!ARG0_IS_I(maxtau))
      return (TCL_ERROR);
    if (!ARG1_IS_I(interval))
      return (TCL_ERROR);
    argc-=2; argv+=2;
  }
  if (tclcommand_analyze_set_parse_chain_topology_check(interp, argc, argv) == TCL_ERROR) return TCL_ERROR;
  
  if ((chain_n_chains == 0) || (chain_length == 0)) {
    Tcl_AppendResult(interp, "The chain topology has not been set",(char *)NULL); return TCL_ERROR;
  }
  
  if (maxtau <=0) {
    Tcl_AppendResult(interp, "Nothing to be done - choose <maxtau> greater zero!",(char *)NULL); return TCL_ERROR;
  }

  if (interval <= 0) {
    Tcl_AppendResult(interp, "<interval> has to be positive", (char *)NULL);
    return TCL_ERROR;
  }
  updatePartCfg(WITHOUT_BONDS);
  analyze_cwvac(maxtau, interval, &avac, &evac);
  // create return string
  sprintf(buffer, "{ ");
  Tcl_AppendResult(interp, buffer, (char *)NULL);
  for(i=0;i<=maxtau;i++) {
    sprintf(buffer,"%e ",avac[i]);
    Tcl_AppendResult(interp, buffer, (char *)NULL);
  }
  sprintf(buffer, "} { ");
  Tcl_AppendResult(interp, buffer, (char *)NULL);
  for(i=0;i<=maxtau;i++) {
    sprintf(buffer,"%e ",evac[i]);
    Tcl_AppendResult(interp, buffer, (char *)NULL);
  }
  sprintf(buffer, "}");
  Tcl_AppendResult(interp, buffer, (char *)NULL);
  free(avac); free(evac);
  return (TCL_OK);
}
示例#3
0
int tclcommand_analyze_parse_and_print_pressure_mol(Tcl_Interp *interp,int argc, char **argv)
{
    char buffer[TCL_DOUBLE_SPACE];
    int type1, type2;
    double psum;
#ifdef ELECTROSTATICS
#ifndef INTER_RF
    Tcl_ResetResult(interp);
    Tcl_AppendResult(interp, "parse_and_print_pressure_mol is only possible with INTER_RF ", (char *)NULL);
    return (TCL_ERROR);
#endif
#endif
    updatePartCfg(WITHOUT_BONDS);
    if (!sortPartCfg()) {
        char *errtxt = runtime_error(128);
        ERROR_SPRINTF(errtxt, "{059 parse_and_print_pressure_mol: could not sort particle config, particle ids not consecutive?} ");
        return TCL_ERROR;
    }
    if (argc < 2) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "usage: analyze pressure_mol <type1> <type2>", (char *)NULL);
        return (TCL_ERROR);
    }

    if (!ARG0_IS_I(type1)) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "usage: analyze pressure_mol <type1> <type2>", (char *)NULL);
        return (TCL_ERROR);
    }
    if (!ARG1_IS_I(type2)) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "usage: analyze pressure_mol <type1> <type2>", (char *)NULL);
        return (TCL_ERROR);
    }
    argc-=2;
    argv+=2;

    if (n_molecules==0) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "No molecules defined !", (char *)NULL);
        return (TCL_ERROR);
    }
    psum=calc_pressure_mol(type1,type2);
    //sprintf(buffer,"%i",type1);
    //Tcl_AppendResult(interp,"{ analyze pressure_mol ",buffer," ",(char *)NULL);
    //sprintf(buffer,"%i",type2);
    //Tcl_AppendResult(interp,buffer," ",(char *)NULL);
    sprintf(buffer,"%e",psum);
    Tcl_AppendResult(interp, buffer,(char *)NULL);
    return TCL_OK;
}
示例#4
0
int tclcommand_analyze_parse_and_print_energy_kinetic_mol(Tcl_Interp *interp,int argc, char **argv)
{
    char buffer[TCL_DOUBLE_SPACE];
    int type;
    double Ekin;
    updatePartCfg(WITHOUT_BONDS);
    if (!sortPartCfg()) {
        char *errtxt = runtime_error(128);
        ERROR_SPRINTF(errtxt, "{059 parse_and_print_energy_kinetic_mol: could not sort particle config, particle ids not consecutive?} ");
        return TCL_ERROR;
    }
    if (argc < 1) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "usage: analyze energy_kinetic <type>", (char *)NULL);
        return (TCL_ERROR);
    }

    if (!ARG0_IS_I(type)) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "usage: analyze energy_kinetic <type>", (char *)NULL);
        return (TCL_ERROR);
    }
    argc-=1;
    argv+=1;

    if (n_molecules==0) {
        Tcl_ResetResult(interp);
        Tcl_AppendResult(interp, "No molecules defined !", (char *)NULL);
        return (TCL_ERROR);
    }
    Ekin=calc_energy_kinetic_mol(type);
    if (Ekin < 0.0) {
        Tcl_ResetResult(interp);
        sprintf(buffer,"%i",-(int)Ekin);
        Tcl_AppendResult(interp,"Could not fetch com in calc_energy_kinetic_mol! From mol_id",buffer, (char *)NULL);
        return (TCL_ERROR);
    }
    //sprintf(buffer,"%i",type);
    //Tcl_AppendResult(interp,"{ analyze pressure_mol ",buffer," ",(char *)NULL);
    sprintf(buffer,"%e",Ekin);
    Tcl_AppendResult(interp, buffer,(char *)NULL);
    return TCL_OK;
}
示例#5
0
int tclcommand_analyze_set_parse_trapmol(Tcl_Interp *interp, int argc, char **argv)
{

#ifdef MOLFORCES
#ifdef EXTERNAL_FORCES
  int trap_flag = 0;
  int noforce_flag =0;
  int i;
#endif
#endif
  int mol_num;
  double spring_constant;
  double drag_constant;
  int isrelative;
  DoubleList trap_center;
  IntList trap_coords;
  IntList noforce_coords;
  char usage[] = "trapmol usage: <mol_id> { <xpos> <ypos> <zpos> } <isrelative> <spring_constant> <drag_constant> coords   { <trapped_coord> <trapped_coord> <trapped_coord> } noforce_coords {<noforce_coord> <noforce_coord> <noforce_coord>}";

  init_doublelist(&trap_center);
  init_intlist(&trap_coords);
  alloc_intlist(&trap_coords,3);
  init_intlist(&noforce_coords);
  alloc_intlist(&noforce_coords,3);
  /* Unless coords are specified the default is just to trap it completely */
  trap_coords.e[0] = 1;
  trap_coords.e[1] = 1;
  trap_coords.e[2] = 1;

  Tcl_ResetResult(interp);
  /* The first argument should be a molecule number */
  if (!ARG0_IS_I(mol_num)) {
    Tcl_AppendResult(interp, "first argument should be a molecule id", (char *)NULL);
    Tcl_AppendResult(interp, usage, (char *)NULL); 
    return TCL_ERROR;
  } else {
    /* Sanity checks */
    if (mol_num > n_molecules) {
      Tcl_AppendResult(interp, "trapmol: cannot trap mol %d because it does not exist",mol_num , (char *)NULL);
    return TCL_ERROR;
    }
    argc--;
    argv++;
  }

  /* The next argument should be a double list specifying the trap center */
  if (!ARG0_IS_DOUBLELIST(trap_center)) {
    Tcl_AppendResult(interp, "second argument should be a double list", (char *)NULL);
    Tcl_AppendResult(interp, usage , (char *)NULL);
    return TCL_ERROR;
  } else {
    argc -= 1;
    argv += 1;
  }

  /* The next argument should be an integer specifying whether the trap is relative (fraction of box_l) or absolute */
  if (!ARG0_IS_I(isrelative)) {
    Tcl_AppendResult(interp, "third argument should be an integer", (char *)NULL);
    Tcl_AppendResult(interp, usage, (char *)NULL);
    return TCL_ERROR;
  } else {
    argc -= 1;
    argv += 1;
  }

  /* The next argument should be the spring constant for the trap */
  if (!ARG0_IS_D(spring_constant)) {
    Tcl_AppendResult(interp, "fourth argument should be a double", (char *)NULL);
    Tcl_AppendResult(interp, usage, (char *)NULL);
    return TCL_ERROR;
  } else {
    argc -= 1;
    argv += 1;
  }

  /* The next argument should be the drag constant for the trap */
  if (!ARG0_IS_D(drag_constant)) {
    Tcl_AppendResult(interp, "fifth argument should be a double", (char *)NULL);
    Tcl_AppendResult(interp, usage, (char *)NULL);
    return TCL_ERROR;
  } else {
    argc -= 1;
    argv += 1;
  }

  /* Process optional arguments */
  while ( argc > 0 ) {    
    if ( ARG0_IS_S("coords") ) {
      if ( !ARG_IS_INTLIST(1,trap_coords) ) {
	Tcl_AppendResult(interp, "an intlist is required to specify coords", (char *)NULL);
	Tcl_AppendResult(interp, usage, (char *)NULL);
	return TCL_ERROR;
      }
      argc -= 2;
      argv += 2;
    } else if ( ARG0_IS_S("noforce_coords")) {
      if ( !ARG_IS_INTLIST(1,noforce_coords) ) {
	Tcl_AppendResult(interp, "an intlist is required to specify coords", (char *)NULL);
	Tcl_AppendResult(interp, usage, (char *)NULL);
	return TCL_ERROR;
      }
      argc -= 2;
      argv += 2;
    } else {
      Tcl_AppendResult(interp, "an option is not recognised", (char *)NULL);
      Tcl_AppendResult(interp, usage, (char *)NULL);
      return TCL_ERROR;
    }      
  }

#ifdef MOLFORCES 
#ifdef EXTERNAL_FORCES 
  for (i = 0; i < 3; i++) {
    if (trap_coords.e[i])
      trap_flag |= COORD_FIXED(i);
  
    if (noforce_coords.e[i])
      noforce_flag |= COORD_FIXED(i);
  }
  if (set_molecule_trap(mol_num, trap_flag,&trap_center,spring_constant, drag_constant, noforce_flag, isrelative) == TCL_ERROR) {
    Tcl_AppendResult(interp, "set topology first", (char *)NULL);
    return TCL_ERROR;
  }
#else
    Tcl_AppendResult(interp, "Error: EXTERNAL_FORCES not defined ", (char *)NULL);
    return TCL_ERROR;
#endif
#endif

  realloc_doublelist(&trap_center,0);
  realloc_intlist(&trap_coords,0);
  realloc_intlist(&noforce_coords,0);
  return tclcommand_analyze_set_parse_topo_part_sync(interp);
  
}
示例#6
0
int tclcommand_analyze_parse_local_stress_tensor(Tcl_Interp *interp, int argc, char **argv)
{
  char buffer[TCL_DOUBLE_SPACE];
  int periodic[3];
  double range_start[3];
  double range[3];
  int bins[3];
  int i,j,k,l;
  DoubleList *TensorInBin;
  PTENSOR_TRACE(fprintf(stderr,"%d: Running tclcommand_analyze_parse_local_stress_tensor\n",this_node));
  /* 'analyze stress profile ' */
  if (argc != 12) {
    Tcl_ResetResult(interp);
    Tcl_AppendResult(interp, "local_stress_tensor requires 12 inputs: x_periodic, y_periodic, z_periodic, x_range_start, y_range_start, z_range_start, x_range, y_range, z_range, x_bins, y_bins, z_bins", (char *)NULL);
    return(TCL_ERROR);
  }
  const char *usage = "usage: analyse local_stress_tensor <x_periodic> <y_periodic> <z_periodic> <x_range_start> <y_range_start> <z_range_start> <x_range> <y_range> <z_range> <x_bins> <y_bins> <z_bins>";
 
  for (i=0;i<3;i++) {
    if ( !ARG0_IS_I(periodic[i]) ) {
      Tcl_ResetResult(interp);
      Tcl_AppendResult(interp,usage, (char *)NULL);
      return (TCL_ERROR);
    } else {
      argc -= 1;
      argv += 1;
    }
  }
  for (i=0;i<3;i++) {
    if ( !ARG0_IS_D(range_start[i]) ) {
      Tcl_ResetResult(interp);
      Tcl_AppendResult(interp,usage, (char *)NULL);
      return (TCL_ERROR);
    } else {
      argc -= 1;
      argv += 1;
    }
  }
  for (i=0;i<3;i++) {
    if ( !ARG0_IS_D(range[i]) ) {
      Tcl_ResetResult(interp);
      Tcl_AppendResult(interp,usage, (char *)NULL);
      return (TCL_ERROR);
    } else {
      argc -= 1;
      argv += 1;
    }
  }
  for (i=0;i<3;i++) {
    if ( !ARG0_IS_I(bins[i]) ) {
      Tcl_ResetResult(interp);
      Tcl_AppendResult(interp,usage, (char *)NULL);
      return (TCL_ERROR);
    } else {
      argc -= 1;
      argv += 1;
    }
  }

  /* Allocate a doublelist of bins to keep track of stress profile */
  TensorInBin = (DoubleList *)malloc(bins[0]*bins[1]*bins[2]*sizeof(DoubleList));
  if ( TensorInBin ) {
  /* Initialize the stress profile */
    for ( i = 0 ; i < bins[0]*bins[1]*bins[2]; i++ ) {
      init_doublelist(&TensorInBin[i]);
      alloc_doublelist(&TensorInBin[i],9);
      for ( j = 0 ; j < 9 ; j++ ) {
	TensorInBin[i].e[j] = 0.0;
      }
    }
  } else {
    Tcl_AppendResult(interp,"could not allocate memory for local_stress_tensor", (char *)NULL);
    return (TCL_ERROR);
  }

  mpi_local_stress_tensor(TensorInBin, bins, periodic,range_start, range);
  PTENSOR_TRACE(fprintf(stderr,"%d: tclcommand_analyze_parse_local_stress_tensor: finished mpi_local_stress_tensor \n",this_node));

  /* Write stress profile to Tcl export */
  Tcl_AppendResult(interp, "{ LocalStressTensor } ", (char *)NULL);
  for ( i = 0 ; i < bins[0] ; i++) {
    for ( j = 0 ; j < bins[1] ; j++) {
      for ( k = 0 ; k < bins[2] ; k++) {
	Tcl_AppendResult(interp, " { ", (char *)NULL);
	sprintf(buffer," { %d %d %d } ",i,j,k);
	Tcl_AppendResult(interp,buffer, (char *)NULL);
	Tcl_AppendResult(interp, " { ", (char *)NULL);
	for ( l = 0 ; l < 9 ; l++) {
	  Tcl_PrintDouble(interp,TensorInBin[i*bins[1]*bins[2]+j*bins[2]+k].e[l],buffer);
	  Tcl_AppendResult(interp, buffer, (char *)NULL);
	  Tcl_AppendResult(interp, " ", (char *)NULL);
	}
	Tcl_AppendResult(interp, " } ", (char *)NULL);
	Tcl_AppendResult(interp, " } ", (char *)NULL);
      }
    }
  }
  
  /* Free memory */
  for ( i = 0 ; i < bins[0]*bins[1]*bins[2] ; i++ ) {
    realloc_doublelist(&TensorInBin[i],0);
  }
  free(TensorInBin);
  return TCL_OK;
}
示例#7
0
int tclcommand_readpdb(ClientData data, Tcl_Interp *interp, int argc, char *argv[]) {
  char *pdb_file = NULL;
  char *itp_file = NULL;
  int first_id = -1;
  int first_type = 0;
  int type = -1;
  bool fit = false;
  bool lj_internal = false;
  double lj_rel_cutoff = 2.5;
  bool lj_diagonal = false;

  std::vector<PdbLJInteraction> ljinteractions;

  argc--;
  argv++;

  while(argc > 0) {
    if(ARG0_IS_S("pdb_file")) {
      argc--;
      argv++;
      pdb_file = argv[0];
    } else if (ARG0_IS_S("itp_file")) {
      argc--;
      argv++;
      itp_file = argv[0];
    } else if (ARG0_IS_S("type")) {
      argc--;
      argv++;
      if(!ARG0_IS_I(type)) {
	Tcl_AppendResult(interp, "type takes exactly one integer argument.\n", (char *)NULL);
	return TCL_ERROR;
      }
    } else if (ARG0_IS_S("first_id")) {
      argc--;
      argv++;
      if(!ARG0_IS_I(first_id)) {
	Tcl_AppendResult(interp, "first_id takes exactly one integer argument.\n", (char *)NULL);
	return TCL_ERROR;
      }      
    } else if (ARG0_IS_S("first_type")) {
      argc--;
      argv++;
      if(!ARG0_IS_I(first_type)) {
	Tcl_AppendResult(interp, "first_type takes exactly one integer argument.\n", (char *)NULL);
	return TCL_ERROR;
      }            
    } else if (ARG0_IS_S("lj_rel_cutoff")) {
      argc--;
      argv++;
      if(!ARG0_IS_D(lj_rel_cutoff)) {
	return TCL_ERROR;
      }
    } else if (ARG0_IS_S("rescale_box")) {
      fit = true;
    } else if (ARG0_IS_S("lj_internal")) {
      lj_internal = true;
      lj_diagonal = false;
    } else if (ARG0_IS_S("lj_diagonal")) {
      lj_internal = true;
      lj_diagonal = true;
    } else if (ARG0_IS_S("lj_with")) {
      argc--;
      argv++;
      if(argc < 3)
	return TCL_ERROR;
      struct PdbLJInteraction ljia;
      if(!ARG0_IS_I(ljia.other_type)) {
	return TCL_ERROR;
      }                  
      argc--;
      argv++;
      if(!ARG0_IS_D(ljia.epsilon)) {
	return TCL_ERROR;
      }                  
      argc--;
      argv++;
      if(!ARG0_IS_D(ljia.sigma)) {
	return TCL_ERROR;
      }
      ljinteractions.push_back(ljia);
    }
    else {
      usage(interp);
      return TCL_ERROR;
    }
    argc--;
    argv++;
  }  
  if((type < 0) || (first_id < 0) || (pdb_file == NULL)) {
    usage(interp);
    return TCL_ERROR;
  }
  const int n_part = pdb_add_particles_from_file(pdb_file, first_id, type, ljinteractions, lj_rel_cutoff, itp_file, first_type, fit, lj_internal, lj_diagonal);
  if(!n_part) {
    Tcl_AppendResult(interp, "Could not parse pdb file.", (char *)NULL);
    return TCL_ERROR;
  }
  char buffer[32];
  snprintf(buffer, sizeof(buffer), "%d", n_part);
  Tcl_AppendResult(interp, buffer, (char *)NULL);
  return TCL_OK;
}