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
199 use camp_rxn_troe
203
204 use iso_c_binding
205
206 implicit none
207 private
208
209 public :: rxn_factory_t
210
211 !> Identifiers for reaction types - used by binary packing/unpacking
212 !! functions
213 integer(kind=i_kind), parameter, public :: rxn_arrhenius = 1
214 integer(kind=i_kind), parameter, public :: rxn_troe = 2
215 integer(kind=i_kind), parameter, public :: rxn_cmaq_h2o2 = 3
216 integer(kind=i_kind), parameter, public :: rxn_cmaq_oh_hno3 = 4
217 integer(kind=i_kind), parameter, public :: rxn_photolysis = 5
218 integer(kind=i_kind), parameter, public :: rxn_hl_phase_transfer = 6
219 integer(kind=i_kind), parameter, public :: rxn_aqueous_equilibrium = 7
220 integer(kind=i_kind), parameter, public :: rxn_simpol_phase_transfer = 10
221 integer(kind=i_kind), parameter, public :: rxn_condensed_phase_arrhenius = 11
222 integer(kind=i_kind), parameter, public :: rxn_first_order_loss = 12
223 integer(kind=i_kind), parameter, public :: rxn_emission = 13
224 integer(kind=i_kind), parameter, public :: rxn_wet_deposition = 14
225 integer(kind=i_kind), parameter, public :: rxn_ternary_chemical_activation = 15
226 integer(kind=i_kind), parameter, public :: rxn_wennberg_tunneling = 16
227 integer(kind=i_kind), parameter, public :: rxn_wennberg_no_ro2 = 17
228 integer(kind=i_kind), parameter, public :: rxn_condensed_phase_photolysis = 18
229 integer(kind=i_kind), parameter, public :: rxn_surface = 19
230 integer(kind=i_kind), parameter, public :: rxn_condensed_phase_diffusion = 20
231
232 !> Factory type for chemical reactions
233 !!
234 !! Provides new instances of types extending rxn_data_t by name or
235 !! from input file data
237 contains
238 !> Create a new chemical reaction by type name
239 procedure :: create
240 !> Create a new chemical reaction from input data
241 procedure :: load
242 !> Get the reaction type
243 procedure :: get_type
244 !> Get a new update data object
246 !> Determine the number of bytes required to pack a given reaction
247 procedure :: pack_size
248 !> Pack a given reaction to the buffer, advancing the position
249 procedure :: bin_pack
250 !> Unpack a reaction from the buffer, advancing the position
251 procedure :: bin_unpack
252 end type rxn_factory_t
253
254contains
255
256!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
257
258 !> Create a new chemical reaction by type name
259 function create(this, type_name) result (new_obj)
260
261 !> A chemical reaction
262 class(rxn_data_t), pointer :: new_obj
263 !> Aerosol representation factory
264 class(rxn_factory_t), intent(in) :: this
265 !> Name of the chemical reaction
266 character(len=*), intent(in) :: type_name
267
268 new_obj => null()
269
270 ! Create a new reaction instance based on the type name supplied
271 select case (type_name)
272 case ("ARRHENIUS")
273 new_obj => rxn_arrhenius_t()
274 case ("TROE")
275 new_obj => rxn_troe_t()
276 case ("CMAQ_H2O2")
277 new_obj => rxn_cmaq_h2o2_t()
278 case ("CMAQ_OH_HNO3")
279 new_obj => rxn_cmaq_oh_hno3_t()
280 case ("PHOTOLYSIS")
281 new_obj => rxn_photolysis_t()
282 case ("HL_PHASE_TRANSFER")
283 new_obj => rxn_hl_phase_transfer_t()
284 case ("AQUEOUS_EQUILIBRIUM")
285 new_obj => rxn_aqueous_equilibrium_t()
286 case ("SIMPOL_PHASE_TRANSFER")
287 new_obj => rxn_simpol_phase_transfer_t()
288 case ("CONDENSED_PHASE_ARRHENIUS")
290 case ("CONDENSED_PHASE_PHOTOLYSIS")
292 case ("FIRST_ORDER_LOSS")
293 new_obj => rxn_first_order_loss_t()
294 case ("EMISSION")
295 new_obj => rxn_emission_t()
296 case ("WET_DEPOSITION")
297 new_obj => rxn_wet_deposition_t()
298 case ("TERNARY_CHEMICAL_ACTIVATION")
300 case ("WENNBERG_TUNNELING")
301 new_obj => rxn_wennberg_tunneling_t()
302 case ("WENNBERG_NO_RO2")
303 new_obj => rxn_wennberg_no_ro2_t()
304 case ("SURFACE")
305 new_obj => rxn_surface_t()
306 case ("CONDENSED_PHASE_DIFFUSION")
308 case default
309 call die_msg(367114278, "Unknown chemical reaction type: " &
310 //type_name)
311 end select
312
313 end function create
314
315!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
316
317 !> Load a reaction from input data
318#ifdef CAMP_USE_JSON
319 function load(this, json, j_obj) result (new_obj)
320
321 !> A chemical reaction
322 class(rxn_data_t), pointer :: new_obj
323 !> Chemical reaction factory
324 class(rxn_factory_t), intent(in) :: this
325 !> JSON core
326 type(json_core), pointer, intent(in) :: json
327 !> JSON object
328 type(json_value), pointer, intent(in) :: j_obj
329
330 character(kind=json_ck, len=:), allocatable :: unicode_type_name
331 character(len=:), allocatable :: type_name
332 logical(kind=json_lk) :: found
333
334 new_obj => null()
335
336 ! Get the reaction type
337 call json%get(j_obj, "type", unicode_type_name, found)
338 call assert_msg(137665576, found, 'Missing chemical reaction type.')
339 type_name = unicode_type_name
340
341 ! Create a new reaction instance of the type specified
342 new_obj => this%create(type_name)
343
344 ! Load reaction parameters from the json object
345 call new_obj%load(json, j_obj)
346
347#else
348 !> Generic warning function when no input file support exists
349 function load(this) result (new_obj)
350
351 !> A chemical reaction
352 class(rxn_data_t), pointer :: new_obj
353 !> Chemical reaction factory
354 class(rxn_factory_t), intent(in) :: this
355
356 new_obj => null()
357
358 call warn_msg(979827016, "No support for input files.")
359#endif
360 end function load
361
362!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
363
364 !> Get the reaction type as a RxnType
365 integer(kind=i_kind) function get_type(this, rxn) result (rxn_type)
366
367 !> Reaction factory
368 class(rxn_factory_t), intent(in) :: this
369 !> Reaction to get type of
370 class(rxn_data_t), intent(in) :: rxn
371
372 select type (rxn)
373 type is (rxn_arrhenius_t)
374 rxn_type = rxn_arrhenius
375 type is (rxn_troe_t)
376 rxn_type = rxn_troe
377 type is (rxn_cmaq_h2o2_t)
378 rxn_type = rxn_cmaq_h2o2
379 type is (rxn_cmaq_oh_hno3_t)
380 rxn_type = rxn_cmaq_oh_hno3
381 type is (rxn_photolysis_t)
382 rxn_type = rxn_photolysis
384 rxn_type = rxn_hl_phase_transfer
386 rxn_type = rxn_aqueous_equilibrium
393 type is (rxn_first_order_loss_t)
394 rxn_type = rxn_first_order_loss
395 type is (rxn_emission_t)
396 rxn_type = rxn_emission
397 type is (rxn_wet_deposition_t)
398 rxn_type = rxn_wet_deposition
402 rxn_type = rxn_wennberg_tunneling
403 type is (rxn_wennberg_no_ro2_t)
404 rxn_type = rxn_wennberg_no_ro2
405 type is (rxn_surface_t)
406 rxn_type = rxn_surface
409 class default
410 call die_msg(343941184, "Unknown reaction type.")
411 end select
412
413 end function get_type
414
415!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
416
417 !> Initialize an update data object
418 subroutine initialize_update_data(this, rxn, update_data)
419
420 !> Reaction factory
421 class(rxn_factory_t), intent(in) :: this
422 !> Reaction to be updated
423 class(rxn_data_t), intent(inout) :: rxn
424 !> Update data object
425 class(rxn_update_data_t), intent(out) :: update_data
426
427 select type (update_data)
429 select type (rxn)
430 type is (rxn_wet_deposition_t)
431 call rxn%update_data_initialize(update_data, rxn_wet_deposition)
432 class default
433 call die_msg(519416239, "Update data <-> rxn mismatch")
434 end select
436 select type (rxn)
437 type is (rxn_emission_t)
438 call rxn%update_data_initialize(update_data, rxn_emission)
439 class default
440 call die_msg(395116041, "Update data <-> rxn mismatch")
441 end select
443 select type (rxn)
444 type is (rxn_first_order_loss_t)
445 call rxn%update_data_initialize(update_data, rxn_first_order_loss)
446 class default
447 call die_msg(172384885, "Update data <-> rxn mismatch")
448 end select
450 select type (rxn)
451 type is (rxn_photolysis_t)
452 call rxn%update_data_initialize(update_data, rxn_photolysis)
453 class default
454 call die_msg(284703230, "Update data <-> rxn mismatch")
455 end select
457 select type (rxn)
459 call rxn%update_data_initialize(update_data, rxn_condensed_phase_photolysis)
460 class default
461 call die_msg(284703230, "Update data <-> rxn mismatch")
462 end select
463 class default
464 call die_msg(239438576, "Internal error - update data type missing.")
465 end select
466
467 end subroutine initialize_update_data
468
469!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
470
471 !> Determine the size of a binary required to pack a reaction
472 integer(kind=i_kind) function pack_size(this, rxn, comm)
473
474 !> Reaction factory
475 class(rxn_factory_t) :: this
476 !> Reaction to pack
477 class(rxn_data_t), intent(in) :: rxn
478 !> MPI communicator
479 integer, intent(in) :: comm
480
481 pack_size = camp_mpi_pack_size_integer(int(1, kind=i_kind), comm) + &
482 rxn%pack_size(comm)
483
484 end function pack_size
485
486!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
487
488 !> Pack the given value to the buffer, advancing position
489 subroutine bin_pack(this, rxn, buffer, pos, comm)
490
491 !> Reaction factory
492 class(rxn_factory_t), intent(in) :: this
493 !> Reaction to pack
494 class(rxn_data_t), intent(in) :: rxn
495 !> Memory buffer
496 character, intent(inout) :: buffer(:)
497 !> Current buffer position
498 integer, intent(inout) :: pos
499 !> MPI communicator
500 integer, intent(in) :: comm
501
502#ifdef CAMP_USE_MPI
503 integer :: rxn_type, i_rxn, prev_position
504
505 prev_position = pos
506 select type (rxn)
507 type is (rxn_arrhenius_t)
508 rxn_type = rxn_arrhenius
509 type is (rxn_troe_t)
510 rxn_type = rxn_troe
511 type is (rxn_cmaq_h2o2_t)
512 rxn_type = rxn_cmaq_h2o2
513 type is (rxn_cmaq_oh_hno3_t)
514 rxn_type = rxn_cmaq_oh_hno3
515 type is (rxn_photolysis_t)
516 rxn_type = rxn_photolysis
518 rxn_type = rxn_hl_phase_transfer
520 rxn_type = rxn_aqueous_equilibrium
527 type is (rxn_first_order_loss_t)
528 rxn_type = rxn_first_order_loss
529 type is (rxn_emission_t)
530 rxn_type = rxn_emission
531 type is (rxn_wet_deposition_t)
532 rxn_type = rxn_wet_deposition
536 rxn_type = rxn_wennberg_tunneling
537 type is (rxn_wennberg_no_ro2_t)
538 rxn_type = rxn_wennberg_no_ro2
539 type is (rxn_surface_t)
540 rxn_type = rxn_surface
543 class default
544 call die_msg(343941184, "Trying to pack reaction of unknown type.")
545 end select
546 call camp_mpi_pack_integer(buffer, pos, rxn_type, comm)
547 call rxn%bin_pack(buffer, pos, comm)
548 call assert(194676336, &
549 pos - prev_position <= this%pack_size(rxn, comm))
550#endif
551
552 end subroutine bin_pack
553
554!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
555
556 !> Unpack the given value to the buffer, advancing position
557 function bin_unpack(this, buffer, pos, comm) result (rxn)
558
559 !> Unpacked reaction
560 class(rxn_data_t), pointer :: rxn
561 !> Reaction factory
562 class(rxn_factory_t), intent(in) :: this
563 !> Memory buffer
564 character, intent(inout) :: buffer(:)
565 !> Current buffer position
566 integer, intent(inout) :: pos
567 !> MPI communicator
568 integer, intent(in) :: comm
569
570#ifdef CAMP_USE_MPI
571 integer :: rxn_type, i_rxn, prev_position
572
573 prev_position = pos
574 call camp_mpi_unpack_integer(buffer, pos, rxn_type, comm)
575 select case (rxn_type)
576 case (rxn_arrhenius)
577 rxn => rxn_arrhenius_t()
578 case (rxn_troe)
579 rxn => rxn_troe_t()
580 case (rxn_cmaq_h2o2)
581 rxn => rxn_cmaq_h2o2_t()
582 case (rxn_cmaq_oh_hno3)
583 rxn => rxn_cmaq_oh_hno3_t()
584 case (rxn_photolysis)
585 rxn => rxn_photolysis_t()
598 case (rxn_emission)
599 rxn => rxn_emission_t()
600 case (rxn_wet_deposition)
601 rxn => rxn_wet_deposition_t()
607 rxn => rxn_wennberg_no_ro2_t()
608 case (rxn_surface)
609 rxn => rxn_surface_t()
612 case default
613 call die_msg(659290342, &
614 "Trying to unpack reaction of unknown type:"// &
615 to_string(rxn_type))
616 end select
617 call rxn%bin_unpack(buffer, pos, comm)
618 call assert(880568259, &
619 pos - prev_position <= this%pack_size(rxn, comm))
620#endif
621
622 end function bin_unpack
623
624!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
625
626end 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_diffusion_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:61
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:419
subroutine bin_pack(this, buffer, pos, comm)
Pack the given value to the buffer, advancing position.
Definition: rxn_data.F90:437
subroutine bin_unpack(this, buffer, pos, comm)
Unpack the given value from the buffer, advancing position.
Definition: rxn_data.F90:465
subroutine load(this, json, j_obj)
Load reactions from an input file.
Definition: rxn_data.F90:350
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_condensed_phase_diffusion
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.
Definition: rxn_surface.F90:70
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.
Generic test reaction data type.
Abstract reaction data type.
Definition: rxn_data.F90:100
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:106
String type for building arrays of string of various size.
Definition: util.F90:38