-
Notifications
You must be signed in to change notification settings - Fork 0
/
BSeries_Mod.f90
196 lines (171 loc) · 4.4 KB
/
BSeries_Mod.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
MODULE BSeries_Mod
USE BiColourTree_Mod
USE PowerSeries_Mod
USE Polynom_Mod
IMPLICIT NONE
TYPE Series_T
REAL(8), ALLOCATABLE :: a(:)
END TYPE Series_T
TYPE PSeries_T
TYPE(PKoeff_T), ALLOCATABLE :: a(:)
END TYPE PSeries_T
TYPE BSeries_T
TYPE(Series_T), POINTER :: Phi(:)=>NULL()
END TYPE BSeries_T
TYPE BPSeries_T
TYPE(PSeries_T), POINTER :: Phi(:)=>NULL()
END TYPE BPSeries_T
TYPE(BSeries_T) :: E
TYPE(BSeries_T) :: D
TYPE(BSeries_T) :: Db
TYPE(BSeries_T) :: Dw
CONTAINS
SUBROUTINE MultPowerSeries(PB,Pow,B,Order)
TYPE(BSeries_T) :: PB
TYPE(PowerSeries_T) :: Pow
TYPE(BSeries_T) :: B
INTEGER :: Order
INTEGER :: i,iLoc,j,p,pLoc
TYPE(TreeP_T), POINTER :: T
REAL(8) :: a(SIZE(PB%Phi(Order)%a))
a=0.0d0
DO p=0,Order
T=>ListTree(p)%T
DO i=1,ListTree(p)%LenListTree
DO j=0,T%TP%NumberPowers
pLoc=T%TP%Powers(j)%TP%Order
IF (pLoc==Order) THEN
iLoc=T%TP%Powers(j)%TP%NumberOrder
a(iLoc)=a(iLoc)+B%Phi(p)%a(i)*Pow%Koeff(j)
END IF
END DO
T=>T%Next
END DO
END DO
PB%Phi(Order)%a=a
END SUBROUTINE MultPowerSeries
SUBROUTINE MultPowerSeries1(PB,Pow,B,Order)
TYPE(BSeries_T) :: PB
TYPE(PowerSeries_T) :: Pow
TYPE(BSeries_T) :: B
INTEGER :: Order
INTEGER :: i,iLoc,j,p,pLoc
TYPE(TreeP_T), POINTER :: T
DO p=1,Order
PB%Phi(p)%a=0.0d0
END DO
DO p=0,Order
T=>ListTree(p)%T
DO i=1,ListTree(p)%LenListTree
DO j=0,T%TP%NumberPowers
pLoc=T%TP%Powers(j)%TP%Order
IF (pLoc<=Order) THEN
iLoc=T%TP%Powers(j)%TP%NumberOrder
PB%Phi(pLoc)%a(iLoc)=PB%Phi(pLoc)%a(iLoc)+B%Phi(p)%a(i)*Pow%Koeff(j)
END IF
END DO
T=>T%Next
END DO
END DO
END SUBROUTINE MultPowerSeries1
SUBROUTINE AllocateBSeries(B,pMax)
INTEGER :: pMax
TYPE(BSeries_T) :: B
INTEGER :: p
IF (.NOT.ASSOCIATED(B%Phi)) THEN
ALLOCATE(B%Phi(0:pMax))
DO p=0,pMax
ALLOCATE(B%Phi(p)%a(ListTree(p)%LenListTree))
B%Phi(p)%a=0.0d0
END DO
END IF
END SUBROUTINE AllocateBSeries
SUBROUTINE AllocateBPSeries(B,pMax)
INTEGER :: pMax
TYPE(BPSeries_T) :: B
INTEGER :: i,p
IF (.NOT.ASSOCIATED(B%Phi)) THEN
ALLOCATE(B%Phi(0:pMax))
DO p=0,pMax
ALLOCATE(B%Phi(p)%a(ListTree(p)%LenListTree))
DO i=1,ListTree(p)%LenListTree
ALLOCATE(B%Phi(p)%a(i)%Koeff(0:0))
B%Phi(p)%a(i)%Grad=0
B%Phi(p)%a(i)%Koeff=0.0d0
END DO
END DO
END IF
END SUBROUTINE AllocateBPSeries
SUBROUTINE InitBSeries(pMax)
INTEGER :: pMax
INTEGER :: i,p
REAL(8) :: Gam
TYPE(TreeP_T), POINTER :: T1
ALLOCATE(E%Phi(0:pMax))
ALLOCATE(D%Phi(0:pMax))
ALLOCATE(Db%Phi(0:pMax))
ALLOCATE(Dw%Phi(0:pMax))
DO p=0,pMax
ALLOCATE(E%Phi(p)%a(ListTree(p)%LenListTree))
ALLOCATE(D%Phi(p)%a(ListTree(p)%LenListTree))
ALLOCATE(Db%Phi(p)%a(ListTree(p)%LenListTree))
ALLOCATE(Dw%Phi(p)%a(ListTree(p)%LenListTree))
END DO
E%Phi(0)%a(1)=1.0d0
D%Phi(0)%a(1)=0.0d0
Db%Phi(0)%a(1)=0.0d0
Dw%Phi(0)%a(1)=0.0d0
DO p=1,pMax
T1=>ListTree(p)%T
DO i=1,ListTree(p)%LenListTree
Gam=Gamma(T1%TP)
E%Phi(p)%a(i)=1.0d0/Gam
D%Phi(p)%a(i)=0.0d0
Db%Phi(p)%a(i)=0.0d0
Dw%Phi(p)%a(i)=0.0d0
T1=>T1%Next
END DO
END DO
D%Phi(1)%a(1)=1.0d0
Db%Phi(1)%a(1)=1.0d0
Dw%Phi(1)%a(2)=1.0d0
END SUBROUTINE InitBSeries
SUBROUTINE ComposeBSeries(AB,A,B,pMax)
TYPE(BSeries_T) :: AB,A,B
INTEGER :: pMax
INTEGER :: i,k,l,p
INTEGER :: iLocA,pLocA
INTEGER :: iLocB,pLocB
REAL(8) :: Temp
TYPE(TreeP_T), POINTER :: T1
TYPE(TreeP_T), POINTER :: T2
TYPE(STreeP_T), POINTER :: STree
CALL AllocateBSeries(AB,pMax)
DO p=0,pMax
T1=>ListTree(p)%T
DO i=1,ListTree(p)%LenListTree
AB%Phi(p)%a(i)=0.0d0
STree=>T1%TP%STree
k=1
DO
IF (ASSOCIATED(STree)) THEN
pLocB=STree%TP%Order
iLocB=STree%TP%NumberOrder
Temp=1.0d0
DO l=1,SIZE(STree%ListCuts)
pLocA=NumberToTree(STree%ListCuts(l))%TP%Order
iLocA=NumberToTree(STree%ListCuts(l))%TP%NumberOrder
Temp=Temp*A%Phi(pLocA)%a(iLocA)**STree%NumberListCuts(l)
END DO
AB%Phi(p)%a(i)=AB%Phi(p)%a(i)+B%Phi(pLocB)%a(iLocB)*Temp
k=k+1
STree=>Stree%Next
ELSE
EXIT
END IF
END DO
T1=>T1%Next
END DO
END DO
END SUBROUTINE ComposeBSeries
END MODULE BSeries_Mod