program rcmu2tec
! this routine converts the file 'rcmu.dat' generated
! by the routine tomhd.f90 to a format that tecplot can read
! 9/9 frt
IMPLICIT NONE
integer :: idim,jdim,kdim
integer :: i,j,k,kk
integer :: itime,itime0,itimef
integer, allocatable, dimension(:) :: ikflav
integer :: ks,kf
real :: time,start_time_min,time_min,eps,r
integer, allocatable, dimension(:) :: imin_j
real, allocatable, dimension(:) :: alam,etac
real, allocatable, dimension(:,:) :: xi,yi,zi
real, allocatable, dimension(:,:) :: xe,ye,ze
real, allocatable, dimension(:,:) :: vm,v,birk,bmin,pressure,pvg,dsob3
real, allocatable, dimension(:,:) :: densi, dense, ti, te, pressurei,pressuree
real, allocatable, dimension(:,:,:) :: eeta,veff,partial_pressures
real, parameter :: mass_proton = 1.67e-27
real, parameter :: mass_electron = 9.1e-31
real, parameter :: coulomb = 1.67e-19
logical :: threed,tecplot360
logical :: onefile,opened
logical :: firstpass =.true.
character (len=9) :: chartime
character (len=45) :: tecoutfile
character (len=1) :: ans
CHARACTER (LEN=05) :: char_kvalue='xxxxx'
write(*,'(a,$)')' enter the time to start, end reading: '
read(5,*)itime0,itimef
write(*,'(a,$)')' enter start time on min: '
read(5,*)start_time_min
write(*,'(a,$)')' do you want 3d data information (y/n)?: '
read(5,'(a1)')ans
if(ans.eq.'y'.or.ans.eq.'Y')threed=.true.
write(*,'(a,$)')' do you want it all in one file (y/n)?: '
onefile=.false.
read(5,'(a1)')ans
if(ans.eq.'y'.or.ans.eq.'Y')onefile=.true.
opened = .false.
write(*,'(a,$)')' do you want it for tecplot360(y/n)?: '
tecplot360=.false.
read(5,'(a1)')ans
if(ans.eq.'y'.or.ans.eq.'Y')tecplot360=.true.
open(unit=1,file='rcmu.dat',status='old',action='read',&
form='unformatted')
itime = 0
do
if(itime < itimef)then
read(1,end=10)itime,idim,jdim,kdim
write(*,'(a,i6)')' reading in time =',itime
! only allocate once
if( .not.allocated(alam)) then
allocate (alam(kdim),etac(kdim),ikflav(kdim))
allocate (xi(idim,jdim),yi(idim,jdim),zi(idim,jdim))
allocate (xe(idim,jdim),ye(idim,jdim),ze(idim,jdim))
allocate (vm(idim,jdim),v(idim,jdim))
allocate (birk(idim,jdim),dsob3(idim,jdim))
allocate (eeta(idim,jdim,kdim),bmin(idim,jdim))
allocate (veff(idim,jdim,kdim))
allocate (partial_pressures(idim,jdim,kdim))
allocate (pressure(idim,jdim))
allocate (pressuree(idim,jdim))
allocate (pressurei(idim,jdim))
allocate (densi(idim,jdim))
allocate (dense(idim,jdim))
allocate (ti(idim,jdim))
allocate (te(idim,jdim))
allocate (pvg(idim,jdim))
allocate (imin_j(jdim))
end if
read(1)alam,etac,ikflav
read(1)xe,ye,ze,xi,yi,zi,vm,v,eeta,birk,bmin
if(firstpass)then
if(threed)then
do k=1,kdim
write(6,*)' alam(',k,')', alam(k)
end do
write(6,*)' enter the start and end k vals threed output'
write(6,*)'enter 0 0 for all the data'
read(6,*)ks,kf
if(ks == 0 .and. kf ==0)then
ks = 1
kf = kdim
endif
endif
END IF
firstpass=.false.
! write(*,*)'alam: ',alam
! output file
if(itime >= itime0)then
time_min = itime/60.+start_time_min
call min2hr(time_min,chartime)
if(.not.opened.and.onefile)then
if(threed)then
tecoutfile = adjustr('tec3dn') // chartime // '.dat'
write(*,*)' writing file =',tecoutfile
else
tecoutfile = adjustr('tecn') // chartime // '.dat'
write(*,*)' writing file =',tecoutfile
endif
endif
if(.not.opened) open(unit=2,file=tecoutfile,status='unknown')
! add corotation
do j=1,jdim
do i=1,idim
if(vm(i,j) > 0)then
r = sqrt(xe(i,j)**2+ye(i,j)**2)
! v(i,j) = v(i,j) - 92400./r
do k=1,kdim
veff(i,j,k) = v(i,j) + alam(k)*vm(i,j)
end do
end if
end do
end do
! now output the files
if(threed)then
if(.not.opened)then
write(2,*)' VARIABLES =, "xe(Re)" "ye(Re)" "xi(Re)"'&
,' "yi(Re)" "zi(Re)" ' &
,' "v(V)" "vm" "birk(mA/m^2)" "bmin(nT)" "pressure(Pa)"'&
,' "pVg"'&
,' "ion density(cc)" "electron density(cc)"'&
,' "ion pressure(Pa)" "electron pressurei(Pa)"'&
,' "ion temperature(eV)" "electron temperature(eV)"'&
,' "eeta" "veff" "partial_pressures"'
end if
! 2d
else
if(.not.opened)then
write(2,*)' VARIABLES =, "xe(Re)" "ye(Re)" "xi(Re)" '&
,' "yi(Re)" "zi(Re)" ' &
,' "v(V)" "vm" "birk(mA/m^2)" "bmin(nT)" '&
,' "pressure(Pa)"'&
,' "pVg"'&
,' "ion density(cc)" "electron density(cc)"'&
,' "ion pressure(Pa)" "electron pressure(Pa)"'&
,' "ion temperature(eV)" "electron temperature(eV)"'&
,' "eeta0" "veff0" "partial_pressures(Pa)"'
end if
! if(tecplot360)then
! write(2,*)' ZONE, T ="',itime,'" ,I=',idim,' ,J=',jdim ,&
! ' , DATAPACKING=BLOCK',' ,SOLUTIONTIME=',itime
! else
! write(2,*)' ZONE, T ="',itime,'" ,I=',idim,' ,J=',jdim , &
! &', DATAPACKING=BLOCK'
! endif
end if
pressure = 0.0
pressuree = 0.0
pressurei = 0.0
partial_pressures = 0.0
densi = 0.0
dense = 0.0
ti = 0.0
te = 0.0
opened = .true.
do j=1,jdim
! process the data
! imin_j is the last closed fieldline
imin_j(j) = 2
do i=idim,2,-1
if(vm(i,j) < 0)then
imin_j(j) = i + 1
exit
end if
end do
eps = 1.0e-3
do i=imin_j(j)-1,1,-1
xe(i,j) = xe(i+1,j)*(1 + eps)
ye(i,j) = ye(i+1,j)*(1 + eps)
end do
! now set the pressure
do i=imin_j(j),idim
do kk=1,kdim
pressure(i,j) = pressure(i,j) + 1.67e-35*abs(alam(kk))*&
eeta(i,j,kk)*vm(i,j)**2.5
veff(i,j,kk) = v(i,j) + vm(i,j)*alam(kk)
! partial pressures
partial_pressures(i,j,kk) = 1.67e-35*abs(alam(kk))*&
eeta(i,j,kk)*vm(i,j)**2.5
if(vm(i,j) <0.0)partial_pressures(i,j,kk)=0.0
if(alam(kk) > 0)then
densi(i,j) = densi(i,j) + 1.5694E-16*eeta(i,j,kk)*vm(i,j)**1.5
pressurei(i,j) = pressurei(i,j) + 1.67e-35*abs(alam(kk))*&
eeta(i,j,kk)*vm(i,j)**2.5
else
dense(i,j) = dense(i,j) + 1.5694E-16*eeta(i,j,kk)*vm(i,j)**1.5
pressuree(i,j) = pressuree(i,j) + 1.67e-35*abs(alam(kk))*&
eeta(i,j,kk)*vm(i,j)**2.5
end if
end do
end do
end do
! pv^gamma
where(vm > 0)
pvg = pressure*vm**(-2.5)*1.0e9 ! convert to rcm units
end where
! ion temperature
where(vm > 0)
where(densi > 0)
ti = pressurei/densi/coulomb
end where
where(dense > 0)
te = pressuree/dense/coulomb
end where
end where
! reset to avoid Inf and NaN
where (vm < 0.0)
pressure = 0.0
pressurei = 0.0
pressuree = 0.0
densi = 0.0
dense = 0.0
ti = 0.0
te = 0.0
pvg = 0.0
end where
! output the data
if(threed)then
do k=ks,kf
WRITE (char_kvalue,'(A2,I3.3)') 'K=', k
if(tecplot360)then
if(k==ks)then
WRITE (2,*) 'ZONE T="RCM-'//char_kvalue//&
'" I=', idim, ', J=',jdim, ',DATAPACKING=BLOCK, SOLUTIONTIME=',itime
else
WRITE (2,*) 'ZONE T="RCM-'//char_kvalue//&
'" I=', idim, ', J=',jdim, ',DATAPACKING=BLOCK, VARSHARELIST=([1-17]), SOLUTIONTIME=',itime
end if
else
if(k==ks)then
WRITE (2,*) 'ZONE T="RCM-'//char_kvalue//&
'" I=', idim, ', J=',jdim, ', DATAPACKING=BLOCK'
else
WRITE (2,*) 'ZONE T="RCM-'//char_kvalue//&
'" I=', idim, ', J=',jdim, ', DATAPACKING=BLOCK, VARSHARELIST=([1-17])'
end if
end if
write(2,'(A,F9.3,A)') 'AUXDATA Alamc='//'"', alam(k),'"'
write(2,'(a,a,a)')' AUXDATA TIME ="',chartime,'"'
if(k == ks)then
DO j=1,jdim; write(2,'(15es14.5)')(xe(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(ye(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(xi(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(yi(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(zi(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')( v(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(vm(i,j),i=1,idim);END DO
! divide by 2 since birk is total current (right?)
DO j=1,jdim; write(2,'(15es14.5)')(birk(i,j)/2,i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(bmin(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pressure(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pvg(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(densi(i,j)/1.0e6,i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(dense(i,j)/1.0e6,i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pressurei(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pressuree(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(ti(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(te(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(eeta(i,j,k),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(veff(i,j,k),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')&
(partial_pressures(i,j,k),i=1,idim);END DO
else
DO j=1,jdim; write(2,'(15es14.5)')(eeta(i,j,k),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(veff(i,j,k),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')&
(partial_pressures(i,j,k),i=1,idim);END DO
end if
end do
else
! 2d
WRITE (2,*) 'ZONE T="RCM-'//&
'" I=', idim, ', J=',jdim, &
' DATAPACKING=BLOCK, SOLUTIONTIME=',itime
write(2,'(a,a,a)')' AUXDATA TIME ="',chartime,'"'
DO j=1,jdim; write(2,'(15es14.5)')(xe(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(ye(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(xi(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(yi(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(zi(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')( v(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(vm(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(birk(i,j)/2.,i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(bmin(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pressure(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pvg(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(densi(i,j)/1.0e6,i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(dense(i,j)/1.0e6,i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pressurei(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(pressuree(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(ti(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(te(i,j),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(eeta(i,j,1),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')(veff(i,j,1),i=1,idim);END DO
DO j=1,jdim; write(2,'(15es14.5)')&
(partial_pressures(i,j,k),i=1,idim);END DO
end if
if(.not.onefile)then
opened=.false.
close(2)
else
opened=.true.
endif
if(.not.opened)then
! this call to preplot is system dependent and may not work
! if(tecplot360)then
! CALL System ('/Applications/Tec360/bin/preplot '//tecoutfile)
! else
! CALL System ('/Applications/Tec100/bin/preplot '//tecoutfile)
! endif
! CALL System ('rm '//tecoutfile)
end if
end if
else
exit
end if
end do
if(onefile)then
close(2)
! CALL System ('/Applications/Tec360/bin/preplot '//tecoutfile)
! CALL System ('rm '//tecoutfile)
end if
10 stop
end program rcmu2tec
!-----------------------------------
subroutine min2hr(time,hours)
! returns a string of hr:min:sec from an input in minutes
! 2/04 frt
implicit none
real :: time
real :: time_hours
real :: time_minutes
real :: time_seconds
character (len=*) :: hours
character (len=3) :: char_time_hours
character (len=2) :: char_time_minutes,char_time_seconds
! time is in minutes
time_hours = floor(time/60.)
time_minutes = floor(time - 60*time_hours)
time_seconds = 60*(time -floor(time))
write(char_time_hours,'(i3.3)')int(time_hours)
! write(*,*)' char_time_hours =',char_time_hours
! if(int(time_hours) < 10)then
! char_time_hours = '00'//adjustr(char_time_hours)
! endif
! write(*,*)' char_time_hours =',char_time_hours
write(char_time_minutes,'(i2.2)')int(time_minutes)
write(char_time_seconds,'(i2.2)')int(time_seconds)
! write(*,*)' char_time_seconds =',char_time_seconds
hours = adjustr(char_time_hours) //'-'//char_time_minutes//'-' &
//adjustl(char_time_seconds)
write(*,'(a,g14.6,a,a)')' time (min) =',time,' h-m-s:',hours
return
end subroutine min2hr