"wrappers/vscode:/vscode.git/clone" did not exist on "2d4372d7ba8de7e02b4af9cb57f4ef29cd146f34"
Unverified Commit e1056ad1 authored by peastman's avatar peastman Committed by GitHub
Browse files

Merge pull request #2290 from peastman/atan2

Support atan2() in custom expressions
parents 6e3c2142 b24c1d1a
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Biological Structures at Stanford, funded under the NIH Roadmap for * * Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. * * Medical Research, grant U54 GM072970. See https://simtk.org. *
* * * *
* Portions copyright (c) 2009-2018 Stanford University and the Authors. * * Portions copyright (c) 2009-2019 Stanford University and the Authors. *
* Authors: Peter Eastman * * Authors: Peter Eastman *
* Contributors: * * Contributors: *
* * * *
...@@ -464,6 +464,9 @@ void OpenCLExpressionUtilities::processExpression(stringstream& out, const Expre ...@@ -464,6 +464,9 @@ void OpenCLExpressionUtilities::processExpression(stringstream& out, const Expre
case Operation::ATAN: case Operation::ATAN:
out << "atan(" << getTempName(node.getChildren()[0], temps) << ")"; out << "atan(" << getTempName(node.getChildren()[0], temps) << ")";
break; break;
case Operation::ATAN2:
out << "atan2(" << getTempName(node.getChildren()[0], temps) << ", " << getTempName(node.getChildren()[1], temps) << ")";
break;
case Operation::SINH: case Operation::SINH:
out << "sinh(" << getTempName(node.getChildren()[0], temps) << ")"; out << "sinh(" << getTempName(node.getChildren()[0], temps) << ")";
break; break;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Biological Structures at Stanford, funded under the NIH Roadmap for * * Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. * * Medical Research, grant U54 GM072970. See https://simtk.org. *
* * * *
* Portions copyright (c) 2008-2015 Stanford University and the Authors. * * Portions copyright (c) 2008-2019 Stanford University and the Authors. *
* Authors: Peter Eastman * * Authors: Peter Eastman *
* Contributors: * * Contributors: *
* * * *
...@@ -216,6 +216,21 @@ void testIllegalVariable() { ...@@ -216,6 +216,21 @@ void testIllegalVariable() {
ASSERT(threwException); ASSERT(threwException);
} }
void testAtan2() {
System system;
system.addParticle(1.0);
CustomExternalForce* force = new CustomExternalForce("atan2(x, y)");
force->addParticle(0);
system.addForce(force);
VerletIntegrator integrator(0.01);
Context context(system, integrator, platform);
vector<Vec3> positions(1);
positions[0] = Vec3(1.5, -2.1, 1.2);
context.setPositions(positions);
State state = context.getState(State::Energy);
ASSERT_EQUAL_TOL(atan2(positions[0][0], positions[0][1]), state.getPotentialEnergy(), 1e-5);
}
void runPlatformTests(); void runPlatformTests();
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
...@@ -226,6 +241,7 @@ int main(int argc, char* argv[]) { ...@@ -226,6 +241,7 @@ int main(int argc, char* argv[]) {
testPeriodic(); testPeriodic();
testZeroPeriodicDistance(); testZeroPeriodicDistance();
testIllegalVariable(); testIllegalVariable();
testAtan2();
runPlatformTests(); runPlatformTests();
} }
catch(const exception& e) { catch(const exception& e) {
......
...@@ -265,6 +265,7 @@ int main() { ...@@ -265,6 +265,7 @@ int main() {
verifyEvaluation("ceil(x)", -2.1, 3.0, -2.0); verifyEvaluation("ceil(x)", -2.1, 3.0, -2.0);
verifyEvaluation("select(x, 1.0, y)", 0.3, 2.0, 1.0); verifyEvaluation("select(x, 1.0, y)", 0.3, 2.0, 1.0);
verifyEvaluation("select(x, 1.0, y)", 0.0, 2.0, 2.0); verifyEvaluation("select(x, 1.0, y)", 0.0, 2.0, 2.0);
verifyEvaluation("atan2(x, y)", 3.0, 1.5, std::atan(2.0));
verifyInvalidExpression("1..2"); verifyInvalidExpression("1..2");
verifyInvalidExpression("1*(2+3"); verifyInvalidExpression("1*(2+3");
verifyInvalidExpression("5++4"); verifyInvalidExpression("5++4");
...@@ -285,6 +286,7 @@ int main() { ...@@ -285,6 +286,7 @@ int main() {
verifyDerivative("asin(x)", "1/sqrt(1-x^2)"); verifyDerivative("asin(x)", "1/sqrt(1-x^2)");
verifyDerivative("acos(x)", "-1/sqrt(1-x^2)"); verifyDerivative("acos(x)", "-1/sqrt(1-x^2)");
verifyDerivative("atan(x)", "1/(1+x^2)"); verifyDerivative("atan(x)", "1/(1+x^2)");
verifyDerivative("atan2(2*x,y)", "2*y/(4*x^2+y^2)");
verifyDerivative("sinh(x)", "cosh(x)"); verifyDerivative("sinh(x)", "cosh(x)");
verifyDerivative("cosh(x)", "sinh(x)"); verifyDerivative("cosh(x)", "sinh(x)");
verifyDerivative("tanh(x)", "1/(cosh(x)^2)"); verifyDerivative("tanh(x)", "1/(cosh(x)^2)");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment