51 double precision,
parameter :: one = 1.0d0
55 integer,
intent(in) :: r0,r1,z0,z1
59 double precision,
dimension(r0-2:r1+1,z0-2:z1+1),
intent(in) :: &
60 dens_array,er_array,ez_array
61 double precision,
dimension(r0-2:r1+1,z0-2:z1+1),
intent(out) :: &
66 double precision :: cm0,cm,gdz_inv,d_iso0,d_iso
69 double precision,
dimension(r0:r1-1) :: er_min
70 double precision,
dimension(r0+1:r1) :: er
71 double precision,
dimension(z1-z0) :: d_iso_r
72 double precision,
dimension(z1-z0+1) :: d_iso_z
73 double precision,
dimension(r1-r0+1,z1-z0 ) :: mat_r
74 double precision,
dimension(r1-r0 ,z1-z0+1) :: mat_z
75 double precision,
dimension(r1-r0+1,z1-z0 ) :: efield_r
76 double precision,
dimension(r0:r1-1,z0-1:z1-1) :: efield_z
105 efield_r,d_iso_r,cm0,d_iso0, &
109 efield_r(1:r1-r0+1,1:z1-z0),d_iso_r, &
114 d_dens_array(ir,z0:z1-1) = d_dens_array(ir,z0:z1-1) + &
115 er_min(ir) * mat_r(ir-r0+1,1:z1-z0) - &
116 er(ir+1) * mat_r(ir-r0+2,1:z1-z0)
121 efield_z(r0:r1-1,z0-1:z1-1),d_iso_z,cm0,d_iso0, &
125 efield_z(r0:r1-1,z0-1:z1-1),d_iso_z, &
128 d_dens_array(r0:r1-1,z0:z1-1) = d_dens_array(r0:r1-1,z0:z1-1) + &
129 gdz_inv * (mat_z(1:,1:z1-z0) - &
140 double precision,
parameter :: half = 0.5d0,one = 1.0d0
144 integer,
intent(in) :: r0,r1,z0,z1,z_shift
145 double precision,
intent(in) :: cm0,d_iso0,
dz,dx
148 double precision,
dimension(r1-r0+1,z1-z0),
intent(in) :: er_array
149 double precision,
dimension(r1-r0+1,z1-z0),
intent(out) :: efield
150 double precision,
dimension(z1-z0),
intent(out) :: d_iso
156 double precision,
dimension(z1-z0) :: back_dens_inv,cm
164 back_dens_inv(iz-z0+1) = one / ((iz-z_shift + half) *
dz)
166 cm = cm0 * back_dens_inv
167 d_iso = d_iso0 * back_dens_inv
178 efield(:,iz) = cm(iz) * er_array(:,iz)
189 double precision,
parameter :: half = 0.5d0,one = 1.0d0
193 integer,
intent(in) :: r0,r1,z0,z1,z_shift
194 double precision,
intent(in) :: cm0,d_iso0,
dz,dx
197 double precision,
dimension(r0:r1-1,z0-1:z1-1),
intent(in) :: ez_array
198 double precision,
dimension(r0:r1-1,z0-1:z1-1),
intent(out) :: efield
199 double precision,
dimension(z0-1:z1-1),
intent(out) :: d_iso
205 double precision,
dimension(z0-1:z1-1) :: back_dens_inv,cm
214 back_dens_inv(iz) = one / ((iz-z_shift - half) *
dz)
216 cm = cm0 * back_dens_inv
217 d_iso = d_iso0 * back_dens_inv
228 efield(:,iz) = cm(iz) * ez_array(:,iz)
238 double precision,
parameter :: zero = 0.0d0,half = 0.5d0, &
239 one = 1.0d0,three = 3.0d0, &
243 integer,
intent(in) :: r0,r1,z0,z1
246 double precision,
dimension(z1-z0),
intent(in) :: d_iso
247 double precision,
dimension(r1-r0+1,z1-z0),
intent(in) :: efield
248 double precision,
dimension(r1-r0+4,z1-z0),
intent(in) :: data_array
249 double precision,
dimension(r1-r0+1,z1-z0),
intent(out) :: mat_r
255 double precision,
dimension(r1-r0+1,z1-z0) :: aux,psi_p
256 double precision,
dimension(r1-r0+3,z1-z0) :: mat_diff
260 mat_diff(1:length+2,:) = data_array(2:length+3,:) - &
261 data_array(1:length+2,:)
263 where (abs(mat_diff(2:length+1,:)) > verysmall)
269 psi_p = mat_diff(1:length,:) / mat_diff(2:length+1,:)
270 elsewhere (efield<zero)
275 psi_p = mat_diff(3:length+2,:) / mat_diff(2:length+1,:)
277 where (psi_p <= zero)
280 elsewhere (psi_p >= 4)
282 elsewhere (psi_p >= 0.4)
283 psi_p = (one + half * psi_p) / three
291 aux = psi_p * mat_diff(2:length+1,:)
294 aux = data_array(2:length+1,:) + aux
296 aux = data_array(3:length+2,:) - aux
303 mat_r(1:length,iz) = d_iso(iz) * mat_diff(2:length+1,iz)
315 double precision,
parameter :: zero = 0.0d0,half = 0.5d0, &
316 one = 1.0d0,three = 3.0d0, &
320 integer,
intent(in) :: r0,r1,z0,z1
323 double precision,
dimension(z1-z0+1),
intent(in) :: d_iso
324 double precision,
dimension(r0:r1-1,z0-1:z1-1),
intent(in) :: efield
325 double precision,
dimension(r1-r0,z1-z0+4),
intent(in) :: data_array
326 double precision,
dimension(r1-r0,z1-z0+1),
intent(out) :: mat_z
332 double precision,
dimension(r1-r0,z1-z0+1) :: aux,psi_p,
pij
333 double precision,
dimension(r1-r0,z1-z0+3) :: mat_diff
336 mat_diff(:,1:length+2) = data_array(:,2:length+3) - &
337 data_array(:,1:length+2)
339 where (abs(mat_diff(:,2:length+1)) > verysmall)
346 psi_p = mat_diff(:,1:length) / mat_diff(:,2:length+1)
352 psi_p = mat_diff(:,3:length+2) / mat_diff(:,2:length+1)
356 where ((psi_p > 0.4) .and. (psi_p < 4))
357 pij = (one + half * psi_p) / three
358 elsewhere (psi_p >= 4)
360 else where (psi_p <= zero)
369 aux =
pij * mat_diff(:,2:length+1)
372 aux = data_array(:,2:length+1) + aux
374 aux = data_array(:,3:length+2) - aux
381 mat_z(:,iz) = d_iso(iz) * mat_diff(:,iz+1)
393 double precision,
parameter :: half = 0.5d0,one = 1.0d0
396 integer,
intent(in) :: r0,r1
397 double precision,
intent(in) ::
dr
400 double precision,
dimension(r0:r1-1),
intent(out) :: er_min
401 double precision,
dimension(r0+1:r1),
intent(out) :: er
405 double precision :: r_inv
409 r_inv = one / ((ir+ half) *
dr)
410 er_min(ir) = ir * r_inv
411 er(ir+1) = (ir+1) * r_inv