@@ -1284,9 +1284,11 @@ def build_scheduler(self, rxn, species_list, name):
12841284 testing = True )
12851285
12861286 def test_bimolecular_creates_copies (self ):
1287- """Test that a reaction with wells on a different grain than the reaction gets relabeled copies"""
1288- r = [ARCSpecies (label = 'CH4' , smiles = 'C' ), ARCSpecies (label = 'OH' , smiles = '[OH]' )]
1289- p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' ), ARCSpecies (label = 'H2O' , smiles = 'O' )]
1287+ """Test that with thermo_at_own_level=True, wells on a different grain get relabeled copies"""
1288+ r = [ARCSpecies (label = 'CH4' , smiles = 'C' , thermo_at_own_level = True ),
1289+ ARCSpecies (label = 'OH' , smiles = '[OH]' , thermo_at_own_level = True )]
1290+ p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' , thermo_at_own_level = True ),
1291+ ARCSpecies (label = 'H2O' , smiles = 'O' , thermo_at_own_level = True )]
12901292 rxn = ARCReaction (label = 'CH4 + OH <=> CH3 + H2O' , r_species = r , p_species = p )
12911293 sched = self .build_scheduler (rxn , r + p , 'adaptive_bimol' )
12921294
@@ -1312,19 +1314,59 @@ def test_bimolecular_creates_copies(self):
13121314 self .assertIsNone (original .adaptive_lot_n_heavy )
13131315 self .assertTrue (original .compute_thermo )
13141316
1315- def test_thermo_at_own_level_false_no_copy (self ):
1316- """Test that with thermo_at_own_level=False the species itself takes the reaction-wide level, with no copy"""
1317- r = [ARCSpecies (label = 'CH4' , smiles = 'C' , thermo_at_own_level = False ),
1318- ARCSpecies (label = 'OH' , smiles = '[OH]' , thermo_at_own_level = False )]
1319- p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' , thermo_at_own_level = False ),
1320- ARCSpecies (label = 'H2O' , smiles = 'O' , thermo_at_own_level = False )]
1317+ def test_thermo_at_own_level_default_no_copy (self ):
1318+ """Test that by default (thermo_at_own_level=False) the species itself takes the reaction-wide level, no copy"""
1319+ r = [ARCSpecies (label = 'CH4' , smiles = 'C' ), ARCSpecies (label = 'OH' , smiles = '[OH]' )]
1320+ p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' ), ARCSpecies (label = 'H2O' , smiles = 'O' )]
13211321 rxn = ARCReaction (label = 'CH4 + OH <=> CH3 + H2O' , r_species = r , p_species = p )
1322- sched = self .build_scheduler (rxn , r + p , 'adaptive_noflag ' )
1322+ sched = self .build_scheduler (rxn , r + p , 'adaptive_default ' )
13231323
13241324 self .assertEqual (rxn .label , 'CH4 + OH <=> CH3 + H2O' )
13251325 self .assertFalse (any ('_TS' in label for label in sched .species_dict ))
13261326 self .assertEqual (sched .species_dict ['CH4' ].adaptive_lot_n_heavy , 2 )
13271327
1328+ def test_shared_species_across_grains_gets_copy (self ):
1329+ """Test that a no-copy species shared by reactions on different grains gets a copy for the second reaction"""
1330+ oh = ARCSpecies (label = 'OH' , smiles = '[OH]' )
1331+ h2o = ARCSpecies (label = 'H2O' , smiles = 'O' )
1332+ rxn1 = ARCReaction (label = 'CH4 + OH <=> CH3 + H2O' ,
1333+ r_species = [ARCSpecies (label = 'CH4' , smiles = 'C' ), oh ],
1334+ p_species = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' ), h2o ])
1335+ rxn2 = ARCReaction (label = 'C3H8 + OH <=> nC3H7 + H2O' ,
1336+ r_species = [ARCSpecies (label = 'C3H8' , smiles = 'CCC' ), oh ],
1337+ p_species = [ARCSpecies (label = 'nC3H7' , smiles = '[CH2]CC' ), h2o ])
1338+ project_directory = os .path .join (ARC_PATH , 'Projects' , 'adaptive_shared_delete' )
1339+ self .addCleanup (shutil .rmtree , project_directory , ignore_errors = True )
1340+ species_list = rxn1 .r_species + rxn1 .p_species + [rxn2 .r_species [0 ], rxn2 .p_species [0 ]]
1341+ sched = Scheduler (project = 'adaptive_shared' ,
1342+ ess_settings = self .ess_settings ,
1343+ species_list = species_list ,
1344+ rxn_list = [rxn1 , rxn2 ],
1345+ opt_level = Level (repr = 'b3lyp/6-31g(d,p)' ),
1346+ sp_level = Level (repr = 'b3lyp/6-311+g(d,p)' ),
1347+ freq_level = Level (repr = 'b3lyp/6-31g(d,p)' ),
1348+ adaptive_levels = {(1 , 1 ): {('sp' ,): Level (repr = 'ccsd(t)-f12/cc-pvtz-f12' )},
1349+ (2 , 3 ): {('sp' ,): Level (repr = 'dlpno-ccsd(t)/def2-tzvp' )},
1350+ (4 , 'inf' ): {('sp' ,): Level (repr = 'b3lyp/6-311+g(d,p)' )}},
1351+ project_directory = project_directory ,
1352+ job_types = initialize_job_types (),
1353+ testing = True )
1354+
1355+ # rxn1 (2 heavy atoms) set the shared wells' overrides; rxn1 itself is unchanged.
1356+ self .assertEqual (rxn1 .label , 'CH4 + OH <=> CH3 + H2O' )
1357+ self .assertEqual (sched .species_dict ['OH' ].adaptive_lot_n_heavy , 2 )
1358+ # rxn2 (4 heavy atoms) lands on a different grain, so the shared wells got dedicated copies.
1359+ self .assertEqual (set (rxn2 .reactants ), {'C3H8' , 'OH_TS1' })
1360+ self .assertEqual (set (rxn2 .products ), {'nC3H7' , 'H2O_TS1' })
1361+ self .assertEqual (rxn2 .label ,
1362+ rxn2 .arrow .join ([rxn2 .plus .join (rxn2 .reactants ), rxn2 .plus .join (rxn2 .products )]))
1363+ for copy_label in ['OH_TS1' , 'H2O_TS1' ]:
1364+ self .assertEqual (sched .species_dict [copy_label ].adaptive_lot_n_heavy , 4 )
1365+ self .assertFalse (sched .species_dict [copy_label ].compute_thermo )
1366+ # Unshared rxn2 wells just took the rxn2 override, no copies.
1367+ self .assertEqual (sched .species_dict ['C3H8' ].adaptive_lot_n_heavy , 4 )
1368+ self .assertEqual (sched .species_dict ['nC3H7' ].adaptive_lot_n_heavy , 4 )
1369+
13281370 def test_unimolecular_no_copy (self ):
13291371 """Test that a reaction whose well shares the reaction's grain gets no copies"""
13301372 r = [ARCSpecies (label = 'nC3H7' , smiles = '[CH2]CC' )]
0 commit comments