| New Reply |
Fortran Question |
Share Thread | Thread Tools |
| Jul2-12, 10:20 PM | #18 |
|
|
Fortran Question
I found the problem.
|
| Jul2-12, 10:35 PM | #19 |
|
Mentor
|
What was it?
|
| Jul2-12, 10:51 PM | #20 |
|
|
I dont know why but i changed just the first lines (DIMENSION) and the program worked.
Then i did some little changes like "DO M = NZ, 2" to "DO M = 2,NZ" The complete code: Code:
PROGRAM ABCDE
IMPLICIT REAL (8) (A-B,D-H,O-Z) !Define numeros reais e imaginarios
IMPLICIT COMPLEX (8)(C)
PARAMETER(NZ=501,L=2) !Define parametros
!
REAL, DIMENSION(L,L) :: D1
REAL, DIMENSION(L,L) :: P
REAL, DIMENSION(L,L) :: D
REAL, DIMENSION(L,L) :: Q
REAL, DIMENSION(NZ) :: X
REAL, DIMENSION(NZ) :: Y
REAL, DIMENSION(NZ) :: V
COMPLEX, DIMENSION(NZ) :: CW
COMPLEX, DIMENSION(L,L) :: CKP
COMPLEX, DIMENSION(L,L) :: CTRANSM
COMPLEX, DIMENSION(L,L) :: CT
COMPLEX, DIMENSION(2,2) :: CKJ
COMPLEX, DIMENSION(2,2) :: CKT
!OPEN(UNIT=12,FILE='ENERGY.DAT',FORM='FORMATTED')
!OPEN(UNIT=13,FILE='PSI0.DAT',FORM='FORMATTED')
!OPEN(UNIT=14,FILE='PSI.DAT',FORM='FORMATTED')
!
!
!307 FORMAT(86(2X,E14.7))
!308 FORMAT(I5,86(2X,E14.7))
AM = 0.067D0 !Massa efetiva do e- (GaAs)
EPS = 12.5D0 !Constante dielétrica (GaAs)
RY = 13.6058D3 * AM / EPS / EPS
A0 = 0.5292D0 * EPS / AM
PI = 4.D0 * DATAN(1.D0)
CZ = (0.D0,1.D0)
WRITE(*,*)'INSIRA ENERGIA DA PARTICULA INCIDENTE (meV)=' !Insere variável
READ(*,*) E1
E = E1/RY
! WRITE(*,*)'INSIRA A MASSA DA PARTICULA INCIDENTE=' !Insere variável
! READ(*,*) MASSA
WRITE(*,*)'INSIRA O COMPRIMENTO=' !Insere variável
READ(*,*) ALF
AL = ALF/A0
CALL MESH (DZ,Z)
CALL POTE(A0,RY,AL,Z,V)
KB = DSQRT(E-V(2)) !COMEÇA NO 3 OU NO 2?
DO M=3,NZ
K2 = DSQRT(E-V(M))
DM = K2/KB
C = CDEXP(CZ*K2*DZ)
CW(M) = C
X(M) = (1 + DM)/2
Y(M) = (1 - DM)/2
KB = K2
ENDDO
D1 (1,1) = X(1)
D1 (2,1) = Y(1)
D1 (1,2) = Y(1)
D1 (2,2) = X(1)
CALL CALCM(X,Y,CW,CKJ)
CKT(1,1)= D(1,1)*CKJ(1,1)+D(1,2)*CKJ(2,1)
!CKT(1,2)
CKT(2,1) = D(2,1)*CKJ(1,1)+D(2,2)*CKJ(2,1)
!CKT(2,2)
!CKY(1,1,M) = D(1,1)*CP(1,1)+D(1,2)*P(2,1)
!KY(1,2,M) = D(1,1)*P(1,2)+D(1,2)*P(2,2)
!KY(2,1,M) = D(2,1)*P(1,1)+D(2,2)*P(2,1)
!KY(2,2,M) = D(2,1)*P(1,2)+D(2,2)*P(2,2)
!CKT(2,1) = CT1
!CKT(1,1) = CT2
!ESCREVER DESSE JEITO DA CERTO?
CEFICIENCIA = 1 - (DABS(CKT(2,1))**2)/DABS(CKT(1,1))**2
WRITE(*,*) CEFICIENCIA
END PROGRAM ABCDE
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUBROUTINE CALCM(X,Y,CW,CKJ)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IMPLICIT REAL (8) (A-B,D-H,O-Z) !Define numeros reais e imaginarios
IMPLICIT COMPLEX (8)(C)
PARAMETER(NZ=501)
!DIMENSION
!COMPLEX (8) CKY(2,2), CKW(L,L,NZ), CKJ (L,L,NZ)
COMPLEX, DIMENSION(2,2,NZ) :: CKY
COMPLEX, DIMENSION(2,2) :: CKW
COMPLEX, DIMENSION(2,2) :: CKJ
!faz o D*P para todos as barreiras D2*P2, D3*P3..
DO M = 2,NZ
CKY(1,1,M) = X(M)*CW(M)
CKY(1,2,M) = Y(M)*DCONJG(CW(M))
CKY(2,1,M) = Y(M)*CW(M)
CKY(2,2,M) = X(M)*DCONJG(CW(M))
ENDDO
!faz a primeira multiplicação de trás pra frente (D500*P500)*(D501*P501)
CKW(1,1) = CKY(1,1,2)*CKY(1,1,3) + CKY(1,2,2)*CKY(2,1,3)
CKW(1,2) = CKY(1,1,2)*CKY(1,2,3) + CKY(1,2,2)*CKY(2,2,3)
CKW(2,1) = CKY(2,1,2)*CKY(1,1,3) + CKY(2,2,2)*CKY(2,1,3)
CKW(2,2) = CKY(2,1,2)*CKY(1,2,3) + CKY(2,2,2)*CKY(2,2,3)
DO M = 4,NZ
!CKJ = CKY(M)*CKW
CKJ(1,1) = CKW(1,1)*CKY(1,1,M) + CKW(1,2)*CKY(2,1,M)
CKJ(1,2) = CKW(1,1)*CKY(1,2,M) + CKW(1,2)*CKY(2,2,M)
CKJ(2,1) = CKW(2,1)*CKY(1,1,M) + CKW(2,2)*CKY(2,1,M)
CKJ(2,2) = CKW(2,1)*CKY(1,2,M) + CKW(2,2)*CKY(2,2,M)
!CKW = CKJ
CKW(1,1) = CKJ(1,1)
CKW(1,2) = CKJ(1,2)
CKW(2,1) = CKJ(2,1)
CKW(2,2) = CKJ(2,2)
!D(1,1) = X(M)
!D(2,1) = Y(M)
!D(1,2) = Y(M)
!D(2,2) = X(M)
!CP(1,1) = CW(M)
!CP(2,1) = (0.D0,0.D0)
!CP(1,2) = (0.D0,0.D0)
!CP(2,2) = DCONJG(CW(M))
!CKY(1,1,M) = D(1,1)*CP(1,1)+D(1,2)*P(2,1)
!KY(1,2,M) = D(1,1)*P(1,2)+D(1,2)*P(2,2)
!KY(2,1,M) = D(2,1)*P(1,1)+D(2,2)*P(2,1)
!KY(2,2,M) = D(2,1)*P(1,2)+D(2,2)*P(2,2)
ENDDO
RETURN
END SUBROUTINE CALCM
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
SUBROUTINE MESH(AL,Z)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IMPLICIT REAL(8) (A-H,O-Z)
PARAMETER (NZ=501)
DIMENSION Z(NZ)
!
DZ = AL/(NZ-1)
DO I=1,NZ
Z(I) = DFLOAT(I-1) * DZ
ENDDO
!
RETURN
END SUBROUTINE MESH
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUBROUTINE POTE(A0,RY,AL,Z,POTF) !**********
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IMPLICIT REAL(8) (A-H,O-Z)
PARAMETER (NZ=501)
DIMENSION Z(NZ), POTF(NZ)
ALH = 0.5D0 * AL !MEIO DO SISTEMA
DQW = 20.D0 / A0 ! DISTANCIA ENTRE POCOS
DQWH = 0.5D0 * DQW
QW = 100.D0 / A0 ! LARGURA DOS POCOS
QWH = 0.5D0 * QW
AT = DQWH + QW
DO IZ=1,NZ
ZW = Z(IZ) - ALH
POTF(IZ) = 0.D0
IF(DABS(ZW).GT.DQWH.AND.DABS(ZW).LT.AT) POTF(IZ) = 400.D0/RY
ENDDO
!
RETURN
END SUBROUTINE POTE
|
| Jul3-12, 01:50 PM | #21 |
|
|
There is no errors anymore but when i run the program asking for print CEF appears NaN (not a number), i dont know what to do
Code:
PROGRAM ABCDE
IMPLICIT REAL (8) (A-B,D-H,O-Z) !Define numeros reais e imaginarios
IMPLICIT COMPLEX (8)(C)
PARAMETER(NZ=501,L=2) !Define parametros
DIMENSION Z(NZ), X(NZ), Y(NZ), V(NZ), D1(L,L), P(L,L), D(L,L)
DIMENSION Q(L,L)
COMPLEX (8) CW(NZ), CKP(L,L), CKJ (L,L)
!
!OPEN(UNIT=12,FILE='ENERGY.DAT',FORM='FORMATTED')
!OPEN(UNIT=13,FILE='PSI0.DAT',FORM='FORMATTED')
OPEN(UNIT=14,FILE='POT.DAT',FORM='FORMATTED')
!
!
!307 FORMAT(86(2X,E14.7))
!308 FORMAT(I5,86(2X,E14.7))
AM = 0.067D0 !Massa efetiva do e- (GaAs)
EPS = 12.5D0 !Constante dielétrica (GaAs)
RY = 13.6058D3 * AM / EPS / EPS
A0 = 0.5292D0 * EPS / AM
PI = 4.D0 * DATAN(1.D0)
CZ = (0.D0,1.D0)
WRITE(*,*)'INSIRA ENERGIA DA PARTICULA INCIDENTE (meV)=' !Insere variável
READ(*,*) E1
E = E1/RY
! WRITE(*,*)'INSIRA A MASSA DA PARTICULA INCIDENTE=' !Insere variável
! READ(*,*) MASSA
WRITE(*,*)'INSIRA O COMPRIMENTO=' !Insere variável
READ(*,*) ALF
AL = ALF/A0
CALL MESH(AL,Z)
CALL POTE(A0,RY,AL,Z,V)
KB = DSQRT(E-V(2)) !COMEÇA NO 3 OU NO 2?
DO M=3,NZ
K2 = DSQRT(E-V(M))
DM = K2/KB
C = CDEXP(CZ*K2*DZ)
CW(M) = C
X(M) = (1.D0 + DM)/2.D0
Y(M) = (1.D0 - DM)/2.D0
KB = K2
ENDDO
D1 (1,1) = X(1)
D1 (2,1) = Y(1)
D1 (1,2) = Y(1)
D1 (2,2) = X(1)
CALL CALCM(X,Y,CW,CKJ)
CKT11= D1(1,1)*CKJ(1,1)+D1(1,2)*CKJ(2,1)
!CKT(1,2)
CKT21 = D1(2,1)*CKJ(1,1)+D1(2,2)*CKJ(2,1)
!CKT(2,2)
!CKY(1,1,M) = D(1,1)*CP(1,1)+D(1,2)*P(2,1)
!KY(1,2,M) = D(1,1)*P(1,2)+D(1,2)*P(2,2)
!KY(2,1,M) = D(2,1)*P(1,1)+D(2,2)*P(2,1)
!KY(2,2,M) = D(2,1)*P(1,2)+D(2,2)*P(2,2)
!CKT(2,1) = CT1
!CKT(1,1) = CT2
!ESCREVER DESSE JEITO DA CERTO?
CEF = 1.D0 - (CDABS(CKT21))**2/(CDABS(CKT11))**2
WRITE(*,*) CEF
END PROGRAM ABCDE
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUBROUTINE CALCM(X,Y,CW,CKJ)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IMPLICIT REAL (8) (A-B,D-H,O-Z) !Define numeros reais e imaginarios
IMPLICIT COMPLEX (8)(C)
PARAMETER(NZ=501, L=2)
DIMENSION Z(NZ), X(NZ), Y(NZ), V(NZ)
!DIMENSION
COMPLEX (8) CW(NZ), CKW(L,L), CKJ (L,L), CKY(L,L,NZ)
!faz o D*P para todos as barreiras D2*P2, D3*P3..
DO M = 2,NZ
CKY(1,1,M) = X(M)*CW(M)
CKY(1,2,M) = Y(M)*DCONJG(CW(M))
CKY(2,1,M) = Y(M)*CW(M)
CKY(2,2,M) = X(M)*DCONJG(CW(M))
ENDDO
!faz a primeira multiplicação de trás pra frente (D500*P500)*(D501*P501)
CKW(1,1) = CKY(1,1,2)*CKY(1,1,3) + CKY(1,2,2)*CKY(2,1,3)
CKW(1,2) = CKY(1,1,2)*CKY(1,2,3) + CKY(1,2,2)*CKY(2,2,3)
CKW(2,1) = CKY(2,1,2)*CKY(1,1,3) + CKY(2,2,2)*CKY(2,1,3)
CKW(2,2) = CKY(2,1,2)*CKY(1,2,3) + CKY(2,2,2)*CKY(2,2,3)
DO M = 4,NZ
!CKJ = CKY(M)*CKW
CKJ(1,1) = CKW(1,1)*CKY(1,1,M) + CKW(1,2)*CKY(2,1,M)
CKJ(1,2) = CKW(1,1)*CKY(1,2,M) + CKW(1,2)*CKY(2,2,M)
CKJ(2,1) = CKW(2,1)*CKY(1,1,M) + CKW(2,2)*CKY(2,1,M)
CKJ(2,2) = CKW(2,1)*CKY(1,2,M) + CKW(2,2)*CKY(2,2,M)
!CKW = CKJ
CKW(1,1) = CKJ(1,1)
CKW(1,2) = CKJ(1,2)
CKW(2,1) = CKJ(2,1)
CKW(2,2) = CKJ(2,2)
!D(1,1) = X(M)
!D(2,1) = Y(M)
!D(1,2) = Y(M)
!D(2,2) = X(M)
!CP(1,1) = CW(M)
!CP(2,1) = (0.D0,0.D0)
!CP(1,2) = (0.D0,0.D0)
!CP(2,2) = DCONJG(CW(M))
!CKY(1,1,M) = D(1,1)*CP(1,1)+D(1,2)*P(2,1)
!KY(1,2,M) = D(1,1)*P(1,2)+D(1,2)*P(2,2)
!KY(2,1,M) = D(2,1)*P(1,1)+D(2,2)*P(2,1)
!KY(2,2,M) = D(2,1)*P(1,2)+D(2,2)*P(2,2)
ENDDO
RETURN
END SUBROUTINE CALCM
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
SUBROUTINE MESH(AL,Z)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IMPLICIT REAL(8) (A-H,O-Z)
PARAMETER (NZ=501)
DIMENSION Z(NZ)
!
DZ = AL/(NZ-1)
DO I=1,NZ
Z(I) = DFLOAT(I-1) * DZ
ENDDO
!
RETURN
END SUBROUTINE MESH
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUBROUTINE POTE(A0,RY,AL,Z,V) !**********
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IMPLICIT REAL(8) (A-H,O-Z)
PARAMETER (NZ=501)
DIMENSION Z(NZ), V(NZ)
ALH = 0.5D0 * AL !MEIO DO SISTEMA
DQW = 50.D0 / A0 ! DISTANCIA ENTRE POCOS
DQWH = 0.5D0 * DQW
QW = 50.D0 / A0 ! LARGURA DOS POCOS
QWH = 0.5D0 * QW
AT = DQWH + QW
DO IZ=1,NZ
ZW = Z(IZ) - ALH
V(IZ) = 0.D0
IF(DABS(ZW).GT.DQWH.AND.DABS(ZW).LT.AT) V(IZ) = 200.D0/RY
WRITE(14,*) Z(IZ)*A0, V(IZ)*RY
ENDDO
!
RETURN
END SUBROUTINE POTE
|
| Jul10-12, 11:29 PM | #22 |
|
|
I would add write statements for the variables usedto compute cef and continue to backtrack from there. It may be that you forgot to initialize one of them properly. Also I would add write stmts to print the subroutine arguments as well I case they are not initialized as expected.
Its hard to diagnose a problem like this with only the program and not the input data nor compiler, system... used. Only you can do the diagnostics and figure this out. Backtrack thru your variables to see what's going on. |
| Jul11-12, 09:44 AM | #23 |
|
|
Yes, i did this and found the problem, i think.
It was some problems with complex numbers and definitions I tried to fix with this IF, but wasn't work.. Code:
CKB = DSQRT(E-V(2))
!WRITE(*,*) CKB, V(2)*RY, E
DO M=3,NZ
IF (E.GT.V(M)) THEN
K2 = DSQRT(E-V(M))
CK2 = (DSQRT(E-V(M)),0.D0)
END IF
IF (V(M).GT.E) THEN
K2 = DSQRT(V(M)-E)
CK2 = (0.D0, DSQRT(V(M)-E)
END IF
CDM = CK2/CKB
C = CDEXP(CZ*AK2*DZ)
CW(M) = C !>>>> CW ESTA DANDO 1 SEMPRE / DZ NAO TERIA QUE TROCAR POR Z(IZ)?<<<<
!WRITE(*,*)CW(M)
X(M) = (1.D0 + CDM)/2.D0 !>>>>DA SEMPRE 1<<<<
!WRITE(*,*) X(M)
Y(M) = (1.D0 - CDM)/2.D0 !>>>>DA SEMPRE 0<<<<
CKB = CK2
ENDDO
Code:
fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90|47|fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90 47 .26:| ||Error: Expected a right parenthesis in expression | fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90|53|fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90 53 .24:| ||Error: Expected PARAMETER symbol in complex constant | ||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===| |
| Jul11-12, 10:02 AM | #24 |
|
|
Dont you need to use ENDIF and not END IF for your IF stmts?
also you should use and ELSE clause instead of the second IF stmt since you're not covering the possiblity of E.eq.V(M) or you need to change one of the IF stmts with .ge. or .le. to cover the equals condition. |
| Jul11-12, 10:13 AM | #25 |
|
|
i trade to ENDIF and the erros keep on..
i use IF and ELSE now, when E.eq.V(M), K2 = 0 so i can use in the complex part (CK2 = 0.D0,K2 = 0.D0,0.D0) I indicate the line with error in the code Code:
DO M=3,NZ
IF (E.GT.V(M)) THEN
K2 = DSQRT(E-V(M))
CK2 = (K2,0.D0) !LINE 48
ELSE
K2 = DSQRT(V(M)-E)
CK2 = (0.D0, K2) !LINE 52
ENDIF
CDM = CK2/CKB
C = CDEXP(CZ*AK2*DZ)
CW(M) = C
!WRITE(*,*)CW(M)
X(M) = (1.D0 + CDM)/2.D0
!WRITE(*,*) X(M)
Y(M) = (1.D0 - CDM)/2.D0
CKB = CK2
ENDDO
Code:
fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90|47|fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90 47 .15:| ||Error: Expected PARAMETER symbol in complex constant | fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90|51|fica\Programa Computacional\FORTRAN\Particula incidente em uma barreira\particula incidente em uma barreira FINAL.f90 51 .21:| ||Error: Expected PARAMETER symbol in complex constant | ||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===| |
| Jul11-12, 01:03 PM | #26 |
|
|
the only thing I can think of is that it wants K2 to be a constant meaning that it thinks CK2 is defined as a constant but I couldn't see that in your code.
I found a bugzilla report where it said if your lines of code are too long then you'll get this error and the fix was to set a compile flag. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31594 |
| Jul11-12, 04:04 PM | #27 |
Recognitions:
|
I think you need to change CK2 = (K2,0.D0) to CK2 = CMPLX(K2,0.D0)
Also, what type of variable is K2? In your code it seems to be an integer, which is probably wrong. |
| Jul11-12, 10:44 PM | #28 |
|
|
IMPLICIT REAL (8) (A-B,D-H,O-Z) And I add CMPLX and it works. But why i need this? In other line, I write: CZ = (0.D0,1.D0) for define complex number and it works fine.. |
| Jul12-12, 11:32 AM | #29 |
Recognitions:
|
CMPLX( ... , ... ) is an intinsic function, just like SQRT, MAX, etc. The two arguments can be any expressions that evaluate to real numbers. You could have said Code:
IF (E.GT.V(M)) THEN
CK2 = CMPLX(DSQRT(E-V(M)), 0.D0)
Actually you could just say CK2 = DSQRT(E-V(M)) there, but you need CMPLX for the "ELSE" part of the code. |
| Jul12-12, 03:47 PM | #30 |
|
|
Thanks very much, i think my program is working fine now. I will be back soon with new questions.
This forum is awesome. |
| Aug8-12, 01:36 PM | #31 |
|
|
I'm almost finishing this program, there is only one problem and i think it's because the complex numbers.
When i run the program and plot the graph (with Origin), appears: ![]() But the correct is: ![]() The part with the complex numbers (where V>E(K)) is the problem i think, because when E>200, it works fine. Code:
PROGRAM ABCDE
IMPLICIT REAL (8) (A-B,D-H,O-Z) !Define numeros reais e imaginarios
IMPLICIT COMPLEX (8)(C)
PARAMETER(NZ=501, L=2) !Define parametros
DIMENSION Z(NZ), X(NZ), Y(NZ), V(NZ), D1(L,L), P(L,L), D(L,L), I(NZ)
DIMENSION Q(L,L), E(NZ)
COMPLEX (8) CW(NZ), CKP(L,L), CKJ (L,L), CX(NZ), CY(NZ)
!
OPEN(UNIT=12,FILE='VALORES2.DAT',FORM='FORMATTED')
OPEN(UNIT=13,FILE='VALORES.DAT',FORM='FORMATTED')
OPEN(UNIT=14,FILE='POT.DAT',FORM='FORMATTED')
OPEN(UNIT=15,FILE='GRAPH.DAT',FORM='FORMATTED')
!
!
307 FORMAT(86(2X,E14.7))
308 FORMAT(I5,86(2X,E14.7))
AM = 0.067D0 !Massa efetiva do e- (GaAs)
EPS = 12.5D0 !Constante dielétrica (GaAs)
RY = 13.6058D3 * AM / EPS / EPS
A0 = 0.5292D0 * EPS / AM
PI = 4.D0 * DATAN(1.D0)
CZ = (0.D0,1.D0) !Unidade complexa
!WRITE(*,*)'INSIRA ENERGIA DA PARTICULA INCIDENTE (meV)=' !Entrada da energia da particula incidente
!READ(*,*) E1
!E = E1/RY
WRITE(*,*)'INSIRA O COMPRIMENTO=' !Entrada do comprimento avaliado
READ(*,*) ALF
AL = ALF/A0
DZ = AL/(NZ-1)
CALL MESH(AL,DZ,Z) !Chama subrotina que fraciona o comprimento (em pedacos de tamanho dz)
CALL POTE(A0,RY,AL,Z,V) !Chama subrotina que define o potencial em todo o comprimento
!DO M=1,NZ
!E(M)=M
!WRITE(*,*) E(M)
!ENDDO
DO K=1,NZ !L=E1, pois a variavel precisava ser inteiro
E(K)=K/RY
CKB = DSQRT(E(K)-V(1))
DO M=1,NZ
IF (E(K).GT.V(M+1)) THEN
AK2 = DSQRT(E(K)-V(M+1))
CDM = AK2/CKB
CKZ = CDEXP(CZ*CKB*DZ)
CKB = AK2
!WRITE(*,*) CK2
ELSE
CK2 = DSQRT(V(M+1)-E(K))*CZ
CDM = CK2/CKB
CKZ = CDEXP(CZ*CKB*DZ)
CKB = CK2
ENDIF
!WRITE(*,*) CK2
!WRITE(*,*) CMD
!WRITE(*,*) CKZ
CW(M) = CKZ
!WRITE(*,*)CW(M)
CX(M) = (1.D0 + CDM)/2.D0
!WRITE(*,*) CX(M)
CY(M) = (1.D0 - CDM)/2.D0
!WRITE(*,*) CY(M)
ENDDO
!WRITE(*,*) CKB, V(2)*RY, E
!D1 (1,1) = X(1)
!D1 (2,1) = Y(1)
!D1 (1,2) = Y(1)
!D1 (2,2) = X(1)
CALL CALCM(CX,CY,CW,CKJ)
CKT11= CX(1)*CKJ(1,1)+CY(1)*CKJ(2,1)
!CKT(1,2)
CKT21 = CY(1)*CKJ(1,1)+CX(1)*CKJ(2,1)
!WRITE(*,*) CKT21
!CKT(2,2)
!CKY(1,1,M) = D(1,1)*CP(1,1)+D(1,2)*P(2,1)
!KY(1,2,M) = D(1,1)*P(1,2)+D(1,2)*P(2,2)
!KY(2,1,M) = D(2,1)*P(1,1)+D(2,2)*P(2,1)
!KY(2,2,M) = D(2,1)*P(1,2)+D(2,2)*P(2,2)
!CKT(2,1) = CT1
!CKT(1,1) = CT2
!Define a eficiencia
ACF = 1.D0 - (CDABS(CKT21))**2/(CDABS(CKT11))**2
!WRITE(*,*) CDABS(CKT21), CDABS(CKT11)
WRITE (15,307) E(K)*RY, ACF
ENDDO
END PROGRAM ABCDE
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUBROUTINE CALCM(CX,CY,CW,CKJ)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IMPLICIT REAL (8) (A-B,D-H,O-Z) !Define numeros reais e imaginarios
IMPLICIT COMPLEX (8)(C)
PARAMETER(NZ=501, L=2)
DIMENSION Z(NZ), V(NZ)
!DIMENSION
COMPLEX (8) CX(NZ), CY(NZ), CW(NZ), CKW(L,L), CKJ (L,L), CKY(L,L,NZ)
!Faz D*P para todos as barreiras D2*P2, D3*P3..
DO M = 1,NZ
CKY(1,1,M) = DCONJG(CW(M))*CX(M)
CKY(1,2,M) = DCONJG(CW(M))*CY(M)
CKY(2,1,M) = CW(M)*CY(M)
CKY(2,2,M) = CW(M)*CX(M)
!WRITE(*,*) DCONJG(CW(M))
ENDDO
!Faz a primeira multiplicação para o loop [D2*P2].[D3*P3]
CKW(1,1) = CKY(1,1,2)*CKY(1,1,3) + CKY(1,2,2)*CKY(2,1,3)
CKW(1,2) = CKY(1,1,2)*CKY(1,2,3) + CKY(1,2,2)*CKY(2,2,3)
CKW(2,1) = CKY(2,1,2)*CKY(1,1,3) + CKY(2,2,2)*CKY(2,1,3)
CKW(2,2) = CKY(2,1,2)*CKY(1,2,3) + CKY(2,2,2)*CKY(2,2,3)
!WRITE(*,*) CKW(1,1)
!Faz o resto das mutiplicações usando o resultado da ultima como um fator a multiplicar
DO M = 4,NZ
CKJ(1,1) = CKW(1,1)*CKY(1,1,M) + CKW(1,2)*CKY(2,1,M)
CKJ(1,2) = CKW(1,1)*CKY(1,2,M) + CKW(1,2)*CKY(2,2,M)
CKJ(2,1) = CKW(2,1)*CKY(1,1,M) + CKW(2,2)*CKY(2,1,M)
CKJ(2,2) = CKW(2,1)*CKY(1,2,M) + CKW(2,2)*CKY(2,2,M)
!Renova o valor do fator a mutiplicar
CKW(1,1) = CKJ(1,1)
CKW(1,2) = CKJ(1,2)
CKW(2,1) = CKJ(2,1)
CKW(2,2) = CKJ(2,2)
!WRITE(*,*) CKW(1,1)
ENDDO
RETURN
END SUBROUTINE CALCM
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
SUBROUTINE MESH(AL,DZ,Z)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IMPLICIT REAL(8) (A-H,O-Z)
PARAMETER (NZ=501)
DIMENSION Z(NZ)
!
DO I=1,NZ
Z(I) = DFLOAT(I-1) * DZ
ENDDO
!
RETURN
END SUBROUTINE MESH
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SUBROUTINE POTE(A0,RY,AL,Z,V) !**********
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IMPLICIT REAL(8) (A-H,O-Z)
PARAMETER (NZ=501)
DIMENSION Z(NZ), V(NZ)
ALH = 0.5D0 * AL !MEIO DO SISTEMA
DQW = 50.D0 / A0 ! DISTANCIA ENTRE POCOS
DQWH = 0.5D0 * DQW
QW = 50.D0 / A0 ! LARGURA DOS POCOS
QWH = 0.5D0 * QW
AT = DQWH + QW
DO IZ=1,NZ
ZW = Z(IZ) - ALH
V(IZ) = 0.D0
IF(DABS(ZW).GT.DQWH.AND.DABS(ZW).LT.AT) V(IZ) = 200.D0/RY
WRITE(14,*) Z(IZ)*A0, V(IZ)*RY
ENDDO
!
RETURN
END SUBROUTINE POTE
|
| Aug8-12, 02:53 PM | #32 |
|
|
I think the problem is in this part
ELSE CK2 = DSQRT(V(M+1)-E(K))*CZ CDM = CK2/CKB CKZ = CDEXP(CZ*CKB*DZ) CKB = CK2 |
| Aug9-12, 09:15 PM | #33 |
|
|
Anyone?
|
| New Reply |
| Thread Tools | |
Similar Threads for: Fortran Question
|
||||
| Thread | Forum | Replies | ||
| Fortran 77 help making an empty array (or blank list if they exist in fortran) | Programming & Comp Sci | 5 | ||
| fortran 90 question | Programming & Comp Sci | 1 | ||
| Fortran 90 Question | Programming & Comp Sci | 6 | ||
| Accessing Fortran Modules within a Fortran library from Fortran | Programming & Comp Sci | 0 | ||