CAMP 1.0.0
Chemistry Across Multiple Phases
rxn_factory.F90
Go to the documentation of this file.
1! Copyright (C) 2021 Barcelona Supercomputing Center and University of
2! Illinois at Urbana-Champaign
3! SPDX-License-Identifier: MIT
4
5!> \file
6!> The camp_rxn_factory module.
7
8!> \page camp_rxn_add CAMP: Adding a Reaction Type
9!!
10!! \b Note: these instructions are out-of-date. TODO update
11!!
12!! Adding a \ref camp_rxn "reaction" to the \ref index "camp-chem"
13!! module can be done in the following steps:
14!!
15!! ## Step 1. Create a new reaction module ##
16!! The module should be placed in the \c /src/rxns folder and extent the
17!! abstract \c camp_rxn_data::rxn_data_t type, overriding all deferred
18!! functions, and providing a constructor that returns a pointer to a newly
19!! allocated instance of the new type:
20!!
21!! \code{.f90}
22!! module rxn_foo
23!!
24!! use ...
25!!
26!! implicit none
27!! private
28!!
29!! public :: rxn_foo_t
30!!
31!! type, extends(rxn_data_t) :: rxn_foo_t
32!! contains
33!! ... (all deferred functions) ...
34!! end type rxn_foo_t
35!!
36!! ! Constructor
37!! interface rxn_foo_t
38!! procedure :: constructor
39!! end interface rxn_foo_t
40!!
41!! contains
42!!
43!! function constructor() result(new_obj)
44!! type(rxn_foo_t), pointer :: new_obj
45!! allocate(new_obj)
46!! end function constructor
47!!
48!! ...
49!!
50!! end module camp_rxn_foo
51!! \endcode
52!!
53!! ## Step 2. Add the reaction to the \c camp_rxn_factory module ##
54!!
55!! \code{.f90}
56!! module camp_rxn_factory
57!!
58!! ...
59!!
60!! ! Use all reaction modules
61!! ...
62!! use camp_rxn_foo
63!!
64!! ...
65!!
66!! !> Identifiers for reaction types - used by binary packing/unpacking
67!! !! functions
68!! ...
69!! integer(kind=i_kind), parameter :: RXN_FOO = 32
70!!
71!! ...
72!!
73!! !> Create a new chemical reaction by type name
74!! function create(this, type_name) result (new_obj)
75!! ...
76!! select case (type_name)
77!! ...
78!! case ("FOO")
79!! new_obj => rxn_foo_t()
80!! ...
81!! end function create
82!!
83!! ...
84!!
85!! !> Pack the given value to the buffer, advancing position
86!! subroutine bin_pack(this, rxn, buffer, pos)
87!! ...
88!! select type (rxn)
89!! ...
90!! type is (rxn_foo_t)
91!! rxn_type = RXN_FOO
92!! ...
93!! end subroutine bin_pack
94!!
95!! ...
96!!
97!! !> Unpack the given value to the buffer, advancing position
98!! function bin_unpack(this, buffer, pos) result (rxn)
99!! ...
100!! select case (rxn_type)
101!! ...
102!! case (RXN_FOO)
103!! rxn => rxn_foo_t()
104!! ...
105!! end function bin_unpack
106!!
107!! ...
108!!
109!! end module camp_rxn_factory
110!! \endcode
111!!
112!! # Step 4. Add the new module to the CMakeList file in the root directory. ##
113!!
114!! \code{.unparsed}
115!! ...
116!!
117!! # partmc library
118!!
119!! set(REACTIONS
120!! ...
121!! src/rxns/camp_foo.F90
122!! )
123!!
124!! ...
125!! \endcode
126!!
127!! ## Step 5. Add unit tests for the new \c rxn_foo_t type ##
128!!
129!! Unit testing should cover, at minimum, the initialization, time derivative
130!! and Jacbian matrix functions, and in general 80% code coverage is
131!! recommended. Some examples can be found in the \c /src/test folder.
132!!
133!! ## Step 6. Update documentation ##
134!!
135!! TODO finish...
136!!
137!! ## Usage ##
138!! The new \ref camp_rxn "reaction type" is now ready to use. To include a
139!! reaction of this type in a \ref camp_mechanism "mechanism", add a \ref
140!! input_format_rxn "reaction object" to a new or existing \ref
141!! input_format_camp_config "camp-chem configuration file" as part of a
142!! \ref input_format_mechanism "mechanism object". The reaction should have a
143!! \b type corresponding to the newly created reaction type, along with any
144!! required parameters:
145!!
146!! \code{.json}
147!! { "camp-data" : [
148!! {
149!! "name" : "my mechanism",
150!! "type" : "MECHANISM",
151!! "reactions" : [
152!! {
153!! "type" : "FOO",
154!! ...
155!! },
156!! ...
157!! ]
158!! },
159!! ...
160!! ]}
161!! \endcode
162!!
163
164!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
165
166!TODO: Add a function to reorder data reaction types on rxn_data (arrhenius first, troe second...)
167!This will improve data acces and performance
168
169!> The abstract rxn_factory_t structure and associated subroutines.
171
172#ifdef CAMP_USE_JSON
173 use json_module
174#endif
175#ifdef CAMP_USE_MPI
176 use mpi
177#endif
178 use camp_constants, only : i_kind, dp
179 use camp_mpi
180 use camp_rxn_data
181 use camp_util, only : die_msg, string_t, assert_msg, &
183
184 ! Use all reaction modules
198 use camp_rxn_troe
202
203 use iso_c_binding
204
205 implicit none
206 private
207
208 public :: rxn_factory_t
209
210 !> Identifiers for reaction types - used by binary packing/unpacking
211 !! functions
212 integer(kind=i_kind), parameter, public :: rxn_arrhenius = 1
213 integer(kind=i_kind), parameter, public :: rxn_troe = 2
214 integer(kind=i_kind), parameter, public :: rxn_cmaq_h2o2 = 3
215 integer(kind=i_kind), parameter, public :: rxn_cmaq_oh_hno3 = 4
216 integer(kind=i_kind), parameter, public :: rxn_photolysis = 5
217 integer(kind=i_kind), parameter, public :: rxn_hl_phase_transfer = 6
218 integer(kind=i_kind), parameter, public :: rxn_aqueous_equilibrium = 7
219 integer(kind=i_kind), parameter, public :: rxn_simpol_phase_transfer = 10
220 integer(kind=i_kind), parameter, public :: rxn_condensed_phase_arrhenius = 11
221 integer(kind=i_kind), parameter, public :: rxn_first_order_loss = 12
222 integer(kind=i_kind), parameter, public :: rxn_emission = 13
223 integer(kind=i_kind), parameter, public :: rxn_wet_deposition = 14
224 integer(kind=i_kind), parameter, public :: rxn_ternary_chemical_activation = 15
225 integer(kind=i_kind), parameter, public :: rxn_wennberg_tunneling = 16
226 integer(kind=i_kind), parameter, public :: rxn_wennberg_no_ro2 = 17
227 integer(kind=i_kind), parameter, public :: rxn_condensed_phase_photolysis = 18
228 integer(kind=i_kind), parameter, public :: rxn_surface = 19
229
230 !> Factory type for chemical reactions
231 !!
232 !! Provides new instances of types extending rxn_data_t by name or
233 !! from input file data
235 contains
236 !> Create a new chemical reaction by type name
237 procedure :: create
238 !> Create a new chemical reaction from input data
239 procedure :: load
240 !> Get the reaction type
241 procedure :: get_type
242 !> Get a new update data object
244 !> Determine the number of bytes required to pack a given reaction
245 procedure :: pack_size
246 !> Pack a given reaction to the buffer, advancing the position
247 procedure :: bin_pack
248 !> Unpack a reaction from the buffer, advancing the position
249 procedure :: bin_unpack
250 end type rxn_factory_t
251
252contains
253
254!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
255
256 !> Create a new chemical reaction by type name
257 function create(this, type_name) result (new_obj)
258
259 !> A chemical reaction
260 class(rxn_data_t), pointer :: new_obj
261 !> Aerosol representation factory
262 class(rxn_factory_t), intent(in) :: this
263 !> Name of the chemical reaction
264 character(len=*), intent(in) :: type_name
265
266 new_obj => null()
267
268 ! Create a new reaction instance based on the type name supplied
269 select case (type_name)
270 case ("ARRHENIUS")
271 new_obj => rxn_arrhenius_t()
272 case ("TROE")
273 new_obj => rxn_troe_t()
274 case ("CMAQ_H2O2")
275 new_obj => rxn_cmaq_h2o2_t()
276 case ("CMAQ_OH_HNO3")
277 new_obj => rxn_cmaq_oh_hno3_t()
278 case ("PHOTOLYSIS")
279 new_obj => rxn_photolysis_t()
280 case ("HL_PHASE_TRANSFER")
281 new_obj => rxn_hl_phase_transfer_t()
282 case ("AQUEOUS_EQUILIBRIUM")
283 new_obj => rxn_aqueous_equilibrium_t()
284 case ("SIMPOL_PHASE_TRANSFER")
285 new_obj => rxn_simpol_phase_transfer_t()
286 case ("CONDENSED_PHASE_ARRHENIUS")
288 case ("CONDENSED_PHASE_PHOTOLYSIS")
290 case ("FIRST_ORDER_LOSS")
291 new_obj => rxn_first_order_loss_t()
292 case ("EMISSION")
293 new_obj => rxn_emission_t()
294 case ("WET_DEPOSITION")
295 new_obj => rxn_wet_deposition_t()
296 case ("TERNARY_CHEMICAL_ACTIVATION")
298 case ("WENNBERG_TUNNELING")
299 new_obj => rxn_wennberg_tunneling_t()
300 case ("WENNBERG_NO_RO2")
301 new_obj => rxn_wennberg_no_ro2_t()
302 case ("SURFACE")
303 new_obj => rxn_surface_t()
304 case default
305 call die_msg(367114278, "Unknown chemical reaction type: " &
306 //type_name)
307 end select
308
309 end function create
310
311!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
312
313 !> Load a reaction from input data
314#ifdef CAMP_USE_JSON
315 function load(this, json, j_obj) result (new_obj)
316
317 !> A chemical reaction
318 class(rxn_data_t), pointer :: new_obj
319 !> Chemical reaction factory
320 class(rxn_factory_t), intent(in) :: this
321 !> JSON core
322 type(json_core), pointer, intent(in) :: json
323 !> JSON object
324 type(json_value), pointer, intent(in) :: j_obj
325
326 character(kind=json_ck, len=:), allocatable :: unicode_type_name
327 character(len=:), allocatable :: type_name
328 logical(kind=json_lk) :: found
329
330 new_obj => null()
331
332 ! Get the reaction type
333 call json%get(j_obj, "type", unicode_type_name, found)
334 call assert_msg(137665576, found, 'Missing chemical reaction type.')
335 type_name = unicode_type_name
336
337 ! Create a new reaction instance of the type specified
338 new_obj => this%create(type_name)
339
340 ! Load reaction parameters from the json object
341 call new_obj%load(json, j_obj)
342
343#else
344 !> Generic warning function when no input file support exists
345 function load(this) result (new_obj)
346
347 !> A chemical reaction
348 class(rxn_data_t), pointer :: new_obj
349 !> Chemical reaction factory
350 class(rxn_factory_t), intent(in) :: this
351
352 new_obj => null()
353
354 call warn_msg(979827016, "No support for input files.")
355#endif
356 end function load
357
358!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
359
360 !> Get the reaction type as a RxnType
361 integer(kind=i_kind) function get_type(this, rxn) result (rxn_type)
362
363 !> Reaction factory
364 class(rxn_factory_t), intent(in) :: this
365 !> Reaction to get type of
366 class(rxn_data_t), intent(in) :: rxn
367
368 select type (rxn)
369 type is (rxn_arrhenius_t)
370 rxn_type = rxn_arrhenius
371 type is (rxn_troe_t)
372 rxn_type = rxn_troe
373 type is (rxn_cmaq_h2o2_t)
374 rxn_type = rxn_cmaq_h2o2
375 type is (rxn_cmaq_oh_hno3_t)
376 rxn_type = rxn_cmaq_oh_hno3
377 type is (rxn_photolysis_t)
378 rxn_type = rxn_photolysis
380 rxn_type = rxn_hl_phase_transfer
382 rxn_type = rxn_aqueous_equilibrium
389 type is (rxn_first_order_loss_t)
390 rxn_type = rxn_first_order_loss
391 type is (rxn_emission_t)
392 rxn_type = rxn_emission
393 type is (rxn_wet_deposition_t)
394 rxn_type = rxn_wet_deposition
398 rxn_type = rxn_wennberg_tunneling
399 type is (rxn_wennberg_no_ro2_t)
400 rxn_type = rxn_wennberg_no_ro2
401 type is (rxn_surface_t)
402 rxn_type = rxn_surface
403 class default
404 call die_msg(343941184, "Unknown reaction type.")
405 end select
406
407 end function get_type
408
409!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
410
411 !> Initialize an update data object
412 subroutine initialize_update_data(this, rxn, update_data)
413
414 !> Reaction factory
415 class(rxn_factory_t), intent(in) :: this
416 !> Reaction to be updated
417 class(rxn_data_t), intent(inout) :: rxn
418 !> Update data object
419 class(rxn_update_data_t), intent(out) :: update_data
420
421 select type (update_data)
423 select type (rxn)
424 type is (rxn_wet_deposition_t)
425 call rxn%update_data_initialize(update_data, rxn_wet_deposition)
426 class default
427 call die_msg(519416239, "Update data <-> rxn mismatch")
428 end select
430 select type (rxn)
431 type is (rxn_emission_t)
432 call rxn%update_data_initialize(update_data, rxn_emission)
433 class default
434 call die_msg(395116041, "Update data <-> rxn mismatch")
435 end select
437 select type (rxn)
438 type is (rxn_first_order_loss_t)
439 call rxn%update_data_initialize(update_data, rxn_first_order_loss)
440 class default
441 call die_msg(172384885, "Update data <-> rxn mismatch")
442 end select
444 select type (rxn)
445 type is (rxn_photolysis_t)
446 call rxn%update_data_initialize(update_data, rxn_photolysis)
447 class default
448 call die_msg(284703230, "Update data <-> rxn mismatch")
449 end select
451 select type (rxn)
453 call rxn%update_data_initialize(update_data, rxn_condensed_phase_photolysis)
454 class default
455 call die_msg(284703230, "Update data <-> rxn mismatch")
456 end select
457 class default
458 call die_msg(239438576, "Internal error - update data type missing.")
459 end select
460
461 end subroutine initialize_update_data
462
463!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
464
465 !> Determine the size of a binary required to pack a reaction
466 integer(kind=i_kind) function pack_size(this, rxn, comm)
467
468 !> Reaction factory
469 class(rxn_factory_t) :: this
470 !> Reaction to pack
471 class(rxn_data_t), intent(in) :: rxn
472 !> MPI communicator
473 integer, intent(in) :: comm
474
475 pack_size = camp_mpi_pack_size_integer(int(1, kind=i_kind), comm) + &
476 rxn%pack_size(comm)
477
478 end function pack_size
479
480!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
481
482 !> Pack the given value to the buffer, advancing position
483 subroutine bin_pack(this, rxn, buffer, pos, comm)
484
485 !> Reaction factory
486 class(rxn_factory_t), intent(in) :: this
487 !> Reaction to pack
488 class(rxn_data_t), intent(in) :: rxn
489 !> Memory buffer
490 character, intent(inout) :: buffer(:)
491 !> Current buffer position
492 integer, intent(inout) :: pos
493 !> MPI communicator
494 integer, intent(in) :: comm
495
496#ifdef CAMP_USE_MPI
497 integer :: rxn_type, i_rxn, prev_position
498
499 prev_position = pos
500 select type (rxn)
501 type is (rxn_arrhenius_t)
502 rxn_type = rxn_arrhenius
503 type is (rxn_troe_t)
504 rxn_type = rxn_troe
505 type is (rxn_cmaq_h2o2_t)
506 rxn_type = rxn_cmaq_h2o2
507 type is (rxn_cmaq_oh_hno3_t)
508 rxn_type = rxn_cmaq_oh_hno3
509 type is (rxn_photolysis_t)
510 rxn_type = rxn_photolysis
512 rxn_type = rxn_hl_phase_transfer
514 rxn_type = rxn_aqueous_equilibrium
521 type is (rxn_first_order_loss_t)
522 rxn_type = rxn_first_order_loss
523 type is (rxn_emission_t)
524 rxn_type = rxn_emission
525 type is (rxn_wet_deposition_t)
526 rxn_type = rxn_wet_deposition
530 rxn_type = rxn_wennberg_tunneling
531 type is (rxn_wennberg_no_ro2_t)
532 rxn_type = rxn_wennberg_no_ro2
533 type is (rxn_surface_t)
534 rxn_type = rxn_surface
535 class default
536 call die_msg(343941184, "Trying to pack reaction of unknown type.")
537 end select
538 call camp_mpi_pack_integer(buffer, pos, rxn_type, comm)
539 call rxn%bin_pack(buffer, pos, comm)
540 call assert(194676336, &
541 pos - prev_position <= this%pack_size(rxn, comm))
542#endif
543
544 end subroutine bin_pack
545
546!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
547
548 !> Unpack the given value to the buffer, advancing position
549 function bin_unpack(this, buffer, pos, comm) result (rxn)
550
551 !> Unpacked reaction
552 class(rxn_data_t), pointer :: rxn
553 !> Reaction factory
554 class(rxn_factory_t), intent(in) :: this
555 !> Memory buffer
556 character, intent(inout) :: buffer(:)
557 !> Current buffer position
558 integer, intent(inout) :: pos
559 !> MPI communicator
560 integer, intent(in) :: comm
561
562#ifdef CAMP_USE_MPI
563 integer :: rxn_type, i_rxn, prev_position
564
565 prev_position = pos
566 call camp_mpi_unpack_integer(buffer, pos, rxn_type, comm)
567 select case (rxn_type)
568 case (rxn_arrhenius)
569 rxn => rxn_arrhenius_t()
570 case (rxn_troe)
571 rxn => rxn_troe_t()
572 case (rxn_cmaq_h2o2)
573 rxn => rxn_cmaq_h2o2_t()
574 case (rxn_cmaq_oh_hno3)
575 rxn => rxn_cmaq_oh_hno3_t()
576 case (rxn_photolysis)
577 rxn => rxn_photolysis_t()
590 case (rxn_emission)
591 rxn => rxn_emission_t()
592 case (rxn_wet_deposition)
593 rxn => rxn_wet_deposition_t()
599 rxn => rxn_wennberg_no_ro2_t()
600 case (rxn_surface)
601 rxn => rxn_surface_t()
602 case default
603 call die_msg(659290342, &
604 "Trying to unpack reaction of unknown type:"// &
605 to_string(rxn_type))
606 end select
607 call rxn%bin_unpack(buffer, pos, comm)
608 call assert(880568259, &
609 pos - prev_position <= this%pack_size(rxn, comm))
610#endif
611
612 end function bin_unpack
613
614!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
615
616end module camp_rxn_factory
Interface for to_string functions.
Definition util.F90:32
Physical constants.
Definition constants.F90:9
integer, parameter dp
Kind of a double precision real number.
Definition constants.F90:16
integer, parameter i_kind
Kind of an integer.
Definition constants.F90:21
Wrapper functions for MPI.
Definition mpi.F90:13
subroutine camp_mpi_unpack_integer(buffer, position, val, comm)
Unpacks the given value from the buffer, advancing position.
Definition mpi.F90:1023
subroutine camp_mpi_pack_integer(buffer, position, val, comm)
Packs the given value into the buffer, advancing position.
Definition mpi.F90:691
integer function camp_mpi_pack_size_integer(val, comm)
Determines the number of bytes required to pack the given value.
Definition mpi.F90:398
The rxn_aqueous_equilibrium_t type and associated functions.
The rxn_arrhenius_t type and associated functions.
The rxn_CMAQ_H2O2_t type and associated functions.
The rxn_CMAQ_OH_HNO3_t type and associated functions.
The rxn_condensed_phase_arrhenius_t type and associated functions.
The rxn_condensed_phase_photolysis_t type and associated functions.
The rxn_data_t structure and associated subroutines.
Definition rxn_data.F90:60
integer(kind=i_kind) function pack_size(this, comm)
Determine the size of a binary required to pack the reaction data.
Definition rxn_data.F90:413
subroutine bin_pack(this, buffer, pos, comm)
Pack the given value to the buffer, advancing position.
Definition rxn_data.F90:431
subroutine bin_unpack(this, buffer, pos, comm)
Unpack the given value from the buffer, advancing position.
Definition rxn_data.F90:459
subroutine load(this, json, j_obj)
Load reactions from an input file.
Definition rxn_data.F90:344
The rxn_emission_t type and associated functions.
The abstract rxn_factory_t structure and associated subroutines.
integer(kind=i_kind), parameter, public rxn_photolysis
integer(kind=i_kind), parameter, public rxn_condensed_phase_arrhenius
integer(kind=i_kind), parameter, public rxn_surface
integer(kind=i_kind), parameter, public rxn_condensed_phase_photolysis
integer(kind=i_kind), parameter, public rxn_cmaq_oh_hno3
class(rxn_data_t) function, pointer create(this, type_name)
Create a new chemical reaction by type name.
integer(kind=i_kind), parameter, public rxn_ternary_chemical_activation
integer(kind=i_kind), parameter, public rxn_first_order_loss
integer(kind=i_kind) function get_type(this, rxn)
Get the reaction type as a RxnType.
integer(kind=i_kind), parameter, public rxn_troe
integer(kind=i_kind), parameter, public rxn_simpol_phase_transfer
integer(kind=i_kind), parameter, public rxn_cmaq_h2o2
integer(kind=i_kind), parameter, public rxn_emission
integer(kind=i_kind), parameter, public rxn_hl_phase_transfer
integer(kind=i_kind), parameter, public rxn_wennberg_tunneling
integer(kind=i_kind), parameter, public rxn_aqueous_equilibrium
integer(kind=i_kind), parameter, public rxn_arrhenius
Identifiers for reaction types - used by binary packing/unpacking functions.
integer(kind=i_kind), parameter, public rxn_wet_deposition
subroutine initialize_update_data(this, rxn, update_data)
Initialize an update data object.
integer(kind=i_kind), parameter, public rxn_wennberg_no_ro2
The rxn_first_order_loss_t type and associated functions.
The rxn_HL_phase_transfer_t type and associated functions.
The rxn_photolysis_t type and associated functions.
The rxn_SIMPOL_phase_transfer_t type and associated functions.
The rxn_surface_t type and associated functions.
The rxn_ternary_chemical_activation_t type and associated functions.
The rxn_troe_t type and associated functions.
Definition rxn_troe.F90:67
The rxn_wennberg_no_ro2_t type and associated functions.
The rxn_wennberg_tunneling_t type and associated functions.
The rxn_wet_deposition_t type and associated functions.
Common utility subroutines.
Definition util.F90:9
subroutine assert(code, condition_ok)
Errors unless condition_ok is true.
Definition util.F90:165
subroutine die_msg(code, error_msg)
Error immediately.
Definition util.F90:196
subroutine assert_msg(code, condition_ok, error_msg)
Errors unless condition_ok is true.
Definition util.F90:130
subroutine warn_msg(code, warning_msg, already_warned)
Prints a warning message.
Definition util.F90:90
Generic test reaction data type.
Generic test reaction data type.
Abstract reaction data type.
Definition rxn_data.F90:98
Generic test reaction data type.
Factory type for chemical reactions.
Generic test reaction data type.
Generic test reaction data type.
Generic test reaction data type.
Definition rxn_troe.F90:105
String type for building arrays of string of various size.
Definition util.F90:38