Skip to content

Commit 302b487

Browse files
Fix AD directions in tests
For the tests, some units need to initialize the AD directions with zero. This is not done sometimes when multiple tests are run: The number of AD directions used might still be set from the previous test, leading to uninitialized value errors. Thus, we set the AD directions before configuring the units. Co-authored-by: Jan Breuer <[email protected]>
1 parent a0a53d0 commit 302b487

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

test/ColumnTests.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,8 @@ namespace column
832832

833833
void testJacobianAD(cadet::JsonParameterProvider& jpp, const double absTolFDpattern)
834834
{
835+
cadet::ad::setDirections(cadet::ad::getMaxDirections()); // AD directions needed in createAndConfigureUnit but requiredADdirs not know before configureModelDiscretization (which is called in configureUnit)
836+
835837
cadet::IModelBuilder* const mb = cadet::createModelBuilder();
836838
REQUIRE(nullptr != mb);
837839

@@ -889,6 +891,9 @@ namespace column
889891

890892
void testJacobianForwardBackward(cadet::JsonParameterProvider& jpp, const double absTolFDpattern)
891893
{
894+
// Enable AD
895+
cadet::ad::setDirections(cadet::ad::getMaxDirections()); // AD directions needed in createAndConfigureUnit but requiredADdirs not know before configureModelDiscretization (which is called in configureUnit)
896+
892897
cadet::IModelBuilder* const mb = cadet::createModelBuilder();
893898
REQUIRE(nullptr != mb);
894899

@@ -897,9 +902,6 @@ namespace column
897902

898903
cadet::IUnitOperation* const unitAna = unitoperation::createAndConfigureUnit(jpp, *mb);
899904
cadet::IUnitOperation* const unitAD = unitoperation::createAndConfigureUnit(jpp, *mb);
900-
901-
// Enable AD
902-
cadet::ad::setDirections(cadet::ad::getMaxDirections());
903905
unitAD->useAnalyticJacobian(false);
904906

905907
cadet::active* adRes = new cadet::active[unitAD->numDofs()];
@@ -1223,10 +1225,10 @@ namespace column
12231225
{
12241226
if (hasBinding)
12251227
cadet::test::setBindingMode(jpp, isKinetic);
1228+
cadet::ad::setDirections(cadet::ad::getMaxDirections()); // AD directions already needed in createAndConfigureUnit
12261229
cadet::IUnitOperation* const unit = createAndConfigureUnit(*mb, jpp);
12271230

12281231
// Enable AD
1229-
cadet::ad::setDirections(cadet::ad::getMaxDirections());
12301232
cadet::active* adRes = new cadet::active[unit->numDofs()];
12311233
const AdJacobianParams adParams{adRes, nullptr, 0};
12321234
unit->prepareADvectors(adParams);
@@ -1495,6 +1497,8 @@ namespace column
14951497
// Use some test case parameters
14961498
cadet::JsonParameterProvider jpp = createColumnWithTwoCompLinearBinding(uoType, spatialMethod);
14971499
cadet::test::setBindingMode(jpp, isKinetic);
1500+
if (adEnabled)
1501+
cadet::ad::setDirections(cadet::ad::getMaxDirections());
14981502
cadet::IUnitOperation* const unit = createAndConfigureUnit(*mb, jpp);
14991503

15001504
// Fill state vector with given initial values
@@ -1530,6 +1534,8 @@ namespace column
15301534
// Use some test case parameters
15311535
cadet::JsonParameterProvider jpp = createColumnWithSMA(uoType, spatialMethod);
15321536
cadet::test::setBindingMode(jpp, isKinetic);
1537+
if (adEnabled)
1538+
cadet::ad::setDirections(cadet::ad::getMaxDirections());
15331539
cadet::IUnitOperation* const unit = createAndConfigureUnit(*mb, jpp);
15341540

15351541
// Fill state vector with given initial values
@@ -1564,6 +1570,8 @@ namespace column
15641570
// Use some test case parameters
15651571
cadet::JsonParameterProvider jpp = linearBinding ? createColumnWithTwoCompLinearBinding(uoType, spatialMethod) : createColumnWithSMA(uoType, spatialMethod);
15661572
cadet::test::setBindingMode(jpp, isKinetic);
1573+
if (adEnabled)
1574+
cadet::ad::setDirections(cadet::ad::getMaxDirections()); // needed in configure() of DG unit operations
15671575
cadet::IUnitOperation* const unit = createAndConfigureUnit(*mb, jpp);
15681576

15691577
unit->setSensitiveParameter(cadet::makeParamId("INIT_C", 0, 0, cadet::ParTypeIndep, cadet::BoundStateIndep, cadet::ReactionIndep, cadet::SectionIndep), 0, 1.0);
@@ -1596,6 +1604,8 @@ namespace column
15961604
{
15971605
// Use some test case parameters
15981606
cadet::JsonParameterProvider jpp = createColumnWithSMA(uoType, spatialMethod);
1607+
if (adEnabled)
1608+
cadet::ad::setDirections(cadet::ad::getMaxDirections());
15991609
cadet::IUnitOperation* const unit = createAndConfigureUnit(*mb, jpp);
16001610

16011611
unitoperation::testInletDofJacobian(unit, adEnabled);

test/ModelSystem.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ namespace
582582

583583
TEST_CASE("ModelSystem Jacobian AD vs analytic", "[ModelSystem],[Jacobian],[AD]")
584584
{
585+
cadet::ad::setDirections(cadet::ad::getMaxDirections());
585586
cadet::IModelBuilder* const mb = cadet::createModelBuilder();
586587
REQUIRE(nullptr != mb);
587588

@@ -625,7 +626,6 @@ TEST_CASE("ModelSystem Jacobian AD vs analytic", "[ModelSystem],[Jacobian],[AD]"
625626
delete[] secContArray;
626627

627628
// Enable AD
628-
cadet::ad::setDirections(cadet::ad::getMaxDirections());
629629
for (unsigned int i = 0; i < sysAD->numModels(); ++i)
630630
sysAD->getUnitOperationModel(i)->useAnalyticJacobian(false);
631631

@@ -759,6 +759,8 @@ TEST_CASE("ModelSystem sensitivity Jacobians", "[ModelSystem],[Sensitivity]")
759759
const double absTol = 5e-8;
760760
const double relTol = 5e-6; // std::numeric_limits<float>::epsilon() * 100.0;
761761

762+
cadet::ad::setDirections(cadet::ad::getMaxDirections());
763+
762764
cadet::IModelBuilder* const mb = cadet::createModelBuilder();
763765
REQUIRE(nullptr != mb);
764766

@@ -796,7 +798,6 @@ TEST_CASE("ModelSystem sensitivity Jacobians", "[ModelSystem],[Sensitivity]")
796798
delete[] secContArray;
797799

798800
// Enable AD
799-
cadet::ad::setDirections(cadet::ad::getMaxDirections());
800801
cadet::active* adRes = new cadet::active[sys->numDofs()];
801802
sys->prepareADvectors(cadet::AdJacobianParams{adRes, nullptr, 0});
802803

test/UnitOperationTests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@ namespace unitoperation
6464

6565
void testJacobianAD(cadet::JsonParameterProvider& jpp, const double absTolFDpattern)
6666
{
67+
// Enable AD
68+
cadet::ad::setDirections(cadet::ad::getMaxDirections());
69+
6770
cadet::IModelBuilder* const mb = cadet::createModelBuilder();
6871
REQUIRE(nullptr != mb);
6972

7073
cadet::IUnitOperation* const unitAna = createAndConfigureUnit(jpp, *mb);
7174
cadet::IUnitOperation* const unitAD = createAndConfigureUnit(jpp, *mb);
72-
73-
// Enable AD
74-
cadet::ad::setDirections(cadet::ad::getMaxDirections());
7575
unitAD->useAnalyticJacobian(false);
7676

7777
cadet::active* adRes = new cadet::active[unitAD->numDofs()];

0 commit comments

Comments
 (0)