📄 tlm.for
字号:
PROGRAM TLM3D
*************************************************************
* *
* Transmission-line modelling of electromagnetic fields in *
* 3-dimensions using the symmetrical condensed node. *
* *
* Written by: *
* J L Herring *
* *
* Address: *
* Department of Electrical & Computer Engineering *
* University of Victoria *
* Victoria, B.C., Canada. *
* *
* E-mail: jherring@ece.uvic.ca *
* WWW: http://www.wjrh.ece.uvic.ca/tlm/ *
* *
* History: *
* Date started : 10 Dec 1995 *
* Updated : 10 Dec 1995 (HP-UX) 1.00 *
* Current version : 30 Jun 1996 (HP-UX) 1.10 *
* - more efficient scattering *
* - two-sided internal boundaries *
* *
*************************************************************
IMPLICIT NONE
*---- constant declarations
CHARACTER*(*) VERSN
INTEGER INUNT,OUTUNT
INTEGER XMAX0,YMAX0,ZMAX0,SLAB
INTEGER NMBCS0,NMNEX0,NMNOU0
REAL Z0,Pi
PARAMETER ( VERSN = '1.10' )
PARAMETER ( INUNT=7,OUTUNT=8 )
PARAMETER ( XMAX0=50,YMAX0=50,ZMAX0=50 )
PARAMETER ( NMBCS0=50,NMNEX0=50,NMNOU0=50 )
PARAMETER ( Z0=376.7 )
PARAMETER ( Pi=3.141592653589793238)
*---- variable declarations
CHARACTER*80 LINE,COMM
CHARACTER*40 INNAME,OUTNAM
CHARACTER*2 LORIEN
CHARACTER TYP,DIRN,LSIGN
LOGICAL EX
INTEGER ERR,N,X,Y,Z,I
INTEGER X1,Y1,Z1,D,T
INTEGER XMAX,YMAX,ZMAX,NUMDT
INTEGER NUMBCS,NUMNEX,NUMNOU
REAL DL,VE,VH,OUT
REAL VYNX,VZNX,VXNY,VZNY,VYNZ,VXNZ
REAL VYPZ,VZPY,VZPX,VXPZ,VXPY,VYPX
REAL RHO,V0,VTEMP,VDIFF
*---- array declarations
CHARACTER BDIRN(NMBCS0),BSIGN(NMBCS0)
INTEGER BOX1(NMBCS0),BOY1(NMBCS0),BOZ1(NMBCS0)
INTEGER BOX2(NMBCS0),BOY2(NMBCS0),BOZ2(NMBCS0)
REAL BRHO(NMBCS0)
CHARACTER*3 NEID(NMNEX0)
INTEGER NEX1(NMNEX0),NEY1(NMNEX0),NEZ1(NMNEX0)
INTEGER NEX2(NMNEX0),NEY2(NMNEX0),NEZ2(NMNEX0)
REAL NEAMP(NMNEX0)
CHARACTER*2 NOID(NMNOU0)
INTEGER NOX1(NMNOU0),NOY1(NMNOU0),NOZ1(NMNOU0)
COMMON/COMV/V
REAL V(12,XMAX0,YMAX0,ZMAX0)
REAL W(1:12 ,1:XMAX0,1:YMAX0,1:ZMAX0)
REAL LINE1,LINE2,LINE3,LINE4,LINE5,LINE6,
* LINI1,LINI2,LINI3,LINI4,LINI5,LINI6,TEMPI1,TEMPI2,
* LINE7,LINE8,LINE9,LINE10,LINE11,LINE12,
* LINI7,LINI8,LINI9,LINI10,LINI11,LINI12,
* LINE13,LINE14,LINE15,LINE16,LINE17,LINE18
*---- display program details
WRITE(*,*)
WRITE(*,*) 'TLM3D (v'//VERSN//') - '//
; 'Transmission-Line Modelling in 3-Dimensions'
WRITE(*,*)
WRITE(*,*) 'Limits :'
WRITE(*,99010) 'mesh ',XMAX0,YMAX0,ZMAX0
WRITE(*,99020) 'boundaries',NMBCS0
WRITE(*,99020) 'excite ',NMNEX0
WRITE(*,99020) 'output ',NMNOU0
WRITE(*,*)
99010 FORMAT(1X,' ',A,' = ',I2,' x ',I2,' x ',I2)
99020 FORMAT(1X,' ',A,' = ',I2)
*---- open input file
WRITE(*,*) 'Name of input file : '
READ(*,'(A)') INNAME
INQUIRE(FILE=INNAME,EXIST=EX)
IF (.NOT.EX) STOP 'File does not exist'
OPEN(INUNT,FILE=INNAME,STATUS='OLD',ACCESS='SEQUENTIAL',
; FORM='FORMATTED',IOSTAT=ERR)
IF (ERR.NE.0) STOP 'File cannot be opened'
REWIND(INUNT)
*---- set default data
OUTNAM = '?'
XMAX = XMAX0
YMAX = YMAX0
ZMAX = ZMAX0
DL = 1.0
NUMDT = 0
NUMBCS = 0
NUMNEX = 0
NUMNOU = 0
*---- read input file
11010 READ(INUNT,'(A)',IOSTAT=ERR) LINE
IF (ERR.NE.0) STOP 'Error reading file'
IF (LINE(1:1).EQ.'!') GOTO 11010
IF (LINE(1:1).NE.':') STOP 'Start of data expected'
COMM = LINE(2:80)
*------ mesh size
IF (COMM.EQ.'MESH') THEN
READ(INUNT,*) XMAX,YMAX,ZMAX
IF (XMAX.GT.XMAX0.OR.YMAX.GT.YMAX0.OR.ZMAX.GT.ZMAX0)
; STOP 'Too big'
*------ slab
ELSE IF (COMM.EQ.'SLAB') THEN
READ(INUNT,*) SLAB
*------ node spacing
ELSE IF (COMM.EQ.'DL') THEN
READ(INUNT,*) DL
*------ number of timesteps
ELSE IF (COMM.EQ.'TIMESTEPS') THEN
READ(INUNT,*) NUMDT
*------ output file
ELSE IF (COMM.EQ.'OUTPUT_FILE') THEN
READ(INUNT,*) OUTNAM
*------ boundaries
ELSE IF (COMM.EQ.'BOUNDARIES') THEN
READ(INUNT,*) NUMBCS
IF (NUMBCS.GT.NMBCS0) STOP 'Too many boundaries'
DO 12010, I = 1, NUMBCS
READ(INUNT,*) BRHO(I),LORIEN,BOX1(I),BOY1(I),BOZ1(I),
; BOX2(I),BOY2(I),BOZ2(I)
BDIRN(I) = LORIEN(1:1)
BSIGN(I) = LORIEN(2:2)
IF ((BSIGN(I).NE.'N'.AND.BSIGN(I).NE.'P'.AND.
; BSIGN(I).NE.'0').OR.
; BOX1(I).LT.1.OR.BOX2(I).GT.XMAX.OR.BOX2(I).LT.BOX1(I).OR.
; BOY1(I).LT.1.OR.BOY2(I).GT.YMAX.OR.BOY2(I).LT.BOY1(I).OR.
; BOZ1(I).LT.1.OR.BOZ2(I).GT.ZMAX.OR.BOZ2(I).LT.BOZ1(I).OR.
; BDIRN(I).EQ.'X'.AND.(BOX1(I).NE.BOX2(I).OR.
; (BSIGN(I).EQ.'0'.AND.BOX2(I).EQ.XMAX)).OR.
; BDIRN(I).EQ.'Y'.AND.(BOY1(I).NE.BOY2(I).OR.
; (BSIGN(I).EQ.'0'.AND.BOY2(I).EQ.YMAX)).OR.
; BDIRN(I).EQ.'Z'.AND.(BOZ1(I).NE.BOZ2(I).OR.
; (BSIGN(I).EQ.'0'.AND.BOZ2(I).EQ.ZMAX)))
; STOP 'Bad boundary coordinates'
12010 CONTINUE
*------ excitation
ELSE IF (COMM.EQ.'EXCITE') THEN
READ(INUNT,*) NUMNEX
IF (NUMNEX.GT.NMNEX0) STOP 'Too many excite'
DO 13010, I = 1, NUMNEX
READ(INUNT,*) NEID(I),NEAMP(I),NEX1(I),NEY1(I),NEZ1(I),
; NEX2(I),NEY2(I),NEZ2(I)
IF (NEX1(I).LT.1.OR.NEX2(I).GT.XMAX.OR.NEX2(I).LT.NEX1(I).OR.
; NEY1(I).LT.1.OR.NEY2(I).GT.YMAX.OR.NEY2(I).LT.NEY1(I).OR.
; NEZ1(I).LT.1.OR.NEZ2(I).GT.ZMAX.OR.NEZ2(I).LT.NEZ1(I))
; STOP 'Bad excitation coordinates'
13010 CONTINUE
*------ output
ELSE IF (COMM.EQ.'OUTPUT') THEN
READ(INUNT,*) NUMNOU
IF (NUMNOU.GT.NMNOU0) STOP 'Too many output'
DO 14010, I = 1, NUMNOU
READ(INUNT,*) NOID(I),NOX1(I),NOY1(I),NOZ1(I)
IF (NOX1(I).LT.1.OR.NOX1(I).GT.XMAX.OR.
; NOY1(I).LT.1.OR.NOY1(I).GT.YMAX.OR.
; NOZ1(I).LT.1.OR.NOZ1(I).GT.ZMAX)
; STOP 'Bad output coordinates'
14010 CONTINUE
*---- end of read
ELSE IF (COMM.NE.'END') THEN
STOP 'Data not recognised'
END IF
IF (COMM.NE.'END') GOTO 11010
CLOSE(INUNT)
WRITE(*,*) 'Input file closed'
*---- open output file
IF (OUTNAM.EQ.'?') THEN
WRITE(*,*) 'Name of output file : '
READ(*,'(A)') OUTNAM
END IF
OPEN(OUTUNT,FILE=OUTNAM,STATUS='NEW',ACCESS='SEQUENTIAL',
; FORM='FORMATTED',IOSTAT=ERR)
IF (ERR.NE.0) STOP 'Output file cannot be opened'
*---- clear array
DO 21010, Z = 1, ZMAX
DO 21020, Y = 1, YMAX
DO 21030, X = 1, XMAX
DO 21040, D = 1, 12
V(D,X,Y,Z) = 0.0
21040 CONTINUE
21030 CONTINUE
21020 CONTINUE
21010 CONTINUE
*---- excite
DO 22010, N = 1, NUMNEX
TYP = NEID(N)(1:1)
DIRN = NEID(N)(2:2)
IF (TYP.EQ.'E') THEN
VE = - DL * 100*(sin(N*pi/XMAX)**6)
ELSE IF (TYP.EQ.'H') THEN
VH = - DL * Z0 * (sin(N*pi/XMAX)**6)
ELSE
STOP 'Excitation field error'
END IF
DO 22020, Z = NEZ1(N), NEZ2(N)
DO 22030, Y = NEY1(N), NEY2(N)
DO 22040, X = NEX1(N), NEX2(N)
IF (TYP.EQ.'E') THEN
IF (DIRN.EQ.'X') THEN
V(1 ,X,Y,Z) = V(1 ,X,Y,Z) + VE
V(2 ,X,Y,Z) = V(2 ,X,Y,Z) + VE
V(12,X,Y,Z) = V(12,X,Y,Z) + VE
V(9 ,X,Y,Z) = V(9 ,X,Y,Z) + VE
W(1 ,X,Y,Z) = W(1 ,X,Y,Z) + VE
W(2 ,X,Y,Z) = W(2 ,X,Y,Z) + VE
W(12,X,Y,Z) = W(12,X,Y,Z) + VE
W(9 ,X,Y,Z) = W(9 ,X,Y,Z) + VE
ELSE IF (DIRN.EQ.'Y') THEN
V(4 ,X,Y,Z) = V(4,X,Y,Z) + VE
C V(3 ,X,Y,Z) = V(3,X,Y,Z) + VE
C V(8 ,X,Y,Z) = V(8,X,Y,Z) + VE
C V(11,X,Y,Z) = V(11,X,Y,Z) + VE
W(4 ,X,Y,Z) = W(4,X,Y,Z) + VE
C W(3 ,X,Y,Z) = W(3,X,Y,Z) + VE
C W(8 ,X,Y,Z) = W(8,X,Y,Z) + VE
C W(11,X,Y,Z) =W(11,X,Y,Z) + VE
ELSE IF (DIRN.EQ.'Z') THEN
V(6,X,Y,Z) = V(6,2,2,2) + VE
V(5,X,Y,Z) = V(5,X,Y,Z) + VE
V(10,X,Y,Z) = V(10,X,Y,Z) + VE
V(7,X,Y,Z) = V(7,X,Y,Z) + VE
W(6,X,Y,Z) = W(6,2,2,2) + VE
W(5,X,Y,Z) = W(5,X,Y,Z) + VE
W(10,X,Y,Z) = W(10,X,Y,Z) + VE
W(7,X,Y,Z) = W(7,X,Y,Z) + VE
ELSE
STOP 'E-field excitation error'
END IF
ELSE IF (TYP.EQ.'H') THEN
IF (DIRN.EQ.'X') THEN
V(4 ,X,Y,Z) = V(4 ,X,Y,Z) + VH
V(5 ,X,Y,Z) = V(5 ,X,Y,Z) - VH
V(8 ,X,Y,Z) = V(8 ,X,Y,Z) - VH
V(7 ,X,Y,Z) = V(7 ,X,Y,Z) + VH
W(4 ,X,Y,Z) = W(4 ,X,Y,Z) + VH
W(5 ,X,Y,Z) = W(5 ,X,Y,Z) - VH
W(8 ,X,Y,Z) = W(8 ,X,Y,Z) - VH
W(7 ,X,Y,Z) = W(7 ,X,Y,Z) + VH
ELSE IF (DIRN.EQ.'Y') THEN
V(6 ,X,Y,Z) = V(6 ,X,Y,Z) + VH
V(2 ,X,Y,Z) = V(2 ,X,Y,Z) - VH
V(10,X,Y,Z) = V(10,X,Y,Z) - VH
V(9 ,X,Y,Z) = V(9 ,X,Y,Z) + VH
W(6 ,X,Y,Z) = W(6 ,X,Y,Z) + VH
W(2 ,X,Y,Z) = W(2 ,X,Y,Z) - VH
W(10,X,Y,Z) = W(10,X,Y,Z) - VH
W(9 ,X,Y,Z) = W(9 ,X,Y,Z) + VH
ELSE IF (DIRN.EQ.'Z') THEN
V(1 ,X,Y,Z) = V(1 ,X,Y,Z) + VH
V(3 ,X,Y,Z) = V(3 ,X,Y,Z) - VH
V(12,X,Y,Z) = V(12,X,Y,Z) - VH
V(11,X,Y,Z) = V(11,X,Y,Z) + VH
W(1 ,X,Y,Z) = W(1 ,X,Y,Z) + VH
W(3 ,X,Y,Z) = W(3 ,X,Y,Z) - VH
W(12,X,Y,Z) = W(12,X,Y,Z) - VH
W(11,X,Y,Z) = W(11,X,Y,Z) + VH
ELSE
STOP 'H-field excitation error'
END IF
END IF
22040 CONTINUE
22030 CONTINUE
22020 CONTINUE
22010 CONTINUE
*---- start calculation
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -