diff --git a/doc/if.html b/doc/if.html index bbbbfb5f2..90404076e 100644 --- a/doc/if.html +++ b/doc/if.html @@ -1,160 +1,162 @@ <HTML> <CENTER><A HREF = "http://lammps.sandia.gov">LAMMPS WWW Site</A> - <A HREF = "Manual.html">LAMMPS Documentation</A> - <A HREF = "Section_commands.html#comm">LAMMPS Commands</A> </CENTER> <HR> <H3>if command </H3> <P><B>Syntax:</B> </P> <PRE>if boolean then t1 t2 ... elif boolean f1 f2 ... elif boolean f1 f2 ... else e1 e2 ... </PRE> <UL><LI>boolean = a Boolean expression evaluated as TRUE or FALSE (see below) <LI>then = required word <LI>t1,t2,...,tN = one or more LAMMPS commands to execute if condition is met, each enclosed in quotes <LI>elif = optional word, can appear multiple times <LI>f1,f2,...,fN = one or more LAMMPS commands to execute if elif condition is met, each enclosed in quotes (optional arguments) <LI>else = optional argument <LI>e1,e2,...,eN = one or more LAMMPS commands to execute if no condition is met, each enclosed in quotes (optional arguments) </UL> <P><B>Examples:</B> </P> <PRE>if "${steps} > 1000" then exit if "$x <= $y" then "print X is smaller = $x" else "print Y is smaller = $y" if "(${eng} > 0.0) || ($n < 1000)" then & "timestep 0.005" & elif $n<10000 & "timestep 0.01" & else & "timestep 0.02" & "print 'Max step reached'" if "${eng} > ${eng_previous}" then "jump file1" else "jump file2" </PRE> <P><B>Description:</B> </P> <P>This command provides an in-then-else capability within an input script. A Boolean expression is evaluted and the result is TRUE or FALSE. Note that as in the examples above, the expression can contain variables, as defined by the <A HREF = "variable.html">variable</A> command, which will be evaluated as part of the expression. Thus a user-defined formula that reflects the current state of the simulation can be used to issue one or more new commands. </P> <P>If the result of the Boolean expression is TRUE, then one or more commands (t1, t2, ..., tN) are executed. If it is FALSE, then Boolean expressions associated with successive elif keywords are evaluated until one is found to be true, in which case its commands (f1, f2, ..., fN) are executed. If no Boolean expression is TRUE, then the commands associated witht the else keyword, namely (e1, e2, ..., eN), are executed. The elif and else keywords and their associated commands are optional. If they aren't specified and the initial Boolean expression is FALSE, then no commands are executed. </P> <P>The syntax for Boolean expressions is described below. </P> <P>Each command (t1, f1, e1, etc) can be any valid LAMMPS input script command. If the command is more than one word, it must enclosed in quotes, so it will be treated as a single argument, as in the examples above. </P> <P>IMPORTANT NOTE: If a command itself requires a quoted argument (e.g. a <A HREF = "print.html">print</A> command), then double and single quotes can be used and nested in the usual manner, as in the examples above and below. See <A HREF = "Section_commands.html#3_2">this section</A> of the manual for more details on using quotes in arguments. Only one of level of nesting is allowed, but that should be sufficient for most use cases. </P> <P>Note that by using the line continuation character "&", the if command can be spread across many lines, though it is still a single command: </P> <PRE>if "$a < $b" then & "print 'Minimum value = $a'" & "run 1000" & else & 'print "Minimum value = $b"' & "minimize 0.001 0.001 1000 10000" </PRE> <P>Note that if one of the commands to execute is an invalid LAMMPS command, such as "exit" in the first example above, then executing the command will cause LAMMPS to halt. </P> <P>Note that by jumping to a label in the same input script, the if command can be used to break out of a loop. See the <A HREF = "variable.html">variable delete</A> command for info on how to delete the associated loop variable, so that it can be re-used later in the input script. </P> <P>Here is an example of a double loop which uses the if and <A HREF = "jump.html">jump</A> commands to break out of the inner loop when a condition is met, then continues iterating thru the outer loop. </P> <PRE>label loopa variable a loop 5 label loopb variable b loop 5 print "A,B = $a,$b" run 10000 if '$b > 2' then "print 'Jumping to another script'" "jump in.script break" next b jump in.script loopb label break variable b delete </PRE> <PRE>next a jump in.script loopa </PRE> <HR> <P>The Boolean expressions for the if and elif keywords have a C-like syntax. Note that each expression is a single argument within the if command. Thus if you want to include spaces in the expression for clarity, you must enclose the entire expression in quotes. </P> <P>An expression is built out of numbers: </P> <PRE>0.2, 100, 1.0e20, -15.4, etc </PRE> <P>and Boolean operators: </P> <PRE>A == B, A != B, A < B, A <= B, A > B, A >= B, A && B, A || B, !A </PRE> <P>Each A and B is a number or a variable reference like $a or ${abc}, or another Boolean expression. </P> <P>If a variable is used it must produce a number when evaluated and substituted for in the expression, else an error will be generated. </P> <P>Expressions are evaluated left to right and have the usual C-style precedence: the unary logical NOT operator "!" has the highest precedence, the 4 relational operators "<", "<=", ">", and ">=" are next; the two remaining relational operators "==" and "!=" are next; then the logical AND operator "&&"; and finally the logical OR operator "||" has the lowest precedence. Parenthesis can be used to group one or more portions of an expression and/or enforce a different order of evaluation than what would occur with the default precedence. </P> <P>The 6 relational operators return either a 1.0 or 0.0 depending on whether the relationship between x and y is TRUE or FALSE. The logical AND operator will return 1.0 if both its arguments are non-zero, else it returns 0.0. The logical OR operator will return 1.0 if either of its arguments is non-zero, else it returns 0.0. The logical NOT operator returns 1.0 if its argument is 0.0, else it returns 0.0. </P> <P>The overall Boolean expression produces a TRUE result if the result is non-zero. If the result is zero, the expression result is FALSE. </P> +<HR> + <P><B>Restrictions:</B> none </P> <P><B>Related commands:</B> </P> <P><A HREF = "variable.html">variable</A>, <A HREF = "print.html">print</A> </P> <P><B>Default:</B> none </P> </HTML> diff --git a/doc/if.txt b/doc/if.txt index 7ecf6eb40..4a3cc3d72 100644 --- a/doc/if.txt +++ b/doc/if.txt @@ -1,154 +1,156 @@ "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) :link(lc,Section_commands.html#comm) :line if command :h3 [Syntax:] if boolean then t1 t2 ... elif boolean f1 f2 ... elif boolean f1 f2 ... else e1 e2 ... :pre boolean = a Boolean expression evaluated as TRUE or FALSE (see below) then = required word t1,t2,...,tN = one or more LAMMPS commands to execute if condition is met, each enclosed in quotes elif = optional word, can appear multiple times f1,f2,...,fN = one or more LAMMPS commands to execute if elif condition is met, each enclosed in quotes (optional arguments) else = optional argument e1,e2,...,eN = one or more LAMMPS commands to execute if no condition is met, each enclosed in quotes (optional arguments) :ul [Examples:] if "$\{steps\} > 1000" then exit if "$x <= $y" then "print X is smaller = $x" else "print Y is smaller = $y" if "($\{eng\} > 0.0) || ($n < 1000)" then & "timestep 0.005" & elif $n<10000 & "timestep 0.01" & else & "timestep 0.02" & "print 'Max step reached'" if "$\{eng\} > $\{eng_previous\}" then "jump file1" else "jump file2" :pre [Description:] This command provides an in-then-else capability within an input script. A Boolean expression is evaluted and the result is TRUE or FALSE. Note that as in the examples above, the expression can contain variables, as defined by the "variable"_variable.html command, which will be evaluated as part of the expression. Thus a user-defined formula that reflects the current state of the simulation can be used to issue one or more new commands. If the result of the Boolean expression is TRUE, then one or more commands (t1, t2, ..., tN) are executed. If it is FALSE, then Boolean expressions associated with successive elif keywords are evaluated until one is found to be true, in which case its commands (f1, f2, ..., fN) are executed. If no Boolean expression is TRUE, then the commands associated witht the else keyword, namely (e1, e2, ..., eN), are executed. The elif and else keywords and their associated commands are optional. If they aren't specified and the initial Boolean expression is FALSE, then no commands are executed. The syntax for Boolean expressions is described below. Each command (t1, f1, e1, etc) can be any valid LAMMPS input script command. If the command is more than one word, it must enclosed in quotes, so it will be treated as a single argument, as in the examples above. IMPORTANT NOTE: If a command itself requires a quoted argument (e.g. a "print"_print.html command), then double and single quotes can be used and nested in the usual manner, as in the examples above and below. See "this section"_Section_commands.html#3_2 of the manual for more details on using quotes in arguments. Only one of level of nesting is allowed, but that should be sufficient for most use cases. Note that by using the line continuation character "&", the if command can be spread across many lines, though it is still a single command: if "$a < $b" then & "print 'Minimum value = $a'" & "run 1000" & else & 'print "Minimum value = $b"' & "minimize 0.001 0.001 1000 10000" :pre Note that if one of the commands to execute is an invalid LAMMPS command, such as "exit" in the first example above, then executing the command will cause LAMMPS to halt. Note that by jumping to a label in the same input script, the if command can be used to break out of a loop. See the "variable delete"_variable.html command for info on how to delete the associated loop variable, so that it can be re-used later in the input script. Here is an example of a double loop which uses the if and "jump"_jump.html commands to break out of the inner loop when a condition is met, then continues iterating thru the outer loop. label loopa variable a loop 5 label loopb variable b loop 5 print "A,B = $a,$b" run 10000 if '$b > 2' then "print 'Jumping to another script'" "jump in.script break" next b jump in.script loopb label break variable b delete :pre next a jump in.script loopa :pre :line The Boolean expressions for the if and elif keywords have a C-like syntax. Note that each expression is a single argument within the if command. Thus if you want to include spaces in the expression for clarity, you must enclose the entire expression in quotes. An expression is built out of numbers: 0.2, 100, 1.0e20, -15.4, etc :pre and Boolean operators: A == B, A != B, A < B, A <= B, A > B, A >= B, A && B, A || B, !A :pre Each A and B is a number or a variable reference like $a or $\{abc\}, or another Boolean expression. If a variable is used it must produce a number when evaluated and substituted for in the expression, else an error will be generated. Expressions are evaluated left to right and have the usual C-style precedence: the unary logical NOT operator "!" has the highest precedence, the 4 relational operators "<", "<=", ">", and ">=" are next; the two remaining relational operators "==" and "!=" are next; then the logical AND operator "&&"; and finally the logical OR operator "||" has the lowest precedence. Parenthesis can be used to group one or more portions of an expression and/or enforce a different order of evaluation than what would occur with the default precedence. The 6 relational operators return either a 1.0 or 0.0 depending on whether the relationship between x and y is TRUE or FALSE. The logical AND operator will return 1.0 if both its arguments are non-zero, else it returns 0.0. The logical OR operator will return 1.0 if either of its arguments is non-zero, else it returns 0.0. The logical NOT operator returns 1.0 if its argument is 0.0, else it returns 0.0. The overall Boolean expression produces a TRUE result if the result is non-zero. If the result is zero, the expression result is FALSE. +:line + [Restrictions:] none [Related commands:] "variable"_variable.html, "print"_print.html [Default:] none