From 3bd7be09ec50fd3841a4693fdb00a834f3cb2422 Mon Sep 17 00:00:00 2001 From: Berk Hess Date: Wed, 30 Jun 2021 10:50:18 +0000 Subject: [PATCH] Port basic pull test to gtest framework --- src/programs/mdrun/tests/CMakeLists.txt | 15 ++ src/programs/mdrun/tests/moduletest.cpp | 5 + src/programs/mdrun/tests/moduletest.h | 2 + src/programs/mdrun/tests/pull.cpp | 223 ++++++++++++++++++ ...PullIntegrationTest_WithinTolerances_0.xml | 36 +++ ...PullIntegrationTest_WithinTolerances_1.xml | 36 +++ ...PullIntegrationTest_WithinTolerances_2.xml | 36 +++ src/testutils/simulationdatabase/spc216.ndx | 46 +--- .../simulationdatabase/spc216_pull.ndx | 51 ++++ 9 files changed, 405 insertions(+), 45 deletions(-) create mode 100644 src/programs/mdrun/tests/pull.cpp create mode 100644 src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml create mode 100644 src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml create mode 100644 src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml create mode 100644 src/testutils/simulationdatabase/spc216_pull.ndx diff --git a/src/programs/mdrun/tests/CMakeLists.txt b/src/programs/mdrun/tests/CMakeLists.txt index 6b4300486e..32ff54143f 100644 --- a/src/programs/mdrun/tests/CMakeLists.txt +++ b/src/programs/mdrun/tests/CMakeLists.txt @@ -247,6 +247,21 @@ gmx_add_gtest_executable(${exename} ) target_link_libraries(${exename} PRIVATE mdrun_test_infrastructure) # TODO: Link specific modules: topology + +# End-to-end test for pull functionality +target_link_libraries(${exename} PRIVATE legacy_modules) +gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST IGNORE_LEAKS) +set(testname "MdrunPullTests") +set(exename "mdrun-pull-test") + +gmx_add_gtest_executable(${exename} + CPP_SOURCE_FILES + # files with code for tests + pull.cpp + # pseudo-library for code for mdrun + $ +) +target_link_libraries(${exename} PRIVATE mdrun_test_infrastructure) target_link_libraries(${exename} PRIVATE legacy_modules) gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST IGNORE_LEAKS) diff --git a/src/programs/mdrun/tests/moduletest.cpp b/src/programs/mdrun/tests/moduletest.cpp index 1a15c721a9..f71254a1b5 100644 --- a/src/programs/mdrun/tests/moduletest.cpp +++ b/src/programs/mdrun/tests/moduletest.cpp @@ -174,6 +174,11 @@ void SimulationRunner::useGroFromDatabase(const char* name) groFileName_ = gmx::test::TestFileManager::getInputFilePath((std::string(name) + ".gro").c_str()); } +void SimulationRunner::useNdxFromDatabase(const std::string& name) +{ + ndxFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".ndx"); +} + void SimulationRunner::useTopGroAndMdpFromFepTestDatabase(const std::string& name) { GMX_RELEASE_ASSERT(mdpSource_ != SimulationRunnerMdpSource::String, diff --git a/src/programs/mdrun/tests/moduletest.h b/src/programs/mdrun/tests/moduletest.h index 72261b69fe..2a23459089 100644 --- a/src/programs/mdrun/tests/moduletest.h +++ b/src/programs/mdrun/tests/moduletest.h @@ -125,6 +125,8 @@ public: void useTopGroAndNdxFromDatabase(const std::string& name); //! Use a standard .gro file as input to grompp void useGroFromDatabase(const char* name); + //! Use a standard .ndx as input to grompp + void useNdxFromDatabase(const std::string& name); //! Use .top, .gro, and .mdp from FEP test database void useTopGroAndMdpFromFepTestDatabase(const std::string& name); //! Calls grompp (on rank 0, with a customized command line) to prepare for the mdrun test diff --git a/src/programs/mdrun/tests/pull.cpp b/src/programs/mdrun/tests/pull.cpp new file mode 100644 index 0000000000..56bc255a46 --- /dev/null +++ b/src/programs/mdrun/tests/pull.cpp @@ -0,0 +1,223 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * GROMACS is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * GROMACS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GROMACS; if not, see + * http://www.gnu.org/licenses, or write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * If you want to redistribute modifications to GROMACS, please + * consider that scientific software is very special. Version + * control is crucial - bugs must be traceable. We will be happy to + * consider code for inclusion in the official distribution, but + * derived work must not be called official GROMACS. Details are found + * in the README & COPYING files - if they are missing, get the + * official version at http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ + +/*! \internal \file + * \brief + * Tests for mdrun pull functionality. + * + * \author Berk Hess + * \ingroup module_mdrun_integration_tests + */ +#include "gmxpre.h" + +#include +#include +#include +#include +#include + +#include + +#include "gromacs/options/filenameoption.h" +#include "gromacs/topology/idef.h" +#include "gromacs/topology/ifunc.h" +#include "gromacs/utility/stringutil.h" + +#include "testutils/mpitest.h" +#include "testutils/refdata.h" +#include "testutils/simulationdatabase.h" +#include "testutils/testasserts.h" + +#include "energycomparison.h" +#include "moduletest.h" + +namespace gmx +{ +namespace test +{ +namespace +{ + +/*! \brief Database of energy tolerances on the various systems. */ +std::unordered_map energyToleranceForSystem_g = { + { { "spc216", relativeToleranceAsFloatingPoint(1, 1e-4) } } +}; + +/*! \brief Database of pressure tolerances on the various systems. */ +std::unordered_map pressureToleranceForSystem_g = { + { { "spc216", relativeToleranceAsFloatingPoint(1, 2e-4) } } +}; + +const std::unordered_map>> c_mdpPullParams = { + { { "umbrella-3D", + { { "pull-ngroups", "2" }, + { "pull-ncoords", "1" }, + { "pull-nstxout", "0" }, + { "pull-nstfout", "0" }, + { "pull-group1-name", "r_1" }, + { "pull-group2-name", "r_2" }, + { "pull-coord1-groups", "1 2" }, + { "pull-coord1-type", "umbrella" }, + { "pull-coord1-geometry", "distance" }, + { "pull-coord1-dim", "Y Y Y" }, + { "pull-coord1-init", "0.6" }, + { "pull-coord1-k", "100" } } }, + { "umbrella-2D", + { { "pull-ngroups", "2" }, + { "pull-ncoords", "1" }, + { "pull-nstxout", "0" }, + { "pull-nstfout", "0" }, + { "pull-group1-name", "r_1" }, + { "pull-group2-name", "r_2" }, + { "pull-coord1-groups", "1 2" }, + { "pull-coord1-type", "umbrella" }, + { "pull-coord1-geometry", "distance" }, + { "pull-coord1-dim", "Y Y N" }, + { "pull-coord1-init", "0.4" }, + { "pull-coord1-k", "100" } } }, + { "constraint-flatbottom", + { { "pull-ngroups", "3" }, + { "pull-ncoords", "2" }, + { "pull-nstxout", "0" }, + { "pull-nstfout", "0" }, + { "pull-group1-name", "r_1" }, + { "pull-group2-name", "r_2" }, + { "pull-group3-name", "r_3" }, + { "pull-coord1-groups", "1 2" }, + { "pull-coord1-type", "constraint" }, + { "pull-coord1-geometry", "distance" }, + { "pull-coord1-dim", "Y Y Y" }, + { "pull-coord1-init", "0.5" }, + { "pull-coord2-groups", "1 3" }, + { "pull-coord2-type", "flat-bottom" }, + { "pull-coord2-geometry", "distance" }, + { "pull-coord2-dim", "Y Y Y" }, + { "pull-coord2-init", "0.4" }, + { "pull-coord2-k", "100" } } } } +}; + +//! Helper type +using MdpField = MdpFieldValues::value_type; + +/*! \brief Test fixture base for simple mdrun systems + * + * This test ensures mdrun can run a simulation, reaching + * reproducible energies. + * + * The choices for tolerance are arbitrary but sufficient. */ +class PullIntegrationTest : + public MdrunTestFixture, + public ::testing::WithParamInterface> +{ +}; + +//! Adds integrator and nonbonded parameter setup +void addBasicMdpValues(MdpFieldValues* mdpFieldValues) +{ + (*mdpFieldValues)["nsteps"] = "20"; + (*mdpFieldValues)["nstcomm"] = "10"; + (*mdpFieldValues)["nstlist"] = "10"; + (*mdpFieldValues)["nstcalcenergy"] = "5"; + (*mdpFieldValues)["nstenergy"] = "5"; + (*mdpFieldValues)["coulombtype"] = "Reaction-field"; + (*mdpFieldValues)["vdwtype"] = "Cut-off"; +} + +TEST_P(PullIntegrationTest, WithinTolerances) +{ + auto params = GetParam(); + auto simulationName = std::get<0>(params); + auto pullSetup = std::get<1>(params); + SCOPED_TRACE(formatString("Comparing simple mdrun for '%s'", simulationName.c_str())); + + // TODO At some point we should also test PME-only ranks. + int numRanksAvailable = getNumberOfTestMpiRanks(); + if (!isNumberOfPpRanksSupported(simulationName, numRanksAvailable)) + { + fprintf(stdout, + "Test system '%s' cannot run with %d ranks.\n" + "The supported numbers are: %s\n", + simulationName.c_str(), + numRanksAvailable, + reportNumbersOfPpRanksSupported(simulationName).c_str()); + return; + } + auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(), "md", "no", "no"); + addBasicMdpValues(&mdpFieldValues); + + // Add the pull parameters + mdpFieldValues["pull"] = "yes"; + const auto& mdpPullParams = c_mdpPullParams.at(pullSetup); + for (const auto& param : mdpPullParams) + { + mdpFieldValues[param.first] = param.second; + } + + // Prepare the .tpr file + { + CommandLine caller; + runner_.useTopGroAndNdxFromDatabase(simulationName); + runner_.useNdxFromDatabase(simulationName + "_pull"); + runner_.useStringAsMdpFile(prepareMdpFileContents(mdpFieldValues)); + EXPECT_EQ(0, runner_.callGrompp(caller)); + } + // Do mdrun + { + CommandLine mdrunCaller; + ASSERT_EQ(0, runner_.callMdrun(mdrunCaller)); + EnergyTermsToCompare energyTermsToCompare{ { + { interaction_function[F_COM_PULL].longname, energyToleranceForSystem_g.at(simulationName) }, + { interaction_function[F_EPOT].longname, energyToleranceForSystem_g.at(simulationName) }, + { interaction_function[F_EKIN].longname, energyToleranceForSystem_g.at(simulationName) }, + { interaction_function[F_PRES].longname, pressureToleranceForSystem_g.at(simulationName) }, + } }; + TestReferenceData refData; + auto checker = refData.rootChecker() + .checkCompound("Simulation", simulationName) + .checkCompound("PullSetup", pullSetup); + checkEnergiesAgainstReferenceData(runner_.edrFileName_, energyTermsToCompare, &checker); + } +} + +INSTANTIATE_TEST_CASE_P(PullTest, + PullIntegrationTest, + ::testing::Combine(::testing::Values("spc216"), + ::testing::Values("umbrella-3D", + "umbrella-2D", + "constraint-flatbottom"))); + +} // namespace +} // namespace test +} // namespace gmx diff --git a/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml new file mode 100644 index 0000000000..1758f5ac47 --- /dev/null +++ b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml @@ -0,0 +1,36 @@ + + + + + + + 7047.8843 + 6813.9585 + 6432.3613 + 5985.5601 + 5571.9185 + + + 1627.3685 + 1620.8447 + 1637.7889 + 1665.6293 + 1688.8979 + + + -7927.1426 + -7920.6416 + -7937.6411 + -7965.5195 + -7988.6768 + + + 0.031361848 + 0.039091855 + 0.047064677 + 0.055442076 + 0.064478263 + + + + diff --git a/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml new file mode 100644 index 0000000000..fab41f144a --- /dev/null +++ b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml @@ -0,0 +1,36 @@ + + + + + + + 7049.2031 + 6815.1157 + 6433.2632 + 5986.5176 + 5572.6538 + + + 1627.3667 + 1620.8271 + 1637.7637 + 1665.6067 + 1688.8857 + + + -7926.6826 + -7920.1704 + -7937.1602 + -7965.0396 + -7988.1987 + + + 0.49112874 + 0.5159598 + 0.53794813 + 0.55593359 + 0.56885451 + + + + diff --git a/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml new file mode 100644 index 0000000000..b6809bd83b --- /dev/null +++ b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml @@ -0,0 +1,36 @@ + + + + + + + 6961.0444 + 6714.8164 + 6345.8267 + 5948.0703 + 5588.2402 + + + 1626.4885 + 1629.6486 + 1656.0322 + 1692.8835 + 1722.447 + + + -7891.5601 + -7894.7871 + -7921.2197 + -7958.1206 + -7987.5889 + + + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/src/testutils/simulationdatabase/spc216.ndx b/src/testutils/simulationdatabase/spc216.ndx index 9e16ffcdef..4e2371feb1 100644 --- a/src/testutils/simulationdatabase/spc216.ndx +++ b/src/testutils/simulationdatabase/spc216.ndx @@ -1,45 +1 @@ -[ System ] - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 - 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 - 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 - 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 - 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 - 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 - 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 - 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 - 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 - 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 - 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 - 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 - 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 - 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 - 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 - 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 - 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 - 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 - 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 - 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 - 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 - 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 - 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 - 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 - 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 - 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 - 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 - 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 - 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 - 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 - 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 - 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 - 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 - 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 - 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 - 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 - 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 - 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 - 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 - 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 - 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 - 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 - 646 647 648 +spc216_pull \ No newline at end of file diff --git a/src/testutils/simulationdatabase/spc216_pull.ndx b/src/testutils/simulationdatabase/spc216_pull.ndx new file mode 100644 index 0000000000..3e10435fbc --- /dev/null +++ b/src/testutils/simulationdatabase/spc216_pull.ndx @@ -0,0 +1,51 @@ +[ System ] + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 + 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 + 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 + 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 + 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 + 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 + 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 + 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 + 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 + 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 + 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 + 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 + 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 + 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 + 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 + 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 + 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 + 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 + 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 + 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 + 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 + 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 + 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 + 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 + 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 + 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 + 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 + 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 + 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 + 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 + 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 + 646 647 648 +[ r_1 ] + 1 2 3 +[ r_2 ] + 4 5 6 +[ r_3 ] + 7 8 9 -- 2.22.0