1 SUBROUTINE spline_fields(arg1)
12 CHARACTER(LEN=60),
INTENT(IN):: arg1
13 INTEGER:: i, j, k, istat, iphi0, itht0, is0, i1, j1,
15 REAL(rprec),
PARAMETER :: p5 = 0.5_dp
16 REAL(rprec):: maxabs, locabs, diff, c1
17 REAL(rprec),
ALLOCATABLE,
DIMENSION(:):: s, u, v
18 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:,:):: r, z, phi,
20 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:,:):: st, ut, vt
21 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:,:):: r_test,
22 & z_test, phi_test, br_test, bz_test, bphi_test
24 OPEN(unit=4, file=trim(arg1), status=
"old", iostat=istat)
25 IF (istat .ne. 0) stop
'Cannot open specified file!'
26 READ(4,*) iphi0, is, itht0
27 iphi = iphi0 + 1; itht = itht0 + 1; is0 = is -1
30 ALLOCATE(s(is), u(itht), v(iphi), stat=istat)
31 IF (istat .NE. 0) stop
'Allocation error'
32 ALLOCATE(r(is,itht,iphi), z(is,itht,iphi),
33 & phi(is,itht,iphi), br(is,itht,iphi),
34 & bz(is,itht,iphi), bphi(is,itht,iphi), stat = istat)
35 IF (istat .NE. 0) stop
'Allocation error'
36 s = zero; v = zero; u = zero
37 r = zero; z = zero; phi = zero
38 br = zero; bz = zero; bphi = zero
41 v(k) = twopi*real(k-1,dp)/real(iphi0,dp)
44 s(i) = real(i-1,dp)/real(is0,dp)
47 u(j) = twopi*real(j-1,dp)/real(itht0,dp)
51 WRITE(*,*)
' 3D fields being stored in file: ',
53 WRITE(*,
'(a, i6, a8, i6, a8, i6)')
' Dimensions: Ns = ', is,
54 &
' Nu = ', itht0,
' Nv = ', iphi0
55 WRITE(*,*)
' Reading ',trim(arg1),
'..........'
63 READ(4,*) r(i,j,k), z(i,j,k), phi(i,j,k),
64 & br(i,j,k), bz(i,j,k), bphi(i,j,k)
71 WRITE(*,
'(" .........completed")')
75 CALL enforce_periodicity(is, itht, iphi, r, 0)
76 CALL enforce_periodicity(is, itht, iphi, z, 0)
77 CALL enforce_periodicity(is, itht, iphi, phi, 1)
78 CALL enforce_periodicity(is, itht, iphi, br, 0)
79 CALL enforce_periodicity(is, itht, iphi, bz, 0)
80 CALL enforce_periodicity(is, itht, iphi, bphi, 0)
83 WRITE(*,*)
' Creating spline knots'
86 CALL dbsnak(is, s, ks, s_knots)
87 CALL dbsnak(iphi, v, kv, v_knots)
88 CALL dbsnak(itht, u, ku, u_knots)
91 WRITE(*,*)
' Computing spline coefficients'
94 call dbs3in(is, s, itht, u, iphi, v, r, is, itht, ks, ku, kv,
95 > s_knots, u_knots, v_knots, r_coef)
96 call dbs3in(is, s, itht, u, iphi, v, z, is, itht, ks, ku, kv,
97 > s_knots, u_knots, v_knots, z_coef)
98 call dbs3in(is, s, itht, u, iphi, v, phi, is, itht, ks, ku, kv,
99 > s_knots, u_knots, v_knots, phi_coef)
100 call dbs3in(is, s, itht, u, iphi, v, br, is, itht, ks, ku, kv,
101 > s_knots, u_knots, v_knots, br_coef)
102 call dbs3in(is, s, itht, u, iphi, v, bz, is, itht, ks, ku, kv,
103 > s_knots, u_knots, v_knots, bz_coef)
104 call dbs3in(is, s, itht, u, iphi, v, bphi, is, itht, ks, ku, kv,
105 > s_knots, u_knots, v_knots, bphi_coef)
111 IF (l_test_splines)
THEN
114 WRITE(*,*)
' Testing quality of splines'
116 isize = is0*itht0*iphi0
117 ALLOCATE(st(is0, itht0, iphi0), ut(is0, itht0, iphi0),
118 & vt(is0, itht0, iphi0),stat = istat)
119 IF (istat .NE. 0) stop
'Allocation error'
120 st = zero; ut = zero; vt = zero
123 st(i,:,:) = (real(i,dp)-p5)/real(is,dp)
126 ut(:,j,:) = twopi*(real(j,dp)-p5)/real(itht,dp)
129 vt(:,:,k) = twopi*(real(k,dp)-p5)/real(iphi,dp)
132 ALLOCATE(br_test(is0, itht0, iphi0), stat=istat)
133 IF (istat .NE. 0) stop
'Allocation error'
135 CALL dbs3vd(0, 0, 0, isize, st, ut, vt, ks, ku, kv,
136 & s_knots, u_knots, v_knots, is, itht, iphi,
137 & br_coef, br_test, is_uniformx, is_uniformy,
146 c1 = br(i,j,k) + br(i1,j,k)
147 & + br(i,j1,k) + br(i,j,k1)
148 & + br(i,j1,k1) + br(i1,j,k1)
149 & + br(i1,j1,k) + br(i1,j1,k1)
151 diff = abs(c1 - br_test(i,j,k))
152 IF (i==1 .AND. j == 1 .AND. k == 1)
THEN
156 maxabs = max(maxabs, diff)
157 IF (maxabs == diff) locabs = c1
163 WRITE(*, 12) maxabs, locabs
165 12
FORMAT(
' - Max. absolute difference (Br):', f12.4,
166 &
' at value:', f12.4)
170 ALLOCATE(bz_test(is0, itht0, iphi0), stat = istat)
171 IF (istat .NE. 0) stop
'Allocation error'
173 CALL dbs3vd(0, 0, 0, isize, st, ut, vt, ks, ku, kv,
174 & s_knots, u_knots, v_knots, is, itht, iphi,
175 & bz_coef, bz_test, is_uniformx, is_uniformy,
184 c1 = bz(i,j,k) + bz(i1,j,k)
185 & + bz(i,j1,k) + bz(i,j,k1)
186 & + bz(i,j1,k1) + bz(i1,j,k1)
187 & + bz(i1,j1,k) + bz(i1,j1,k1)
189 diff = abs(c1 - bz_test(i,j,k))
190 IF (i==1 .AND. j == 1 .AND. k == 1)
THEN
194 maxabs = max(maxabs, diff)
195 IF (maxabs == diff) locabs = c1
201 WRITE(*, 13) maxabs, locabs
203 13
FORMAT(
' - Max. absolute difference (Bz):', f12.4,
204 &
' at value:', f12.4)
207 ALLOCATE(bphi_test(is0, itht0, iphi0), stat = istat)
208 IF (istat .NE. 0) stop
'Allocation error'
210 CALL dbs3vd(0, 0, 0, isize, st, ut, vt, ks, ku, kv,
211 & s_knots, u_knots, v_knots, is, itht, iphi,
212 & bphi_coef, bphi_test, is_uniformx, is_uniformy,
221 c1 = bphi(i,j,k) + bphi(i1,j,k)
222 & + bphi(i,j1,k) + bphi(i,j,k1)
223 & + bphi(i,j1,k1) + bphi(i1,j,k1)
224 & + bphi(i1,j1,k) + bphi(i1,j1,k1)
226 diff = abs(c1 - bphi_test(i,j,k))
227 IF (i==1 .AND. j == 1 .AND. k == 1)
THEN
231 maxabs = max(maxabs, diff)
232 IF (maxabs == diff) locabs = c1
238 WRITE(*, 14) maxabs, locabs
240 14
FORMAT(
' - Max. absolute difference (Bphi):', f12.4,
241 &
' at value:', f12.4)
242 DEALLOCATE(bphi_test)
244 ALLOCATE(r_test(is0, itht0, iphi0), stat = istat)
245 IF (istat .NE. 0) stop
'Allocation error'
247 CALL dbs3vd(0, 0, 0, isize, st, ut, vt, ks, ku, kv,
248 & s_knots, u_knots, v_knots, is, itht, iphi,
249 & r_coef, r_test, is_uniformx, is_uniformy,
258 c1 = r(i,j,k) + r(i1,j,k)
259 & + r(i,j1,k) + r(i,j,k1)
260 & + r(i,j1,k1) + r(i1,j,k1)
261 & + r(i1,j1,k) + r(i1,j1,k1)
263 diff = abs(c1 - r_test(i,j,k))
264 IF (i==1 .AND. j == 1 .AND. k == 1)
THEN
268 maxabs = max(maxabs, diff)
269 IF (maxabs == diff) locabs = c1
275 WRITE(*, 15) maxabs, locabs
277 15
FORMAT(
' - Max. absolute difference (R):', f12.4,
278 &
' at value:', f12.4)
281 ALLOCATE(z_test(is0, itht0, iphi0), stat = istat)
282 IF (istat .NE. 0) stop
'Allocation error'
284 CALL dbs3vd(0, 0, 0, isize, st, ut, vt, ks, ku, kv,
285 & s_knots, u_knots, v_knots, is, itht, iphi,
286 & z_coef, z_test, is_uniformx, is_uniformy,
295 c1 = z(i,j,k) + z(i1,j,k)
296 & + z(i,j1,k) + z(i,j,k1)
297 & + z(i,j1,k1) + z(i1,j,k1)
298 & + z(i1,j1,k) + z(i1,j1,k1)
300 diff = abs(c1 - z_test(i,j,k))
301 IF (i==1 .AND. j == 1 .AND. k == 1)
THEN
305 maxabs = max(maxabs, diff)
306 IF (maxabs == diff) locabs = c1
312 WRITE(*, 16) maxabs, locabs
314 16
FORMAT(
' - Max. absolute difference (Z):', f12.4,
315 &
' at value:', f12.4)
318 ALLOCATE(phi_test(is0, itht0, iphi0), stat = istat)
319 IF (istat .NE. 0) stop
'Allocation error'
321 CALL dbs3vd(0, 0, 0, isize, st, ut, vt, ks, ku, kv,
322 & s_knots, u_knots, v_knots, is, itht, iphi,
323 & phi_coef, phi_test, is_uniformx, is_uniformy,
332 c1 = phi(i,j,k) + phi(i1,j,k)
333 & + phi(i,j1,k) + phi(i,j,k1)
334 & + phi(i,j1,k1) + phi(i1,j,k1)
335 & + phi(i1,j1,k) + phi(i1,j1,k1)
337 diff = abs(c1 - phi_test(i,j,k))
338 IF (i==1 .AND. j == 1 .AND. k == 1)
THEN
342 maxabs = max(maxabs, diff)
343 IF (maxabs == diff) locabs = c1
349 WRITE(*, 17) maxabs, locabs
351 17
FORMAT(
' - Max. absolute difference (PHI):', f12.4,
352 &
' at value:', f12.4)
355 DEALLOCATE(st, ut, vt)
358 DEALLOCATE(s, u, v, r, z, phi, br, bz, bphi)
360 END SUBROUTINE spline_fields