int tclcommand_nemd(ClientData data, Tcl_Interp *interp, int argc, char **argv) { #ifdef NEMD int status = TCL_OK; INTEG_TRACE(fprintf(stderr, "%d: nemd:\n", this_node)); Tcl_ResetResult(interp); /* print nemd status */ if (argc == 1) { status = tclcommand_nemd_print_status(interp); } else if (ARG1_IS_S("off")) { nemd_method = NEMD_METHOD_OFF; status = nemd_free(); } else if (ARG1_IS_S("exchange")) { status = tclcommand_nemd_parse_exchange(interp, argc, argv); } else if (ARG1_IS_S("shearrate")) { status = tclcommand_nemd_parse_shearrate(interp, argc, argv); } else if (ARG1_IS_S("profile")) { status = tclcommand_nemd_parse_and_print_profile(interp); } else if (ARG1_IS_S("viscosity")) { status = tclcommand_nemd_parse_and_print_viscosity(interp); } else { Tcl_AppendResult(interp, "Unkwnown keyword: \n", (char *)NULL); return tclcommand_nemd_print_usage(interp); } return gather_runtime_errors(interp, status); #endif INTEG_TRACE( fprintf(stderr, "%d: call to nemd but not compiled in!\n", this_node)); return tclcommand_nemd_print_usage(interp); }
int tclcommand_metadynamics(ClientData data, Tcl_Interp *interp, int argc, char **argv) { int err = TCL_OK; /* print metadynamics status */ if(argc == 1) return tclcommand_metadynamics_print_status(interp); if ( ARG1_IS_S("set") ) { argc--; argv++; if (argc == 1) { Tcl_AppendResult(interp, "wrong # args: \n", (char *)NULL); return tclcommand_metadynamics_print_usage(interp, argc, argv); } } if ( ARG1_IS_S("off") ) err = tclcommand_metadynamics_parse_off(interp, argc, argv); else if ( ARG1_IS_S("distance")) err = tclcommand_metadynamics_parse_distance(interp, argc, argv); else if ( ARG1_IS_S("relative_z")) err = tclcommand_metadynamics_parse_relative_z(interp, argc, argv); else if ( ARG1_IS_S("print_stat")) err = tclcommand_metadynamics_print_stat(interp, argc, argv); else if ( ARG1_IS_S("load_stat")) err = tclcommand_metadynamics_parse_load_stat(interp, argc, argv); else { Tcl_AppendResult(interp, "Unknown metadynamics command ", argv[1], "\n", (char *)NULL); return tclcommand_metadynamics_print_usage(interp, argc, argv); } return gather_runtime_errors(interp, err); }
int tclcommand_change_volume(ClientData data, Tcl_Interp *interp, int argc, char **argv) { char buffer[50 + TCL_DOUBLE_SPACE + TCL_INTEGER_SPACE]; char *mode; double d_new = box_l[0]; int dir = -1; if (argc < 2) { Tcl_AppendResult(interp, "Wrong # of args! Usage: change_volume { <V_new> | <L_new> { x | y | z | xyz } }", (char *)NULL); return (TCL_ERROR); } if (Tcl_GetDouble(interp, argv[1], &d_new) == TCL_ERROR) return (TCL_ERROR); if (argc == 3) { mode = argv[2]; if (!strncmp(mode, "x", strlen(mode))) dir = 0; else if (!strncmp(mode, "y", strlen(mode))) dir = 1; else if (!strncmp(mode, "z", strlen(mode))) dir = 2; else if (!strncmp(mode, "xyz", strlen(mode))) dir = 3; } else if (argc > 3) { Tcl_AppendResult(interp, "Wrong # of args! Usage: change_volume { <V_new> | <L_new> { x | y | z | xyz } }", (char *)NULL); return (TCL_ERROR); } if (dir < 0) { d_new = pow(d_new,1./3.); rescale_boxl(3,d_new); } else { rescale_boxl(dir,d_new); } sprintf(buffer, "%f", box_l[0]*box_l[1]*box_l[2]); Tcl_AppendResult(interp, buffer, (char *)NULL); return gather_runtime_errors(interp, TCL_OK); }
int tclcommand_cellsystem(ClientData data, Tcl_Interp *interp, int argc, char **argv) { int err = 0; if (argc <= 1) { Tcl_AppendResult(interp, "usage: cellsystem <system> <params>", (char *)NULL); return TCL_ERROR; } if (ARG1_IS_S("domain_decomposition")) { if (argc > 2) { if (ARG_IS_S(2,"-verlet_list")) dd.use_vList = 1; else if(ARG_IS_S(2,"-no_verlet_list")) dd.use_vList = 0; else{ Tcl_AppendResult(interp, "wrong flag to",argv[0], " : should be \" -verlet_list or -no_verlet_list \"", (char *) NULL); return (TCL_ERROR); } } /** by default use verlet list */ else dd.use_vList = 1; mpi_bcast_cell_structure(CELL_STRUCTURE_DOMDEC); } else if (ARG1_IS_S("nsquare")) mpi_bcast_cell_structure(CELL_STRUCTURE_NSQUARE); else if (ARG1_IS_S("layered")) { if (argc > 2) { if (!ARG_IS_I(2, n_layers)) return TCL_ERROR; if (n_layers <= 0) { Tcl_AppendResult(interp, "layer height should be positive", (char *)NULL); return TCL_ERROR; } determine_n_layers = 0; } /* check node grid. All we can do is 1x1xn. */ if (node_grid[0] != 1 || node_grid[1] != 1) { node_grid[0] = node_grid[1] = 1; node_grid[2] = n_nodes; err = mpi_bcast_parameter(FIELD_NODEGRID); } else err = 0; if (!err) mpi_bcast_cell_structure(CELL_STRUCTURE_LAYERED); } else { Tcl_AppendResult(interp, "unkown cell structure type \"", argv[1],"\"", (char *)NULL); return TCL_ERROR; } return gather_runtime_errors(interp, TCL_OK); }
int tclcommand_thermostat(ClientData data, Tcl_Interp *interp, int argc, char **argv) { int err = TCL_OK; THERMO_TRACE(fprintf(stderr,"%d: thermostat:\n",this_node)); /* print thermostat status */ if(argc == 1) return tclcommand_thermostat_print_all(interp); if ( ARG1_IS_S("set") ) { argc--; argv++; if (argc == 1) { Tcl_AppendResult(interp, "wrong # args: \n", (char *)NULL); return tclcommand_thermostat_print_usage(interp, argc, argv); } } if ( ARG1_IS_S("off") ) err = tclcommand_thermostat_parse_off(interp, argc, argv); else if ( ARG1_IS_S("langevin")) err = tclcommand_thermostat_parse_langevin(interp, argc, argv); #ifdef DPD else if ( ARG1_IS_S("dpd") ) err = tclcommand_thermostat_parse_dpd(interp, argc, argv); #endif #ifdef INTER_DPD else if ( ARG1_IS_S("inter_dpd") ) err = tclcommand_thermostat_parse_inter_dpd(interp, argc, argv); #endif #ifdef NPT else if ( ARG1_IS_S("npt_isotropic") ) err = tclcommand_thermostat_parse_npt_isotropic(interp, argc, argv); #endif #if defined(LB) || defined(LB_GPU) else if ( ARG1_IS_S("lb")) err = tclcommand_thermostat_parse_lb(interp, argc-1, argv+1); #endif #ifdef GHMC else if ( ARG1_IS_S("ghmc") ) err = tclcommand_thermostat_parse_ghmc(interp, argc, argv); #endif else if ( ARG1_IS_S("cpu")) err = tclcommand_thermostat_parse_cpu(interp, argc, argv); #if defined(SD) || defined(BD) #ifdef SD else if ( ARG1_IS_S("sd") ) err = tclcommand_thermostat_parse_sd(interp, argc, argv); #endif // SD else if ( ARG1_IS_S("bd") ) err = tclcommand_thermostat_parse_bd(interp, argc, argv); #endif //SD || BD else { Tcl_AppendResult(interp, "Unknown thermostat ", argv[1], "\n", (char *)NULL); return tclcommand_thermostat_print_usage(interp, argc, argv); } return gather_runtime_errors(interp, err); }
int tclcommand_integrate(ClientData data, Tcl_Interp *interp, int argc, char **argv) { int n_steps; int i; INTEG_TRACE(fprintf(stderr,"%d: integrate:\n",this_node)); if (argc < 1) { Tcl_AppendResult(interp, "wrong # args: \n\"", (char *) NULL); return tclcommand_integrate_print_usage(interp); } else if (argc < 2) { return tclcommand_integrate_print_status(interp); } if (ARG1_IS_S("set")) { if (argc < 3) return tclcommand_integrate_print_status(interp); if (ARG_IS_S(2,"nvt")) return tclcommand_integrate_set_nvt(interp, argc, argv); #ifdef NPT else if (ARG_IS_S(2,"npt_isotropic")) return tclcommand_integrate_set_npt_isotropic(interp, argc, argv); #endif else { Tcl_AppendResult(interp, "unknown integrator method:\n", (char *)NULL); return tclcommand_integrate_print_usage(interp); } } else if ( !ARG_IS_I(1,n_steps) ) return tclcommand_integrate_print_usage(interp); /* go on with integrate <n_steps> */ if(n_steps < 0) { Tcl_AppendResult(interp, "illegal number of steps (must be >0) \n", (char *) NULL); return tclcommand_integrate_print_usage(interp);; } /* perform integration */ if (!correlations_autoupdate) { if (mpi_integrate(n_steps)) return gather_runtime_errors(interp, TCL_OK); } else { for (i=0; i<n_steps; i++) { if (mpi_integrate(1)) return gather_runtime_errors(interp, TCL_OK); autoupdate_correlations(); } } return TCL_OK; }
int tclcommand_inter_coulomb_parse_mmm1d(Tcl_Interp *interp, int argc, char **argv) { double switch_rad, maxPWerror; if (argc < 2) { Tcl_AppendResult(interp, "wrong # arguments: inter coulomb mmm1d <switch radius> " "{<bessel cutoff>} <maximal error for near formula> | tune <maximal pairwise error>", (char *) NULL); return TCL_ERROR; } if (ARG0_IS_S("tune")) { /* autodetermine bessel cutoff AND switching radius */ if (! ARG_IS_D(1, maxPWerror)) return TCL_ERROR; switch_rad = -1; } else { if (argc == 2) { /* autodetermine bessel cutoff */ if ((! ARG_IS_D(0, switch_rad)) || (! ARG_IS_D(1, maxPWerror))) return TCL_ERROR; } else { Tcl_AppendResult(interp, "wrong # arguments: inter coulomb mmm1d <switch radius> " "<maximal error for near formula> | tune <maximal pairwise error>", (char *) NULL); return TCL_ERROR; } if (switch_rad <= 0 || switch_rad > box_l[2]) { Tcl_AppendResult(interp, "switching radius is not between 0 and box_l[2]", (char *)NULL); return TCL_ERROR; } } MMM1D_set_params(switch_rad, maxPWerror); char *log = NULL; int result = mmm1d_tune(&log) == ES_OK ? TCL_OK : TCL_ERROR; Tcl_AppendResult(interp, log, NULL); if (log) free(log); return gather_runtime_errors(interp, result); }
int tclcommand_external_potential_tabulated(Tcl_Interp* interp, int argc, char **argv, ExternalPotential* e) { char* filename =0; DoubleList scalelist; init_doublelist(&scalelist); while (argc>0) { if (ARG0_IS_S("file") ) { if (argc>1) { filename = argv[1]; argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Usage: external_potential file <filename>\n" , (char *)NULL); return TCL_ERROR; } } else if (ARG0_IS_S("scale")) { if (argc>1 && ARG_IS_DOUBLELIST(1, scalelist)) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Usage: external_potential tabulated scale <float>\n" , (char *)NULL); return TCL_ERROR; } } else { Tcl_AppendResult(interp, "Unknown argument to external_potential: " , argv[0], "\n", (char *)NULL); return TCL_ERROR; } } if (filename == 0) { Tcl_AppendResult(interp, "No filename given to external_potential tabulated\n" , (char *)NULL); return TCL_ERROR; } if (external_potential_tabulated_init(n_external_potentials-1, filename, scalelist.n, scalelist.e)==ES_ERROR) { Tcl_AppendResult(interp, "Error creating external potential\n" , (char *)NULL); return TCL_ERROR; } return gather_runtime_errors(interp, TCL_OK); }
int tclcommand_setmd(ClientData data, Tcl_Interp *interp, int argc, char **argv) { union { int intbuf[MAX_DIMENSION]; double doublebuf[MAX_DIMENSION]; } databuf; char buffer[TCL_DOUBLE_SPACE + 5]; int i, j; int all = (argc == 1), writing = (argc >= 3); /* loop over all global variables. Has two purposes: either we write al variables or search for the one to write */ for (i = 0; fields[i].data != NULL; i++) { if (all || !strncmp(argv[1], fields[i].name, strlen(argv[1]))) { if (!all) { if ((int)strlen(argv[1]) < fields[i].min_length) { Tcl_AppendResult(interp, "Argument \"",argv[1],"\" not long ", (char *) NULL); Tcl_AppendResult(interp, "enough to identify a setmd variable!", (char *) NULL); return (TCL_ERROR); } if (writing) { /* set */ /* parse in data */ if (argc != 2 + fields[i].dimension) { sprintf(buffer, "%d", fields[i].dimension); Tcl_AppendResult(interp, "\"", argv[1], "\" has dimension ", buffer, (char *) NULL); sprintf(buffer, " not %d", argc - 2); Tcl_AppendResult(interp, buffer, (char *) NULL); return (TCL_ERROR); } /* get new value */ for (j = 0; j < fields[i].dimension; j++) { switch (fields[i].type) { case TYPE_INT: if (Tcl_GetInt(interp, argv[2 + j], databuf.intbuf + j) == TCL_ERROR) return (TCL_ERROR); break; case TYPE_BOOL: { int dta; if (Tcl_GetInt(interp, argv[2 + j], &dta)) return (TCL_ERROR); if (dta) { databuf.intbuf[0] |= (1L << j); } else { databuf.intbuf[0] &= ~(1L << j); } break; } case TYPE_DOUBLE: if (Tcl_GetDouble(interp, argv[2 + j], databuf.doublebuf + j)) return (TCL_ERROR); break; default: ; } } if (find_callback(i)(interp, databuf.intbuf) != TCL_OK) return gather_runtime_errors(interp, TCL_ERROR); /* fall through to write out the set value immediately again */ } } /* get */ if (all) { if (i != 0) Tcl_AppendResult(interp, " ", (char *)NULL); Tcl_AppendResult(interp, "{", fields[i].name, " ", (char *)NULL); } for (j = 0; j < fields[i].dimension; j++) { switch (fields[i].type) { case TYPE_INT: sprintf(buffer, "%d", ((int *)fields[i].data)[j]); break; case TYPE_BOOL: { if ((*(int *)fields[i].data) & (1L << j)) strcpy(buffer, "1"); else strcpy(buffer, "0"); break; } case TYPE_DOUBLE: Tcl_PrintDouble(interp, ((double *)fields[i].data)[j], buffer); break; default: ; } Tcl_AppendResult(interp, buffer, (char *) NULL); if (j < fields[i].dimension - 1) Tcl_AppendResult(interp, " ", (char *) NULL); } if (all) Tcl_AppendResult(interp, "}", (char *)NULL); /* wrote out one value, so skip rest */ if (!all) { if (writing) return gather_runtime_errors(interp, TCL_OK); else return (TCL_OK); } } } if (all) return TCL_OK; Tcl_AppendResult(interp, "unknown md variable \"", argv[1], "\"", (char *) NULL); return (TCL_ERROR); }
int tclcommand_integrate(ClientData data, Tcl_Interp *interp, int argc, char **argv) { int n_steps, reuse_forces = 0; INTEG_TRACE(fprintf(stderr, "%d: integrate:\n", this_node)); if (argc < 1) { Tcl_AppendResult(interp, "wrong # args: \n\"", (char *)NULL); return tclcommand_integrate_print_usage(interp); } else if (argc < 2) { return tclcommand_integrate_print_status(interp); } if (ARG1_IS_S("set")) { if (argc < 3) return tclcommand_integrate_print_status(interp); if (ARG_IS_S(2, "nvt")) return tclcommand_integrate_set_nvt(interp, argc, argv); #ifdef NPT else if (ARG_IS_S(2, "npt_isotropic")) return tclcommand_integrate_set_npt_isotropic(interp, argc, argv); #endif else { Tcl_AppendResult(interp, "unknown integrator method:\n", (char *)NULL); return tclcommand_integrate_print_usage(interp); } } else { if (!ARG_IS_I(1, n_steps)) return tclcommand_integrate_print_usage(interp); // actual integration if ((argc == 3) && ARG_IS_S(2, "reuse_forces")) { reuse_forces = 1; } else if ((argc == 3) && ARG_IS_S(2, "recalc_forces")) { reuse_forces = -1; } else if (argc != 2) return tclcommand_integrate_print_usage(interp); } /* go on with integrate <n_steps> */ if (n_steps < 0) { Tcl_AppendResult(interp, "illegal number of steps (must be >0) \n", (char *)NULL); return tclcommand_integrate_print_usage(interp); ; } /* if skin wasn't set, do an educated guess now */ if (!skin_set) { if (max_cut == 0.0) { Tcl_AppendResult(interp, "cannot automatically determine skin, please " "set it manually via \"setmd skin\"\n", (char *)NULL); return TCL_ERROR; } skin = 0.4 * max_cut; mpi_bcast_parameter(FIELD_SKIN); } /* perform integration */ if (!correlations_autoupdate && !observables_autoupdate) { if (mpi_integrate(n_steps, reuse_forces)) return gather_runtime_errors(interp, TCL_OK); } else { for (int i = 0; i < n_steps; i++) { if (mpi_integrate(1, reuse_forces)) return gather_runtime_errors(interp, TCL_OK); reuse_forces = 1; autoupdate_observables(); autoupdate_correlations(); } if (n_steps == 0) { if (mpi_integrate(0, reuse_forces)) return gather_runtime_errors(interp, TCL_OK); } } return TCL_OK; }
int tclcommand_lbboundary(ClientData data, Tcl_Interp *interp, int argc, char **argv) { #if defined (LB_BOUNDARIES) || defined (LB_BOUNDARIES_GPU) int status = TCL_ERROR, c_num; if ( lattice_switch == LATTICE_OFF ) { fprintf (stderr ,"WARNING: Specifying boundaries before using lbfluid assumes a CPU implementation of the LB.\n"); fprintf (stderr ,"WARNING: This will lead to unexpected behavior if a GPU LB fluid is later used since the boundaries wont exist.\n"); } if (argc < 2) return tclcommand_lbboundary_print_all(interp); if(ARG_IS_S(1, "wall")) { status = tclcommand_lbboundary_wall(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "sphere")) { status = tclcommand_lbboundary_sphere(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "cylinder")) { status = tclcommand_lbboundary_cylinder(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "rhomboid")) { status = tclcommand_lbboundary_rhomboid(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "pore")) { status = tclcommand_lbboundary_pore(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "stomatocyte")) { status = tclcommand_lbboundary_stomatocyte(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "hollow_cone")) { status = tclcommand_lbboundary_hollow_cone(generate_lbboundary(),interp, argc - 2, argv + 2); if (lattice_switch & LATTICE_LB_GPU) { mpi_bcast_lbboundary(-3); } else mpi_bcast_lbboundary(-1); } else if(ARG_IS_S(1, "force")) { if(argc != 3 || Tcl_GetInt(interp, argv[2], &(c_num)) == TCL_ERROR) { Tcl_AppendResult(interp, "Usage: lbboundary force $n",(char *) NULL); return (TCL_ERROR); } if(c_num < 0 || c_num >= n_lb_boundaries) { Tcl_AppendResult(interp, "Error in lbboundary force: The selected boundary does not exist",(char *) NULL); return (TCL_ERROR); } #if defined (LB) || defined (LB_GPU) char buffer[3*TCL_DOUBLE_SPACE+3]; double force[3]; status = lbboundary_get_force(c_num, force); for (int i = 0; i < 3; i++) { Tcl_PrintDouble(interp, force[i], buffer); Tcl_AppendResult(interp, buffer, " ", (char *)NULL); } #endif } else if(ARG_IS_S(1, "delete")) { if(argc < 3) { /* delete all */ mpi_bcast_lbboundary(-2); status = TCL_OK; } else { if (lattice_switch & LATTICE_LB_GPU) { Tcl_AppendResult(interp, "Cannot delete individual lb boundaries",(char *) NULL); return(TCL_ERROR); } if(Tcl_GetInt(interp, argv[2], &(c_num)) == TCL_ERROR) return (TCL_ERROR); if(c_num < 0 || c_num >= n_lb_boundaries) { Tcl_AppendResult(interp, "Can not delete non existing lbboundary",(char *) NULL); return (TCL_ERROR); } mpi_bcast_lbboundary(c_num); status = TCL_OK; } } else if(argc == 2 && Tcl_GetInt(interp, argv[1], &c_num) == TCL_OK) { tclcommand_printLbBoundaryToResult(interp, c_num); status = TCL_OK; } else { Tcl_AppendResult(interp, "possible lbboundary parameters: wall, sphere, cylinder, rhomboid, pore, stomatocyte, hollow_cone, delete {c} to delete lbboundary",(char *) NULL); return (TCL_ERROR); } return gather_runtime_errors(interp, status); #else /* !defined(LB_BOUNDARIES) || !defined(LB_BOUNDARIES_GPU */ Tcl_AppendResult(interp, "LB_BOUNDARIES/LB_BOUNDARIES_GPU not compiled in!" ,(char *) NULL); return (TCL_ERROR); #endif /* LB_BOUNDARIES or LB_BOUNDARIES_GPU */ }
int tclcommand_lbfluid(ClientData data, Tcl_Interp *interp, int argc, char **argv) { #if defined (LB) || defined (LB_GPU) argc--; argv++; /**if we have LB the LB cpu is set by default */ #ifdef LB if(!(lattice_switch & LATTICE_LB_GPU)) lattice_switch = lattice_switch | LATTICE_LB; #else lattice_switch = lattice_switch | LATTICE_LB_GPU; #endif int err = TCL_OK; double floatarg; #ifdef EXTERNAL_FORCES double vectarg[3]; #endif if (argc < 1) { lbfluid_tcl_print_usage(interp); return TCL_ERROR; } else if (ARG0_IS_S("off")) { lbfluid_tcl_print_usage(interp); return TCL_ERROR; } else if (ARG0_IS_S("init")) { lbfluid_tcl_print_usage(interp); return TCL_ERROR; } else while (argc > 0) { if (ARG0_IS_S("gpu") || ARG0_IS_S("GPU")) { #ifdef LB_GPU lattice_switch = (lattice_switch &~ LATTICE_LB) | LATTICE_LB_GPU; argc--; argv++; #else Tcl_AppendResult(interp, "LB_GPU is not compiled in!", NULL); return TCL_ERROR; #endif } else if (ARG0_IS_S("cpu") || ARG0_IS_S("CPU")) { #ifdef LB lattice_switch = (lattice_switch & ~LATTICE_LB_GPU) | LATTICE_LB; argc--; argv++; #else Tcl_AppendResult(interp, "LB is not compiled in!", NULL); return TCL_ERROR; #endif } else if (ARG0_IS_S("density") || ARG0_IS_S("dens")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "dens requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (floatarg <= 0) { Tcl_AppendResult(interp, "dens must be positive", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_density(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting dens", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("grid") || ARG0_IS_S("agrid")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "agrid requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (floatarg <= 0) { Tcl_AppendResult(interp, "agrid must be positive", (char *)NULL); return TCL_ERROR; } else if (0) { // agrid is not compatible with box_l; // Not necessary because this is caught on the mpi level! } else { if ( lb_lbfluid_set_agrid(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting agrid", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("tau")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "tau requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (floatarg <= 0) { Tcl_AppendResult(interp, "tau must be positive", (char *)NULL); return TCL_ERROR; } else if (floatarg < time_step ) { Tcl_AppendResult(interp, "tau must larger than the MD time step", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_tau(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting tau", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("viscosity") || ARG0_IS_S("visc")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "visc requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (floatarg <= 0) { Tcl_AppendResult(interp, "visc must be positive", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_visc(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting viscosity", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("bulk_viscosity")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "bulk_visc requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (floatarg <= 0) { Tcl_AppendResult(interp, "bulk_visc must be positive", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_bulk_visc(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting bulk_viscosity", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("friction") || ARG0_IS_S("coupling")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "friction requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (floatarg <= 0) { Tcl_AppendResult(interp, "friction must be positive", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_friction(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting friction", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("ext_force")) { #ifdef EXTERNAL_FORCES if ( argc < 4 || !ARG_IS_D(1, vectarg[0]) || !ARG_IS_D(2, vectarg[1]) || !ARG_IS_D(3, vectarg[2]) ) { Tcl_AppendResult(interp, "friction requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (lb_lbfluid_set_ext_force(vectarg[0], vectarg[1], vectarg[2]) == 0) { argc-=4; argv+=4; } else { Tcl_AppendResult(interp, "Unknown Error setting ext_force", (char *)NULL); return TCL_ERROR; } #else Tcl_AppendResult(interp, "External Forces not compiled in!", (char *)NULL); return TCL_ERROR; #endif } else if (ARG0_IS_S("gamma_odd")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "gamma_odd requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (fabs(floatarg) >= 1) { Tcl_AppendResult(interp, "gamma_odd must < 1", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_gamma_odd(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting gamma_odd", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("gamma_even")) { if ( argc < 2 || !ARG1_IS_D(floatarg) ) { Tcl_AppendResult(interp, "gamma_even requires 1 argument", (char *)NULL); return TCL_ERROR; } else if (fabs(floatarg) >= 1) { Tcl_AppendResult(interp, "gamma_even must < 1", (char *)NULL); return TCL_ERROR; } else { if ( lb_lbfluid_set_gamma_even(floatarg) == 0 ) { argc-=2; argv+=2; } else { Tcl_AppendResult(interp, "Unknown Error setting gamma_even", (char *)NULL); return TCL_ERROR; } } } else if (ARG0_IS_S("print")) { if ( argc < 3 || (ARG1_IS_S("vtk") && argc < 4) ) { Tcl_AppendResult(interp, "lbfluid print requires at least 2 arguments. Usage: lbfluid print [vtk] velocity|boundary filename", (char *)NULL); return TCL_ERROR; } else { argc--; argv++; if (ARG0_IS_S("vtk")) { if (ARG1_IS_S("boundary")) { if ( lb_lbfluid_print_vtk_boundary(argv[2]) != 0 ) { Tcl_AppendResult(interp, "Unknown Error at lbfluid print vtk boundary", (char *)NULL); return TCL_ERROR; } } else if (ARG1_IS_S("velocity")) { if ( lb_lbfluid_print_vtk_velocity(argv[2]) != 0 ) { Tcl_AppendResult(interp, "Unknown Error at lbfluid print vtk velocity", (char *)NULL); return TCL_ERROR; } } else { return TCL_ERROR; } argc-=3; argv+=3; } else { if (ARG0_IS_S("boundary")) { if ( lb_lbfluid_print_boundary(argv[1]) != 0 ) { Tcl_AppendResult(interp, "Unknown Error at lbfluid print boundary", (char *)NULL); return TCL_ERROR; } } else if (ARG0_IS_S("velocity")) { if ( lb_lbfluid_print_velocity(argv[1]) != 0 ) { Tcl_AppendResult(interp, "Unknown Error at lbfluid print velocity", (char *)NULL); return TCL_ERROR; } } else { return TCL_ERROR; } argc-=2; argv+=2; } } } else if (ARG0_IS_S("save_ascii_checkpoint")) { if (argc < 2) { Tcl_AppendResult(interp, "usage: lbfluid save_ascii_checkpoint <filename>", (char *)NULL); return TCL_ERROR; } else { return lb_lbfluid_save_checkpoint(argv[1], 0); } } else if (ARG0_IS_S("save_binary_checkpoint")) { if (argc < 2) { Tcl_AppendResult(interp, "usage: lbfluid save_binary_checkpoint <filename>", (char *)NULL); return TCL_ERROR; } else { return lb_lbfluid_save_checkpoint(argv[1], 1); } } else if (ARG0_IS_S("load_ascii_checkpoint")) { if (argc < 2) { Tcl_AppendResult(interp, "usage: lbfluid load_ascii_checkpoint <filename>", (char *)NULL); return TCL_ERROR; } else { return lb_lbfluid_load_checkpoint(argv[1], 0); } } else if (ARG0_IS_S("load_binary_checkpoint")) { if (argc < 2) { Tcl_AppendResult(interp, "usage: lbfluid load_binary_checkpoint <filename>", (char *)NULL); return TCL_ERROR; } else { return lb_lbfluid_load_checkpoint(argv[1], 1); } } #ifdef LB else if (ARG0_IS_S("print_interpolated_velocity")) { //this has to come after print return tclcommand_lbfluid_print_interpolated_velocity(interp, argc-1, argv+1); } #endif else { Tcl_AppendResult(interp, "unknown feature \"", argv[0],"\" of lbfluid", (char *)NULL); return TCL_ERROR ; } if ((err = gather_runtime_errors(interp, err)) != TCL_OK) return TCL_ERROR; } mpi_bcast_parameter(FIELD_LATTICE_SWITCH); /* thermo_switch is retained for backwards compatibility */ thermo_switch = (thermo_switch | THERMO_LB); mpi_bcast_parameter(FIELD_THERMO_SWITCH); return TCL_OK; #else /* !defined LB */ Tcl_AppendResult(interp, "LB is not compiled in!", NULL); return TCL_ERROR; #endif }