-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmetricDirac.f90
executable file
·126 lines (86 loc) · 3.45 KB
/
metricDirac.f90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
subroutine metricDirac
!===============================================!
! Esta subrutina calcula la métrica !
! del sistema de Dirac !
!===============================================!
! Solucionamos (36) de Daka (con las convenciones de (37)).
!------------------------------------------------
! Usamos el módulo 'arrays' para declarar arreglos
! y el módulo 'vars' para las variables de entrada.
use arrays
use vars
implicit none
!------------------------------------------------
! Declaramos variables útiles.
integer j
real(8) rho, Srr, geo
real(8) aux, aux_p
real(8) k1, k2
real(8) x, y
real(8), allocatable, dimension (:) :: xokas
!------------------------------------------------
! Alojamos en memoria el arreglo.
allocate( xokas(Nr) )
!------------------------------------------------
! Solucionaremos usando Runge-Kutta a orden 2 (regla de dos tercios).
!------------------------------------------------
! Definimos la parte de las derivadas.
do j=3, Nr-1
xokas(j) = F1(j)*(G2(j+1) - G2(j-1))*medio/dr &
-F2(j)*(G1(j+1) - G1(j-1))*medio/dr &
+G1(j)*(F2(j+1) - F2(j-1))*medio/dr &
-G2(j)*(F1(j+1) - F1(j-1))*medio/dr
end do
xokas(2) = F1(2)*(-G2(4) + 4*G2(3) - 3*G2(2))/(2*dr) &
- F2(2)*(-G1(4) + 4*G1(3) - 3*G1(2))/(2*dr) &
+ G1(2)*(-F2(4) + 4*F2(3) - 3*F2(2))/(2*dr) &
- G2(2)*(-F1(4) + 4*F1(3) - 3*F1(2))/(2*dr)
xokas(Nr) = F1(Nr)*(3*G2(Nr) - 4*G2(Nr-1) + G2(Nr-2))/(2*dr) &
- F2(Nr)*(3*G1(Nr) - 4*G1(Nr-1) + G1(Nr-2))/(2*dr) &
+ G1(Nr)*(3*F2(Nr) - 4*F2(Nr-1) + F2(Nr-2))/(2*dr) &
- G2(Nr)*(3*F1(Nr) - 4*F1(Nr-1) + F1(Nr-2))/(2*dr)
!------------------------------------------------
! Primero para a.
a(2) = uno
do j=2, Nr-1
rho = ( dos/( (r(j)*a(j))**2 ) )*( a(j)*( F1(j)**2 + F2(j)**2 - G1(j)**2 - G2(j)**2 ) &
+ ( dos*a(j)/r(j) )*( F1(j)*G2(j) - F2(j)*G1(j) ) &
+ xokas(j) )
geo = ( a(j)**2 - uno )/( dos*r(j) )
aux_p = r(j)*( a(j)**2 )*rho - geo
k1 = a(j)*aux_p
x = r(j) + dr*medio
y = a(j) + k1*dr*medio
!------------------------------------------------
rho = ( dos/( (x*y)**2 ) )*( y*( F1(j+1)**2 + F2(j+1)**2 - G1(j+1)**2 - G2(j+1)**2 ) &
+ ( dos*y/x )*( F1(j+1)*G2(j+1) - F2(j+1)*G1(j+1) ) &
+ xokas(j+1) )
geo = ( y**2 - uno )/( dos*x )
aux = x*( y**2 )*rho - geo
k2 = y*( aux + aux_p )*medio
!------------------------------------------------
a(j+1) = a(j) + k2*dr
end do
a(1) = a(2)
!------------------------------------------------
! Ahora solucionamos para alpha.
! Necesitamos solucionar del final hacia el inicio porque
! solo conocemos el valor en la frontera, no en el inicio.
alpha(Nr) = uno/a(Nr)
do j=Nr-1, 2, -1
Srr = ( dos/( (r(j+1)*a(j+1))**2 ) )*xokas(j+1)
geo = ( a(j+1)**2 - uno )/( dos*r(j+1) )
aux_p = r(j+1)*(a(j+1)**2)*Srr + geo
k1 = alpha(j+1)*aux_p
x = r(j+1) - medio*dr
y = alpha(j+1) - medio*k1*dr
!------------------------------------------------
Srr = ( dos/( (x*a(j))**2 ) )*xokas(j)
geo = ( a(j)**2 - uno )/( dos*x )
aux = x*(a(j)**2)*Srr + geo
k2 = y*medio*( aux + aux_p )
!------------------------------------------------
alpha(j) = alpha(j+1) - k2*dr
end do
alpha(1) = alpha(2)
end subroutine