vlaplex/moduleOutput.f90
JGonzalez 052a4dc05e Corrections to tag v2.5
Small set of corrections to the tag v2.5.

Includes changes to python scripts to plot data.

Includes new 'fast' setup conditions that allow to output cases in an
hour or so with still a good CFL condition and grid resolution.
2025-04-08 16:32:59 +02:00

311 lines
11 KiB
Fortran

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
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=10) :: ZString
do j = 1, nz
write (timeString, formatTime) t
write(ZString, '(F6.3)') Z_list(j)
ZString = adjustl(trim(ZString))
ZString = adjustl(ZString)
ZString = ZString(:index(ZString // '.', '.') - 1) // ZString(index(ZString, '.') + 1:)
filename = 'time_' // trim(timeString) // '_Z' // trim(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=10) :: ZString
do j = 1, nz
write (timeString, formatTime) t
write(ZString, '(F6.3)') Z_list(j)
ZString = adjustl(trim(ZString))
ZString = adjustl(ZString)
ZString = ZString(:index(ZString // '.', '.') - 1) // ZString(index(ZString, '.') + 1:)
filename = 'time_' // trim(timeString) // '_Z' // trim(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=10) :: ZString
do j = 1, nz
write (timeString, formatTime) t
write(ZString, '(F6.3)') Z_list(j)
ZString = adjustl(trim(ZString))
ZString = adjustl(ZString)
ZString = ZString(:index(ZString // '.', '.') - 1) // ZString(index(ZString, '.') + 1:)
filename = 'time_' // trim(timeString) // '_Z' // trim(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