module subroutine initialize_type_output_observation(self, input, coordinate, domain, dir_output, variable_name)
implicit none
class(type_output_observation), intent(inout) :: self
type(type_input), intent(in) :: input
type(type_dp_3d), intent(inout), pointer :: coordinate
type(type_domain), intent(inout) :: domain
character(*), intent(in) :: dir_output
character(*), intent(in) :: variable_name
integer(int32) :: iObs, iElem, num_elements
integer(int32) :: local_id, local_type, ierr
real(real64) :: tmp_xi, tmp_eta
integer(int32) :: num_target_variables
logical :: inside
self%type = input%output_settings%history_output%observation_type
if (self%type == "none") then
self%do_output = .false.
return
else
self%do_output = .true.
end if
self%num_observations = input%output_settings%history_output%num_observations
select case (self%type)
case ("node_ids")
if (allocated(self%node_ids)) deallocate (self%node_ids)
allocate (self%node_ids, source=input%output_settings%history_output%node_ids)
case ("coordinates")
call self%coordinate%initialize(self%num_observations)
do iObs = 1, self%num_observations
self%coordinate%x(iObs) = input%output_settings%history_output%coordinates(iObs)%x
self%coordinate%y(iObs) = input%output_settings%history_output%coordinates(iObs)%y
self%coordinate%z(iObs) = input%output_settings%history_output%coordinates(iObs)%z
end do
allocate (self%elements(self%num_observations))
allocate (self%xi(self%num_observations))
allocate (self%eta(self%num_observations))
select case (input%basic%simulation_settings%calculate_type)
case (1)
do iObs = 1, self%num_observations
num_elements = domain%get_num_elements()
do iElem = 1, num_elements
call domain%Elements(iElem)%e%is_inside(self%coordinate%x(iObs), &
self%coordinate%y(iObs), &
tmp_xi, &
tmp_eta, &
inside)
if (inside) then
local_id = domain%Elements(iElem)%e%get_id()
call create_element(self%elements(iObs)%e, &
local_id, &
coordinate, &
input%geometry%vtk%cells(local_id), &
input%basic%geometry_settings, &
ierr)
self%xi(iObs) = tmp_xi
self%eta(iObs) = tmp_eta
exit
end if
end do
end do
case (2)
do iObs = 1, self%num_observations
num_elements = domain%get_num_elements()
do iElem = 1, num_elements
call domain%Elements(iElem)%e%is_inside(self%coordinate%x(iObs), &
self%coordinate%z(iObs), &
tmp_xi, &
tmp_eta, &
inside)
if (inside) then
local_id = domain%Elements(iElem)%e%get_id()
call create_element(self%elements(iObs)%e, &
local_id, &
coordinate, &
input%geometry%vtk%cells(local_id), &
input%basic%geometry_settings, &
ierr)
self%xi(iObs) = tmp_xi
self%eta(iObs) = tmp_eta
exit
end if
end do
end do
end select
end select
if (associated(self%get_values)) nullify (self%get_values)
select case (trim(adjustl(variable_name)))
case ("temperature")
self%name = trim(adjustl(variable_name))
self%unit = "°C"
self%file_name = trim(adjustl(dir_output))//"obsf_T."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
select case (self%type)
case ("node_ids")
self%get_values => get_observations_temperature
case ("coordinates")
self%get_values => interpolate_observations_temperature
end select
self%get_values => interpolate_observations_temperature
case ("ice_saturation")
self%name = trim(adjustl(variable_name))
self%unit = "-"
self%file_name = trim(adjustl(dir_output))//"obsf_Si."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
select case (self%type)
case ("node_ids")
self%get_values => get_observations_si
case ("coordinates")
self%get_values => interpolate_observations_si
end select
case ("thermal_conductivity")
self%name = trim(adjustl(variable_name))
self%unit = "W/m/K"
self%file_name = trim(adjustl(dir_output))//"obsf_TC."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
select case (self%type)
case ("node_ids")
self%get_values => get_observations_thc
case ("coordinates")
self%get_values => interpolate_observations_thc
end select
case ("volumetric_heat_capacity")
self%name = trim(adjustl(variable_name))
self%unit = "J/m^3/K"
self%file_name = trim(adjustl(dir_output))//"obsf_C."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
select case (self%type)
case ("node_ids")
self%get_values => get_observations_vhc
case ("coordinates")
self%get_values => interpolate_observations_vhc
end select
case ("pressure")
self%name = trim(adjustl(variable_name))
self%unit = "m"
self%file_name = trim(adjustl(dir_output))//"obsf_P."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
select case (self%type)
case ("node_ids")
self%get_values => get_observations_pw
case ("coordinates")
self%get_values => interpolate_observations_pw
end select
case ("water_flux")
self%name = trim(adjustl(variable_name))
self%unit = "m/s"
self%file_name = trim(adjustl(dir_output))//"obsf_Flux."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
self%num_observations = self%num_observations * 3
case ("hydraulic_conductivity")
self%name = trim(adjustl(variable_name))
self%unit = "m/s"
self%file_name = trim(adjustl(dir_output))//"obsf_K."//trim(adjustl(input%output_settings%history_output%file_format))
self%num_unit = 99999999
end select
if (associated(self%write_line)) nullify (self%write_line)
if (associated(self%write_header)) nullify (self%write_header)
select case (trim(adjustl(input%output_settings%history_output%file_format)))
case ("dat")
self%write_header => write_obeservation_header_dat
self%write_line => output_observation_line_dat
case ("csv")
self%write_header => write_obeservation_header_csv
self%write_line => output_observation_line_csv
end select
end subroutine initialize_type_output_observation