int tclcommand_inter_parse_coulomb(Tcl_Interp * interp, int argc, char ** argv) { double d1; Tcl_ResetResult(interp); if(argc == 0) { tclprint_to_result_CoulombIA(interp); return TCL_OK; } if (! ARG0_IS_D(d1)) { #ifdef P3M Tcl_ResetResult(interp); if (ARG0_IS_S("elc") && ((coulomb.method == COULOMB_P3M) || (coulomb.method == COULOMB_ELC_P3M))) return tclcommand_inter_coulomb_parse_elc_params(interp, argc - 1, argv + 1); if (coulomb.method == COULOMB_P3M) return tclcommand_inter_coulomb_parse_p3m_opt_params(interp, argc, argv); else { Tcl_AppendResult(interp, "expect: inter coulomb <bjerrum>", (char *) NULL); return TCL_ERROR; } #else return TCL_ERROR; #endif } if (coulomb_set_bjerrum(d1) == TCL_ERROR) { Tcl_AppendResult(interp, argv[0], "bjerrum length must be positive", (char *) NULL); return TCL_ERROR; } argc -= 1; argv += 1; if (d1 == 0.0 && argc == 0) { mpi_bcast_coulomb_params(); return TCL_OK; } if(argc < 1) { Tcl_AppendResult(interp, "wrong # args for inter coulomb.", (char *) NULL); mpi_bcast_coulomb_params(); return TCL_ERROR; } /* check method */ #define REGISTER_COULOMB(name, parser) \ if(ARG0_IS_S(name)) \ return parser(interp, argc-1, argv+1); #ifdef P3M REGISTER_COULOMB("p3m", tclcommand_inter_coulomb_parse_p3m); #endif REGISTER_COULOMB("dh", tclcommand_inter_coulomb_parse_dh); if(ARG0_IS_S("rf")) return tclcommand_inter_coulomb_parse_rf(interp, argc-1, argv+1,COULOMB_RF); if(ARG0_IS_S("inter_rf")) return tclcommand_inter_coulomb_parse_rf(interp, argc-1, argv+1,COULOMB_INTER_RF); REGISTER_COULOMB("mmm1d", tclcommand_inter_coulomb_parse_mmm1d); REGISTER_COULOMB("mmm2d", tclcommand_inter_coulomb_parse_mmm2d); REGISTER_COULOMB("maggs", tclcommand_inter_coulomb_parse_maggs); REGISTER_COULOMB("memd", tclcommand_inter_coulomb_parse_maggs); /* fallback */ coulomb.method = COULOMB_NONE; coulomb.bjerrum = 0.0; mpi_bcast_coulomb_params(); Tcl_AppendResult(interp, "do not know coulomb method \"",argv[0], "\": coulomb switched off", (char *) NULL); return TCL_ERROR; }
int tclcommand_inter_coulomb_parse_p3m_tune(Tcl_Interp * interp, int argc, char ** argv, int adaptive) { int cao = -1, n_interpol = -1; double r_cut = -1, accuracy = -1; int mesh[3]; IntList il; init_intlist(&il); mesh[0] = -1; mesh[1] = -1; mesh[2] = -1; while(argc > 0) { if(ARG0_IS_S("r_cut")) { if (! (argc > 1 && ARG1_IS_D(r_cut) && r_cut >= -1)) { Tcl_AppendResult(interp, "r_cut expects a positive double", (char *) NULL); return TCL_ERROR; } } else if(ARG0_IS_S("mesh")) { if(! ARG_IS_I(1, mesh[0])) { Tcl_ResetResult(interp); if( ! ARG_IS_INTLIST(1, il) || !(il.n == 3) ) { Tcl_AppendResult(interp, "integer or integer list of length 3 expected", (char *) NULL); return TCL_ERROR; } else { mesh[0] = il.e[0]; mesh[1] = il.e[1]; mesh[2] = il.e[2]; } } else if(! (argc > 1 && mesh[0] >= -1)) { Tcl_AppendResult(interp, "mesh expects an integer >= -1", (char *) NULL); return TCL_ERROR; } } else if(ARG0_IS_S("cao")) { if(! (argc > 1 && ARG1_IS_I(cao) && cao >= -1 && cao <= 7)) { Tcl_AppendResult(interp, "cao expects an integer between -1 and 7", (char *) NULL); return TCL_ERROR; } } else if(ARG0_IS_S("accuracy")) { if(! (argc > 1 && ARG1_IS_D(accuracy) && accuracy > 0)) { Tcl_AppendResult(interp, "accuracy expects a positive double", (char *) NULL); return TCL_ERROR; } } else if (ARG0_IS_S("n_interpol")) { if (! (argc > 1 && ARG1_IS_I(n_interpol) && n_interpol >= 0)) { Tcl_AppendResult(interp, "n_interpol expects an nonnegative integer", (char *) NULL); return TCL_ERROR; } } /* unknown parameter. Probably one of the optionals */ else break; argc -= 2; argv += 2; } if ( (mesh[0]%2 != 0 && mesh[0] != -1) || (mesh[1]%2 != 0 && mesh[1] != -1) || (mesh[2]%2 != 0 && mesh[2] != -1) ) { printf ("y cond me %d %d %d\n", mesh[1], mesh[1]%2 != 0, mesh[1] != -1); // if ( ( mesh[0]%2 != 0) && (mesh[0] != -1) ) { Tcl_AppendResult(interp, "P3M requires an even number of mesh points in all directions", (char *) NULL); return TCL_ERROR; } p3m_set_tune_params(r_cut, mesh, cao, -1.0, accuracy, n_interpol); /* check for optional parameters */ if (argc > 0) { if (tclcommand_inter_coulomb_parse_p3m_opt_params(interp, argc, argv) == TCL_ERROR) return TCL_ERROR; } /* do the tuning */ char *log = NULL; if (p3m_adaptive_tune(&log) == ES_ERROR) { Tcl_AppendResult(interp, log, "\nfailed to tune P3M parameters to required accuracy", (char *) NULL); if (log) free(log); return TCL_ERROR; } /* Tell the user about the tuning outcome */ Tcl_AppendResult(interp, log, (char *) NULL); if (log) free(log); return TCL_OK; }