| /// \file |
| /// Handle command line arguments. |
| |
| #include "mycommand.h" |
| |
| #include <string.h> |
| #include <stdlib.h> |
| |
| #include "cmdLineParser.h" |
| #include "parallel.h" |
| #include "mytype.h" |
| |
| /// \page pg_running_comd Running CoMD |
| /// |
| /// \section sec_command_line_options Command Line Options |
| /// |
| /// CoMD accepts a number of command line options to set the parameters |
| /// of the simulation. Every option has both a long form and a short |
| /// form. The long and short form of the arguments are entirely |
| /// interchangeable and may be mixed. All the arguments are independent |
| /// with the exception of the \--potDir, \--potName, and \--potType, |
| /// (short forms -d, -n, and -t) arguments which are only relevant when |
| /// used in conjunction with \--doeam, (-e). |
| /// |
| /// Supported options are: |
| /// |
| /// | Long Form | Short Form | Default Value | Description |
| /// | :------------ | :---------: | :-----------: | :---------- |
| /// | \--help | -h | N/A | print this message |
| /// | \--potDir | -d | pots | potential directory |
| /// | \--potName | -p | Cu_u6.eam | potential name |
| /// | \--potType | -t | funcfl | potential type (funcfl or setfl) |
| /// | \--doeam | -e | N/A | compute eam potentials (default is LJ) |
| /// | \--nx | -x | 20 | number of unit cells in x |
| /// | \--ny | -y | 20 | number of unit cells in y |
| /// | \--nz | -z | 20 | number of unit cells in z |
| /// | \--xproc | -i | 1 | number of ranks in x direction |
| /// | \--yproc | -j | 1 | number of ranks in y direction |
| /// | \--zproc | -k | 1 | number of ranks in z direction |
| /// | \--nSteps | -N | 100 | total number of time steps |
| /// | \--printRate | -n | 10 | number of steps between output |
| /// | \--dt | -D | 1 | time step (in fs) |
| /// | \--lat | -l | -1 | lattice parameter (Angstroms) |
| /// | \--temp | -T | 600 | initial temperature (K) |
| /// | \--delta | -r | 0 | initial delta (Angstroms) |
| /// |
| /// Notes: |
| /// |
| /// The negative value for the lattice parameter (such as the default |
| /// value, -1) is interpreted as a flag to indicate that the lattice |
| /// parameter should be set from the potential. All supplied potentials |
| /// are for copper and have a lattice constant of 3.615 |
| /// Angstroms. Setting the lattice parameter to any positive value will |
| /// override the values provided in the potential files. |
| /// |
| /// The default potential name for the funcfl potential type is |
| /// Cu_u6.eam (Adams potential). For the setfl type the default |
| /// potential name is Cu01.eam.alloy (Mishin potential). Although these |
| /// will yield similar dynamics, the table have a very different number |
| /// of entries (500 vs. 10,000 points, respectively) This may give very |
| /// different performance, depending on the hardware. |
| /// |
| /// The default temperature is 600K. However, when using a perfect |
| /// lattice the system will rapidly cool to 300K due to equipartition of |
| /// energy. |
| /// |
| /// |
| /// \subsection ssec_example_command_lines Examples |
| /// |
| /// All of the examples below assume: |
| /// - The current working directory contains a copy of the pots dir (or |
| /// a link to it). |
| /// - The CoMD bin directory is located in ../bin |
| /// |
| /// Running in the examples directory will satisfy these requirements. |
| /// |
| /// ------------------------------ |
| /// |
| /// The canonical base simulation, is |
| /// |
| /// $ mpirun -np 1 ../bin/CoMD-mpi |
| /// |
| /// Or, if the code was built without MPI: |
| /// |
| /// $ ../bin/CoMD-serial |
| /// |
| /// ------------------------------ |
| /// |
| /// \subsubsection cmd_examples_potential Changing Potentials |
| /// |
| /// To run with the default (Adams) EAM potential, specify -e: |
| /// |
| /// $ ../bin/CoMD-mpi -e |
| /// |
| /// ------------------------------ |
| /// |
| /// To run using the Mishin EAM potential contained in the setfl file |
| /// Cu01.eam.alloy. This potential uses much larger tables (10,000 |
| /// entries vs. 500 for the Adams potential). |
| /// |
| /// $ ../bin/CoMD-mpi -e -t setfl |
| /// |
| /// ------------------------------ |
| /// |
| /// Selecting the name of a setfl file without setting the appropriate |
| /// potential type |
| /// |
| /// $ ../bin/CoMD-mpi -e -p Cu01.eam.alloy |
| /// |
| /// will result in an error message: |
| /// |
| /// Only FCC Lattice type supported, not . Fatal Error. |
| /// |
| /// Instead use: |
| /// |
| /// $ ../bin/CoMD-mpi -e -t setfl -p Cu01.eam.alloy |
| /// |
| /// ------------------------------ |
| /// |
| /// \subsubsection cmd_example_struct Initial Structure Modifications |
| /// |
| /// To change the lattice constant and run with an expanded or |
| /// compressed lattice: |
| /// |
| /// $ ../bin/CoMD-mpi -l 3.5 |
| /// |
| /// This can be useful to test that the potential is being correctly |
| /// evaluated as a function of interatomic spacing (the cold |
| /// curve). However, due to the high degree of symmetry of a perfect |
| /// lattice, this type of test is unlikely to detect errors in the force |
| /// computation. |
| /// |
| /// ------------------------------ |
| /// |
| /// Initialize with zero temperature (zero instantaneous particle |
| /// velocity) but with a random displacements of the atoms (in this |
| /// case the maximum displacement is 0.1 Angstrom along each axis). |
| /// |
| /// $ ../bin/CoMD-mpi --delta 0.1 -T 0 |
| /// |
| /// Typical values of delta are in the range of 0.1 to 0.5 Angstroms. |
| /// Larger values of delta correspond to higher initial potential energy |
| /// which in turn produce higer temperatures as the structure |
| /// equilibrates. |
| /// |
| /// ------------------------------ |
| /// |
| /// |
| /// \subsubsection cmd_examples_scaling Scaling Examples |
| /// |
| /// Simple shell scripts that demonstrate weak and strong scaling |
| /// studies are provided in the examples directory. |
| /// |
| /// ------------------------------ |
| /// |
| /// Run the default global simulation size (32,000 atoms) distributed |
| /// over 8 cubic subdomains, an example of strong scaling. If the |
| /// number of processors does not equal (i*j*k) the run will abort. |
| /// Notice that spaces are optional between short form options and their |
| /// arguments. |
| /// |
| /// $ mpirun -np 8 ../bin/CoMD-mpi -i2 -j2 -k2 |
| /// |
| /// ------------------------------ |
| /// |
| /// Run a weak scaling example: the simulation is doubled in each |
| /// dimension from the default 20 x 20 x 20 and the number of subdomains |
| /// in each direction is also doubled. |
| /// |
| /// $ mpirun -np 8 ../bin/CoMD-mpi -i2 -j2 -k2 -x 40 -y 40 -z 40 |
| /// |
| /// ------------------------------ |
| /// |
| /// The same weak scaling run, but for 10,000 timesteps, with output |
| /// only every 100 steps. |
| /// |
| /// $ mpirun -np 8 ../bin/CoMD-mpi -i2 -j2 -k2 -x 40 -y 40 -z 40 -N 10000 -n 100 |
| /// |
| |
| /// \details Initialize a Command structure with default values, then |
| /// parse any command line arguments that were supplied to overwrite |
| /// defaults. |
| /// |
| /// \param [in] argc the number of command line arguments |
| /// \param [in] argv the command line arguments array |
| Command parseCommandLine(int argc, char** argv) |
| { |
| Command cmd; |
| |
| memset(cmd.potDir, 0, 1024); |
| memset(cmd.potName, 0, 1024); |
| memset(cmd.potType, 0, 1024); |
| strcpy(cmd.potDir, "pots"); |
| strcpy(cmd.potName, "\0"); // default depends on potType |
| strcpy(cmd.potType, "funcfl"); |
| cmd.doeam = 0; |
| cmd.nx = 20; |
| cmd.ny = 20; |
| cmd.nz = 20; |
| cmd.xproc = 1; |
| cmd.yproc = 1; |
| cmd.zproc = 1; |
| cmd.nSteps = 100; |
| cmd.printRate = 10; |
| cmd.dt = 1.0; |
| cmd.lat = -1.0; |
| cmd.temperature = 600.0; |
| cmd.initialDelta = 0.0; |
| |
| int help=0; |
| // add arguments for processing. Please update the html documentation too! |
| addArg("help", 'h', 0, 'i', &(help), 0, "print this message"); |
| addArg("potDir", 'd', 1, 's', cmd.potDir, sizeof(cmd.potDir), "potential directory"); |
| addArg("potName", 'p', 1, 's', cmd.potName, sizeof(cmd.potName), "potential name"); |
| addArg("potType", 't', 1, 's', cmd.potType, sizeof(cmd.potType), "potential type (funcfl or setfl)"); |
| addArg("doeam", 'e', 0, 'i', &(cmd.doeam), 0, "compute eam potentials"); |
| addArg("nx", 'x', 1, 'i', &(cmd.nx), 0, "number of unit cells in x"); |
| addArg("ny", 'y', 1, 'i', &(cmd.ny), 0, "number of unit cells in y"); |
| addArg("nz", 'z', 1, 'i', &(cmd.nz), 0, "number of unit cells in z"); |
| addArg("xproc", 'i', 1, 'i', &(cmd.xproc), 0, "processors in x direction"); |
| addArg("yproc", 'j', 1, 'i', &(cmd.yproc), 0, "processors in y direction"); |
| addArg("zproc", 'k', 1, 'i', &(cmd.zproc), 0, "processors in z direction"); |
| addArg("nSteps", 'N', 1, 'i', &(cmd.nSteps), 0, "number of time steps"); |
| addArg("printRate", 'n', 1, 'i', &(cmd.printRate), 0, "number of steps between output"); |
| addArg("dt", 'D', 1, 'd', &(cmd.dt), 0, "time step (in fs)"); |
| addArg("lat", 'l', 1, 'd', &(cmd.lat), 0, "lattice parameter (Angstroms)"); |
| addArg("temp", 'T', 1, 'd', &(cmd.temperature), 0, "initial temperature (K)"); |
| addArg("delta", 'r', 1, 'd', &(cmd.initialDelta), 0, "initial delta (Angstroms)"); |
| |
| processArgs(argc,argv); |
| |
| // If user didn't set potName, set type dependent default. |
| if (strlen(cmd.potName) == 0) |
| { |
| if (strcmp(cmd.potType, "setfl" ) == 0) |
| strcpy(cmd.potName, "Cu01.eam.alloy"); |
| if (strcmp(cmd.potType, "funcfl") == 0) |
| strcpy(cmd.potName, "Cu_u6.eam"); |
| } |
| |
| if (help) |
| { |
| printArgs(); |
| freeArgs(); |
| exit(2); |
| } |
| freeArgs(); |
| |
| return cmd; |
| } |
| |
| void printCmdYaml(FILE* file, Command* cmd) |
| { |
| if (! printRank()) |
| return; |
| fprintf(file, |
| "Command Line Parameters:\n" |
| " doeam: %d\n" |
| " potDir: %s\n" |
| " potName: %s\n" |
| " potType: %s\n" |
| " nx: %d\n" |
| " ny: %d\n" |
| " nz: %d\n" |
| " xproc: %d\n" |
| " yproc: %d\n" |
| " zproc: %d\n" |
| " Lattice constant: %g Angstroms\n" |
| " nSteps: %d\n" |
| " printRate: %d\n" |
| " Time step: %g fs\n" |
| " Initial Temperature: %g K\n" |
| " Initial Delta: %g Angstroms\n" |
| "\n", |
| cmd->doeam, |
| #ifdef TEST_SUITE |
| cmd->potDir, |
| #else |
| ".", |
| #endif |
| cmd->potName, |
| cmd->potType, |
| cmd->nx, cmd->ny, cmd->nz, |
| cmd->xproc, cmd->yproc, cmd->zproc, |
| cmd->lat, |
| cmd->nSteps, |
| cmd->printRate, |
| cmd->dt, |
| cmd->temperature, |
| cmd->initialDelta |
| ); |
| fflush(file); |
| } |
| |