80 use dc_types
, only: dp
81 use dc_message
, only: messagenotify
82 use spml_utils
, only: pi
83 use lumatrix
, only: lusolve, ludecomp
102 public at_boundaries_dd
103 public at_boundaries_dn
104 public at_boundaries_nd
105 public at_boundaries_nn
106 public at_boundariestau_dd
107 public at_boundariestau_dn
108 public at_boundariestau_nd
109 public at_boundariestau_nn
112 public at_boundariesgrid_dd
113 public at_boundariesgrid_dn
114 public at_boundariesgrid_nd
115 public at_boundariesgrid_nn
123 interface at_boundaries_dd
124 module procedure at_boundariestau_dd_1d
125 module procedure at_boundariestau_dd_2d
126 end interface at_boundaries_dd
131 interface at_boundaries_dn
132 module procedure at_boundariestau_dn_1d
133 module procedure at_boundariestau_dn_2d
134 end interface at_boundaries_dn
139 interface at_boundaries_nd
140 module procedure at_boundariestau_nd_1d
141 module procedure at_boundariestau_nd_2d
142 end interface at_boundaries_nd
147 interface at_boundaries_nn
148 module procedure at_boundariestau_nn_1d
149 module procedure at_boundariestau_nn_2d
150 end interface at_boundaries_nn
155 interface at_boundariestau_dd
156 module procedure at_boundariestau_dd_1d
157 module procedure at_boundariestau_dd_2d
158 end interface at_boundariestau_dd
163 interface at_boundariestau_dn
164 module procedure at_boundariestau_dn_1d
165 module procedure at_boundariestau_dn_2d
166 end interface at_boundariestau_dn
171 interface at_boundariestau_nd
172 module procedure at_boundariestau_nd_1d
173 module procedure at_boundariestau_nd_2d
174 end interface at_boundariestau_nd
179 interface at_boundariestau_nn
180 module procedure at_boundariestau_nn_1d
181 module procedure at_boundariestau_nn_2d
182 end interface at_boundariestau_nn
187 interface at_boundariesgrid_dd
188 module procedure at_boundariesgrid_dd_1d
189 module procedure at_boundariesgrid_dd_2d
190 end interface at_boundariesgrid_dd
195 interface at_boundariesgrid_dn
196 module procedure at_boundariesgrid_dn_1d
197 module procedure at_boundariesgrid_dn_2d
198 end interface at_boundariesgrid_dn
203 interface at_boundariesgrid_nd
204 module procedure at_boundariesgrid_nd_1d
205 module procedure at_boundariesgrid_nd_2d
206 end interface at_boundariesgrid_nd
211 interface at_boundariesgrid_nn
212 module procedure at_boundariesgrid_nn_1d
213 module procedure at_boundariesgrid_nn_2d
214 end interface at_boundariesgrid_nn
218 real(DP),
allocatable ::
g_x(:)
223 integer(8),
dimension(:),
allocatable :: it
224 real(DP),
dimension(:),
allocatable :: t
232 logical :: at_initialize = .false.
234 logical :: at_boundariestau_dd_first = .true.
236 logical :: at_boundariestau_dn_first = .true.
238 logical :: at_boundariestau_nd_first = .true.
240 logical :: at_boundariestau_nn_first = .true.
242 logical :: at_boundariesgrid_dd_first = .true.
244 logical :: at_boundariesgrid_dn_first = .true.
246 logical :: at_boundariesgrid_nd_first = .true.
248 logical :: at_boundariesgrid_nn_first = .true.
252 save :: at_boundariestau_dd_first
253 save :: at_boundariestau_dn_first
254 save :: at_boundariestau_nd_first
255 save :: at_boundariestau_nn_first
256 save :: at_boundariesgrid_dd_first
257 save :: at_boundariesgrid_dn_first
258 save :: at_boundariesgrid_nd_first
259 save :: at_boundariesgrid_nn_first
269 integer,
intent(in) :: i
271 integer,
intent(in) :: k
273 real(DP),
intent(in) :: xmin, xmax
280 if ( im <= 0 .or. km <= 0 )
then 281 call messagenotify(
'E',
'at_initial', &
282 &
'Number of grid points and waves should be positive')
283 elseif ( mod(im,2_8) /= 0 )
then 284 call messagenotify(
'E',
'at_initial', &
285 &
'Number of grid points should be even')
286 elseif ( km > im )
then 287 call messagenotify(
'E',
'at_initial', &
288 &
'KM shoud be less equal IM')
291 allocate(it(im),t(3*im))
292 call fxrini(2*im,it,t)
296 g_x(ii) = (xmax+xmin)/2 + xl/2 * cos(pi*ii/im)
305 + 2.0d0/(1.0d0 - kk**2) * cos(kk*ii*pi/im)
308 if ( (km == im) .and. (mod(im,2_8) == 0) )
then 310 - 1.0d0/(1.0d0 - km**2)* cos(km*ii*pi/im)
319 at_initialize = .true.
321 call messagenotify(
'M',
'at_initial',&
322 &
'at_module (2019/09/28) is initialized')
327 function ag_at(at_data)
329 real(DP),
dimension(:,0:),
intent(in) :: at_data
331 real(DP),
dimension(size(at_data,1),0:im) :: ag_at
333 real(DP),
dimension(size(at_data,1),0:2*im-1) :: y
339 y(:,0) = at_data(:,0)
341 y(:,2*k) = at_data(:,k)
345 y(:,1) = at_data(:,km)
348 call fxrtba(nm,2*im,y,it,t)
350 ag_at = y(:,0:im)*0.50d0
358 real(DP),
dimension(:),
intent(in) :: t_data
360 real(DP),
dimension(0:im) :: g_t
362 real(DP),
dimension(1,size(t_data)) :: t_work
363 real(DP),
dimension(1,0:im) :: g_work
366 g_work =
ag_at(t_work)
373 function at_ag(ag_data)
375 real(DP),
dimension(:,0:),
intent(in) :: ag_data
377 real(DP),
dimension(size(ag_data,1),0:km) :: at_ag
379 real(DP),
dimension(size(ag_data,1),0:2*im-1) :: y
384 y(:,0) = ag_data(:,0)
386 y(:,2*k) = ag_data(:,k)
389 y(:,1) = ag_data(:,im)
391 call fxrtba(nm,2*im,y,it,t)
400 real(DP),
dimension(:),
intent(in) :: g_data
402 real(DP),
dimension(0:km) :: t_g
405 real(DP),
dimension(1,size(g_data)) :: ag_work
406 real(DP),
dimension(1,0:km) :: at_work
408 ag_work(1,:) = g_data
409 at_work =
at_ag(ag_work)
421 real(DP),
dimension(:,0:),
intent(in) :: at_data
423 real(DP),
dimension(size(at_data,1),0:size(at_data,2)-1) :: at_Dx_at
426 integer(8) :: nm, kmax
429 kmax=
size(at_data,2)-1
432 if ( kmax == im )
then 434 at_dx_at(m,kmax) = 0.0d0
436 at_dx_at(m,kmax-1) = 2.0d0 * km * at_data(m,kmax)* 0.5d0
440 at_dx_at(m,kmax) = 0.0d0
442 at_dx_at(m,kmax-1) = 2.0d0 * km * at_data(m,kmax)
448 at_dx_at(m,k) = at_dx_at(m,k+2) + 2.0d0*(k+1)*at_data(m,k+1)
454 at_dx_at(m,k) = 2.0d0/xl * at_dx_at(m,k)
468 real(DP),
dimension(:),
intent(in) :: t_data
470 real(DP),
dimension(size(t_data)) :: t_Dx_t
472 real(DP),
dimension(1,size(t_data)) :: at_work
474 at_work(1,:) = t_data
476 t_dx_t = at_work(1,:)
484 real(DP),
dimension(:,0:),
intent(in) :: ag
486 real(DP),
dimension(size(ag,1)) :: a_Int_ag
490 if (
size(ag,2) < im+1 )
then 491 call messagenotify(
'E',
'ae_ag', &
492 'The Grid points of input data too small.')
493 elseif (
size(ag,2) > im+1 )
then 494 call messagenotify(
'W',
'ae_ag', &
495 'The Grid points of input data too large.')
500 a_int_ag(:) = a_int_ag(:) + ag(:,i)*
g_x_weight(i)
508 real(DP),
dimension(0:im),
intent(in) :: g
518 real(DP),
dimension(:,0:),
intent(in) :: ag
520 real(DP),
dimension(size(ag,1)) :: a_Avr_ag
529 real(DP),
dimension(0:im),
intent(in) :: g
540 real(DP),
dimension(0:),
intent(in) :: t_data
542 real(DP),
intent(in) :: xval
544 real(DP) :: Interpolate_t
548 real(DP) :: y2, y1, y0, x
552 kmax =
size(t_data)-1
555 x =(xval -(
g_x(0)+
g_x(im))*0.50d0 )/(
g_x(0)-
g_x(im))*2.0d0
560 y0 = 2.0d0*x*y1 - y2 + t_data(k)
566 interpolate_t = - y2 + x*y1 + t_data(0)*0.5d0
567 if ( kmax == int(im) )
then 568 interpolate_t = interpolate_t -t_data(kmax)/2.0d0*cos(kmax*acos(x))
577 real(DP),
dimension(:,0:),
intent(in) :: at_data
579 real(DP),
intent(in) :: xval
581 real(DP),
dimension(size(at_data,1)) :: a_Interpolate_at
586 real(DP),
dimension(size(at_data,1)) :: y2, y1, y0
592 kmax =
size(at_data,2)-1
595 x =(xval -(
g_x(0)+
g_x(im))*0.5d0 )/(
g_x(0)-
g_x(im))*2.0d0
600 y0 = 2.0d0*x*y1 - y2 + at_data(:,k)
606 a_interpolate_at = - y2 + x*y1 + at_data(:,0)*0.5d0
607 if ( kmax == int(im) )
then 608 a_interpolate_at = a_interpolate_at &
609 & - at_data(:,kmax)/2.0d0*cos(kmax*acos(x))
620 real(DP),
intent(INOUT) :: at_data(:,:)
626 character(len=2),
intent(IN),
optional :: cond
628 real(DP),
dimension(:,:),
intent(in),
optional :: values
630 real(DP) :: BCvalues(size(at_data),2)
631 character(len=2) :: BC
633 if (
present(cond) )
then 639 if (
present(values) )
then 646 call at_boundaries_dd(at_data,bcvalues)
648 call at_boundaries_dn(at_data,bcvalues)
650 call at_boundaries_nd(at_data,bcvalues)
652 call at_boundaries_nn(at_data,bcvalues)
654 call at_boundaries_dd(at_data,bcvalues)
665 real(DP),
intent(INOUT) :: t_data(:)
671 character(len=2),
intent(IN),
optional :: cond
673 real(DP),
dimension(2),
intent(in),
optional :: values
675 real(DP) :: BCvalues(2)
676 character(len=2) :: BC
679 if (
present(cond) )
then 685 if (
present(values) )
then 693 call at_boundaries_dd(t_data,bcvalues)
695 call at_boundaries_dn(t_data,bcvalues)
697 call at_boundaries_nd(t_data,bcvalues)
699 call at_boundaries_nn(t_data,bcvalues)
701 call at_boundaries_dd(t_data,bcvalues)
712 real(DP),
intent(INOUT) :: at_data(:,:)
718 character(len=2),
intent(IN),
optional :: cond
720 real(DP),
dimension(:,:),
intent(in),
optional :: values
722 real(DP) :: BCvalues(size(at_data),2)
723 character(len=2) :: BC
725 if (
present(cond) )
then 731 if (
present(values) )
then 739 call at_boundariesgrid_dd(at_data,bcvalues)
741 call at_boundariesgrid_dn(at_data,bcvalues)
743 call at_boundariesgrid_nd(at_data,bcvalues)
745 call at_boundariesgrid_nn(at_data,bcvalues)
756 real(DP),
intent(INOUT) :: t_data(:)
762 character(len=2),
intent(IN),
optional :: cond
764 real(DP),
dimension(2),
intent(in),
optional :: values
766 real(DP) :: BCvalues(2)
767 character(len=2) :: BC
769 if (
present(cond) )
then 775 if (
present(values) )
then 782 call at_boundariesgrid_dd(t_data,bcvalues)
784 call at_boundariesgrid_dn(t_data,bcvalues)
786 call at_boundariesgrid_nd(t_data,bcvalues)
788 call at_boundariesgrid_nn(t_data,bcvalues)
796 if ( .not. at_initialize )
then 797 call messagenotify(
'W',
'at_Finalize',&
798 'at_module not initialized yet')
807 at_initialize = .false.
809 at_boundariestau_dd_first = .true.
810 at_boundariestau_dn_first = .true.
811 at_boundariestau_nd_first = .true.
812 at_boundariestau_nn_first = .true.
813 at_boundariesgrid_dd_first = .true.
814 at_boundariesgrid_dn_first = .true.
815 at_boundariesgrid_nd_first = .true.
816 at_boundariesgrid_nn_first = .true.
818 call messagenotify(
'M',
'at_Finalize',&
819 &
'at_module (2019/09/29) is finalized')
830 subroutine at_boundariestau_dd_2d(at_data,values)
832 real(DP),
dimension(:,0:),
intent(inout) :: at_data
834 real(DP),
dimension(:,:),
intent(in),
optional :: values
836 real(DP),
dimension(:,:),
allocatable :: alu
837 integer,
dimension(:),
allocatable :: kp
838 real(DP),
dimension(0:km,0:km) :: tt_data
839 real(DP),
dimension(0:km,0:im) :: tg_data
840 real(DP),
dimension(size(at_data,1)) :: value1, value2
845 if (
size(at_data,2)-1 < km )
then 846 call messagenotify(
'E',
'at_BoundariesTau_DD', &
847 'The Chebyshev dimension of input data too small.')
848 elseif (
size(at_data,2)-1 > km )
then 849 call messagenotify(
'W',
'at_BoundariesTau_DD', &
850 'The Chebyshev dimension of input data too large.')
853 if (.not.
present(values))
then 861 if ( at_boundariestau_dd_first )
then 862 at_boundariestau_dd_first = .false.
864 if (
allocated(alu))
deallocate(alu)
865 if (
allocated(kp))
deallocate(kp)
867 allocate(alu(0:km,0:km),kp(0:km))
875 tg_data =
ag_at(tt_data)
876 alu(km-1,:) = tg_data(:,0)
877 alu(km,:) = tg_data(:,im)
879 call ludecomp(alu,kp)
882 at_data(:,km-1) = value1
883 at_data(:,km) = value2
884 at_data = lusolve(alu,kp,at_data)
886 end subroutine at_boundariestau_dd_2d
891 subroutine at_boundariestau_dd_1d(t_data,values)
893 real(DP),
dimension(0:km),
intent(inout) :: t_data
895 real(DP),
dimension(2),
intent(in),
optional :: values
897 real(DP),
dimension(1,0:km) :: at_work
898 real(DP),
dimension(1,2) :: vwork
900 if (.not.
present(values))
then 908 call at_boundariestau_dd_2d(at_work,vwork)
911 end subroutine at_boundariestau_dd_1d
917 subroutine at_boundariestau_dn_2d(at_data,values)
919 real(DP),
dimension(:,0:),
intent(inout) :: at_data
921 real(DP),
dimension(:,:),
intent(in),
optional :: values
923 real(DP),
dimension(:,:),
allocatable :: alu
924 integer,
dimension(:),
allocatable :: kp
925 real(DP),
dimension(0:km,0:km) :: tt_data
926 real(DP),
dimension(0:km,0:im) :: tg_data
927 real(DP),
dimension(size(at_data,1)) :: value1, value2
932 if (
size(at_data,2)-1 < km )
then 933 call messagenotify(
'E',
'at_BoundariesTau_DN', &
934 'The Chebyshev dimension of input data too small.')
935 elseif (
size(at_data,2)-1 > km )
then 936 call messagenotify(
'W',
'at_BoundariesTau_DN', &
937 'The Chebyshev dimension of input data too large.')
940 if (.not.
present(values))
then 948 if ( at_boundariestau_dn_first )
then 949 at_boundariestau_dn_first = .false.
951 if (
allocated(alu))
deallocate(alu)
952 if (
allocated(kp))
deallocate(kp)
954 allocate(alu(0:km,0:km),kp(0:km))
962 tg_data =
ag_at(tt_data)
963 alu(km-1,:) = tg_data(:,0)
965 alu(km,:) = tg_data(:,im)
967 call ludecomp(alu,kp)
970 at_data(:,km-1) = value1
971 at_data(:,km) = value2
972 at_data = lusolve(alu,kp,at_data)
974 end subroutine at_boundariestau_dn_2d
979 subroutine at_boundariestau_dn_1d(t_data,values)
981 real(DP),
dimension(0:km),
intent(inout) :: t_data
984 real(DP),
dimension(2),
intent(in),
optional :: values
985 real(DP),
dimension(1,0:km) :: at_work
986 real(DP),
dimension(1,2) :: vwork
988 if (.not.
present(values))
then 996 call at_boundariestau_dn_2d(at_work,vwork)
999 end subroutine at_boundariestau_dn_1d
1004 subroutine at_boundariestau_nd_2d(at_data,values)
1006 real(DP),
dimension(:,0:),
intent(inout) :: at_data
1008 real(DP),
dimension(:,:),
intent(in),
optional :: values
1010 real(DP),
dimension(:,:),
allocatable :: alu
1011 integer,
dimension(:),
allocatable :: kp
1012 real(DP),
dimension(0:km,0:km) :: tt_data
1013 real(DP),
dimension(0:km,0:im) :: tg_data
1014 real(DP),
dimension(size(at_data,1)) :: value1, value2
1019 if (
size(at_data,2)-1 < km )
then 1020 call messagenotify(
'E',
'at_BoundariesTau_ND', &
1021 'The Chebyshev dimension of input data too small.')
1022 elseif (
size(at_data,2)-1 > km )
then 1023 call messagenotify(
'W',
'at_BoundariesTau_ND', &
1024 'The Chebyshev dimension of input data too large.')
1027 if (.not.
present(values))
then 1031 value1 = values(:,1)
1032 value2 = values(:,2)
1035 if ( at_boundariestau_nd_first )
then 1036 at_boundariestau_nd_first = .false.
1038 if (
allocated(alu))
deallocate(alu)
1039 if (
allocated(kp))
deallocate(kp)
1041 allocate(alu(0:km,0:km),kp(0:km))
1050 alu(km-1,:) = tg_data(:,0)
1051 tg_data =
ag_at(tt_data)
1052 alu(km,:) = tg_data(:,im)
1054 call ludecomp(alu,kp)
1057 at_data(:,km-1) = value1
1058 at_data(:,km) = value2
1059 at_data = lusolve(alu,kp,at_data)
1061 end subroutine at_boundariestau_nd_2d
1066 subroutine at_boundariestau_nd_1d(t_data,values)
1068 real(DP),
dimension(0:km),
intent(inout) :: t_data
1070 real(DP),
dimension(2),
intent(in),
optional :: values
1072 real(DP),
dimension(1,0:km) :: at_work
1073 real(DP),
dimension(1,2) :: vwork
1075 if (.not.
present(values))
then 1083 call at_boundariestau_nd_2d(at_work,vwork)
1086 end subroutine at_boundariestau_nd_1d
1091 subroutine at_boundariestau_nn_2d(at_data,values)
1093 real(DP),
dimension(:,0:),
intent(inout) :: at_data
1095 real(DP),
dimension(:,:),
intent(in),
optional :: values
1097 real(DP),
dimension(:,:),
allocatable :: alu
1098 integer,
dimension(:),
allocatable :: kp
1099 real(DP),
dimension(0:km,0:km) :: tt_data
1100 real(DP),
dimension(0:km,0:im) :: tg_data
1101 real(DP),
dimension(size(at_data,1)) :: value1, value2
1106 if (
size(at_data,2)-1 < km )
then 1107 call messagenotify(
'E',
'at_BoundariesTau_NN', &
1108 'The Chebyshev dimension of input data too small.')
1109 elseif (
size(at_data,2)-1 > km )
then 1110 call messagenotify(
'W',
'at_BoundariesTau_NN', &
1111 'The Chebyshev dimension of input data too large.')
1114 if (.not.
present(values))
then 1118 value1 = values(:,1)
1119 value2 = values(:,2)
1122 if ( at_boundariestau_nn_first )
then 1123 at_boundariestau_nn_first = .false.
1125 if (
allocated(alu))
deallocate(alu)
1126 if (
allocated(kp))
deallocate(kp)
1128 allocate(alu(0:km,0:km),kp(0:km))
1137 alu(km-1,:) = tg_data(:,0)
1138 alu(km,:) = tg_data(:,im)
1140 call ludecomp(alu,kp)
1143 at_data(:,km-1) = value1
1144 at_data(:,km) = value2
1145 at_data = lusolve(alu,kp,at_data)
1147 end subroutine at_boundariestau_nn_2d
1152 subroutine at_boundariestau_nn_1d(t_data,values)
1154 real(DP),
dimension(0:km),
intent(inout) :: t_data
1156 real(DP),
dimension(2),
intent(in),
optional :: values
1158 real(DP),
dimension(1,0:km) :: at_work
1159 real(DP),
dimension(1,2) :: vwork
1161 if (.not.
present(values))
then 1169 call at_boundariestau_nn_2d(at_work,vwork)
1172 end subroutine at_boundariestau_nn_1d
1177 subroutine at_boundariesgrid_dd_2d(at_data,values)
1179 real(DP),
dimension(:,0:),
intent(inout) :: at_data
1181 real(DP),
dimension(:,:),
intent(in),
optional :: values
1183 real(DP),
dimension(:,:),
allocatable :: alu
1184 integer,
dimension(:),
allocatable :: kp
1185 real(DP),
dimension(size(at_data,1),0:im) :: ag_data
1186 real(DP),
dimension(0:km,0:km) :: tt_data
1187 real(DP),
dimension(0:km,0:im) :: tg_data
1188 real(DP),
dimension(size(at_data,1)) :: value1, value2
1193 if ( im /= km )
then 1194 call messagenotify(
'E',
'at_BoundariesGrid_DD', &
1195 'Chebyshev truncation and number of grid points should be same.')
1198 if (
size(at_data,2)-1 < km )
then 1199 call messagenotify(
'E',
'at_BoundariesGrid_DD', &
1200 'The Chebyshev dimension of input data too small.')
1201 elseif (
size(at_data,2)-1 > km )
then 1202 call messagenotify(
'W',
'at_BoundariesGrid_DD', &
1203 'The Chebyshev dimension of input data too large.')
1206 if (.not.
present(values))
then 1210 value1 = values(:,1)
1211 value2 = values(:,2)
1214 if ( at_boundariesgrid_dd_first )
then 1215 at_boundariesgrid_dd_first = .false.
1217 if (
allocated(alu))
deallocate(alu)
1218 if (
allocated(kp))
deallocate(kp)
1220 allocate(alu(0:im,0:km),kp(0:im))
1226 tg_data =
ag_at(tt_data)
1227 alu = transpose(tg_data)
1231 call ludecomp(alu,kp)
1234 ag_data =
ag_at(at_data)
1235 ag_data(:,0) = value1
1236 ag_data(:,im) = value2
1237 at_data = lusolve(alu,kp,ag_data)
1239 end subroutine at_boundariesgrid_dd_2d
1244 subroutine at_boundariesgrid_dd_1d(t_data,values)
1246 real(DP),
dimension(0:km),
intent(inout) :: t_data
1248 real(DP),
dimension(2),
intent(in),
optional :: values
1250 real(DP),
dimension(1,0:km) :: at_work
1251 real(DP),
dimension(1,2) :: vwork
1253 if (.not.
present(values))
then 1261 call at_boundariesgrid_dd_2d(at_work,vwork)
1264 end subroutine at_boundariesgrid_dd_1d
1269 subroutine at_boundariesgrid_dn_2d(at_data,values)
1271 real(DP),
dimension(:,0:),
intent(inout) :: at_data
1273 real(DP),
dimension(:,:),
intent(in),
optional :: values
1275 real(DP),
dimension(:,:),
allocatable :: alu
1276 integer,
dimension(:),
allocatable :: kp
1277 real(DP),
dimension(size(at_data,1),0:im) :: ag_data
1278 real(DP),
dimension(0:km,0:km) :: tt_data
1279 real(DP),
dimension(0:km,0:im) :: tg_data
1280 real(DP),
dimension(size(at_data,1)) :: value1, value2
1285 if ( im /= km )
then 1286 call messagenotify(
'E',
'at_BoundariesGrid_DN', &
1287 'Chebyshev truncation and number of grid points should be same.')
1290 if (
size(at_data,2)-1 < km )
then 1291 call messagenotify(
'E',
'at_BoundariesGrid_DN', &
1292 'The Chebyshev dimension of input data too small.')
1293 elseif (
size(at_data,2)-1 > km )
then 1294 call messagenotify(
'W',
'at_BoundariesGrid_DN', &
1295 'The Chebyshev dimension of input data too large.')
1298 if (.not.
present(values))
then 1302 value1 = values(:,1)
1303 value2 = values(:,2)
1306 if ( at_boundariesgrid_dn_first )
then 1307 at_boundariesgrid_dn_first = .false.
1309 if (
allocated(alu))
deallocate(alu)
1310 if (
allocated(kp))
deallocate(kp)
1312 allocate(alu(0:im,0:km),kp(0:im))
1318 tg_data =
ag_at(tt_data)
1319 alu = transpose(tg_data)
1322 alu(im,:) = tg_data(:,im)
1324 call ludecomp(alu,kp)
1327 ag_data =
ag_at(at_data)
1328 ag_data(:,0) = value1
1329 ag_data(:,im) = value2
1330 at_data = lusolve(alu,kp,ag_data)
1332 end subroutine at_boundariesgrid_dn_2d
1337 subroutine at_boundariesgrid_dn_1d(t_data,values)
1339 real(DP),
dimension(0:km),
intent(inout) :: t_data
1341 real(DP),
dimension(2),
intent(in),
optional :: values
1343 real(DP),
dimension(1,0:km) :: at_work
1344 real(DP),
dimension(1,2) :: vwork
1346 if (.not.
present(values))
then 1354 call at_boundariesgrid_dn_2d(at_work,vwork)
1357 end subroutine at_boundariesgrid_dn_1d
1363 subroutine at_boundariesgrid_nd_2d(at_data,values)
1365 real(DP),
dimension(:,0:),
intent(inout) :: at_data
1367 real(DP),
dimension(:,:),
intent(in),
optional :: values
1369 real(DP),
dimension(:,:),
allocatable :: alu
1370 integer,
dimension(:),
allocatable :: kp
1371 real(DP),
dimension(size(at_data,1),0:im) :: ag_data
1372 real(DP),
dimension(0:km,0:km) :: tt_data
1373 real(DP),
dimension(0:km,0:im) :: tg_data
1374 real(DP),
dimension(size(at_data,1)) :: value1, value2
1379 if ( im /= km )
then 1380 call messagenotify(
'E',
'at_BoundariesGrid_ND', &
1381 'Chebyshev truncation and number of grid points should be same.')
1384 if (
size(at_data,2)-1 < km )
then 1385 call messagenotify(
'E',
'at_BoundariesGrid_ND', &
1386 'The Chebyshev dimension of input data too small.')
1387 elseif (
size(at_data,2)-1 > km )
then 1388 call messagenotify(
'W',
'at_BoundariesGrid_DD', &
1389 'The Chebyshev dimension of input data too large.')
1392 if (.not.
present(values))
then 1396 value1 = values(:,1)
1397 value2 = values(:,2)
1400 if ( at_boundariesgrid_nd_first )
then 1401 at_boundariesgrid_nd_first = .false.
1403 if (
allocated(alu))
deallocate(alu)
1404 if (
allocated(kp))
deallocate(kp)
1406 allocate(alu(0:im,0:km),kp(0:im))
1412 tg_data =
ag_at(tt_data)
1413 alu = transpose(tg_data)
1416 alu(0,:) = tg_data(:,0)
1418 call ludecomp(alu,kp)
1421 ag_data =
ag_at(at_data)
1422 ag_data(:,0) = value1
1423 ag_data(:,im) = value2
1424 at_data = lusolve(alu,kp,ag_data)
1426 end subroutine at_boundariesgrid_nd_2d
1432 subroutine at_boundariesgrid_nd_1d(t_data,values)
1434 real(DP),
dimension(0:km),
intent(inout) :: t_data
1436 real(DP),
dimension(2),
intent(in),
optional :: values
1438 real(DP),
dimension(1,0:km) :: at_work
1439 real(DP),
dimension(1,2) :: vwork
1441 if (.not.
present(values))
then 1449 call at_boundariesgrid_nd_2d(at_work,vwork)
1452 end subroutine at_boundariesgrid_nd_1d
1458 subroutine at_boundariesgrid_nn_2d(at_data,values)
1460 real(DP),
dimension(:,0:),
intent(inout) :: at_data
1462 real(DP),
dimension(:,:),
intent(in),
optional :: values
1465 real(DP),
dimension(:,:),
allocatable :: alu
1466 integer,
dimension(:),
allocatable :: kp
1467 real(DP),
dimension(size(at_data,1),0:im) :: ag_data
1468 real(DP),
dimension(0:km,0:km) :: tt_data
1469 real(DP),
dimension(0:km,0:im) :: tg_data
1470 real(DP),
dimension(size(at_data,1)) :: value1, value2
1475 if ( im /= km )
then 1476 call messagenotify(
'E',
'at_BoundariesGrid_NN', &
1477 'Chebyshev truncation and number of grid points should be same.')
1480 if (
size(at_data,2)-1 < km )
then 1481 call messagenotify(
'E',
'at_BoundariesGrid_NN', &
1482 'The Chebyshev dimension of input data too small.')
1483 elseif (
size(at_data,2)-1 > km )
then 1484 call messagenotify(
'W',
'at_BoundariesGrid_NN', &
1485 'The Chebyshev dimension of input data too large.')
1488 if (.not.
present(values))
then 1492 value1 = values(:,1)
1493 value2 = values(:,2)
1496 if ( at_boundariesgrid_nn_first )
then 1497 at_boundariesgrid_nn_first = .false.
1499 if (
allocated(alu))
deallocate(alu)
1500 if (
allocated(kp))
deallocate(kp)
1502 allocate(alu(0:im,0:km),kp(0:im))
1508 tg_data =
ag_at(tt_data)
1509 alu = transpose(tg_data)
1512 alu(0,:) = tg_data(:,0)
1513 alu(im,:) = tg_data(:,im)
1515 call ludecomp(alu,kp)
1518 ag_data =
ag_at(at_data)
1519 ag_data(:,0) = value1
1520 ag_data(:,im) = value2
1521 at_data = lusolve(alu,kp,ag_data)
1523 end subroutine at_boundariesgrid_nn_2d
1529 subroutine at_boundariesgrid_nn_1d(t_data,values)
1531 real(DP),
dimension(0:km),
intent(inout) :: t_data
1533 real(DP),
dimension(2),
intent(in),
optional :: values
1534 real(DP),
dimension(1,0:km) :: at_work
1535 real(DP),
dimension(1,2) :: vwork
1537 if (.not.
present(values))
then 1545 call at_boundariesgrid_nn_2d(at_work,vwork)
1548 end subroutine at_boundariesgrid_nn_1d
real(dp) function, dimension(size(at_data, 1), 0:size(at_data, 2) -1), public at_dx_at(at_data)
入力チェビシェフデータに X 微分を作用する(2 次元配列用).
real(dp) function, dimension(size(ag_data, 1), 0:km), public at_ag(ag_data)
格子データからチェビシェフデータへ変換する(2 次元配列用).
real(dp) function, dimension(size(ae, 1), 0:im-1), public ag_ae(ae)
スペクトルデータから格子点データへ逆変換する(2 次元データ用)
real(dp) function, public avr_g(g)
1 次元格子点データの平均
subroutine, public at_finalize
モジュールの終了処理(割り付け配列の解放)をおこなう.
real(dp) function, dimension(size(ag, 1)), public a_int_ag(ag)
1 次元格子点データが並んだ 2 次元配列の積分
subroutine, public t_boundaries(t_data, cond, values)
境界条件の適用(タウ法, 1 次元配列用) 境界条件と両境界での値をオプションで与える. デフォルトは DD...
subroutine, public at_boundariesgrid(at_data, cond, values)
境界条件の適用(実空間での評価, 2 次元配列用) 境界条件と両境界での値をオプションで与える. デフォルトは DD, values = 0
real(dp) function, public int_g(g)
1 次元格子点データの積分
subroutine, public t_boundariesgrid(t_data, cond, values)
境界条件の適用(タウ法, 1 次元配列用) 境界条件と両境界での値をオプションで与える. デフォルトは DD...
real(dp) function, public interpolate_t(t_data, xval)
1 次元データの補間
real(dp) function, dimension(size(ag, 1),-km:km), public ae_ag(ag)
格子点データからスペクトルデータへ正変換する(2 次元データ用)
subroutine, public ae_initial(i, k, xmin, xmax)
スペクトル変換の格子点数, 波数, 領域の大きさを設定する.
subroutine, public at_boundaries(at_data, cond, values)
境界条件の適用(タウ法, 2 次元配列用)
real(dp) function, dimension(size(at_data, 1)), public a_interpolate_at(at_data, xval)
1 次元データの並んだ 2次元配列の補間
real(dp) function, dimension(0:km), public t_g(g_data)
格子データからチェビシェフデータへ変換する(1 次元配列用).
real(dp), dimension(:), allocatable, save, public g_x
格子点座標(X)を格納した 1 次元配列
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(dp) function, dimension(size(ag, 1)), public a_avr_ag(ag)
1 次元格子点データが並んだ 2 次元配列の平均
real(dp), dimension(:), allocatable, save, public g_x_weight
重み座標を格納した 1 次元配列
real(dp) function, dimension(0:im), public g_t(t_data)
チェビシェフデータから格子データへ変換する(1 次元配列用).