initialize_type_output_observation Module Subroutine

module subroutine initialize_type_output_observation(self, input, coordinate, domain, dir_output, variable_name)

Arguments

Type IntentOptional Attributes Name
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(len=*), intent(in) :: dir_output
character(len=*), intent(in) :: variable_name

Calls

proc~~initialize_type_output_observation~~CallsGraph proc~initialize_type_output_observation initialize_type_output_observation get_id get_id proc~initialize_type_output_observation->get_id is_inside is_inside proc~initialize_type_output_observation->is_inside proc~create_element create_element proc~initialize_type_output_observation->proc~create_element proc~get_num_elements type_domain%get_num_elements proc~initialize_type_output_observation->proc~get_num_elements proc~type_dp_3d_initialize type_dp_3d%type_dp_3d_initialize proc~initialize_type_output_observation->proc~type_dp_3d_initialize interface~allocate_array allocate_array proc~type_dp_3d_initialize->interface~allocate_array proc~allocate_rank1_int16 allocate_rank1_int16 interface~allocate_array->proc~allocate_rank1_int16 proc~allocate_rank1_int32 allocate_rank1_int32 interface~allocate_array->proc~allocate_rank1_int32 proc~allocate_rank1_int64 allocate_rank1_int64 interface~allocate_array->proc~allocate_rank1_int64 proc~allocate_rank1_int8 allocate_rank1_int8 interface~allocate_array->proc~allocate_rank1_int8 proc~allocate_rank1_logical1 allocate_rank1_logical1 interface~allocate_array->proc~allocate_rank1_logical1 proc~allocate_rank1_logical4 allocate_rank1_logical4 interface~allocate_array->proc~allocate_rank1_logical4 proc~allocate_rank1_logical8 allocate_rank1_logical8 interface~allocate_array->proc~allocate_rank1_logical8 proc~allocate_rank1_real128 allocate_rank1_real128 interface~allocate_array->proc~allocate_rank1_real128 proc~allocate_rank1_real32 allocate_rank1_real32 interface~allocate_array->proc~allocate_rank1_real32 proc~allocate_rank1_real64 allocate_rank1_real64 interface~allocate_array->proc~allocate_rank1_real64 proc~allocate_rank2_int16 allocate_rank2_int16 interface~allocate_array->proc~allocate_rank2_int16 proc~allocate_rank2_int32 allocate_rank2_int32 interface~allocate_array->proc~allocate_rank2_int32 proc~allocate_rank2_int64 allocate_rank2_int64 interface~allocate_array->proc~allocate_rank2_int64 proc~allocate_rank2_int8 allocate_rank2_int8 interface~allocate_array->proc~allocate_rank2_int8 proc~allocate_rank2_logical1 allocate_rank2_logical1 interface~allocate_array->proc~allocate_rank2_logical1 proc~allocate_rank2_logical4 allocate_rank2_logical4 interface~allocate_array->proc~allocate_rank2_logical4 proc~allocate_rank2_logical8 allocate_rank2_logical8 interface~allocate_array->proc~allocate_rank2_logical8 proc~allocate_rank2_real128 allocate_rank2_real128 interface~allocate_array->proc~allocate_rank2_real128 proc~allocate_rank2_real32 allocate_rank2_real32 interface~allocate_array->proc~allocate_rank2_real32 proc~allocate_rank2_real64 allocate_rank2_real64 interface~allocate_array->proc~allocate_rank2_real64 proc~error_message error_message proc~allocate_rank1_int16->proc~error_message proc~allocate_rank1_int32->proc~error_message proc~allocate_rank1_int64->proc~error_message proc~allocate_rank1_int8->proc~error_message proc~allocate_rank1_logical1->proc~error_message proc~allocate_rank1_logical4->proc~error_message proc~allocate_rank1_logical8->proc~error_message proc~allocate_rank1_real128->proc~error_message proc~allocate_rank1_real32->proc~error_message proc~allocate_rank1_real64->proc~error_message proc~allocate_rank2_int16->proc~error_message proc~allocate_rank2_int32->proc~error_message proc~allocate_rank2_int64->proc~error_message proc~allocate_rank2_int8->proc~error_message proc~allocate_rank2_logical1->proc~error_message proc~allocate_rank2_logical4->proc~error_message proc~allocate_rank2_logical8->proc~error_message proc~allocate_rank2_real128->proc~error_message proc~allocate_rank2_real32->proc~error_message proc~allocate_rank2_real64->proc~error_message log_error log_error proc~error_message->log_error

Called by

proc~~initialize_type_output_observation~~CalledByGraph proc~initialize_type_output_observation initialize_type_output_observation interface~initialize_type_output_observation type_output_observation%initialize_type_output_observation interface~initialize_type_output_observation->proc~initialize_type_output_observation proc~initialize_type_output type_output%initialize_type_output proc~initialize_type_output->interface~initialize_type_output_observation

Source Code

    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