Routine writes out simulation data, deallocates arrays and prints total runtime
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(toml_table), | intent(inout) | :: | dict |
Dictionary of metadata |
||
type(dect_array), | intent(in) | :: | dects(:) |
Detector array |
||
real(kind=wp), | intent(in) | :: | nscatt |
Total number of scattered photon packets |
||
real(kind=wp), | intent(in) | :: | start |
Start time of simulation. Used to calculate total runtime. |
||
type(history_stack_t), | intent(in) | :: | history |
Photon histyor object |
subroutine finalise(dict, dects, nscatt, start, history) !! Routine writes out simulation data, deallocates arrays and prints total runtime use constants, only : wp, fileplace use detectors, only : dect_array use historyStack, only : history_stack_t use iarray, only : phasor, phasorGLOBAL, jmean, jmeanGLOBAL, absorb, absorbGLOBAL use sim_state_mod, only : state use setupMod, only : dealloc_array use writer_mod, only : normalise_fluence, write_data, write_detected_photons use utils, only : get_time, print_time, str use tomlf, only : toml_table, set_value !> Total number of scattered photon packets real(kind=wp), intent(in) :: nscatt !> Start time of simulation. Used to calculate total runtime. real(kind=wp), intent(in) :: start !> Detector array type(dect_array), intent(in) :: dects(:) !> Photon histyor object type(history_stack_t), intent(in) :: history !> Dictionary of metadata type(toml_table), intent(inout) :: dict integer :: id, numproc, i real(kind=wp) :: nscattGLOBAL, time_taken id = 0 numproc = 1 #ifdef MPI ! collate fluence from all processes call mpi_reduce(jmean, jmeanGLOBAL, size(jmean),MPI_DOUBLE_PRECISION, MPI_SUM,0,MPI_COMM_WORLD) call mpi_reduce(absorb, absorbGLOBAL, size(absorb),MPI_DOUBLE_PRECISION, MPI_SUM,0,MPI_COMM_WORLD) call mpi_reduce(phasor, phasorGLOBAL, size(phasor),MPI_DOUBLE_COMPLEX, MPI_SUM,0,MPI_COMM_WORLD) call mpi_reduce(nscatt,nscattGLOBAL,1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD) #else jmeanGLOBAL = jmean absorbGLOBAL = absorb phasorGLOBAL = phasor nscattGLOBAL = nscatt #endif if(id == 0)then #ifdef _OPENMP print*,'Average # of scatters per photon:',nscattGLOBAL/(state%nphotons) #else print*,'Average # of scatters per photon:',nscattGLOBAL/(state%nphotons*numproc) ! for testing purposes open(newunit=i,file="nscatt.dat") write(i,*)nscattGLOBAL/(state%nphotons) close(i) #endif !write out files !create dict to store metadata and nrrd hdr info call set_value(dict, "grid_data", "fluence map") call set_value(dict, "real_size", str(state%grid%xmax,7)//" "//str(state%grid%ymax,7)//" "//str(state%grid%zmax,7)) call set_value(dict, "nphotons", state%nphotons) call set_value(dict, "source", state%source) call set_value(dict, "experiment", state%experiment) call normalise_fluence(state%grid, jmeanGLOBAL, state%nphotons) call write_data(jmeanGLOBAL, trim(fileplace)//"jmean/"//state%outfile, state, dict) ! if(state%absorb)call write_data(absorbGLOBAL, trim(fileplace)//"deposit/"//state%outfile_absorb, state, dict) !INTENSITY ! call write_data(abs(phasorGLOBAL)**2, trim(fileplace)//"phasor/"//state%outfile, state, dict) end if !write out detected photons if(size(dects) > 0)then call write_detected_photons(dects) block logical :: mask(size(dects)) do i = 1, size(dects) mask(i) = dects(i)%p%trackHistory end do if(state%trackHistory)call history%finish() end block end if time_taken = get_time() - start call print_time(time_taken, 4) #ifdef MPI call MPI_Finalize() #endif call dealloc_array() end subroutine finalise