33 & comin_descrdata_get_domain, t_comin_descrdata_domain, &
34 & comin_descrdata_get_global, t_comin_descrdata_global, &
36 & ep_secondary_constructor, ep_destructor, ep_atm_physics_before, &
37 & comin_flag_read, comin_flag_write, comin_zaxis_2d, &
39 & t_comin_plugin_info, comin_current_get_plugin_info, &
44 & comin_dim_semantics_nproma, comin_dim_semantics_level,&
45 & comin_dim_semantics_block, comin_dim_semantics_unused
50 CHARACTER(LEN=*),
PARAMETER :: pluginname =
"calc_water_column_plugin"
53 INTEGER,
PARAMETER :: wp = selected_real_kind(12,307)
54 TYPE(t_comin_setup_version_info) :: version
58 TYPE(t_comin_var_handle) :: rho
59 TYPE(t_comin_var_handle) :: qv
60 TYPE(t_comin_var_handle) :: qc
61 TYPE(t_comin_var_handle) :: qi
62 TYPE(t_comin_var_handle) :: qr
63 TYPE(t_comin_var_handle) :: qs
64 TYPE(t_comin_var_handle) :: qg
66 TYPE(t_comin_var_handle) :: lwp
67 TYPE(t_comin_var_handle) :: iwp
68 TYPE(t_comin_var_handle) :: twc
69 END type t_plugin_vars
71 TYPE(t_plugin_vars),
DIMENSION(:),
ALLOCATABLE ::
pvpp
74 TYPE(t_comin_descrdata_domain) :: p_patch
76 TYPE(t_comin_descrdata_global) :: p_global
78 LOGICAL :: lqg = .true.
80 CHARACTER(LEN=120) :: text
96 TYPE(t_comin_plugin_info) :: this_plugin
100 CALL comin_print_info(
'- setup')
103 IF (version%version_no_major > 1)
THEN
108 p_global = comin_descrdata_get_global()
110 WRITE (text,
'(a,i4)')
'- number of domains: ', p_global%get_n_dom()
111 CALL comin_print_info(text)
114 CALL comin_current_get_plugin_info(this_plugin)
115 WRITE (text,
'(a,a,a,i4)')
"- plugin ", this_plugin%name,
" has id: ", this_plugin%id
116 CALL comin_print_info(text)
122 DO jg = 1, p_global%get_n_dom()
125 CALL comin_var_request_add_wrapper(lwp_d, lmode_exclusive=.false. &
126 , zaxis_id = comin_zaxis_2d, tracer =.false., restart=.false., units=
'kg/m2')
130 CALL comin_var_request_add_wrapper(iwp_d, lmode_exclusive=.false. &
131 , zaxis_id = comin_zaxis_2d, tracer =.false., restart=.false., units=
'kg/m2')
135 CALL comin_var_request_add_wrapper(twc_d, lmode_exclusive=.false. &
136 , zaxis_id = comin_zaxis_2d, tracer =.false., restart=.false., units=
'kg/m2')
156 ALLOCATE(
pvpp(p_global%get_n_dom()))
158 domain_loop:
DO jg = 1, p_global%get_n_dom()
159 WRITE (text,
'(a,i4)')
' - get required meteorological data. dom: ', jg
160 CALL comin_print_info(text)
165 CALL comin_var_get([ep_atm_physics_before], &
166 & var_desc, comin_flag_read,
pvpp(jg)%rho)
167 CALL check_variable(
pvpp(jg)%rho,
'rho')
169 WRITE (text,
'(a,i4)')
' - get humidity tracer. dom: ',jg
170 CALL comin_print_info(text)
173 CALL comin_var_get([ep_atm_physics_before], &
174 & var_desc, comin_flag_read,
pvpp(jg)%qv)
175 CALL check_variable(
pvpp(jg)%qv,
'qv')
178 CALL comin_var_get([ep_atm_physics_before], &
179 & var_desc, comin_flag_read,
pvpp(jg)%qc)
180 CALL check_variable(
pvpp(jg)%qc,
'qc')
183 CALL comin_var_get([ep_atm_physics_before], &
184 & var_desc, comin_flag_read,
pvpp(jg)%qi)
185 CALL check_variable(
pvpp(jg)%qi,
'qi')
188 CALL comin_var_get([ep_atm_physics_before], &
189 & var_desc, comin_flag_read,
pvpp(jg)%qr)
190 CALL check_variable(
pvpp(jg)%qr,
'qr')
193 CALL comin_var_get([ep_atm_physics_before], &
194 & var_desc, comin_flag_read,
pvpp(jg)%qs)
195 CALL check_variable(
pvpp(jg)%qs,
'qs')
199 CALL comin_var_get([ep_atm_physics_before], &
200 & var_desc, comin_flag_read,
pvpp(jg)%qg)
203 IF (lqg)
CALL check_variable(
pvpp(jg)%qg,
'qg')
205 WRITE (text,
'(a,i4)')
' - get plugin variables - requested to be created by ICON. dom: ', jg
206 CALL comin_print_info(text)
209 CALL comin_var_get([ep_atm_physics_before], &
211 & comin_flag_write,
pvpp(jg)%lwp)
212 CALL check_variable(
pvpp(jg)%lwp,
'lwp',dim=2)
214 CALL comin_var_get([ep_atm_physics_before], &
216 & comin_flag_write,
pvpp(jg)%iwp)
217 CALL check_variable(
pvpp(jg)%iwp,
'iwp',dim=2)
219 CALL comin_var_get([ep_atm_physics_before], &
221 & comin_flag_write,
pvpp(jg)%twc)
222 CALL check_variable(
pvpp(jg)%twc,
'twc',dim=2)
238 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: hhl
240 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: rho_3d => null()
242 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: lwp_3d => null()
243 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: iwp_3d => null()
244 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: twc_3d => null()
246 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: qv_3d => null()
247 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: qc_3d => null()
248 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: qi_3d => null()
249 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: qr_3d => null()
250 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: qs_3d => null()
251 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: qg_3d => null()
253 REAL(wp),
POINTER,
DIMENSION(:,:,:) :: conv => null()
255 CHARACTER(LEN=:),
ALLOCATABLE :: units
256 CHARACTER(LEN=200) :: text =
''
261 p_patch = comin_descrdata_get_domain(jg)
263 WRITE (text,
'(a,i4)')
'- calculate water columns before physics. dom: ', jg
264 CALL comin_print_info(text)
266 CALL pvpp(jg)%qv%to_3d(qv_3d)
267 CALL pvpp(jg)%qi%to_3d(qi_3d)
268 CALL pvpp(jg)%qr%to_3d(qr_3d)
269 CALL pvpp(jg)%qs%to_3d(qs_3d)
270 CALL pvpp(jg)%qc%to_3d(qc_3d)
271 IF (lqg)
CALL pvpp(jg)%qg%to_3d(qg_3d)
273 CALL pvpp(jg)%rho%to_3d(rho_3d)
275 CALL pvpp(jg)%lwp%to_3d(lwp_3d)
276 CALL pvpp(jg)%iwp%to_3d(iwp_3d)
277 CALL pvpp(jg)%twc%to_3d(twc_3d)
280 ALLOCATE(conv(
SIZE(qv_3d,1),
SIZE(qv_3d,2),
SIZE(qv_3d,3)))
282 hhl => p_patch%cells%get_hhl()
283 DO jk=1,
SIZE(qv_3d,2)
285 conv(:,jk,:) = rho_3d(:,jk,:) * &
286 (hhl(:,jk,:) - hhl(:,jk+1,:))
290 lwp_3d(:,:,:) = 0._wp
291 iwp_3d(:,:,:) = 0._wp
292 twc_3d(:,:,:) = 0._wp
293 DO jk=1,
SIZE(qv_3d,2)
294 lwp_3d(:,:,1) = lwp_3d(:,:,1) &
295 + (qr_3d(:,jk,:) + qc_3d(:,jk,:)) * conv(:,jk,:)
296 iwp_3d(:,:,1) = iwp_3d(:,:,1) &
297 + (qi_3d(:,jk,:)+qs_3d(:,jk,:)) * conv(:,jk,:)
300 DO jk=1,
SIZE(qv_3d,2)
301 iwp_3d(:,:,1) = iwp_3d(:,:,1) + qg_3d(:,jk,:) * conv(:,jk,:)
304 twc_3d(:,:,1) = iwp_3d(:,:,1) + lwp_3d(:,:,1)
305 DO jk=1,
SIZE(qv_3d,2)
306 twc_3d(:,:,1) = twc_3d(:,:,1) + qv_3d(:,jk,:) * conv(:,jk,:)
309 WRITE (text,
'(a,i4)')
'- results of plugin calc_water_column. dom: ', jg
313 write (text,fmt=
'(A,A5,A,F8.4)')
'- maximum liquid water path (',trim(units),
'): ', maxval(lwp_3d(:,:,1))
314 CALL message(text, idom=jg,lall=.true.)
317 write (text,fmt=
'(A,A5,A,F8.4)')
'- maximum ice water path (',trim(units),
'): ', maxval(iwp_3d(:,:,1))
318 CALL message(text, idom=jg,lall=.true.)
320 write (text,fmt=
'(A,A5,A,F8.4)')
'- maximum total water column (',trim(units),
'): ', maxval(twc_3d(:,:,1))
321 CALL message(text, idom=jg,lall=.true.)
324 DEALLOCATE(conv);
NULLIFY(conv)
325 NULLIFY(lwp_3d, iwp_3d, twc_3d)
326 NULLIFY(qv_3d,qc_3d,qi_3d,qr_3d,qs_3d,qg_3d, rho_3d)
338 CALL comin_print_info(
' - destructor.')
350 SUBROUTINE comin_var_request_add_wrapper(descriptor, lmode_exclusive, zaxis_id &
351 , tracer, restart, units)
357 LOGICAL,
OPTIONAL,
INTENT(IN) :: lmode_exclusive
358 INTEGER,
OPTIONAL,
INTENT(IN) :: zaxis_id
359 LOGICAL,
OPTIONAL,
INTENT(IN) :: tracer
360 LOGICAL,
OPTIONAL,
INTENT(IN) :: restart
361 CHARACTER(LEN=*),
OPTIONAL,
INTENT(IN) :: units
363 LOGICAL :: lexclusive
365 IF (
PRESENT(lmode_exclusive))
THEN
366 lexclusive = lmode_exclusive
373 IF (
PRESENT(zaxis_id))
THEN
374 CALL comin_metadata_set(descriptor,
"zaxis_id", zaxis_id)
376 IF (
PRESENT(tracer))
THEN
377 CALL comin_metadata_set(descriptor,
"tracer", tracer)
379 IF (
PRESENT(restart))
THEN
380 CALL comin_metadata_set(descriptor,
"restart", restart)
382 IF (
PRESENT(units))
THEN
383 CALL comin_metadata_set(descriptor,
"units", trim(units))
386 END SUBROUTINE comin_var_request_add_wrapper
390 SUBROUTINE check_variable(var, name, dim)
395 TYPE(t_comin_var_handle),
INTENT(IN) :: var
396 CHARACTER(LEN=*),
INTENT(IN) :: name
397 INTEGER,
INTENT(IN),
OPTIONAL :: dim
401 IF (
PRESENT(dim))
THEN
408 CALL check_dimensions_2d(var, name)
410 CALL check_dimensions_3d(var, name)
415 END SUBROUTINE check_variable
419 SUBROUTINE check_dimensions_3d(var, name)
423 TYPE(t_comin_var_handle),
INTENT(IN) :: var
424 CHARACTER(LEN=*),
INTENT(IN) :: name
426 IF (any(var%dim_semantics() /= [comin_dim_semantics_nproma, &
427 & comin_dim_semantics_level, &
428 & comin_dim_semantics_block, &
429 & comin_dim_semantics_unused, &
430 & comin_dim_semantics_unused] )) &
432 & ,
"Dimension check failed!")
434 END SUBROUTINE check_dimensions_3d
440 SUBROUTINE check_dimensions_2d(var, name)
444 TYPE(t_comin_var_handle),
INTENT(IN) :: var
445 CHARACTER(LEN=*),
INTENT(IN) :: name
447 IF (any(var%dim_semantics() /= [comin_dim_semantics_nproma, &
448 & comin_dim_semantics_block, &
449 & comin_dim_semantics_unused, &
450 & comin_dim_semantics_unused, &
451 & comin_dim_semantics_unused] )) &
453 ,
"Dimension check failed!")
455 END SUBROUTINE check_dimensions_2d
459 SUBROUTINE message(text, idom, lall)
463 CHARACTER(LEN=*) :: text
464 INTEGER,
OPTIONAL :: idom
465 LOGICAL,
OPTIONAL :: lall
470 IF (
PRESENT(lall))
THEN
476 IF (comin_parallel_get_host_mpi_rank() == 0 .OR. la)
THEN
477 IF (
PRESENT(idom))
THEN
478 WRITE (0,fmt=
'(A,I2,A)') pluginname//
' domain: ',idom,
' '//trim(text)
480 WRITE (0,fmt=
'(A,A)') pluginname//
' ',trim(text)
484 END SUBROUTINE message
t_comin_error_code comin_error_get()
Get the current ComIn error code.
void comin_plugin_finish(const char *routine, const char *text)
void comin_error_set_errors_return(bool errors_return)
void comin_setup_get_version(unsigned int *major, unsigned int *minor, unsigned int *patch)
int comin_current_get_domain_id()
void comin_var_request_add(t_comin_var_descriptor var_desc, bool lmodexclusive)
void comin_callback_register(t_comin_entry_point entry_point, t_comin_callback_function fct_ptr)
Example plugin for the ICON Community Interface (ComIn)
subroutine, public calc_water_column_diagfct()
subroutine, public calc_water_column_destructor()
type(t_plugin_vars), dimension(:), allocatable pvpp
subroutine, public comin_main()
subroutine, public calc_water_column_constructor()