MONC
simplesetup.F90
Go to the documentation of this file.
5  use logging_mod, only : log_error, log_log
11  implicit none
12 
13 #ifndef TEST_MODE
14  private
15 #endif
16 
17  integer :: x_size, y_size, z_size
18  real(kind=DEFAULT_PRECISION) :: zztop, dxx, dyy
19  logical :: enable_theta=.false.
21 contains
22 
24  simplesetup_get_descriptor%name="simplesetup"
25  simplesetup_get_descriptor%version=0.1
27  end function simplesetup_get_descriptor
28 
29  subroutine initialisation_callback(current_state)
30  type(model_state_type), intent(inout), target :: current_state
31 
32  call read_configuration(current_state)
33  if (.not. current_state%initialised) then
34  current_state%dtm=options_get_real(current_state%options_database, "dtm")
35  current_state%dtm_new=current_state%dtm
36  call create_grid(current_state, current_state%global_grid)
37  call decompose_grid(current_state)
38  call allocate_prognostics(current_state)
39  current_state%initialised=.true.
40 
41  end if
42  end subroutine initialisation_callback
43 
44 
45  subroutine allocate_prognostics(current_state)
46  type(model_state_type), intent(inout) :: current_state
47 
48  integer :: alloc_z, alloc_y, alloc_x, i
49 
50  alloc_z=current_state%local_grid%size(z_index) + current_state%local_grid%halo_size(z_index) * 2
51  alloc_y=current_state%local_grid%size(y_index) + current_state%local_grid%halo_size(y_index) * 2
52  alloc_x=current_state%local_grid%size(x_index) + current_state%local_grid%halo_size(x_index) * 2
53 
54 #ifdef U_ACTIVE
55  call allocate_prognostic(current_state%u, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, primal_grid)
56  call allocate_prognostic(current_state%zu, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, primal_grid)
57  call allocate_prognostic(current_state%su, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, primal_grid)
58  call allocate_prognostic(current_state%savu, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, primal_grid)
59 #endif
60 #ifdef V_ACTIVE
61  call allocate_prognostic(current_state%v, alloc_z, alloc_y, alloc_x, dual_grid, primal_grid, dual_grid)
62  call allocate_prognostic(current_state%zv, alloc_z, alloc_y, alloc_x, dual_grid, primal_grid, dual_grid)
63  call allocate_prognostic(current_state%sv, alloc_z, alloc_y, alloc_x, dual_grid, primal_grid, dual_grid)
64  call allocate_prognostic(current_state%savv, alloc_z, alloc_y, alloc_x, dual_grid, primal_grid, dual_grid)
65 #endif
66 #ifdef W_ACTIVE
67  call allocate_prognostic(current_state%w, alloc_z, alloc_y, alloc_x, primal_grid, dual_grid, dual_grid)
68  call allocate_prognostic(current_state%zw, alloc_z, alloc_y, alloc_x, primal_grid, dual_grid, dual_grid)
69  call allocate_prognostic(current_state%sw, alloc_z, alloc_y, alloc_x, primal_grid, dual_grid, dual_grid)
70  call allocate_prognostic(current_state%savw, alloc_z, alloc_y, alloc_x, primal_grid, dual_grid, dual_grid)
71 #endif
72 
73  if (enable_theta) then
74  call allocate_prognostic(current_state%th, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, dual_grid)
75  call allocate_prognostic(current_state%zth, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, dual_grid)
76  call allocate_prognostic(current_state%sth, alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, dual_grid)
77  end if
78  if (current_state%number_q_fields .gt. 0) then
79  allocate(current_state%q(current_state%number_q_fields), &
80  current_state%zq(current_state%number_q_fields), current_state%sq(current_state%number_q_fields))
81  do i=1, current_state%number_q_fields
82  call allocate_prognostic(current_state%q(i), alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, dual_grid)
83  call allocate_prognostic(current_state%zq(i), alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, dual_grid)
84  call allocate_prognostic(current_state%sq(i), alloc_z, alloc_y, alloc_x, dual_grid, dual_grid, dual_grid)
85  end do
86 
87  ! Set standard q indices
88  current_state%water_vapour_mixing_ratio_index=get_q_index(standard_q_names%VAPOUR, 'simplesetup')
89  current_state%liquid_water_mixing_ratio_index=get_q_index(standard_q_names%CLOUD_LIQUID_MASS, 'simplesetup')
90  end if
91 
92 
93  end subroutine allocate_prognostics
94 
95  subroutine allocate_prognostic(field, alloc_z, alloc_y, alloc_x, z_grid, y_grid, x_grid)
96  type(prognostic_field_type), intent(inout) :: field
97  integer, intent(in) :: alloc_z, alloc_y, alloc_x, z_grid, y_grid, x_grid
98 
99  field%active=.true.
100  field%grid(z_index) = z_grid
101  field%grid(y_index) = y_grid
102  field%grid(x_index) = x_grid
103  allocate(field%data(alloc_z, alloc_y, alloc_x))
104  field%data=0.0_default_precision
105  end subroutine allocate_prognostic
106 
107  subroutine decompose_grid(current_state)
108  type(model_state_type), intent(inout) :: current_state
109 
110  if (associated(current_state%parallel%decomposition_procedure)) then
111  call current_state%parallel%decomposition_procedure(current_state)
112  else
113  call log_log(log_error, "No decomposition specified")
114  end if
115  end subroutine decompose_grid
116 
117  subroutine create_grid(current_state, specific_grid)
118  type(model_state_type), intent(inout) :: current_state
119  type(global_grid_type), intent(inout) :: specific_grid
120 
121  integer, parameter :: KGD_SIZE=20
122  integer :: number_kgd, i, kgd(kgd_size)
123  real(kind=DEFAULT_PRECISION) :: hgd(kgd_size)
124 
125  kgd=-1
126 
127  call options_get_integer_array(current_state%options_database, "kgd", kgd)
128  call options_get_real_array(current_state%options_database, "hgd", hgd)
129 
130  if (kgd(1)==1)then
131  if (hgd(1)/=0.0_default_precision)then
132  call log_log(log_error, "Lowest level is assumed to lie at the surface, check hgd(1)")
133  else
134  kgd(1:kgd_size-1) = kgd(2:)
135  hgd(1:kgd_size-1) = hgd(2:)
136  end if
137  end if
138 
139  do i=1,size(kgd)
140  if (kgd(i) == -1) exit
141  end do
142  number_kgd=i-1
143 
144  if (number_kgd .gt. 0) then
145  allocate(current_state%global_grid%configuration%vertical%kgd(number_kgd), &
146  current_state%global_grid%configuration%vertical%hgd(number_kgd))
147  current_state%global_grid%configuration%vertical%kgd=kgd(1:number_kgd)
148  current_state%global_grid%configuration%vertical%hgd=hgd(1:number_kgd)
149  end if
150 
151  specific_grid%bottom(z_index) = 0
152  specific_grid%bottom(y_index) = 0
153  specific_grid%bottom(x_index) = 0
154 
155  specific_grid%top(z_index) = zztop
156  specific_grid%top(y_index) = dyy * y_size
157  specific_grid%top(x_index) = dxx * x_size
158 
159  specific_grid%resolution(z_index) = zztop / z_size
160  specific_grid%resolution(y_index) = dyy
161  specific_grid%resolution(x_index) = dxx
162 
163  specific_grid%size(z_index) = z_size
164  specific_grid%size(y_index) = y_size
165  specific_grid%size(x_index) = x_size
166 
167  specific_grid%active(z_index) = .true.
168  specific_grid%active(y_index) = .true.
169  specific_grid%active(x_index) = .true.
170 
171  specific_grid%dimensions = 3
172  end subroutine create_grid
173 
174  subroutine read_configuration(current_state)
175  type(model_state_type), intent(inout), target :: current_state
176 
177  current_state%rhobous=options_get_real(current_state%options_database, "rhobous")
178  current_state%thref0=options_get_real(current_state%options_database, "thref0")
179  current_state%number_q_fields=options_get_integer(current_state%options_database, "number_q_fields")
180  current_state%surface_pressure=options_get_real(current_state%options_database, "surface_pressure")
181  current_state%surface_reference_pressure=options_get_real(current_state%options_database, "surface_reference_pressure")
182 
183  current_state%use_anelastic_equations=options_get_logical(current_state%options_database, "use_anelastic_equations")
184 
185  current_state%origional_vertical_grid_setup=options_get_logical(current_state%options_database, &
186  "origional_vertical_grid_setup")
187  current_state%passive_q=options_get_logical(current_state%options_database, "passive_q")
188  current_state%passive_th=options_get_logical(current_state%options_database, "passive_th")
189  current_state%rmlmax=options_get_real(current_state%options_database, "rmlmax")
190  current_state%calculate_th_and_q_init=options_get_logical(current_state%options_database, "calculate_th_and_q_init")
191  current_state%use_viscosity_and_diffusion=options_get_logical(current_state%options_database, "use_viscosity_and_diffusion")
192  current_state%backscatter=options_get_logical(current_state%options_database, "backscatter")
193 
194  x_size=options_get_integer(current_state%options_database, "x_size")
195  y_size=options_get_integer(current_state%options_database, "y_size")
196  z_size=options_get_integer(current_state%options_database, "z_size")
197  dxx=options_get_real(current_state%options_database, "dxx")
198  dyy=options_get_real(current_state%options_database, "dyy")
199  zztop=options_get_real(current_state%options_database, "zztop")
200  enable_theta=options_get_logical(current_state%options_database, "enable_theta")
201 
202  if (current_state%rmlmax<=0.0)current_state%rmlmax=0.23 * max(dxx, dyy)
203 
204  if (.not. enable_theta) current_state%passive_th=.true.
205  if ( current_state%number_q_fields == 0) current_state%passive_q=.true.
206 
207  current_state%galilean_transformation=options_get_logical(current_state%options_database, "galilean_transformation")
208  if (current_state%galilean_transformation)then
209  current_state%fix_ugal=options_get_logical(current_state%options_database, "fix_ugal")
210  current_state%fix_vgal=options_get_logical(current_state%options_database, "fix_vgal")
211  if (current_state%fix_ugal)current_state%ugal=options_get_real(current_state%options_database, "ugal")
212  if (current_state%fix_vgal)current_state%vgal=options_get_real(current_state%options_database, "vgal")
213  end if
214 
215  end subroutine read_configuration
216 end module simplesetup_mod
subroutine decompose_grid(current_state)
type(standard_q_names_type), public standard_q_names
Definition: q_indices.F90:59
integer, parameter, public dual_grid
Definition: grids.F90:16
subroutine initialisation_callback(current_state)
Definition: simplesetup.F90:30
integer, parameter, public log_error
Only log ERROR messages.
Definition: logging.F90:11
Contains prognostic field definitions and functions.
Definition: prognostics.F90:2
A prognostic field which is assumed to be 3D.
Definition: prognostics.F90:13
Logging utility.
Definition: logging.F90:2
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
Contains common definitions for the data and datatypes used by MONC.
Definition: datadefn.F90:2
The ModelState which represents the current state of a run.
Definition: state.F90:39
subroutine, public options_get_integer_array(options_database, key, array_data, from, to)
Retrieves an entire (or subset) integer array.
integer, parameter, public prescribed_surface_fluxes
Definition: state.F90:15
subroutine allocate_prognostic(field, alloc_z, alloc_y, alloc_x, z_grid, y_grid, x_grid)
Definition: simplesetup.F90:96
subroutine, public log_log(level, message, str)
Logs a message at the specified level. If the level is above the current level then the message is ig...
Definition: logging.F90:75
Defines the global grid.
Definition: grids.F90:100
This manages the Q variables and specifically the mapping between names and the index that they are s...
Definition: q_indices.F90:2
real(kind=default_precision) dyy
Definition: simplesetup.F90:18
Interfaces and types that MONC components must specify.
type(component_descriptor_type) function, public simplesetup_get_descriptor()
Definition: simplesetup.F90:24
Defined the local grid, i.e. the grid held on this process after decomposition.
Definition: grids.F90:111
real(kind=default_precision) dxx
Definition: simplesetup.F90:18
integer, parameter, public primal_grid
Grid type parameters (usually applied to each dimension of a prognostic)
Definition: grids.F90:16
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.
Functionality to support the different types of grid and abstraction between global grids and local o...
Definition: grids.F90:5
subroutine create_grid(current_state, specific_grid)
subroutine allocate_prognostics(current_state)
Definition: simplesetup.F90:46
integer function, public options_get_integer(options_database, key, index)
Retrieves an integer value from the database that matches the provided key.
Manages the options database. Contains administration functions and deduce runtime options from the c...
logical function, public options_get_logical(options_database, key, index)
Retrieves a logical value from the database that matches the provided key.
logical enable_theta
Definition: simplesetup.F90:19
subroutine, public options_get_real_array(options_database, key, array_data, from, to)
Retrieves an entire (or subset) real array.
subroutine read_configuration(current_state)
The model state which represents the current state of a run.
Definition: state.F90:2
integer, parameter, public y_index
Definition: grids.F90:14
real(kind=default_precision) zztop
Definition: simplesetup.F90:18
integer, parameter, public x_index
Definition: grids.F90:14
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