[Fortran90] how to write several output into one file

Click For Summary

Discussion Overview

The discussion revolves around writing multiple outputs (Ez, Hx, and Hy) to a single file in a Fortran90 program that models a 2D FDTD (Finite-Difference Time-Domain) simulation in TMz mode. Participants explore formatting and structuring the output correctly to achieve the desired three-column format.

Discussion Character

  • Technical explanation
  • Exploratory
  • Homework-related

Main Points Raised

  • One participant seeks assistance on how to format the output of three variables into a single file, expressing uncertainty about the correct approach.
  • Another participant suggests using a single WRITE statement to output all three values on the same line, indicating that each WRITE statement in Fortran starts a new line.
  • It is proposed that a separate DO loop for the WRITE statement might simplify the process after calculations are completed.
  • Concerns are raised about the format statement, with a suggestion to simplify it to just 1 format (3E15.6) instead of including a multiplier.
  • A participant clarifies that the number 130 refers to the unit number for file output and does not affect the output format itself.
  • Areas of Agreement / Disagreement

    Participants generally agree on the need to adjust the WRITE statement and format for the output, but there is no consensus on the best approach to implement these changes, as different methods are suggested.

    Contextual Notes

    Participants express varying levels of understanding regarding Fortran's WRITE statement behavior and formatting, indicating potential gaps in knowledge about file I/O operations in Fortran.

    Who May Find This Useful

    Individuals working with Fortran for scientific computing, particularly those involved in numerical simulations and data output formatting.

s_hy
Messages
57
Reaction score
0
hi all,

Currently I am doing 2d fdtd (TMz mode) modeling. I expect to have output for Ez, Hx and Hy in one file, which is mean that the output will be in 3 column. But I don't have any idea how format it. Anyone can help me? Below is the code

Code:
!problem 3.9, Taflove chapter 3
!to model 2d TMz mode fdtd Simulation using Yee grid.
!time step deltat = (1/sqrt(2)*delta/c) is used

subroutine fd2d
implicit none

double precision                   :: f0               !frequency
double precision                   :: miu
double precision                   :: miur             !permittivity
double precision                   :: miu0
double precision                   :: E0
double precision                   :: delta 
double precision                   :: deltat
double precision                   :: deltax 
double precision                   :: deltay
double precision                   :: sigma
double precision                   :: sigmastar
double precision                   :: Eps
double precision                   :: Eps0
double precision                   :: Epsr
double precision                   :: lambda
double precision                   :: lambdax
double precision                   :: lambday
double precision                   :: nlambdax
double precision                   :: nlambday
double precision                   :: omega
double precision                   :: S
double precision                   :: k
double precision                   :: c
integer                            :: i,j
integer                            :: m,p
integer                            :: mlast,plast
integer                            :: n
integer                            :: iinit 
integer                            :: ilast 
integer                            :: jinit 
integer                            :: jlast 
double precision,dimension(202,202):: Ez
double precision,dimension(202,202):: Hy
double precision,dimension(202,202):: Hx
double precision                   :: EzAmp
double precision                   :: HyAmp
double precision                   :: HxAmp
double precision                   :: Ca
double precision                   :: Cb
double precision                   :: Da
double precision                   :: Db
double precision, parameter        :: pi = 3.14159265
character(len=20)                  :: filename

f0 = 100.0
miu0 = 1.0
miur = 1.0
Eps0 = 1.0
Epsr = 1.0
!delta = 1.e-3
delta = 0.1
!lambda = c/f0
lambda = 1
 c = 1.0
E0 = 1.0
deltat = 1/sqrt(2.0)*(delta/c)
k = 2*pi / lambda
omega = c*k
nlambdax = 5
nlambday = 5
lambdax = lambda
lambday = lambda

deltax = delta
deltay = delta

S = 1.0001
iinit = 1 
ilast = 100
jinit = 1
jlast = 100
mlast = 2*ilast-1
plast = 2*jlast-1

print*, 'see me?'

!initialize Ez, Hx,Hy to zero at t=0
do p = 1,2*jlast
 do m = 1,2*ilast
  if (Mod(m,2) == 0) then
   if (Mod(p,2) == 0) then
      Hx(m-1,p+2) = 0
      Hy(m,p+1) = 0
      else
      Ez(m-1,p+1) = 0
   end if
  end if
 end do
end do

print*, 'see me?2'
!medium's properties
 Ca = 1.0
 Cb = deltat/(1-0.5*deltax)
 Print *,'Ca=',Ca,'Cb=',Cb
 Da = 1.0
 Db = deltat/deltax
 Print *, 'Da=',Da, 'Db=',Db

!initiate sinusoidal wavepulse at center

do n = 1,200
   
  write (filename, "('ez',I3.3,'.dat')") n
  open (unit=130,file=filename)
 
!initiate sinusoidal wavepulse at center
  Ez(101,101) = sin((n+1)*omega*deltat)
  
  do m = 2,2*ilast-1
    do p = 2,2*jlast-1
    
      if (Mod(m,2)/=0) then
	if (Mod(p,2)/=0) then
	  Ez(m,p+2) = Ca*Ez(m,p+2)+Cb*(Hy(m+1,p+2)-Hy(m-1,p+2)+Hx(m,p+1)-Hx(m,p+3))
          write (130,1) Ez(m,p+2)
          !print *, Ez(m,p+2)
        end if
      end if
    end do
  end do

  do m = 2,2*ilast-1
    do p = 2,2*jlast-1

      if (Mod(m,2) == 0) then
	if (Mod(p,2) == 0) then
	  Hy(m,p+1) = Da*Hy(m,p+1)+Db*(Ez(m+1,p+1)-Ez(m-1,p+1))
          Hx(m-1,p+2) = Da*Hx(m-1,p+2)+Db*(Ez(m-1,p+1)-Ez(m-1,p+3))
          write (130,1) Hx(m-1,p+2)
          write (130,1) Hy(m,p+1)
        end if
      end if
     end do
  end do

1 format (130(3E15.6))
  close (unit=130)

end do !n

end SUBROUTINE fd2d

Anyway, format I used to write file is not working.

Thank you
 
Technology news on Phys.org
Each WRITE statement in Fortran starts a new line. To write three values on the same line you would do something like

write (130,1) Ez(m,p+2), Hx(m-1,p+2), Hy(m,p+1)

If might be easier to have a separate DO loop (or nested loops) for the write statement, after you have done all the calculations.

Also, your format statement should probably be just

1 format (3E15.6)

I'm not sure what you thought the "130" was for, but it actually means you could write 130 sets of three values all on one line, if you had one WRITE statement that output all 390 values. From yuor OP, that's not what you wanted to do.
 
Thank you, alephzero.

I did as what you said and it's work! Btw, 130 is the filename, which I think will not effect the output.
 
Last edited:
Good.

By the way, Alephzero was talking about the 130 in your format statement:
Code:
1 format (130(3E15.6))
  close (unit=130)
that's a multiplier right there to write 130 times, 3 fields of 15.6.
 

Similar threads

  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 4 ·
Replies
4
Views
4K
Replies
3
Views
2K
  • · Replies 3 ·
Replies
3
Views
13K
  • · Replies 8 ·
Replies
8
Views
7K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 11 ·
Replies
11
Views
3K
  • · Replies 2 ·
Replies
2
Views
5K
  • · Replies 8 ·
Replies
8
Views
5K