34 integer :: data_type, dimensions, dim_sizes(4)
35 real(kind=DEFAULT_PRECISION),
dimension(:),
allocatable :: values
36 character(len=STRING_LENGTH),
dimension(:),
allocatable :: string_values
42 type(
map_type) :: registered_monc_types, registered_monc_buffer_sizes
43 type(
map_type),
dimension(:),
allocatable :: field_start_locations, field_end_locations, dimensions
44 character(len=STRING_LENGTH),
dimension(:),
allocatable :: definition_names
45 integer :: active_threads, active_mutex, deactivate_condition_variable, local_dim_sizes(3), local_dim_starts(3), &
46 local_dim_ends(3), source_id
51 character(len=STRING_LENGTH) :: name, namespace, dim_size_defns(4), units
53 logical ::
optional, collective
58 character(len=STRING_LENGTH) :: name, namespace
59 logical :: send_on_terminate
60 integer :: number_of_data_fields, frequency
61 type(
map_type) :: compiled_fields, trigger_field_types
66 character(len=STRING_LENGTH) :: name
67 integer :: message_tag
68 procedure(handle_recv_data_from_io_server),
pointer,
nopass :: handling_procedure
72 character(len=STRING_LENGTH) ::
type, namespace
77 character(len=STRING_LENGTH) :: name, dim_size_defns(4), units, namespace
84 character(len=STRING_LENGTH) :: name, namespace
89 integer :: facet_type, time_manipulation_type
90 real :: output_time_frequency
91 character(len=STRING_LENGTH) :: facet_name
95 character(len=STRING_LENGTH) :: file_name, title
96 integer :: number_of_contents, write_timestep_frequency
97 real :: write_time_frequency
98 logical :: write_on_model_time, write_on_terminate, include_in_io_state_write
104 integer :: number_of_data_definitions, number_of_diagnostics, io_communicator, number_of_moncs, &
105 number_of_io_servers, my_io_rank, active_moncs, number_inter_io_communications, number_of_threads, number_of_groups, &
106 number_of_writers, number_of_distinct_data_fields, number_of_global_moncs, general_info_mutex
115 real(kind=DEFAULT_PRECISION),
dimension(:),
allocatable :: zn_field
117 logical :: general_info_set
118 character,
dimension(:),
allocatable :: text_configuration
121 #ifndef DOXYGEN_SHOULD_SKIP_THIS 123 subroutine handle_recv_data_from_io_server(io_configuration, data_buffer, inter_io_index)
126 character,
dimension(:),
intent(inout) :: data_buffer
127 integer,
intent(in) :: inter_io_index
128 end subroutine handle_recv_data_from_io_server
130 #endif /* DOXYGEN_SHOULD_SKIP_THIS */ 161 recursive function get_io_xml(filename, funit_num)
result(io_xml)
162 character(len=*),
intent(in) :: filename
163 integer,
intent(in),
optional :: funit_num
164 character,
dimension(:),
allocatable :: io_xml, temp_io_xml
166 character(len=FILE_LINE_LEN) :: temp_line, adjusted_io_line
167 character(len=FILE_STR_STRIDE) :: reading_buffer
168 integer :: ierr, first_quote, last_quote, chosen_unit
170 if (
present(funit_num))
then 171 chosen_unit=funit_num
177 open (unit=chosen_unit, file=filename, status=
'OLD', iostat=ierr)
178 if (ierr .ne. 0)
call log_log(
log_error,
"Error opening file '"//trim(filename)//
"'")
180 read(chosen_unit,
"(A)",iostat=ierr) temp_line
181 adjusted_io_line=adjustl(temp_line)
182 if (ierr == 0 .and. adjusted_io_line(1:1) .ne.
"!" .and. adjusted_io_line(1:2) .ne.
"//")
then 183 if (index(temp_line,
"#include") .ne. 0)
then 184 first_quote=index(temp_line,
"""")
185 last_quote=index(temp_line,
"""", back=.true.)
186 if (first_quote .ne. 0 .and. last_quote .ne. 0)
then 188 temp_io_xml=
get_io_xml(temp_line(first_quote+1:last_quote-1), chosen_unit+1)
190 deallocate(temp_io_xml)
191 reading_buffer=new_line(
"A")
193 call log_log(
log_error,
"Malformed IO XML, include directives must have filename in quotes")
196 if (len_trim(reading_buffer) + len_trim(temp_line) .ge.
file_str_stride)
then 200 reading_buffer=trim(reading_buffer)//trim(temp_line)//new_line(
"A")
211 subroutine configuration_parse(provided_options_database, raw_configuration, parsed_configuration)
213 character,
dimension(:),
intent(in) :: raw_configuration
247 parsed_configuration%number_inter_io_communications=0
248 parsed_configuration%general_info_set=.false.
250 allocate(parsed_configuration%text_configuration(
size(raw_configuration)), source=raw_configuration)
275 character(len=*),
intent(in) :: element_name
276 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
277 integer,
intent(in) :: number_of_attributes
279 integer :: namespace_index
282 if (element_name ==
"field")
then 289 if (element_name ==
"diagnostic")
then 295 if (element_name ==
"thread_pool")
then 302 if (element_name ==
"include")
then 305 else if (element_name ==
"file")
then 309 else if (element_name ==
"data-writing")
then 311 else if (element_name ==
"data-definition")
then 314 else if (element_name ==
"data-handling")
then 316 if (namespace_index == 0)
then 322 else if (element_name ==
"group")
then 325 else if (element_name ==
"server-configuration")
then 333 character(len=*),
intent(in) :: element_name
337 if (element_name ==
"data-definition")
then 347 else if (element_name ==
"data-handling")
then 350 else if (element_name ==
"server-configuration")
then 352 else if (element_name ==
"action")
then 354 else if (element_name ==
"diagnostic")
then 357 else if (element_name ==
"data-writing")
then 360 else if (element_name ==
"group")
then 364 else if (element_name ==
"file")
then 371 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
373 integer :: number_index
377 if (number_index /= 0)
then 387 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
389 integer :: name_index, frequency_index, namespace_index, send_on_termination_index
390 character(len=STRING_LENGTH) :: namespace
396 if (name_index /= 0 .and. frequency_index /=0)
then 402 if (namespace_index /= 0)
then 409 if (send_on_termination_index /= 0)
then 451 character(len=*),
intent(in) :: element_name
452 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
455 class(*),
pointer :: generic
458 allocate(misc_member)
462 do i=1,
size(attribute_names)
471 character(len=*),
intent(in) :: element_name
472 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
474 integer :: field_index
476 if (element_name ==
"member")
then 478 if (field_index .gt. 0)
then 485 call log_log(
log_error,
"Unrecognised diagnostics group participant, name is '"//trim(element_name)//
"'")
489 subroutine define_group(attribute_names, attribute_values)
490 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
492 integer :: field_index
497 if (field_index .gt. 0)
then 500 if (field_index .gt. 0)
then 512 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
514 integer :: field_index, number_of_contents
518 if (number_of_contents .gt. &
523 if (field_index .gt. 0)
then 530 if (field_index .gt. 0)
then 537 if (field_index .gt. 0)
then 546 call log_log(
log_error,
"Inclusion to file writer requires a field or group to include")
554 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
555 integer,
intent(in) :: number_of_contents
557 character(len=STRING_LENGTH) :: time_manip
558 integer :: field_index
561 if (field_index .gt. 0)
then 563 if (time_manip ==
"instantaneous")
then 566 else if (time_manip ==
"averaged")
then 569 else if (time_manip ==
"none")
then 573 call log_log(
log_error,
"Time manipulation '"//trim(time_manip)//
"' option not recognised")
576 call log_log(
log_error,
"Inclusion to file writer requires time manipulation")
580 if (field_index .gt. 0)
then 582 contents(number_of_contents)%output_time_frequency=&
588 call log_log(
log_error,
"Inclusion to file writer requires an output frequency")
593 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
595 integer :: field_index
600 if (field_index .gt. 0)
then 608 if (field_index .gt. 0)
then 614 if (field_index .gt. 0)
then 619 call log_log(
log_error,
"File writer requires either a write time frequency or write timestep frequency")
624 if (field_index .gt. 0)
then 632 if (field_index .gt. 0)
then 640 if (field_index .gt. 0)
then 657 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
659 integer :: field_index, type_field_index, data_field_index
660 character(len=STRING_LENGTH) :: field_type_str, field_data_type_str, size_definitions
668 if (field_index == 0 .or. type_field_index == 0 .or. data_field_index == 0)
then 669 call log_log(
log_error,
"Each diagnostic definition requires a field name, field type and data type")
677 call log_log(
log_error,
"The field type of '"//trim(field_type_str)//
"' is not recognised")
682 call log_log(
log_error,
"The field data type of '"//trim(field_data_type_str)//
"' is not recognised")
685 if (field_index .ne. 0)
then 694 if (field_index .ne. 0)
then 699 call log_log(
log_error,
"A diagnostic of field type array or map requires sizing a definition")
702 if (field_index .ne. 0)
then 716 character(len=*),
intent(in) :: size_definitions
717 character(len=STRING_LENGTH),
intent(out) :: individual_str_defn(4)
719 integer :: comma_index, sizing_index, cp
723 comma_index=index(size_definitions(cp:),
",")
724 do while (comma_index .ne. 0)
725 comma_index=comma_index+cp-1
726 individual_str_defn(sizing_index)= trim(size_definitions(cp:comma_index-1))
728 sizing_index=sizing_index+1
729 comma_index=index(size_definitions(cp:),
",")
730 if (sizing_index .gt. 4)
then 731 call log_log(
log_error,
"Can only have a maximum of four diagnostic field sizing dimensions")
734 if (cp .le. len(size_definitions))
then 735 individual_str_defn(sizing_index)=trim(size_definitions(cp:))
736 sizing_index=sizing_index+1
748 character(len=*),
dimension(:),
intent(in) :: attribute_names, attribute_values
750 character(len=STRING_LENGTH) :: field_type_str, field_data_type_str, sizing_defn_str
751 integer :: name_field_index, type_field_index, data_field_index, field_index, optional_field_index, idx
758 if (name_field_index == 0 .or. type_field_index == 0 .or. data_field_index == 0)
then 759 call log_log(
log_error,
"Each data field definition requires a name, field type and data type")
775 call log_log(
log_error,
"The field type of '"//trim(field_type_str)//
"' is not recognised")
793 if (field_index .ne. 0)
then 804 if (field_index .ne. 0)
then 816 call log_log(
log_error,
"The field data type of '"//trim(field_data_type_str)//
"' is not recognised")
822 call log_log(
log_error,
"A map field type must have a data type of ""string""")
826 if (optional_field_index .ne. 0)
then 840 character(len=*),
intent(in) :: field_type_str
849 character(len=*),
intent(in) :: field_data_type_str
864 character(len=*),
intent(in) :: original_string, to_replace
865 character(len=*),
intent(out) :: new_string
867 integer :: current_index, string_len, occurance
870 string_len=len(original_string)
872 do while (current_index .lt. string_len)
873 occurance=index(original_string(current_index:), to_replace)
874 if (occurance .eq. 0)
then 875 occurance=len(original_string)
877 occurance=occurance+current_index
879 new_string=trim(new_string)//trim(original_string(current_index:occurance-len(to_replace)-1))
880 current_index=current_index+occurance+len(to_replace)-2
885 character(len=*),
intent(in) :: original_string
886 integer,
intent(in) :: field_value_type
889 character(len=STRING_LENGTH) :: lookup_key
909 call log_log(
log_error,
"Can not find IO configuration key '"//trim(lookup_key)//
"' in the options database")
919 character(len=*),
intent(in) :: search_name
920 character(len=*),
dimension(:) :: attribute_names
922 integer :: i, size_of_names
924 size_of_names=
size(attribute_names)
926 if (attribute_names(i) == search_name)
then 942 allocate(temp_descriptions(lbound(io_configuration%inter_io_communications,1):&
944 temp_descriptions(lbound(io_configuration%inter_io_communications,1):&
945 ubound(io_configuration%inter_io_communications,1)) = io_configuration%inter_io_communications
946 call move_alloc(from=temp_descriptions,to=io_configuration%inter_io_communications)
1001 allocate(temp_data_definitions(lbound(
building_config%data_definitions, 1):&
1005 call move_alloc(from=temp_data_definitions,to=
building_config%data_definitions)
1015 allocate(temp_registered_moncs(lbound(io_configuration%registered_moncs, 1):&
1017 temp_registered_moncs(lbound(io_configuration%registered_moncs, 1):&
1018 ubound(io_configuration%registered_moncs, 1)) = io_configuration%registered_moncs
1019 call move_alloc(from=temp_registered_moncs,to=io_configuration%registered_moncs)
1028 character(len=*),
intent(in) :: key
1032 do i=1,io_configuration%number_of_data_definitions
1033 if (io_configuration%data_definitions(i)%name .eq. key)
then 1048 integer,
intent(in) :: source
1051 class(*),
pointer :: generic
1055 if (
associated(generic))
then 1057 monc_defn=io_configuration%registered_moncs(location)
1073 allocate(build_definition_description_type_from_configuration(io_configuration%number_of_data_definitions))
1075 do i=1, io_configuration%number_of_data_definitions
1076 build_definition_description_type_from_configuration(i)%definition_name=io_configuration%data_definitions(i)%name
1077 build_definition_description_type_from_configuration(i)%send_on_terminate=&
1078 io_configuration%data_definitions(i)%send_on_terminate
1079 build_definition_description_type_from_configuration(i)%number_fields=&
1080 io_configuration%data_definitions(i)%number_of_data_fields
1081 build_definition_description_type_from_configuration(i)%frequency=io_configuration%data_definitions(i)%frequency
1090 type(
field_description_type),
dimension(:),
allocatable :: build_field_description_type_from_configuration
1092 integer :: i, j, field_index
1096 do i=1, io_configuration%number_of_data_definitions
1097 do j=1, io_configuration%data_definitions(i)%number_of_data_fields
1098 build_field_description_type_from_configuration(field_index)%definition_name=io_configuration%data_definitions(i)%name
1099 build_field_description_type_from_configuration(field_index)%field_name=&
1100 io_configuration%data_definitions(i)%fields(j)%name
1101 build_field_description_type_from_configuration(field_index)%field_type=&
1102 io_configuration%data_definitions(i)%fields(j)%field_type
1103 build_field_description_type_from_configuration(field_index)%data_type=&
1104 io_configuration%data_definitions(i)%fields(j)%data_type
1105 build_field_description_type_from_configuration(field_index)%optional=&
1106 io_configuration%data_definitions(i)%fields(j)%optional
1107 field_index=field_index+1
1121 do i=1, io_configuration%number_of_data_definitions
1135 character(len=*),
intent(in) :: field_name
1136 integer,
intent(in) :: source, data_id
1138 integer :: monc_location
1150 character(len=*),
intent(in) :: field_name
1151 type(
data_values_type),
pointer :: get_data_value_from_hashmap_by_field_name
1153 class(*),
pointer :: generic
1156 if (
associated(generic))
then 1157 select type(generic)
1159 get_data_value_from_hashmap_by_field_name=>generic
1162 get_data_value_from_hashmap_by_field_name=>null()
1172 character(len=*),
intent(in) :: field_name
1175 class(*),
pointer :: generic
1178 if (
associated(generic))
then 1179 select type(generic)
1181 get_data_value_from_map_by_field_name=>generic
1184 get_data_value_from_map_by_field_name=>null()
1195 class(*),
pointer :: generic
1198 if (
associated(generic))
then 1199 select type(generic)
1201 get_data_value_from_map_entry=>generic
1204 get_data_value_from_map_entry=>null()
1213 integer,
intent(in) :: source
1225 character(len=*),
intent(in) :: field_name, field_namespace
1230 do i=1,
size(io_configuration%diagnostics)
1231 if (io_configuration%diagnostics(i)%name == field_name .and. &
1232 io_configuration%diagnostics(i)%namespace == field_namespace)
then 1233 diagnostic_config=io_configuration%diagnostics(i)
1247 prognostic_config, prognostic_containing_data_defn)
1249 character(len=*),
intent(in) :: field_name, field_namespace
1254 do i=1, io_configuration%number_of_data_definitions
1255 do j=1, io_configuration%data_definitions(i)%number_of_data_fields
1256 if (io_configuration%data_definitions(i)%fields(j)%name == field_name .and. &
1257 io_configuration%data_definitions(i)%fields(j)%namespace == field_namespace)
then 1258 prognostic_config=io_configuration%data_definitions(i)%fields(j)
1259 if (
present(prognostic_containing_data_defn))
then 1260 prognostic_containing_data_defn=io_configuration%data_definitions(i)
1275 character,
dimension(:),
allocatable,
intent(inout) :: io_xml
1276 character(len=*),
intent(in) :: reading_buffer
1278 character,
dimension(:),
allocatable :: temp_io_xml
1281 if (.not.
allocated(io_xml))
then 1282 allocate(io_xml(len_trim(reading_buffer)))
1283 do i=1, len_trim(reading_buffer)
1284 io_xml(i)=reading_buffer(i:i)
1287 allocate(temp_io_xml(
size(io_xml)+len_trim(reading_buffer)))
1288 temp_io_xml(:
size(io_xml)) = io_xml
1289 do i=1, len_trim(reading_buffer)
1290 temp_io_xml(
size(io_xml)+i) = reading_buffer(i:i)
1292 call move_alloc(from=temp_io_xml,to=io_xml)
1300 character,
dimension(:),
allocatable,
intent(inout) :: io_xml, other_xml_array
1302 character,
dimension(:),
allocatable :: temp_io_xml
1304 if (.not.
allocated(other_xml_array))
return 1306 if (.not.
allocated(io_xml))
then 1307 allocate(io_xml(
size(other_xml_array)), source=other_xml_array)
1309 allocate(temp_io_xml(
size(io_xml)+
size(other_xml_array)))
1310 temp_io_xml(:
size(io_xml)) = io_xml
1311 temp_io_xml(
size(io_xml)+1:) = other_xml_array
1312 call move_alloc(from=temp_io_xml,to=io_xml)
Configuration of a specific data definition.
subroutine add_misc_member_to_diagnostic(element_name, attribute_names, attribute_values)
integer current_building_group
subroutine extend_file_writer_contents_array()
logical inside_generic_writing
type(hashmap_type) options_database
Gets a specific generic element out of the list, stack, queue or map with the corresponding key...
Puts an integer key-value pair into the map.
Overall IO configuration.
integer, parameter, public lt_operator_type
subroutine add_in_dimensions(provided_options_database)
integer, parameter, public float_data_type
character(len=string_length), parameter default_file_title
logical inside_data_definition
logical inside_action_config
subroutine, public xml_parse(raw_contents, start_element_callback, end_element_callback)
Parses some raw XML raw_contents The raw (unparsed) XML string start_element_callback Subroutine to c...
integer, parameter, public log_error
Only log ERROR messages.
integer, parameter, public array_field_type
subroutine, public extend_registered_moncs_array(io_configuration)
Extends the data definitions array from the current size to the current size + data size stride...
integer, parameter monc_size_stride
character(len=string_length) function, public options_get_string(options_database, key, index)
Retrieves a string value from the database that matches the provided key.
logical function, public get_diagnostic_field_configuration(io_configuration, field_name, field_namespace, diagnostic_config)
Retrieves the diagnostics field configuration corresponding to a specific field name and returns whet...
integer, parameter, public boolean_data_type
subroutine add_include_to_file_writer(attribute_names, attribute_values)
logical inside_handling_definition
subroutine extend_diagnostics_array()
Extends the rules array of a specific rule from the current size to the current size + data size stri...
integer, parameter, public lte_operator_type
subroutine extend_file_writer_array()
integer, parameter, public data_size_stride
integer, parameter, public default_precision
MPI communication type which we use for the prognostic and calculation data.
character(len=string_length) function retrieve_string_value(original_string, field_value_type)
integer, parameter, public io_state_type
integer, parameter, public field_type
integer current_building_definition
integer current_trigger_index
logical function, public retrieve_monc_definition(io_configuration, source, monc_defn)
Retrieves a specific MONC definition from the configuration which matches a source PID...
subroutine replace_characters_in_string(original_string, new_string, to_replace)
Replaces specific characters in a string and returns a new string with this replaced by nothing (i...
integer, parameter, public mod_operator_type
integer current_building_field
Contains common definitions for the data and datatypes used by MONC.
logical inside_specific_file_writing
A hashmap structure, the same as a map but uses hashing for greatly improved performance when storing...
Gets a specific integer element out of the list, stack, queue or map with the corresponding key...
Conversion between common inbuilt FORTRAN data types.
integer, parameter, public double_data_type
Converts data types to strings.
integer, parameter, public instantaneous_type
integer current_building_diagnostic
subroutine extend_field_array()
Extends the fields array of the current data definition from the current size to the current size + d...
Puts a string key-value pair into the map.
subroutine add_include_group_or_field_to_file_writer(attribute_names, attribute_values, number_of_contents)
subroutine define_group(attribute_names, attribute_values)
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...
integer, parameter file_str_stride
logical function, public get_prognostic_field_configuration(io_configuration, field_name, field_namespace, prognostic_config, prognostic_containing_data_defn)
Retrieves the prognostic field configuration corresponding to a specific field name and returns wheth...
integer function get_field_type_from_attribute(field_type_str)
integer, parameter, public string_data_type
This defines some constants and procedures that are useful to the IO server and clients that call it...
integer, parameter, public integer_data_type
type(data_values_type) function, pointer get_data_value_from_hashmap_by_field_name(collection, field_name)
Retrieves the data value (wrapper) by field name or null if no entry was found in the provided collec...
Map data structure that holds string (length 20 maximum) key value pairs.
type(data_values_type) function, pointer get_data_value_from_map_by_field_name(collection, field_name)
Retrieves the data value (wrapper) by field name or null if no entry was found in the provided collec...
subroutine start_element_callback(element_name, number_of_attributes, attribute_names, attribute_values)
XML element start (opening) call back. This handles most of the configuration parsing.
This manages the Q variables and specifically the mapping between names and the index that they are s...
type(io_configuration_type), save building_config
IO configuration that is build built up from XML parsing.
Returns the number of elements in the collection.
integer function, public get_number_active_q_indices()
Gets the number of active Q indicies (i.e. those allocated to specific uses)
integer function get_field_datatype_from_attribute(field_data_type_str)
subroutine combine_xml_arrays(io_xml, other_xml_array)
Combines two IO XML arrays together (for instance one returned from a recursive include) ...
integer current_building_file_writer
subroutine, public extend_inter_io_comm_array(io_configuration)
Extends the array of inter io communications from its current suze to current size+data_stride+curren...
type(hashset_type) data_field_names
Collection data structures.
integer, parameter or_operator_type
logical inside_server_config
integer, parameter file_line_len
integer function, public get_monc_location(io_configuration, source)
A helper function to get the location of a MONC's configuration in the IO data structure.
subroutine, public configuration_parse(provided_options_database, raw_configuration, parsed_configuration)
This will parse an XML string into the IO configuration.
integer, parameter, public log_warn
Log WARNING and ERROR messages.
integer function get_total_number_fields(io_configuration)
Retrieves the total number of fields held in all data definitions.
integer, parameter, public multiply_operator_type
Configuration that representes the state of a registered MONC process.
Converts data types to real.
logical inside_group_config
integer, parameter, public string_length
Default length of strings.
integer, parameter, public gt_operator_type
subroutine handle_new_data_definition(attribute_names, attribute_values)
Creates a new data definition configuration item based upon the attributes supplied.
integer function get_field_index_from_name(attribute_names, search_name)
Given the name of an attribute will return the index of this in the names collection or 0 if it is no...
integer, parameter, public time_averaged_type
integer function, public get_number_field_dimensions(io_configuration, field_name, source, data_id)
Retrieves the number of field dimensions that a specific field has from a MONC process within a data ...
integer, parameter, public gte_operator_type
List data structure which implements a doubly linked list. This list will preserve its order...
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.
character(len=string_length) data_handling_namespace
Adds a generic element to the end of the list.
integer function, public retrieve_data_definition(io_configuration, key)
Retrieves a specific data definition from the configuration which matches a key.
A SAX parser for XML files. This is used to parse the description of the data and rules...
integer, parameter, public add_operator_type
integer function, public options_get_integer(options_database, key, index)
Retrieves an integer value from the database that matches the provided key.
subroutine define_diagnostic(attribute_names, attribute_values)
Defines a new data handling rule.
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.
Frees up all the allocatable, heap, memory associated with a list, stack, queue or map...
subroutine process_xml_into_field_description(attribute_names, attribute_values)
Process XML into a field description by identifying the attributes of the field and storing these in ...
subroutine add_diagnostic_field_to_group(element_name, attribute_names, attribute_values)
type(data_values_type) function, pointer, public get_data_value_from_map_entry(map_entry)
Retrieves the data value (wrapper) by field name or null if no entry was found in the provided map en...
recursive character function, dimension(:), allocatable, public get_io_xml(filename, funit_num)
Reads in textual data from a file and returns this, used to read the IO server XML configuration file...
subroutine define_file_writer(attribute_names, attribute_values)
integer, parameter, public eq_operator_type
integer, parameter and_operator_type
Hashset structure which will store unique strings. The hashing aspect means that lookup is very fast ...
subroutine extend_data_definition_array()
Extends the data definitions array from the current size to the current size + data size stride...
subroutine end_element_callback(element_name)
XML element end (closing) call back.
Configuration associated with the representation of a specific data field.
Converts data types to integers.
integer, parameter, public scalar_field_type
Adds a string to the end of the list.
subroutine add_in_specific_line(io_xml, reading_buffer)
Adds a specific line into the io xml. The IO XML is always exactly the correct size, so here is either allocated or resized to match what the read buffer requires.
integer, parameter, public div_operator_type
logical function, public options_has_key(options_database, key)
Determines whether a specific key is in the database.
integer, parameter, public map_field_type
Field data type identifiers.
integer function process_sizing_definition(size_definitions, individual_str_defn)
subroutine handle_thread_pool_configuration(attribute_names, attribute_values)
Parses the XML configuration file to produce the io configuration description which contains the data...
type(field_description_type) function, dimension(:), allocatable, public build_field_description_type_from_configuration(io_configuration)
Builds up the field definition description type from the structured definitions in the IO configurati...
integer, parameter, public group_type
logical inside_diagnostic_config
subroutine extend_groups_array()
integer, parameter, public none_type
type(definition_description_type) function, dimension(:), allocatable, public build_definition_description_type_from_configuration(io_configuration)
Builds up the data definition description type from the structured definitions in the IO configuratio...
integer, parameter, public subtract_operator_type