module output use constantParameters, only: dp implicit none public private:: dataRef_id, dataBC_id, dataF_id, dataPhi_id, dataCum_id private:: formatFloat, formatSep, formatTime integer:: everyOutput, everyWrite character(:), allocatable:: pathOutput integer, parameter:: dataRef_id = 10 integer, parameter:: dataBC_id = 20 integer, parameter:: dataF_id = 30 integer, parameter:: dataPhi_id = 40 integer, parameter:: dataCum_id = 50 integer, parameter:: dataTime_id = 60 character(len=*), parameter :: formatInt = 'I0' character(len=7), parameter:: formatFloat = 'ES0.6e3' character(len=3), parameter:: formatSep = '","' character(len=7):: formatTime contains subroutine setTimeFormat(nt) integer, intent(in):: nt integer:: l l=max(1,ceiling(log10(real(nt)))) write(formatTime, '(A2,I0,".",I0,A1)') '(I',l,l,')' end subroutine setTimeFormat function setZFormat(Z) result(ZString) real(dp), intent(in):: Z character(len=4):: ZString write(ZString, '(F4.1)') Z end function setZFormat subroutine createPath() character(8) :: date_now character(10) :: time_now call date_and_time(date_now, time_now) !Compose the folder name pathOutput = date_now(1:4) // '-' // date_now(5:6) // '-' // date_now(7:8) // '_' // & time_now(1:2) // '.' // time_now(3:4) // '.' // time_now(5:6) // '/' call system('mkdir ' // pathOutput) end subroutine createPath subroutine writeOutputF(t, dt, nz, nr, r, nv, v, f, Z_list) use referenceValues, only: L_ref, n_ref, u_ref, t_ref integer, intent(in):: t integer, intent(in):: nz, nr, nv real(dp), intent(in):: dt real(dp), intent(in):: r(1:nr) real(dp), intent(in):: v(1:nv) real(dp), intent(in):: f(1:nr,1:nv) real(dp), intent(in):: Z_list(1:nz) character(len=30) :: myfmt character(:), allocatable:: filename integer:: i, j character(len=10):: timeString character(len=4) :: ZString do j = 1, nz write (timeString, formatTime) t ZString = setZFormat(Z_list(j)) filename = 'time_' // trim(timeString) // '_Z_' // trim(adjustl(ZString)) // '_f_i.csv' write (*, '(A, A)') 'Writing: ', filename open(unit=dataF_id, file=pathOutput // filename) write(dataF_id, '(A)') "t (s)" write(dataF_id, '('//formatFloat//')') t*dt*t_ref write(dataF_id, '(A)') "Z" write(dataF_id, '('//formatFloat//')') Z_list(j) write(myfmt, "(I0)") nr myfmt = '(A,' // trim(myfmt) // '(' // formatSep // ',' // formatFloat // '))' write(dataF_id, myfmt) "v (m/s) / r (m)", r*L_ref write(myfmt, "(I0)") nr myfmt = '(' // formatFloat // ',' // trim(myfmt) // '(' // formatSep // ',' // formatFloat // '))' do i = 1, nv write(dataF_id, myfmt) v(i)*u_ref, f(:,i)*n_ref/u_ref end do close(unit=dataF_id) end do end subroutine writeOutputF subroutine writeOutputPhi(t, dt, nr, r, phi, E, n_e) use constantParameters, only: eV_to_K use referenceValues, only: L_ref, phi_ref, t_ref, n_ref integer, intent(in):: t integer, intent(in):: nr real(dp), intent(in):: dt real(dp), intent(in):: r(1:nr) real(dp), intent(in):: phi(1:nr) real(dp), intent(in):: E(1:nr) real(dp), intent(in):: n_e(1:nr) character(:), allocatable:: filename integer:: i character(len=10):: timeString write (timeString, formatTime) t filename = 'time_' // trim(timeString)//'_phi.csv' write (*, '(A, A)') 'Writing: ', filename open(unit=dataPhi_id, file=pathOutput//filename) write(dataPhi_id, '(A)') "t (s)" write(dataPhi_id, '('//formatFloat//')') t*dt*t_ref write(dataPhi_id, '(A,3('//formatSep//',A))') "r (m)","phi (V)","E (V m^-1)","n_e (m^-3)" do i = 1, nr write(dataPhi_id, '('//formatFloat//',3('//formatSep //','//formatFloat//'))') & r(i)*L_ref, & phi(i)*phi_ref, & E(i)*phi_ref/L_ref, & n_e(i)*n_ref end do close(unit=dataPhi_id) end subroutine writeOutputPhi subroutine writeOutputMom(t, dt, nz, nr, r, n_i, u_i, T_i, Z_list) use constantParameters, only: eV_to_K use referenceValues, only: L_ref, t_ref, n_ref, u_ref, Temp_ref integer, intent(in):: t integer, intent(in):: nr integer, intent(in):: nz real(dp), intent(in):: dt real(dp), intent(in):: r(1:nr) real(dp), intent(in):: n_i(1:nz,1:nr) real(dp), intent(in):: u_i(1:nz,1:nr) real(dp), intent(in):: T_i(1:nz,1:nr) real(dp), intent(in):: Z_list(1:nz) character(:), allocatable:: filename integer:: i integer:: j character(len=10):: timeString character(len=4) :: ZString do j = 1, nz write (timeString, formatTime) t ZString = setZFormat(Z_list(j)) filename = 'time_' // trim(timeString) // '_Z_' // trim(adjustl(ZString)) // '_mom_i.csv' write (*, '(A, A)') 'Writing: ', filename open(unit=dataPhi_id, file=pathOutput//filename) write(dataPhi_id, '(A)') "t (s)" write(dataPhi_id, '('//formatFloat//')') t*dt*t_ref write(dataPhi_id, '(A)') "Z" write(dataPhi_id, '('//formatFloat//')') Z_list(j) write(dataPhi_id, '(A,3('//formatSep//',A))') "r (m)","n_i (m^-3)","u_i (m s^-1)", "T_i (eV)" do i = 1, nr write(dataPhi_id, '('//formatFloat//',3('//formatSep //','//formatFloat//'))') & r(i)*L_ref, & n_i(j,i)*n_ref, & u_i(j,i)*u_ref, & T_i(j,i)*Temp_ref/ev_to_K end do close(unit=dataPhi_id) end do end subroutine writeOutputMom subroutine writeOutputBoundary(t, dt, n, u, Temp, Zinj) use constantParameters, only: eV_to_K use referenceValues, only: t_ref, n_ref, u_ref, Temp_ref integer, intent(in):: t real(dp), intent(in):: dt real(dp), intent(in):: n, u, Temp, Zinj character(len=6), parameter:: filename = 'bc.csv' logical:: res inquire(file=pathOutput // filename, exist=res) if (.not. res) then write (*, '(A, A)') 'Writing: ', filename open(unit=dataBC_id, file=pathOutput // filename, action='write', position='append') write(dataBC_id, '(A,4(' // formatSep // ',A))') 't (s)', 'n (m^-3)', 'u (m s^-1)', 'T (eV)','Zinj' close(dataBC_id) end if open(unit=dataBC_id, file=pathOutput // filename, action='write', position='append') write(dataBC_id, '(' // formatFloat // ',4('// formatSep // ',' // formatFloat // '))') & t*dt*t_ref, n*n_ref, u*u_ref, Temp*Temp_ref/eV_to_K, Zinj close(dataBC_id) end subroutine writeOutputBoundary ! JG: What is this procedure? ! subroutine writeOutputTime(t, time, bins) ! integer, intent(in):: t ! real(dp), intent(in):: time ! real(dp), intent(in):: bins ! character(len=8), parameter:: filename = 'time.csv' ! logical:: res ! ! inquire(file=pathOutput // filename, exist=res) ! if (.not. res) then ! write (*, '(A, A)') 'Writing: ', filename ! open(unit=dataTime_id, file=pathOutput // filename, action='write', position='append') ! write(dataTime_id, '(A,2(' // formatSep // ',A))') 'timestep', 'duration (s)', '#bins' ! close(dataTime_id) ! ! end if ! ! open(unit=dataTime_id, file=pathOutput // filename, action='write', position='append') ! write(dataTime_id, '(' // formatInt // ',2('// formatSep // ',' // formatFloat // '))') & ! t, time, bins ! ! close(dataTime_id) ! ! end subroutine writeOutputTime subroutine writeOutputZList(nz, Z_list) integer, intent(in):: nz real(dp), intent(in):: Z_list(1:nz) character(:), allocatable:: filename integer:: i filename = 'ZList.csv' write (*, '(A, A)') 'Writing: ', filename open(unit=dataPhi_id, file=pathOutput//filename) write(dataPhi_id, '(A)') "Z_list" do i = 1, nz write(dataPhi_id, '('//formatFloat//')') Z_list(i) end do close(unit=dataPhi_id) end subroutine writeOutputZList subroutine writeOutputRef() use referenceValues, only: t_ref, L_ref, n_ref, u_ref, Temp_ref, phi_ref use constantParameters, only: eV_to_K character(len=7), parameter:: filename = 'ref.csv' write (*, '(A, A)') 'Writing: ', filename open(unit=dataRef_id, file=pathOutput // filename) write(dataRef_id, '(A,5(' // formatSep // ',A))') 't_ref (s)', 'L_ref (m)', 'n_ref (m^-3)', & 'u_ref (m s^-1)', 'T_ref (eV)', 'phi_ref (V)' write(dataRef_id, '(' // formatFloat // ',5('// formatSep // ',' // formatFloat // '))') & t_ref, L_ref, n_ref, & u_ref, Temp_ref/eV_to_K, phi_ref close(dataRef_id) end subroutine writeOutputRef subroutine writeOutputFCum(t, dt, nz, r, nv, v, f, Z_list) use referenceValues, only: L_ref, n_ref, u_ref, t_ref integer, intent(in):: t real(dp), intent(in):: dt integer, intent(in):: nz, nv real(dp), intent(in):: r real(dp), intent(in):: v(1:nv) real(dp), intent(in):: f(1:nz, 1:nv) real(dp), intent(in):: Z_list(1:nz) character(len=30) :: myfmt character(:), allocatable:: filename integer:: i, j character(len=10):: timeString character(len=4) :: ZString do j = 1, nz write (timeString, formatTime) t ZString = setZFormat(Z_list(j)) filename = 'time_' // trim(timeString) // '_Z_' // trim(adjustl(ZString)) // '_fCum_i.csv' write (*, '(A, A)') 'Writing: ', filename open(unit=dataCum_id, file=pathOutput // filename) write(dataCum_id, '(A)') "t (s)" write(dataCum_id, '('//formatFloat//')') t*dt*t_ref write(dataCum_id, '(A)') "Z" write(dataCum_id, '('//formatFloat//')') Z_list(j) write(myfmt, "(I0)") 1 myfmt = '(A,' // trim(myfmt) // '(' // formatSep // ',' // formatFloat // '))' write(dataCum_id, myfmt) "v (m/s) / r (m)", r*L_ref write(myfmt, "(I0)") 1 myfmt = '(' // formatFloat // ',' // trim(myfmt) // '(' // formatSep // ',' // formatFloat // '))' do i = 1, nv write(dataCum_id, myfmt) v(i)*u_ref, f(j,i)*n_ref/u_ref end do close(unit=dataCum_id) end do end subroutine writeOutputFCum end module output