MONC
casim.F90
Go to the documentation of this file.
1 
2 module casim_mod
8  use grids_mod, only : z_index, y_index, x_index
14 
15  ! casim modules...
16  use variable_precision, ONLY: wp
17  use initialize, only: mphys_init
18  use mphys_switches, only: set_mphys_switches, &
19  l_warm, &
20  nq_l, nq_r, nq_i, nq_s, nq_g, &
21  l_2mc, l_2mr, l_2mi, l_2ms, l_2mg, &
22  l_3mr, l_3ms, l_3mg, &
23  soluble_modes, active_cloud, active_rain, &
24  insoluble_modes, active_ice, active_number, &
25  isol, iinsol, option, aerosol_option
26 
27  use micro_main, only: shipway_microphysics
28  use generic_diagnostic_variables, ONLY: casdiags, allocate_diagnostic_space, &
29  deallocate_diagnostic_space
30 
31  implicit none
32 
33 #ifndef TEST_MODE
34  private
35 #endif
36 
37  REAL(wp), allocatable :: theta(:,:,:), pressure(:,:,:), &
38  z_half(:,:,:), z_centre(:,:,:), dz(:,:,:), qv(:,:,:),qc(:,:,:) &
39  , nc(:,:,:), qr(:,:,:), nr(:,:,:), m3r(:,:,:),rho(:,:,:) &
40  , exner(:,:,:), w(:,:,:), tke(:,:,:) &
41  , qi(:,:,:), ni(:,:,:), qs(:,:,:), ns(:,:,:), m3s(:,:,:) &
42  , qg(:,:,:), ng(:,:,:), m3g(:,:,:)
43 
44  REAL(wp), allocatable :: accumsolmass(:,:,:), accumsolnumber(:,:,:) ! Accumulation mode aerosol
45  REAL(wp), allocatable :: activesolliquid(:,:,:) ! Activated aerosol
46  REAL(wp), allocatable :: aitkensolmass(:,:,:), aitkensolnumber(:,:,:) ! Aitken mode aerosol
47  REAL(wp), allocatable :: coarsesolmass(:,:,:), coarsesolnumber(:,:,:) ! Course mode aerosol
48  REAL(wp), allocatable :: activesolrain(:,:,:) ! Activeated aerosol in rain
49  REAL(wp), allocatable :: coarsedustmass(:,:,:), coarsedustnumber(:,:,:) ! Coarse Dust
50  REAL(wp), allocatable :: activeinsolice(:,:,:) ! Activeated dust
51  REAL(wp), allocatable :: activesolice(:,:,:) ! Activeated aerosol in ice
52  REAL(wp), allocatable :: activeinsolliquid(:,:,:) ! Activeated dust in cloud
53  REAL(wp), allocatable :: accuminsolmass(:,:,:) ! Accum mode dust mass
54  REAL(wp), allocatable :: accuminsolnumber(:,:,:) ! Accum mode dust number
55  REAL(wp), allocatable :: activesolnumber(:,:,:) ! Activated soluble number (if we need a tracer)
56  REAL(wp), allocatable :: activeinsolnumber(:,:,:) ! Activated insoluble number (if we need a tracer)
57 
58 
59  ! Tendency from other physics/advection/forcing
60  ! NB This is tendency (/s) not an increment over the timestep
61  REAL(wp), allocatable :: dqv(:,:,:), dth(:,:,:), dqc(:,:,:), dnc(:,:,:) &
62  , dqr(:,:,:), dnr(:,:,:), dm3r(:,:,:) &
63  , dqi(:,:,:), dni(:,:,:), dqs(:,:,:), dns(:,:,:), dm3s(:,:,:) &
64  , dqg(:,:,:), dng(:,:,:), dm3g(:,:,:)
65 
66  REAL(wp), allocatable :: daccumsolmass(:,:,:), daccumsolnumber(:,:,:) ! Accumulation mode aerosol
67  REAL(wp), allocatable :: dactivesolliquid(:,:,:) ! Activated aerosol
68  REAL(wp), allocatable :: daitkensolmass(:,:,:), daitkensolnumber(:,:,:) ! Aitken mode aerosol
69  REAL(wp), allocatable :: dcoarsesolmass(:,:,:), dcoarsesolnumber(:,:,:) ! Course mode aerosol
70  REAL(wp), allocatable :: dactivesolrain(:,:,:) ! Activeated aerosol in rain
71  REAL(wp), allocatable :: dcoarsedustmass(:,:,:), dcoarsedustnumber(:,:,:) ! Dust
72  REAL(wp), allocatable :: dactiveinsolice(:,:,:) ! Activeated dust
73  REAL(wp), allocatable :: dactivesolice(:,:,:) ! Activeated aerosol in ice
74  REAL(wp), allocatable :: dactiveinsolliquid(:,:,:) ! Activeated dust in cloud
75  REAL(wp), allocatable :: daccuminsolmass(:,:,:) ! Accum mode dust mass
76  REAL(wp), allocatable :: daccuminsolnumber(:,:,:) ! Accum mode dust number
77  REAL(wp), allocatable :: dactivesolnumber(:,:,:) ! Activated soluble number (if we need a tracer)
78  REAL(wp), allocatable :: dactiveinsolnumber(:,:,:) ! Activated insoluble number (if we need a tracer)
79 
80  REAL(wp), allocatable :: surface_precip(:,:)
81 
82  INTEGER :: ils,ile, jls,jle, kls,kle, &
83  its,ite, jts,jte, kts,kte
84 
85  INTEGER :: iqv=0, iql=0, iqr=0, iqi=0, iqs=0, iqg=0
86  INTEGER :: inl=0, inr=0, ini=0, ins=0, ing=0
87  INTEGER :: i3mr=0, i3ms=0, i3mg=0
88  INTEGER :: &
89  i_accumsolmass=0, &
90  i_accumsolnumber=0, &
92  i_aitkensolmass=0, &
94  i_coarsesolmass=0, &
96  i_activesolrain=0, &
97  i_coarsedustmass=0, &
99  i_activeinsolice=0, &
100  i_activesolice=0, &
102  i_accuminsolmass=0, &
103  i_accuminsolnumber=0, &
104  i_activesolnumber=0, &
106 
107  public casim_get_descriptor
108 contains
109 
113  casim_get_descriptor%name="casim"
114  casim_get_descriptor%version=0.1
117 
120 
121  allocate(casim_get_descriptor%published_fields(1))
122 
123  casim_get_descriptor%published_fields(1)="surface_precip"
124 
125  end function casim_get_descriptor
126 
127  subroutine field_information_retrieval_callback(current_state, name, field_information)
128  type(model_state_type), target, intent(inout) :: current_state
129  character(len=*), intent(in) :: name
130  type(component_field_information_type), intent(out) :: field_information
131 
132  field_information%field_type=component_array_field_type
133  field_information%data_type=component_double_data_type
134  field_information%number_dimensions=2
135  field_information%dimension_sizes(1)=current_state%local_grid%size(y_index)
136  field_information%dimension_sizes(2)=current_state%local_grid%size(x_index)
137 
138  field_information%enabled=.true.
139 
141 
146  subroutine field_value_retrieval_callback(current_state, name, field_value)
147  type(model_state_type), target, intent(inout) :: current_state
148  character(len=*), intent(in) :: name
149  type(component_field_value_type), intent(out) :: field_value
150 
151  integer :: i
152 
153  if (name .eq. "surface_precip") then
154  allocate(field_value%real_2d_array(current_state%local_grid%size(y_index), &
155  current_state%local_grid%size(x_index)))
156  field_value%real_2d_array(:,:)= surface_precip(:,:)
157  end if
158 
159  end subroutine field_value_retrieval_callback
160 
163  subroutine initialisation_callback(current_state)
164  type(model_state_type), target, intent(inout) :: current_state
165 
166  integer :: y_size_local, x_size_local
167 
168  if (is_component_enabled(current_state%options_database, "simplecloud")) then
169  call log_master_log(log_error, "Casim and Simplecloud are enabled, this does not work yet. Please disable one")
170  end if
171 
172  y_size_local = current_state%local_grid%size(y_index)
173  x_size_local = current_state%local_grid%size(x_index)
174 
175  call read_configuration(current_state)
176 
177  ils=1
178  ile=1
179  jls=1
180  jle=1
181  kls=2
182  kle=current_state%local_grid%size(z_index)
183  its=1
184  ite=1
185  jts=1
186  jte=1
187  kts=1
188  kte=current_state%local_grid%size(z_index)
189 
191 
192  allocate(pressure(kte,1,1))
193  allocate(z_half(0:kte,1,1))
194  allocate(z_centre(kte,1,1))
195  allocate(dz(kte,1,1))
196  allocate(rho(kte,1,1))
197  allocate(exner(kte,1,1))
198  allocate(w(kte,1,1))
199  allocate(tke(kte,1,1))
200 
201  allocate(theta(kte,1,1))
202  allocate(qv(kte,1,1))
203  allocate(qc(kte,1,1))
204  allocate(nc(kte,1,1))
205  allocate(qr(kte,1,1))
206  allocate(nr(kte,1,1))
207  allocate(m3r(kte,1,1))
208  allocate(qi(kte,1,1))
209  allocate(ni(kte,1,1))
210  allocate(qs(kte,1,1))
211  allocate(ns(kte,1,1))
212  allocate(m3s(kte,1,1))
213  allocate(qg(kte,1,1))
214  allocate(ng(kte,1,1))
215  allocate(m3g(kte,1,1))
216 
217  allocate(accumsolmass(kte,1,1))
218  allocate(accumsolnumber(kte,1,1))
219  allocate(activesolliquid(kte,1,1))
220  allocate(aitkensolmass(kte,1,1))
221  allocate(aitkensolnumber(kte,1,1))
222  allocate(coarsesolmass(kte,1,1))
223  allocate(coarsesolnumber(kte,1,1))
224  allocate(activesolrain(kte,1,1))
225  allocate(coarsedustmass(kte,1,1))
226  allocate(coarsedustnumber(kte,1,1))
227  allocate(activeinsolice(kte,1,1))
228  allocate(activesolice(kte,1,1))
229  allocate(activeinsolliquid(kte,1,1))
230  allocate(accuminsolmass(kte,1,1))
231  allocate(accuminsolnumber(kte,1,1))
232  allocate(activesolnumber(kte,1,1))
233  allocate(activeinsolnumber(kte,1,1))
234 
235  allocate(dth(kte,1,1))
236  allocate(dqv(kte,1,1))
237  allocate(dqc(kte,1,1))
238  allocate(dnc(kte,1,1))
239  allocate(dqr(kte,1,1))
240  allocate(dnr(kte,1,1))
241  allocate(dm3r(kte,1,1))
242  allocate(dqi(kte,1,1))
243  allocate(dni(kte,1,1))
244  allocate(dqs(kte,1,1))
245  allocate(dns(kte,1,1))
246  allocate(dm3s(kte,1,1))
247  allocate(dqg(kte,1,1))
248  allocate(dng(kte,1,1))
249  allocate(dm3g(kte,1,1))
250 
251  allocate(daccumsolmass(kte,1,1))
252  allocate(daccumsolnumber(kte,1,1))
253  allocate(dactivesolliquid(kte,1,1))
254  allocate(daitkensolmass(kte,1,1))
255  allocate(daitkensolnumber(kte,1,1))
256  allocate(dcoarsesolmass(kte,1,1))
257  allocate(dcoarsesolnumber(kte,1,1))
258  allocate(dactivesolrain(kte,1,1))
259  allocate(dcoarsedustmass(kte,1,1))
260  allocate(dcoarsedustnumber(kte,1,1))
261  allocate(dactiveinsolice(kte,1,1))
262  allocate(dactivesolice(kte,1,1))
263  allocate(dactiveinsolliquid(kte,1,1))
264  allocate(daccuminsolmass(kte,1,1))
265  allocate(daccuminsolnumber(kte,1,1))
266  allocate(dactivesolnumber(kte,1,1))
267  allocate(dactiveinsolnumber(kte,1,1))
268 
269  casdiags % l_surface_rain = .true.
270  casdiags % l_surface_snow = .true.
271  casdiags % l_surface_graup = .true.
272 
273  CALL allocate_diagnostic_space(its, ite, jts, jte, kts, kte)
274 
275  allocate(surface_precip(y_size_local, x_size_local))
276 
277  call set_mphys_switches(option,aerosol_option)
278  call mphys_init(its, ite, jts, jte, kts, kte, ils, ile, jls, jle, kls, kle, l_tendency=.true.)
279 
280  ! Need to allocate the appropriate indices, e.g. iqv, iql...
281  ! This needs to be compatible with the rest of the model
282  ! This essentially reproduces the switching in the main microphysics
283  ! code already done above (set_mphys_switches), so could be combined
284  ! once the MONC method has been finalized.
285  ! Note the numbers assigned here may be different from those assigned
286  ! in the microphysics since we share the q array with other components.
287 
288  if (.not. allocated(current_state%cq))then
289  allocate(current_state%cq(current_state%number_q_fields))
290  current_state%cq=0.0_default_precision
291  end if
292 
293  ! Mass
294  iqv = get_q_index(standard_q_names%VAPOUR, 'casim')
295  if (nq_l>0)then
296  iql = get_q_index(standard_q_names%CLOUD_LIQUID_MASS, 'casim')
297  current_state%cq(iql) = -1.0
298  end if
299  if (nq_r>0)then
300  iqr = get_q_index(standard_q_names%RAIN_MASS, 'casim')
301  current_state%cq(iqr) = -1.0
302  end if
303  if (.not. l_warm)then
304  if (nq_i>0)then
305  iqi = get_q_index(standard_q_names%ICE_MASS, 'casim')
306  current_state%cq(iqi) = -1.0
307  end if
308  if (nq_s>0)then
309  iqs = get_q_index(standard_q_names%SNOW_MASS, 'casim')
310  current_state%cq(iqs) = -1.0
311  end if
312  if (nq_g>0)then
313  iqg = get_q_index(standard_q_names%GRAUPEL_MASS, 'casim')
314  current_state%cq(iqg) = -1.0
315  end if
316  end if
317 
318  ! Number
319  if (l_2mc)inl = get_q_index(standard_q_names%CLOUD_LIQUID_NUMBER, 'casim')
320  if (l_2mr)inr = get_q_index(standard_q_names%RAIN_NUMBER, 'casim')
321  if (.not. l_warm)then
322  if (l_2mi)ini = get_q_index(standard_q_names%ICE_NUMBER, 'casim')
323  if (l_2ms)ins = get_q_index(standard_q_names%SNOW_NUMBER, 'casim')
324  if (l_2mg)ing = get_q_index(standard_q_names%GRAUPEL_NUMBER, 'casim')
325  end if
326 
327  ! Third moments
328  if (l_3mr)i3mr = get_q_index(standard_q_names%RAIN_THIRD_MOMENT, 'casim')
329  if (.not. l_warm)then
330  if (l_3ms)i3ms = get_q_index(standard_q_names%SNOW_THIRD_MOMENT, 'casim')
331  if (l_3mg)i3mg = get_q_index(standard_q_names%GRAUPEL_THIRD_MOMENT, 'casim')
332  end if
333 
334  ! Aerosol
335  if (soluble_modes(1) > 1) i_aitkensolmass = &
336  get_q_index(standard_q_names%AITKEN_SOL_MASS, 'casim')
337  if (soluble_modes(1) > 0) i_aitkensolnumber = &
338  get_q_index(standard_q_names%AITKEN_SOL_NUMBER, 'casim')
339  if (soluble_modes(2) > 1) i_accumsolmass = &
340  get_q_index(standard_q_names%ACCUM_SOL_MASS, 'casim')
341  if (soluble_modes(2) > 0) i_accumsolnumber = &
342  get_q_index(standard_q_names%ACCUM_SOL_NUMBER, 'casim')
343  if (soluble_modes(3) > 1) i_coarsesolmass = &
344  get_q_index(standard_q_names%COARSE_SOL_MASS, 'casim')
345  if (soluble_modes(3) > 0) i_coarsesolnumber = &
346  get_q_index(standard_q_names%COARSE_SOL_NUMBER, 'casim')
347  if (active_cloud(isol)) i_activesolliquid = &
348  get_q_index(standard_q_names%ACTIVE_SOL_LIQUID, 'casim')
349  if (active_rain(isol)) i_activesolrain = &
350  get_q_index(standard_q_names%ACTIVE_SOL_RAIN, 'casim')
351  if (insoluble_modes(2) > 1) i_coarsedustmass = &
352  get_q_index(standard_q_names%COARSE_DUST_MASS, 'casim')
353  if (insoluble_modes(2) > 0) i_coarsedustnumber = &
354  get_q_index(standard_q_names%COARSE_DUST_NUMBER, 'casim')
355  if (active_ice(iinsol)) i_activeinsolice = &
356  get_q_index(standard_q_names%ACTIVE_INSOL_ICE, 'casim')
357  if (active_ice(isol)) i_activesolice = &
358  get_q_index(standard_q_names%ACTIVE_SOL_ICE, 'casim')
359  if (active_cloud(iinsol)) i_activeinsolliquid = &
360  get_q_index(standard_q_names%ACTIVE_INSOL_LIQUID, 'casim')
361  if (insoluble_modes(1) > 1) i_accuminsolmass = &
362  get_q_index(standard_q_names%ACCUM_INSOL_MASS, 'casim')
363  if (insoluble_modes(1) > 0) i_accuminsolnumber = &
364  get_q_index(standard_q_names%ACCUM_INSOL_NUMBER, 'casim')
365  if (active_number(isol)) i_activesolnumber = &
366  get_q_index(standard_q_names%ACTIVE_SOL_NUMBER, 'casim')
367  if (active_number(iinsol)) i_activeinsolnumber = &
368  get_q_index(standard_q_names%ACTIVE_INSOL_NUMBER, 'casim')
369 
370  end subroutine initialisation_callback
371 
374  subroutine timestep_callback(current_state)
375  type(model_state_type), target, intent(inout) :: current_state
376 
377  REAL(wp) :: dtwp
378  INTEGER :: icol, jcol, iqx, target_x_index, target_y_index
379 
380  icol=current_state%column_local_x
381  jcol=current_state%column_local_y
382  target_y_index=jcol-current_state%local_grid%halo_size(y_index)
383  target_x_index=icol-current_state%local_grid%halo_size(x_index)
384 
385  if (current_state%halo_column .or. current_state%timestep < 2) return
386 
387  if (current_state%field_stepping == forward_stepping)then
388  call log_master_log(log_error, 'Currently, CASIM assumes CENTERED_STEPPING')
389  dtwp = current_state%dtm
390  else
391  dtwp = 2.0*current_state%dtm
392  end if
393 
394  ! Initialize aerosol fields to zero...
395  aitkensolmass = 0.0
396  daitkensolmass = 0.0
397  aitkensolnumber = 0.0
398  daitkensolnumber = 0.0
399  accumsolmass = 0.0
400  daccumsolmass = 0.0
401  accumsolnumber = 0.0
402  daccumsolnumber = 0.0
403  coarsesolmass = 0.0
404  dcoarsesolmass = 0.0
405  coarsesolnumber = 0.0
406  dcoarsesolnumber = 0.0
407  activesolliquid = 0.0
408  dactivesolliquid = 0.0
409  coarsedustmass = 0.0
410  dcoarsedustmass = 0.0
411  coarsedustnumber = 0.0
412  dcoarsedustnumber = 0.0
413  activeinsolice = 0.0
414  dactiveinsolice = 0.0
415  activesolice = 0.0
416  dactivesolice = 0.0
417  activeinsolliquid = 0.0
418  dactiveinsolliquid = 0.0
419  accuminsolmass = 0.0
420  daccuminsolmass = 0.0
421  accuminsolnumber = 0.0
422  daccuminsolnumber = 0.0
423  activesolnumber = 0.0
424  dactivesolnumber = 0.0
425  activeinsolnumber = 0.0
426  dactiveinsolnumber = 0.0
427 
428  theta(:,1,1) = current_state%zth%data(:, jcol, icol) + current_state%global_grid%configuration%vertical%thref(:)
429  dth(:,1,1) = current_state%sth%data(:, jcol, icol)
430  exner(:,1,1) = current_state%global_grid%configuration%vertical%rprefrcp(:)
431  pressure(:,1,1) = current_state%global_grid%configuration%vertical%prefn(:)
432  z_centre(:,1,1) = current_state%global_grid%configuration%vertical%zn(:)
433  dz(:,1,1) = current_state%global_grid%configuration%vertical%dz(:)
434  z_half(:kte-1,1,1) = current_state%global_grid%configuration%vertical%z(:)
435  rho(:,1,1) = current_state%global_grid%configuration%vertical%rhon(:)
436  w(:,1,1) = current_state%zw%data(:, jcol, icol)
437  tke(:,1,1) = 0.1 ! Test value
438 
439  iqx = iqv
440  qv(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
441  dqv(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
442 
443  ! Warm microphysical fields
444  IF (nq_l > 0)then
445  iqx = iql
446  qc(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
447  dqc(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
448  end IF
449  IF (nq_r > 0)then
450  iqx = iqr
451  qr(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
452  dqr(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
453  end IF
454  IF (nq_l > 1)then
455  iqx = inl
456  nc(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
457  dnc(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
458  end IF
459  IF (nq_r > 1)then
460  iqx = inr
461  nr(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
462  dnr(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
463  end IF
464  IF (nq_r > 2)then
465  iqx = i3mr
466  m3r(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
467  dm3r(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
468  end IF
469 
470  ! Ice microphysical fields
471  IF (nq_i > 0)then
472  iqx = iqi
473  qi(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
474  dqi(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
475  end IF
476  IF (nq_s > 0)then
477  iqx = iqs
478  qs(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
479  dqs(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
480  end IF
481  IF (nq_g > 0)then
482  iqx = iqg
483  qg(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
484  dqg(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
485  end IF
486  IF (nq_i > 1)then
487  iqx = ini
488  ni(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
489  dni(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
490  end IF
491  IF (nq_s > 1)then
492  iqx = ins
493  ns(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
494  dns(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
495  end IF
496  IF (nq_g > 1)then
497  iqx = ing
498  ng(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
499  dng(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
500  end IF
501  IF (nq_s > 2)then
502  iqx = i3ms
503  m3s(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
504  dm3s(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
505  end IF
506  IF (nq_g > 2)then
507  iqx = i3mg
508  m3g(:,1,1) = current_state%zq(iqx)%data(:,jcol,icol)
509  dm3g(:,1,1) = current_state%sq(iqx)%data(:,jcol,icol)
510  end IF
511 
512  ! Aerosol fields
513 
514  if (i_aitkensolmass>0) aitkensolmass(:,1,1) = current_state%zq(i_aitkensolmass)%data(:,jcol,icol)
515  if (i_aitkensolmass>0) daitkensolmass(:,1,1) = current_state%sq(i_aitkensolmass)%data(:,jcol,icol)
516  if (i_aitkensolnumber>0) aitkensolnumber(:,1,1) = current_state%zq(i_aitkensolnumber)%data(:,jcol,icol)
517  if (i_aitkensolnumber>0) daitkensolnumber(:,1,1) = current_state%sq(i_aitkensolnumber)%data(:,jcol,icol)
518  if (i_accumsolmass>0) accumsolmass(:,1,1) = current_state%zq(i_accumsolmass)%data(:,jcol,icol)
519  if (i_accumsolmass>0) daccumsolmass(:,1,1) = current_state%sq(i_accumsolmass)%data(:,jcol,icol)
520  if (i_accumsolnumber>0) accumsolnumber(:,1,1) = current_state%zq(i_accumsolnumber)%data(:,jcol,icol)
521  if (i_accumsolnumber>0) daccumsolnumber(:,1,1) = current_state%sq(i_accumsolnumber)%data(:,jcol,icol)
522  if (i_coarsesolmass>0) coarsesolmass(:,1,1) = current_state%zq(i_coarsesolmass)%data(:,jcol,icol)
523  if (i_coarsesolmass>0) dcoarsesolmass(:,1,1) = current_state%sq(i_coarsesolmass)%data(:,jcol,icol)
524  if (i_coarsesolnumber>0) coarsesolnumber(:,1,1) = current_state%zq(i_coarsesolnumber)%data(:,jcol,icol)
525  if (i_coarsesolnumber>0) dcoarsesolnumber(:,1,1) = current_state%sq(i_coarsesolnumber)%data(:,jcol,icol)
526  if (i_activesolliquid>0) activesolliquid(:,1,1) = current_state%zq(i_activesolliquid)%data(:,jcol,icol)
527  if (i_activesolliquid>0) dactivesolliquid(:,1,1) = current_state%sq(i_activesolliquid)%data(:,jcol,icol)
528  if (i_coarsedustmass>0) coarsedustmass(:,1,1) = current_state%zq(i_coarsedustmass)%data(:,jcol,icol)
529  if (i_coarsedustmass>0) dcoarsedustmass(:,1,1) = current_state%sq(i_coarsedustmass)%data(:,jcol,icol)
530  if (i_coarsedustnumber>0) coarsedustnumber(:,1,1) = current_state%zq(i_coarsedustnumber)%data(:,jcol,icol)
531  if (i_coarsedustnumber>0) dcoarsedustnumber(:,1,1) = current_state%sq(i_coarsedustnumber)%data(:,jcol,icol)
532  if (i_activeinsolice>0) activeinsolice(:,1,1) = current_state%zq(i_activeinsolice)%data(:,jcol,icol)
533  if (i_activeinsolice>0) dactiveinsolice(:,1,1) = current_state%sq(i_activeinsolice)%data(:,jcol,icol)
534  if (i_activesolice>0) activesolice(:,1,1) = current_state%zq(i_activesolice)%data(:,jcol,icol)
535  if (i_activesolice>0) dactivesolice(:,1,1) = current_state%sq(i_activesolice)%data(:,jcol,icol)
536  if (i_activeinsolliquid>0) activeinsolliquid(:,1,1) = current_state%zq(i_activeinsolliquid)%data(:,jcol,icol)
537  if (i_activeinsolliquid>0)dactiveinsolliquid(:,1,1) = current_state%sq(i_activeinsolliquid)%data(:,jcol,icol)
538  if (i_accuminsolmass>0) accuminsolmass(:,1,1) = current_state%zq(i_accuminsolmass)%data(:,jcol,icol)
539  if (i_accuminsolmass>0) daccuminsolmass(:,1,1) = current_state%sq(i_accuminsolmass)%data(:,jcol,icol)
540  if (i_accuminsolnumber>0) accuminsolnumber(:,1,1) = current_state%zq(i_accuminsolnumber)%data(:,jcol,icol)
541  if (i_accuminsolnumber>0) daccuminsolnumber(:,1,1) = current_state%sq(i_accuminsolnumber)%data(:,jcol,icol)
542  if (i_activesolnumber>0) activesolnumber(:,1,1) = current_state%zq(i_activesolnumber)%data(:,jcol,icol)
543  if (i_activesolnumber>0) dactivesolnumber(:,1,1) = current_state%sq(i_activesolnumber)%data(:,jcol,icol)
544  if (i_activeinsolnumber>0) activeinsolnumber(:,1,1) = current_state%zq(i_activeinsolnumber)%data(:,jcol,icol)
545  if (i_activeinsolnumber>0)dactiveinsolnumber(:,1,1) = current_state%sq(i_activeinsolnumber)%data(:,jcol,icol)
546 
547  CALL shipway_microphysics( &
548  ! in
549  its, ite, &
550  jts, jte, &
551  kts, kte, &
552  dtwp, &
553  qv, qc, qr, &
554  nc, nr, m3r, &
555  qi, qs, qg, &
556  ni, ns, ng, &
557  m3s, m3g, &
558  theta, &
562  activesolliquid, &
563  activesolrain, &
565  activeinsolice, &
566  activesolice, &
568  accuminsolmass, &
570  activesolnumber, &
572  exner, &
573  pressure, rho, &
574  w, tke, &
575  z_half, z_centre, &
576  dz, &
577  ! in/out
578  dqv, dqc, dqr, dnc, dnr, dm3r, &
579  dqi, dqs, dqg, dni, dns, dng, dm3s, dm3g, &
580  dth, &
585  dactivesolrain, &
587  dactiveinsolice, &
588  dactivesolice, &
590  daccuminsolmass, &
594  ils, ile, &
595  jls, jle, &
596  kls, kle, &
597  l_tendency=.true. &
598  )
599 
600  ! write back the tendencies
601  current_state%sth%data(:,jcol,icol) = current_state%sth%data(:,jcol,icol) + dth(:,1,1)
602 
603  iqx = iqv
604  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dqv(:,1,1)
605 
606  ! Warm microphysical fields
607  IF (nq_l > 0)then
608  iqx = iql
609  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dqc(:,1,1)
610  end IF
611 
612  IF (nq_r > 0)then
613  iqx = iqr
614  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dqr(:,1,1)
615  end IF
616  IF (nq_l > 1)then
617  iqx = inl
618  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dnc(:,1,1)
619  end IF
620  IF (nq_r > 1)then
621  iqx = inr
622  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dnr(:,1,1)
623  end IF
624  IF (nq_r > 2)then
625  iqx = i3mr
626  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dm3r(:,1,1)
627  end IF
628 
629  ! Ice microphysical fields
630  IF (nq_i > 0)then
631  iqx = iqi
632  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dqi(:,1,1)
633  end IF
634  IF (nq_s > 0)then
635  iqx = iqs
636  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dqs(:,1,1)
637  end IF
638  IF (nq_g > 0)then
639  iqx = iqg
640  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dqg(:,1,1)
641  end IF
642  IF (nq_i > 1)then
643  iqx = ini
644  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dni(:,1,1)
645  end IF
646  IF (nq_s > 1)then
647  iqx = ins
648  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dns(:,1,1)
649  end IF
650  IF (nq_g > 1)then
651  iqx = ing
652  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dng(:,1,1)
653  end IF
654  IF (nq_s > 2)then
655  iqx = i3ms
656  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dm3s(:,1,1)
657  end IF
658  IF (nq_g > 2)then
659  iqx = i3mg
660  current_state%sq(iqx)%data(:,jcol,icol) = current_state%sq(iqx)%data(:,jcol,icol) + dm3g(:,1,1)
661  end IF
662 
663  ! Aerosol fields
664 
665  if (i_aitkensolmass>0) current_state%sq(i_aitkensolmass)%data(:,jcol,icol) &
666  = current_state%sq(i_aitkensolmass)%data(:,jcol,icol) + daitkensolmass(:,1,1)
667  if (i_aitkensolnumber>0) current_state%sq(i_aitkensolnumber)%data(:,jcol,icol) &
668  = current_state%sq(i_aitkensolnumber)%data(:,jcol,icol) + daitkensolnumber(:,1,1)
669  if (i_accumsolmass>0) current_state%sq(i_accumsolmass)%data(:,jcol,icol) &
670  = current_state%sq(i_accumsolmass)%data(:,jcol,icol) + daccumsolmass(:,1,1)
671  if (i_accumsolnumber>0) current_state%sq(i_accumsolnumber)%data(:,jcol,icol) &
672  = current_state%sq(i_accumsolnumber)%data(:,jcol,icol) + daccumsolnumber(:,1,1)
673  if (i_coarsesolmass>0) current_state%sq(i_coarsesolmass)%data(:,jcol,icol) &
674  = current_state%sq(i_coarsesolmass)%data(:,jcol,icol) + dcoarsesolmass(:,1,1)
675  if (i_coarsesolnumber>0) current_state%sq(i_coarsesolnumber)%data(:,jcol,icol) &
676  = current_state%sq(i_coarsesolnumber)%data(:,jcol,icol) + dcoarsesolnumber(:,1,1)
677  if (i_activesolliquid>0) current_state%sq(i_activesolliquid)%data(:,jcol,icol) &
678  = current_state%sq(i_activesolliquid)%data(:,jcol,icol) + dactivesolliquid(:,1,1)
679  if (i_coarsedustmass>0) current_state%sq(i_coarsedustmass)%data(:,jcol,icol) &
680  = current_state%sq(i_coarsedustmass)%data(:,jcol,icol) + dcoarsedustmass(:,1,1)
681  if (i_coarsedustnumber>0) current_state%sq(i_coarsedustnumber)%data(:,jcol,icol) &
682  = current_state%sq(i_coarsedustnumber)%data(:,jcol,icol) + dcoarsedustnumber(:,1,1)
683  if (i_activeinsolice>0) current_state%sq(i_activeinsolice)%data(:,jcol,icol) &
684  = current_state%sq(i_activeinsolice)%data(:,jcol,icol) + dactiveinsolice(:,1,1)
685  if (i_activesolice>0) current_state%sq(i_activesolice)%data(:,jcol,icol) &
686  = current_state%sq(i_activesolice)%data(:,jcol,icol) + dactivesolice(:,1,1)
687  if (i_activeinsolliquid>0) current_state%sq(i_activeinsolliquid)%data(:,jcol,icol) &
688  = current_state%sq(i_activeinsolliquid)%data(:,jcol,icol) + dactiveinsolliquid(:,1,1)
689  if (i_accuminsolmass>0) current_state%sq(i_accuminsolmass)%data(:,jcol,icol) &
690  = current_state%sq(i_accuminsolmass)%data(:,jcol,icol) + daccuminsolmass(:,1,1)
691  if (i_accuminsolnumber>0) current_state%sq(i_accuminsolnumber)%data(:,jcol,icol) &
692  = current_state%sq(i_accuminsolnumber)%data(:,jcol,icol) + daccuminsolnumber(:,1,1)
693  if (i_activesolnumber>0) current_state%sq(i_activesolnumber)%data(:,jcol,icol) &
694  = current_state%sq(i_activesolnumber)%data(:,jcol,icol) + dactivesolnumber(:,1,1)
695  if (i_activeinsolnumber>0) current_state%sq(i_activeinsolnumber)%data(:,jcol,icol) &
696  = current_state%sq(i_activeinsolnumber)%data(:,jcol,icol) + dactiveinsolnumber(:,1,1)
697 
698  ! for total surface precipitation, sum the surface rain rate (cloud + rain which is precip_r)
699  ! and surface
700  ! snow rate (precip_s), which is the sum of ice, snow and graupel (See micromain.F90 in casim for
701  ! calculation).
702  surface_precip(target_y_index,target_x_index) = &
703  casdiags % SurfaceRainR(1,1) + casdiags % SurfaceSnowR(1,1)
704 
705  end subroutine timestep_callback
706 
707 
708  !! Reads the casim configuration
709  !! @param current_state The current model state
710  subroutine read_configuration(current_state)
712 
713  Use mphys_switches, only: iopt_act, option, aerosol_option &
714  , l_aaut, l_aacc, l_aevp, l_ased, l_warm &
715  , l_inuc, iopt_rcrit, iopt_inuc, l_iaut, l_iacw &
716  , l_rain, l_boussinesq, diag_mu_option &
717  , l_sed_3mdiff, l_cons, l_abelshipway, l_sed_icecloud_as_1m &
718  , l_active_inarg2000, process_level, l_separate_rain, l_idep &
719  , max_step_length, max_sed_length, l_sg, l_g, l_passive &
720  , l_passive3m, l_limit_psd, l_override_checks &
721  , max_mu, fix_mu, l_raci_g, l_onlycollect, l_inhom_revp &
722  , l_tidy_conserve_e , l_tidy_conserve_q &
723  , l_pcond & ! Condensation
724  , l_praut & ! Autoconversion cloud -> rain
725  , l_pracw & ! Accretion cloud -> rain
726  , l_pracr & ! aggregation of rain drops
727  , l_prevp & ! evaporation of rain
728  , l_psedl & ! sedimentation of cloud
729  , l_psedr & ! sedimentation of rain
730  , l_ptidy & ! tidying term 1
731  , l_ptidy2 & ! tidying term 2
732  , l_pinuc & ! ice nucleation
733  , l_pidep & ! ice deposition
734  , l_piacw & ! ice accreting water
735  , l_psaut & ! ice autoconversion ice -> snow
736  , l_psdep & ! vapour deposition onto snow
737  , l_psacw & ! snow accreting water
738  , l_pgdep & ! vapour deposition onto graupel
739  , l_pseds & ! snow sedimentation
740  , l_psedi & ! ice sedimentation
741  , l_psedg & ! graupel sedimentation
742  , l_psaci & ! snow accreting ice
743  , l_praci & ! rain accreting ice
744  , l_psacr & ! snow accreting rain
745  , l_pgacr & ! graupel accreting rain
746  , l_pgacw & ! graupel accreting cloud water
747  , l_pgaci & ! graupel accreting ice
748  , l_pgacs & ! graupel accreting snow
749  , l_piagg & ! aggregation of ice particles
750  , l_psagg & ! aggregation of snow particles
751  , l_pgagg & ! aggregation of graupel particles
752  , l_psbrk & ! break up of snow flakes
753  , l_pgshd & ! shedding of liquid from graupel
754  , l_pihal & ! hallet mossop
755  , l_psmlt & ! snow melting
756  , l_pgmlt & ! graupel melting
757  , l_phomr & ! homogeneous freezing of rain
758  , l_phomc & ! homogeneous freezing of cloud droplets
759  , l_pssub & ! sublimation of snow
760  , l_pgsub & ! sublimation of graupel
761  , l_pisub & ! sublimation of ice
762  , l_pimlt ! ice melting
763 
764  Use mphys_parameters, only: p1, p2, p3, sp1, sp2, sp3
765 
766  type(model_state_type), target, intent(inout) :: current_state
767 
768  integer :: ierr
769 
770  option = options_get_integer(current_state%options_database, 'option')
771  diag_mu_option = options_get_integer(current_state%options_database, 'diag_mu_option')
772  iopt_act = options_get_integer(current_state%options_database, 'iopt_act')
773  iopt_inuc = options_get_integer(current_state%options_database, 'iopt_inuc')
774  process_level = options_get_integer(current_state%options_database, 'process_level')
775  aerosol_option = options_get_integer(current_state%options_database, 'aerosol_option')
776  max_step_length = options_get_real(current_state%options_database, 'max_step_length')
777  max_sed_length = options_get_real(current_state%options_database, 'max_sed_length')
778  p1 = options_get_real(current_state%options_database, 'p1')
779  p2 = options_get_real(current_state%options_database, 'p2')
780  p3 = options_get_real(current_state%options_database, 'p3')
781  sp1 = options_get_real(current_state%options_database, 'sp1')
782  sp2 = options_get_real(current_state%options_database, 'sp2')
783  sp3 = options_get_real(current_state%options_database, 'sp3')
784  max_mu = options_get_real(current_state%options_database, 'max_mu')
785  fix_mu = options_get_real(current_state%options_database, 'fix_mu')
786 
787  l_aaut = options_get_logical(current_state%options_database, 'l_aaut')
788  l_aacc = options_get_logical(current_state%options_database, 'l_aacc')
789  l_aevp = options_get_logical(current_state%options_database, 'l_aevp')
790  l_ased = options_get_logical(current_state%options_database, 'l_ased')
791  l_warm = options_get_logical(current_state%options_database, 'l_warm')
792  l_inuc = options_get_logical(current_state%options_database, 'l_inuc')
793  l_iaut = options_get_logical(current_state%options_database, 'l_iaut')
794  l_idep = options_get_logical(current_state%options_database, 'l_idep')
795  l_iacw = options_get_logical(current_state%options_database, 'l_iacw')
796  l_active_inarg2000 = options_get_logical(current_state%options_database, 'l_active_inarg2000')
797  l_separate_rain = options_get_logical(current_state%options_database, 'l_separate_rain')
798  l_sg = options_get_logical(current_state%options_database, 'l_sg')
799  l_g = options_get_logical(current_state%options_database, 'l_g')
800  l_passive = options_get_logical(current_state%options_database, 'l_passive')
801  l_passive3m = options_get_logical(current_state%options_database, 'l_passive3m')
802  l_limit_psd = options_get_logical(current_state%options_database, 'l_limit_psd')
803  l_override_checks = options_get_logical(current_state%options_database, 'l_override_checks')
804  l_raci_g = options_get_logical(current_state%options_database, 'l_raci_g')
805  l_onlycollect = options_get_logical(current_state%options_database, 'l_onlycollect')
806  l_abelshipway = options_get_logical(current_state%options_database, 'l_abelshipway')
807  l_cons = options_get_logical(current_state%options_database, 'l_cons')
808  l_rain = options_get_logical(current_state%options_database, 'l_rain')
809  l_sed_3mdiff = options_get_logical(current_state%options_database, 'l_sed_3mdiff')
810  l_sed_icecloud_as_1m = options_get_logical(current_state%options_database, 'l_sed_icecloud_as_1m')
811  l_tidy_conserve_e = options_get_logical(current_state%options_database, 'l_tidy_conserve_E')
812  l_tidy_conserve_q = options_get_logical(current_state%options_database, 'l_tidy_conserve_q')
813 
814  l_inhom_revp = options_get_logical(current_state%options_database, 'l_inhom_revp')
815  l_pcond = options_get_logical(current_state%options_database, 'l_pcond')
816  l_praut = options_get_logical(current_state%options_database, 'l_praut')
817  l_pracw = options_get_logical(current_state%options_database, 'l_pracw')
818  l_pracr = options_get_logical(current_state%options_database, 'l_pracr')
819  l_prevp = options_get_logical(current_state%options_database, 'l_prevp')
820  l_psedl = options_get_logical(current_state%options_database, 'l_psedl')
821  l_psedr = options_get_logical(current_state%options_database, 'l_psedr')
822  l_ptidy = options_get_logical(current_state%options_database, 'l_ptidy')
823  l_ptidy2 = options_get_logical(current_state%options_database, 'l_ptidy2')
824  l_pinuc = options_get_logical(current_state%options_database, 'l_pinuc')
825  l_pidep = options_get_logical(current_state%options_database, 'l_pidep')
826  l_piacw = options_get_logical(current_state%options_database, 'l_piacw')
827  l_psaut = options_get_logical(current_state%options_database, 'l_psaut')
828  l_psdep = options_get_logical(current_state%options_database, 'l_psdep')
829  l_psacw = options_get_logical(current_state%options_database, 'l_psacw')
830  l_pgdep = options_get_logical(current_state%options_database, 'l_pgdep')
831  l_pseds = options_get_logical(current_state%options_database, 'l_pseds')
832  l_psedi = options_get_logical(current_state%options_database, 'l_psedi')
833  l_psedg = options_get_logical(current_state%options_database, 'l_psedg')
834  l_psaci = options_get_logical(current_state%options_database, 'l_psaci')
835  l_praci = options_get_logical(current_state%options_database, 'l_praci')
836  l_psacr = options_get_logical(current_state%options_database, 'l_psacr')
837  l_pgacr = options_get_logical(current_state%options_database, 'l_pgacr')
838  l_pgacw = options_get_logical(current_state%options_database, 'l_pgacw')
839  l_pgaci = options_get_logical(current_state%options_database, 'l_pgaci')
840  l_pgacs = options_get_logical(current_state%options_database, 'l_pgacs')
841  l_piagg = options_get_logical(current_state%options_database, 'l_piagg')
842  l_psagg = options_get_logical(current_state%options_database, 'l_psagg')
843  l_pgagg = options_get_logical(current_state%options_database, 'l_pgagg')
844  l_psbrk = options_get_logical(current_state%options_database, 'l_psbrk')
845  l_pgshd = options_get_logical(current_state%options_database, 'l_pgshd')
846  l_pihal = options_get_logical(current_state%options_database, 'l_pihal')
847  l_psmlt = options_get_logical(current_state%options_database, 'l_psmlt')
848  l_pgmlt = options_get_logical(current_state%options_database, 'l_pgmlt')
849  l_phomr = options_get_logical(current_state%options_database, 'l_phomr')
850  l_phomc = options_get_logical(current_state%options_database, 'l_phomc')
851  l_pssub = options_get_logical(current_state%options_database, 'l_pssub')
852  l_pgsub = options_get_logical(current_state%options_database, 'l_pgsub')
853  l_pisub = options_get_logical(current_state%options_database, 'l_pisub')
854  l_pimlt = options_get_logical(current_state%options_database, 'l_pimlt')
855 
856  end subroutine read_configuration
857 
858 end module casim_mod
real(wp), dimension(:,:,:), allocatable dz
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable qr
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable dqi
Definition: casim.F90:61
integer i_accumsolnumber
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable dth
Definition: casim.F90:61
integer i_activeinsolnumber
Definition: casim.F90:88
integer iqr
Definition: casim.F90:85
subroutine field_value_retrieval_callback(current_state, name, field_value)
Field value retrieval callback, this returns the value of a specific published field.
Definition: casim.F90:147
integer iqg
Definition: casim.F90:85
real(wp), dimension(:,:,:), allocatable dactiveinsolnumber
Definition: casim.F90:78
real(wp), dimension(:,:,:), allocatable activesolrain
Definition: casim.F90:48
integer i_coarsedustmass
Definition: casim.F90:88
integer kls
Definition: casim.F90:82
Wrapper type for the value returned for a published field from a component.
real(wp), dimension(:,:,:), allocatable qc
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable activesolice
Definition: casim.F90:51
integer its
Definition: casim.F90:82
integer jle
Definition: casim.F90:82
real(wp), dimension(:,:,:), allocatable m3g
Definition: casim.F90:37
integer, parameter, public forward_stepping
Definition: state.F90:15
type(standard_q_names_type), public standard_q_names
Definition: q_indices.F90:59
real(wp), dimension(:,:,:), allocatable dqg
Definition: casim.F90:61
real(wp), dimension(:,:,:), allocatable dm3g
Definition: casim.F90:61
integer inl
Definition: casim.F90:86
real(wp), dimension(:,:,:), allocatable daitkensolmass
Definition: casim.F90:68
integer kle
Definition: casim.F90:82
integer, parameter, public log_error
Only log ERROR messages.
Definition: logging.F90:11
integer ing
Definition: casim.F90:86
real(wp), dimension(:,:,:), allocatable dm3r
Definition: casim.F90:61
real(wp), dimension(:,:,:), allocatable nr
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable nc
Definition: casim.F90:37
integer iqs
Definition: casim.F90:85
subroutine initialisation_callback(current_state)
The initialisation callback sets up the microphysics.
Definition: casim.F90:164
real(wp), dimension(:,:,:), allocatable dqv
Definition: casim.F90:61
real(wp), dimension(:,:,:), allocatable dnr
Definition: casim.F90:61
Logging utility.
Definition: logging.F90:2
real(wp), dimension(:,:,:), allocatable aitkensolmass
Definition: casim.F90:46
real(wp), dimension(:,:,:), allocatable dactiveinsolice
Definition: casim.F90:72
integer, parameter, public default_precision
MPI communication type which we use for the prognostic and calculation data.
Definition: datadefn.F90:17
integer, parameter, public z_index
Grid index parameters.
Definition: grids.F90:14
real(wp), dimension(:,:,:), allocatable dcoarsedustmass
Definition: casim.F90:71
real(wp), dimension(:,:,:), allocatable exner
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable coarsedustnumber
Definition: casim.F90:49
real(wp), dimension(:,:,:), allocatable w
Definition: casim.F90:37
Contains common definitions for the data and datatypes used by MONC.
Definition: datadefn.F90:2
real(wp), dimension(:,:,:), allocatable daccumsolmass
Definition: casim.F90:66
The ModelState which represents the current state of a run.
Definition: state.F90:39
logical function, public is_component_enabled(options_database, component_name)
Determines whether or not a specific component is registered and enabled.
Definition: registry.F90:334
subroutine, public log_master_log(level, message)
Will log just from the master process.
Definition: logging.F90:47
integer ini
Definition: casim.F90:86
integer i_activesolrain
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable ni
Definition: casim.F90:37
integer i_coarsedustnumber
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable dactivesolrain
Definition: casim.F90:70
real(wp), dimension(:,:,:), allocatable qv
Definition: casim.F90:37
integer i_aitkensolmass
Definition: casim.F90:88
integer, parameter, public component_array_field_type
integer ins
Definition: casim.F90:86
integer i_accuminsolmass
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable ng
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable daitkensolnumber
Definition: casim.F90:68
real(wp), dimension(:,:,:), allocatable dactivesolnumber
Definition: casim.F90:77
real(wp), dimension(:,:,:), allocatable m3r
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable ns
Definition: casim.F90:37
Scientific constant values used throughout simulations. Each has a default value and this can be over...
real(wp), dimension(:,:,:), allocatable activeinsolliquid
Definition: casim.F90:52
real(wp), dimension(:,:,:), allocatable coarsesolmass
Definition: casim.F90:47
real(wp), dimension(:,:,:), allocatable activeinsolnumber
Definition: casim.F90:56
real(wp), dimension(:,:,:), allocatable accuminsolnumber
Definition: casim.F90:54
This manages the Q variables and specifically the mapping between names and the index that they are s...
Definition: q_indices.F90:2
real(wp), dimension(:,:,:), allocatable activesolliquid
Definition: casim.F90:45
real(wp), dimension(:,:,:), allocatable dni
Definition: casim.F90:61
integer kte
Definition: casim.F90:82
real(wp), dimension(:,:,:), allocatable qg
Definition: casim.F90:37
integer kts
Definition: casim.F90:82
integer i_activeinsolliquid
Definition: casim.F90:88
Interfaces and types that MONC components must specify.
integer i_activesolnumber
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable accumsolmass
Definition: casim.F90:44
real(wp), dimension(:,:,:), allocatable dnc
Definition: casim.F90:61
integer jls
Definition: casim.F90:82
subroutine read_configuration(current_state)
Definition: casim.F90:711
real(wp), dimension(:,:,:), allocatable accumsolnumber
Definition: casim.F90:44
real(wp), dimension(:,:,:), allocatable dqc
Definition: casim.F90:61
integer iqi
Definition: casim.F90:85
real(wp), dimension(:,:,:), allocatable theta
Definition: casim.F90:37
type(component_descriptor_type) function, public casim_get_descriptor()
Provides the descriptor back to the caller and is used in component registration. ...
Definition: casim.F90:113
real(wp), dimension(:,:,:), allocatable m3s
Definition: casim.F90:37
integer i_coarsesolnumber
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable tke
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable dactivesolliquid
Definition: casim.F90:67
integer i_activeinsolice
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable dactiveinsolliquid
Definition: casim.F90:74
real(wp), dimension(:,:,:), allocatable dns
Definition: casim.F90:61
real(wp), dimension(:,:,:), allocatable activesolnumber
Definition: casim.F90:55
real(wp), dimension(:,:,:), allocatable dcoarsesolmass
Definition: casim.F90:69
integer jts
Definition: casim.F90:82
integer i_aitkensolnumber
Definition: casim.F90:88
real(kind=default_precision) function, public options_get_real(options_database, key, index)
Retrieves a real value from the database that matches the provided key.
integer i3mg
Definition: casim.F90:87
real(wp), dimension(:,:,:), allocatable dqs
Definition: casim.F90:61
Implimentation of CASIM microphysics.
Definition: casim.F90:2
Functionality to support the different types of grid and abstraction between global grids and local o...
Definition: grids.F90:5
integer ite
Definition: casim.F90:82
integer i_coarsesolmass
Definition: casim.F90:88
integer i3mr
Definition: casim.F90:87
real(wp), dimension(:,:,:), allocatable coarsesolnumber
Definition: casim.F90:47
integer inr
Definition: casim.F90:86
integer function, public options_get_integer(options_database, key, index)
Retrieves an integer value from the database that matches the provided key.
integer i_activesolliquid
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable aitkensolnumber
Definition: casim.F90:46
Manages the options database. Contains administration functions and deduce runtime options from the c...
integer i3ms
Definition: casim.F90:87
real(wp), dimension(:,:,:), allocatable qi
Definition: casim.F90:37
integer, parameter, public log_info
Log INFO, WARNING and ERROR messages.
Definition: logging.F90:13
real(wp), dimension(:,:,:), allocatable dcoarsedustnumber
Definition: casim.F90:71
logical function, public options_get_logical(options_database, key, index)
Retrieves a logical value from the database that matches the provided key.
integer i_accumsolmass
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable daccuminsolnumber
Definition: casim.F90:76
integer i_activesolice
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable accuminsolmass
Definition: casim.F90:53
integer i_accuminsolnumber
Definition: casim.F90:88
real(wp), dimension(:,:,:), allocatable daccumsolnumber
Definition: casim.F90:66
real(wp), dimension(:,:,:), allocatable activeinsolice
Definition: casim.F90:50
real(wp), dimension(:,:,:), allocatable daccuminsolmass
Definition: casim.F90:75
subroutine timestep_callback(current_state)
Called for each column per timestep this will calculate the microphysical tendencies.
Definition: casim.F90:375
integer iqv
Definition: casim.F90:85
integer ile
Definition: casim.F90:82
real(wp), dimension(:,:,:), allocatable dcoarsesolnumber
Definition: casim.F90:69
real(wp), dimension(:,:,:), allocatable dng
Definition: casim.F90:61
real(wp), dimension(:,:,:), allocatable z_half
Definition: casim.F90:37
integer jte
Definition: casim.F90:82
The model state which represents the current state of a run.
Definition: state.F90:2
real(wp), dimension(:,:,:), allocatable z_centre
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable coarsedustmass
Definition: casim.F90:49
real(wp), dimension(:,:,:), allocatable dqr
Definition: casim.F90:61
integer, parameter, public y_index
Definition: grids.F90:14
real(wp), dimension(:,:,:), allocatable rho
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable dm3s
Definition: casim.F90:61
integer, parameter, public x_index
Definition: grids.F90:14
real(wp), dimension(:,:), allocatable surface_precip
Definition: casim.F90:80
integer function, public get_q_index(name, assigning_component)
Add in a new entry into the register if the name does not already exist or return the index of the pr...
Definition: q_indices.F90:112
integer iql
Definition: casim.F90:85
real(wp), dimension(:,:,:), allocatable qs
Definition: casim.F90:37
real(wp), dimension(:,:,:), allocatable dactivesolice
Definition: casim.F90:73
integer ils
Definition: casim.F90:82
MONC component registry.
Definition: registry.F90:5
subroutine field_information_retrieval_callback(current_state, name, field_information)
Definition: casim.F90:128
integer, parameter, public component_double_data_type
real(wp), dimension(:,:,:), allocatable pressure
Definition: casim.F90:37