uEMEP_calculate_exposure Subroutine

public subroutine uEMEP_calculate_exposure()

Arguments

None

Called by

proc~~uemep_calculate_exposure~~CalledByGraph proc~uemep_calculate_exposure uEMEP_calculate_exposure program~uemep uEMEP program~uemep->proc~uemep_calculate_exposure

Source Code

    subroutine uEMEP_calculate_exposure()
        integer :: i, j
        integer :: i_source
        integer :: i_cross, j_cross
        real :: weighted_concentration(n_source_index,n_pollutant_loop)
        real :: subgrid_area_scaling
        real :: population_total(n_pollutant_loop)
        real :: max_val(n_pollutant_loop)
        integer :: i_max(n_pollutant_loop), j_max(n_pollutant_loop), i_cross_max(n_pollutant_loop), j_cross_max(n_pollutant_loop)
        real :: val_limit(n_compound_nc_index)
        real :: pop_over_limit(subgrid_dim(t_dim_index),n_pollutant_loop)
        real :: grids_over_limit(subgrid_dim(t_dim_index),n_pollutant_loop)
        integer :: t
        integer :: i_pollutant

        write(unit_logfile,'(A)') ''
        write(unit_logfile,'(A)') '================================================================'
        write(unit_logfile,'(A)') 'Calculating exposure (uEMEP_calculate_exposure)'
        write(unit_logfile,'(A)') '================================================================'

        ! Loop through target grid and find the population
        exposure_subgrid = 0.0
        subgrid_area_scaling = 1.0
        
        ! Scale population due to difference in grid size sizes only when population grid is used
        ! Only works when the target subgrid is smaller than the population subgrid
        if (population_index .eq. 2) then
            ! This does not work when target grid is larger than the population grid
            subgrid_area_scaling = (subgrid_delta(x_dim_index)*subgrid_delta(y_dim_index))/(population_subgrid_delta(x_dim_index)*population_subgrid_delta(y_dim_index))
        end if

        population_total = 0
        max_val = -1.0
        pop_over_limit = 0.0
        grids_over_limit = 0.0
        val_limit(no2_index) = 100.0 ! TODO: Need to fix this later
        val_limit(pm10_index) = 50.0 ! TODO: Need to fix this later
        val_limit(pm25_index)=30.0 ! TODO: Need to fix this later
        i_max = 0; j_max = 0

        do j = 1, subgrid_dim(y_dim_index)
            do i = 1, subgrid_dim(x_dim_index)
                i_cross = crossreference_target_to_population_subgrid(i,j,x_dim_index)
                j_cross = crossreference_target_to_population_subgrid(i,j,y_dim_index)
                do i_source = 1, n_source_index
                    if (calculate_source(i_source) .and. use_subgrid(i,j,i_source)) then
                        exposure_subgrid(i,j,:,i_source,:) = subgrid(i,j,:,local_subgrid_index,i_source,:)*population_subgrid(i_cross,j_cross,population_data_type)*subgrid_area_scaling
                    end if
                end do

                ! Calculate number over limit. Does not work for hourly data properly yet
                i_source = allsource_index
                do i_pollutant = 1, n_pollutant_loop
                    do t = 1, subgrid_dim(t_dim_index)
                        if (use_subgrid(i,j,i_source)) then
                            if (pollutant_loop_index(i_pollutant) .eq. no2_nc_index) then
                                if (comp_subgrid(i,j,t,pollutant_loop_index(i_pollutant)) .gt. val_limit(pollutant_loop_index(i_pollutant))) then
                                    pop_over_limit(t,i_pollutant) = pop_over_limit(t,i_pollutant) + population_subgrid(i_cross,j_cross,population_data_type)*subgrid_area_scaling
                                    grids_over_limit(t,i_pollutant) = grids_over_limit(t,i_pollutant) + 1
                                end if
                            end if
                        end if
                    end do

                    if (use_subgrid(i,j,allsource_index)) then
                        exposure_subgrid(i,j,:,allsource_index,i_pollutant) = subgrid(i,j,:,total_subgrid_index,allsource_index,i_pollutant)*population_subgrid(i_cross,j_cross,population_data_type)*subgrid_area_scaling
                        population_total(i_pollutant) = population_total(i_pollutant) + population_subgrid(i_cross,j_cross,population_data_type)*subgrid_area_scaling
                        if (sum(subgrid(i,j,:,total_subgrid_index,allsource_index,i_pollutant))/subgrid_dim(t_dim_index) .gt. max_val(i_pollutant)) then
                            max_val(i_pollutant) = sum(subgrid(i,j,:,total_subgrid_index,allsource_index,i_pollutant))/subgrid_dim(t_dim_index)
                            i_max(i_pollutant) = i
                            j_max(i_pollutant) = j
                        end if
                        i_cross_max(i_pollutant) = crossreference_target_to_population_subgrid(i_max(i_pollutant),j_max(i_pollutant),x_dim_index)
                        j_cross_max(i_pollutant) = crossreference_target_to_population_subgrid(i_max(i_pollutant),j_max(i_pollutant),y_dim_index)
                    end if
                end do
            end do
        end do


        do i_pollutant = 1, n_pollutant_loop
            write(unit_logfile,'(A)') 'Population weighted concentration and max time average concentration (with population) by source per period for '//trim(input_comp_name)
            weighted_concentration(allsource_index,i_pollutant) = sum(exposure_subgrid(:,:,:,allsource_index,i_pollutant))/population_total(i_pollutant)/subgrid_dim(t_dim_index)
            write(unit_logfile,'(A24,2f12.2,2f12.0)') 'Total '//trim(pollutant_file_str(pollutant_loop_index(i_pollutant)))//': ', weighted_concentration(allsource_index,i_pollutant), max_val(i_pollutant), population_total(i_pollutant), population_subgrid(i_cross_max(i_pollutant), j_cross_max(i_pollutant), population_data_type)

            ! Calculate population weighted values for each source
            do i_source = 1, n_source_index
                if (calculate_source(i_source)) then
                    weighted_concentration(i_source,i_pollutant) = sum(exposure_subgrid(:,:,:,i_source,i_pollutant))/population_total(i_pollutant)/subgrid_dim(t_dim_index)
                    write(unit_logfile,'(A24,2f12.2)') trim(source_file_str(i_source))//': ',weighted_concentration(i_source,i_pollutant),sum(subgrid(i_max(i_pollutant),j_max(i_pollutant),:,local_subgrid_index,i_source,i_pollutant))/subgrid_dim(t_dim_index)
                end if
            end do

            write(unit_logfile,'(A24,2f12.2)') 'nonlocal: ', weighted_concentration(allsource_index,i_pollutant)-sum(weighted_concentration(:,i_pollutant))+weighted_concentration(allsource_index,i_pollutant), &
                2*sum(subgrid(i_max(i_pollutant),j_max(i_pollutant),:,total_subgrid_index,allsource_index,i_pollutant))/subgrid_dim(t_dim_index)-sum(subgrid(i_max(i_pollutant),j_max(i_pollutant),:,local_subgrid_index,:,i_pollutant))/subgrid_dim(t_dim_index)

            ! In case of no2 recalculate the total and present it again as no2 and not nox
            if (pollutant_loop_index(i_pollutant) .eq. nox_nc_index) then
                do j = 1, subgrid_dim(y_dim_index)
                    do i = 1, subgrid_dim(x_dim_index)
                        i_cross = crossreference_target_to_population_subgrid(i,j,x_dim_index)
                        j_cross = crossreference_target_to_population_subgrid(i,j,y_dim_index)
                        if (use_subgrid(i,j,allsource_index)) then
                            exposure_subgrid(i,j,:,allsource_index,i_pollutant) = comp_subgrid(i,j,:,no2_nc_index)*population_subgrid(i_cross,j_cross,population_data_type)*subgrid_area_scaling
                        end if
                    end do
                end do
                weighted_concentration(allsource_index,i_pollutant) = sum(exposure_subgrid(:,:,:,allsource_index,i_pollutant))/population_total(i_pollutant)/subgrid_dim(t_dim_index)
                write(unit_logfile,'(A24,2f12.2)') 'Total no2: ', weighted_concentration(allsource_index,i_pollutant), sum(comp_subgrid(i_max(i_pollutant),j_max(i_pollutant),:,no2_nc_index))/subgrid_dim(t_dim_index)
                write(unit_logfile,'(A24,f12.2)') 'Population over limit: ', maxval(pop_over_limit)
                write(unit_logfile,'(A24,f12.2)') 'Grids over limit: ', maxval(grids_over_limit)
            end if
        end do !pollutant loop

    end subroutine uEMEP_calculate_exposure