1
+ program test_micm_multiple_grid_cells
2
+
3
+ use , intrinsic :: iso_c_binding
4
+ use , intrinsic :: ieee_arithmetic
5
+
6
+ use iso_fortran_env, only : real64
7
+ use musica_util, only: assert, error_t, string_t, mapping_t
8
+ use musica_micm, only: micm_t, solver_stats_t
9
+ use musica_micm, only: Rosenbrock, RosenbrockStandardOrder
10
+ use musica_state, only: conditions_t, state_t
11
+
12
+ #define ASSERT( expr ) call assert( expr, __FILE__, __LINE__ )
13
+ #define ASSERT_EQ( a, b ) call assert( a == b, __FILE__, __LINE__ )
14
+ #define ASSERT_NE( a, b ) call assert( a /= b, __FILE__, __LINE__ )
15
+ #define ASSERT_NEAR( a, b, tol ) call assert( abs(a - b) < abs(a + b) * tol, __FILE__, __LINE__ )
16
+ #define ASSERT_GT( a, b ) call assert( a > b, __FILE__, __LINE__ )
17
+
18
+ implicit none
19
+
20
+ call multiple_grid_cells_example()
21
+
22
+ contains
23
+
24
+ ! > Runs a multiple grid cells box model using the MICM solver
25
+ subroutine multiple_grid_cells_example ()
26
+
27
+ character (len= 256 ) :: config_path
28
+ integer :: solver_type
29
+ integer :: num_grid_cells
30
+ real (real64), parameter :: GAS_CONSTANT = 8.31446261815324_real64 ! J mol-1 K-1
31
+ real (real64) :: time_step
32
+ type (string_t) :: solver_state
33
+ type (solver_stats_t) :: solver_stats
34
+ type (error_t) :: error
35
+ type (micm_t), pointer :: micm
36
+ type (state_t), pointer :: state
37
+ integer :: i, j, cell_id
38
+
39
+ config_path = " configs/v0/analytical"
40
+ solver_type = RosenbrockStandardOrder
41
+ num_grid_cells = 3 ! Use 3 grid cells to demonstrate multiple cells
42
+
43
+ write (* ,* ) " Creating MICM solver with" , num_grid_cells, " grid cells..."
44
+ micm = > micm_t(config_path, solver_type, error)
45
+ ASSERT( error% is_success() )
46
+
47
+ write (* ,* ) " Creating State for multiple grid cells..."
48
+ state = > micm% get_state(num_grid_cells, error)
49
+ ASSERT( error% is_success() )
50
+
51
+ time_step = 200
52
+
53
+ ! Set up conditions for each grid cell
54
+ do cell_id = 1 , num_grid_cells
55
+ state% conditions(cell_id)% temperature = 273.0 + (cell_id - 1 ) * 10.0 ! Different temperatures
56
+ state% conditions(cell_id)% pressure = 1.0e5
57
+ state% conditions(cell_id)% air_density = state% conditions(cell_id)% pressure / &
58
+ (GAS_CONSTANT * state% conditions(cell_id)% temperature)
59
+ end do
60
+
61
+ ! Set initial concentrations for each grid cell
62
+ associate( cell_stride = > state% species_strides% grid_cell, &
63
+ var_stride = > state% species_strides% variable )
64
+ do cell_id = 1 , num_grid_cells
65
+ ! Set different initial concentrations for each cell
66
+ do i = 1 , 6 ! Assuming 6 species
67
+ ! Cell 1: all species start at 1.0
68
+ ! Cell 2: all species start at 2.0
69
+ ! Cell 3: all species start at 0.5
70
+ if (cell_id == 1 ) then
71
+ state% concentrations(1 + (cell_id - 1 ) * cell_stride + (i - 1 ) * var_stride) = 1.0
72
+ else if (cell_id == 2 ) then
73
+ state% concentrations(1 + (cell_id - 1 ) * cell_stride + (i - 1 ) * var_stride) = 2.0
74
+ else
75
+ state% concentrations(1 + (cell_id - 1 ) * cell_stride + (i - 1 ) * var_stride) = 0.5
76
+ end if
77
+ end do
78
+ end do
79
+ end associate
80
+
81
+ ! Set rate parameters for each grid cell
82
+ associate( cell_stride = > state% rate_parameters_strides% grid_cell, &
83
+ var_stride = > state% rate_parameters_strides% variable )
84
+ do cell_id = 1 , num_grid_cells
85
+ ! Set the same rate parameters for all cells
86
+ state% rate_parameters(1 + (cell_id - 1 ) * cell_stride + 0 * var_stride) = 0.001
87
+ state% rate_parameters(1 + (cell_id - 1 ) * cell_stride + 1 * var_stride) = 0.002
88
+ end do
89
+ end associate
90
+
91
+ ! Print species information
92
+ write (* ,* ) " Species in the mechanism:"
93
+ do i = 1 , state% species_ordering% size ()
94
+ write (* ,* ) " Species Name:" , trim (state% species_ordering% name (i)), &
95
+ " , Index:" , state% species_ordering% index (i)
96
+ end do
97
+
98
+ ! Print initial concentrations for each grid cell
99
+ write (* ,* ) " "
100
+ write (* ,* ) " Initial concentrations by grid cell:"
101
+ associate( cell_stride = > state% species_strides% grid_cell, &
102
+ var_stride = > state% species_strides% variable )
103
+ do cell_id = 1 , num_grid_cells
104
+ write (* ,' (A,I0,A,F6.1,A)' ) " Grid Cell " , cell_id, " (T=" , &
105
+ state% conditions(cell_id)% temperature, " K):"
106
+ do i = 1 , 6
107
+ write (* ,' (A,F8.3)' , advance= ' no' ) " " , &
108
+ state% concentrations(1 + (cell_id - 1 ) * cell_stride + (i - 1 ) * var_stride)
109
+ end do
110
+ write (* ,* ) " "
111
+ end do
112
+ end associate
113
+
114
+ write (* ,* ) " "
115
+ write (* ,* ) " Solving for all grid cells simultaneously..."
116
+ call micm% solve(time_step, state, solver_state, solver_stats, error)
117
+ ASSERT( error% is_success() )
118
+
119
+ ! Print final concentrations for each grid cell
120
+ write (* ,* ) " "
121
+ write (* ,* ) " Final concentrations by grid cell:"
122
+ associate( cell_stride = > state% species_strides% grid_cell, &
123
+ var_stride = > state% species_strides% variable )
124
+ do cell_id = 1 , num_grid_cells
125
+ write (* ,' (A,I0,A,F6.1,A)' ) " Grid Cell " , cell_id, " (T=" , &
126
+ state% conditions(cell_id)% temperature, " K):"
127
+ do i = 1 , 6
128
+ write (* ,' (A,F8.3)' , advance= ' no' ) " " , &
129
+ state% concentrations(1 + (cell_id - 1 ) * cell_stride + (i - 1 ) * var_stride)
130
+ end do
131
+ write (* ,* ) " "
132
+ end do
133
+ end associate
134
+
135
+ write (* ,* ) " "
136
+ write (* ,* ) " Solver completed successfully for all" , num_grid_cells, " grid cells!"
137
+
138
+ deallocate ( micm )
139
+ deallocate ( state )
140
+ end subroutine multiple_grid_cells_example
141
+
142
+ end program test_micm_multiple_grid_cells
0 commit comments