RouteOptimizationClass.f90 Source File


Contents


Source Code

module RouteOptimization
    use iso_fortran_env
    use GeometryClass
    implicit none
    type :: RouteOptimization_
        type(Point_),allocatable,private :: PointList(:)
        real(real64),allocatable,private :: Route(:,:)
        integer(int32), private :: NumOfPoint
        character*50 :: SolverName
    contains
        procedure, public :: init => initRouteOptimization
        procedure, public :: import => importRouteOptimization
        procedure, public :: setSolver => setSolverRouteOptimization
        procedure, public :: run => runRouteOptimization
        procedure, public :: export => exportRouteOptimization
    end type

contains

!##########################################
subroutine initRouteOptimization(obj,NumOfPoint,Dim)
    class(RouteOptimization_),intent(inout) :: obj
    integer(int32),optional,intent(in) :: NumOfPoint, Dim
    integer(int32) :: n,i,dimnum

    n = input(default=100,option=NumOfPoint)
    dimnum = input(default=2, option=Dim)
    allocate(obj%PointList(n) )
    allocate(obj%Route(n,dimnum) )
    obj%Route(:,:)=0.0d0
    do i=1, n
        call obj%PointList(i)%init(dim=Dim)
        obj%PointList(i)%coord(:) = 0.0d0
    enddo
    
end subroutine
!##########################################


!##########################################
subroutine importRouteOptimization(obj,Name)
    class(RouteOptimization_),intent(inout) :: obj
    character(*),optional,intent(in) :: Name
    character*200 :: FileName
    integer(int32) :: i,j,m,n,dim
    if(.not. present(Name) )then
        print *, "Input file path for input file. ( e.g. '/home/ubuntu/file.txt' ) "
        read(*,*) FileName
    else
        FileName=Name
    endif

    open(100,file=trim(FileName))
    read(100,*) obj%NumOfPoint, dim
    call obj%init(NumOfPoint=obj%NumOfPoint,Dim=dim)
    do i=1,obj%NumOfPoint
        read(100,*) obj%PointList(i)%coord(:), obj%PointList(i)%name
        m=size(obj%PointList(i)%coord)
        do j=1,m
            obj%Route(i,j)=obj%PointList(i)%coord(j)
        enddo
    enddo
    close(100)

end subroutine
!##########################################

!##########################################
subroutine setSolverRouteOptimization(obj,SolverName)
    class(RouteOptimization_),intent(inout) :: obj
    character(*),intent(in) :: SolverName
    obj%SolverName =trim(SolverName)
end subroutine
!##########################################

!##########################################
subroutine runRouteOptimization(obj,SolverName, NumOfPoints)
    class(RouteOptimization_),intent(inout) :: obj
    character*200 :: command
    character(*),optional,intent(in) :: SolverName
    integer(int32),optional,intent(in) :: NumOfPoints
    integer(int32) :: i,n,old_id
    real(real64) :: x,y



    ! compile external solver
    if(present(SolverName) )then
        obj%SolverName=trim(SolverName)
    endif
    command = "mpic++ ./src/RouteOptimizationClass/"//trim(obj%SolverName)//".cpp -o "//trim(obj%SolverName)//".out"
    print *, command
    call execute_command_line(trim(command))

    ! create input file for external solver

    n = input(default=size(obj%PointList) ,option=NumOfPoints)
    if(n==0)then
        n=size(obj%PointList)
    endif
    open(120,file="points.txt")
    write(120,*) n 
    do i=1, n
        write(120,*) obj%PointList(i)%coord(1:2)
    enddo
    close(120)
    command=""
    command="./"//trim(obj%SolverName)//".out"
    
    ! run!
    call execute_command_line(trim(command))
end subroutine
!##########################################

!##########################################
subroutine exportRouteOptimization(obj,Repository)
    class(RouteOptimization_),intent(inout) :: obj
    character(*),optional,intent(in) :: Repository
    character*200 :: RepositoryName
    integer(int32) :: i,n,old_id
    real(real64) :: x,y
    
    if(present(Repository) )then
        RepositoryName=Repository
    else
        print *, "Input repository path for result file. (please end it without /, e.g. '/home/ubuntu/results' ) "
        read(*,*) RepositoryName
    endif

    open(120,file="points.txt")
    read(120,*) n
    print *, "Number of points are ", n
    close(120)

    ! print initial route
    open(120, file=trim(RepositoryName)//"/RouteOpt_InitialRoute.csv")
    write(120,*) 'latitude",longitude,Field Name'
    do i=1,n
        write(120,* ) obj%PointList(i)%coord(1),',', &
        obj%PointList(i)%coord(2),',', trim(obj%PointList(i)%Name)
    enddo
    close(120)

    ! import optimal route
    ! print initial route
    open(121, file=trim(RepositoryName)//"/RouteOpt_OptimalRoute.csv")
    !open(121, file="RouteOpt_OptimalRoute.txt", status="replace")
    write(121,*) 'latitude,longitude,Field Name'
    open(120, file="solution.txt", status="old")
    do i=1,n
        read(120,* ) x,y, old_id
        write(121,* ) obj%PointList(old_id+1)%coord(1),',', &
        obj%PointList(old_id+1)%coord(2),',', trim(obj%PointList(old_id+1)%Name)
    enddo
    close(120)
    close(121)

end subroutine
!##########################################


end module