dropletCount.f90 Source File


This file depends on

sourcefile~~dropletcount.f90~~EfferentGraph sourcefile~dropletcount.f90 dropletCount.f90 sourcefile~boxcounter.f90 boxCounter.f90 sourcefile~dropletcount.f90->sourcefile~boxcounter.f90 sourcefile~casename.f90 caseName.f90 sourcefile~dropletcount.f90->sourcefile~casename.f90 sourcefile~conditionvalue.f90 conditionValue.f90 sourcefile~dropletcount.f90->sourcefile~conditionvalue.f90 sourcefile~virusdroplet.f90 virusDroplet.f90 sourcefile~dropletcount.f90->sourcefile~virusdroplet.f90 sourcefile~vtkmesh_operator.f90 vtkMesh_operator.f90 sourcefile~dropletcount.f90->sourcefile~vtkmesh_operator.f90 sourcefile~simplefile_reader.f90 simpleFile_reader.f90 sourcefile~boxcounter.f90->sourcefile~simplefile_reader.f90 sourcefile~casename.f90->sourcefile~simplefile_reader.f90 sourcefile~unstructuredelement.f90 unstructuredElement.f90 sourcefile~vtkmesh_operator.f90->sourcefile~unstructuredelement.f90

Contents

Source Code


Source Code

program dropletCount
    !!ボックスを通過した飛沫をカウントする。
    !!飛沫計算の出力ファイルを順に読み込み、各ボックスに対して内外判定を行う。
    !!ボックス側では、通過した飛沫のIDしか見ておらず、同じIDの飛沫のダブルカウントなどは起こらない。
    use virusDroplet_m
    use conditionValue_m
    ! use dropletEquation_m
    use boxCounter_m
    use caseName_m
    implicit none
    integer n, i_box, num_box, caseID
    character(50), allocatable :: caseName_array(:)
    character(:), allocatable :: caseName, fname
    integer, allocatable :: id_array(:)
    type(virusDroplet_t), allocatable :: mainDroplets(:), droplets(:)
    type(conditionValue_t) condVal
    ! type(BasicParameter) baseParam
    type(boxCounter), allocatable :: box_array(:)

    type boxResult_t
        integer num_droplet
        real volume, RoI
    end type
    type(boxResult_t), allocatable :: bResult(:)

    call case_check(caseName_array)
    !print*, 'caseName = ?'
    !read(5, *) caseName

    do caseID = 1, size(caseName_array)
        caseName = trim(caseName_array(caseID))
        condVal = read_condition(caseName)
        ! baseParam = BasicParameter_(condVal%dt, condVal%L, condVal%U)
    
        box_array = get_box_array(caseName, condVal%num_drop)
    
        num_box = size(box_array)
    
        do n = 0, condVal%stepEnd, condVal%outputInterval
            if(n==0) then
                fname = caseName//'/backup/InitialDistribution.bu'
            else
                block
                    character(255) str
                    write(str,'("'//caseName//'/backup/backup_", i0 , ".bu")') n
                    fname = trim(str)
                end block
            end if
    
            mainDroplets = read_backup(fname)
    
            do i_box = 1, num_box
                id_array = dropletIDinBox(mainDroplets, dble(box_array(i_box)%min_cdn), dble(box_array(i_box)%max_cdn))
                call box_array(i_box)%add_Flag(id_array)
            end do
    
        end do
    
        allocate(bResult(num_box))

        do i_box = 1, num_box
            id_array = box_array(i_box)%get_FlagID()
            droplets = mainDroplets(id_array)
            bResult(i_box)%num_droplet = size(droplets)
            bResult(i_box)%volume = real(dropletTotalVolume(droplets) *condVal%L**3 * 1.d6 )    !有次元化[m^3]したのち、[ml]に換算
        end do

        bResult(:)%RoI = RateOfInfection(bResult(:)%volume) !1分間あたりの感染確率を計算
    
        call output_countCSV
        call output_boxVTK

        deallocate(bResult)

    end do

    contains

    subroutine output_countCSV
        integer n_unit, i
        character(:), allocatable :: csvFName

        csvFName = caseName//'/BoxCount.csv'
        print*, 'output: ', csvFName

        open(newunit=n_unit, file=csvFName, status='replace')
        
            write(n_unit, '("x,y,z,num_drop,volume[ml],RoI")')
            
            do i = 1, size(box_array)
                write(n_unit,'(*(g0:,","))') box_array(i)%center, bResult(i)%num_droplet, bResult(i)%volume, bResult(i)%RoI
            end do

        close(n_unit)

    end subroutine

    subroutine output_boxVTK
        use VTK_operator_m
        type(UnstructuredGrid_inVTK) mesh
        integer i, j, k
        real, parameter :: trans(3,8) = reshape([ &
                                            0.0,0.0,0.0, 1.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0, &
                                            0.0,0.0,1.0, 1.0,0.0,1.0, 0.0,1.0,1.0, 1.0,1.0,1.0], shape(trans))
                                        
        real, allocatable :: xyz(:,:)
        integer, allocatable :: vertices(:,:), types(:)
                                        
        allocate(xyz(3, num_box*8))
        allocate(vertices(8, num_box), types(num_box))
        do i = 1, num_box

            do j = 1, 8
                k = j + 8*(i-1)
                xyz(:,k) = box_array(i)%min_cdn(:) + box_array(i)%width(:)*trans(:,j)
                vertices(j,i) = k
            end do

            types(i) = 11

        end do

        mesh = UnstructuredGrid_inVTK_(xyz, vertices, types)

        call mesh%output(caseName//'/Box.vtk', cellScalar=bResult(:)%RoI, scalarName='RoI')

    end subroutine

    !>1分間あたりの感染確率を計算(もとの資料では1時間あたりの感染確率だが、1分間あたりに換算)
    elemental real function RateOfInfection(volume)
        real, intent(in) :: volume

        RateOfInfection = 1. - exp(-volume*1.e7 / (900./60.))

    end function

end program dropletCount