grid_tools 1.14.0
Loading...
Searching...
No Matches
pmat2.f90
Go to the documentation of this file.
1
4
21module pmat2
22!============================================================================
23use pkind, only: spi,sp,dp,dpc
24implicit none
25private
26public:: avco
27public:: dfco
28public:: dfco2
29public:: clipb
30public:: cad1b
31public:: csb1b
32public:: cad2b
33public:: csb2b
34public:: ldub
35public:: ldltb
36public:: udlb
37public:: l1ubb
38public:: l1ueb
39public:: ltdlbv
40public:: udlbv
41public:: udlbx
42public:: udlby
43public:: udlvb
44public:: udlxb
45public:: udlyb
46public:: u1lbv
47public:: u1lbx
48public:: u1lby
49public:: u1lvb
50public:: u1lxb
51public:: u1lyb
52public:: linbv
53public:: wrtb
54real(dp),parameter:: zero=0
55
56interface avco; module procedure avco, davco, tavco; end interface
57interface dfco; module procedure dfco, ddfco, tdfco; end interface
58interface dfco2; module procedure dfco2, ddfco2, tdfco2; end interface
59interface clipb; module procedure clib, clib_d, clib_c; end interface
60interface cad1b; module procedure cad1b; end interface
61interface csb1b; module procedure csb1b; end interface
62interface cad2b; module procedure cad2b; end interface
63interface csb2b; module procedure csb2b; end interface
64interface ldub; module procedure ldub, dldub; end interface
65interface ldltb; module procedure ldltb, dldltb; end interface
66interface l1ubb; module procedure l1ubb, dl1ubb; end interface
67interface l1ueb; module procedure l1ueb, dl1ueb; end interface
68interface ltdlbv; module procedure ltdlbv,dltdlbv; end interface
69interface udlb; module procedure udlb, dudlb; end interface
70interface udlbv; module procedure udlbv, dudlbv; end interface
71interface udlbx; module procedure udlbx; end interface
72interface udlby; module procedure udlby; end interface
73interface udlvb; module procedure udlvb; end interface
74interface udlxb; module procedure udlxb; end interface
75interface udlyb; module procedure udlyb; end interface
76interface u1lbv; module procedure u1lbv; end interface
77interface u1lbx; module procedure u1lbx; end interface
78interface u1lby; module procedure u1lby; end interface
79interface u1lvb; module procedure u1lvb; end interface
80interface u1lxb; module procedure u1lxb; end interface
81interface u1lyb; module procedure u1lyb; end interface
82interface linbv; module procedure linbv; end interface
83interface wrtb; module procedure wrtb; end interface
84contains
85
99subroutine avco(na,nb,za,zb,z0,a,b) ! [AVCO]
100use pietc, only: u0,u1
101use pmat, only: inv
102implicit none
103integer(spi),intent(in ):: na,nb
104real(sp), intent(in ):: za(na),zb(nb),z0
105real(sp), intent(out):: a(na),b(nb)
106!-----------------------------------------------------------------------------
107integer(spi) :: na1,nab,i
108real(sp), dimension(na+nb,na+nb):: w
109real(sp), dimension(na) :: za0,pa
110real(sp), dimension(nb) :: zb0,pb
111real(sp), dimension(na+nb) :: ab
112!=============================================================================
113na1=na+1; nab=na+nb
114za0=za-z0; zb0=zb-z0
115pa=u1; pb=-u1
116w=u0; ab=u0
117w(1,1:na)=u1; ab(1)=u1
118do i=2,nab; w(i,1:na)=pa; pa=pa*za0; w(i,na1:nab)=pb; pb=pb*zb0; enddo
119call inv(w,ab)
120a=ab(1:na); b=ab(na1:nab)
121end subroutine avco
122
133subroutine davco(na,nb,za,zb,z0,a,b) ! [AVCO]
134use pietc, only: u0,u1
135use pmat, only: inv
136implicit none
137integer(spi),intent(IN ):: na,nb
138real(dp), intent(IN ):: za(na),zb(nb),z0
139real(dp), intent(OUT):: a(na),b(nb)
140!-----------------------------------------------------------------------------
141integer(spi) :: na1,nab,i
142real(dp),dimension(na+nb,na+nb):: w
143real(dp),dimension(na) :: za0,pa
144real(dp),dimension(nb) :: zb0,pb
145real(dp),dimension(na+nb) :: ab
146!=============================================================================
147na1=na+1; nab=na+nb
148za0=za-z0; zb0=zb-z0
149pa=u1; pb=-u1
150w=u0; ab=u0
151w(1,1:na)=u1; ab(1)=u1
152do i=2,nab; w(i,1:na)=pa; pa=pa*za0; w(i,na1:nab)=pb; pb=pb*zb0; enddo
153call inv(w,ab)
154a=ab(1:na); b=ab(na1:nab)
155end subroutine davco
156
164subroutine tavco(xa,xb,a,b)! [AVCO]
165implicit none
166real(dp),dimension(:),intent(IN ):: xa,xb
167real(dp),dimension(:),intent(OUT):: a,b
168!-----------------------------------------------------------------------------
169integer(spi):: na,nb
170!=============================================================================
171na=size(xa); if(na /= size(a))stop 'In tavco; sizes of a and xa different'
172nb=size(xb); if(nb /= size(b))stop 'In tavco; sizes of b and xb different'
173call davco(na,nb,xa,xb,zero,a,b)
174end subroutine tavco
175
189subroutine dfco(na,nb,za,zb,z0,a,b)! [DFCO]
190use pietc_s, only: u0,u1
191use pmat, only: inv
192implicit none
193integer(spi),intent(IN ) :: na,nb
194real(sp), intent(IN ) :: za(na),zb(nb),z0
195real(sp), intent(OUT) :: a(na),b(nb)
196!-----------------------------------------------------------------------------
197integer(spi):: na1,nab,i
198real(sp), dimension(na+nb,na+nb):: w
199real(sp), dimension(na) :: za0,pa
200real(sp), dimension(nb) :: zb0,pb
201real(sp), dimension(na+nb) :: ab
202!=============================================================================
203na1=na+1; nab=na+nb
204za0=za-z0; zb0=zb-z0
205pa=u1; pb=-u1
206w=u0; ab=u0
207w(1,1:na)=u1; ab(1)=u1
208do i=3,nab; w(i,1:na) =pa*(i-2); pa=pa*za0; enddo
209do i=2,nab; w(i,na1:nab)=pb; pb=pb*zb0; enddo
210call inv(w,ab)
211a=ab(1:na); b=ab(na1:nab)
212end subroutine dfco
213
224subroutine ddfco(na,nb,za,zb,z0,a,b) ! Real(dp) version of [DFCO]
225use pietc, only: u0,u1
226use pmat, only: inv
227implicit none
228integer(spi),intent(in) :: na,nb
229real(dp), intent(in) :: za(na),zb(nb),z0
230real(dp), intent(out):: a(na),b(nb)
231!-----------------------------------------------------------------------------
232integer(spi) :: na1,nab,i
233real(dp), dimension(na+nb,na+nb):: w
234real(dp), dimension(na) :: za0,pa
235real(dp), dimension(nb) :: zb0,pb
236real(dp), dimension(na+nb) :: ab
237!=============================================================================
238na1=na+1; nab=na+nb
239za0=za-z0; zb0=zb-z0
240pa=u1; pb=-u1
241w=u0; ab=u0
242w(1,1:na)=u1; ab(1)=u1
243do i=3,nab; w(i,1:na) =pa*(i-2); pa=pa*za0; enddo
244do i=2,nab; w(i,na1:nab)=pb; pb=pb*zb0; enddo
245call inv(w,ab)
246a=ab(1:na); b=ab(na1:nab)
247end subroutine ddfco
248
257subroutine tdfco(xa,xb,a,b)! [DFCO]
258implicit none
259real(dp),dimension(:),intent(IN ):: xa,xb
260real(dp),dimension(:),intent(OUT):: a,b
261!-----------------------------------------------------------------------------
262integer(spi):: na,nb
263!=============================================================================
264na=size(xa); if(na /= size(a))stop 'In tdfco; sizes of a and xa different'
265nb=size(xb); if(nb /= size(b))stop 'In tdfco; sizes of b and xb different'
266call ddfco(na,nb,xa,xb,zero,a,b)
267end subroutine tdfco
268
282subroutine dfco2(na,nb,za,zb,z0,a,b)! [DFCO2]
283use pietc_s, only: u0,u1
284use pmat, only: inv
285implicit none
286integer(spi), intent(IN ):: na,nb
287real(sp), intent(IN ):: za(na),zb(nb),z0
288real(sp), intent(OUT):: a(na),b(nb)
289!-----------------------------------------------------------------------------
290integer(spi) :: na1,nab,i
291real(sp), dimension(na+nb,na+nb):: w
292real(sp), dimension(na) :: za0,pa
293real(sp), dimension(nb) :: zb0,pb
294real(sp), dimension(na+nb) :: ab
295!=============================================================================
296na1=na+1; nab=na+nb
297za0=za-z0; zb0=zb-z0
298pa=u1; pb=-u1
299w=u0; ab=u0
300w(1,1:na)=u1; ab(1)=u1
301do i=4,nab; w(i,1:na) =pa*(i-2)*(i-3); pa=pa*za0; enddo
302do i=2,nab; w(i,na1:nab)=pb; pb=pb*zb0; enddo
303call inv(w,ab)
304a=ab(1:na); b=ab(na1:nab)
305end subroutine dfco2
306
317subroutine ddfco2(na,nb,za,zb,z0,a,b) ! Real(dp) version of [DFCO2]
318use pietc, only: u0,u1
319use pmat, only: inv
320implicit none
321integer(spi),intent(IN ) :: na,nb
322real(dp), intent(IN ) :: za(na),zb(nb),z0
323real(dp), intent(OUT) :: a(na),b(nb)
324!-----------------------------------------------------------------------------
325integer(spi) :: na1,nab,i
326real(dp), dimension(na+nb,na+nb):: w
327real(dp), dimension(na) :: za0,pa
328real(dp), dimension(nb) :: zb0,pb
329real(dp), dimension(na+nb) :: ab
330!=============================================================================
331na1=na+1; nab=na+nb
332za0=za-z0; zb0=zb-z0
333pa=u1; pb=-u1
334w=u0; ab=u0
335w(1,1:na)=u1; ab(1)=u1
336do i=4,nab; w(i,1:na) =pa*(i-2)*(i-3); pa=pa*za0; enddo
337do i=2,nab; w(i,na1:nab)=pb; pb=pb*zb0; enddo
338call inv(w,ab)
339a=ab(1:na); b=ab(na1:nab)
340end subroutine ddfco2
341
349subroutine tdfco2(xa,xb,a,b)! [DFCO2]
350!=============================================================================
351real(dp),dimension(:),intent(IN ):: xa,xb
352real(dp),dimension(:),intent(OUT):: a,b
353!-----------------------------------------------------------------------------
354integer(spi):: na,nb
355!=============================================================================
356na=size(xa); if(na /= size(a))stop 'In tdfco2; sizes of a and xa different'
357nb=size(xb); if(nb /= size(b))stop 'In tdfco2; sizes of b and xb different'
358call ddfco2(na,nb,xa,xb,zero,a,b)
359end subroutine tdfco2
360
369pure subroutine clib(m1,m2,mah1,mah2,a)! [CLIPB]
370use pietc_s, only: u0
371implicit none
372integer(spi), intent(IN ) :: m1, m2, mah1, mah2
373real(sp), intent(INOUT) :: a(m1,-mah1:mah2)
374integer(spi):: j
375do j=1,mah1; a(1:min(m1,j),-j)=u0; enddo
376do j=m2-m1+1,mah2; a(max(1,m2-j+1):m1,j)=u0; enddo
377end subroutine clib
378
387pure subroutine clib_d(m1,m2,mah1,mah2,a)! [CLIPB]
388use pietc, only: u0
389implicit none
390integer(spi),intent(IN ) :: m1, m2, mah1, mah2
391real(dp), intent(INOUT) :: a(m1,-mah1:mah2)
392integer(spi):: j
393do j=1,mah1; a(1:min(m1,j),-j)=u0; enddo
394do j=m2-m1+1,mah2; a(max(1,m2-j+1):m1,j)=u0; enddo
395end subroutine clib_d
396
405pure subroutine clib_c(m1,m2,mah1,mah2,a)! [CLIPB]
406use pietc, only: c0
407implicit none
408integer(spi), intent(IN ) :: m1, m2, mah1, mah2
409complex(dpc), intent(INOUT) :: a(m1,-mah1:mah2)
410integer(spi):: j
411do j=1,mah1; a(1:min(m1,j),-j)=c0; enddo
412do j=m2-m1+1,mah2; a(max(1,m2-j+1):m1,j)=c0; enddo
413end subroutine clib_c
414
425subroutine cad1b(m1,mah1,mah2,mirror2,a)! [CAD1B]
426use pietc_s, only: u0
427implicit none
428integer(spi),intent(IN ):: m1,mah1,mah2,mirror2
429real(sp), intent(INOUT):: a(0:m1-1,-mah1:mah2)
430!-----------------------------------------------------------------------------
431integer(spi):: i,i2,jm,jp,jpmax
432!=============================================================================
433if(mirror2+mah1 > mah2)stop 'In CAD1B; mah2 insufficient'
434do i=0,m1-1; i2=i*2; jpmax=mirror2+mah1-i2; if(jpmax <= -mah1)exit
435 do jm=-mah1,mah2; jp=mirror2-jm-i2; if(jp <= jm)exit
436 a(i,jp)=a(i,jp)+a(i,jm) ! Reflect and add
437 a(i,jm)=u0 ! zero the exterior part
438 enddo
439enddo
440end subroutine cad1b
441
450subroutine csb1b(m1,mah1,mah2,mirror2,a)! [CSB1B]
451use pietc_s, only: u0
452implicit none
453integer(spi),intent(IN ):: m1,mah1,mah2,mirror2
454real(sp), intent(INOUT):: a(0:m1-1,-mah1:mah2)
455!-----------------------------------------------------------------------------
456integer(spi):: i,i2,jm,jp,jpmax
457!=============================================================================
458if(mirror2+mah1 > mah2)stop 'In CSB1B; mah2 insufficient'
459do i=0,m1-1; i2=i*2; jpmax=mirror2+mah1-i2; if(jpmax < -mah1)exit
460 do jm=-mah1,mah2; jp=mirror2-jm-i2; if(jp < jm)exit
461 a(i,jp)=a(i,jp)-a(i,jm) ! Reflect and subtract
462 a(i,jm)=u0 ! zero the exterior part
463 enddo
464enddo
465end subroutine csb1b
466
476subroutine cad2b(m1,m2,mah1,mah2,mirror2,a)! [CAD2B]
477use pietc_s, only: u0
478implicit none
479integer(spi),intent(IN ):: m1,m2,mah1,mah2,mirror2
480real(sp), intent(INOUT):: a(1-m1:0,m1-m2-mah1:m1-m2+mah2)
481!-----------------------------------------------------------------------------
482integer(spi):: i,i2,jm,jp,jmmin,nah1,nah2
483!=============================================================================
484nah1=mah1+m2-m1; nah2=mah2+m1-m2 ! Effective 2nd-index bounds of A
485if(mirror2-nah1 > -nah2)stop 'In CAD2B; mah1 insufficient'
486do i=0,1-m1,-1; i2=i*2; jmmin=mirror2-nah2-i2; if(jmmin >= nah2)exit
487 do jp=nah2,nah1,-1; jm=mirror2-jp-i2; if(jm >= jp)exit
488 a(i,jm)=a(i,jm)+a(i,jp) ! Reflect and add
489 a(i,jp)=u0 ! zero the exterior part
490 enddo
491enddo
492end subroutine cad2b
493
503subroutine csb2b(m1,m2,mah1,mah2,mirror2,a)! [CSB2B]
504use pietc_s, only: u0
505implicit none
506integer(spi),intent(IN ):: m1,m2,mah1,mah2,mirror2
507real(sp), intent(INOUT):: a(1-m1:0,m1-m2-mah1:m1-m2+mah2)
508!-----------------------------------------------------------------------------
509integer(spi):: i,i2,jm,jp,jmmin,nah1,nah2
510!=============================================================================
511nah1=mah1+m2-m1; nah2=mah2+m1-m2 ! Effective 2nd-index bounds of A
512if(mirror2-nah1 > -nah2)stop 'In CSB2B; mah1 insufficient'
513do i=0,1-m1,-1; i2=i*2; jmmin=mirror2-nah2-i2; if(jmmin > nah2)exit
514 do jp=nah2,nah1,-1; jm=mirror2-jp-i2; if(jm > jp)exit
515 a(i,jm)=a(i,jm)-a(i,jp) ! Reflect and subtract
516 a(i,jp)=u0 ! zero the exterior part
517 enddo
518enddo
519end subroutine csb2b
520
531subroutine ldub(m,mah1,mah2,a)! [LDUB]
532use pietc_s, only: u0,u1
533implicit none
534integer(spi),intent(IN ):: m,mah1, mah2
535real(sp), intent(INOUT):: a(m,-mah1:mah2)
536!-----------------------------------------------------------------------------
537integer(spi):: j, imost, jmost, jp, i
538real(sp) :: ajj, ajji, aij
539!=============================================================================
540do j=1,m
541 imost=min(m,j+mah1)
542 jmost=min(m,j+mah2)
543 jp=j+1
544 ajj=a(j,0)
545 if(ajj == u0)then
546 print '(" Failure in LDUB:"/" Matrix requires pivoting or is singular")'
547 stop
548 endif
549 ajji=u1/ajj
550 a(j,0)=ajji
551 do i=jp,imost
552 aij=ajji*a(i,j-i)
553 a(i,j-i)=aij
554 a(i,jp-i:jmost-i)=a(i,jp-i:jmost-i)-aij*a(j,1:jmost-j)
555 enddo
556 a(j,1:jmost-j)=ajji*a(j,1:jmost-j)
557enddo
558end subroutine ldub
559
570subroutine dldub(m,mah1,mah2,a) ! Real(dp) version of [LDUB]
571use pietc, only: u0,u1
572implicit none
573integer(spi),intent(IN ):: m,mah1, mah2
574real(dp), intent(INOUT):: a(m,-mah1:mah2)
575!-----------------------------------------------------------------------------
576integer(spi):: j, imost, jmost, jp, i
577real(dp) :: ajj, ajji, aij
578!=============================================================================
579do j=1,m
580 imost=min(m,j+mah1)
581 jmost=min(m,j+mah2)
582 jp=j+1
583 ajj=a(j,0)
584 if(ajj == u0)then
585 print '(" Fails in LDUB_d:"/" Matrix requires pivoting or is singular")'
586 stop
587 endif
588 ajji=u1/ajj
589 a(j,0)=ajji
590 do i=jp,imost
591 aij=ajji*a(i,j-i)
592 a(i,j-i)=aij
593 a(i,jp-i:jmost-i)=a(i,jp-i:jmost-i)-aij*a(j,1:jmost-j)
594 enddo
595 a(j,1:jmost-j)=ajji*a(j,1:jmost-j)
596enddo
597end subroutine dldub
598
608subroutine ldltb(m,mah1,a) ! Real(sp) version of [LDLTB]
609use pietc_s, only: u0,u1
610integer(spi),intent(IN ):: m,mah1
611real(sp), intent(INOUT):: a(m,-mah1:0)
612!-----------------------------------------------------------------------------
613integer(spi):: j, imost, jp, i,k
614real(sp) :: ajj, ajji, aij
615!=============================================================================
616do j=1,m
617 imost=min(m,j+mah1)
618 jp=j+1
619 ajj=a(j,0)
620 if(ajj == u0)then
621 print '(" Fails in LDLTB:"/" Matrix requires pivoting or is singular")'
622 stop
623 endif
624 ajji=u1/ajj
625 a(j,0)=ajji
626 do i=jp,imost
627 aij=a(i,j-i)
628 a(i,j-i)=ajji*aij
629 do k=jp,i
630 a(i,k-i)=a(i,k-i)-aij*a(k,j-k)
631 enddo
632 enddo
633enddo
634end subroutine ldltb
635
644subroutine dldltb(m,mah1,a) ! Real(dp) version of [LDLTB]
645use pietc, only: u0,u1
646integer(spi),intent(IN ) :: m,mah1
647real(dp), intent(INOUT) :: a(m,-mah1:0)
648!-----------------------------------------------------------------------------
649integer(spi):: j, imost, jp, i,k
650real(dp) :: ajj, ajji, aij
651!=============================================================================
652do j=1,m
653 imost=min(m,j+mah1)
654 jp=j+1
655 ajj=a(j,0)
656 if(ajj == u0)then
657 print '(" Fails in LDLTB_d:"/" Matrix requires pivoting or is singular")'
658 stop
659 endif
660 ajji=u1/ajj
661 a(j,0)=ajji
662 do i=jp,imost
663 aij=a(i,j-i)
664 a(i,j-i)=ajji*aij
665 do k=jp,i
666 a(i,k-i)=a(i,k-i)-aij*a(k,j-k)
667 enddo
668 enddo
669enddo
670end subroutine dldltb
671
682subroutine udlb(m,mah1,mah2,a) ! Reversed-index version of ldub [UDLB]
683implicit none
684integer(spi), intent(IN ) :: m,mah1,mah2
685real(sp),dimension(m,-mah1:mah2),intent(INOUT) :: a(m,-mah1:mah2)
686!-----------------------------------------------------------------------------
687real(sp),dimension(m,-mah2:mah1):: at
688!=============================================================================
689at=a(m:1:-1,mah2:-mah1:-1); call ldub(m,mah2,mah1,at)
690a=at(m:1:-1,mah1:-mah2:-1)
691end subroutine udlb
692
703subroutine dudlb(m,mah1,mah2,a) ! real(dp) version of udlb [UDLB]
704implicit none
705integer(spi), intent(IN ) :: m,mah1,mah2
706real(dp),dimension(m,-mah1:mah2),intent(INOUT) :: a(m,-mah1:mah2)
707!-----------------------------------------------------------------------------
708real(dp),dimension(m,-mah2:mah1):: at
709!=============================================================================
710at=a(m:1:-1,mah2:-mah1:-1); call dldub(m,mah2,mah1,at)
711a=at(m:1:-1,mah1:-mah2:-1)
712end subroutine dudlb
713
732subroutine l1ubb(m,mah1,mah2,mbh1,mbh2,a,b)! [L1UBB]
733use pietc_s, only: u0,u1
734implicit none
735integer(spi), intent(IN ) :: m,mah1, mah2, mbh1, mbh2
736real(sp), intent(INOUT) :: a(m,-mah1:mah2), b(m,-mbh1:mbh2)
737!-----------------------------------------------------------------------------
738integer(spi):: j, imost, jmost, jleast, jp, i
739real(sp) :: ajj, ajji, aij
740!=============================================================================
741do j=1,m
742 imost=min(m,j+mah1)
743 jmost=min(m,j+mah2)
744 jleast=max(1,j-mah1)
745 jp=j+1
746 ajj=a(j,0)
747 if(ajj == u0)stop 'In L1UBB; zero element found in diagonal factor'
748 ajji=u1/ajj
749 a(j,jleast-j:jmost-j) = ajji * a(j,jleast-j:jmost-j)
750 do i=jp,imost
751 aij=a(i,j-i)
752 a(i,jp-i:jmost-i) = a(i,jp-i:jmost-i) - aij*a(j,jp-j:jmost-j)
753 enddo
754 a(j,0)=u1
755 b(j,-mbh1:mbh2) = ajji * b(j,-mbh1:mbh2)
756enddo
757end subroutine l1ubb
758
770subroutine dl1ubb(m,mah1,mah2,mbh1,mbh2,a,b) ! Real(dp) version of [L1UBB]
771use pietc, only: u0,u1
772implicit none
773integer(spi),intent(IN ) :: m,mah1, mah2, mbh1, mbh2
774real(dp), intent(INOUT) :: a(m,-mah1:mah2), b(m,-mbh1:mbh2)
775!-----------------------------------------------------------------------------
776integer(spi):: j, imost, jmost, jleast, jp, i
777real(dp) :: ajj, ajji, aij
778!=============================================================================
779do j=1,m
780 imost=min(m,j+mah1)
781 jmost=min(m,j+mah2)
782 jleast=max(1,j-mah1)
783 jp=j+1
784 ajj=a(j,0)
785 if(ajj == u0)stop 'In L1UBB_d; zero element found in diagonal factor'
786 ajji=u1/ajj
787 a(j,jleast-j:jmost-j) = ajji * a(j,jleast-j:jmost-j)
788 do i=jp,imost
789 aij=a(i,j-i)
790 a(i,jp-i:jmost-i) = a(i,jp-i:jmost-i) - aij*a(j,jp-j:jmost-j)
791 enddo
792 a(j,0)=u1
793 b(j,-mbh1:mbh2) = ajji * b(j,-mbh1:mbh2)
794enddo
795end subroutine dl1ubb
796
817subroutine l1ueb(m,mah1,mah2,mbh1,mbh2,a,b)! [L1UEB]
818use pietc_s, only: u0,u1
819implicit none
820integer(spi),intent(IN ) :: m,mah1, mah2, mbh1, mbh2
821real(sp), intent(INOUT) :: a(0:m,-mah1:mah2), b(m,-mbh1:mbh2)
822!-----------------------------------------------------------------------------
823integer(spi):: j, imost, jmost, jleast, jp, i
824real(sp) :: ajj, ajji, aij
825!=============================================================================
826do j=1,m
827 imost=min(m,j+mah1)
828 jmost=min(m,j+mah2)
829 jleast=max(0,j-mah1)
830 jp=j+1
831 ajj=a(j,0)
832 if(ajj == u0)stop 'In L1UEB; zero element found in diagonal factor'
833 ajji=u1/ajj
834 a(j,jleast-j:jmost-j) = ajji * a(j,jleast-j:jmost-j)
835 do i=jp,imost
836 aij=a(i,j-i)
837 a(i,jp-i:jmost-i) = a(i,jp-i:jmost-i) - aij*a(j,jp-j:jmost-j)
838 enddo
839 a(j,0)=u1
840 b(j,-mbh1:mbh2) = ajji * b(j,-mbh1:mbh2)
841enddo
842end subroutine l1ueb
843
854subroutine dl1ueb(m,mah1,mah2,mbh1,mbh2,a,b) ! Real(dp) version of [L1UEB]
855use pietc, only: u0,u1
856implicit none
857integer(spi),intent(IN ):: m,mah1, mah2, mbh1, mbh2
858real(dp), intent(INOUT):: a(0:,-mah1:), b(:,-mbh1:)
859!-----------------------------------------------------------------------------
860integer(spi):: j, imost, jmost, jleast, jp, i
861real(dp) :: ajj, ajji, aij
862!=============================================================================
863do j=1,m
864 imost=min(m,j+mah1)
865 jmost=min(m,j+mah2)
866 jleast=max(0,j-mah1)
867 jp=j+1
868 ajj=a(j,0)
869 if(ajj == u0)stop 'In L1UEB_D; zero element found in diagonal factor'
870 ajji=u1/ajj
871 a(j,jleast-j:jmost-j) = ajji * a(j,jleast-j:jmost-j)
872 do i=jp,imost
873 aij=a(i,j-i)
874 a(i,jp-i:jmost-i) = a(i,jp-i:jmost-i) - aij*a(j,jp-j:jmost-j)
875 enddo
876 a(j,0)=u1
877 b(j,-mbh1:mbh2) = ajji * b(j,-mbh1:mbh2)
878enddo
879end subroutine dl1ueb
880
891subroutine udlbv(m,mah1,mah2,a,v)! [UDLBV]
892implicit none
893integer(spi),intent(IN ):: m, mah1, mah2
894real(sp), intent(IN ):: a(m,-mah1:mah2)
895real(sp), intent(INOUT):: v(m)
896!-----------------------------------------------------------------------------
897integer(spi):: i, j
898real(sp) :: vj
899!=============================================================================
900do j=1,m
901 vj=v(j)
902 do i=j+1,min(m,j+mah1); v(i)=v(i)-a(i,j-i)*vj; enddo; v(j)=a(j,0)*vj
903enddo
904do j=m,2,-1
905 vj=v(j)
906 do i=max(1,j-mah2),j-1; v(i)=v(i)-a(i,j-i)*vj; enddo
907enddo
908end subroutine udlbv
909
920subroutine dudlbv(m,mah1,mah2,a,v)! [udlbv]
921implicit none
922integer(spi),intent(IN ) :: m, mah1, mah2
923real(dp), intent(IN ) :: a(m,-mah1:mah2)
924real(dp), intent(INOUT) :: v(m)
925!-----------------------------------------------------------------------------
926integer(spi):: i, j
927real(dp) :: vj
928!=============================================================================
929do j=1,m
930 vj=v(j)
931 do i=j+1,min(m,j+mah1); v(i)=v(i)-a(i,j-i)*vj; enddo; v(j)=a(j,0)*vj
932enddo
933do j=m,2,-1
934 vj=v(j)
935 do i=max(1,j-mah2),j-1; v(i)=v(i)-a(i,j-i)*vj; enddo
936enddo
937end subroutine dudlbv
938
949subroutine ltdlbv(m,mah1,a,v)! [ltdlbv]
950implicit none
951integer(spi),intent(IN ) :: m, mah1
952real(sp), intent(IN ) :: a(m,-mah1:0)
953real(sp), intent(INOUT) :: v(m)
954!-----------------------------------------------------------------------------
955integer(spi):: i, j
956real(sp) :: vj
957!=============================================================================
958do j=1,m
959 vj=v(j)
960 do i=j+1,min(m,j+mah1); v(i)=v(i)-a(i,j-i)*vj; enddo; v(j)=a(j,0)*vj
961enddo
962do j=m,2,-1
963 vj=v(j)
964 do i=max(1,j-mah1),j-1; v(i)=v(i)-a(j,i-j)*vj; enddo
965enddo
966end subroutine ltdlbv
967
968
979subroutine dltdlbv(m,mah1,a,v)! [ltdlbv]
980implicit none
981integer(spi),intent(IN ) :: m, mah1
982real(dp), intent(IN ) :: a(m,-mah1:0)
983real(dp), intent(INOUT) :: v(m)
984!-----------------------------------------------------------------------------
985integer(spi):: i, j
986real(dp) :: vj
987!=============================================================================
988do j=1,m
989 vj=v(j)
990 do i=j+1,min(m,j+mah1); v(i)=v(i)-a(i,j-i)*vj; enddo; v(j)=a(j,0)*vj
991enddo
992do j=m,2,-1
993 vj=v(j)
994 do i=max(1,j-mah1),j-1; v(i)=v(i)-a(j,i-j)*vj; enddo
995enddo
996end subroutine dltdlbv
997
1010subroutine udlbx(mx,mah1,mah2,my,a,v)! [UDLBX]
1011implicit none
1012integer(spi),intent(IN ) :: mx, mah1, mah2, my
1013real(sp), intent(IN ) :: a(mx,-mah1:mah2)
1014real(sp), intent(INOUT) :: v(mx,my)
1015!-----------------------------------------------------------------------------
1016integer(spi):: jx, ix
1017!=============================================================================
1018do jx=1,mx
1019 do ix=jx+1,min(mx,jx+mah1); v(ix,:) = v(ix,:) - a(ix,jx-ix)*v(jx,:); enddo
1020 v(jx,:) = a(jx,0) * v(jx,:)
1021enddo
1022do jx=mx,2,-1
1023 do ix=max(1,jx-mah2),jx-1; v(ix,:) = v(ix,:) - a(ix,jx-ix)*v(jx,:); enddo
1024enddo
1025end subroutine udlbx
1026
1039subroutine udlby(my,mah1,mah2,mx,a,v)! [UDLBY]
1040implicit none
1041integer(spi),intent(IN ) :: my, mah1, mah2, mx
1042real(sp), intent(IN ) :: a(my,-mah1:mah2)
1043real(sp), intent(INOUT) :: v(mx,my)
1044!-----------------------------------------------------------------------------
1045integer(spi):: iy, jy
1046!=============================================================================
1047do jy=1,my
1048 do iy=jy+1,min(my,jy+mah1); v(:,iy) = v(:,iy)-a(iy,jy-iy)*v(:,jy); enddo
1049 v(:,jy)=a(jy,0)*v(:,jy)
1050enddo
1051do jy=my,2,-1
1052 do iy=max(1,jy-mah2),jy-1; v(:,iy)=v(:,iy)-a(iy,jy-iy)*v(:,jy); enddo
1053enddo
1054end subroutine udlby
1055
1066subroutine udlvb(m,mah1,mah2,v,a)! [UDLVB]
1067implicit none
1068integer(spi), intent(IN ) :: m, mah1, mah2
1069real(sp), intent(IN ) :: a(m,-mah1:mah2)
1070real(sp), intent(INOUT) :: v(m)
1071!-----------------------------------------------------------------------------
1072integer(spi):: i, j
1073real(sp) :: vi
1074!=============================================================================
1075do i=1,m
1076 vi=v(i)
1077 do j=i+1,min(m,i+mah2); v(j)=v(j)-vi*a(i,j-i); enddo
1078 v(i)=vi*a(i,0)
1079enddo
1080do i=m,2,-1
1081 vi=v(i)
1082 do j=max(1,i-mah1),i-1; v(j)=v(j)-vi*a(i,j-i); enddo
1083enddo
1084end subroutine udlvb
1085
1098subroutine udlxb(mx,mah1,mah2,my,v,a)! [UDLXB]
1099implicit none
1100integer(spi),intent(IN ) :: mx, mah1, mah2, my
1101real(sp), intent(IN ) :: a(mx,-mah1:mah2)
1102real(sp), intent(INOUT) :: v(mx,my)
1103!-----------------------------------------------------------------------------
1104integer(spi):: ix, jx
1105!=============================================================================
1106do ix=1,mx
1107 do jx=ix+1,min(mx,ix+mah2); v(jx,:)=v(jx,:)-v(ix,:)*a(ix,jx-ix); enddo
1108 v(ix,:)=v(ix,:)*a(ix,0)
1109enddo
1110do ix=mx,2,-1
1111 do jx=max(1,ix-mah1),ix-1; v(jx,:)=v(jx,:)-v(ix,:)*a(ix,jx-ix); enddo
1112enddo
1113end subroutine udlxb
1114
1127subroutine udlyb(my,mah1,mah2,mx,v,a)! [UDLYB]
1128implicit none
1129integer(spi),intent(IN ) :: my, mah1, mah2, mx
1130real(sp), intent(IN ) :: a(my,-mah1:mah2)
1131real(sp), intent(INOUT) :: v(mx,my)
1132!-----------------------------------------------------------------------------
1133integer(spi):: iy, jy
1134!=============================================================================
1135do iy=1,my
1136 do jy=iy+1,min(my,iy+mah2); v(:,jy)=v(:,jy)-v(:,iy)*a(iy,jy-iy); enddo
1137 v(:,iy)=v(:,iy)*a(iy,0)
1138enddo
1139do iy=my,2,-1
1140 do jy=max(1,iy-mah1),iy-1; v(:,jy)=v(:,jy)-v(:,iy)*a(iy,jy-iy); enddo
1141enddo
1142end subroutine udlyb
1143
1154subroutine u1lbv(m,mah1,mah2,a,v)! [U1LBV]
1155implicit none
1156integer(spi),intent(IN ) :: m, mah1, mah2
1157real(sp), intent(IN ) :: a(m,-mah1:mah2)
1158real(sp), intent(INOUT) :: v(m)
1159!-----------------------------------------------------------------------------
1160integer(spi):: i, j
1161real(sp) :: vj
1162!=============================================================================
1163do j=1,m
1164 vj=v(j)
1165 do i=j+1,min(m,j+mah1); v(i)=v(i)-a(i,j-i)*vj; enddo
1166enddo
1167do j=m,2,-1
1168 vj=v(j)
1169 do i=max(1,j-mah2),j-1; v(i)=v(i)-a(i,j-i)*vj; enddo
1170enddo
1171end subroutine u1lbv
1172
1185subroutine u1lbx(mx,mah1,mah2,my,a,v)! [U1LBX]
1186implicit none
1187integer(spi),intent(IN ) :: mx, mah1, mah2, my
1188real(sp), intent(IN ) :: a(mx,-mah1:mah2)
1189real(sp), intent(INOUT) :: v(mx,my)
1190!-----------------------------------------------------------------------------
1191integer(spi):: ix, jx
1192!=============================================================================
1193do jx=1,mx
1194 do ix=jx+1,min(mx,jx+mah1); v(ix,:)=v(ix,:)-a(ix,jx-ix)*v(jx,:); enddo
1195enddo
1196do jx=mx,2,-1
1197 do ix=max(1,jx-mah2),jx-1; v(ix,:)=v(ix,:)-a(ix,jx-ix)*v(jx,:); enddo
1198enddo
1199end subroutine u1lbx
1200
1213subroutine u1lby(my,mah1,mah2,mx,a,v)! [U1LBY]
1214implicit none
1215integer(spi),intent(IN ) :: my, mah1, mah2, mx
1216real(sp), intent(IN ) :: a(my,-mah1:mah2)
1217real(sp), intent(INOUT) :: v(mx,my)
1218!-----------------------------------------------------------------------------
1219integer(spi):: iy, jy
1220!=============================================================================
1221do jy=1,my
1222 do iy=jy+1,min(my,jy+mah1); v(:,iy)=v(:,iy)-a(iy,jy-iy)*v(:,jy); enddo
1223enddo
1224do jy=my,2,-1
1225 do iy=max(1,jy-mah2),jy-1; v(:,iy)=v(:,iy)-a(iy,jy-iy)*v(:,jy); enddo
1226enddo
1227end subroutine u1lby
1228
1239subroutine u1lvb(m,mah1,mah2,v,a)! [U1LVB]
1240implicit none
1241integer(spi),intent(IN ) :: m, mah1, mah2
1242real(sp), intent(IN ) :: a(m,-mah1:mah2)
1243real(sp), intent(INOUT) :: v(m)
1244!-----------------------------------------------------------------------------
1245integer(spi):: i, j
1246real(sp) :: vi
1247!=============================================================================
1248do i=1,m
1249 vi=v(i)
1250 do j=i+1,min(m,i+mah2); v(j)=v(j)-vi*a(i,j-i); enddo
1251enddo
1252do i=m,2,-1
1253 vi=v(i)
1254 do j=max(1,i-mah1),i-1; v(j)=v(j)-vi*a(i,j-i); enddo
1255enddo
1256end subroutine u1lvb
1257
1270subroutine u1lxb(mx,mah1,mah2,my,v,a)! [U1LXB]
1271implicit none
1272integer(spi),intent(IN ) :: mx, mah1, mah2, my
1273real(sp), intent(IN ) :: a(mx,-mah1:mah2)
1274real(sp), intent(INOUT) :: v(mx,my)
1275!-----------------------------------------------------------------------------
1276integer(spi):: ix, jx
1277!=============================================================================
1278do ix=1,mx
1279 do jx=ix+1,min(mx,ix+mah2); v(jx,:)=v(jx,:)-v(ix,:)*a(ix,jx-ix); enddo
1280enddo
1281do ix=mx,2,-1
1282 do jx=max(1,ix-mah1),ix-1; v(jx,:)=v(jx,:)-v(ix,:)*a(ix,jx-ix); enddo
1283enddo
1284end subroutine u1lxb
1285
1298subroutine u1lyb(my,mah1,mah2,mx,v,a)! [U1LYB]
1299implicit none
1300integer(spi),intent(IN ) :: my, mah1, mah2, mx
1301real(sp), intent(IN ) :: a(my,-mah1:mah2)
1302real(sp), intent(INOUT) :: v(mx,my)
1303!-----------------------------------------------------------------------------
1304integer(spi):: iy, jy
1305!=============================================================================
1306do iy=1,my
1307 do jy=iy+1,min(my,iy+mah2); v(:,jy)=v(:,jy)-v(:,iy)*a(iy,jy-iy); enddo
1308enddo
1309do iy=my,2,-1
1310 do jy=max(1,iy-mah1),iy-1; v(:,jy)=v(:,jy)-v(:,iy)*a(iy,jy-iy); enddo
1311enddo
1312end subroutine u1lyb
1313
1322subroutine linbv(m,mah1,mah2,a,v)! [LINBV]
1323implicit none
1324integer(spi),intent(IN ) :: m, mah1, mah2
1325real(sp), intent(INOUT) :: a(m,-mah1:mah2), v(m)
1326!=============================================================================
1327call ldub(m,mah1,mah2,a)
1328call udlbv(m,mah1,mah2,a,v)
1329end subroutine linbv
1330
1340subroutine wrtb(m1,m2,mah1,mah2,a)! [WRTB]
1341implicit none
1342integer(spi),intent(IN) :: m1, m2, mah1, mah2
1343real(sp), intent(IN) :: a(m1,-mah1:mah2)
1344!-----------------------------------------------------------------------------
1345integer(spi):: i1, i2, i, j1, j2, j, nj1
1346!=============================================================================
1347do i1=1,m1,20
1348 i2=min(i1+19,m1)
1349 print '(7x,6(i2,10x))',(j,j=-mah1,mah2)
1350 do i=i1,i2
1351 j1=max(-mah1,1-i)
1352 j2=min(mah2,m2-i)
1353 nj1=j1+mah1
1354 if(nj1==0)print '(1x,i3,6(1x,e12.5))', i,(a(i,j),j=j1,j2)
1355 if(nj1==1)print '(1x,i3,12x,5(1x,e12.5))',i,(a(i,j),j=j1,j2)
1356 if(nj1==2)print '(1x,i3,24x,4(1x,e12.5))',i,(a(i,j),j=j1,j2)
1357 if(nj1==3)print '(1x,i3,36x,3(1x,e12.5))',i,(a(i,j),j=j1,j2)
1358 if(nj1==4)print '(1x,i3,48x,2(1x,e12.5))',i,(a(i,j),j=j1,j2)
1359 if(nj1==5)print '(1x,i3,60x,1(1x,e12.5))',i,(a(i,j),j=j1,j2)
1360 enddo
1361 read(*,*)
1362enddo
1363end subroutine wrtb
1364
1365end module pmat2
Some of the commonly used constants (pi etc) mainly for double-precision subroutines.
Definition pietc.f90:14
real(dp), parameter u1
one
Definition pietc.f90:20
complex(dpc), parameter c0
complex zero
Definition pietc.f90:112
real(dp), parameter u0
zero
Definition pietc.f90:19
Standard integer, real, and complex single and double precision kinds.
Definition pkind.f90:7
integer, parameter dp
Double precision real kind.
Definition pkind.f90:11
integer, parameter dpc
Double precision real kind.
Definition pkind.f90:13
integer, parameter sp
Single precision real kind.
Definition pkind.f90:10
integer, parameter spi
Single precision integer kind.
Definition pkind.f90:8
Routines dealing with the operations of banded matrices.
Definition pmat2.f90:21
real(dp), parameter zero
Double precision real zero.
Definition pmat2.f90:54
subroutine tavco(xa, xb, a, b)
Simplified computation of compact midpoint interpolation coefficients.
Definition pmat2.f90:165
subroutine tdfco2(xa, xb, a, b)
Simplified computation of compact 2nd-derivative coefficients.
Definition pmat2.f90:350
subroutine dudlbv(m, mah1, mah2, a, v)
Back-substitution step of linear inversion involving banded LDU factored matrix and input vector,...
Definition pmat2.f90:921
subroutine tdfco(xa, xb, a, b)
Simplified computation of compact differencing coefficients to get derivatives d from cumulatives c,...
Definition pmat2.f90:258
pure subroutine clib(m1, m2, mah1, mah2, a)
Clip (set to zero) the unused values in a banded matrix representation.
Definition pmat2.f90:370
subroutine dldltb(m, mah1, a)
[L]*[D]*[L^T] factoring of symmetric matrix A (root-free Cholesky).
Definition pmat2.f90:645
subroutine dl1ubb(m, mah1, mah2, mbh1, mbh2, a, b)
Double precision version of L1UBB.
Definition pmat2.f90:771
subroutine dldub(m, mah1, mah2, a)
[L]*[D]*[U] factoring of double precision band-matrix.
Definition pmat2.f90:571
pure subroutine clib_d(m1, m2, mah1, mah2, a)
Clip (set to zero) the unused values in a banded matrix representation.
Definition pmat2.f90:388
subroutine dltdlbv(m, mah1, a, v)
Like udlbv, except assuming a is the ltdl decomposition of a SYMMETRIC banded matrix,...
Definition pmat2.f90:980
subroutine ddfco(na, nb, za, zb, z0, a, b)
Double precision version of dfco for compact differentiation coefficients.
Definition pmat2.f90:225
subroutine davco(na, nb, za, zb, z0, a, b)
Double precision version of subroutine avco for midpoint interpolation.
Definition pmat2.f90:134
subroutine dl1ueb(m, mah1, mah2, mbh1, mbh2, a, b)
Double precision version of L1UEB.
Definition pmat2.f90:855
pure subroutine clib_c(m1, m2, mah1, mah2, a)
Clip (set to zero) the unused values in a banded matrix representation.
Definition pmat2.f90:406
subroutine ddfco2(na, nb, za, zb, z0, a, b)
Double precision version of DFCO2 to get 2nd-derivative coefficients.
Definition pmat2.f90:318
subroutine dudlb(m, mah1, mah2, a)
[U]*[D]*[L] factoring of double precision band matrix A [U] is upper triangular with unit main diagon...
Definition pmat2.f90:704