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; }
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); }
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; }
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; }
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); }
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; }
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; }