File: C:\NOAA\NEMS_11731\src\atmos\gfs\dyn\noblas.f
1 SUBROUTINE DGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB,
2 $ BETA, C, LDC )
3
4 CHARACTER*1 TRANSA, TRANSB
5 INTEGER M, N, K, LDA, LDB, LDC
6 REAL ALPHA, BETA
7
8 REAL A( LDA, * ), B( LDB, * ), C( LDC, * )
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 LOGICAL LSAME
133 EXTERNAL LSAME
134
135 EXTERNAL XERBLA
136
137 INTRINSIC MAX
138
139 LOGICAL NOTA, NOTB
140 INTEGER I, INFO, J, L, NCOLA, NROWA, NROWB
141 REAL TEMP
142
143 REAL ONE , ZERO
144 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
145
146
147
148
149
150
151
152 = LSAME( TRANSA, 'N' )
153 NOTB = LSAME( TRANSB, 'N' )
154 IF( NOTA )THEN
155 NROWA = M
156 NCOLA = K
157 ELSE
158 NROWA = K
159 NCOLA = M
160 END IF
161 IF( NOTB )THEN
162 NROWB = K
163 ELSE
164 NROWB = N
165 END IF
166
167
168
169 = 0
170 IF( ( .NOT.NOTA ).AND.
171 $ ( .NOT.LSAME( TRANSA, 'C' ) ).AND.
172 $ ( .NOT.LSAME( TRANSA, 'T' ) ) )THEN
173 INFO = 1
174 ELSE IF( ( .NOT.NOTB ).AND.
175 $ ( .NOT.LSAME( TRANSB, 'C' ) ).AND.
176 $ ( .NOT.LSAME( TRANSB, 'T' ) ) )THEN
177 INFO = 2
178 ELSE IF( M .LT.0 )THEN
179 INFO = 3
180 ELSE IF( N .LT.0 )THEN
181 INFO = 4
182 ELSE IF( K .LT.0 )THEN
183 INFO = 5
184 ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
185 INFO = 8
186 ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN
187 INFO = 10
188 ELSE IF( LDC.LT.MAX( 1, M ) )THEN
189 INFO = 13
190 END IF
191 IF( INFO.NE.0 )THEN
192 CALL XERBLA( 'DGEMM ', INFO )
193 RETURN
194 END IF
195
196
197
198 IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
199 $ ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
200 $ RETURN
201
202
203
204 IF( ALPHA.EQ.ZERO )THEN
205 IF( BETA.EQ.ZERO )THEN
206 DO 20, J = 1, N
207 DO 10, I = 1, M
208 C( I, J ) = ZERO
209 10 CONTINUE
210 20 CONTINUE
211 ELSE
212 DO 40, J = 1, N
213 DO 30, I = 1, M
214 C( I, J ) = BETA*C( I, J )
215 30 CONTINUE
216 40 CONTINUE
217 END IF
218 RETURN
219 END IF
220
221
222
223 IF( NOTB )THEN
224 IF( NOTA )THEN
225
226
227
228 DO 90, J = 1, N
229 IF( BETA.EQ.ZERO )THEN
230 DO 50, I = 1, M
231 C( I, J ) = ZERO
232 50 CONTINUE
233 ELSE IF( BETA.NE.ONE )THEN
234 DO 60, I = 1, M
235 C( I, J ) = BETA*C( I, J )
236 60 CONTINUE
237 END IF
238 DO 80, L = 1, K
239 IF( B( L, J ).NE.ZERO )THEN
240 TEMP = ALPHA*B( L, J )
241 DO 70, I = 1, M
242 C( I, J ) = C( I, J ) + TEMP*A( I, L )
243 70 CONTINUE
244 END IF
245 80 CONTINUE
246 90 CONTINUE
247 ELSE
248
249
250
251 DO 120, J = 1, N
252 DO 110, I = 1, M
253 TEMP = ZERO
254 DO 100, L = 1, K
255 TEMP = TEMP + A( L, I )*B( L, J )
256 100 CONTINUE
257 IF( BETA.EQ.ZERO )THEN
258 C( I, J ) = ALPHA*TEMP
259 ELSE
260 C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
261 END IF
262 110 CONTINUE
263 120 CONTINUE
264 END IF
265 ELSE
266 IF( NOTA )THEN
267
268
269
270 DO 170, J = 1, N
271 IF( BETA.EQ.ZERO )THEN
272 DO 130, I = 1, M
273 C( I, J ) = ZERO
274 130 CONTINUE
275 ELSE IF( BETA.NE.ONE )THEN
276 DO 140, I = 1, M
277 C( I, J ) = BETA*C( I, J )
278 140 CONTINUE
279 END IF
280 DO 160, L = 1, K
281 IF( B( J, L ).NE.ZERO )THEN
282 TEMP = ALPHA*B( J, L )
283 DO 150, I = 1, M
284 C( I, J ) = C( I, J ) + TEMP*A( I, L )
285 150 CONTINUE
286 END IF
287 160 CONTINUE
288 170 CONTINUE
289 ELSE
290
291
292
293 DO 200, J = 1, N
294 DO 190, I = 1, M
295 TEMP = ZERO
296 DO 180, L = 1, K
297 TEMP = TEMP + A( L, I )*B( J, L )
298 180 CONTINUE
299 IF( BETA.EQ.ZERO )THEN
300 C( I, J ) = ALPHA*TEMP
301 ELSE
302 C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
303 END IF
304 190 CONTINUE
305 200 CONTINUE
306 END IF
307 END IF
308
309 RETURN
310
311
312
313 END
314 SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO )
315
316
317
318
319
320
321
322 INTEGER INFO, LDA, LWORK, N
323
324
325 INTEGER IPIV( * )
326 REAL A( LDA, * ), WORK( LWORK )
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373 REAL ZERO, ONE
374 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
375
376
377 INTEGER I, IWS, J, JB, JJ, JP, LDWORK, NB, NBMIN, NN
378
379
380 INTEGER ILAENV
381 EXTERNAL ILAENV
382
383
384 EXTERNAL DGEMM, DGEMV, DSWAP, DTRSM, DTRTRI, XERBLA
385
386
387 INTRINSIC MAX, MIN
388
389
390
391
392
393 = 0
394 WORK( 1 ) = MAX( N, 1 )
395 IF( N.LT.0 ) THEN
396 INFO = -1
397 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
398 INFO = -3
399 ELSE IF( LWORK.LT.MAX( 1, N ) ) THEN
400 INFO = -6
401 END IF
402 IF( INFO.NE.0 ) THEN
403 CALL XERBLA( 'DGETRI', -INFO )
404 RETURN
405 END IF
406
407
408
409 IF( N.EQ.0 )
410 $ RETURN
411
412
413
414
415 CALL DTRTRI( 'Upper', 'Non-unit', N, A, LDA, INFO )
416 IF( INFO.GT.0 )
417 $ RETURN
418
419
420
421 = ILAENV( 1, 'DGETRI', ' ', N, -1, -1, -1 )
422 NBMIN = 2
423 LDWORK = N
424 IF( NB.GT.1 .AND. NB.LT.N ) THEN
425 IWS = MAX( LDWORK*NB, 1 )
426 IF( LWORK.LT.IWS ) THEN
427 NB = LWORK / LDWORK
428 NBMIN = MAX( 2, ILAENV( 2, 'DGETRI', ' ', N, -1, -1, -1 ) )
429 END IF
430 ELSE
431 IWS = N
432 END IF
433
434
435
436 IF( NB.LT.NBMIN .OR. NB.GE.N ) THEN
437
438
439
440 DO 20 J = N, 1, -1
441
442
443
444 DO 10 I = J + 1, N
445 WORK( I ) = A( I, J )
446 A( I, J ) = ZERO
447 10 CONTINUE
448
449
450
451 IF( J.LT.N )
452 $ CALL DGEMV( 'No transpose', N, N-J, -ONE, A( 1, J+1 ),
453 $ LDA, WORK( J+1 ), 1, ONE, A( 1, J ), 1 )
454 20 CONTINUE
455 ELSE
456
457
458
459 = ( ( N-1 ) / NB )*NB + 1
460 DO 50 J = NN, 1, -NB
461 JB = MIN( NB, N-J+1 )
462
463
464
465
466 DO 40 JJ = J, J + JB - 1
467 DO 30 I = JJ + 1, N
468 WORK( I+( JJ-J )*LDWORK ) = A( I, JJ )
469 A( I, JJ ) = ZERO
470 30 CONTINUE
471 40 CONTINUE
472
473
474
475 IF( J+JB.LE.N )
476 $ CALL DGEMM( 'No transpose', 'No transpose', N, JB,
477 $ N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
478 $ WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
479 CALL DTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB,
480 $ ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
481 50 CONTINUE
482 END IF
483
484
485
486 DO 60 J = N - 1, 1, -1
487 JP = IPIV( J )
488 IF( JP.NE.J )
489 $ CALL DSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 )
490 60 CONTINUE
491
492 ( 1 ) = IWS
493 RETURN
494
495
496
497 END
498 SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO )
499
500
501
502
503
504
505
506 INTEGER INFO, LDA, M, N
507
508
509 INTEGER IPIV( * )
510 REAL A( LDA, * )
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559 REAL ONE
560 PARAMETER ( ONE = 1.0E+0 )
561
562
563 INTEGER I, IINFO, J, JB, NB
564
565
566 EXTERNAL DGEMM, DGETF2, DLASWP, DTRSM, XERBLA
567
568
569 INTEGER ILAENV
570 EXTERNAL ILAENV
571
572
573 INTRINSIC MAX, MIN
574
575
576
577
578
579 = 0
580 IF( M.LT.0 ) THEN
581 INFO = -1
582 ELSE IF( N.LT.0 ) THEN
583 INFO = -2
584 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
585 INFO = -4
586 END IF
587 IF( INFO.NE.0 ) THEN
588 CALL XERBLA( 'DGETRF', -INFO )
589 RETURN
590 END IF
591
592
593
594 IF( M.EQ.0 .OR. N.EQ.0 )
595 $ RETURN
596
597
598
599 = ILAENV( 1, 'DGETRF', ' ', M, N, -1, -1 )
600 IF( NB.LE.1 .OR. NB.GE.MIN( M, N ) ) THEN
601
602
603
604 CALL DGETF2( M, N, A, LDA, IPIV, INFO )
605 ELSE
606
607
608
609 DO 20 J = 1, MIN( M, N ), NB
610 JB = MIN( MIN( M, N )-J+1, NB )
611
612
613
614
615 CALL DGETF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO )
616
617
618
619 IF( INFO.EQ.0 .AND. IINFO.GT.0 )
620 $ INFO = IINFO + J - 1
621 DO 10 I = J, MIN( M, J+JB-1 )
622 IPIV( I ) = J - 1 + IPIV( I )
623 10 CONTINUE
624
625
626
627 CALL DLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 )
628
629 IF( J+JB.LE.N ) THEN
630
631
632
633 CALL DLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
634 $ IPIV, 1 )
635
636
637
638 CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
639 $ N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
640 $ LDA )
641 IF( J+JB.LE.M ) THEN
642
643
644
645 CALL DGEMM( 'No transpose', 'No transpose', M-J-JB+1,
646 $ N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
647 $ A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
648 $ LDA )
649 END IF
650 END IF
651 20 CONTINUE
652 END IF
653 RETURN
654
655
656
657 END
658 SUBROUTINE XERBLA( SRNAME, INFO )
659
660
661
662
663
664
665
666 CHARACTER*6 SRNAME
667 INTEGER INFO
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691 WRITE( *, FMT = 9999 )SRNAME, INFO
692
693 STOP
694
695 FORMAT( ' ** On entry to ', A6, ' parameter number ', I2, ' had ',
696 $ 'an illegal value' )
697
698
699
700 END
701 SUBROUTINE DTRTRI( UPLO, DIAG, N, A, LDA, INFO )
702
703
704
705
706
707
708
709 CHARACTER DIAG, UPLO
710 INTEGER INFO, LDA, N
711
712
713 REAL A( LDA, * )
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763 REAL ONE, ZERO
764 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
765
766
767 LOGICAL NOUNIT, UPPER
768 INTEGER J, JB, NB, NN
769
770
771 LOGICAL LSAME
772 INTEGER ILAENV
773 EXTERNAL LSAME, ILAENV
774
775
776 EXTERNAL DTRMM, DTRSM, DTRTI2, XERBLA
777
778
779 INTRINSIC MAX, MIN
780
781
782
783
784
785 = 0
786 UPPER = LSAME( UPLO, 'U' )
787 NOUNIT = LSAME( DIAG, 'N' )
788 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
789 INFO = -1
790 ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
791 INFO = -2
792 ELSE IF( N.LT.0 ) THEN
793 INFO = -3
794 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
795 INFO = -5
796 END IF
797 IF( INFO.NE.0 ) THEN
798 CALL XERBLA( 'DTRTRI', -INFO )
799 RETURN
800 END IF
801
802
803
804 IF( N.EQ.0 )
805 $ RETURN
806
807
808
809 IF( NOUNIT ) THEN
810 DO 10 INFO = 1, N
811 IF( A( INFO, INFO ).EQ.ZERO )
812 $ RETURN
813 10 CONTINUE
814 INFO = 0
815 END IF
816
817
818
819 = ILAENV( 1, 'DTRTRI', UPLO // DIAG, N, -1, -1, -1 )
820 IF( NB.LE.1 .OR. NB.GE.N ) THEN
821
822
823
824 CALL DTRTI2( UPLO, DIAG, N, A, LDA, INFO )
825 ELSE
826
827
828
829 IF( UPPER ) THEN
830
831
832
833 DO 20 J = 1, N, NB
834 JB = MIN( NB, N-J+1 )
835
836
837
838 CALL DTRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
839 $ JB, ONE, A, LDA, A( 1, J ), LDA )
840 CALL DTRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
841 $ JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
842
843
844
845 CALL DTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
846 20 CONTINUE
847 ELSE
848
849
850
851 = ( ( N-1 ) / NB )*NB + 1
852 DO 30 J = NN, 1, -NB
853 JB = MIN( NB, N-J+1 )
854 IF( J+JB.LE.N ) THEN
855
856
857
858 CALL DTRMM( 'Left', 'Lower', 'No transpose', DIAG,
859 $ N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA,
860 $ A( J+JB, J ), LDA )
861 CALL DTRSM( 'Right', 'Lower', 'No transpose', DIAG,
862 $ N-J-JB+1, JB, -ONE, A( J, J ), LDA,
863 $ A( J+JB, J ), LDA )
864 END IF
865
866
867
868 CALL DTRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO )
869 30 CONTINUE
870 END IF
871 END IF
872
873 RETURN
874
875
876
877 END
878 SUBROUTINE DGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX,
879 $ BETA, Y, INCY )
880
881 REAL ALPHA, BETA
882 INTEGER INCX, INCY, LDA, M, N
883 CHARACTER*1 TRANS
884
885 REAL A( LDA, * ), X( * ), Y( * )
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980 REAL ONE , ZERO
981 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
982
983 REAL TEMP
984 INTEGER I, INFO, IX, IY, J, JX, JY, KX, KY, LENX, LENY
985
986 LOGICAL LSAME
987 EXTERNAL LSAME
988
989 EXTERNAL XERBLA
990
991 INTRINSIC MAX
992
993
994
995
996
997 = 0
998 IF ( .NOT.LSAME( TRANS, 'N' ).AND.
999 $ .NOT.LSAME( TRANS, 'T' ).AND.
1000 $ .NOT.LSAME( TRANS, 'C' ) )THEN
1001 INFO = 1
1002 ELSE IF( M.LT.0 )THEN
1003 INFO = 2
1004 ELSE IF( N.LT.0 )THEN
1005 INFO = 3
1006 ELSE IF( LDA.LT.MAX( 1, M ) )THEN
1007 INFO = 6
1008 ELSE IF( INCX.EQ.0 )THEN
1009 INFO = 8
1010 ELSE IF( INCY.EQ.0 )THEN
1011 INFO = 11
1012 END IF
1013 IF( INFO.NE.0 )THEN
1014 CALL XERBLA( 'DGEMV ', INFO )
1015 RETURN
1016 END IF
1017
1018
1019
1020 IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
1021 $ ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
1022 $ RETURN
1023
1024
1025
1026
1027 IF( LSAME( TRANS, 'N' ) )THEN
1028 LENX = N
1029 LENY = M
1030 ELSE
1031 LENX = M
1032 LENY = N
1033 END IF
1034 IF( INCX.GT.0 )THEN
1035 KX = 1
1036 ELSE
1037 KX = 1 - ( LENX - 1 )*INCX
1038 END IF
1039 IF( INCY.GT.0 )THEN
1040 KY = 1
1041 ELSE
1042 KY = 1 - ( LENY - 1 )*INCY
1043 END IF
1044
1045
1046
1047
1048
1049
1050 IF( BETA.NE.ONE )THEN
1051 IF( INCY.EQ.1 )THEN
1052 IF( BETA.EQ.ZERO )THEN
1053 DO 10, I = 1, LENY
1054 Y( I ) = ZERO
1055 10 CONTINUE
1056 ELSE
1057 DO 20, I = 1, LENY
1058 Y( I ) = BETA*Y( I )
1059 20 CONTINUE
1060 END IF
1061 ELSE
1062 IY = KY
1063 IF( BETA.EQ.ZERO )THEN
1064 DO 30, I = 1, LENY
1065 Y( IY ) = ZERO
1066 IY = IY + INCY
1067 30 CONTINUE
1068 ELSE
1069 DO 40, I = 1, LENY
1070 Y( IY ) = BETA*Y( IY )
1071 IY = IY + INCY
1072 40 CONTINUE
1073 END IF
1074 END IF
1075 END IF
1076 IF( ALPHA.EQ.ZERO )
1077 $ RETURN
1078 IF( LSAME( TRANS, 'N' ) )THEN
1079
1080
1081
1082 = KX
1083 IF( INCY.EQ.1 )THEN
1084 DO 60, J = 1, N
1085 IF( X( JX ).NE.ZERO )THEN
1086 TEMP = ALPHA*X( JX )
1087 DO 50, I = 1, M
1088 Y( I ) = Y( I ) + TEMP*A( I, J )
1089 50 CONTINUE
1090 END IF
1091 JX = JX + INCX
1092 60 CONTINUE
1093 ELSE
1094 DO 80, J = 1, N
1095 IF( X( JX ).NE.ZERO )THEN
1096 TEMP = ALPHA*X( JX )
1097 IY = KY
1098 DO 70, I = 1, M
1099 Y( IY ) = Y( IY ) + TEMP*A( I, J )
1100 IY = IY + INCY
1101 70 CONTINUE
1102 END IF
1103 JX = JX + INCX
1104 80 CONTINUE
1105 END IF
1106 ELSE
1107
1108
1109
1110 = KY
1111 IF( INCX.EQ.1 )THEN
1112 DO 100, J = 1, N
1113 TEMP = ZERO
1114 DO 90, I = 1, M
1115 TEMP = TEMP + A( I, J )*X( I )
1116 90 CONTINUE
1117 Y( JY ) = Y( JY ) + ALPHA*TEMP
1118 JY = JY + INCY
1119 100 CONTINUE
1120 ELSE
1121 DO 120, J = 1, N
1122 TEMP = ZERO
1123 IX = KX
1124 DO 110, I = 1, M
1125 TEMP = TEMP + A( I, J )*X( IX )
1126 IX = IX + INCX
1127 110 CONTINUE
1128 Y( JY ) = Y( JY ) + ALPHA*TEMP
1129 JY = JY + INCY
1130 120 CONTINUE
1131 END IF
1132 END IF
1133
1134 RETURN
1135
1136
1137
1138 END
1139 SUBROUTINE DTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
1140 $ B, LDB )
1141
1142 CHARACTER*1 SIDE, UPLO, TRANSA, DIAG
1143 INTEGER M, N, LDA, LDB
1144 REAL ALPHA
1145
1146 REAL A( LDA, * ), B( LDB, * )
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269 LOGICAL LSAME
1270 EXTERNAL LSAME
1271
1272 EXTERNAL XERBLA
1273
1274 INTRINSIC MAX
1275
1276 LOGICAL LSIDE, NOUNIT, UPPER
1277 INTEGER I, INFO, J, K, NROWA
1278 REAL TEMP
1279
1280 REAL ONE , ZERO
1281 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
1282
1283
1284
1285
1286
1287 = LSAME( SIDE , 'L' )
1288 IF( LSIDE )THEN
1289 NROWA = M
1290 ELSE
1291 NROWA = N
1292 END IF
1293 NOUNIT = LSAME( DIAG , 'N' )
1294 UPPER = LSAME( UPLO , 'U' )
1295
1296 = 0
1297 IF( ( .NOT.LSIDE ).AND.
1298 $ ( .NOT.LSAME( SIDE , 'R' ) ) )THEN
1299 INFO = 1
1300 ELSE IF( ( .NOT.UPPER ).AND.
1301 $ ( .NOT.LSAME( UPLO , 'L' ) ) )THEN
1302 INFO = 2
1303 ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
1304 $ ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
1305 $ ( .NOT.LSAME( TRANSA, 'C' ) ) )THEN
1306 INFO = 3
1307 ELSE IF( ( .NOT.LSAME( DIAG , 'U' ) ).AND.
1308 $ ( .NOT.LSAME( DIAG , 'N' ) ) )THEN
1309 INFO = 4
1310 ELSE IF( M .LT.0 )THEN
1311 INFO = 5
1312 ELSE IF( N .LT.0 )THEN
1313 INFO = 6
1314 ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
1315 INFO = 9
1316 ELSE IF( LDB.LT.MAX( 1, M ) )THEN
1317 INFO = 11
1318 END IF
1319 IF( INFO.NE.0 )THEN
1320 CALL XERBLA( 'DTRSM ', INFO )
1321 RETURN
1322 END IF
1323
1324
1325
1326 IF( N.EQ.0 )
1327 $ RETURN
1328
1329
1330
1331 IF( ALPHA.EQ.ZERO )THEN
1332 DO 20, J = 1, N
1333 DO 10, I = 1, M
1334 B( I, J ) = ZERO
1335 10 CONTINUE
1336 20 CONTINUE
1337 RETURN
1338 END IF
1339
1340
1341
1342 IF( LSIDE )THEN
1343 IF( LSAME( TRANSA, 'N' ) )THEN
1344
1345
1346
1347 IF( UPPER )THEN
1348 DO 60, J = 1, N
1349 IF( ALPHA.NE.ONE )THEN
1350 DO 30, I = 1, M
1351 B( I, J ) = ALPHA*B( I, J )
1352 30 CONTINUE
1353 END IF
1354 DO 50, K = M, 1, -1
1355 IF( B( K, J ).NE.ZERO )THEN
1356 IF( NOUNIT )
1357 $ B( K, J ) = B( K, J )/A( K, K )
1358 DO 40, I = 1, K - 1
1359 B( I, J ) = B( I, J ) - B( K, J )*A( I, K )
1360 40 CONTINUE
1361 END IF
1362 50 CONTINUE
1363 60 CONTINUE
1364 ELSE
1365 DO 100, J = 1, N
1366 IF( ALPHA.NE.ONE )THEN
1367 DO 70, I = 1, M
1368 B( I, J ) = ALPHA*B( I, J )
1369 70 CONTINUE
1370 END IF
1371 DO 90 K = 1, M
1372 IF( B( K, J ).NE.ZERO )THEN
1373 IF( NOUNIT )
1374 $ B( K, J ) = B( K, J )/A( K, K )
1375 DO 80, I = K + 1, M
1376 B( I, J ) = B( I, J ) - B( K, J )*A( I, K )
1377 80 CONTINUE
1378 END IF
1379 90 CONTINUE
1380 100 CONTINUE
1381 END IF
1382 ELSE
1383
1384
1385
1386 IF( UPPER )THEN
1387 DO 130, J = 1, N
1388 DO 120, I = 1, M
1389 TEMP = ALPHA*B( I, J )
1390 DO 110, K = 1, I - 1
1391 TEMP = TEMP - A( K, I )*B( K, J )
1392 110 CONTINUE
1393 IF( NOUNIT )
1394 $ TEMP = TEMP/A( I, I )
1395 B( I, J ) = TEMP
1396 120 CONTINUE
1397 130 CONTINUE
1398 ELSE
1399 DO 160, J = 1, N
1400 DO 150, I = M, 1, -1
1401 TEMP = ALPHA*B( I, J )
1402 DO 140, K = I + 1, M
1403 TEMP = TEMP - A( K, I )*B( K, J )
1404 140 CONTINUE
1405 IF( NOUNIT )
1406 $ TEMP = TEMP/A( I, I )
1407 B( I, J ) = TEMP
1408 150 CONTINUE
1409 160 CONTINUE
1410 END IF
1411 END IF
1412 ELSE
1413 IF( LSAME( TRANSA, 'N' ) )THEN
1414
1415
1416
1417 IF( UPPER )THEN
1418 DO 210, J = 1, N
1419 IF( ALPHA.NE.ONE )THEN
1420 DO 170, I = 1, M
1421 B( I, J ) = ALPHA*B( I, J )
1422 170 CONTINUE
1423 END IF
1424 DO 190, K = 1, J - 1
1425 IF( A( K, J ).NE.ZERO )THEN
1426 DO 180, I = 1, M
1427 B( I, J ) = B( I, J ) - A( K, J )*B( I, K )
1428 180 CONTINUE
1429 END IF
1430 190 CONTINUE
1431 IF( NOUNIT )THEN
1432 TEMP = ONE/A( J, J )
1433 DO 200, I = 1, M
1434 B( I, J ) = TEMP*B( I, J )
1435 200 CONTINUE
1436 END IF
1437 210 CONTINUE
1438 ELSE
1439 DO 260, J = N, 1, -1
1440 IF( ALPHA.NE.ONE )THEN
1441 DO 220, I = 1, M
1442 B( I, J ) = ALPHA*B( I, J )
1443 220 CONTINUE
1444 END IF
1445 DO 240, K = J + 1, N
1446 IF( A( K, J ).NE.ZERO )THEN
1447 DO 230, I = 1, M
1448 B( I, J ) = B( I, J ) - A( K, J )*B( I, K )
1449 230 CONTINUE
1450 END IF
1451 240 CONTINUE
1452 IF( NOUNIT )THEN
1453 TEMP = ONE/A( J, J )
1454 DO 250, I = 1, M
1455 B( I, J ) = TEMP*B( I, J )
1456 250 CONTINUE
1457 END IF
1458 260 CONTINUE
1459 END IF
1460 ELSE
1461
1462
1463
1464 IF( UPPER )THEN
1465 DO 310, K = N, 1, -1
1466 IF( NOUNIT )THEN
1467 TEMP = ONE/A( K, K )
1468 DO 270, I = 1, M
1469 B( I, K ) = TEMP*B( I, K )
1470 270 CONTINUE
1471 END IF
1472 DO 290, J = 1, K - 1
1473 IF( A( J, K ).NE.ZERO )THEN
1474 TEMP = A( J, K )
1475 DO 280, I = 1, M
1476 B( I, J ) = B( I, J ) - TEMP*B( I, K )
1477 280 CONTINUE
1478 END IF
1479 290 CONTINUE
1480 IF( ALPHA.NE.ONE )THEN
1481 DO 300, I = 1, M
1482 B( I, K ) = ALPHA*B( I, K )
1483 300 CONTINUE
1484 END IF
1485 310 CONTINUE
1486 ELSE
1487 DO 360, K = 1, N
1488 IF( NOUNIT )THEN
1489 TEMP = ONE/A( K, K )
1490 DO 320, I = 1, M
1491 B( I, K ) = TEMP*B( I, K )
1492 320 CONTINUE
1493 END IF
1494 DO 340, J = K + 1, N
1495 IF( A( J, K ).NE.ZERO )THEN
1496 TEMP = A( J, K )
1497 DO 330, I = 1, M
1498 B( I, J ) = B( I, J ) - TEMP*B( I, K )
1499 330 CONTINUE
1500 END IF
1501 340 CONTINUE
1502 IF( ALPHA.NE.ONE )THEN
1503 DO 350, I = 1, M
1504 B( I, K ) = ALPHA*B( I, K )
1505 350 CONTINUE
1506 END IF
1507 360 CONTINUE
1508 END IF
1509 END IF
1510 END IF
1511
1512 RETURN
1513
1514
1515
1516 END
1517
1518 SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO )
1519
1520
1521
1522
1523
1524
1525
1526 INTEGER INFO, LDA, M, N
1527
1528
1529 INTEGER IPIV( * )
1530 REAL A( LDA, * )
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579 REAL ONE, ZERO
1580 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
1581
1582
1583 INTEGER J, JP
1584
1585
1586 INTEGER ISAMAX
1587 EXTERNAL ISAMAX
1588
1589
1590 EXTERNAL DGER, DSCAL, DSWAP, XERBLA
1591
1592
1593 INTRINSIC MAX, MIN
1594
1595
1596
1597
1598
1599 = 0
1600 IF( M.LT.0 ) THEN
1601 INFO = -1
1602 ELSE IF( N.LT.0 ) THEN
1603 INFO = -2
1604 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
1605 INFO = -4
1606 END IF
1607 IF( INFO.NE.0 ) THEN
1608 CALL XERBLA( 'DGETF2', -INFO )
1609 RETURN
1610 END IF
1611
1612
1613
1614 IF( M.EQ.0 .OR. N.EQ.0 )
1615 $ RETURN
1616
1617 DO 10 J = 1, MIN( M, N )
1618
1619
1620
1621 = J - 1 + ISAMAX( M-J+1, A( J, J ), 1 )
1622 IPIV( J ) = JP
1623 IF( A( JP, J ).NE.ZERO ) THEN
1624
1625
1626
1627 IF( JP.NE.J )
1628 $ CALL DSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA )
1629
1630
1631
1632 IF( J.LT.M )
1633 $ CALL DSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 )
1634
1635 ELSE IF( INFO.EQ.0 ) THEN
1636
1637 = J
1638 END IF
1639
1640 IF( J.LT.MIN( M, N ) ) THEN
1641
1642
1643
1644 CALL DGER( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ), LDA,
1645 $ A( J+1, J+1 ), LDA )
1646 END IF
1647 10 CONTINUE
1648 RETURN
1649
1650
1651
1652 END
1653 SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX )
1654
1655
1656
1657
1658
1659
1660
1661 INTEGER INCX, K1, K2, LDA, N
1662
1663
1664 INTEGER IPIV( * )
1665 REAL A( LDA, * )
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708 INTEGER I, IP, IX
1709
1710
1711 EXTERNAL DSWAP
1712
1713
1714
1715
1716
1717 IF( INCX.EQ.0 )
1718 $ RETURN
1719 IF( INCX.GT.0 ) THEN
1720 IX = K1
1721 ELSE
1722 IX = 1 + ( 1-K2 )*INCX
1723 END IF
1724 IF( INCX.EQ.1 ) THEN
1725 DO 10 I = K1, K2
1726 IP = IPIV( I )
1727 IF( IP.NE.I )
1728 $ CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )
1729 10 CONTINUE
1730 ELSE IF( INCX.GT.1 ) THEN
1731 DO 20 I = K1, K2
1732 IP = IPIV( IX )
1733 IF( IP.NE.I )
1734 $ CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )
1735 IX = IX + INCX
1736 20 CONTINUE
1737 ELSE IF( INCX.LT.0 ) THEN
1738 DO 30 I = K2, K1, -1
1739 IP = IPIV( IX )
1740 IF( IP.NE.I )
1741 $ CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )
1742 IX = IX + INCX
1743 30 CONTINUE
1744 END IF
1745
1746 RETURN
1747
1748
1749
1750 END
1751 subroutine dswap (n,sx,incx,sy,incy)
1752
1753
1754
1755
1756
1757
1758 real sx(*),sy(*),stemp
1759 integer i,incx,incy,ix,iy,m,mp1,n
1760
1761 if(n.le.0)return
1762 if(incx.eq.1.and.incy.eq.1)go to 20
1763
1764
1765
1766
1767 = 1
1768 iy = 1
1769 if(incx.lt.0)ix = (-n+1)*incx + 1
1770 if(incy.lt.0)iy = (-n+1)*incy + 1
1771 do 10 i = 1,n
1772 stemp = sx(ix)
1773 sx(ix) = sy(iy)
1774 sy(iy) = stemp
1775 ix = ix + incx
1776 iy = iy + incy
1777 10 continue
1778 return
1779
1780
1781
1782
1783
1784
1785 = mod(n,3)
1786 if( m .eq. 0 ) go to 40
1787 do 30 i = 1,m
1788 stemp = sx(i)
1789 sx(i) = sy(i)
1790 sy(i) = stemp
1791 30 continue
1792 if( n .lt. 3 ) return
1793 40 mp1 = m + 1
1794 do 50 i = mp1,n,3
1795 stemp = sx(i)
1796 sx(i) = sy(i)
1797 sy(i) = stemp
1798 stemp = sx(i + 1)
1799 sx(i + 1) = sy(i + 1)
1800 sy(i + 1) = stemp
1801 stemp = sx(i + 2)
1802 sx(i + 2) = sy(i + 2)
1803 sy(i + 2) = stemp
1804 50 continue
1805 return
1806 end
1807 subroutine dscal(n,sa,sx,incx)
1808
1809
1810
1811
1812
1813
1814
1815 real sa,sx(*)
1816 integer i,incx,m,mp1,n,nincx
1817
1818 if( n.le.0 .or. incx.le.0 )return
1819 if(incx.eq.1)go to 20
1820
1821
1822
1823 = n*incx
1824 do 10 i = 1,nincx,incx
1825 sx(i) = sa*sx(i)
1826 10 continue
1827 return
1828
1829
1830
1831
1832
1833
1834 = mod(n,5)
1835 if( m .eq. 0 ) go to 40
1836 do 30 i = 1,m
1837 sx(i) = sa*sx(i)
1838 30 continue
1839 if( n .lt. 5 ) return
1840 40 mp1 = m + 1
1841 do 50 i = mp1,n,5
1842 sx(i) = sa*sx(i)
1843 sx(i + 1) = sa*sx(i + 1)
1844 sx(i + 2) = sa*sx(i + 2)
1845 sx(i + 3) = sa*sx(i + 3)
1846 sx(i + 4) = sa*sx(i + 4)
1847 50 continue
1848 return
1849 end
1850 SUBROUTINE DGER ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA )
1851
1852 REAL ALPHA
1853 INTEGER INCX, INCY, LDA, M, N
1854
1855 REAL A( LDA, * ), X( * ), Y( * )
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929 REAL ZERO
1930 PARAMETER ( ZERO = 0.0E+0 )
1931
1932 REAL TEMP
1933 INTEGER I, INFO, IX, J, JY, KX
1934
1935 EXTERNAL XERBLA
1936
1937 INTRINSIC MAX
1938
1939
1940
1941
1942
1943 = 0
1944 IF ( M.LT.0 )THEN
1945 INFO = 1
1946 ELSE IF( N.LT.0 )THEN
1947 INFO = 2
1948 ELSE IF( INCX.EQ.0 )THEN
1949 INFO = 5
1950 ELSE IF( INCY.EQ.0 )THEN
1951 INFO = 7
1952 ELSE IF( LDA.LT.MAX( 1, M ) )THEN
1953 INFO = 9
1954 END IF
1955 IF( INFO.NE.0 )THEN
1956 CALL XERBLA( 'DGER ', INFO )
1957 RETURN
1958 END IF
1959
1960
1961
1962 IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
1963 $ RETURN
1964
1965
1966
1967
1968 IF( INCY.GT.0 )THEN
1969 JY = 1
1970 ELSE
1971 JY = 1 - ( N - 1 )*INCY
1972 END IF
1973 IF( INCX.EQ.1 )THEN
1974 DO 20, J = 1, N
1975 IF( Y( JY ).NE.ZERO )THEN
1976 TEMP = ALPHA*Y( JY )
1977 DO 10, I = 1, M
1978 A( I, J ) = A( I, J ) + X( I )*TEMP
1979 10 CONTINUE
1980 END IF
1981 JY = JY + INCY
1982 20 CONTINUE
1983 ELSE
1984 IF( INCX.GT.0 )THEN
1985 KX = 1
1986 ELSE
1987 KX = 1 - ( M - 1 )*INCX
1988 END IF
1989 DO 40, J = 1, N
1990 IF( Y( JY ).NE.ZERO )THEN
1991 TEMP = ALPHA*Y( JY )
1992 IX = KX
1993 DO 30, I = 1, M
1994 A( I, J ) = A( I, J ) + X( IX )*TEMP
1995 IX = IX + INCX
1996 30 CONTINUE
1997 END IF
1998 JY = JY + INCY
1999 40 CONTINUE
2000 END IF
2001
2002 RETURN
2003
2004
2005
2006 END
2007 SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO )
2008
2009
2010
2011
2012
2013
2014
2015 CHARACTER DIAG, UPLO
2016 INTEGER INFO, LDA, N
2017
2018
2019 REAL A( LDA, * )
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070 REAL ONE
2071 PARAMETER ( ONE = 1.0E+0 )
2072
2073
2074 LOGICAL NOUNIT, UPPER
2075 INTEGER J
2076 REAL AJJ
2077
2078
2079 LOGICAL LSAME
2080 EXTERNAL LSAME
2081
2082
2083 EXTERNAL DSCAL, DTRMV, XERBLA
2084
2085
2086 INTRINSIC MAX
2087
2088
2089
2090
2091
2092 = 0
2093 UPPER = LSAME( UPLO, 'U' )
2094 NOUNIT = LSAME( DIAG, 'N' )
2095 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
2096 INFO = -1
2097 ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
2098 INFO = -2
2099 ELSE IF( N.LT.0 ) THEN
2100 INFO = -3
2101 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
2102 INFO = -5
2103 END IF
2104 IF( INFO.NE.0 ) THEN
2105 CALL XERBLA( 'DTRTI2', -INFO )
2106 RETURN
2107 END IF
2108
2109 IF( UPPER ) THEN
2110
2111
2112
2113 DO 10 J = 1, N
2114 IF( NOUNIT ) THEN
2115 A( J, J ) = ONE / A( J, J )
2116 AJJ = -A( J, J )
2117 ELSE
2118 AJJ = -ONE
2119 END IF
2120
2121
2122
2123 CALL DTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
2124 $ A( 1, J ), 1 )
2125 CALL DSCAL( J-1, AJJ, A( 1, J ), 1 )
2126 10 CONTINUE
2127 ELSE
2128
2129
2130
2131 DO 20 J = N, 1, -1
2132 IF( NOUNIT ) THEN
2133 A( J, J ) = ONE / A( J, J )
2134 AJJ = -A( J, J )
2135 ELSE
2136 AJJ = -ONE
2137 END IF
2138 IF( J.LT.N ) THEN
2139
2140
2141
2142 CALL DTRMV( 'Lower', 'No transpose', DIAG, N-J,
2143 $ A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
2144 CALL DSCAL( N-J, AJJ, A( J+1, J ), 1 )
2145 END IF
2146 20 CONTINUE
2147 END IF
2148
2149 RETURN
2150
2151
2152
2153 END
2154 SUBROUTINE DTRMM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
2155 $ B, LDB )
2156
2157 CHARACTER*1 SIDE, UPLO, TRANSA, DIAG
2158 INTEGER M, N, LDA, LDB
2159 REAL ALPHA
2160
2161 REAL A( LDA, * ), B( LDB, * )
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281 LOGICAL LSAME
2282 EXTERNAL LSAME
2283
2284 EXTERNAL XERBLA
2285
2286 INTRINSIC MAX
2287
2288 LOGICAL LSIDE, NOUNIT, UPPER
2289 INTEGER I, INFO, J, K, NROWA
2290 REAL TEMP
2291
2292 REAL ONE , ZERO
2293 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
2294
2295
2296
2297
2298
2299 = LSAME( SIDE , 'L' )
2300 IF( LSIDE )THEN
2301 NROWA = M
2302 ELSE
2303 NROWA = N
2304 END IF
2305 NOUNIT = LSAME( DIAG , 'N' )
2306 UPPER = LSAME( UPLO , 'U' )
2307
2308 = 0
2309 IF( ( .NOT.LSIDE ).AND.
2310 $ ( .NOT.LSAME( SIDE , 'R' ) ) )THEN
2311 INFO = 1
2312 ELSE IF( ( .NOT.UPPER ).AND.
2313 $ ( .NOT.LSAME( UPLO , 'L' ) ) )THEN
2314 INFO = 2
2315 ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
2316 $ ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
2317 $ ( .NOT.LSAME( TRANSA, 'C' ) ) )THEN
2318 INFO = 3
2319 ELSE IF( ( .NOT.LSAME( DIAG , 'U' ) ).AND.
2320 $ ( .NOT.LSAME( DIAG , 'N' ) ) )THEN
2321 INFO = 4
2322 ELSE IF( M .LT.0 )THEN
2323 INFO = 5
2324 ELSE IF( N .LT.0 )THEN
2325 INFO = 6
2326 ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
2327 INFO = 9
2328 ELSE IF( LDB.LT.MAX( 1, M ) )THEN
2329 INFO = 11
2330 END IF
2331 IF( INFO.NE.0 )THEN
2332 CALL XERBLA( 'DTRMM ', INFO )
2333 RETURN
2334 END IF
2335
2336
2337
2338 IF( N.EQ.0 )
2339 $ RETURN
2340
2341
2342
2343 IF( ALPHA.EQ.ZERO )THEN
2344 DO 20, J = 1, N
2345 DO 10, I = 1, M
2346 B( I, J ) = ZERO
2347 10 CONTINUE
2348 20 CONTINUE
2349 RETURN
2350 END IF
2351
2352
2353
2354 IF( LSIDE )THEN
2355 IF( LSAME( TRANSA, 'N' ) )THEN
2356
2357
2358
2359 IF( UPPER )THEN
2360 DO 50, J = 1, N
2361 DO 40, K = 1, M
2362 IF( B( K, J ).NE.ZERO )THEN
2363 TEMP = ALPHA*B( K, J )
2364 DO 30, I = 1, K - 1
2365 B( I, J ) = B( I, J ) + TEMP*A( I, K )
2366 30 CONTINUE
2367 IF( NOUNIT )
2368 $ TEMP = TEMP*A( K, K )
2369 B( K, J ) = TEMP
2370 END IF
2371 40 CONTINUE
2372 50 CONTINUE
2373 ELSE
2374 DO 80, J = 1, N
2375 DO 70 K = M, 1, -1
2376 IF( B( K, J ).NE.ZERO )THEN
2377 TEMP = ALPHA*B( K, J )
2378 B( K, J ) = TEMP
2379 IF( NOUNIT )
2380 $ B( K, J ) = B( K, J )*A( K, K )
2381 DO 60, I = K + 1, M
2382 B( I, J ) = B( I, J ) + TEMP*A( I, K )
2383 60 CONTINUE
2384 END IF
2385 70 CONTINUE
2386 80 CONTINUE
2387 END IF
2388 ELSE
2389
2390
2391
2392 IF( UPPER )THEN
2393 DO 110, J = 1, N
2394 DO 100, I = M, 1, -1
2395 TEMP = B( I, J )
2396 IF( NOUNIT )
2397 $ TEMP = TEMP*A( I, I )
2398 DO 90, K = 1, I - 1
2399 TEMP = TEMP + A( K, I )*B( K, J )
2400 90 CONTINUE
2401 B( I, J ) = ALPHA*TEMP
2402 100 CONTINUE
2403 110 CONTINUE
2404 ELSE
2405 DO 140, J = 1, N
2406 DO 130, I = 1, M
2407 TEMP = B( I, J )
2408 IF( NOUNIT )
2409 $ TEMP = TEMP*A( I, I )
2410 DO 120, K = I + 1, M
2411 TEMP = TEMP + A( K, I )*B( K, J )
2412 120 CONTINUE
2413 B( I, J ) = ALPHA*TEMP
2414 130 CONTINUE
2415 140 CONTINUE
2416 END IF
2417 END IF
2418 ELSE
2419 IF( LSAME( TRANSA, 'N' ) )THEN
2420
2421
2422
2423 IF( UPPER )THEN
2424 DO 180, J = N, 1, -1
2425 TEMP = ALPHA
2426 IF( NOUNIT )
2427 $ TEMP = TEMP*A( J, J )
2428 DO 150, I = 1, M
2429 B( I, J ) = TEMP*B( I, J )
2430 150 CONTINUE
2431 DO 170, K = 1, J - 1
2432 IF( A( K, J ).NE.ZERO )THEN
2433 TEMP = ALPHA*A( K, J )
2434 DO 160, I = 1, M
2435 B( I, J ) = B( I, J ) + TEMP*B( I, K )
2436 160 CONTINUE
2437 END IF
2438 170 CONTINUE
2439 180 CONTINUE
2440 ELSE
2441 DO 220, J = 1, N
2442 TEMP = ALPHA
2443 IF( NOUNIT )
2444 $ TEMP = TEMP*A( J, J )
2445 DO 190, I = 1, M
2446 B( I, J ) = TEMP*B( I, J )
2447 190 CONTINUE
2448 DO 210, K = J + 1, N
2449 IF( A( K, J ).NE.ZERO )THEN
2450 TEMP = ALPHA*A( K, J )
2451 DO 200, I = 1, M
2452 B( I, J ) = B( I, J ) + TEMP*B( I, K )
2453 200 CONTINUE
2454 END IF
2455 210 CONTINUE
2456 220 CONTINUE
2457 END IF
2458 ELSE
2459
2460
2461
2462 IF( UPPER )THEN
2463 DO 260, K = 1, N
2464 DO 240, J = 1, K - 1
2465 IF( A( J, K ).NE.ZERO )THEN
2466 TEMP = ALPHA*A( J, K )
2467 DO 230, I = 1, M
2468 B( I, J ) = B( I, J ) + TEMP*B( I, K )
2469 230 CONTINUE
2470 END IF
2471 240 CONTINUE
2472 TEMP = ALPHA
2473 IF( NOUNIT )
2474 $ TEMP = TEMP*A( K, K )
2475 IF( TEMP.NE.ONE )THEN
2476 DO 250, I = 1, M
2477 B( I, K ) = TEMP*B( I, K )
2478 250 CONTINUE
2479 END IF
2480 260 CONTINUE
2481 ELSE
2482 DO 300, K = N, 1, -1
2483 DO 280, J = K + 1, N
2484 IF( A( J, K ).NE.ZERO )THEN
2485 TEMP = ALPHA*A( J, K )
2486 DO 270, I = 1, M
2487 B( I, J ) = B( I, J ) + TEMP*B( I, K )
2488 270 CONTINUE
2489 END IF
2490 280 CONTINUE
2491 TEMP = ALPHA
2492 IF( NOUNIT )
2493 $ TEMP = TEMP*A( K, K )
2494 IF( TEMP.NE.ONE )THEN
2495 DO 290, I = 1, M
2496 B( I, K ) = TEMP*B( I, K )
2497 290 CONTINUE
2498 END IF
2499 300 CONTINUE
2500 END IF
2501 END IF
2502 END IF
2503
2504 RETURN
2505
2506
2507
2508 END
2509 SUBROUTINE DTRMV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX )
2510
2511 INTEGER INCX, LDA, N
2512 CHARACTER*1 DIAG, TRANS, UPLO
2513
2514 REAL A( LDA, * ), X( * )
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609 REAL ZERO
2610 PARAMETER ( ZERO = 0.0E+0 )
2611
2612 REAL TEMP
2613 INTEGER I, INFO, IX, J, JX, KX
2614 LOGICAL NOUNIT
2615
2616 LOGICAL LSAME
2617 EXTERNAL LSAME
2618
2619 EXTERNAL XERBLA
2620
2621 INTRINSIC MAX
2622
2623
2624
2625
2626
2627 = 0
2628 IF ( .NOT.LSAME( UPLO , 'U' ).AND.
2629 $ .NOT.LSAME( UPLO , 'L' ) )THEN
2630 INFO = 1
2631 ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
2632 $ .NOT.LSAME( TRANS, 'T' ).AND.
2633 $ .NOT.LSAME( TRANS, 'C' ) )THEN
2634 INFO = 2
2635 ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
2636 $ .NOT.LSAME( DIAG , 'N' ) )THEN
2637 INFO = 3
2638 ELSE IF( N.LT.0 )THEN
2639 INFO = 4
2640 ELSE IF( LDA.LT.MAX( 1, N ) )THEN
2641 INFO = 6
2642 ELSE IF( INCX.EQ.0 )THEN
2643 INFO = 8
2644 END IF
2645 IF( INFO.NE.0 )THEN
2646 CALL XERBLA( 'DTRMV ', INFO )
2647 RETURN
2648 END IF
2649
2650
2651
2652 IF( N.EQ.0 )
2653 $ RETURN
2654
2655 = LSAME( DIAG, 'N' )
2656
2657
2658
2659
2660 IF( INCX.LE.0 )THEN
2661 KX = 1 - ( N - 1 )*INCX
2662 ELSE IF( INCX.NE.1 )THEN
2663 KX = 1
2664 END IF
2665
2666
2667
2668
2669 IF( LSAME( TRANS, 'N' ) )THEN
2670
2671
2672
2673 IF( LSAME( UPLO, 'U' ) )THEN
2674 IF( INCX.EQ.1 )THEN
2675 DO 20, J = 1, N
2676 IF( X( J ).NE.ZERO )THEN
2677 TEMP = X( J )
2678 DO 10, I = 1, J - 1
2679 X( I ) = X( I ) + TEMP*A( I, J )
2680 10 CONTINUE
2681 IF( NOUNIT )
2682 $ X( J ) = X( J )*A( J, J )
2683 END IF
2684 20 CONTINUE
2685 ELSE
2686 JX = KX
2687 DO 40, J = 1, N
2688 IF( X( JX ).NE.ZERO )THEN
2689 TEMP = X( JX )
2690 IX = KX
2691 DO 30, I = 1, J - 1
2692 X( IX ) = X( IX ) + TEMP*A( I, J )
2693 IX = IX + INCX
2694 30 CONTINUE
2695 IF( NOUNIT )
2696 $ X( JX ) = X( JX )*A( J, J )
2697 END IF
2698 JX = JX + INCX
2699 40 CONTINUE
2700 END IF
2701 ELSE
2702 IF( INCX.EQ.1 )THEN
2703 DO 60, J = N, 1, -1
2704 IF( X( J ).NE.ZERO )THEN
2705 TEMP = X( J )
2706 DO 50, I = N, J + 1, -1
2707 X( I ) = X( I ) + TEMP*A( I, J )
2708 50 CONTINUE
2709 IF( NOUNIT )
2710 $ X( J ) = X( J )*A( J, J )
2711 END IF
2712 60 CONTINUE
2713 ELSE
2714 KX = KX + ( N - 1 )*INCX
2715 JX = KX
2716 DO 80, J = N, 1, -1
2717 IF( X( JX ).NE.ZERO )THEN
2718 TEMP = X( JX )
2719 IX = KX
2720 DO 70, I = N, J + 1, -1
2721 X( IX ) = X( IX ) + TEMP*A( I, J )
2722 IX = IX - INCX
2723 70 CONTINUE
2724 IF( NOUNIT )
2725 $ X( JX ) = X( JX )*A( J, J )
2726 END IF
2727 JX = JX - INCX
2728 80 CONTINUE
2729 END IF
2730 END IF
2731 ELSE
2732
2733
2734
2735 IF( LSAME( UPLO, 'U' ) )THEN
2736 IF( INCX.EQ.1 )THEN
2737 DO 100, J = N, 1, -1
2738 TEMP = X( J )
2739 IF( NOUNIT )
2740 $ TEMP = TEMP*A( J, J )
2741 DO 90, I = J - 1, 1, -1
2742 TEMP = TEMP + A( I, J )*X( I )
2743 90 CONTINUE
2744 X( J ) = TEMP
2745 100 CONTINUE
2746 ELSE
2747 JX = KX + ( N - 1 )*INCX
2748 DO 120, J = N, 1, -1
2749 TEMP = X( JX )
2750 IX = JX
2751 IF( NOUNIT )
2752 $ TEMP = TEMP*A( J, J )
2753 DO 110, I = J - 1, 1, -1
2754 IX = IX - INCX
2755 TEMP = TEMP + A( I, J )*X( IX )
2756 110 CONTINUE
2757 X( JX ) = TEMP
2758 JX = JX - INCX
2759 120 CONTINUE
2760 END IF
2761 ELSE
2762 IF( INCX.EQ.1 )THEN
2763 DO 140, J = 1, N
2764 TEMP = X( J )
2765 IF( NOUNIT )
2766 $ TEMP = TEMP*A( J, J )
2767 DO 130, I = J + 1, N
2768 TEMP = TEMP + A( I, J )*X( I )
2769 130 CONTINUE
2770 X( J ) = TEMP
2771 140 CONTINUE
2772 ELSE
2773 JX = KX
2774 DO 160, J = 1, N
2775 TEMP = X( JX )
2776 IX = JX
2777 IF( NOUNIT )
2778 $ TEMP = TEMP*A( J, J )
2779 DO 150, I = J + 1, N
2780 IX = IX + INCX
2781 TEMP = TEMP + A( I, J )*X( IX )
2782 150 CONTINUE
2783 X( JX ) = TEMP
2784 JX = JX + INCX
2785 160 CONTINUE
2786 END IF
2787 END IF
2788 END IF
2789
2790 RETURN
2791
2792
2793
2794 END
2795
2796
2797
2798 INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3,
2799 $ N4 )
2800
2801
2802
2803
2804
2805
2806
2807 CHARACTER*( * ) NAME, OPTS
2808 INTEGER ISPEC, N1, N2, N3, N4
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897 LOGICAL CNAME, SNAME
2898 CHARACTER*1 C1
2899 CHARACTER*2 C2, C4
2900 CHARACTER*3 C3
2901 CHARACTER*6 SUBNAM
2902 INTEGER I, IC, IZ, NB, NBMIN, NX
2903
2904
2905 INTRINSIC CHAR, ICHAR, INT, MIN, REAL
2906
2907
2908
2909 GO TO ( 100, 100, 100, 400, 500, 600, 700, 800 ) ISPEC
2910
2911
2912
2913 = -1
2914 RETURN
2915
2916 CONTINUE
2917
2918
2919
2920 = 1
2921 SUBNAM = NAME
2922 IC = MOVA2I( SUBNAM( 1:1 ) )
2923 IZ = MOVA2I( 'Z' )
2924 IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
2925
2926
2927
2928 IF( IC.GE.97 .AND. IC.LE.122 ) THEN
2929 SUBNAM( 1:1 ) = CHAR( IC-32 )
2930 DO 10 I = 2, 6
2931 IC = MOVA2I( SUBNAM( I:I ) )
2932 IF( IC.GE.97 .AND. IC.LE.122 )
2933 $ SUBNAM( I:I ) = CHAR( IC-32 )
2934 10 CONTINUE
2935 END IF
2936
2937 ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
2938
2939
2940
2941 IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
2942 $ ( IC.GE.145 .AND. IC.LE.153 ) .OR.
2943 $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
2944 SUBNAM( 1:1 ) = CHAR( IC+64 )
2945 DO 20 I = 2, 6
2946 IC = MOVA2I( SUBNAM( I:I ) )
2947 IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
2948 $ ( IC.GE.145 .AND. IC.LE.153 ) .OR.
2949 $ ( IC.GE.162 .AND. IC.LE.169 ) )
2950 $ SUBNAM( I:I ) = CHAR( IC+64 )
2951 20 CONTINUE
2952 END IF
2953
2954 ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
2955
2956
2957
2958 IF( IC.GE.225 .AND. IC.LE.250 ) THEN
2959 SUBNAM( 1:1 ) = CHAR( IC-32 )
2960 DO 30 I = 2, 6
2961 IC = MOVA2I( SUBNAM( I:I ) )
2962 IF( IC.GE.225 .AND. IC.LE.250 )
2963 $ SUBNAM( I:I ) = CHAR( IC-32 )
2964 30 CONTINUE
2965 END IF
2966 END IF
2967
2968 = SUBNAM( 1:1 )
2969 SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
2970 CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
2971 IF( .NOT.( CNAME .OR. SNAME ) )
2972 $ RETURN
2973 C2 = SUBNAM( 2:3 )
2974 C3 = SUBNAM( 4:6 )
2975 C4 = C3( 2:3 )
2976
2977 GO TO ( 110, 200, 300 ) ISPEC
2978
2979 CONTINUE
2980
2981
2982
2983
2984
2985
2986
2987 = 1
2988
2989 IF( C2.EQ.'GE' ) THEN
2990 IF( C3.EQ.'TRF' ) THEN
2991 IF( SNAME ) THEN
2992 NB = 64
2993 ELSE
2994 NB = 64
2995 END IF
2996 ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
2997 $ C3.EQ.'QLF' ) THEN
2998 IF( SNAME ) THEN
2999 NB = 32
3000 ELSE
3001 NB = 32
3002 END IF
3003 ELSE IF( C3.EQ.'HRD' ) THEN
3004 IF( SNAME ) THEN
3005 NB = 32
3006 ELSE
3007 NB = 32
3008 END IF
3009 ELSE IF( C3.EQ.'BRD' ) THEN
3010 IF( SNAME ) THEN
3011 NB = 32
3012 ELSE
3013 NB = 32
3014 END IF
3015 ELSE IF( C3.EQ.'TRI' ) THEN
3016 IF( SNAME ) THEN
3017 NB = 64
3018 ELSE
3019 NB = 64
3020 END IF
3021 END IF
3022 ELSE IF( C2.EQ.'PO' ) THEN
3023 IF( C3.EQ.'TRF' ) THEN
3024 IF( SNAME ) THEN
3025 NB = 64
3026 ELSE
3027 NB = 64
3028 END IF
3029 END IF
3030 ELSE IF( C2.EQ.'SY' ) THEN
3031 IF( C3.EQ.'TRF' ) THEN
3032 IF( SNAME ) THEN
3033 NB = 64
3034 ELSE
3035 NB = 64
3036 END IF
3037 ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
3038 NB = 1
3039 ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
3040 NB = 64
3041 END IF
3042 ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
3043 IF( C3.EQ.'TRF' ) THEN
3044 NB = 64
3045 ELSE IF( C3.EQ.'TRD' ) THEN
3046 NB = 1
3047 ELSE IF( C3.EQ.'GST' ) THEN
3048 NB = 64
3049 END IF
3050 ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
3051 IF( C3( 1:1 ).EQ.'G' ) THEN
3052 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3053 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3054 $ C4.EQ.'BR' ) THEN
3055 NB = 32
3056 END IF
3057 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
3058 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3059 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3060 $ C4.EQ.'BR' ) THEN
3061 NB = 32
3062 END IF
3063 END IF
3064 ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
3065 IF( C3( 1:1 ).EQ.'G' ) THEN
3066 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3067 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3068 $ C4.EQ.'BR' ) THEN
3069 NB = 32
3070 END IF
3071 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
3072 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3073 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3074 $ C4.EQ.'BR' ) THEN
3075 NB = 32
3076 END IF
3077 END IF
3078 ELSE IF( C2.EQ.'GB' ) THEN
3079 IF( C3.EQ.'TRF' ) THEN
3080 IF( SNAME ) THEN
3081 IF( N4.LE.64 ) THEN
3082 NB = 1
3083 ELSE
3084 NB = 32
3085 END IF
3086 ELSE
3087 IF( N4.LE.64 ) THEN
3088 NB = 1
3089 ELSE
3090 NB = 32
3091 END IF
3092 END IF
3093 END IF
3094 ELSE IF( C2.EQ.'PB' ) THEN
3095 IF( C3.EQ.'TRF' ) THEN
3096 IF( SNAME ) THEN
3097 IF( N2.LE.64 ) THEN
3098 NB = 1
3099 ELSE
3100 NB = 32
3101 END IF
3102 ELSE
3103 IF( N2.LE.64 ) THEN
3104 NB = 1
3105 ELSE
3106 NB = 32
3107 END IF
3108 END IF
3109 END IF
3110 ELSE IF( C2.EQ.'TR' ) THEN
3111 IF( C3.EQ.'TRI' ) THEN
3112 IF( SNAME ) THEN
3113 NB = 64
3114 ELSE
3115 NB = 64
3116 END IF
3117 END IF
3118 ELSE IF( C2.EQ.'LA' ) THEN
3119 IF( C3.EQ.'UUM' ) THEN
3120 IF( SNAME ) THEN
3121 NB = 64
3122 ELSE
3123 NB = 64
3124 END IF
3125 END IF
3126 ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
3127 IF( C3.EQ.'EBZ' ) THEN
3128 NB = 1
3129 END IF
3130 END IF
3131 ILAENV = NB
3132 RETURN
3133
3134 CONTINUE
3135
3136
3137
3138 = 2
3139 IF( C2.EQ.'GE' ) THEN
3140 IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
3141 $ C3.EQ.'QLF' ) THEN
3142 IF( SNAME ) THEN
3143 NBMIN = 2
3144 ELSE
3145 NBMIN = 2
3146 END IF
3147 ELSE IF( C3.EQ.'HRD' ) THEN
3148 IF( SNAME ) THEN
3149 NBMIN = 2
3150 ELSE
3151 NBMIN = 2
3152 END IF
3153 ELSE IF( C3.EQ.'BRD' ) THEN
3154 IF( SNAME ) THEN
3155 NBMIN = 2
3156 ELSE
3157 NBMIN = 2
3158 END IF
3159 ELSE IF( C3.EQ.'TRI' ) THEN
3160 IF( SNAME ) THEN
3161 NBMIN = 2
3162 ELSE
3163 NBMIN = 2
3164 END IF
3165 END IF
3166 ELSE IF( C2.EQ.'SY' ) THEN
3167 IF( C3.EQ.'TRF' ) THEN
3168 IF( SNAME ) THEN
3169 NBMIN = 8
3170 ELSE
3171 NBMIN = 8
3172 END IF
3173 ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
3174 NBMIN = 2
3175 END IF
3176 ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
3177 IF( C3.EQ.'TRD' ) THEN
3178 NBMIN = 2
3179 END IF
3180 ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
3181 IF( C3( 1:1 ).EQ.'G' ) THEN
3182 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3183 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3184 $ C4.EQ.'BR' ) THEN
3185 NBMIN = 2
3186 END IF
3187 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
3188 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3189 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3190 $ C4.EQ.'BR' ) THEN
3191 NBMIN = 2
3192 END IF
3193 END IF
3194 ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
3195 IF( C3( 1:1 ).EQ.'G' ) THEN
3196 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3197 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3198 $ C4.EQ.'BR' ) THEN
3199 NBMIN = 2
3200 END IF
3201 ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
3202 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3203 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3204 $ C4.EQ.'BR' ) THEN
3205 NBMIN = 2
3206 END IF
3207 END IF
3208 END IF
3209 ILAENV = NBMIN
3210 RETURN
3211
3212 CONTINUE
3213
3214
3215
3216 = 0
3217 IF( C2.EQ.'GE' ) THEN
3218 IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
3219 $ C3.EQ.'QLF' ) THEN
3220 IF( SNAME ) THEN
3221 NX = 128
3222 ELSE
3223 NX = 128
3224 END IF
3225 ELSE IF( C3.EQ.'HRD' ) THEN
3226 IF( SNAME ) THEN
3227 NX = 128
3228 ELSE
3229 NX = 128
3230 END IF
3231 ELSE IF( C3.EQ.'BRD' ) THEN
3232 IF( SNAME ) THEN
3233 NX = 128
3234 ELSE
3235 NX = 128
3236 END IF
3237 END IF
3238 ELSE IF( C2.EQ.'SY' ) THEN
3239 IF( SNAME .AND. C3.EQ.'TRD' ) THEN
3240 NX = 1
3241 END IF
3242 ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
3243 IF( C3.EQ.'TRD' ) THEN
3244 NX = 1
3245 END IF
3246 ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
3247 IF( C3( 1:1 ).EQ.'G' ) THEN
3248 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3249 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3250 $ C4.EQ.'BR' ) THEN
3251 NX = 128
3252 END IF
3253 END IF
3254 ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
3255 IF( C3( 1:1 ).EQ.'G' ) THEN
3256 IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
3257 $ C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
3258 $ C4.EQ.'BR' ) THEN
3259 NX = 128
3260 END IF
3261 END IF
3262 END IF
3263 ILAENV = NX
3264 RETURN
3265
3266 CONTINUE
3267
3268
3269
3270 = 6
3271 RETURN
3272
3273 CONTINUE
3274
3275
3276
3277 = 2
3278 RETURN
3279
3280 CONTINUE
3281
3282
3283
3284 = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
3285 RETURN
3286
3287 CONTINUE
3288
3289
3290
3291 = 1
3292 RETURN
3293
3294 CONTINUE
3295
3296
3297
3298 = 50
3299 RETURN
3300
3301
3302
3303 END
3304
3305
3306
3307
3308
3309 LOGICAL FUNCTION LSAME( CA, CB )
3310
3311
3312
3313
3314
3315
3316
3317 CHARACTER CA, CB
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336 INTRINSIC ICHAR
3337
3338
3339 INTEGER INTA, INTB, ZCODE
3340
3341
3342
3343
3344
3345 = CA.EQ.CB
3346 IF( LSAME )
3347 $ RETURN
3348
3349
3350
3351 = MOVA2I( 'Z' )
3352
3353
3354
3355
3356
3357
3358 = MOVA2I( CA )
3359 INTB = MOVA2I( CB )
3360
3361 IF( ZCODE.EQ.90 .OR. ZCODE.EQ.122 ) THEN
3362
3363
3364
3365
3366 IF( INTA.GE.97 .AND. INTA.LE.122 ) INTA = INTA - 32
3367 IF( INTB.GE.97 .AND. INTB.LE.122 ) INTB = INTB - 32
3368
3369 ELSE IF( ZCODE.EQ.233 .OR. ZCODE.EQ.169 ) THEN
3370
3371
3372
3373
3374 IF( INTA.GE.129 .AND. INTA.LE.137 .OR.
3375 $ INTA.GE.145 .AND. INTA.LE.153 .OR.
3376 $ INTA.GE.162 .AND. INTA.LE.169 ) INTA = INTA + 64
3377 IF( INTB.GE.129 .AND. INTB.LE.137 .OR.
3378 $ INTB.GE.145 .AND. INTB.LE.153 .OR.
3379 $ INTB.GE.162 .AND. INTB.LE.169 ) INTB = INTB + 64
3380
3381 ELSE IF( ZCODE.EQ.218 .OR. ZCODE.EQ.250 ) THEN
3382
3383
3384
3385
3386 IF( INTA.GE.225 .AND. INTA.LE.250 ) INTA = INTA - 32
3387 IF( INTB.GE.225 .AND. INTB.LE.250 ) INTB = INTB - 32
3388 END IF
3389 LSAME = INTA.EQ.INTB
3390
3391
3392
3393
3394
3395 END
3396
3397
3398
3399 integer function isamax(n,sx,incx)
3400
3401
3402
3403
3404
3405
3406 real sx(*),smax
3407 integer i,incx,ix,n
3408
3409 = 0
3410 if( n.lt.1 .or. incx.le.0 ) return
3411 isamax = 1
3412 if(n.eq.1)return
3413 if(incx.eq.1)go to 20
3414
3415
3416
3417 = 1
3418 smax = abs(sx(1))
3419 ix = ix + incx
3420 do 10 i = 2,n
3421 if(abs(sx(ix)).le.smax) go to 5
3422 isamax = i
3423 smax = abs(sx(ix))
3424 5 ix = ix + incx
3425 10 continue
3426 return
3427
3428
3429
3430 = abs(sx(1))
3431 do 30 i = 2,n
3432 if(abs(sx(i)).le.smax) go to 30
3433 isamax = i
3434 smax = abs(sx(i))
3435 30 continue
3436 return
3437 end
3438
3439
3440 subroutine dcopy(n,sx,incx,sy,incy)
3441
3442
3443
3444
3445
3446
3447 real sx(*),sy(*)
3448 integer i,incx,incy,ix,iy,m,mp1,n
3449
3450 if(n.le.0)return
3451 if(incx.eq.1.and.incy.eq.1)go to 20
3452
3453
3454
3455
3456 = 1
3457 iy = 1
3458 if(incx.lt.0)ix = (-n+1)*incx + 1
3459 if(incy.lt.0)iy = (-n+1)*incy + 1
3460 do 10 i = 1,n
3461 sy(iy) = sx(ix)
3462 ix = ix + incx
3463 iy = iy + incy
3464 10 continue
3465 return
3466
3467
3468
3469
3470
3471
3472 = mod(n,7)
3473 if( m .eq. 0 ) go to 40
3474 do 30 i = 1,m
3475 sy(i) = sx(i)
3476 30 continue
3477 if( n .lt. 7 ) return
3478 40 mp1 = m + 1
3479 do 50 i = mp1,n,7
3480 sy(i) = sx(i)
3481 sy(i + 1) = sx(i + 1)
3482 sy(i + 2) = sx(i + 2)
3483 sy(i + 3) = sx(i + 3)
3484 sy(i + 4) = sx(i + 4)
3485 sy(i + 5) = sx(i + 5)
3486 sy(i + 6) = sx(i + 6)
3487 50 continue
3488 return
3489 end
3490