@@ -1317,9 +1317,11 @@ def build_scheduler(self, rxn, species_list, name):
13171317 testing = True )
13181318
13191319 def test_bimolecular_creates_copies (self ):
1320- """Test that a reaction with wells on a different grain than the reaction gets relabeled copies"""
1321- r = [ARCSpecies (label = 'CH4' , smiles = 'C' ), ARCSpecies (label = 'OH' , smiles = '[OH]' )]
1322- p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' ), ARCSpecies (label = 'H2O' , smiles = 'O' )]
1320+ """Test that with thermo_at_own_level=True, wells on a different grain get relabeled copies"""
1321+ r = [ARCSpecies (label = 'CH4' , smiles = 'C' , thermo_at_own_level = True ),
1322+ ARCSpecies (label = 'OH' , smiles = '[OH]' , thermo_at_own_level = True )]
1323+ p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' , thermo_at_own_level = True ),
1324+ ARCSpecies (label = 'H2O' , smiles = 'O' , thermo_at_own_level = True )]
13231325 rxn = ARCReaction (label = 'CH4 + OH <=> CH3 + H2O' , r_species = r , p_species = p )
13241326 sched = self .build_scheduler (rxn , r + p , 'adaptive_bimol' )
13251327
@@ -1347,19 +1349,59 @@ def test_bimolecular_creates_copies(self):
13471349 self .assertIsNone (original .adaptive_lot_n_heavy )
13481350 self .assertTrue (original .compute_thermo )
13491351
1350- def test_thermo_at_own_level_false_no_copy (self ):
1351- """Test that with thermo_at_own_level=False the species itself takes the reaction-wide level, with no copy"""
1352- r = [ARCSpecies (label = 'CH4' , smiles = 'C' , thermo_at_own_level = False ),
1353- ARCSpecies (label = 'OH' , smiles = '[OH]' , thermo_at_own_level = False )]
1354- p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' , thermo_at_own_level = False ),
1355- ARCSpecies (label = 'H2O' , smiles = 'O' , thermo_at_own_level = False )]
1352+ def test_thermo_at_own_level_default_no_copy (self ):
1353+ """Test that by default (thermo_at_own_level=False) the species itself takes the reaction-wide level, no copy"""
1354+ r = [ARCSpecies (label = 'CH4' , smiles = 'C' ), ARCSpecies (label = 'OH' , smiles = '[OH]' )]
1355+ p = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' ), ARCSpecies (label = 'H2O' , smiles = 'O' )]
13561356 rxn = ARCReaction (label = 'CH4 + OH <=> CH3 + H2O' , r_species = r , p_species = p )
1357- sched = self .build_scheduler (rxn , r + p , 'adaptive_noflag ' )
1357+ sched = self .build_scheduler (rxn , r + p , 'adaptive_default ' )
13581358
13591359 self .assertEqual (rxn .label , 'CH4 + OH <=> CH3 + H2O' )
13601360 self .assertFalse (any ('_TS' in label for label in sched .species_dict ))
13611361 self .assertEqual (sched .species_dict ['CH4' ].adaptive_lot_n_heavy , 2 )
13621362
1363+ def test_shared_species_across_grains_gets_copy (self ):
1364+ """Test that a no-copy species shared by reactions on different grains gets a copy for the second reaction"""
1365+ oh = ARCSpecies (label = 'OH' , smiles = '[OH]' )
1366+ h2o = ARCSpecies (label = 'H2O' , smiles = 'O' )
1367+ rxn1 = ARCReaction (label = 'CH4 + OH <=> CH3 + H2O' ,
1368+ r_species = [ARCSpecies (label = 'CH4' , smiles = 'C' ), oh ],
1369+ p_species = [ARCSpecies (label = 'CH3' , smiles = '[CH3]' ), h2o ])
1370+ rxn2 = ARCReaction (label = 'C3H8 + OH <=> nC3H7 + H2O' ,
1371+ r_species = [ARCSpecies (label = 'C3H8' , smiles = 'CCC' ), oh ],
1372+ p_species = [ARCSpecies (label = 'nC3H7' , smiles = '[CH2]CC' ), h2o ])
1373+ project_directory = os .path .join (ARC_PATH , 'Projects' , 'adaptive_shared_delete' )
1374+ self .addCleanup (shutil .rmtree , project_directory , ignore_errors = True )
1375+ species_list = rxn1 .r_species + rxn1 .p_species + [rxn2 .r_species [0 ], rxn2 .p_species [0 ]]
1376+ sched = Scheduler (project = 'adaptive_shared' ,
1377+ ess_settings = self .ess_settings ,
1378+ species_list = species_list ,
1379+ rxn_list = [rxn1 , rxn2 ],
1380+ opt_level = Level (repr = 'b3lyp/6-31g(d,p)' ),
1381+ sp_level = Level (repr = 'b3lyp/6-311+g(d,p)' ),
1382+ freq_level = Level (repr = 'b3lyp/6-31g(d,p)' ),
1383+ adaptive_levels = {(1 , 1 ): {('sp' ,): Level (repr = 'ccsd(t)-f12/cc-pvtz-f12' )},
1384+ (2 , 3 ): {('sp' ,): Level (repr = 'dlpno-ccsd(t)/def2-tzvp' )},
1385+ (4 , 'inf' ): {('sp' ,): Level (repr = 'b3lyp/6-311+g(d,p)' )}},
1386+ project_directory = project_directory ,
1387+ job_types = initialize_job_types (),
1388+ testing = True )
1389+
1390+ # rxn1 (2 heavy atoms) set the shared wells' overrides; rxn1 itself is unchanged.
1391+ self .assertEqual (rxn1 .label , 'CH4 + OH <=> CH3 + H2O' )
1392+ self .assertEqual (sched .species_dict ['OH' ].adaptive_lot_n_heavy , 2 )
1393+ # rxn2 (4 heavy atoms) lands on a different grain, so the shared wells got dedicated copies.
1394+ self .assertEqual (set (rxn2 .reactants ), {'C3H8' , 'OH_TS1' })
1395+ self .assertEqual (set (rxn2 .products ), {'nC3H7' , 'H2O_TS1' })
1396+ self .assertEqual (rxn2 .label ,
1397+ rxn2 .arrow .join ([rxn2 .plus .join (rxn2 .reactants ), rxn2 .plus .join (rxn2 .products )]))
1398+ for copy_label in ['OH_TS1' , 'H2O_TS1' ]:
1399+ self .assertEqual (sched .species_dict [copy_label ].adaptive_lot_n_heavy , 4 )
1400+ self .assertFalse (sched .species_dict [copy_label ].compute_thermo )
1401+ # Unshared rxn2 wells just took the rxn2 override, no copies.
1402+ self .assertEqual (sched .species_dict ['C3H8' ].adaptive_lot_n_heavy , 4 )
1403+ self .assertEqual (sched .species_dict ['nC3H7' ].adaptive_lot_n_heavy , 4 )
1404+
13631405 def test_unimolecular_no_copy (self ):
13641406 """Test that a reaction whose well shares the reaction's grain gets no copies"""
13651407 r = [ARCSpecies (label = 'nC3H7' , smiles = '[CH2]CC' )]
0 commit comments