259 at_boundariestau_dd, at_boundariestau_dn, &
260 at_boundariestau_nd, at_boundariestau_nn, &
261 at_boundariesgrid_dd, at_boundariesgrid_dn, &
262 at_boundariesgrid_nd, at_boundariesgrid_nn
275 public z_z, z_z_weight
284 public at_dz_at, t_dz_t, az_at, at_az, z_t, t_z
290 public tef_laplainvdd_tef, tef_laplainvnn_tef
323 public tef_torboundaries, tef_laplapol2pol_tef
324 public tef_tormagboundaries, tef_polmagboundaries
334 interface tef_laplainvdd_tef
338 interface tef_laplainvnn_tef
342 interface tef_boundaries
346 interface tef_torboundaries
350 interface tef_laplapol2pol_tef
354 interface tef_tormagboundaries
358 interface tef_polmagboundaries
362 integer :: im=32, jm=32, km=16
363 integer :: lm=10, mm=10, nm=16
364 real(8) :: xl, yl, zl
366 real(8),
parameter :: pi=3.1415926535897932385d0
371 real(8),
dimension(:,:,:),
allocatable ::
zef_z 378 save im, jm, km, lm, mm, nm, xl, yl, zl, ip
382 subroutine tee_mpi_initial(i,j,k,l,m,n,xmin,xmax,ymin,ymax,zmin,zmax)
389 integer,
intent(in) :: i
390 integer,
intent(in) :: j
391 integer,
intent(in) :: k
392 integer,
intent(in) :: l
393 integer,
intent(in) :: m
394 integer,
intent(in) :: n
396 real(8),
intent(in) :: xmin, xmax
397 real(8),
intent(in) :: ymin, ymax
398 real(8),
intent(in) :: zmin, zmax
402 im = i ; jm = j ; km = k
403 lm = l ; mm = m ; nm = n
408 CALL mpi_comm_rank(mpi_comm_world,ip,ierr)
414 allocate(
zvx_x(0:km,
jc(ip),0:im-1))
415 allocate(
zvx_y(0:km,
jc(ip),0:im-1))
416 allocate(
zvx_z(0:km,
jc(ip),0:im-1))
418 allocate(
zv_z(0:km,
jc(ip)))
419 allocate(
zv_y(0:km,
jc(ip)))
420 allocate(
zx_z(0:km,0:im-1))
421 allocate(
zx_x(0:km,0:im-1))
423 allocate(
zef_z(0:km,-mm:mm,2*lc(ip)))
427 zvx_z = spread(spread(z_z,2,
jc(ip)),3,im)
429 zv_z = spread(z_z,2,
jc(ip))
431 zx_z = spread(z_z,2,im)
434 zef_z = spread(spread(z_z,2,2*mm+1),3,2*lc(ip))
436 call messagenotify(
'M',
'tee_mpi_initial', &
437 'tee_mpi_module (2022/03/29) is initialized')
447 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
449 real(8),
dimension(0:km,jc(ip),0:im-1) :: zvx_tef
460 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
462 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_zvx
473 real(8),
dimension(0:km,-mm:mm,2*lc(ip)),
intent(in) :: zef
475 real(8),
dimension(0:km,jc(ip),0:im-1) :: zvx_zef
477 real(8),
dimension(-mm:mm,2*lc(ip)) :: ef
478 real(8),
dimension(jc(ip),0:im-1) :: vx
487 ef = zef(k,-mm:mm,1:2*lc(ip))
498 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
500 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_zvx
502 real(8),
dimension(-mm:mm,2*lc(ip)) :: ef
503 real(8),
dimension(jc(ip),0:im-1) :: vx
512 vx = zvx(k,1:
jc(ip),0:im-1)
523 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
525 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_tef
536 real(8),
dimension(0:km,-mm:mm,2*lc(ip)),
intent(in) :: zef
538 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_zef
549 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t
551 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_e2t
562 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z
564 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_e2z
575 real(8),
dimension(:,-mm:,:),
intent(in) :: aef
577 real(8),
dimension(2*lc(ip)*(2*mm+1),size(aef,1)) :: e2a_aef
582 if (
size(aef,2) /= 2*mm+1 ) &
583 call messagenotify(
'E',
'e2a_aef',&
584 '2nd dimension of input data invalid')
585 if (
size(aef,3) /= 2*lc(ip) ) &
586 call messagenotify(
'E',
'e2a_aef',&
587 '3rd dimension of input data invalid')
597 j = (m+mm+1) + (2*mm+1)*(l-1)
598 e2a_aef(j,k) = aef(k,m,l)
609 real(8),
dimension(:,:),
intent(in) :: e2a
612 real(8),
dimension(size(e2a,2),-mm:mm,2*lc(ip)) :: aef_e2a
617 if (
size(e2a,1) /= (2*mm+1)*2*lc(ip) ) &
618 call messagenotify(
'E',
'aef_e2a',&
619 '1st dimension of input data invalid')
629 j = (m+mm+1) + (2*mm+1)*(l-1)
630 aef_e2a(k,m,l) = e2a(j,k)
641 real(8),
dimension(-mm:,:),
intent(in) :: ef
643 real(8),
dimension(2*lc(ip)*(2*mm+1)) :: e2_ef
656 j = (m+mm+1)+ (2*mm+1)*(l-1)
667 real(8),
dimension(:),
intent(in) :: e2
670 real(8),
dimension(-mm:mm,2*lc(ip)) :: ef_e2
683 j = (m+mm+1) + (2*mm+1)*(l-1)
698 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
701 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_Dx_tef
707 tef_dx_tef(n,:,:) =
ef_dx_ef(tef(n,:,:))
719 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
722 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_Dy_tef
728 tef_dy_tef(n,:,:) =
ef_dy_ef(tef(n,:,:))
740 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
743 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_Dz_tef
761 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
764 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_Lapla_tef
782 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
785 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_LaplaH_tef
807 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
810 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_LaplaHInv_tef
826 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VX
828 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VY
831 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VZ
834 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_Div_zvx_zvx_zvx
854 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
857 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_LaplaInvTauDD_tef
860 logical,
intent(IN),
optional :: new
864 real(8),
dimension(:,:,:),
allocatable :: alu
865 integer,
dimension(:,:),
allocatable :: kp
867 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
868 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
869 logical :: rigid1 = .true.
870 logical :: rigid2 = .true.
872 logical :: first = .true.
873 logical :: new_matrix = .false.
875 save :: alu, kp, first
877 if (.not.
present(new))
then 883 if ( first .OR. new_matrix )
then 886 if (
allocated(alu) )
deallocate(alu)
887 if (
allocated(kp) )
deallocate(kp)
888 allocate(alu(2*lc(ip)*(2*mm+1),0:nm,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
892 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
899 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
900 e2z_work = az_at(e2t_work)
903 alu(:,nm,n) = e2z_work(:,0)
904 alu(:,nm-1,n) = e2z_work(:,km)
907 call ludecomp(alu,kp)
909 call messagenotify(
'M',
'tef_LaplaInvTauDD_tef',&
910 'Matrix to apply b.c. newly produced.')
914 e2t_work(:,nm) = 0.0d0
915 e2t_work(:,nm-1) = 0.0d0
917 tef_laplainvtaudd_tef =
aef_e2a(lusolve(alu,kp,e2t_work))
934 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
937 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_LaplaInvTauNN_tef
940 logical,
intent(IN),
optional :: new
944 real(8),
dimension(:,:,:),
allocatable :: alu
945 integer,
dimension(:,:),
allocatable :: kp
947 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
948 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
949 logical :: rigid1 = .true.
950 logical :: rigid2 = .true.
952 logical :: first = .true.
953 logical :: new_matrix = .false.
955 save :: alu, kp, first
957 if (.not.
present(new))
then 963 if ( first .OR. new_matrix )
then 966 if (
allocated(alu) )
deallocate(alu)
967 if (
allocated(kp) )
deallocate(kp)
968 allocate(alu(2*lc(ip)*(2*mm+1),0:nm,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
972 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
979 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
980 e2z_work = az_at(at_dz_at(e2t_work))
983 alu(:,nm,n) = e2z_work(:,0)
984 alu(:,nm-1,n) = e2z_work(:,km)
987 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
988 e2z_work = az_at(e2t_work)
991 alu(:,0,n) = alu(:,0,n) + e2z_work(:,k)*z_z_weight(k)
995 call ludecomp(alu,kp)
997 call messagenotify(
'M',
'tef_LaplaInvTauDD_tef',&
998 'Matrix to apply b.c. newly produced.')
1002 e2t_work(:,nm) = 0.0d0
1003 e2t_work(:,nm-1) = 0.0d0
1004 e2t_work(:,0) = 0.0d0
1006 tef_laplainvtaunn_tef =
aef_e2a(lusolve(alu,kp,e2t_work))
1017 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1020 real(8),
dimension(0:km,jc(ip)) :: zv_IntX_zvx
1027 zv_intx_zvx(:,:) = zv_intx_zvx(:,:) &
1036 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1039 real(8),
dimension(0:km,0:im-1) :: zx_IntY_zvx
1042 real(8),
dimension(0:km,0:im-1) :: zx_IntYTmp
1047 zx_intytmp(:,:) = zx_intytmp(:,:) &
1051 CALL mpi_allreduce(zx_intytmp,zx_inty_zvx,im*(km+1),mpi_real8, &
1052 mpi_sum,mpi_comm_world,ierr)
1060 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1063 real(8),
dimension(jc(ip),0:im-1) :: vx_IntZ_zvx
1070 vx_intz_zvx(:,:) = vx_intz_zvx(:,:) &
1071 + zvx(k,:,:) * z_z_weight(k)
1079 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1082 real(8),
dimension(0:im-1) :: x_IntZY_zvx
1085 real(8),
dimension(0:im-1) :: x_IntZYTmp
1086 integer :: j, k, ierr
1091 x_intzytmp = x_intzytmp &
1096 CALL mpi_allreduce(x_intzytmp,x_intzy_zvx,im,mpi_real8, &
1097 mpi_sum,mpi_comm_world,ierr)
1105 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1108 real(8),
dimension(jc(ip)) :: v_IntZX_zvx
1116 v_intzx_zvx = v_intzx_zvx &
1126 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1129 real(8),
dimension(0:km) :: z_IntYX_zvx
1132 real(8),
dimension(0:km) :: z_IntYXTmp
1133 integer :: i, j, ierr
1138 z_intyxtmp = z_intyxtmp &
1143 CALL mpi_allreduce(z_intyxtmp,z_intyx_zvx,km+1,mpi_real8, &
1144 mpi_sum,mpi_comm_world,ierr)
1152 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1155 real(8) :: IntZYX_zvx
1158 real(8) :: IntZYXTmp
1159 integer :: i, j, k, ierr
1165 intzyxtmp = intzyxtmp &
1172 CALL mpi_allreduce(intzyxtmp,intzyx_zvx,1,mpi_real8, &
1173 mpi_sum,mpi_comm_world,ierr)
1182 real(8),
dimension(0:km,jc(ip)),
intent(in) :: zv
1185 real(8),
dimension(0:km) :: z_IntY_zv
1188 real(8),
dimension(0:km) :: z_IntYTmp
1193 z_intytmp(:) = z_intytmp(:) + zv(:,j) *
v_y_weight(j)
1196 CALL mpi_allreduce(z_intytmp,z_inty_zv,km+1,mpi_real8, &
1197 mpi_sum,mpi_comm_world,ierr)
1205 real(8),
dimension(0:km,jc(ip)),
intent(in) :: zv
1208 real(8),
dimension(jc(ip)) :: v_IntZ_zv
1215 v_intz_zv(:) = v_intz_zv(:) &
1216 + zv(k,:) * z_z_weight(k)
1224 real(8),
dimension(0:km,jc(ip)),
intent(in) :: zv
1231 integer :: j, k, ierr
1236 intzytmp = intzytmp &
1241 CALL mpi_allreduce(intzytmp,intzy_zv,1,mpi_real8, &
1242 mpi_sum,mpi_comm_world,ierr)
1251 real(8),
dimension(0:km,0:im-1),
intent(in) :: zx
1254 real(8),
dimension(0:km) :: z_IntX_zx
1261 z_intx_zx(:) = z_intx_zx(:) + zx(:,i) *
x_x_weight(i)
1270 real(8),
dimension(0:km,0:im-1),
intent(in) :: zx
1273 real(8),
dimension(0:im-1) :: x_IntZ_zx
1280 x_intz_zx(:) = x_intz_zx(:) &
1281 + zx(k,:) * z_z_weight(k)
1290 real(8),
dimension(0:km,0:im-1),
intent(in) :: zx
1301 intzx_zx = intzx_zx &
1312 real(8),
dimension(0:km),
intent(in) :: z
1322 intz_z = intz_z + z(k) * z_z_weight(k)
1332 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1335 real(8),
dimension(0:km,jc(ip)) :: zv_AvrX_zvx
1346 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1349 real(8),
dimension(0:km,0:im-1) :: zx_AvrY_zvx
1360 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1363 real(8),
dimension(jc(ip),0:im-1) :: vx_AvrZ_zvx
1374 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1377 real(8),
dimension(0:im-1) :: x_AvrZY_zvx
1388 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1391 real(8),
dimension(jc(ip)) :: v_AvrZX_zvx
1403 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1406 real(8),
dimension(0:km) :: z_AvrYX_zvx
1417 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx
1420 real(8) :: AvrZYX_zvx
1432 real(8),
dimension(0:km,jc(ip)),
intent(in) :: zv
1435 real(8),
dimension(0:km) :: z_AvrY_zv
1446 real(8),
dimension(0:km,jc(ip)),
intent(in) :: zv
1449 real(8),
dimension(jc(ip)) :: v_AvrZ_zv
1452 v_avrz_zv =
v_intz_zv(zv)/sum(z_z_weight)
1460 real(8),
dimension(0:km,jc(ip)),
intent(in) :: zv
1475 real(8),
dimension(0:km,0:im-1),
intent(in) :: zx
1478 real(8),
dimension(0:km) :: z_AvrX_zx
1489 real(8),
dimension(0:km,0:im-1),
intent(in) :: zx
1492 real(8),
dimension(0:im-1) :: x_AvrZ_zx
1495 x_avrz_zx =
x_intz_zx(zx)/sum(z_z_weight)
1503 real(8),
dimension(0:km,0:im-1),
intent(in) :: zx
1517 real(8),
dimension(0:km),
intent(in) :: z
1522 avrz_z =
intz_z(z)/sum(z_z_weight)
1631 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VX
1634 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VY
1637 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_ZRot_zvx_zvx
1657 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VX
1660 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VY
1663 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(in) :: zvx_VZ
1666 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_ZRotRot_zvx_zvx_zvx
1669 tef_zrotrot_zvx_zvx_zvx = &
1677 zvx_VX,zvx_VY,zvx_VZ,tef_Torvel,tef_Polvel)
1685 real(8),
dimension(0:km,jc(ip),0:im-1) :: zvx_VX
1688 real(8),
dimension(0:km,jc(ip),0:im-1) :: zvx_VY
1691 real(8),
dimension(0:km,jc(ip),0:im-1) :: zvx_VZ
1694 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_Torvel
1697 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_Polvel
1709 zvx_RotVX,zvx_RotVY,zvx_RotVZ,tef_Torvel,tef_Polvel)
1722 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(OUT) :: zvx_RotVX
1725 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(OUT) :: zvx_RotVY
1728 real(8),
dimension(0:km,jc(ip),0:im-1),
intent(OUT) :: zvx_RotVZ
1732 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_Torvel
1735 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_Polvel
1739 zvx_rotvx,zvx_rotvy,zvx_rotvz, &
1750 real(8),
intent(IN) :: tef_data(0:nm,-mm:mm,2*lc(ip))
1751 real(8),
intent(IN) :: x
1752 real(8),
intent(IN) :: y
1753 real(8),
intent(IN) :: z
1754 real(8) :: Interpolate_tef
1775 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_TORPOT
1778 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_ToroidalEnergySpectrum_tef
1781 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_Work
1784 zef_toroidalenergyspectrum_tef = 0.0d0
1785 zef_work =
zef_tef(tef_torpot)
1788 if ( lf_l(l) > 0 )
then 1789 zef_toroidalenergyspectrum_tef(:,m,lf_l(l)) &
1790 = 0.5 * ((2*pi*l/xl)**2+(2*pi*m/yl)**2) &
1791 * ( zef_work(:,m,lf_l(l))**2 + zef_work(:,-m,lf_l(-l))**2 )
1844 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_POLPOT
1847 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_PoloidalEnergySpectrum_tef
1851 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_Data
1852 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_DData
1855 zef_poloidalenergyspectrum_tef = 0.0d0
1856 zef_data =
zef_tef(tef_polpot)
1861 if ( lf_l(l) > 0 )
then 1862 zef_poloidalenergyspectrum_tef(:,m,lf_l(l)) = &
1863 + 0.5* ((2*pi*l/xl)**2+(2*pi*m/yl)**2) &
1864 *( zef_ddata(:,m,lf_l(l))**2 + zef_ddata(:,-m,lf_l(-l))**2 &
1865 + ((2*pi*l/xl)**2+(2*pi*m/yl)**2) &
1866 *( zef_data(:,m,lf_l(l))**2 + zef_data(:,-m,lf_l(-l))**2))
1926 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_TORPOT
1929 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_ToroidalEnstrophySpectrum_tef
1932 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_Data
1933 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_DData
1937 zef_toroidalenstrophyspectrum_tef = 0.0d0
1938 zef_data =
zef_tef(tef_torpot)
1943 if ( lf_l(l) > 0 )
then 1944 zef_toroidalenstrophyspectrum_tef(:,m,lf_l(l)) = &
1945 + 0.5* ((2*pi*l/xl)**2+(2*pi*m/yl)**2) &
1946 *( zef_ddata(:,m,lf_l(l))**2 + zef_ddata(:,-m,lf_l(-l))**2 &
1947 + ((2*pi*l/xl)**2+(2*pi*m/yl)**2) &
1948 *( zef_data(:,m,lf_l(l))**2 + zef_data(:,-m,lf_l(-l))**2))
1971 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef_POLPOT
1974 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_PoloidalEnstrophySpectrum_tef
1977 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_Work
1980 zef_poloidalenstrophyspectrum_tef = 0.0d0
1984 if ( lf_l(l) > 0 )
then 1985 zef_poloidalenstrophyspectrum_tef(:,m,lf_l(l)) &
1986 = 0.5 * ((2*pi*l/xl)**2+(2*pi*m/yl)**2) &
1987 * ( zef_work(:,m,lf_l(l))**2 + zef_work(:,-m,lf_l(-l))**2 )
2004 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef
2007 real(8),
dimension(2,-mm:mm,2*lc(ip)),
intent(in),
optional :: values
2011 character(len=2),
intent(in),
optional :: cond
2018 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t
2020 real(8),
dimension(2*lc(ip)*(2*mm+1),2) :: e22_values
2021 character(len=2) :: Bcond
2025 if (
present(values))
then 2029 if (.not.
present(cond))
then 2037 if (
present(values))
then 2038 call at_boundariestau_nn(e2t,e22_values)
2040 call at_boundariestau_nn(e2t)
2043 if (
present(values))
then 2044 call at_boundariestau_dn(e2t,e22_values)
2046 call at_boundariestau_dn(e2t)
2049 if (
present(values))
then 2050 call at_boundariestau_nd(e2t,e22_values)
2052 call at_boundariestau_nd(e2t)
2055 if (
present(values))
then 2056 call at_boundariestau_dd(e2t,e22_values)
2058 call at_boundariestau_dd(e2t)
2061 call messagenotify(
'E',
'tef_BoundariesTau',
'B.C. not supported')
2078 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef
2081 real(8),
dimension(2,-mm:mm,2*lc(ip)),
intent(in),
optional :: values
2085 character(len=2),
intent(in),
optional :: cond
2092 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t
2094 real(8),
dimension(2*lc(ip)*(2*mm+1),2) :: e22_values
2095 character(len=2) :: Bcond
2099 if (
present(values))
then 2103 if (.not.
present(cond))
then 2111 if (
present(values))
then 2112 call at_boundariesgrid_nn(e2t,e22_values)
2114 call at_boundariesgrid_nn(e2t)
2117 if (
present(values))
then 2118 call at_boundariesgrid_dn(e2t,e22_values)
2120 call at_boundariesgrid_dn(e2t)
2123 if (
present(values))
then 2124 call at_boundariesgrid_nd(e2t,e22_values)
2126 call at_boundariesgrid_nd(e2t)
2129 if (
present(values))
then 2130 call at_boundariesgrid_dd(e2t,e22_values)
2132 call at_boundariesgrid_dd(e2t)
2135 call messagenotify(
'E',
'tef_BoundariesGrid',
'B.C. not supported')
2157 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef_TOR
2160 character(len=2),
intent(in),
optional :: cond
2167 logical,
intent(IN),
optional :: new
2171 real(8),
dimension(:,:,:),
allocatable :: alu
2172 integer,
dimension(:,:),
allocatable :: kp
2174 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2175 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2177 logical :: rigid1 = .true.
2178 logical :: rigid2 = .true.
2179 logical :: first = .true.
2180 logical :: new_matrix = .false.
2182 save :: alu, kp, first
2186 rigid1 = .true. ; rigid2 = .true.
2188 rigid1 = .true. ; rigid2 = .false.
2190 rigid1 = .false. ; rigid2 = .true.
2192 rigid1 = .false. ; rigid2 = .false.
2194 call messagenotify(
'E',
'tef_TorBoundariesTau',
'B.C. not supported')
2197 if (.not.
present(new))
then 2203 if ( first .OR. new_matrix )
then 2206 if (
allocated(alu) )
deallocate(alu)
2207 if (
allocated(kp) )
deallocate(kp)
2208 allocate(alu(2*lc(ip)*(2*mm+1),0:nm,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2211 e2t_work= 0.0d0 ; e2t_work(:,n)= 1.0d0
2212 alu(:,:,n) = e2t_work
2217 e2z_work = az_at(e2t_work)
2219 e2z_work = az_at(at_dz_at(e2t_work))
2221 alu(:,nm-1,n) = e2z_work(:,0)
2225 e2z_work = az_at(e2t_work)
2227 e2z_work = az_at(at_dz_at(e2t_work))
2229 alu(:,nm,n) = e2z_work(:,km)
2232 call ludecomp(alu,kp)
2233 call messagenotify(
'M',
'tef_TorBoundariesTau',&
2234 'Matrix to apply b.c. newly produced.')
2239 e2t_work(:,nm-1) = 0.0d0
2240 e2t_work(:,nm) = 0.0d0
2242 tef_tor =
aef_e2a(lusolve(alu,kp,e2t_work))
2265 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef_TOR
2268 character(len=2),
intent(in),
optional :: cond
2275 logical,
intent(IN),
optional :: new
2279 real(8),
dimension(:,:,:),
allocatable :: alu
2280 integer,
dimension(:,:),
allocatable :: kp
2282 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2283 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2285 logical :: rigid1 = .true.
2286 logical :: rigid2 = .true.
2287 logical :: first = .true.
2288 logical :: new_matrix = .false.
2290 save :: alu, kp, first
2294 rigid1 = .true. ; rigid2 = .true.
2296 rigid1 = .true. ; rigid2 = .false.
2298 rigid1 = .false. ; rigid2 = .true.
2300 rigid1 = .false. ; rigid2 = .false.
2302 call messagenotify(
'E',
'tef_TorBoundariesGrid',
'B.C. not supported')
2305 if (.not.
present(new))
then 2311 if ( first .OR. new_matrix )
then 2314 if ( nm /= km )
then 2315 call messagenotify(
'E',
'tef_TorBoundariesGrid', &
2316 'Chebyshev truncation and number of grid points should be same.')
2319 if (
allocated(alu) )
deallocate(alu)
2320 if (
allocated(kp) )
deallocate(kp)
2321 allocate(alu(2*lc(ip)*(2*mm+1),0:km,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2324 e2t_work = 0.0d0 ; e2t_work(:,n)=1.0d0
2325 e2z_work = az_at(e2t_work)
2327 alu(:,:,n) = e2z_work
2333 e2z_work = az_at(e2t_work)
2335 e2z_work=az_at(at_dz_at(e2t_work))
2337 alu(:,0,n) = e2z_work(:,0)
2341 e2z_work = az_at(e2t_work)
2343 e2z_work=az_at(at_dz_at(e2t_work))
2345 alu(:,km,n) = e2z_work(:,km)
2348 call ludecomp(alu,kp)
2349 call messagenotify(
'M',
'TorBoundariesGrid',&
2350 'Matrix to apply b.c. newly produced.')
2353 e2z_work = az_at(
e2a_aef(tef_tor))
2354 e2z_work(:,0) = 0.0d0
2355 e2z_work(:,km) = 0.0d0
2356 tef_tor =
aef_e2a(lusolve(alu,kp,e2z_work))
2374 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
2377 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_LaplaPol2PolTau_tef
2380 character(len=2),
intent(in),
optional :: cond
2387 logical,
intent(IN),
optional :: new
2391 real(8),
dimension(:,:,:),
allocatable :: alu
2392 integer,
dimension(:,:),
allocatable :: kp
2394 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2395 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2396 logical :: rigid1 = .true.
2397 logical :: rigid2 = .true.
2399 logical :: first = .true.
2400 logical :: new_matrix = .false.
2402 save :: alu, kp, first
2404 if (
present(cond) )
then 2407 rigid1 = .true. ; rigid2 = .true.
2409 rigid1 = .true. ; rigid2 = .false.
2411 rigid1 = .false. ; rigid2 = .true.
2413 rigid1 = .false. ; rigid2 = .false.
2415 call messagenotify(
'E',
'tef_LaplaPol2PolTau_tef',
'B.C. not supported')
2418 rigid1 = .true. ; rigid2 = .true.
2421 if (.not.
present(new))
then 2427 if ( first .OR. new_matrix )
then 2430 if (
allocated(alu) )
deallocate(alu)
2431 if (
allocated(kp) )
deallocate(kp)
2432 allocate(alu(2*lc(ip)*(2*mm+1),0:nm,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2436 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2443 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2444 e2z_work = az_at(e2t_work)
2447 alu(:,nm,n) = e2z_work(:,0)
2448 alu(:,nm-1,n) = e2z_work(:,km)
2451 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2453 e2z_work=az_at(at_dz_at(e2t_work))
2455 e2z_work=az_at(at_dz_at(at_dz_at(e2t_work)))
2457 alu(:,nm-2,n) = e2z_work(:,0)
2460 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2462 e2z_work=az_at(at_dz_at(e2t_work))
2464 e2z_work=az_at(at_dz_at(at_dz_at(e2t_work)))
2466 alu(:,nm-3,n) = e2z_work(:,km)
2469 call ludecomp(alu,kp)
2471 call messagenotify(
'M',
'tef_LaplaPol2PolTau_tef',&
2472 'Matrix to apply b.c. newly produced.')
2476 e2t_work(:,nm) = 0.0d0
2477 e2t_work(:,nm-1) = 0.0d0
2478 e2t_work(:,nm-2) = 0.0d0
2479 e2t_work(:,nm-3) = 0.0d0
2481 tef_laplapol2poltau_tef =
aef_e2a(lusolve(alu,kp,e2t_work))
2503 real(8),
dimension(0:km,-mm:mm,2*lc(ip)),
intent(in) :: zef
2506 real(8),
dimension(0:km,-mm:mm,2*lc(ip)) :: zef_LaplaPol2Pol_zef
2509 character(len=2),
intent(in),
optional :: cond
2516 logical,
intent(IN),
optional :: new
2520 real(8),
dimension(:,:,:),
allocatable :: alu
2521 integer,
dimension(:,:),
allocatable :: kp
2523 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2524 logical :: rigid1 = .true.
2525 logical :: rigid2 = .true.
2527 logical :: first = .true.
2528 logical :: new_matrix = .false.
2530 save :: alu, kp, first
2534 rigid1 = .true. ; rigid2 = .true.
2536 rigid1 = .true. ; rigid2 = .false.
2538 rigid1 = .false. ; rigid2 = .true.
2540 rigid1 = .false. ; rigid2 = .false.
2542 call messagenotify(
'E',
'zef_laplapol2pol_zef',
'B.C. not supported')
2545 if (.not.
present(new))
then 2551 if ( first .OR. new_matrix )
then 2554 if ( nm /= km )
then 2555 call messagenotify(
'E',
'zef_LaplaPol2Pol_zef', &
2556 'Chebyshev truncation and number of grid points should be same.')
2559 if (
allocated(alu) )
deallocate(alu)
2560 if (
allocated(kp) )
deallocate(kp)
2561 allocate(alu(2*lc(ip)*(2*mm+1),0:km,0:km),kp(2*lc(ip)*(2*mm+1),0:km))
2564 e2z_work = 0.0d0 ; e2z_work(:,k) = 1.0d0
2572 e2z_work = 0.0d0 ; e2z_work(:,k) = 1.0d0
2575 alu(:,0,k) = e2z_work(:,0)
2576 alu(:,km,k) = e2z_work(:,km)
2579 e2z_work = 0.0d0 ; e2z_work(:,k) = 1.0d0
2581 e2z_work=az_at(at_dz_at(at_az(e2z_work)))
2583 e2z_work=az_at(at_dz_at(at_dz_at(at_az(e2z_work))))
2585 alu(:,1,k) = e2z_work(:,0)
2588 e2z_work = 0.0d0 ; e2z_work(:,k) = 1.0d0
2590 e2z_work=az_at(at_dz_at(at_az(e2z_work)))
2592 e2z_work=az_at(at_dz_at(at_dz_at(at_az(e2z_work))))
2594 alu(:,km-1,k) = e2z_work(:,km)
2597 call ludecomp(alu,kp)
2599 call messagenotify(
'M',
'zef_LaplaPol2Pol_zef',&
2600 'Matrix to apply b.c. newly produced.')
2604 e2z_work(:,1) = 0.0d0
2605 e2z_work(:,km-1) = 0.0d0
2606 e2z_work(:,0) = 0.0d0
2607 e2z_work(:,km) = 0.0d0
2609 e2z_work = lusolve(alu,kp,e2z_work)
2611 zef_laplapol2pol_zef =
aef_e2a(e2z_work)
2636 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(in) :: tef
2639 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)) :: tef_LaplaPol2PolGrid_tef
2642 character(len=2),
intent(in),
optional :: cond
2649 logical,
intent(IN),
optional :: new
2653 real(8),
dimension(:,:,:),
allocatable :: alu
2654 integer,
dimension(:,:),
allocatable :: kp
2656 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2657 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2658 logical :: rigid1 = .true.
2659 logical :: rigid2 = .true.
2661 logical :: first = .true.
2662 logical :: new_matrix = .false.
2664 save :: alu, kp, first
2668 rigid1 = .true. ; rigid2 = .true.
2670 rigid1 = .true. ; rigid2 = .false.
2672 rigid1 = .false. ; rigid2 = .true.
2674 rigid1 = .false. ; rigid2 = .false.
2676 call messagenotify(
'E',
'tef_LaplaPol2PolGrid_tef',
'B.C. not supported')
2679 if (.not.
present(new))
then 2685 if ( first .OR. new_matrix )
then 2688 if ( nm /= km )
then 2689 call messagenotify(
'E',
'tef_LaplaPol2PolGrid_tef', &
2690 'Chebyshev truncation and number of grid points should be same.')
2693 if (
allocated(alu) )
deallocate(alu)
2694 if (
allocated(kp) )
deallocate(kp)
2695 allocate(alu(2*lc(ip)*(2*mm+1),0:km,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2698 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2705 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2706 e2z_work = az_at(e2t_work)
2709 alu(:,0,n) = e2z_work(:,0)
2710 alu(:,km,n) = e2z_work(:,km)
2713 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2715 e2z_work=az_at(at_dz_at(e2t_work))
2717 e2z_work=az_at(at_dz_at(at_dz_at(e2t_work)))
2719 alu(:,1,n) = e2z_work(:,0)
2722 e2t_work = 0.0d0 ; e2t_work(:,n) = 1.0d0
2724 e2z_work=az_at(at_dz_at(e2t_work))
2726 e2z_work=az_at(at_dz_at(at_dz_at(e2t_work)))
2728 alu(:,km-1,n) = e2z_work(:,km)
2731 call ludecomp(alu,kp)
2733 call messagenotify(
'M',
'tef_LaplaPol2PolGrid_tef',&
2734 'Matrix to apply b.c. newly produced.')
2737 e2z_work = az_at(
e2a_aef(tef))
2738 e2z_work(:,1) = 0.0d0
2739 e2z_work(:,km-1) = 0.0d0
2740 e2z_work(:,0) = 0.0d0
2741 e2z_work(:,km) = 0.0d0
2743 tef_laplapol2polgrid_tef =
aef_e2a(lusolve(alu,kp,e2z_work))
2765 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef_TOR
2768 logical,
intent(IN),
optional :: new
2772 real(8),
dimension(:,:,:),
allocatable :: alu
2773 integer,
dimension(:,:),
allocatable :: kp
2775 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2776 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2778 logical :: first = .true.
2779 logical :: new_matrix = .false.
2781 save :: alu, kp, first
2783 if (.not.
present(new))
then 2789 if ( first .OR. new_matrix )
then 2792 if (
allocated(alu) )
deallocate(alu)
2793 if (
allocated(kp) )
deallocate(kp)
2794 allocate(alu(2*lc(ip)*(2*mm+1),0:nm,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2797 e2t_work= 0.0d0 ; e2t_work(:,n)= 1.0d0
2798 alu(:,:,n) = e2t_work
2801 e2z_work = az_at(e2t_work)
2802 alu(:,nm-1,n) = e2z_work(:,0)
2803 alu(:,nm,n) = e2z_work(:,km)
2807 call ludecomp(alu,kp)
2808 call messagenotify(
'M',
'tef_TormagBoundariesTau',&
2809 'Matrix to apply b.c. newly produced.')
2814 e2t_work(:,nm-1) = 0.0d0
2815 e2t_work(:,nm) = 0.0d0
2818 tef_tor =
aef_e2a(lusolve(alu,kp,e2t_work))
2844 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef_TOR
2847 logical,
intent(IN),
optional :: new
2851 real(8),
dimension(:,:,:),
allocatable :: alu
2852 integer,
dimension(:,:),
allocatable :: kp
2854 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2855 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2857 logical :: first = .true.
2858 logical :: new_matrix = .false.
2860 save :: alu, kp, first
2862 if (.not.
present(new))
then 2868 if ( first .OR. new_matrix )
then 2871 if ( nm /= km )
then 2872 call messagenotify(
'E',
'tef_TorMagBoundariesGrid', &
2873 'Chebyshev truncation and number of grid points should be same.')
2876 if (
allocated(alu) )
deallocate(alu)
2877 if (
allocated(kp) )
deallocate(kp)
2878 allocate(alu(2*lc(ip)*(2*mm+1),0:km,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2881 e2t_work = 0.0d0 ; e2t_work(:,n)=1.0d0
2882 e2z_work = az_at(e2t_work)
2884 alu(:,:,n) = e2z_work
2887 alu(:,0,n) = e2z_work(:,0)
2888 alu(:,km,n) = e2z_work(:,km)
2891 call ludecomp(alu,kp)
2892 call messagenotify(
'M',
'TormagBoundariesGrid',&
2893 'Matrix to apply b.c. newly produced.')
2896 e2z_work = az_at(
e2a_aef(tef_tor))
2897 e2z_work(:,0) = 0.0d0
2898 e2z_work(:,km) = 0.0d0
2899 tef_tor =
aef_e2a(lusolve(alu,kp,e2z_work))
2920 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef_POL
2923 logical,
intent(IN),
optional :: new
2927 real(8),
dimension(:,:,:),
allocatable :: alu
2928 integer,
dimension(:,:),
allocatable :: kp
2930 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
2931 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
2933 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_kh
2935 logical :: first = .true.
2936 logical :: new_matrix = .false.
2938 integer :: l, m, n, e2index
2939 save :: alu, kp, first
2941 if (.not.
present(new))
then 2947 if ( first .OR. new_matrix )
then 2950 if (
allocated(alu) )
deallocate(alu)
2951 if (
allocated(kp) )
deallocate(kp)
2953 allocate(alu(2*lc(ip)*(2*mm+1),0:nm,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
2956 e2t_work = 0.0d0 ; e2t_work(:,n)=1.0d0
2958 alu(:,:,n) = e2t_work(:,:)
2965 if ( lf_l(l) > 0 )
then 2966 e2index = (2*mm+1)*(lf_l(l)-1) + (m+mm+1)
2967 rl = 2*pi/xl*l ; rm = 2*pi/yl*m
2968 e2t_kh(e2index,:) = sqrt(rl**2+rm**2)
2971 if ( lf_l(0) > 0 )
then 2975 e2t_kh((2*mm+1)*(2*lc(ip)-1)+(m+mm+1),:) = e2t_kh(m+mm+1,:)
2979 e2t_work = 0.0d0 ; e2t_work(:,n)=1.0d0
2981 e2z_work = az_at(at_dz_at(e2t_work) + e2t_kh * e2t_work)
2982 alu(:,nm-1,n) = e2z_work(:,0)
2984 e2z_work = az_at(at_dz_at(e2t_work) - e2t_kh * e2t_work)
2985 alu(:,nm,n) = e2z_work(:,km)
2988 call ludecomp(alu,kp)
2990 call messagenotify(
'M',
'tef_PolmagBoundariesTau',&
2991 'Matrix to apply b.c. newly produced.')
2995 e2t_work(:,nm-1) = 0.0d0
2996 e2t_work(:,nm) = 0.0d0
2997 tef_pol =
aef_e2a(lusolve(alu,kp,e2t_work))
3022 real(8),
dimension(0:nm,-mm:mm,2*lc(ip)),
intent(inout) :: tef_POL
3025 logical,
intent(IN),
optional :: new
3029 real(8),
dimension(:,:,:),
allocatable :: alu
3030 integer,
dimension(:,:),
allocatable :: kp
3032 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_work
3033 real(8),
dimension(2*lc(ip)*(2*mm+1),0:km) :: e2z_work
3035 real(8),
dimension(2*lc(ip)*(2*mm+1),0:nm) :: e2t_kh
3037 logical :: first = .true.
3038 logical :: new_matrix = .false.
3040 integer :: l, m, n, e2index
3041 save :: alu, kp, first
3043 if (.not.
present(new))
then 3049 if ( first .OR. new_matrix )
then 3052 if ( nm /= km )
then 3053 call messagenotify(
'E',
'tef_PolMagBoundariesGrid', &
3054 'Chebyshev truncation and number of grid points should be same.')
3057 if (
allocated(alu) )
deallocate(alu)
3058 if (
allocated(kp) )
deallocate(kp)
3059 allocate(alu(2*lc(ip)*(2*mm+1),0:km,0:nm),kp(2*lc(ip)*(2*mm+1),0:nm))
3062 e2t_work = 0.0d0 ; e2t_work(:,n)=1.0d0
3063 e2z_work = az_at(e2t_work)
3065 alu(:,:,n) = e2z_work
3071 if ( lf_l(l) > 0 )
then 3072 e2index = (2*mm+1)*(lf_l(l)-1) + (m+mm+1)
3073 rl = 2*pi/xl*l ; rm = 2*pi/yl*m
3074 e2t_kh(e2index,:) = sqrt(rl**2+rm**2)
3077 if ( lf_l(0) > 0 )
then 3081 e2t_kh((2*mm+1)*(2*lc(ip)-1)+(m+mm+1),:) = e2t_kh(m+mm+1,:)
3085 e2t_work = 0.0d0 ; e2t_work(:,n)=1.0d0
3087 e2z_work = az_at(at_dz_at(e2t_work) + e2t_kh * e2t_work)
3088 alu(:,0,n) = e2z_work(:,0)
3090 e2z_work = az_at(at_dz_at(e2t_work) - e2t_kh * e2t_work)
3091 alu(:,km,n) = e2z_work(:,km)
3094 call ludecomp(alu,kp)
3096 call messagenotify(
'M',
'tef_PolmagBoundariesGrid',&
3097 'Matrix to apply b.c. newly produced.')
3100 e2z_work = az_at(
e2a_aef(tef_pol))
3101 e2z_work(:,0) = 0.0d0
3102 e2z_work(:,km) = 0.0d0
3103 tef_pol =
aef_e2a(lusolve(alu,kp,e2z_work))
real(dp) function, dimension(size(at_data, 1), 0:size(at_data, 2) -1), public at_dx_at(at_data)
入力チェビシェフデータに X 微分を作用する(2 次元配列用).
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_laplapol2pol_zef(zef, cond, new)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_zef(zef)
integer, dimension(:), allocatable, save, public kc
real(8) function, dimension(jc(ip)), public v_intx_vx(vx)
integer, dimension(:), allocatable, save, public je
real(8) function, public inty_v(v)
real(dp) function, dimension(size(ag_data, 1), 0:km), public at_ag(ag_data)
格子データからチェビシェフデータへ変換する(2 次元配列用).
real(8), public tee_vmiss
real(8), dimension(:,:,:), allocatable, public zvx_x
real(8) function, dimension(2 *lc(ip) *(2 *mm+1), 0:nm), public e2t_e2z(e2z)
real(8), dimension(:,:,:), allocatable, public zvx_y
integer function, public kf_k(k)
real(8) function, dimension(0:im-1), public x_avrz_zx(zx)
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_toroidalenergyspectrum_tef(tef_TORPOT)
real(8) function, public intzy_zv(zv)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_dx_tef(tef)
real(8) function, dimension(0:km, 0:im-1), public zx_avry_zvx(zvx)
real(8) function, public avrzyx_zvx(zvx)
real(8) function, dimension(0:km, jc(ip)), public zv_avrx_zvx(zvx)
real(8) function, dimension(0:im-1), public x_inty_vx(vx)
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_toroidalenstrophyspectrum_tef(tef_TORPOT)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_laplainvtaunn_tef(tef, new)
real(8) function, dimension(0:km), public z_avryx_zvx(zvx)
real(8) function, dimension(0:im-1), public x_intz_zx(zx)
subroutine, public t_boundaries(t_data, cond, values)
境界条件の適用(タウ法, 1 次元配列用) 境界条件と両境界での値をオプションで与える. デフォルトは DD...
real(8) function, dimension(size(e2a, 2),-mm:mm, 2 *lc(ip)), public aef_e2a(e2a)
subroutine, public tef_boundariestau(tef, values, cond)
real(8), dimension(:), allocatable, save, public v_y_weight
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_zrotrot_zvx_zvx_zvx(zvx_VX, zvx_VY, zvx_VZ)
real(8) function, dimension(jc(ip)), public v_avrzx_zvx(zvx)
real(8) function, dimension(0:km, jc(ip), 0:im-1), public zvx_tef(tef)
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_poloidalenergyspectrum_tef(tef_POLPOT)
real(8) function, dimension(2 *lc(ip) *(2 *mm+1)), public e2_ef(ef)
real(8) function, dimension(0:im-1), public x_avrzy_zvx(zvx)
integer, dimension(:), allocatable, save, public ks
integer, dimension(:), allocatable, save, public js
subroutine, public tef_tormagboundariesgrid(tef_TOR, new)
real(8) function, public avry_v(v)
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_tef(tef)
real(8) function, dimension(2 *lc(ip) *(2 *mm+1), 0:km), public e2z_e2t(e2t)
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_poloidalenstrophyspectrum_tef(tef_POLPOT)
real(8), dimension(:), allocatable, save, public v_y
subroutine, public tef_boundariesgrid(tef, values, cond)
real(8) function, dimension(jc(ip)), public v_avrx_vx(vx)
real(8) function, dimension(jc(ip)), public v_intzx_zvx(zvx)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_div_zvx_zvx_zvx(zvx_VX, zvx_VY, zvx_VZ)
real(8) function, dimension(-mm:mm, 2 *lc(ip)), public ef_e2(e2)
real(8), dimension(:), allocatable, save, public x_x
real(8) function, dimension(jc(ip), 0:im-1), public vx_intz_zvx(zvx)
subroutine, public at_boundaries(at_data, cond, values)
境界条件の適用(タウ法, 2 次元配列用)
subroutine, public tee_mpi_initial(i, j, k, l, m, n, xmin, xmax, ymin, ymax, zmin, zmax)
real(8) function, public intx_x(x)
real(8), dimension(:,:), allocatable, public zv_z
real(8) function, public interpolate_ef(ef_Data, x, y)
real(8) function, dimension(0:km, jc(ip), 0:im-1), public zvx_zef(zef)
real(8), dimension(:,:), allocatable, public zx_z
real(dp) function, dimension(size(at_data, 1)), public a_interpolate_at(at_data, xval)
1 次元データの並んだ 2次元配列の補間
real(8) function, dimension(0:km), public z_intyx_zvx(zvx)
subroutine, public tef_potential2rotation(zvx_RotVX, zvx_RotVY, zvx_RotVZ, tef_Torvel, tef_Polvel)
real(8) function, dimension(jc(ip)), public v_avrz_zv(zv)
real(8), dimension(:,:), allocatable, public zx_x
real(dp) function, dimension(0:km), public t_g(g_data)
格子データからチェビシェフデータへ変換する(1 次元配列用).
real(8) function, dimension(-lm:lm, 2 *kc(ip)), public ef_vx(vx)
real(dp), dimension(:), allocatable, save, public g_x
格子点座標(X)を格納した 1 次元配列
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_laplah_tef(tef)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_laplapol2polgrid_tef(tef, cond, new)
real(8) function, public avrzx_zx(zx)
real(8) function, dimension(0:im-1), public x_intzy_zvx(zvx)
real(8) function, public intyx_vx(vx)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_dz_tef(tef)
real(8), dimension(:,:), allocatable, public zv_y
real(8) function, dimension(0:km, jc(ip)), public zv_intx_zvx(zvx)
real(8) function, dimension(jc(ip), 0:im-1), public vx_avrz_zvx(zvx)
real(dp) function, dimension(size(at_data, 1), 0:im), public ag_at(at_data)
チェビシェフデータから格子データへ変換する(2 次元配列用).
subroutine, public at_initial(i, k, xmin, xmax)
チェビシェフ変換の格子点数, 波数, 領域の大きさを設定する.
real(dp) function, dimension(size(t_data)), public t_dx_t(t_data)
入力チェビシェフデータに X 微分を作用する(1 次元配列用).
real(8) function, dimension(2 *lc(ip) *(2 *mm+1), size(aef, 1)), public e2a_aef(aef)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_dy_tef(tef)
real(8) function, dimension(0:im-1), public x_avry_vx(vx)
subroutine, public tef_tormagboundariestau(tef_TOR, new)
real(dp), dimension(:), allocatable, save, public g_x_weight
重み座標を格納した 1 次元配列
real(8) function, dimension(0:km), public z_avrx_zx(zx)
real(dp) function, dimension(0:im), public g_t(t_data)
チェビシェフデータから格子データへ変換する(1 次元配列用).
real(8) function, public avryx_vx(vx)
real(8) function, dimension(js(ip):je(ip), 0:im-1), public vx_ef(ef)
real(8), dimension(:,:,:), allocatable, public zef_z
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_zvx(zvx)
subroutine, public tef_torboundariesgrid(tef_TOR, cond, new)
real(8), dimension(:,:,:), allocatable, public zvx_z
subroutine, public tef_polmagboundariestau(tef_POL, new)
real(8) function, dimension(0:km), public z_avry_zv(zv)
real(8), dimension(:,:), allocatable, save, public vx_x
subroutine, public tef_polmagboundariesgrid(tef_POL, new)
real(8), dimension(:,:), allocatable, save, public vx_y
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_laplahinv_tef(tef)
real(8) function, dimension(-lm:lm, 2 *kc(ip)), public ef_laplainv_ef(ef)
real(8) function, dimension(-lm:lm, 2 *kc(ip)), public ef_lapla_ef(ef)
real(8) function, public avrx_x(x)
real(8), dimension(:), allocatable, save, public x_x_weight
real(8) function, public interpolate_tef(tef_data, x, y, z)
real(8) function, public intz_z(z)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_zrot_zvx_zvx(zvx_VX, zvx_VY)
real(8) function, dimension(0:km), public z_inty_zv(zv)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_lapla_tef(tef)
subroutine, public tef_torboundariestau(tef_TOR, cond, new)
real(8) function, dimension(0:km), public z_intx_zx(zx)
real(8) function, dimension(0:km, 0:im-1), public zx_inty_zvx(zvx)
real(8) function, public intzx_zx(zx)
real(8) function, public avrz_z(z)
subroutine, public ee_mpi_initial(i_in, j_in, k_in, l_in, xmin_in, xmax_in, ymin_in, ymax_in)
integer, dimension(:), allocatable, save, public jc
real(8) function, public avrzy_zv(zv)
integer, dimension(:), allocatable, save, public ke
subroutine, public tef_potential2vector(zvx_VX, zvx_VY, zvx_VZ, tef_Torvel, tef_Polvel)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_laplainvtaudd_tef(tef, new)
real(8) function, public intzyx_zvx(zvx)
real(8) function, dimension(jc(ip)), public v_intz_zv(zv)
real(8) function, dimension(-lm:lm, 2 *kc(ip)), public ef_dy_ef(ef)
real(8) function, dimension(-lm:lm, 2 *kc(ip)), public ef_dx_ef(ef)
real(8) function, dimension(0:nm,-mm:mm, 2 *lc(ip)), public tef_laplapol2poltau_tef(tef, cond, new)
real(8) function, dimension(0:km,-mm:mm, 2 *lc(ip)), public zef_zvx(zvx)