@@ -198,6 +198,61 @@ def test_finite_difference_jacobian(self):
198198            if  name  in  constant :
199199                assert  all (J [i , species_start :] ==  0 ), (i , name )
200200
201+     def  test_network_finite_difference_jacobian (self ):
202+         self .make_reactors (T1 = 900 , P1 = 101325 , X1 = "H2:0.4, O2:0.4, N2:0.2" )
203+         k1H2  =  self .gas1 .species_index ("H2" )
204+         k2H2  =  self .gas1 .species_index ("H2" )
205+         while  self .r1 .thermo .X [k1H2 ] >  0.3  or  self .r2 .thermo .X [k2H2 ] >  0.3 :
206+             self .net .step ()
207+ 
208+         J  =  self .net .finite_difference_jacobian 
209+         assert  J .shape  ==  (self .net .n_vars , self .net .n_vars )
210+ 
211+         # state variables that should be constant, depending on reactor type 
212+         constant  =  {"mass" , "volume" , "int_energy" , "enthalpy" , "pressure" }
213+         variable  =  {"temperature" }
214+         for  i  in  range (3 ):
215+             name  =  self .r1 .component_name (i )
216+             if  name  in  constant :
217+                 assert  all (J [i ,:] ==  0 ), (i , name )
218+             elif  name  in  variable :
219+                 assert  any (J [i ,:] !=  0 )
220+             # check in second reactor 
221+             name  =  self .r2 .component_name (i )
222+             if  name  in  constant :
223+                 assert  all (J [i  +  self .r1 .n_vars ,:] ==  0 ), (i , name )
224+             elif  name  in  variable :
225+                 assert  any (J [i  +  self .r1 .n_vars ,:] !=  0 )
226+ 
227+         # Disabling energy equation should zero these terms 
228+         self .r1 .energy_enabled  =  False 
229+         self .r2 .energy_enabled  =  False 
230+         J  =  self .net .finite_difference_jacobian 
231+         for  i  in  range (3 ):
232+             name  =  self .r1 .component_name (i )
233+             if  name  ==  "temperature" :
234+                 assert  all (J [i ,:] ==  0 )
235+             name  =  self .r2 .component_name (i )
236+             if  name  ==  "temperature" :
237+                 assert  all (J [i  +  self .r1 .n_vars ,:] ==  0 )
238+ 
239+         # Disabling species equations should zero these terms 
240+         self .r1 .energy_enabled  =  True 
241+         self .r1 .chemistry_enabled  =  False 
242+         self .r2 .energy_enabled  =  True 
243+         self .r2 .chemistry_enabled  =  False 
244+         J  =  self .net .finite_difference_jacobian 
245+         constant  =  set (self .gas1 .species_names  +  self .gas2 .species_names )
246+         r1_species_start  =  self .r1 .component_index (self .gas1 .species_name (0 ))
247+         r2_species_start  =  self .r2 .component_index (self .gas2 .species_name (0 ))
248+         for  i  in  range (self .r1 .n_vars ):
249+             name  =  self .r1 .component_name (i )
250+             if  name  in  constant :
251+                 assert  all (J [i , r1_species_start :] ==  0 ), (i , name )
252+             name  =  self .r2 .component_name (i )
253+             if  name  in  constant :
254+                 assert  all (J [i  +  self .r1 .n_vars , (r2_species_start  +  self .r1 .n_vars ):] ==  0 ), (i , name )
255+ 
201256    def  test_timestepping (self ):
202257        self .make_reactors ()
203258
@@ -1378,14 +1433,26 @@ def create_reactors(self, **kwargs):
13781433        self .precon  =  ct .AdaptivePreconditioner ()
13791434        self .net2 .preconditioner  =  self .precon 
13801435        self .net2 .derivative_settings  =  {"skip-third-bodies" :True , "skip-falloff" :True ,
1381-             "skip-coverage-dependence" :True }
1436+             "skip-coverage-dependence" :True ,  "skip-flow-devices" :  True }
13821437
13831438    def  test_get_solver_type (self ):
13841439        self .create_reactors ()
13851440        assert  self .precon .side  ==  "right" 
13861441        self .net2 .initialize ()
13871442        self .assertEqual (self .net2 .linear_solver_type , "GMRES" )
13881443
1444+     def  test_mass_flow_jacobian (self ):
1445+         self .create_reactors (add_mdot = True )
1446+         # reset derivative settings 
1447+         self .net2 .derivative_settings  =  {"skip-third-bodies" :True , "skip-falloff" :True ,
1448+             "skip-coverage-dependence" :True , "skip-flow-devices" : False }
1449+ 
1450+         with  pytest .raises (NotImplementedError , match = "MassFlowController::buildReactorJacobian" ):
1451+             J  =  self .net2 .jacobian 
1452+ 
1453+         with  pytest .raises (NotImplementedError , match = "MassFlowController::buildReactorJacobian" ):
1454+             J  =  self .r2 .jacobian 
1455+ 
13891456    def  test_heat_transfer_network (self ):
13901457        # create first reactor 
13911458        gas1  =  ct .Solution ("h2o2.yaml" , "ohmech" )
0 commit comments